"use client"; import { resendVerifyEmail, verifyUserByEmail } from "@/lib/server/email"; import Alert from "@/ui/Alert"; import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { Button, ButtonVariants } from "./Button"; import { TextInput } from "./Input"; import { Spinner } from "./Spinner"; type Inputs = { code: string; }; type Props = { userId: string; code: string; submit: boolean; organization?: string; authRequestId?: string; sessionId?: string; }; export default function VerifyEmailForm({ userId, code, submit, organization, authRequestId, sessionId, }: Props) { const { register, handleSubmit, formState } = useForm({ mode: "onBlur", defaultValues: { code: code ?? "", }, }); useEffect(() => { if (submit && code && userId) { // When we navigate to this page, we always want to be redirected if submit is true and the parameters are valid. // For programmatic verification, the /verifyemail API should be used. submitCodeAndContinue({ code }); } }, []); const [error, setError] = useState(""); const [loading, setLoading] = useState(false); const router = useRouter(); async function resendCode() { setLoading(true); const response = await resendVerifyEmail({ userId, }).catch((error: Error) => { setLoading(false); setError(error.message); }); setLoading(false); return response; } async function submitCodeAndContinue(value: Inputs): Promise { setLoading(true); const verifyResponse = await verifyUserByEmail({ code: value.code, userId, }).catch((error: Error) => { setLoading(false); setError(error.message); }); setLoading(false); if (!verifyResponse) { setError("Could not verify email"); return; } const params = new URLSearchParams({}); if (organization) { params.set("organization", organization); } if (authRequestId && sessionId) { params.set("authRequest", authRequestId); params.set("sessionId", sessionId); return router.push(`/login?` + params); } else { return router.push(`/loginname?` + params); } } return (
{error && (
{error}
)}
); }