import React, { useState } from "react"; import { useAuth } from "~/contexts/auth-context"; import toast from "react-hot-toast"; import { Button } from "~/components/ui/button"; import { TextField, PasswordField, CheckboxField, FieldGroup, } from "~/components/ui/form-field"; import { ErrorAlert, ConnectionError } from "~/components/ui/error-alert"; import { InogenLogo } from "~/components/ui/brand-logo"; import { LoginLayout, LoginContent, LoginSidebar, LoginHeader, LoginBranding, LoginFormContainer, } from "./login-layout"; import { Loader2, User, Lock } from "lucide-react"; interface LoginFormProps { onSuccess?: () => void; } interface FormData { username: string; password: string; rememberMe: boolean; } interface ValidationErrors { username?: string; password?: string; general?: string; } export function LoginForm({ onSuccess }: LoginFormProps) { const [formData, setFormData] = useState({ username: "", password: "", rememberMe: false, }); const [errors, setErrors] = useState({}); const [isConnectionError, setIsConnectionError] = useState(false); const { login, isLoading } = useAuth(); const updateField = (field: keyof FormData, value: string | boolean) => { setFormData((prev) => ({ ...prev, [field]: value })); // Clear field-specific errors when user starts typing if (errors[field as keyof ValidationErrors]) { setErrors((prev) => ({ ...prev, [field]: undefined })); } }; const validateForm = (): ValidationErrors => { const newErrors: ValidationErrors = {}; if (!formData.username.trim()) { newErrors.username = "نام کاربری الزامی است"; } else if (formData.username.length < 3) { newErrors.username = "نام کاربری باید حداقل ۳ کاراکتر باشد"; } if (!formData.password) { newErrors.password = "کلمه عبور الزامی است"; } else if (formData.password.length < 4) { newErrors.password = "کلمه عبور باید حداقل ۴ کاراکتر باشد"; } return newErrors; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); // Clear previous errors setErrors({}); setIsConnectionError(false); // Validate form const validationErrors = validateForm(); if (Object.keys(validationErrors).length > 0) { setErrors(validationErrors); const firstError = Object.values(validationErrors)[0]; toast.error(firstError); return; } try { const success = await login(formData.username, formData.password); if (success) { toast.success("ورود موفقیت‌آمیز بود!"); onSuccess?.(); } else { const errorMessage = "نام کاربری یا رمز عبور اشتباه است"; setErrors({ general: errorMessage }); toast.error(errorMessage); } } catch (err: any) { console.error("Login error:", err); // Check if it's a connection error if (err?.code === "NETWORK_ERROR" || err?.message?.includes("fetch")) { setIsConnectionError(true); } else { const errorMessage = err?.message || "خطا در برقراری ارتباط با سرور"; setErrors({ general: errorMessage }); toast.error(errorMessage); } } }; const handleRetry = () => { setIsConnectionError(false); setErrors({}); }; return ( {/* Left Side - Login Form */} {/* Connection Error */} {isConnectionError && } {/* General Error */} {errors.general && ( setErrors({ general: undefined })} dismissible onDismiss={() => setErrors({ general: undefined })} /> )} {/* Username Field */} updateField("username", value)} error={errors.username} placeholder="نام کاربری" disabled={isLoading} autoComplete="username" required leftIcon={} /> {/* Password Field */} updateField("password", value)} error={errors.password} placeholder="کلمه عبور" disabled={isLoading} autoComplete="current-password" required minLength={4} /> {/* Remember Me Checkbox */} {/*
updateField("rememberMe", checked)} disabled={isLoading} size="md" />
*/} {/* Login Button */} {/* Additional Links */}
{/* Right Side - Branding */} } />
); }