Brandon Presley
463852e6a6
Also change variable names. Search should represent the act of searching, rather than the value being typed by the user.
78 lines
2.1 KiB
TypeScript
78 lines
2.1 KiB
TypeScript
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 {getBestReps, getBestWeights} from './best.service';
|
|
import {BestPageParams} from './BestPage';
|
|
import DrawerHeader from './DrawerHeader';
|
|
import Page from './Page';
|
|
import Set from './set';
|
|
import {useSettings} from './use-settings';
|
|
|
|
export default function BestList() {
|
|
const [bests, setBests] = useState<Set[]>();
|
|
const [term, setTerm] = useState('');
|
|
const navigation = useNavigation<NavigationProp<BestPageParams>>();
|
|
const {settings} = useSettings();
|
|
|
|
const refresh = useCallback(async (value: string) => {
|
|
const weights = await getBestWeights(value);
|
|
console.log(`${BestList.name}.refresh:`, {length: weights.length});
|
|
let newBest: Set[] = [];
|
|
for (const set of weights) {
|
|
const reps = await getBestReps(set.name, set.weight);
|
|
newBest.push(...reps);
|
|
}
|
|
setBests(newBest);
|
|
}, []);
|
|
|
|
useFocusEffect(
|
|
useCallback(() => {
|
|
refresh(term);
|
|
}, [refresh, term]),
|
|
);
|
|
|
|
const search = useCallback(
|
|
(value: string) => {
|
|
setTerm(value);
|
|
refresh(value);
|
|
},
|
|
[refresh],
|
|
);
|
|
|
|
const renderItem = ({item}: {item: Set}) => (
|
|
<List.Item
|
|
key={item.name}
|
|
title={item.name}
|
|
description={`${item.reps} x ${item.weight}${item.unit || 'kg'}`}
|
|
onPress={() => navigation.navigate('ViewBest', {best: item})}
|
|
left={() =>
|
|
(settings.images && item.image && (
|
|
<Image source={{uri: item.image}} style={{height: 75, width: 75}} />
|
|
)) ||
|
|
null
|
|
}
|
|
/>
|
|
);
|
|
|
|
return (
|
|
<>
|
|
<DrawerHeader name="Best" />
|
|
<Page term={term} search={search}>
|
|
{bests?.length === 0 ? (
|
|
<List.Item
|
|
title="No exercises yet"
|
|
description="Once sets have been added, this will highlight your personal bests."
|
|
/>
|
|
) : (
|
|
<FlatList style={{flex: 1}} renderItem={renderItem} data={bests} />
|
|
)}
|
|
</Page>
|
|
</>
|
|
);
|
|
}
|