import { NavigationProp, useFocusEffect, useNavigation, } from "@react-navigation/native"; import { useCallback, useState } from "react"; import { FlatList, Image } from "react-native"; import { List } from "react-native-paper"; import { StackParams } from "./AppStack"; import { getBestSets } from "./best.service"; import { LIMIT } from "./constants"; import { settingsRepo } from "./db"; import DrawerHeader from "./DrawerHeader"; import GymSet from "./gym-set"; import Page from "./Page"; import Settings from "./settings"; export default function GraphsList() { const [bests, setBests] = useState(); const [offset, setOffset] = useState(0); const [end, setEnd] = useState(false); const [term, setTerm] = useState(""); const navigation = useNavigation>(); const [settings, setSettings] = useState(); const [refreshing, setRefreshing] = useState(false); const refresh = useCallback( async (value: string) => { if (refreshing) return; const result = await getBestSets({ term: value, offset: 0 }); setBests(result); setOffset(0); }, [refreshing] ); useFocusEffect( useCallback(() => { refresh(term); settingsRepo.findOne({ where: {} }).then(setSettings); // eslint-disable-next-line }, [term]) ); const next = useCallback(async () => { if (end) return; const newOffset = offset + LIMIT; console.log(`${GraphsList.name}.next:`, { offset, newOffset, term }); const newBests = await getBestSets({ term, offset: newOffset }); if (newBests.length === 0) return setEnd(true); if (!bests) return; setBests([...bests, ...newBests]); if (newBests.length < LIMIT) return setEnd(true); setOffset(newOffset); }, [term, end, offset, bests]); const search = useCallback( (value: string) => { setTerm(value); refresh(value); }, [refresh] ); const renderItem = ({ item }: { item: GymSet }) => ( navigation.navigate("ViewGraph", { name: item.name })} left={() => (settings?.images && item.image && ( )) || null } /> ); return ( <> {bests?.length === 0 ? ( ) : ( set.name} onEndReached={next} refreshing={refreshing} onRefresh={() => { setRefreshing(true); refresh(term).finally(() => setRefreshing(false)); }} /> )} ); }