"use client"; import { useState } from "react"; import { Button, ButtonVariants } from "./Button"; import { TextInput } from "./Input"; import { useForm } from "react-hook-form"; import { useRouter } from "next/navigation"; import { Spinner } from "./Spinner"; import Alert from "./Alert"; type Inputs = { password: string; }; type Props = { loginName?: string; isAlternative?: boolean; // whether password was requested as alternative auth method promptPasswordless?: boolean; }; export default function PasswordForm({ loginName, promptPasswordless, isAlternative, }: Props) { const { register, handleSubmit, formState } = useForm({ mode: "onBlur", }); const [error, setError] = useState(""); const [loading, setLoading] = useState(false); const router = useRouter(); async function submitPassword(values: Inputs) { setError(""); setLoading(true); const res = await fetch("/api/session", { method: "PUT", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ loginName, password: values.password, }), }); const response = await res.json(); setLoading(false); if (!res.ok) { setError(response.details); return Promise.reject(response.details); } return response; } function submitPasswordAndContinue(value: Inputs): Promise { return submitPassword(value).then((resp: any) => { if ( resp.factors && !resp.factors.passwordless && // if session was not verified with a passkey promptPasswordless && // if explicitly prompted due policy !isAlternative // escaped if password was used as an alternative method ) { return router.push( `/passkey/add?` + new URLSearchParams({ loginName: resp.factors.user.loginName, promptPasswordless: "true", }) ); } else { return router.push(`/accounts`); } }); } const { errors } = formState; return (
{loginName && ( )}
{error && (
{error}
)}
{/* */}
); }