import React, { useState, useEffect, useRef } from "react"; import { View, Text, StyleSheet, ScrollView, KeyboardAvoidingView, Animated, Easing } from "react-native"; import { Link, router } from "expo-router"; import { Image } from "react-native"; import { SafeAreaView } from "react-native-safe-area-context"; import { StatusBar } from "expo-status-bar"; import { useThemeColor } from "@/hooks/use-theme-color"; import { Button, Input } from "@/components/ui"; import { useAuth } from "@/context/AuthContext"; import { apiClient, ApiError } from "@/lib/api"; import { useToast } from "@/context/ToastContext"; import { translateError, translateFields } from "@/lib/errors/translations"; import { registerForPushNotifications } from "@/hooks/useRegisterPushToken"; export default function LoginScreen() { const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [errors, setErrors] = useState<{ email?: string; password?: string }>( {}, ); const [loading, setLoading] = useState(false); const { login, updateAuthUser } = useAuth(); const { showToast } = useToast(); const textColor = useThemeColor({}, "text"); const backgroundColor = useThemeColor({}, "background"); const tintColor = useThemeColor({}, "tint"); const spinValue = useRef(new Animated.Value(0)).current; useEffect(() => { const animation = Animated.loop( Animated.timing(spinValue, { toValue: 1, duration: 12000, // 12s per full turn (slow) easing: Easing.linear, useNativeDriver: true, }) ); animation.start(); return () => { animation.stop(); }; }, [spinValue]); const spin = spinValue.interpolate({ inputRange: [0, 1], outputRange: ["0deg", "360deg"], }); const validateForm = () => { const newErrors: { email?: string; password?: string } = {}; if (!email) { newErrors.email = "Email é obrigatório"; } else if (!/\S+@\S+\.\S+/.test(email)) { newErrors.email = "Por favor, use um email válido"; } if (!password) { newErrors.password = "Senha é obrigatória"; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleLogin = async () => { if (!validateForm()) return; setLoading(true); try { const response = await login(email, password); if (response?.user) { const token = await registerForPushNotifications(); if (token) { const updateResponse = await apiClient.updateUser({ id: response.user.id, pushToken: token, }); console.log("UPDATE USER response: ", updateResponse); if (updateResponse) { updateAuthUser(updateResponse.user); } } } router.replace("/"); } catch (error: any) { console.log("LOGIN error: ", error); if (error instanceof ApiError && error.fields) { setErrors(translateFields(error.fields)); } else { showToast(translateError(error.message) || 'Falha ao fazer login', 'error'); } } finally { setLoading(false); } }; return ( Bem vindo de volta Logue na sua conta nexo