import { zodResolver } from "@hookform/resolvers/zod"; import { Button } from "@workspace/ui/components/button"; import { Form, FormControl, FormField, FormItem, FormMessage, } from "@workspace/ui/components/form"; import { Input } from "@workspace/ui/components/input"; import { Icon } from "@workspace/ui/composed/icon"; import { Markdown } from "@workspace/ui/composed/markdown"; import type { Dispatch, SetStateAction } from "react"; import { useRef, useState } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { z } from "zod"; import { useGlobalStore } from "@/stores/global"; import LocalCaptcha, { type LocalCaptchaRef } from "../local-captcha"; import SendCode from "../send-code"; import SliderCaptcha, { type SliderCaptchaRef } from "../slider-captcha"; import type { TurnstileRef } from "../turnstile"; import CloudFlareTurnstile from "../turnstile"; export default function RegisterForm({ loading, onSubmit, initialValues, setInitialValues, onSwitchForm, }: { loading?: boolean; onSubmit: (data: any) => void; initialValues: any; setInitialValues: Dispatch>; onSwitchForm: Dispatch>; }) { const { t } = useTranslation("auth"); const { common } = useGlobalStore(); const { verify, auth, invite } = common; const [captchaId, setCaptchaId] = useState(""); const isTurnstile = verify.captcha_type === "turnstile"; const isLocal = verify.captcha_type === "local"; const isSlider = verify.captcha_type === "slider"; const captchaEnabled = verify.enable_user_register_captcha; const handleCheckUser = async (email: string) => { try { if (!auth.email.enable_domain_suffix) return true; const domain = email.split("@")[1]; const isValid = auth.email?.domain_suffix_list .split("\n") .includes(domain || ""); return isValid; } catch (error) { console.log("Error checking user:", error); return false; } }; const formSchema = z .object({ email: z .string() .email(t("register.email", "Please enter a valid email address")) .refine(handleCheckUser, { message: t( "register.whitelist", "This email domain is not in the whitelist" ), }), password: z.string(), repeat_password: z.string(), code: auth.email.enable_verify ? z.string() : z.string().nullish(), invite: invite.forced_invite ? z.string().min(1) : z.string().nullish(), cf_token: captchaEnabled && isTurnstile && verify.turnstile_site_key ? z.string() : z.string().nullish(), captcha_code: captchaEnabled && isLocal ? z .string() .min(1, t("captcha.required", "Please enter captcha code")) : z.string().nullish(), slider_token: captchaEnabled && isSlider ? z .string() .min(1, t("captcha.sliderRequired", "Please complete the slider")) : z.string().optional(), }) .superRefine(({ password, repeat_password }, ctx) => { if (password !== repeat_password) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: t("register.passwordMismatch", "Passwords do not match"), path: ["repeat_password"], }); } }); const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { cf_token: "", captcha_code: "", slider_token: "", ...initialValues, invite: localStorage.getItem("invite") || "", }, }); const turnstile = useRef(null); const localCaptcha = useRef(null); const sliderCaptcha = useRef(null); const handleSubmit = form.handleSubmit((data) => { try { // Add captcha_id for local captcha if (isLocal && captchaEnabled) { (data as any).captcha_id = captchaId; } onSubmit(data); } catch (_error) { turnstile.current?.reset(); localCaptcha.current?.reset(); sliderCaptcha.current?.reset(); } }); return ( <> {auth.register.stop_register ? ( {t("register.message", "Registration is currently disabled")} ) : (
( )} /> ( )} /> ( )} /> {auth.email.enable_verify && ( (
)} /> )} ( )} /> {captchaEnabled && isTurnstile && ( ( )} /> )} {captchaEnabled && isLocal && ( ( )} /> )} {captchaEnabled && isSlider && ( ( )} /> )} )}
{t("register.existingAccount", "Already have an account?")} 
); }