diff --git a/src/app/(centered)/authorized/[[...state]]/Authorized.tsx b/src/app/(centered)/authorized/[[...state]]/Authorized.tsx new file mode 100644 index 0000000000..dc1fa67a05 --- /dev/null +++ b/src/app/(centered)/authorized/[[...state]]/Authorized.tsx @@ -0,0 +1,59 @@ +'use client'; + +import { useState, useRef, useEffect } from 'react'; +import { useSessionStorage } from 'react-use'; +import { useRouter } from 'next/navigation'; +import { useAuth } from '@clerk/nextjs'; +import { LoaderCircle, CircleCheck, CircleX } from 'lucide-react'; + +import { Card, CardContent } from '@/components/ui'; + +export const Authorized = () => { + const { isSignedIn, orgId } = useAuth(); + const [isLoading, setIsLoading] = useState(true); + const isLoadingRef = useRef(true); + const router = useRouter(); + const [state, setState] = useSessionStorage('state'); + + useEffect(() => { + if (typeof isSignedIn !== 'undefined' && isLoadingRef.current) { + isLoadingRef.current = false; + setTimeout(() => setIsLoading(false), 250); + } + }, [isSignedIn]); + + useEffect(() => { + if (!isLoading) { + let path; + + if (!isSignedIn) { + path = state ? `/sign-in?state=${state}` : '/sign-in'; + } else if (!orgId) { + path = state ? `/select-org/${state}` : '/select-org'; + } else { + path = state ? `/extension/sign-in?state=${state}` : '/dashboard'; + } + + setTimeout(() => router.push(path), 1000); + } + }, [router, isLoading, isSignedIn, orgId, state, setState]); + + return ( + + +
+
+ Authenticating +
+ {isLoading ? ( + + ) : isSignedIn ? ( + + ) : ( + + )} +
+
+
+ ); +}; diff --git a/src/app/(centered)/authorized/[[...state]]/page.tsx b/src/app/(centered)/authorized/[[...state]]/page.tsx new file mode 100644 index 0000000000..088db4ce91 --- /dev/null +++ b/src/app/(centered)/authorized/[[...state]]/page.tsx @@ -0,0 +1,5 @@ +import { Authorized } from './Authorized'; + +export default function Page() { + return ; +} diff --git a/src/app/(centered)/extension/sign-in/page.tsx b/src/app/(centered)/extension/sign-in/page.tsx index 11008d8f88..4edb6f25d4 100644 --- a/src/app/(centered)/extension/sign-in/page.tsx +++ b/src/app/(centered)/extension/sign-in/page.tsx @@ -18,14 +18,16 @@ export default async function Page(props: Props) { } const { userId, orgId } = await auth(); - const code = userId ? await getSignInToken(userId) : undefined; + const code = userId + ? await getSignInToken(userId).catch(() => undefined) + : undefined; if (!code) { redirect(`/sign-in?state=${state}`); } if (!orgId) { - redirect(`/select-org?state=${state}`); + redirect(`/select-org/${state}`); } const searchParams = new URLSearchParams({ state, code }); diff --git a/src/app/(centered)/select-org/SelectOrg.tsx b/src/app/(centered)/select-org/SelectOrg.tsx deleted file mode 100644 index 150f155adf..0000000000 --- a/src/app/(centered)/select-org/SelectOrg.tsx +++ /dev/null @@ -1,22 +0,0 @@ -'use client'; - -import { useMemo } from 'react'; -import { useSearchParams } from 'next/navigation'; -import { OrganizationList } from '@clerk/nextjs'; - -export const SelectOrg = () => { - const searchParams = useSearchParams(); - - const afterSelectOrganizationUrl = useMemo(() => { - const state = searchParams.get('state'); - return state ? `/extension/sign-in?state=${state}` : '/dashboard'; - }, [searchParams]); - - return ( - - ); -}; diff --git a/src/app/(centered)/select-org/[[...state]]/SelectOrg.tsx b/src/app/(centered)/select-org/[[...state]]/SelectOrg.tsx new file mode 100644 index 0000000000..39c8cac855 --- /dev/null +++ b/src/app/(centered)/select-org/[[...state]]/SelectOrg.tsx @@ -0,0 +1,15 @@ +import { OrganizationList } from '@clerk/nextjs'; + +export const SelectOrg = ({ state }: { state?: string }) => { + const redirectUrl = state + ? `/extension/sign-in?state=${state}` + : '/dashboard'; + + return ( + + ); +}; diff --git a/src/app/(centered)/select-org/[[...state]]/page.tsx b/src/app/(centered)/select-org/[[...state]]/page.tsx new file mode 100644 index 0000000000..12cbdbaf28 --- /dev/null +++ b/src/app/(centered)/select-org/[[...state]]/page.tsx @@ -0,0 +1,10 @@ +import { SelectOrg } from './SelectOrg'; + +type Props = { + params: Promise<{ state: string }>; +}; + +export default async function Page({ params }: Props) { + const { state } = await params; + return ; +} diff --git a/src/app/(centered)/select-org/page.tsx b/src/app/(centered)/select-org/page.tsx deleted file mode 100644 index 99a5c1bf89..0000000000 --- a/src/app/(centered)/select-org/page.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { SelectOrg } from './SelectOrg'; - -export default async function Page() { - return ; -} diff --git a/src/app/(centered)/sign-in/[[...sign-in]]/SignIn.tsx b/src/app/(centered)/sign-in/[[...sign-in]]/SignIn.tsx deleted file mode 100644 index a68805e3a3..0000000000 --- a/src/app/(centered)/sign-in/[[...sign-in]]/SignIn.tsx +++ /dev/null @@ -1,16 +0,0 @@ -'use client'; - -import { useMemo } from 'react'; -import { useSearchParams } from 'next/navigation'; -import { SignIn as ClerkSignIn } from '@clerk/nextjs'; - -export const SignIn = () => { - const searchParams = useSearchParams(); - - const forceRedirectUrl = useMemo(() => { - const state = searchParams.get('state'); - return state ? `/extension/sign-in?state=${state}` : undefined; - }, [searchParams]); - - return ; -}; diff --git a/src/app/(centered)/sign-in/[[...sign-in]]/page.tsx b/src/app/(centered)/sign-in/[[...sign-in]]/page.tsx index ce5806e022..e2ee4a8fdd 100644 --- a/src/app/(centered)/sign-in/[[...sign-in]]/page.tsx +++ b/src/app/(centered)/sign-in/[[...sign-in]]/page.tsx @@ -1,5 +1,20 @@ -import { SignIn } from './SignIn'; +'use client'; + +import { useSessionStorage, useMount } from 'react-use'; +import { useSearchParams } from 'next/navigation'; +import { SignIn } from '@clerk/nextjs'; export default function Page() { + const searchParams = useSearchParams(); + const [, setState] = useSessionStorage('state'); + + useMount(() => { + const state = searchParams.get('state'); + + if (state) { + setState(state); + } + }); + return ; } diff --git a/src/app/(centered)/sign-up/[[...sign-up]]/SignUp.tsx b/src/app/(centered)/sign-up/[[...sign-up]]/SignUp.tsx deleted file mode 100644 index 472baee990..0000000000 --- a/src/app/(centered)/sign-up/[[...sign-up]]/SignUp.tsx +++ /dev/null @@ -1,16 +0,0 @@ -'use client'; - -import { useMemo } from 'react'; -import { useSearchParams } from 'next/navigation'; -import { SignUp as ClerkSignUp } from '@clerk/nextjs'; - -export const SignUp = () => { - const searchParams = useSearchParams(); - - const forceRedirectUrl = useMemo(() => { - const state = searchParams.get('state'); - return state ? `/extension/sign-in?state=${state}` : undefined; - }, [searchParams]); - - return ; -}; diff --git a/src/app/(centered)/sign-up/[[...sign-up]]/page.tsx b/src/app/(centered)/sign-up/[[...sign-up]]/page.tsx index 8ba5958761..d39ae5b7e8 100644 --- a/src/app/(centered)/sign-up/[[...sign-up]]/page.tsx +++ b/src/app/(centered)/sign-up/[[...sign-up]]/page.tsx @@ -1,5 +1,20 @@ -import { SignUp } from './SignUp'; +'use client'; + +import { useSessionStorage, useMount } from 'react-use'; +import { useSearchParams } from 'next/navigation'; +import { SignUp } from '@clerk/nextjs'; export default function Page() { + const searchParams = useSearchParams(); + const [, setState] = useSessionStorage('state'); + + useMount(() => { + const state = searchParams.get('state'); + + if (state) { + setState(state); + } + }); + return ; }