import ListEmptyComponent from "@/components/ListEmptyComponent"; import PersonItem from "@/components/PersonItem"; import { COLORS } from "@/constants/colors"; import { Person } from "@/types/person"; import React, { useEffect, useState } from "react"; import { ActivityIndicator, Button, FlatList, RefreshControl, StyleSheet, TextInput, View, } from "react-native"; interface ApiResponse { results: Person[]; next: string | null; result?: Person[]; } const Page = () => { const [people, setPeople] = useState([]); const [refreshing, setRefreshing] = useState(false); const [loading, setLoading] = useState(true); const [searchQuery, setSearchQuery] = useState(""); const [nextPage, setNextPage] = useState(null); const [loadingMore, setLoadingMore] = useState(false); const fetchPeople = async (query: string = "", url: string | null = null) => { setLoading(true); try { let apiUrl = url || `https://swapi.dev/api/people`; if (query) { apiUrl = `https://swapi.tech/api/people/?name=${query}`; } const response = await fetch(apiUrl); const data: ApiResponse = await response.json(); if (query && data.result) { const transformedResults = data.result.map((item: any) => ({ name: item.properties.name, birth_year: item.properties.birth_year, gender: item.properties.gender, url: item.properties.url, })); setPeople(transformedResults); } else { setPeople((prevPeople) => url ? [...prevPeople, ...data.results] : data.results, ); } setNextPage(data.next); } catch (error) { console.error("Error fetching people:", error); } finally { setRefreshing(false); setLoading(false); setLoadingMore(false); } }; useEffect(() => { fetchPeople(); }, []); const onRefresh = () => { setRefreshing(true); fetchPeople(searchQuery); }; const handleSearch = () => { fetchPeople(searchQuery); }; const handleLoadMore = () => { if (nextPage && !loadingMore) { setLoadingMore(true); fetchPeople(searchQuery, nextPage); } }; const renderFooter = () => { if (!loadingMore) return null; return ( ); }; return (