import React, { useState, useEffect } from 'react'; import { View, Text, TextInput, TouchableOpacity, StyleSheet, KeyboardAvoidingView, Platform, Alert } from 'react-native'; import { useRouter } from 'expo-router'; import { Ionicons } from '@expo/vector-icons'; import { useAuthStore } from '../../store/authStore'; import { useThemeContext } from '../../components/ThemeProvider'; import { spacing, borderRadius } from '../../constants/theme'; import { isBiometricsAvailable, authenticateWithBiometrics, saveBiometricCredentials, getBiometricUsername } from '../../services/biometrics'; export default function LoginScreen() { const router = useRouter(); const { login } = useAuthStore(); const { colors } = useThemeContext(); const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [isLoading, setIsLoading] = useState(false); const [biometricsAvailable, setBiometricsAvailable] = useState(false); const [biometricUsername, setBiometricUsername] = useState(null); useEffect(() => { checkBiometrics(); }, []); const checkBiometrics = async () => { try { const available = await isBiometricsAvailable(); setBiometricsAvailable(available); if (available) { const savedUsername = await getBiometricUsername(); setBiometricUsername(savedUsername); } } catch (error) { console.error('Error checking biometrics:', error); } }; const handleLogin = async () => { if (!username || !password) { Alert.alert('Error', 'Por favor ingresa usuario y contraseña'); return; } setIsLoading(true); try { await login(username, password); if (biometricsAvailable) { await saveBiometricCredentials(username); } router.replace('/(tabs)'); } catch (error) { Alert.alert('Error', 'Credenciales incorrectas'); } finally { setIsLoading(false); } }; const handleBiometricLogin = async () => { if (!biometricUsername) { Alert.alert('Error', 'No hay credenciales biométricas guardadas'); return; } setIsLoading(true); try { const authenticated = await authenticateWithBiometrics(); if (authenticated) { await login(biometricUsername, ''); router.replace('/(tabs)'); } else { Alert.alert('Error', 'Autenticación biométrica fallida'); } } catch (error) { Alert.alert('Error', 'Error en la autenticación biométrica'); } finally { setIsLoading(false); } }; return ( Iniciar Sesión Ingresa tus credenciales para continuar Usuario Contraseña {isLoading ? 'Ingresando...' : 'Iniciar Sesión'} {biometricsAvailable && biometricUsername && ( Iniciar con biometría )} router.push('/auth/register')} > ¿No tienes cuenta? Regístrate ); } const styles = StyleSheet.create({ container: { flex: 1, }, form: { flex: 1, justifyContent: 'center', padding: spacing.xl, }, title: { fontSize: 28, fontWeight: 'bold', marginBottom: spacing.sm, }, subtitle: { fontSize: 16, marginBottom: spacing.xl, }, inputContainer: { marginBottom: spacing.md, }, label: { fontSize: 14, fontWeight: '500', marginBottom: spacing.xs, }, input: { borderRadius: borderRadius.md, padding: spacing.md, fontSize: 16, }, button: { backgroundColor: '#7fbf8f', borderRadius: borderRadius.md, padding: spacing.md, alignItems: 'center', marginTop: spacing.md, }, buttonDisabled: { opacity: 0.6, }, buttonText: { color: '#ffffff', fontSize: 16, fontWeight: '600', }, linkButton: { marginTop: spacing.lg, alignItems: 'center', }, linkText: { fontSize: 14, }, biometricButton: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', borderRadius: borderRadius.md, padding: spacing.md, marginTop: spacing.md, borderWidth: 1, }, biometricText: { fontSize: 16, fontWeight: '600', marginLeft: spacing.sm, }, });