import { useState } from 'react'; import { useNavigate, Link } from 'react-router-dom'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { useAuth } from '@/hooks/useAuth'; import { useTheme } from '@/hooks/useTheme'; import { useToast } from '@/components/ui/use-toast'; import { Loader2, Mail, Phone, LogIn, Moon, Sun } from 'lucide-react'; export default function LoginPage() { const navigate = useNavigate(); const { signIn, signInWithGoogle, signInWithPhone, verifyOTP } = useAuth(); const { toggleTheme, isDark } = useTheme(); const { toast } = useToast(); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [phone, setPhone] = useState(''); const [otp, setOtp] = useState(''); const [isLoading, setIsLoading] = useState(false); const [otpSent, setOtpSent] = useState(false); const [authMethod, setAuthMethod] = useState<'email' | 'phone' | 'google'>('email'); const handleEmailLogin = async (e: React.FormEvent) => { e.preventDefault(); if (!email || !password) { toast({ title: 'خطا', description: 'لطفا ایمیل و رمز عبور را وارد کنید', variant: 'destructive' }); return; } setIsLoading(true); try { await signIn(email, password); toast({ title: 'موفق', description: 'با موفقیت وارد شدید' }); navigate('/account'); } catch (error: any) { console.error('Login error:', error); let errorMessage = 'خطا در ورود'; if (error) { const errorMsg = error.message || error.error?.message || String(error); if (errorMsg.includes('Invalid login credentials') || errorMsg.includes('invalid_credentials')) { errorMessage = 'ایمیل یا رمز عبور اشتباه است. لطفا دوباره تلاش کنید یا ثبت نام کنید.'; } else if (errorMsg.includes('Email not confirmed') || errorMsg.includes('email_not_confirmed')) { errorMessage = 'لطفا ابتدا ایمیل خود را تأیید کنید.'; } else if (errorMsg.includes('Supabase not configured')) { errorMessage = 'Supabase تنظیم نشده است. لطفا فایل .env را بررسی کنید.'; } else if (errorMsg.includes('Network') || errorMsg.includes('fetch')) { errorMessage = 'خطا در اتصال به سرور. لطفا اتصال اینترنت خود را بررسی کنید.'; } else { errorMessage = errorMsg || 'خطا در ورود. لطفا دوباره تلاش کنید.'; } } toast({ title: 'خطا', description: errorMessage, variant: 'destructive' }); } finally { setIsLoading(false); } }; const handleGoogleLogin = async () => { setIsLoading(true); try { await signInWithGoogle(); // Redirect happens automatically } catch (error: any) { console.error('Google login error:', error); const errorMsg = error?.message || error?.error?.message || String(error) || 'خطا در ورود با گوگل'; toast({ title: 'خطا', description: errorMsg.includes('Supabase not configured') ? 'Supabase تنظیم نشده است. لطفا فایل .env را بررسی کنید.' : errorMsg, variant: 'destructive' }); setIsLoading(false); } }; const handleSendOTP = async (e: React.FormEvent) => { e.preventDefault(); if (!phone) { toast({ title: 'خطا', description: 'لطفا شماره تلفن را وارد کنید', variant: 'destructive' }); return; } setIsLoading(true); try { await signInWithPhone(phone); setOtpSent(true); toast({ title: 'موفق', description: 'کد تأیید ارسال شد' }); } catch (error: any) { console.error('Phone OTP error:', error); const errorMsg = error?.message || error?.error?.message || String(error) || 'خطا در ارسال کد'; let errorMessage = 'خطا در ارسال کد'; if (errorMsg.includes('Supabase not configured')) { errorMessage = 'Supabase تنظیم نشده است. لطفا فایل .env را بررسی کنید.'; } else if (errorMsg.includes('Invalid phone number') || errorMsg.includes('invalid_phone')) { errorMessage = 'شماره تلفن نامعتبر است. لطفا شماره را با فرمت صحیح وارد کنید.'; } else if (errorMsg.includes('Network') || errorMsg.includes('fetch')) { errorMessage = 'خطا در اتصال به سرور. لطفا اتصال اینترنت خود را بررسی کنید.'; } else { errorMessage = errorMsg; } toast({ title: 'خطا', description: errorMessage, variant: 'destructive' }); } finally { setIsLoading(false); } }; const handleVerifyOTP = async (e: React.FormEvent) => { e.preventDefault(); if (!otp) { toast({ title: 'خطا', description: 'لطفا کد تأیید را وارد کنید', variant: 'destructive' }); return; } setIsLoading(true); try { await verifyOTP(phone, otp); toast({ title: 'موفق', description: 'با موفقیت وارد شدید' }); navigate('/account'); } catch (error: any) { console.error('OTP verification error:', error); const errorMsg = error?.message || error?.error?.message || String(error) || 'کد تأیید نامعتبر است'; let errorMessage = 'کد تأیید نامعتبر است'; if (errorMsg.includes('Supabase not configured')) { errorMessage = 'Supabase تنظیم نشده است. لطفا فایل .env را بررسی کنید.'; } else if (errorMsg.includes('Invalid OTP') || errorMsg.includes('invalid_token')) { errorMessage = 'کد تأیید نامعتبر است. لطفا دوباره تلاش کنید.'; } else if (errorMsg.includes('expired')) { errorMessage = 'کد تأیید منقضی شده است. لطفا کد جدید درخواست کنید.'; } else if (errorMsg.includes('Network') || errorMsg.includes('fetch')) { errorMessage = 'خطا در اتصال به سرور. لطفا اتصال اینترنت خود را بررسی کنید.'; } else { errorMessage = errorMsg; } toast({ title: 'خطا', description: errorMessage, variant: 'destructive' }); } finally { setIsLoading(false); } }; return (
{/* Dark Mode Toggle Button */}
ورود به حساب کاربری خود وارد شوید
{/* Auth Method Selector */}
{/* Email Login */} {authMethod === 'email' && (
setEmail(e.target.value)} disabled={isLoading} />
setPassword(e.target.value)} disabled={isLoading} />
)} {/* Phone OTP Login */} {authMethod === 'phone' && ( <> {!otpSent ? (
setPhone(e.target.value)} disabled={isLoading} />
) : (
setOtp(e.target.value)} disabled={isLoading} />
)} )} {/* Google Login */}
یا
حساب کاربری ندارید؟{' '} ثبت نام
); }