import { useState } from 'react' import type { FormEvent } from 'react' import { motion } from 'framer-motion' import { fadeUp, stagger } from './motion' import { TextField } from './ui/TextField' import { Button } from './ui/Button' interface LoginFormProps { /** 校验凭据;失败时抛错 */ onSignIn: (username: string, password: string, remember: boolean) => Promise } // 右侧登录表单:接 Rust 后端鉴权。无注册入口(用户由后端写死)。 export function LoginForm({ onSignIn }: LoginFormProps) { const [username, setUsername] = useState('') const [password, setPassword] = useState('') const [remember, setRemember] = useState(true) const [error, setError] = useState(null) const [submitting, setSubmitting] = useState(false) const handleSubmit = async (e: FormEvent) => { e.preventDefault() if (submitting) return setError(null) setSubmitting(true) try { await onSignIn(username.trim(), password, remember) // 成功后由上层切换到博客页,本组件随之卸载,无需额外处理。 } catch (err) { setError(err instanceof Error ? err.message : 'Sign-in failed') setSubmitting(false) } } return (

Sign in

Enter your details to continue.

setUsername(e.target.value)} required /> setPassword(e.target.value)} required /> {error && ( {error} )}
) }