Add current workout progress to title of set editing
Related to #48 Should be thoroughly tested before closing.
This commit is contained in:
parent
39fafa353f
commit
71d223f0a1
|
@ -11,8 +11,8 @@ import {Button, IconButton} from 'react-native-paper';
|
||||||
import {MARGIN, PADDING} from './constants';
|
import {MARGIN, PADDING} from './constants';
|
||||||
import {DrawerParamList} from './drawer-param-list';
|
import {DrawerParamList} from './drawer-param-list';
|
||||||
import MassiveSwitch from './MassiveSwitch';
|
import MassiveSwitch from './MassiveSwitch';
|
||||||
|
import {PlanPageParams} from './plan-page-params';
|
||||||
import {addPlan, updatePlan} from './plan.service';
|
import {addPlan, updatePlan} from './plan.service';
|
||||||
import {PlanPageParams} from './PlanPage';
|
|
||||||
import {getNames} from './set.service';
|
import {getNames} from './set.service';
|
||||||
import {DAYS} from './time';
|
import {DAYS} from './time';
|
||||||
|
|
||||||
|
|
44
EditSet.tsx
44
EditSet.tsx
|
@ -17,26 +17,30 @@ import {settings} from './settings.service';
|
||||||
|
|
||||||
export default function EditSet() {
|
export default function EditSet() {
|
||||||
const {params} = useRoute<RouteProp<HomePageParams, 'EditSet'>>();
|
const {params} = useRoute<RouteProp<HomePageParams, 'EditSet'>>();
|
||||||
|
const {set, count, workouts} = params;
|
||||||
const navigation = useNavigation();
|
const navigation = useNavigation();
|
||||||
const {toast} = useContext(SnackbarContext);
|
const {toast} = useContext(SnackbarContext);
|
||||||
|
|
||||||
useFocusEffect(
|
useFocusEffect(
|
||||||
useCallback(() => {
|
useCallback(() => {
|
||||||
console.log(`${EditSet.name}.focus:`, params);
|
console.log(`${EditSet.name}.focus:`, set);
|
||||||
|
let title = 'Create set';
|
||||||
|
if (typeof set.id === 'number') title = 'Edit set';
|
||||||
|
else if (count > 0) title = `${set.name} (${count + 1} / ${set.sets})`;
|
||||||
navigation.getParent()?.setOptions({
|
navigation.getParent()?.setOptions({
|
||||||
headerLeft: () => (
|
headerLeft: () => (
|
||||||
<IconButton icon="arrow-back" onPress={() => navigation.goBack()} />
|
<IconButton icon="arrow-back" onPress={() => navigation.goBack()} />
|
||||||
),
|
),
|
||||||
headerRight: null,
|
headerRight: null,
|
||||||
title: typeof params.set.id === 'number' ? 'Edit set' : 'Create set',
|
title,
|
||||||
});
|
});
|
||||||
}, [navigation, params]),
|
}, [navigation, set, count]),
|
||||||
);
|
);
|
||||||
|
|
||||||
const startTimer = useCallback(async (set: Set) => {
|
const startTimer = useCallback(async (_set: Set) => {
|
||||||
if (!settings.alarm) return;
|
if (!settings.alarm) return;
|
||||||
const milliseconds =
|
const milliseconds =
|
||||||
Number(set.minutes) * 60 * 1000 + Number(set.seconds) * 1000;
|
Number(_set.minutes) * 60 * 1000 + Number(_set.seconds) * 1000;
|
||||||
NativeModules.AlarmModule.timer(
|
NativeModules.AlarmModule.timer(
|
||||||
milliseconds,
|
milliseconds,
|
||||||
!!settings.vibrate,
|
!!settings.vibrate,
|
||||||
|
@ -45,41 +49,41 @@ export default function EditSet() {
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const update = useCallback(
|
const update = useCallback(
|
||||||
async (set: Set) => {
|
async (_set: Set) => {
|
||||||
console.log(`${EditSet.name}.update`, set);
|
console.log(`${EditSet.name}.update`, _set);
|
||||||
await updateSet(set);
|
await updateSet(_set);
|
||||||
navigation.goBack();
|
navigation.goBack();
|
||||||
},
|
},
|
||||||
[navigation],
|
[navigation],
|
||||||
);
|
);
|
||||||
|
|
||||||
const add = useCallback(
|
const add = useCallback(
|
||||||
async (set: Set) => {
|
async (_set: Set) => {
|
||||||
console.log(`${EditSet.name}.add`, {set});
|
console.log(`${EditSet.name}.add`, {set: _set});
|
||||||
startTimer(set);
|
startTimer(_set);
|
||||||
await addSet(set);
|
await addSet(_set);
|
||||||
if (!settings.notify) return navigation.goBack();
|
if (!settings.notify) return navigation.goBack();
|
||||||
if (
|
if (
|
||||||
set.weight > params.set.weight ||
|
_set.weight > set.weight ||
|
||||||
(set.reps > params.set.reps && set.weight === params.set.weight)
|
(_set.reps > set.reps && _set.weight === set.weight)
|
||||||
)
|
)
|
||||||
toast("Great work King, that's a new record!", 3000);
|
toast("Great work King, that's a new record!", 3000);
|
||||||
navigation.goBack();
|
navigation.goBack();
|
||||||
},
|
},
|
||||||
[navigation, startTimer, params.set, toast],
|
[navigation, startTimer, set, toast],
|
||||||
);
|
);
|
||||||
|
|
||||||
const save = useCallback(
|
const save = useCallback(
|
||||||
async (set: Set) => {
|
async (_set: Set) => {
|
||||||
if (typeof params.set.id === 'number') return update(set);
|
if (typeof set.id === 'number') return update(_set);
|
||||||
return add(set);
|
return add(_set);
|
||||||
},
|
},
|
||||||
[update, add, params.set.id],
|
[update, add, set.id],
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={{padding: PADDING}}>
|
<View style={{padding: PADDING}}>
|
||||||
<SetForm save={save} set={params.set} workouts={params.workouts} />
|
<SetForm save={save} set={set} workouts={workouts} />
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,8 @@ import React, {useCallback, useState} from 'react';
|
||||||
import {GestureResponderEvent} from 'react-native';
|
import {GestureResponderEvent} from 'react-native';
|
||||||
import {List, Menu} from 'react-native-paper';
|
import {List, Menu} from 'react-native-paper';
|
||||||
import {Plan} from './plan';
|
import {Plan} from './plan';
|
||||||
|
import {PlanPageParams} from './plan-page-params';
|
||||||
import {deletePlan} from './plan.service';
|
import {deletePlan} from './plan.service';
|
||||||
import {PlanPageParams} from './PlanPage';
|
|
||||||
|
|
||||||
export default function PlanItem({
|
export default function PlanItem({
|
||||||
item,
|
item,
|
||||||
|
|
|
@ -9,9 +9,9 @@ import {List} from 'react-native-paper';
|
||||||
import DrawerMenu from './DrawerMenu';
|
import DrawerMenu from './DrawerMenu';
|
||||||
import Page from './Page';
|
import Page from './Page';
|
||||||
import {Plan} from './plan';
|
import {Plan} from './plan';
|
||||||
|
import {PlanPageParams} from './plan-page-params';
|
||||||
import {getPlans} from './plan.service';
|
import {getPlans} from './plan.service';
|
||||||
import PlanItem from './PlanItem';
|
import PlanItem from './PlanItem';
|
||||||
import {PlanPageParams} from './PlanPage';
|
|
||||||
|
|
||||||
export default function PlanList() {
|
export default function PlanList() {
|
||||||
const [search, setSearch] = useState('');
|
const [search, setSearch] = useState('');
|
||||||
|
|
|
@ -35,7 +35,7 @@ export default function SetItem({
|
||||||
const set: Set = {...item};
|
const set: Set = {...item};
|
||||||
delete set.id;
|
delete set.id;
|
||||||
setShowMenu(false);
|
setShowMenu(false);
|
||||||
navigation.navigate('EditSet', {set, workouts: []});
|
navigation.navigate('EditSet', {set, workouts: [], count: 0});
|
||||||
}, [navigation, item]);
|
}, [navigation, item]);
|
||||||
|
|
||||||
const longPress = useCallback(
|
const longPress = useCallback(
|
||||||
|
|
41
SetList.tsx
41
SetList.tsx
|
@ -21,6 +21,7 @@ const limit = 15;
|
||||||
export default function SetList() {
|
export default function SetList() {
|
||||||
const [sets, setSets] = useState<Set[]>();
|
const [sets, setSets] = useState<Set[]>();
|
||||||
const [set, setSet] = useState<Set>();
|
const [set, setSet] = useState<Set>();
|
||||||
|
const [count, setCount] = useState(0);
|
||||||
const [workouts, setWorkouts] = useState<string[]>([]);
|
const [workouts, setWorkouts] = useState<string[]>([]);
|
||||||
const [offset, setOffset] = useState(0);
|
const [offset, setOffset] = useState(0);
|
||||||
const [search, setSearch] = useState('');
|
const [search, setSearch] = useState('');
|
||||||
|
@ -29,20 +30,8 @@ export default function SetList() {
|
||||||
const [images, setImages] = useState(true);
|
const [images, setImages] = useState(true);
|
||||||
const navigation = useNavigation<NavigationProp<HomePageParams>>();
|
const navigation = useNavigation<NavigationProp<HomePageParams>>();
|
||||||
|
|
||||||
const refresh = useCallback(async () => {
|
|
||||||
const newSets = await getSets({search: `%${search}%`, limit, offset: 0});
|
|
||||||
console.log(`${SetList.name}.refresh:`, {newSets});
|
|
||||||
if (newSets.length === 0) return setSets([]);
|
|
||||||
setSets(newSets);
|
|
||||||
setOffset(0);
|
|
||||||
setEnd(false);
|
|
||||||
}, [search]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
refresh();
|
|
||||||
}, [search, refresh]);
|
|
||||||
|
|
||||||
const predict = useCallback(async () => {
|
const predict = useCallback(async () => {
|
||||||
|
setCount(0);
|
||||||
console.log(`${SetList.name}.predict:`, {settings});
|
console.log(`${SetList.name}.predict:`, {settings});
|
||||||
if (!settings.predict) return setSet({...defaultSet});
|
if (!settings.predict) return setSet({...defaultSet});
|
||||||
const todaysPlan = await getTodaysPlan();
|
const todaysPlan = await getTodaysPlan();
|
||||||
|
@ -55,15 +44,17 @@ export default function SetList() {
|
||||||
console.log(`${SetList.name}.predict:`, {todaysWorkouts});
|
console.log(`${SetList.name}.predict:`, {todaysWorkouts});
|
||||||
let best = await getBestSet(workout);
|
let best = await getBestSet(workout);
|
||||||
if (todaysWorkouts.includes(todaysSets[0]?.name) && todaysSets.length > 0) {
|
if (todaysWorkouts.includes(todaysSets[0]?.name) && todaysSets.length > 0) {
|
||||||
const count = todaysSets.filter(
|
const _count = todaysSets.filter(
|
||||||
s => s.name === todaysSets[0].name,
|
s => s.name === todaysSets[0].name,
|
||||||
).length;
|
).length;
|
||||||
workout = todaysSets[0].name;
|
workout = todaysSets[0].name;
|
||||||
best = await getBestSet(workout);
|
best = await getBestSet(workout);
|
||||||
if (count >= Number(best.sets))
|
if (_count >= Number(best.sets))
|
||||||
best = await getBestSet(
|
best = await getBestSet(
|
||||||
todaysWorkouts[todaysWorkouts.indexOf(todaysSets[0].name!) + 1],
|
todaysWorkouts[todaysWorkouts.indexOf(todaysSets[0].name!) + 1],
|
||||||
);
|
);
|
||||||
|
if (best.name === '') setCount(0);
|
||||||
|
else setCount(_count);
|
||||||
}
|
}
|
||||||
console.log(`${SetList.name}.predict:`, {workout});
|
console.log(`${SetList.name}.predict:`, {workout});
|
||||||
console.log(`${SetList.name}.predict:`, {best});
|
console.log(`${SetList.name}.predict:`, {best});
|
||||||
|
@ -71,17 +62,30 @@ export default function SetList() {
|
||||||
setWorkouts(todaysWorkouts);
|
setWorkouts(todaysWorkouts);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
const refresh = useCallback(async () => {
|
||||||
|
predict();
|
||||||
|
const newSets = await getSets({search: `%${search}%`, limit, offset: 0});
|
||||||
|
console.log(`${SetList.name}.refresh:`, {newSets});
|
||||||
|
if (newSets.length === 0) return setSets([]);
|
||||||
|
setSets(newSets);
|
||||||
|
setOffset(0);
|
||||||
|
setEnd(false);
|
||||||
|
}, [search, predict]);
|
||||||
|
|
||||||
useFocusEffect(
|
useFocusEffect(
|
||||||
useCallback(() => {
|
useCallback(() => {
|
||||||
refresh();
|
refresh();
|
||||||
predict();
|
|
||||||
navigation.getParent()?.setOptions({
|
navigation.getParent()?.setOptions({
|
||||||
headerRight: () => <DrawerMenu name="Home" />,
|
headerRight: () => <DrawerMenu name="Home" />,
|
||||||
});
|
});
|
||||||
setImages(!!settings.images);
|
setImages(!!settings.images);
|
||||||
}, [refresh, predict, navigation]),
|
}, [refresh, navigation]),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
refresh();
|
||||||
|
}, [search, refresh]);
|
||||||
|
|
||||||
const renderItem = useCallback(
|
const renderItem = useCallback(
|
||||||
({item}: {item: Set}) => (
|
({item}: {item: Set}) => (
|
||||||
<SetItem
|
<SetItem
|
||||||
|
@ -118,8 +122,9 @@ export default function SetList() {
|
||||||
navigation.navigate('EditSet', {
|
navigation.navigate('EditSet', {
|
||||||
set: set || {...defaultSet},
|
set: set || {...defaultSet},
|
||||||
workouts,
|
workouts,
|
||||||
|
count,
|
||||||
});
|
});
|
||||||
}, [navigation, set, workouts]);
|
}, [navigation, set, workouts, count]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Page onAdd={onAdd} search={search} setSearch={setSearch}>
|
<Page onAdd={onAdd} search={search} setSearch={setSearch}>
|
||||||
|
|
|
@ -5,5 +5,6 @@ export type HomePageParams = {
|
||||||
EditSet: {
|
EditSet: {
|
||||||
set: Set;
|
set: Set;
|
||||||
workouts: string[];
|
workouts: string[];
|
||||||
|
count: number;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user