import React, { useState } from "react"; import { View, Text, TextInput, TouchableOpacity, StyleSheet, Alert, KeyboardAvoidingView, Platform } from "react-native"; import { useRouter } from "expo-router"; import AsyncStorage from "@react-native-async-storage/async-storage"; import api from "../src/services/api"; export default function LoginScreen(): React.ReactElement { const router = useRouter(); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [loading, setLoading] = useState(false); const handleLogin = async (): Promise => { if (!email || !password) { Alert.alert("Error", "Please fill in all fields."); return; } setLoading(true); try { const { data } = await api.post("/auth/token/", { email, password }); await AsyncStorage.setItem("access_token", data.access); await AsyncStorage.setItem("refresh_token", data.refresh); router.replace("/library"); } catch { Alert.alert("Error", "Invalid email or password."); } finally { setLoading(false); } }; return ( Cloud Reader Sign in to continue Email Password {loading ? "Signing in..." : "Sign In"} router.push("/register")}> Don't have an account? Register ); } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: "center", alignItems: "center", backgroundColor: "#0f1419", padding: 24 }, card: { width: "100%", maxWidth: 400, padding: 32, backgroundColor: "#1a1f2e", borderRadius: 12 }, title: { fontSize: 24, fontWeight: "700", color: "#e1e4ed", marginBottom: 4 }, subtitle: { fontSize: 16, color: "#8892a4", marginBottom: 24 }, label: { fontSize: 13, fontWeight: "500", color: "#8892a4", marginBottom: 6 }, input: { backgroundColor: "#0f1419", borderWidth: 1, borderColor: "#2a3042", borderRadius: 8, padding: 12, color: "#e1e4ed", fontSize: 14, marginBottom: 16 }, button: { backgroundColor: "#4f8cff", borderRadius: 8, padding: 14, alignItems: "center", marginTop: 8 }, buttonText: { color: "#fff", fontWeight: "600", fontSize: 16 }, link: { color: "#4f8cff", textAlign: "center", marginTop: 16, fontSize: 14 }, });