| author | |
| committer | |
| log | 285cf5947b14acb9a66d26a669ce632633fd0749 |
| tree | d2d03a9ac1522366d18db1c6b9f40589690990dd |
| parent | 1a003e383ac6b10258b8100c2617d938c4f06c69 |
| signature | Signed by PGP key B5690EEEBB952194 |
2 files changed, 27 insertions(+), 9 deletions(-)
apps/web/src/components/clerk/authRedirect.test.ts+15-4| ... | ... | @@ -8,11 +8,22 @@ describe("resolveClerkSignInProps", () => { |
| 8 | 8 | expect(resolveClerkSignInProps(href, false)).toEqual({ forceRedirectUrl: href }); |
| 9 | 9 | }); |
| 10 | 10 | |
| 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 | }); | |
| 13 | 21 | }); |
| 14 | 22 | |
| 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 | }); | |
| 17 | 28 | }); |
| 18 | 29 | }); |
apps/web/src/components/clerk/authRedirect.ts+12-5| ... | ... | @@ -1,12 +1,19 @@ |
| 1 | 1 | export interface ClerkSignInProps { |
| 2 | 2 | forceRedirectUrl?: string; |
| 3 | signUpForceRedirectUrl?: string; | |
| 3 | 4 | } |
| 4 | 5 | |
| 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. | |
| 9 | 6 | export 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 | 18 | return { forceRedirectUrl: href }; |
| 12 | 19 | } |