import React, { useState } from 'react'; import { useAuthActions } from '@convex-dev/auth/react'; import { KeyRound } 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 { useColor } from '@/hooks/useColor'; type AuthStep = 'signIn' | 'signUp' | 'forgotPassword' | 'resetPassword'; export const Password = () => { const { signIn } = useAuthActions(); const green = useColor('green'); const [step, setStep] = useState('signIn'); const [name, setName] = useState(''); const [gender, setGender] = useState(''); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [code, setCode] = useState(''); const [newPassword, setNewPassword] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const resetFormState = () => { setEmail(''); setPassword(''); setCode(''); setNewPassword(''); 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 handleSignInUpSubmit = async () => { if (!validateEmail(email) || !validatePassword(password)) return; setLoading(true); setError(''); try { await signIn('password', { name, gender, email, password, flow: step }); if (step === 'signUp') { setPassword(''); } } catch (err: any) { console.error(`${step} error:`, err); setError('Authentication failed. Check your credentials.'); } finally { setLoading(false); } }; const handleSendResetCode = async () => { if (!validateEmail(email)) return; setLoading(true); setError(''); try { await signIn('password', { email, flow: 'reset' }); setStep('resetPassword'); } catch (err: any) { console.error('Send reset code error:', err); setError( 'Failed to send reset code. Please check the email and try again.' ); } finally { setLoading(false); } }; const handleResetPassword = async () => { if (!validatePassword(newPassword)) return; if (code.length < 6) { setError('Please enter the 6-digit reset code.'); return; } setLoading(true); setError(''); try { await signIn('password', { email, code, newPassword, flow: 'reset-verification', }); changeStep('signIn'); } catch (err: any) { console.error('Password reset error:', err); setError('Failed to reset password. The code may be invalid or expired.'); } finally { setLoading(false); } }; if (step === 'forgotPassword') { return ( Reset your password Enter your email to receive a password reset code. ); } if (step === 'resetPassword') { return ( Create a new password A reset code was sent to {email}. ); } // Default view for 'signIn' and 'signUp' const isSigningIn = step === 'signIn'; return ( {isSigningIn ? 'Welcome back! Login to continue.' : 'Create an account to get started.'} {step === 'signUp' ? ( ) : null} {!!error && ( {error} )} {isSigningIn && ( )} ); };