import { NavigationProp, RouteProp, useFocusEffect, useNavigation, useRoute, } from "@react-navigation/native"; import { useCallback, useEffect, useState } from "react"; import { DeviceEventEmitter, FlatList } from "react-native"; import { List } from "react-native-paper"; import { Like } from "typeorm"; import { LIMIT } from "./constants"; import { getNow, setRepo, settingsRepo } from "./db"; import DrawerHeader from "./DrawerHeader"; import GymSet, { defaultSet } from "./gym-set"; import { HomePageParams } from "./home-page-params"; import ListMenu from "./ListMenu"; import Page from "./Page"; import SetItem from "./SetItem"; import Settings, { SETTINGS } from "./settings"; export default function SetList() { const [refreshing, setRefreshing] = useState(false); const [sets, setSets] = useState(); const [offset, setOffset] = useState(0); const [end, setEnd] = useState(false); const [settings, setSettings] = useState(); const [ids, setIds] = useState([]); const navigation = useNavigation>(); const { params } = useRoute>(); const [term, setTerm] = useState(params?.search || ""); const refresh = async (gymSet: GymSet) => { if (!sets) return; const newSets = sets.map((oldSet) => oldSet.id === gymSet.id ? gymSet : oldSet ); setSets(newSets); }; const reset = useCallback( async ({ value, skip }: { value: string; skip: number }) => { setRefreshing(true); const newSets = await setRepo .find({ where: { name: Like(`%${value.trim()}%`), hidden: 0 as any }, take: LIMIT, skip, order: { created: "DESC" }, }) .finally(() => setRefreshing(false)); console.log(`${SetList.name}.refresh:`, { value, offset }); setSets(newSets); setEnd(false); }, [offset] ); useEffect(() => { settingsRepo.findOne({ where: {} }).then(setSettings); const description = DeviceEventEmitter.addListener(SETTINGS, () => { settingsRepo.findOne({ where: {} }).then(setSettings); }); return description.remove; }, []); useFocusEffect( useCallback(() => { console.log("Focused."); if (offset > 0) return; reset({ value: "", skip: 0, }); }, [offset, reset]) ); const search = (value: string) => { setTerm(value); setOffset(0); reset({ skip: 0, value, }); }; useEffect(() => { if (!params) return; console.log({ params }); if (params.search) search(params.search); else if (params.refresh) refresh(params.refresh); else if (params.reset) reset({ skip: 0, value: term, }); /* eslint-disable react-hooks/exhaustive-deps */ }, [params]); const renderItem = useCallback( ({ item }: { item: GymSet }) => ( ), [settings, ids] ); const next = async () => { console.log({ end, refreshing }); if (end || refreshing) return; const newOffset = offset + LIMIT; console.log(`${SetList.name}.next:`, { offset, newOffset, term }); setRefreshing(true); const newSets = await setRepo .find({ where: { name: Like(`%${term}%`), hidden: 0 as any }, take: LIMIT, skip: newOffset, order: { created: "DESC" }, }) .finally(() => setRefreshing(false)); if (newSets.length === 0) return setEnd(true); if (!sets) return; const map = new Map(); for (const set of sets) map.set(set.id, set); for (const set of newSets) map.set(set.id, set); const unique = Array.from(map.values()); setSets(unique); if (newSets.length < LIMIT) return setEnd(true); setOffset(newOffset); }; const onAdd = useCallback(async () => { const now = await getNow(); let set = sets?.[0]; if (!set) set = { ...defaultSet }; set.created = now; delete set.id; navigation.navigate("EditSet", { set }); }, [navigation, sets]); const edit = useCallback(() => { navigation.navigate("EditSets", { ids }); setIds([]); }, [ids, navigation]); const copy = useCallback(async () => { const set = await setRepo.findOne({ where: { id: ids.pop() }, }); delete set.id; delete set.created; navigation.navigate("EditSet", { set }); setIds([]); }, [ids, navigation]); const clear = useCallback(() => { setIds([]); }, []); const remove = async () => { setIds([]); await setRepo.delete(ids.length > 0 ? ids : {}); return reset({ skip: 0, value: term, }); }; const select = useCallback(() => { if (!sets) return; if (ids.length === sets.length) return setIds([]); setIds(sets.map((set) => set.id)); }, [sets, ids]); const getContent = () => { if (!settings) return null; if (sets?.length === 0) return ( ); return ( set.id.toString()} onRefresh={() => { setOffset(0); reset({ skip: 0, value: term, }); }} /> ); }; return ( <> 0 ? `${ids.length} selected` : "Home"}> {getContent()} ); }