import * as React from "react" import { Link, Navigate } 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" export function LoginPage() { const me = useMe() 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 if (me.data?.user) return return (

LanQin Email

{challengeToken ? : } {challengeToken ? "双因素验证" : "账号登录"}
{ e.preventDefault(); if (!challengeToken && turnstileRequired && !turnstileToken) { toast({ title: "请先完成人机验证" }); return }; login.mutate(new FormData(e.currentTarget)) }}> {!challengeToken ? ( <>
) : (
)} {!challengeToken && turnstileRequired && ( )} {challengeToken && }
{!challengeToken && (
没有账号?
)}
) }