"use client"; import { registerUser } from "@/lib/server/register"; import { LegalAndSupportSettings } from "@zitadel/proto/zitadel/settings/v2/legal_settings_pb"; import { LoginSettings, PasskeysType, } from "@zitadel/proto/zitadel/settings/v2/login_settings_pb"; import { useTranslations } from "next-intl"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { FieldValues, useForm } from "react-hook-form"; import { Alert } from "./alert"; import { AuthenticationMethod, AuthenticationMethodRadio, methods, } from "./authentication-method-radio"; import { BackButton } from "./back-button"; import { Button, ButtonVariants } from "./button"; import { TextInput } from "./input"; import { PrivacyPolicyCheckboxes } from "./privacy-policy-checkboxes"; import { Spinner } from "./spinner"; type Inputs = | { firstname: string; lastname: string; email: string; } | FieldValues; type Props = { legal: LegalAndSupportSettings; firstname?: string; lastname?: string; email?: string; organization?: string; authRequestId?: string; loginSettings?: LoginSettings; }; export function RegisterForm({ legal, email, firstname, lastname, organization, authRequestId, loginSettings, }: Props) { const t = useTranslations("register"); const { register, handleSubmit, formState } = useForm({ mode: "onBlur", defaultValues: { email: email ?? "", firstName: firstname ?? "", lastname: lastname ?? "", }, }); const [loading, setLoading] = useState(false); const [selected, setSelected] = useState(methods[0]); const [error, setError] = useState(""); const router = useRouter(); async function submitAndRegister(values: Inputs) { setLoading(true); const response = await registerUser({ email: values.email, firstName: values.firstname, lastName: values.lastname, organization: organization, authRequestId: authRequestId, }) .catch(() => { setError("Could not register user"); return; }) .finally(() => { setLoading(false); }); if (response && "error" in response) { setError(response.error); return; } return response; } async function submitAndContinue( value: Inputs, withPassword: boolean = false, ) { const registerParams: any = value; if (organization) { registerParams.organization = organization; } if (authRequestId) { registerParams.authRequestId = authRequestId; } // redirect user to /register/password if password is chosen if (withPassword) { return router.push( `/register/password?` + new URLSearchParams(registerParams), ); } else { return submitAndRegister(value); } } const { errors } = formState; const [tosAndPolicyAccepted, setTosAndPolicyAccepted] = useState(false); return (
{legal && ( )}

{t("selectMethod")}

{/* show chooser if both methods are allowed */} {loginSettings && loginSettings.allowUsernamePassword && loginSettings.passkeysType === PasskeysType.ALLOWED && (
)} {error && (
{error}
)}
); }