import { Button } from '@/components/ui/Button'; import { ErrorMessage } from '@/components/ui/ErrorMessage'; import { Input } from '@/components/ui/Input'; import { AppColors, FontSizes, Spacing } from '@/constants/theme'; import { useAuth } from '@/contexts/AuthContext'; import { router } from 'expo-router'; import React, { useEffect, useState } from 'react'; import { Image, KeyboardAvoidingView, Platform, ScrollView, StyleSheet, Text, TouchableOpacity, View, } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; export default function LoginScreen() { const { checkEmail, requestOtp, isLoading, error, clearError } = useAuth(); const [email, setEmail] = useState(''); const [inviteCode, setInviteCode] = useState(''); const [showInviteCode, setShowInviteCode] = useState(false); const [validationError, setValidationError] = useState(null); // Clear errors on mount useEffect(() => { clearError(); }, []); const validateEmail = (email: string): boolean => { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); }; const handleContinue = async () => { // Clear previous errors clearError(); setValidationError(null); const trimmedEmail = email.trim().toLowerCase(); // Validate email if (!trimmedEmail) { setValidationError('Email is required'); return; } if (!validateEmail(trimmedEmail)) { setValidationError('Please enter a valid email address'); return; } // Check if email exists in database const result = await checkEmail(trimmedEmail); // Direct OTP Flow (Streamlined) const otpResult = await requestOtp(trimmedEmail); if (otpResult.success) { router.push({ pathname: '/(auth)/verify-otp', params: { email: trimmedEmail, isNewUser: result.exists ? '0' : '1', inviteCode: inviteCode.trim() || undefined, } }); } else { setValidationError('Failed to send verification code. Please try again.'); } }; const displayError = validationError || error?.message; return ( Welcome to WellNuo Enter your email to sign in or create an account {displayError && ( { clearError(); setValidationError(null); }} /> )} { setEmail(text); setValidationError(null); }} autoCapitalize="none" autoCorrect={false} keyboardType="email-address" editable={!isLoading} returnKeyType="next" /> {/* Invite Code Toggle */} {!showInviteCode ? ( setShowInviteCode(true)} > I have an invite code ) : ( { // Only allow digits, max 5 const code = text.replace(/\D/g, '').slice(0, 5); setInviteCode(code); }} keyboardType="number-pad" maxLength={5} editable={!isLoading} onSubmitEditing={handleContinue} returnKeyType="done" /> )}