"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import Link from "next/link"; import { useRouter, useSearchParams } from "next/navigation"; import { Suspense } from "react"; import { useForm } from "react-hook-form"; import { KeyRound, Loader2 } from "lucide-react"; import { z } from "zod"; import { FormField } from "@/components/ui/form-field"; import { PasswordField } from "@/components/ui/password-field"; import { PasswordStrengthMeter } from "@/components/ui/password-strength-meter"; import { authErrorMessage, useConfirmPasswordReset } from "@/hooks/use-auth"; const resetSchema = z.object({ email: z.string().email("Enter a valid email address"), code: z .string() .length(6, "Enter the 6-digit code") .regex(/^\d{6}$/, "Digits only"), newPassword: z .string() .min(10, "Must be at least 10 characters") .refine((v) => /[a-zA-Z]/.test(v) && /\d/.test(v), { message: "Must contain at least one letter and one digit", }), }); type ResetForm = z.infer; function ResetPasswordCard() { const router = useRouter(); const searchParams = useSearchParams(); const resetMutation = useConfirmPasswordReset(); const { register, handleSubmit, watch, formState: { errors }, } = useForm({ resolver: zodResolver(resetSchema), defaultValues: { email: searchParams.get("email") ?? "" }, }); const onSubmit = handleSubmit(async (values) => { try { await resetMutation.mutateAsync({ email: values.email, code: values.code, new_password: values.newPassword, }); router.push("/login?reset=1"); } catch { // Surfaced via resetMutation.isError below. } }); return (

Choose a new password

Enter the code we emailed you.

{ e.target.value = e.target.value.replace(/\D/g, "").slice(0, 6); }, })} error={errors.code?.message} />
{resetMutation.isError && (

{authErrorMessage(resetMutation.error)}

)}

Back to sign in

); } export default function ResetPasswordPage() { return (
); }