authorgravatar for me@pixp.ccAlex <me@pixp.cc> 2026-07-29 01:59:12-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-07-29 10:59:12+02:00
log1b4830ff06bf80e505dbf669deef189af85f77d7
treef2214ae794823b509bf13ee42764eadb1c6da7d6
parent694f8d1c6eaaabafbf5c2861ae524174919ef625
signature Signed by PGP key B5690EEEBB952194

fix(desktop): restore T3 Connect sign-in (#4809)

Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

4 files changed, 40 insertions(+), 3 deletions(-)

apps/web/src/components/clerk/authRedirect.test.ts created+18
......@@ -0,0 +1,18 @@
1import { describe, expect, it } from "vite-plus/test";
2
3import { resolveClerkSignInProps } from "./authRedirect";
4
5describe("resolveClerkSignInProps", () => {
6 it("returns to the current browser URL on the web", () => {
7 const href = "https://app.t3.codes/connect?state=state-1#details";
8 expect(resolveClerkSignInProps(href, false)).toEqual({ forceRedirectUrl: href });
9 });
10
11 it("omits the redirect override on packaged desktop", () => {
12 expect(resolveClerkSignInProps("t3code://app/#/settings/general", true)).toEqual({});
13 });
14
15 it("omits the redirect override on development desktop", () => {
16 expect(resolveClerkSignInProps("t3code-dev://app/#/settings/general", true)).toEqual({});
17 });
18});
apps/web/src/components/clerk/authRedirect.ts created+12
......@@ -0,0 +1,12 @@
1export interface ClerkSignInProps {
2 forceRedirectUrl?: string;
3}
4
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 {
10 if (isElectron) return {};
11 return { forceRedirectUrl: href };
12}
apps/web/src/components/clerk/useT3ConnectAuthPrompt.tsx+4-1
......@@ -1,9 +1,12 @@
11import { useClerk } from "@clerk/react";
22
3import { isElectron } from "../../env";
4import { resolveClerkSignInProps } from "./authRedirect";
5
36export function useT3ConnectAuthPrompt() {
47 const clerk = useClerk();
58 const openAuthPrompt = () => {
6 clerk.openSignIn({ forceRedirectUrl: window.location.href });
9 clerk.openSignIn(resolveClerkSignInProps(window.location.href, isElectron));
710 };
811 return { authPrompt: null, openAuthPrompt };
912}
apps/web/src/components/cloud/ConnectCliAuthSurface.tsx+6-2
......@@ -8,8 +8,10 @@ import {
88 readConnectCliCallbackResult,
99 rememberConnectCliAuthState,
1010} from "../../cloud/connectCliAuth";
11import { isElectron } from "../../env";
1112import { useCopyToClipboard } from "../../hooks/useCopyToClipboard";
1213import { AuthSurfaceShell } from "../auth/AuthSurfaceShell";
14import { resolveClerkSignInProps } from "../clerk/authRedirect";
1315import { Button } from "../ui/button";
1416
1517function ConnectCliAuthMessage({
......@@ -59,7 +61,7 @@ export function ConnectCliAuthorizeSurface() {
5961 if (!isSignedIn) {
6062 if (!signInOpened.current) {
6163 signInOpened.current = true;
62 clerk.openSignIn({ forceRedirectUrl: window.location.href });
64 clerk.openSignIn(resolveClerkSignInProps(window.location.href, isElectron));
6365 }
6466 return;
6567 }
......@@ -95,7 +97,9 @@ export function ConnectCliAuthorizeSurface() {
9597 <div className="mt-6">
9698 <Button
9799 type="button"
98 onClick={() => clerk.openSignIn({ forceRedirectUrl: window.location.href })}
100 onClick={() =>
101 clerk.openSignIn(resolveClerkSignInProps(window.location.href, isElectron))
102 }
99103 >
100104 Sign in
101105 </Button>