import { useState } from "react"; import { apiPost, setToken } from "../lib/api"; import { CLASSLENS_ICON } from "../lib/icon"; interface User { id: number; email: string; display_name: string; } interface AuthResponse { token: string; user: User; } interface LoginFormProps { onLogin: (user: User) => void; } export function LoginForm({ onLogin }: LoginFormProps) { const [mode, setMode] = useState<"login" | "register">("login"); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [error, setError] = useState(""); const [loading, setLoading] = useState(false); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(""); setLoading(true); try { const endpoint = mode === "login" ? "/api/auth/login" : "/api/auth/register"; const result = await apiPost(endpoint, { email, password }); setToken(result.token); onLogin(result.user); } catch (err: unknown) { setError(err instanceof Error ? err.message : "An error occurred"); } finally { setLoading(false); } }; return (
ClassLens

ClassLens

AI 驅動的考試分析

{/* Mode toggle */}
setEmail(e.target.value)} placeholder="your@email.com" required className="input" autoFocus />
setPassword(e.target.value)} placeholder="••••••••" required minLength={4} className="input" />
{error && (

{error}

)}
); }