import * as React from "react" import { Link, Navigate, useNavigate } from "react-router-dom" import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query" import { api } from "@/lib/api" import { useMe } from "@/hooks/use-me" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { useToast } from "@/hooks/use-toast" import { TurnstileBox } from "@/components/turnstile-box" import { validatePasswordConfirm } from "@/lib/validation" export function RegisterPage() { const me = useMe() const qc = useQueryClient() const navigate = useNavigate() const { toast } = useToast() const publicSettings = useQuery({ queryKey: ["public-settings"], queryFn: api.publicSettings }) const [turnstileToken, setTurnstileToken] = React.useState("") const register = useMutation({ mutationFn: (form: FormData) => { const password = String(form.get("password") || "") const confirmPassword = String(form.get("confirmPassword") || "") validatePasswordConfirm(password, confirmPassword) return api.register({ email: String(form.get("email") || ""), displayName: String(form.get("displayName") || ""), password, turnstileToken, }) }, onSuccess: async () => { await qc.invalidateQueries({ queryKey: ["me"] }) toast({ title: "注册成功" }) navigate("/profile", { replace: true }) }, onError: (e) => toast({ title: "注册失败", description: e.message }), }) const turnstileRequired = !!publicSettings.data?.turnstileEnabled if (me.data?.user) return return (

注册账号

{publicSettings.isSuccess && !publicSettings.data.openRegistration ? (
当前未开放注册
) : (
{ e.preventDefault(); if (turnstileRequired && !turnstileToken) { toast({ title: "请先完成人机验证" }); return }; register.mutate(new FormData(e.currentTarget)) }}>
{turnstileRequired && } )}
) }