"use client"; import { registerUser } from "@/lib/server/register"; import { lowerCaseValidator, numberValidator, symbolValidator, upperCaseValidator, } from "@/utils/validators"; import { PasswordComplexitySettings } from "@zitadel/proto/zitadel/settings/v2/password_settings_pb"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { FieldValues, useForm } from "react-hook-form"; import Alert from "./Alert"; import { Button, ButtonVariants } from "./Button"; import { TextInput } from "./Input"; import PasswordComplexity from "./PasswordComplexity"; import { Spinner } from "./Spinner"; type Inputs = | { password: string; confirmPassword: string; } | FieldValues; type Props = { passwordComplexitySettings: PasswordComplexitySettings; email: string; firstname: string; lastname: string; organization?: string; authRequestId?: string; }; export default function SetPasswordForm({ passwordComplexitySettings, email, firstname, lastname, organization, authRequestId, }: Props) { const { register, handleSubmit, watch, formState } = useForm({ mode: "onBlur", defaultValues: { email: email ?? "", firstname: firstname ?? "", lastname: lastname ?? "", }, }); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); const router = useRouter(); async function submitRegister(values: Inputs) { setLoading(true); const response = await registerUser({ email: email, firstName: firstname, lastName: lastname, organization: organization, authRequestId: authRequestId, password: values.password, }).catch((error: Error) => { setError(error.message ?? "Could not register user"); }); setLoading(false); if (!response) { setError("Could not register user"); return; } const params: any = { userId: response.userId }; if (authRequestId) { params.authRequestId = authRequestId; } if (organization) { params.organization = organization; } if (response && response.sessionId) { params.sessionId = response.sessionId; } return router.push(`/verify?` + new URLSearchParams(params)); } const { errors } = formState; const watchPassword = watch("password", ""); const watchConfirmPassword = watch("confirmPassword", ""); const hasMinLength = passwordComplexitySettings && watchPassword?.length >= passwordComplexitySettings.minLength; const hasSymbol = symbolValidator(watchPassword); const hasNumber = numberValidator(watchPassword); const hasUppercase = upperCaseValidator(watchPassword); const hasLowercase = lowerCaseValidator(watchPassword); const policyIsValid = passwordComplexitySettings && (passwordComplexitySettings.requiresLowercase ? hasLowercase : true) && (passwordComplexitySettings.requiresNumber ? hasNumber : true) && (passwordComplexitySettings.requiresUppercase ? hasUppercase : true) && (passwordComplexitySettings.requiresSymbol ? hasSymbol : true) && hasMinLength; return (
{passwordComplexitySettings && ( )} {error && {error}}
); }