Massive/Exercises.tsx
Brandon Presley e4ed53c358 Move logic of TimerService into TimerBroadcast
This was supposed to solve the timer stopping sometimes
when the application was in the background.
It was actually stopping because of battery optimizations.
2022-07-06 16:27:36 +12:00

64 lines
1.7 KiB
TypeScript

import {NativeStackScreenProps} from '@react-navigation/native-stack';
import React, {useEffect, useState} from 'react';
import {FlatList, StyleSheet, View} from 'react-native';
import {List, Searchbar, TextInput} from 'react-native-paper';
import {RootStackParamList} from './App';
import {getDb} from './db';
import Exercise from './exercise';
export default function Exercises({
navigation,
}: NativeStackScreenProps<RootStackParamList, 'Exercises'>) {
const [exercises, setExercises] = useState<Exercise[]>([]);
const [search, setSearch] = useState('');
const [refreshing, setRefresing] = useState(false);
const refresh = async () => {
const db = await getDb();
const [result] = await db.executeSql(
`SELECT name, reps, unit, MAX(weight) AS weight
FROM sets
WHERE name LIKE ?
GROUP BY name;`,
[`%${search}%`],
);
if (!result) return setExercises([]);
setExercises(result.rows.raw());
};
useEffect(() => navigation.addListener('focus', refresh), [navigation]);
useEffect(() => {
refresh();
}, [search]);
const renderItem = ({item}: {item: Exercise}) => (
<List.Item
key={item.name}
title={item.name}
description={`Best: ${item.reps} x ${item.weight}${item.unit}`}
/>
);
return (
<View style={styles.container}>
<Searchbar placeholder="Search" value={search} onChangeText={setSearch} />
<FlatList
refreshing={refreshing}
onRefresh={async () => {
setRefresing(true);
await refresh();
setRefresing(false);
}}
renderItem={renderItem}
data={exercises}
/>
</View>
);
}
const styles = StyleSheet.create({
container: {
padding: 10,
},
});