Use frontend callback for broker reconnect

This commit is contained in:
Thigazhezhilan J 2026-03-31 10:24:56 +05:30
parent 434be478e4
commit fb9a5dbb18
3 changed files with 23 additions and 3 deletions

View File

@ -38,6 +38,12 @@ type BrokerStatusResponse = {
const CALLBACK_STORAGE_KEY = "zerodha:callback"; const CALLBACK_STORAGE_KEY = "zerodha:callback";
const CALLBACK_MAX_AGE_MS = 5 * 60 * 1000; 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({ export default function BrokerConnectDialog({
layout = "desktop", layout = "desktop",
open, open,
@ -100,7 +106,9 @@ export default function BrokerConnectDialog({
const reconnectSavedMutation = useMutation({ const reconnectSavedMutation = useMutation({
mutationFn: async () => { 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 }>; return res.json() as Promise<{ loginUrl: string }>;
}, },
onSuccess: ({ loginUrl }) => { onSuccess: ({ loginUrl }) => {

View File

@ -148,6 +148,12 @@ function formatRelativeSeconds(seconds: number) {
return `in ${parts.join(" ")}`; 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[]) { function firstNumber(...values: unknown[]) {
for (const value of values) { for (const value of values) {
const parsed = Number(value); const parsed = Number(value);
@ -259,7 +265,9 @@ export default function PortfolioSection() {
async function startSavedBrokerReconnect() { async function startSavedBrokerReconnect() {
try { 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 }; const data = (await res.json()) as { loginUrl?: string };
if (!data?.loginUrl) { if (!data?.loginUrl) {
throw new Error("Reconnect link unavailable."); throw new Error("Reconnect link unavailable.");

View File

@ -8,6 +8,7 @@ const CALLBACK_STORAGE_KEY = "zerodha:callback";
const RETURN_PATH = "/portfolio"; const RETURN_PATH = "/portfolio";
type CallbackParams = { type CallbackParams = {
flow: string;
status: string; status: string;
requestToken: string; requestToken: string;
error: string; error: string;
@ -17,6 +18,7 @@ type CallbackParams = {
const parseParams = (): CallbackParams => { const parseParams = (): CallbackParams => {
const params = new URLSearchParams(window.location.search); const params = new URLSearchParams(window.location.search);
return { return {
flow: (params.get("flow") || "").trim(),
status: (params.get("status") || "").trim(), status: (params.get("status") || "").trim(),
requestToken: (params.get("request_token") || "").trim(), requestToken: (params.get("request_token") || "").trim(),
error: (params.get("error") || params.get("error_type") || "").trim(), error: (params.get("error") || params.get("error_type") || "").trim(),
@ -48,7 +50,9 @@ export default function ZerodhaCallback() {
return; 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) apiRequest("GET", url)
.then(() => finalize("success")) .then(() => finalize("success"))
.catch((err: any) => finalize("error", err?.message || "Unable to complete the login.")); .catch((err: any) => finalize("error", err?.message || "Unable to complete the login."));