"use client" import { Button } from "@/components/ui/button" import { Checkbox } from "@/components/ui/checkbox" import { IconInput } from "@/components/ui/icon-input" import { Label } from "@/components/ui/label" import { register as registerApi, sendEmailVerificationCode } from "@/lib/api" import { toApiError } from "@/lib/errors" import { notifyInfo, notifySuccess } from "@/lib/toast" import { useAuthStore } from "@/store/auth" import { standardSchemaResolver } from "@hookform/resolvers/standard-schema" import { Eye, EyeOff, Lock, Mail, Shield, User } from "lucide-react" import Link from "next/link" import { useRouter } from "next/navigation" import { useEffect, useState } from "react" import { Controller, useForm } from "react-hook-form" import { z } from "zod" const registerSchema = z .object({ username: z.string().min(1, "请输入用户名"), email: z.string().email("请输入正确的邮箱地址"), vcode: z.string().optional(), password: z.string().min(6, "密码至少6位"), confirmPassword: z.string(), agreeTerms: z.boolean(), }) .refine((data) => data.password === data.confirmPassword, { message: "两次密码不一致", path: ["confirmPassword"], }) .refine((data) => data.agreeTerms, { message: "请同意用户协议和隐私政策", path: ["agreeTerms"], }) export default function RegisterPage() { const router = useRouter() const { login: storeLogin } = useAuthStore() const [showPassword, setShowPassword] = useState(false) const [showConfirmPassword, setShowConfirmPassword] = useState(false) const [countdown, setCountdown] = useState(0) const { register, handleSubmit, control, getValues, trigger, formState: { errors, isSubmitting }, } = useForm({ resolver: standardSchemaResolver(registerSchema), defaultValues: { agreeTerms: false }, }) useEffect(() => { if (countdown <= 0) return const timer = setInterval(() => setCountdown((c) => c - 1), 1000) return () => clearInterval(timer) }, [countdown]) const handleSendCode = async () => { const isValid = await trigger("email") if (!isValid) return const email = String(getValues("email") ?? "") try { await sendEmailVerificationCode({ email, scene: "register" }) setCountdown(60) notifySuccess("验证码已发送到你的邮箱") } catch (err) { notifyInfo(toApiError(err).msg) } } const onSubmit = async (data: z.infer) => { try { const user = await registerApi({ username: data.username, email: data.email, password: data.password, vcode: data.vcode, }) storeLogin(user, ["consumer"]) router.push("/") } catch (err) { notifyInfo(toApiError(err).msg) } } return ( <>

创建账号

注册成为聚玩用户,开始探索

} placeholder="输入用户名" {...register("username")} /> {errors.username &&

{errors.username.message}

}
} placeholder="输入邮箱地址" {...register("email")} /> {errors.email &&

{errors.email.message}

}
} placeholder="输入验证码(可选)" {...register("vcode")} />
{errors.vcode &&

{errors.vcode.message}

}
} type={showPassword ? "text" : "password"} placeholder="设置密码 (至少6位)" rightElement={ } {...register("password")} /> {errors.password &&

{errors.password.message}

}
} type={showConfirmPassword ? "text" : "password"} placeholder="再次输入密码" rightElement={ } {...register("confirmPassword")} /> {errors.confirmPassword && (

{errors.confirmPassword.message}

)}
( field.onChange(v === true)} className="mt-0.5" /> )} />
{errors.agreeTerms && (

{errors.agreeTerms.message}

)}

已有账号?{" "} 立即登录

) }