72 lines
1.9 KiB
TypeScript
72 lines
1.9 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';
|
|
import { withI18n } from '~/lib/i18n/with-i18n';
|
|
|
|
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'} asChild>
|
|
<Link href={props.signInPath}>
|
|
<Trans i18nKey={'auth:signIn'} />
|
|
</Link>
|
|
</Button>
|
|
);
|
|
}
|
|
|
|
export default withI18n(AuthCallbackErrorPage);
|