"use client"; import type React from "react"; import { useEffect, useState } from "react"; import { Button } from "@/shared/common/ui/button"; import { Input } from "@/shared/common/ui/input"; import { ArrowLeft, Eye, EyeOff, Lock, Mail, Phone, User, } from "lucide-react"; import { useAuthUser } from "@/shared/hooks/useAuthUser"; import { useTenantConfig } from "@/layout/components/TenantConfig"; import { isValidEmail, isValidEthiopianPhoneNum, } from "@/record-management/common/editor/Utils"; import { Link } from "react-router-dom"; import { useTranslation } from "react-i18next"; import { useAuth } from "@/shared/context/AuthContext"; import OTPModal from "./OTPModal"; import { getRememberMePreference } from "@/shared/utils/authPersistence"; export const Login = () => { const { login: authLogin, isLoggingIn } = useAuthUser(); const { config } = useTenantConfig(); const detectLoginMethod = (value: string): "email" | "phone" | "username" => { if (value.includes("@") && value.includes(".com")) return "email"; if (/^\+?\d+$/.test(value)) return "phone"; return "username"; }; const [otpVerify, setOtpVerify] = useState(""); const { showOtpModal, setShowOtpModal, setRememberMePreference } = useAuth(); const [identifier, setIdentifier] = useState(""); const [password, setPassword] = useState(""); const [passwordType, setPasswordType] = useState("password"); const [phoneError, setPhoneError] = useState(""); const [rememberMe, setRememberMe] = useState(false); const { t } = useTranslation(); useEffect(() => { const savedRememberMe = getRememberMePreference(); setRememberMe(savedRememberMe); setRememberMePreference(savedRememberMe); }, [setRememberMePreference]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setPhoneError(""); try { let processedIdentifier = identifier; const loginMethod = detectLoginMethod(identifier); if (loginMethod === "phone") { if (!isValidEthiopianPhoneNum(processedIdentifier)) { setPhoneError(t("auth.err")); return; } if (processedIdentifier.startsWith("0")) { processedIdentifier = "+251" + processedIdentifier.slice(1); } } else if (loginMethod === "email") { if (!isValidEmail(processedIdentifier)) { setPhoneError(t("auth.invalidEmail")); return; } } // The backend identifies users via the email field regardless of login method const payload: { email: string; password: string } = { email: processedIdentifier, password, }; setOtpVerify(processedIdentifier); setRememberMePreference(rememberMe); authLogin({ payload, rememberMeValue: rememberMe }); } catch (error) { console.error("Login failed:", error); } }; const getInputIcon = () => { const method = detectLoginMethod(identifier); switch (method) { case "email": return ( ); case "phone": return ( ); case "username": return ( ); default: return null; } }; return ( <>
{t("Back to Home")}
{/* Left Panel - Login Form */}
Smart Office Logo

{t("auth.welcomeBack")}

{t("auth.enterCredentials")}

{/* Identifier Input */}
{getInputIcon()} { setIdentifier(e.target.value.trim()); if (phoneError) setPhoneError(""); }} required />
{phoneError && (

{phoneError}

)}
{/* Password Input */}
setPassword(e.target.value)} required />
{/* Remember Me & Forgot Password */}
{t("auth.forgotPassword")}
{/* Submit Button */} {/* Sign Up Link */}
{t("registration.auth.externalUserPrompt")}{" "} {t("registration.auth.signInWithProvider")}
{t("Don't have an account?")}{" "} {t("Sign Up")}
{/* Right Panel - Marketing Content */}

{t("auth.welcomeHeadline")}
{t("auth.paperlessOffice")}

{t("auth.welcomeSubtext")}

{/* Dashboard Preview */}
Main Dashboard
{showOtpModal && ( setShowOtpModal(false)} identifier={otpVerify} identifierType={detectLoginMethod(otpVerify)} /> )} ); };