From fb9a5dbb18ba464d904de013cb8329d1b8fa263e Mon Sep 17 00:00:00 2001 From: Thigazhezhilan J Date: Tue, 31 Mar 2026 10:24:56 +0530 Subject: [PATCH] Use frontend callback for broker reconnect --- src/components/landing/BrokerConnectDialog.tsx | 10 +++++++++- src/components/landing/PortfolioSection.tsx | 10 +++++++++- src/pages/ZerodhaCallback.tsx | 6 +++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/components/landing/BrokerConnectDialog.tsx b/src/components/landing/BrokerConnectDialog.tsx index bebf17c0..746bf8ba 100644 --- a/src/components/landing/BrokerConnectDialog.tsx +++ b/src/components/landing/BrokerConnectDialog.tsx @@ -38,6 +38,12 @@ type BrokerStatusResponse = { const CALLBACK_STORAGE_KEY = "zerodha:callback"; const CALLBACK_MAX_AGE_MS = 5 * 60 * 1000; +function buildReconnectRedirectUrl() { + const url = new URL(`${window.location.origin}/login`); + url.searchParams.set("flow", "reconnect"); + return url.toString(); +} + export default function BrokerConnectDialog({ layout = "desktop", open, @@ -100,7 +106,9 @@ export default function BrokerConnectDialog({ const reconnectSavedMutation = useMutation({ mutationFn: async () => { - const res = await apiRequest("GET", "/broker/login-url"); + const redirectUrl = buildReconnectRedirectUrl(); + const params = new URLSearchParams({ redirectUrl }); + const res = await apiRequest("GET", `/broker/login-url?${params.toString()}`); return res.json() as Promise<{ loginUrl: string }>; }, onSuccess: ({ loginUrl }) => { diff --git a/src/components/landing/PortfolioSection.tsx b/src/components/landing/PortfolioSection.tsx index 14ef3989..79693124 100644 --- a/src/components/landing/PortfolioSection.tsx +++ b/src/components/landing/PortfolioSection.tsx @@ -148,6 +148,12 @@ function formatRelativeSeconds(seconds: number) { return `in ${parts.join(" ")}`; } +function buildReconnectRedirectUrl() { + const url = new URL(`${window.location.origin}/login`); + url.searchParams.set("flow", "reconnect"); + return url.toString(); +} + function firstNumber(...values: unknown[]) { for (const value of values) { const parsed = Number(value); @@ -259,7 +265,9 @@ export default function PortfolioSection() { async function startSavedBrokerReconnect() { try { - const res = await apiRequest("GET", "/broker/login-url"); + const redirectUrl = buildReconnectRedirectUrl(); + const params = new URLSearchParams({ redirectUrl }); + const res = await apiRequest("GET", `/broker/login-url?${params.toString()}`); const data = (await res.json()) as { loginUrl?: string }; if (!data?.loginUrl) { throw new Error("Reconnect link unavailable."); diff --git a/src/pages/ZerodhaCallback.tsx b/src/pages/ZerodhaCallback.tsx index efabedb4..99852ba5 100644 --- a/src/pages/ZerodhaCallback.tsx +++ b/src/pages/ZerodhaCallback.tsx @@ -8,6 +8,7 @@ const CALLBACK_STORAGE_KEY = "zerodha:callback"; const RETURN_PATH = "/portfolio"; type CallbackParams = { + flow: string; status: string; requestToken: string; error: string; @@ -17,6 +18,7 @@ type CallbackParams = { const parseParams = (): CallbackParams => { const params = new URLSearchParams(window.location.search); return { + flow: (params.get("flow") || "").trim(), status: (params.get("status") || "").trim(), requestToken: (params.get("request_token") || "").trim(), error: (params.get("error") || params.get("error_type") || "").trim(), @@ -48,7 +50,9 @@ export default function ZerodhaCallback() { return; } - const url = `/broker/zerodha/callback?request_token=${encodeURIComponent(params.requestToken)}`; + const callbackPath = + params.flow === "reconnect" ? "/broker/callback" : "/broker/zerodha/callback"; + const url = `${callbackPath}?request_token=${encodeURIComponent(params.requestToken)}`; apiRequest("GET", url) .then(() => finalize("success")) .catch((err: any) => finalize("error", err?.message || "Unable to complete the login."));