'use client'; import { useState, useEffect, useMemo, useCallback } from 'react'; import { useAuth } from '@/contexts/AuthContext'; import { useMarket } from '@/contexts/MarketContext'; import { useSearchParams } from 'next/navigation'; import { Mail, Lock, User, AlertCircle, Loader2 } from 'lucide-react'; import { isSupabaseEnabled } from '@/lib/supabase/client'; import { validatePassword, getStrengthColor, getStrengthLabel, getStrengthPercent } from '@/lib/password-validation'; export default function AuthForm() { const { market } = useMarket(); const isUS = market === 'us'; const [isLogin, setIsLogin] = useState(true); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const { signIn, signUp } = useAuth(); const searchParams = useSearchParams(); const passwordCheck = useMemo(() => validatePassword(password), [password]); const t = useCallback((tr: string, en: string) => isUS ? en : tr, [isUS]); const strengthLabel = isUS ? passwordCheck.strength === 'fair' ? 'Fair' : passwordCheck.strength === 'good' ? 'Good' : passwordCheck.strength === 'strong' ? 'Strong' : getStrengthLabel(passwordCheck.strength) : getStrengthLabel(passwordCheck.strength) // Banned user redirect handling useEffect(() => { if (searchParams.get('banned') === '1') { setError(t('Hesabınız engellenmiştir. Yönetici ile iletişime geçin.', 'Your account has been blocked. Contact the administrator.')); } }, [searchParams, t]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); setLoading(true); // Validate password strength on signup if (!isLogin && !passwordCheck.valid) { setError(t('Şifre gereksinimleri: ', 'Password requirements: ') + passwordCheck.errors.join(', ')); setLoading(false); return; } try { const { error } = isLogin ? await signIn(email, password) : await signUp(email, password); if (error) { setError(error.message); } else { if (!isLogin) { setError(t('Kayıt başarılı! Lütfen email adresinizi doğrulayın.', 'Registration successful! Please verify your email address.')); } else { // Wait a moment for @supabase/ssr to persist session cookies before navigating. // If cookies don't appear, navigating to a protected route will bounce back to /login. const hasSbCookie = () => typeof document !== 'undefined' && document.cookie.includes('sb-') let attempts = 0 while (!hasSbCookie() && attempts < 20) { // 20 * 50ms = 1s max // eslint-disable-next-line no-await-in-loop await new Promise((r) => setTimeout(r, 50)) attempts += 1 } if (!hasSbCookie()) { setError( t( 'Giriş başarılı görünüyor ama oturum cookie yazılamadı. Lütfen siteyi sadece http://localhost:3001 üzerinden açın (127.0.0.1 değil) ve tarayıcıda cookie engeli olmadığından emin olun.', 'Sign-in appears successful but the session cookie could not be written. Open the site only via http://localhost:3001 (not 127.0.0.1) and make sure cookies are not blocked in the browser.' ) ) return } window.location.replace('/'); } } } catch (err) { setError(t('Bir hata oluştu. Lütfen tekrar deneyin.', 'An error occurred. Please try again.')); } finally { setLoading(false); } }; return (

{isLogin ? t('Giriş Yap', 'Sign In') : t('Kayıt Ol', 'Sign Up')}

{isLogin ? t('Portföyünüze erişmek için giriş yapın', 'Sign in to access your portfolio') : t('Yeni bir hesap oluşturun', 'Create a new account')}

{!isSupabaseEnabled && (

{t('Giriş/Kayıt devre dışı: Supabase yapılandırılmamış. Netlify/yerel ortamda', 'Sign-in/Sign-up disabled: Supabase is not configured. In Netlify/local environments add')} NEXT_PUBLIC_SUPABASE_URL ve NEXT_PUBLIC_SUPABASE_ANON_KEY {t('değişkenlerini ekleyin.', 'environment variables.')}

)}
{!isLogin && password.length > 0 && (
{strengthLabel}
{passwordCheck.errors.length > 0 && (
    {passwordCheck.errors.map((err, i) => (
  • • {err}
  • ))}
)}
)} {!isLogin && password.length === 0 && (

{t('En az 8 karakter, büyük harf, küçük harf ve rakam', 'At least 8 characters, uppercase, lowercase, and a number')}

)}
{error && (

{error}

)}
); }