import AsyncStorage from '@react-native-async-storage/async-storage'; import React, {useContext, useEffect, useState} from 'react'; import {FlatList, NativeModules, StyleSheet, View} from 'react-native'; import {List, Searchbar} from 'react-native-paper'; import {DatabaseContext} from './App'; import EditSet from './EditSet'; import MassiveFab from './MassiveFab'; import Set from './set'; import SetItem from './SetItem'; const limit = 20; export default function Home() { const [sets, setSets] = useState(); const [offset, setOffset] = useState(0); const [edit, setEdit] = useState(); const [search, setSearch] = useState(''); const [refreshing, setRefresing] = useState(false); const [end, setEnd] = useState(false); const db = useContext(DatabaseContext); const selectSets = ` SELECT * from sets WHERE name LIKE ? ORDER BY created DESC LIMIT ? OFFSET ? `; const getSets = ({ search, limit, offset, }: { search: string; limit: number; offset: number; }) => db.executeSql(selectSets, [`%${search}%`, limit, offset]); const refresh = async () => { const [result] = await getSets({search, limit, offset: 0}); if (!result) return setSets([]); setSets(result.rows.raw()); setOffset(0); setEnd(false); }; const refreshLoader = async () => { setRefresing(true); refresh().finally(() => setRefresing(false)); }; useEffect(() => { refresh(); }, [search]); const renderItem = ({item}: {item: Set}) => ( ); const save = async () => { refresh(); const enabled = await AsyncStorage.getItem('alarmEnabled'); if (enabled !== 'true') return; const minutes = await AsyncStorage.getItem('minutes'); const seconds = await AsyncStorage.getItem('seconds'); const milliseconds = Number(minutes) * 60 * 1000 + Number(seconds) * 1000; NativeModules.AlarmModule.timer(milliseconds); }; const next = async () => { if (end) return; setRefresing(true); const newOffset = offset + limit; const [result] = await getSets({search, limit, offset: newOffset}).finally( () => setRefresing(false), ); if (result.rows.length === 0) return setEnd(true); if (!sets) return; setSets([...sets, ...result.rows.raw()]); if (result.rows.length < limit) return setEnd(true); setOffset(newOffset); }; return ( } renderItem={renderItem} keyExtractor={set => set.id!.toString()} onEndReached={next} refreshing={refreshing} onRefresh={refreshLoader} /> setEdit({} as Set)} /> ); } const styles = StyleSheet.create({ name: { fontSize: 18, }, container: { flexGrow: 1, padding: 10, paddingBottom: '10%', }, });