"use client"; import { useState } from "react"; import Link from "next/link"; import { useAuth } from "@/hooks/useAuth"; import { useTranslations } from "next-intl"; import CommonGridShape from "@/components/common/CommonGridShape"; import { Eye, EyeOff } from "lucide-react"; import axios from "@/lib/axios"; import { Turnstile } from "@marsidev/react-turnstile"; export default function SigninClient() { const t = useTranslations("Auth"); const { login } = useAuth({ middleware: "guest", redirectIfAuthenticated: "/dashboard", }); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [remember, setRemember] = useState(false); const [showPassword, setShowPassword] = useState(false); const [errors, setErrors] = useState([]); const [isLoading, setIsLoading] = useState(false); const [turnstileToken, setTurnstileToken] = useState(null); // 2FA State const [needs2FA, setNeeds2FA] = useState(false); const [twoFactorCode, setTwoFactorCode] = useState(""); const [tempToken, setTempToken] = useState(""); const submitForm = async (e: React.FormEvent) => { e.preventDefault(); setIsLoading(true); try { const response: any = await login({ email, password, remember, setErrors, }); if (response?.data?.two_factor_required) { setNeeds2FA(true); setTempToken(response.data.temp_token); } } catch (error) { // Error handled by useAuth } finally { setIsLoading(false); } }; const submit2FA = async (e: React.FormEvent) => { e.preventDefault(); setIsLoading(true); try { await axios.post('/api/auth/2fa/verify', { code: twoFactorCode, remember: remember }, { headers: { Authorization: `Bearer ${tempToken}` } }); // On success, standard useAuth flow or just reload/redirect window.location.href = "/dashboard"; } catch (error: any) { setErrors({ code: error.response?.data?.message || 'Invalid code' }); } finally { setIsLoading(false); } }; const socialLogin = (provider: string) => { window.location.href = `${process.env.NEXT_PUBLIC_API_URL}/api/auth/${provider}/redirect?context=signin`; }; return (
{/* Form Section */}
{/* Header elements removed as they are provided by Public Layout */}

{needs2FA ? t('two_factor_title') : t('signin_title')}

{needs2FA ? t('two_factor_subtitle') : t('signin_subtitle')}

{needs2FA ? (
setTwoFactorCode(e.target.value)} placeholder={t('two_factor_code_placeholder')} maxLength={6} className="text-center tracking-widest text-lg dark:bg-gray-900 shadow-sm focus:border-brand-300 focus:ring-brand-500/10 dark:focus:border-brand-800 h-11 w-full rounded-lg border border-gray-300 bg-transparent px-4 py-2.5 text-gray-800 placeholder:text-gray-400 focus:ring-3 focus:outline-hidden dark:border-gray-700 dark:text-white/90 dark:placeholder:text-white/30" autoFocus /> {errors.code &&

{errors.code}

}
) : ( <>
{t('or_text')}
setEmail(e.target.value)} placeholder={t('email_placeholder')} className="dark:bg-gray-900 shadow-sm focus:border-brand-300 focus:ring-brand-500/10 dark:focus:border-brand-800 h-11 w-full rounded-lg border border-gray-300 bg-transparent px-4 py-2.5 text-sm text-gray-800 placeholder:text-gray-400 focus:ring-3 focus:outline-hidden dark:border-gray-700 dark:text-white/90 dark:placeholder:text-white/30" /> {errors.email &&

{errors.email}

}
setPassword(e.target.value)} placeholder={t('password_placeholder')} className="dark:bg-gray-900 shadow-sm focus:border-brand-300 focus:ring-brand-500/10 dark:focus:border-brand-800 h-11 w-full rounded-lg border border-gray-300 bg-transparent py-2.5 pr-11 pl-4 text-sm text-gray-800 placeholder:text-gray-400 focus:ring-3 focus:outline-hidden dark:border-gray-700 dark:text-white/90 dark:placeholder:text-white/30" />
{errors.password &&

{errors.password}

}
{t('forgot_password_link')}
setTurnstileToken(token)} />
{errors['cf-turnstile-response'] &&

{errors['cf-turnstile-response']}

}

{t('no_account')}{" "} {t('signup_link')}

{t('agree_to_text')} {t('terms_link')} {t('and_text')} {t('privacy_policy_link')}.

)}
{/* Right Side Branding & Background */}
{/* Background Decoration */}
{/* Branding Content */}
TrustLab Logo

{t('welcome_back_title')}

{t('welcome_back_desc')}

{/* Decorative element */}
); }