authorgravatar for sorianorobertc@gmail.comRobert Soriano <sorianorobertc@gmail.com> 2026-08-09 10:33:03-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-08-09 17:33:03+00:00
log285cf5947b14acb9a66d26a669ce632633fd0749
treed2d03a9ac1522366d18db1c6b9f40589690990dd
parent1a003e383ac6b10258b8100c2617d938c4f06c69
signature Signed by PGP key B5690EEEBB952194

fix(web): preserve desktop route during Clerk auth (#5770)


2 files changed, 27 insertions(+), 9 deletions(-)

apps/web/src/components/clerk/authRedirect.test.ts+15-4
......@@ -8,11 +8,22 @@ describe("resolveClerkSignInProps", () => {
88 expect(resolveClerkSignInProps(href, false)).toEqual({ forceRedirectUrl: href });
99 });
1010
11 it("omits the redirect override on packaged desktop", () => {
12 expect(resolveClerkSignInProps("t3code://app/#/settings/general", true)).toEqual({});
11 it("removes a Clerk virtual pathname and callback params while preserving the desktop route", () => {
12 expect(
13 resolveClerkSignInProps(
14 "t3code://app/CLERK-ROUTER/VIRTUAL/sign-up?__clerk_status=complete#/settings/connections",
15 true,
16 ),
17 ).toEqual({
18 forceRedirectUrl: "t3code://app/#/settings/connections",
19 signUpForceRedirectUrl: "t3code://app/#/settings/connections",
20 });
1321 });
1422
15 it("omits the redirect override on development desktop", () => {
16 expect(resolveClerkSignInProps("t3code-dev://app/#/settings/general", true)).toEqual({});
23 it("preserves a clean development desktop route", () => {
24 expect(resolveClerkSignInProps("t3code-dev://app/#/settings/general", true)).toEqual({
25 forceRedirectUrl: "t3code-dev://app/#/settings/general",
26 signUpForceRedirectUrl: "t3code-dev://app/#/settings/general",
27 });
1728 });
1829});
apps/web/src/components/clerk/authRedirect.ts+12-5
......@@ -1,12 +1,19 @@
11export interface ClerkSignInProps {
22 forceRedirectUrl?: string;
3 signUpForceRedirectUrl?: string;
34}
45
5// Clerk's native-app allowlist only authorizes the bare renderer root
6// (t3code://app/), which @clerk/electron's OAuth transport already supplies,
7// so any page-derived redirect override gets the whole sign-in request
8// rejected. On Electron, omit the override and let Clerk use its defaults.
96export function resolveClerkSignInProps(href: string, isElectron: boolean): ClerkSignInProps {
10 if (isElectron) return {};
7 if (isElectron) {
8 // Electron routes through the hash, so reset any Clerk virtual pathname without losing the T3 page.
9 const redirectUrl = new URL(href);
10 redirectUrl.pathname = "/";
11 redirectUrl.search = "";
12
13 return {
14 forceRedirectUrl: redirectUrl.toString(),
15 signUpForceRedirectUrl: redirectUrl.toString(),
16 };
17 }
1118 return { forceRedirectUrl: href };
1219}