import { useState } from "react"; import { LoginRequest, LoginResponse } from "../items"; interface LoginProps { onLogin: (token: string) => void; } export function Login({ onLogin }: LoginProps) { const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [error, setError] = useState(""); const [isSubmitting, setIsSubmitting] = useState(false); const [fieldErrors, setFieldErrors] = useState<{ username?: string, password?: string }>({}); const validateForm = () => { const errors: { username?: string, password?: string } = {}; if (!username.trim()) errors.username = "Username is required"; if (!password) errors.password = "Password is required"; setFieldErrors(errors); return Object.keys(errors).length === 0; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(""); if (!validateForm()) return; setIsSubmitting(true); try { const req = LoginRequest.create({ username: username.trim(), password }); const body = LoginRequest.encode(req).finish(); const res = await fetch("/auth/login", { method: "POST", body, headers: { "Content-Type": "application/octet-stream", }, }); const buffer = await res.arrayBuffer(); const response = LoginResponse.decode(new Uint8Array(buffer)); if (response.success) { onLogin(response.token); } else { setError(response.message || "Login failed"); } } catch (err) { console.error("Login error:", err); setError("An unexpected error occurred. Please try again."); } finally { setIsSubmitting(false); } }; return (

🎮 Login

{ setUsername(e.target.value); if (fieldErrors.username) setFieldErrors({ ...fieldErrors, username: undefined }); }} placeholder="Enter your username" style={{ borderColor: fieldErrors.username ? "#f44336" : undefined, borderWidth: fieldErrors.username ? "2px" : undefined }} /> {fieldErrors.username && ( {fieldErrors.username} )}
{ setPassword(e.target.value); if (fieldErrors.password) setFieldErrors({ ...fieldErrors, password: undefined }); }} placeholder="Enter your password" style={{ borderColor: fieldErrors.password ? "#f44336" : undefined, borderWidth: fieldErrors.password ? "2px" : undefined }} /> {fieldErrors.password && ( {fieldErrors.password} )}
{error && (
⚠️ {error}
)}
); }