import React, { useState } from 'react'; import { useAuthActions } from '@convex-dev/auth/react'; import { KeyRound, MailCheck } from 'lucide-react-native'; import { Card, CardContent, CardDescription, CardHeader, } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { View } from '@/components/ui/view'; import { Text } from '@/components/ui/text'; import { Input } from '@/components/ui/input'; import { InputOTP } from '@/components/ui/input-otp'; import { useColor } from '@/hooks/useColor'; type AuthStep = 'signIn' | 'verifyEmail'; export const EmailOTP = () => { const { signIn } = useAuthActions(); const green = useColor('green'); // --- STATE MANAGEMENT --- const [step, setStep] = useState('signIn'); // Form inputs const [email, setEmail] = useState(''); const [code, setCode] = useState(''); // Loading and error states const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const resetFormState = () => { setEmail(''); setCode(''); setError(''); setLoading(false); }; const changeStep = (newStep: AuthStep) => { resetFormState(); setStep(newStep); }; const validateEmail = (value: string) => { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(value)) { setError('Please enter a valid email address.'); return false; } setError(''); return true; }; const validatePassword = (value: string) => { if ( value.length < 8 || !/\d/.test(value) || !/[a-z]/.test(value) || !/[A-Z]/.test(value) ) { setError( 'Password must be 8+ characters with uppercase, lowercase, and numbers.' ); return false; } setError(''); return true; }; const handleSendCode = async () => { if (!validateEmail(email)) return; setLoading(true); setError(''); try { await signIn('resend-otp', { email, flow: step }); setStep('verifyEmail'); } catch (err: any) { console.error(`${step} error:`, err); setError('Authentication failed. Check your credentials.'); } finally { setLoading(false); } }; const handleVerifyEmail = async () => { if (code.length < 6) { setError('Please enter the 6-digit code.'); return; } setLoading(true); setError(''); try { await signIn('resend-otp', { email, code, flow: 'email-verification', }); } catch (err: any) { console.error('Email verification error:', err); setError('Invalid verification code. Please try again.'); } finally { setLoading(false); } }; if (step === 'verifyEmail') { return ( Check your email {`We've sent a 6-digit code to ${email}`} ); } return ( OTP Email Login Enter your email to receive OTP code. ); };