diff --git a/src/app/(centered)/authorized/page.tsx b/src/app/(centered)/authorized/page.tsx
index 3a438f1940..a6e738781c 100644
--- a/src/app/(centered)/authorized/page.tsx
+++ b/src/app/(centered)/authorized/page.tsx
@@ -12,8 +12,7 @@ export default function Page() {
const [isLoading, setIsLoading] = useState(true);
const isLoadingRef = useRef(true);
const router = useRouter();
-
- const { state, ide } = useAuthState();
+ const authState = useAuthState();
useEffect(() => {
if (typeof isSignedIn !== 'undefined' && isLoadingRef.current) {
@@ -27,18 +26,22 @@ export default function Page() {
let path;
if (!isSignedIn) {
- path = state ? `/sign-in?state=${state}&ide=${ide}` : '/sign-in';
+ path = authState.params
+ ? `/sign-in?${authState.params.toString()}`
+ : '/sign-in';
} else if (!orgId) {
- path = state ? `/select-org/${state}?ide=${ide}` : '/select-org';
+ path = authState.params
+ ? `/select-org?${authState.params.toString()}`
+ : '/select-org';
} else {
- path = state
- ? `/extension/sign-in?state=${state}&ide=${ide}`
+ path = authState.params
+ ? `/extension/sign-in?${authState.params.toString()}`
: '/dashboard';
}
setTimeout(() => router.push(path), 1000);
}
- }, [router, isLoading, isSignedIn, orgId, state, ide]);
+ }, [router, isLoading, isSignedIn, orgId, authState.params]);
return (
diff --git a/src/app/(centered)/extension/sign-in/DeepLink.tsx b/src/app/(centered)/extension/sign-in/DeepLink.tsx
index e3eafb6636..64fe460f0f 100644
--- a/src/app/(centered)/extension/sign-in/DeepLink.tsx
+++ b/src/app/(centered)/extension/sign-in/DeepLink.tsx
@@ -13,17 +13,17 @@ import { TraeLogo } from './TraeLogo';
interface DeepLinkProps {
editor: string;
- deepLinkUrl: string;
+ editorRedirect: string;
}
-export const DeepLink = ({ editor, deepLinkUrl }: DeepLinkProps) => {
+export const DeepLink = ({ editor, editorRedirect }: DeepLinkProps) => {
const [redirectAttempted, setRedirectAttempted] = useState(false);
useEffect(() => {
- window.location.href = deepLinkUrl;
+ window.location.href = editorRedirect;
const timer = setTimeout(() => setRedirectAttempted(true), 2000);
return () => clearTimeout(timer);
- }, [deepLinkUrl]);
+ }, [editorRedirect]);
const ides = useMemo(
() => [
@@ -31,34 +31,34 @@ export const DeepLink = ({ editor, deepLinkUrl }: DeepLinkProps) => {
editor: 'vscode',
title: 'Visual Studio Code',
logo: VSCodeLogo,
- href: deepLinkUrl.replace(`${editor}://`, 'vscode://'),
+ href: editorRedirect.replace(`${editor}://`, 'vscode://'),
},
{
editor: 'vscode-insiders',
title: 'Visual Studio Code (Insiders)',
logo: VSCodeInsidersLogo,
- href: deepLinkUrl.replace(`${editor}://`, 'vscode-insiders://'),
+ href: editorRedirect.replace(`${editor}://`, 'vscode-insiders://'),
},
{
editor: 'cursor',
title: 'Cursor',
logo: CursorLogo,
- href: deepLinkUrl.replace(`${editor}://`, 'cursor://'),
+ href: editorRedirect.replace(`${editor}://`, 'cursor://'),
},
{
editor: 'windsurf',
title: 'Windsurf',
logo: WindsurfLogo,
- href: deepLinkUrl.replace(`${editor}://`, 'windsurf://'),
+ href: editorRedirect.replace(`${editor}://`, 'windsurf://'),
},
{
editor: 'trae',
title: 'Trae',
logo: TraeLogo,
- href: deepLinkUrl.replace(`${editor}://`, 'trae://'),
+ href: editorRedirect.replace(`${editor}://`, 'trae://'),
},
],
- [editor, deepLinkUrl],
+ [editor, editorRedirect],
);
const currentIde = ides.find((ide) => ide.editor === editor) ?? ides[0]!;
@@ -70,7 +70,7 @@ export const DeepLink = ({ editor, deepLinkUrl }: DeepLinkProps) => {
Redirecting to {currentIde.title}...
-
+
diff --git a/src/app/(centered)/extension/sign-in/page.tsx b/src/app/(centered)/extension/sign-in/page.tsx
index 654fc3669d..9e1668c61b 100644
--- a/src/app/(centered)/extension/sign-in/page.tsx
+++ b/src/app/(centered)/extension/sign-in/page.tsx
@@ -1,22 +1,29 @@
import { redirect } from 'next/navigation';
import { auth } from '@clerk/nextjs/server';
+import { AuthStateParam } from '@/types';
import { getSignInToken } from '@/actions/auth';
-import { EXTENSION_EDITOR, EXTENSION_URL } from '@/lib/constants';
+import { EXTENSION_EDITOR, EXTENSION_URI_SCHEME } from '@/lib/constants';
import { DeepLink } from './DeepLink';
type Props = {
- searchParams: Promise<{ state?: string; ide?: string }>;
+ searchParams: Promise<{ state?: string; auth_redirect?: string }>;
};
export default async function Page(props: Props) {
- const { state, ide } = await props.searchParams;
+ const { state, auth_redirect: authRedirect = EXTENSION_URI_SCHEME } =
+ await props.searchParams;
if (!state) {
redirect(`/sign-in`);
}
+ const authParams = new URLSearchParams({
+ [AuthStateParam.State]: state,
+ [AuthStateParam.AuthRedirect]: authRedirect,
+ });
+
const { userId, orgId } = await auth();
const code = userId
@@ -24,30 +31,28 @@ export default async function Page(props: Props) {
: undefined;
if (!code) {
- redirect(`/sign-in?state=${state}&ide=${ide}`);
+ redirect(`/sign-in?${authParams.toString()}`);
}
if (!orgId) {
- redirect(`/select-org/${state}?ide=${ide}`);
+ redirect(`/select-org?${authParams.toString()}`);
}
- let editor;
- let deepLinkUrl;
+ let editor = EXTENSION_EDITOR;
+ let editorRedirect = EXTENSION_URI_SCHEME;
try {
const params = new URLSearchParams({ state, code });
- deepLinkUrl = new URL(
+ editorRedirect = new URL(
`/auth/clerk/callback?${params.toString()}`,
- ide ?? EXTENSION_URL,
+ authRedirect,
).toString();
- editor = new URL(deepLinkUrl).protocol.slice(0, -1);
+ editor = new URL(editorRedirect).protocol.slice(0, -1);
} catch (_) {
// Use the defaults if we can't parse the URL.
- editor = EXTENSION_EDITOR;
- deepLinkUrl = EXTENSION_URL;
}
- return