Version 3 of the kit: - Radix UI replaced with Base UI (using the Shadcn UI patterns) - next-intl replaces react-i18next - enhanceAction deprecated; usage moved to next-safe-action - main layout now wrapped with [locale] path segment - Teams only mode - Layout updates - Zod v4 - Next.js 16.2 - Typescript 6 - All other dependencies updated - Removed deprecated Edge CSRF - Dynamic Github Action runner
75 lines
1.8 KiB
TypeScript
75 lines
1.8 KiB
TypeScript
import Link from 'next/link';
|
|
|
|
import type { AuthError } from '@supabase/supabase-js';
|
|
|
|
import { ResendAuthLinkForm } from '@kit/auth/resend-email-link';
|
|
import { Alert, AlertDescription, AlertTitle } from '@kit/ui/alert';
|
|
import { Button } from '@kit/ui/button';
|
|
import { Trans } from '@kit/ui/trans';
|
|
|
|
import pathsConfig from '~/config/paths.config';
|
|
|
|
interface AuthCallbackErrorPageProps {
|
|
searchParams: Promise<{
|
|
error: string;
|
|
callback?: string;
|
|
email?: string;
|
|
code?: AuthError['code'];
|
|
}>;
|
|
}
|
|
|
|
async function AuthCallbackErrorPage(props: AuthCallbackErrorPageProps) {
|
|
const { error, callback, code } = await props.searchParams;
|
|
const signInPath = pathsConfig.auth.signIn;
|
|
const redirectPath = callback ?? pathsConfig.auth.callback;
|
|
|
|
return (
|
|
<div className={'flex flex-col space-y-4 py-4'}>
|
|
<Alert variant={'warning'}>
|
|
<AlertTitle>
|
|
<Trans i18nKey={'auth.authenticationErrorAlertHeading'} />
|
|
</AlertTitle>
|
|
|
|
<AlertDescription>
|
|
<Trans i18nKey={error ?? 'auth.authenticationErrorAlertBody'} />
|
|
</AlertDescription>
|
|
</Alert>
|
|
|
|
<AuthCallbackForm
|
|
code={code}
|
|
signInPath={signInPath}
|
|
redirectPath={redirectPath}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function AuthCallbackForm(props: {
|
|
signInPath: string;
|
|
redirectPath?: string;
|
|
code?: AuthError['code'];
|
|
}) {
|
|
switch (props.code) {
|
|
case 'otp_expired':
|
|
return <ResendAuthLinkForm redirectPath={props.redirectPath} />;
|
|
|
|
default:
|
|
return <SignInButton signInPath={props.signInPath} />;
|
|
}
|
|
}
|
|
|
|
function SignInButton(props: { signInPath: string }) {
|
|
return (
|
|
<Button
|
|
className={'w-full'}
|
|
render={
|
|
<Link href={props.signInPath}>
|
|
<Trans i18nKey={'auth.signIn'} />
|
|
</Link>
|
|
}
|
|
/>
|
|
);
|
|
}
|
|
|
|
export default AuthCallbackErrorPage;
|