import React, { useState, useEffect } from 'react'; import { Text, View, TouchableOpacity, KeyboardAvoidingView, Platform, ScrollView, ImageBackground, ActivityIndicator, StatusBar, } from 'react-native'; import { useNavigation } from '@react-navigation/native'; import Icon from 'react-native-vector-icons/Ionicons'; import { getStyles } from './login.styles'; import { useTheme } from '@theme'; import { useAppDispatch, useAppSelector, RootState, login } from '@store'; import { LoginRequest } from '@interfaces'; import { NotificationService } from '@services'; import { backGroundImage } from '@utils'; import { FormInput } from '@components'; import config from 'react-native-config'; import AsyncStorage from '@react-native-async-storage/async-storage'; export const LoginScreen = () => { const dispatch = useAppDispatch(); const navigation = useNavigation(); const { theme: colors, isDark } = useTheme(); const styles = getStyles(colors, isDark); const [tenancy, setTenancy] = useState(''); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [showPassword, setShowPassword] = useState(false); const [focusedField, setFocusedField] = useState(null); const [localError, setLocalError] = useState(''); const { loginLoading, loginError, loginSuccess, token, user_data } = useAppSelector((state: RootState) => state.auth); const handleLogin = async () => { setLocalError(''); if (!tenancy.trim()) { setLocalError('Tenancy name is required'); return; } if (!email.trim()) { setLocalError('Email address is required'); return; } const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email.trim())) { setLocalError('Please enter a valid email address'); return; } if (!password.trim()) { setLocalError('Password is required'); return; } const deviceToken = await NotificationService.getFCMToken(); console.log('deviceToken-', deviceToken) const payload: LoginRequest = { email, password, device_token: deviceToken ?? '', }; console.log('payload-', payload) console.log('tenancy-', config.BASE_URL) if (tenancy == config.BASE_URL) { try { await AsyncStorage.setItem('base_url', tenancy); await AsyncStorage.setItem('email', email); await AsyncStorage.setItem('password', password); } catch (e) { console.error('Failed to save login credentials to AsyncStorage', e); } await dispatch(login(payload)); } else { setLocalError('Invalid tenancy name'); } }; useEffect(() => { const loadCredentials = async () => { try { const savedBaseUrl = await AsyncStorage.getItem('base_url'); const savedEmail = await AsyncStorage.getItem('email'); const savedPassword = await AsyncStorage.getItem('password'); if (savedBaseUrl) setTenancy(savedBaseUrl); if (savedEmail) setEmail(savedEmail); if (savedPassword) setPassword(savedPassword); } catch (e) { console.error('Failed to load login credentials from AsyncStorage', e); } }; loadCredentials(); }, []); useEffect(() => { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if ( tenancy.trim() && email.trim() && emailRegex.test(email.trim()) && password.trim() ) { setLocalError(''); } }, [tenancy, email, password]); useEffect(() => { if (loginSuccess && token && user_data) { navigation.reset({ index: 0, routes: [{ name: 'DrawerStack' }], }); } }, [loginSuccess, token, user_data, navigation]); return ( {/* Top Area Spacer displaying background illustration */} {/* Bottom Sheet Form Card */} Sign In Enter your credentials to continue {localError || loginError ? ( {localError || loginError} ) : null} {/* Tenancy Field */} setFocusedField('tenancy')} onBlur={() => setFocusedField(null)} leftIcon={ } /> {/* Email Field */} setFocusedField('email')} onBlur={() => setFocusedField(null)} leftIcon={ } /> {/* Password Field */} setFocusedField('password')} onBlur={() => setFocusedField(null)} leftIcon={ } rightIcon={ setShowPassword(!showPassword)} style={styles.eyeIconButton} activeOpacity={0.7} > } /> {/* Sign In Button */} {loginLoading ? ( ) : ( Sign In )} ); };