"use client"; import { use, useState } from "react"; import { useRouter } from "next/navigation"; import { PASSWORD_MIN_LENGTH, PASSWORD_POLICY_MESSAGE } from "@capakraken/shared"; import { trpc } from "~/lib/trpc/client.js"; export default function ResetPasswordPage({ params }: { params: Promise<{ token: string }> }) { const { token } = use(params); const router = useRouter(); const [password, setPassword] = useState(""); const [confirm, setConfirm] = useState(""); const [formError, setFormError] = useState(null); const [done, setDone] = useState(false); const mutation = trpc.auth.resetPassword.useMutation({ onSuccess: () => setDone(true), onError: (err) => setFormError(err.message), }); function handleSubmit(e: React.FormEvent) { e.preventDefault(); setFormError(null); if (password.length < PASSWORD_MIN_LENGTH) { setFormError(PASSWORD_POLICY_MESSAGE); return; } if (password !== confirm) { setFormError("Passwords do not match."); return; } mutation.mutate({ token, password }); } if (done) { return (

Password updated

Your password has been changed successfully.

); } return (

Set a new password

Choose a new password for your account.

{formError && (
{formError}
)}
setPassword(e.target.value)} required minLength={PASSWORD_MIN_LENGTH} placeholder={`At least ${PASSWORD_MIN_LENGTH} characters`} className="w-full rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-900 px-3 py-2 text-sm text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-brand-400" />
setConfirm(e.target.value)} required placeholder="Repeat your password" className="w-full rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-900 px-3 py-2 text-sm text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-brand-400" />
); }