import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAuth } from '@/contexts/AuthContext'; import { usePezkuwi } from '@/contexts/PezkuwiContext'; import { supabase } from '@/lib/supabase'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Separator } from '@/components/ui/separator'; import { Checkbox } from '@/components/ui/checkbox'; import { Eye, EyeOff, Wallet, Mail, Lock, User, AlertCircle, ArrowLeft, UserPlus } from 'lucide-react'; import { useTranslation } from 'react-i18next'; const Login: React.FC = () => { const { t } = useTranslation(); const navigate = useNavigate(); const { connectWallet, selectedAccount } = usePezkuwi(); const { signIn, signUp } = useAuth(); const [showPassword, setShowPassword] = useState(false); const [rememberMe, setRememberMe] = useState(false); const [error, setError] = useState(''); const [loading, setLoading] = useState(false); // Detect embedded WebView (DApps browser) - hide Google OAuth there const isWebView = /wv|WebView/i.test(navigator.userAgent) || (/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(navigator.userAgent)) || (/Android.*Version\/[\d.]+.*Chrome\/[\d.]+ Mobile/i.test(navigator.userAgent) && !/Chrome\/[\d.]+ Mobile Safari/i.test(navigator.userAgent)); const [loginData, setLoginData] = useState({ email: '', password: '' }); const [signupData, setSignupData] = useState({ name: '', email: '', password: '', confirmPassword: '', referralCode: '' }); const handleLogin = async (e: React.FormEvent) => { e.preventDefault(); setError(''); setLoading(true); try { const { error } = await signIn(loginData.email, loginData.password, rememberMe); if (error) { if (error.message?.includes('Invalid login credentials')) { setError('Email or password is incorrect. Please try again.'); } else { setError(error instanceof Error ? error.message : 'Login failed. Please try again.'); } } else { navigate('/'); } } catch { setError('Login failed. Please try again.'); } finally { setLoading(false); } }; const handleSignup = async (e: React.FormEvent) => { e.preventDefault(); setError(''); setLoading(true); try { if (signupData.password !== signupData.confirmPassword) { setError('Passwords do not match'); setLoading(false); return; } if (signupData.password.length < 8) { setError('Password must be at least 8 characters'); setLoading(false); return; } const { error } = await signUp( signupData.email, signupData.password, signupData.name, signupData.referralCode ); if (error) { setError(error.message); } else { // Redirect to email verification page navigate('/email-verification', { state: { email: signupData.email } }); } } catch { setError('Signup failed. Please try again.'); } finally { setLoading(false); } }; const handleWalletConnect = async () => { setLoading(true); setError(''); try { await connectWallet(); if (selectedAccount) { navigate('/'); } else { setError('Please select an account from your Pezkuwi.js extension'); } } catch (err) { if (import.meta.env.DEV) console.error('Wallet connection failed:', err); const errorMsg = err instanceof Error ? err.message : ''; if (errorMsg?.includes('extension')) { setError('Pezkuwi.js extension not found. Please install it first.'); } else { setError('Failed to connect wallet. Please try again.'); } } finally { setLoading(false); } }; const handleGoogleSignIn = async () => { setError(''); setLoading(true); try { const { error } = await supabase.auth.signInWithOAuth({ provider: 'google', options: { redirectTo: window.location.origin + '/' }, }); if (error) setError(error.message); } catch { setError('Google sign-in failed. Please try again.'); } finally { setLoading(false); } }; const handleXSignIn = async () => { setError(''); setLoading(true); try { const { error } = await supabase.auth.signInWithOAuth({ provider: 'twitter', options: { redirectTo: window.location.origin + '/' }, }); if (error) setError(error.message); } catch { setError('X sign-in failed. Please try again.'); } finally { setLoading(false); } }; const handleTelegramSignIn = () => { setError(''); setLoading(true); const BOT_ID = window.location.hostname === 'pex.mom' ? '8690398980' : '8754021997'; const origin = window.location.origin; const popup = window.open( `https://oauth.telegram.org/auth?bot_id=${BOT_ID}&origin=${encodeURIComponent(origin)}&embed=1&request_access=write`, 'TelegramLogin', 'width=550,height=470,left=400,top=200' ); if (!popup) { setError('Popup blocked. Please allow popups for this site.'); setLoading(false); return; } const onMessage = async (event: MessageEvent) => { if (event.origin !== 'https://oauth.telegram.org') return; if (!event.data || event.data.event !== 'auth_result') return; window.removeEventListener('message', onMessage); popup.close(); try { const tgData = event.data.result; const supabaseUrl = import.meta.env.VITE_SUPABASE_URL; const supabaseKey = import.meta.env.VITE_SUPABASE_ANON_KEY; const res = await fetch(`${supabaseUrl}/functions/v1/telegram-auth`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'apikey': supabaseKey, 'Authorization': `Bearer ${supabaseKey}`, }, body: JSON.stringify({ ...tgData, bot_id: BOT_ID }), }); const json = await res.json(); if (!res.ok) throw new Error(json.error || 'Telegram auth failed'); const { error: otpError } = await supabase.auth.verifyOtp({ token_hash: json.token_hash, type: 'magiclink', }); if (otpError) throw otpError; navigate('/'); } catch (err) { setError(err instanceof Error ? err.message : 'Telegram sign-in failed.'); } finally { setLoading(false); } }; window.addEventListener('message', onMessage); // Cleanup if popup is closed without completing auth const pollClosed = setInterval(() => { if (popup.closed) { clearInterval(pollClosed); window.removeEventListener('message', onMessage); setLoading(false); } }, 500); }; return (
{t('login.terms', 'By continuing, you agree to our')}{' '} {t('login.termsOfService', 'Terms of Service')} {' '} {t('login.and', 'and')}{' '} {t('login.privacyPolicy', 'Privacy Policy')}