import * as React from "react" import { Link, Navigate, useLocation } from "react-router-dom" import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query" import { ArrowRight, KeyRound, LockKeyhole } from "lucide-react" import { api } from "@/lib/api" import { useMe } from "@/hooks/use-me" import { TurnstileBox } from "@/components/turnstile-box" import { PasswordInput } from "@/components/ui/password-input" 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 { safeReturnPath } from "@/lib/navigation" import { AuthError, AuthLoading } from "@/components/auth-states" import { BrandMark } from "@/components/brand-mark" export function LoginPage() { const me = useMe() const location = useLocation() const qc = useQueryClient() const { toast } = useToast() const publicSettings = useQuery({ queryKey: ["public-settings"], queryFn: api.publicSettings }) const [turnstileToken, setTurnstileToken] = React.useState("") const [challengeToken, setChallengeToken] = React.useState("") const login = useMutation({ mutationFn: (form: FormData) => challengeToken ? api.login({ challengeToken, twoFactorCode: String(form.get("twoFactorCode") || "") }) : api.login({ email: String(form.get("email") || ""), password: String(form.get("password") || ""), turnstileToken }), onSuccess: async (data) => { if (data.twoFactorRequired && data.challengeToken) { setChallengeToken(data.challengeToken) toast({ title: "请输入双因素验证码" }) return } await qc.invalidateQueries({ queryKey: ["me"] }) }, onError: (e) => toast({ title: "登录失败", description: e.message }), }) const turnstileRequired = !!publicSettings.data?.turnstileEnabled const returnPath = safeReturnPath((location.state as { from?: unknown } | null)?.from) if (me.data?.user) return if (publicSettings.isLoading) return if (publicSettings.isError) return { void publicSettings.refetch() }} /> return ( NewSzxcn 邮箱 {challengeToken ? : } {challengeToken ? "双因素验证" : "账号登录"} { e.preventDefault(); if (!challengeToken && turnstileRequired && !turnstileToken) { toast({ title: "请先完成人机验证" }); return }; login.mutate(new FormData(e.currentTarget)) }}> {!challengeToken ? ( <> 邮箱地址 密码 > ) : ( 双因素验证码或恢复码 )} {!challengeToken && turnstileRequired && ( )} {login.isPending ? "登录中..." : challengeToken ? "验证登录" : "登录"} {!login.isPending && } {challengeToken && setChallengeToken("")}>返回登录} {!challengeToken && ( 没有账号? 注册账号 )} ) }