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", () => {...@@ -8,11 +8,22 @@ describe("resolveClerkSignInProps", () => {
8 expect(resolveClerkSignInProps(href, false)).toEqual({ forceRedirectUrl: href });8 expect(resolveClerkSignInProps(href, false)).toEqual({ forceRedirectUrl: href });
9 });9 });
1010
11 it("omits the redirect override on packaged desktop", () => {11 it("removes a Clerk virtual pathname and callback params while preserving the desktop route", () => {
12 expect(resolveClerkSignInProps("t3code://app/#/settings/general", true)).toEqual({});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 });
13 });21 });
1422
15 it("omits the redirect override on development desktop", () => {23 it("preserves a clean development desktop route", () => {
16 expect(resolveClerkSignInProps("t3code-dev://app/#/settings/general", true)).toEqual({});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 });
17 });28 });
18});29});
apps/web/src/components/clerk/authRedirect.ts+12-5
...@@ -1,12 +1,19 @@...@@ -1,12 +1,19 @@
1export interface ClerkSignInProps {1export interface ClerkSignInProps {
2 forceRedirectUrl?: string;2 forceRedirectUrl?: string;
3 signUpForceRedirectUrl?: string;
3}4}
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.
9export function resolveClerkSignInProps(href: string, isElectron: boolean): ClerkSignInProps {6export 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 }
11 return { forceRedirectUrl: href };18 return { forceRedirectUrl: href };
12}19}