import { zodResolver } from "@hookform/resolvers/zod"; import { t } from "@lingui/core/macro"; import { Trans } from "@lingui/react/macro"; import { ArrowLeftIcon, CheckIcon } from "@phosphor-icons/react"; import { createFileRoute, Link, redirect, useNavigate, useRouter } from "@tanstack/react-router"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import z from "zod"; import { Button } from "@/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormMessage } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { authClient } from "@/integrations/auth/client"; export const Route = createFileRoute("/auth/verify-2fa")({ component: RouteComponent, beforeLoad: async ({ context }) => { if (context.session) throw redirect({ to: "/dashboard", replace: true }); }, }); const formSchema = z.object({ code: z.string().length(6, "Code must be 6 digits"), }); type FormValues = z.infer; function RouteComponent() { const router = useRouter(); const navigate = useNavigate(); const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { code: "", }, }); const onSubmit = async (data: FormValues) => { const toastId = toast.loading(t`Verifying code...`); const { error } = await authClient.twoFactor.verifyTotp({ code: data.code, }); if (error) { toast.error( error.message || t({ comment: "Fallback toast when verifying a two-factor authentication code fails", message: "Failed to verify your code. Please try again.", }), { id: toastId }, ); return; } toast.dismiss(toastId); await router.invalidate(); void navigate({ to: "/dashboard", replace: true }); }; return ( <>

Two-Factor Authentication

Enter the verification code from your authenticator app
( } /> )} />