104 lines
3.0 KiB
TypeScript
104 lines
3.0 KiB
TypeScript
import {
|
|
NavigationProp,
|
|
RouteProp,
|
|
useFocusEffect,
|
|
useNavigation,
|
|
useRoute,
|
|
} from '@react-navigation/native';
|
|
import React, {useCallback, useContext} from 'react';
|
|
import {BackHandler, NativeModules, View} from 'react-native';
|
|
import {IconButton} from 'react-native-paper';
|
|
import {PADDING} from './constants';
|
|
import {DrawerParamList} from './drawer-param-list';
|
|
import {SnackbarContext} from './MassiveSnack';
|
|
import Set from './set';
|
|
import {addSet, updateSet} from './set.service';
|
|
import SetForm from './SetForm';
|
|
import {getSettings, settings, updateSettings} from './settings.service';
|
|
|
|
export default function EditSet() {
|
|
const {params} = useRoute<RouteProp<DrawerParamList, 'Edit set'>>();
|
|
const {set, count, workouts} = params;
|
|
const navigation = useNavigation<NavigationProp<DrawerParamList>>();
|
|
const {toast} = useContext(SnackbarContext);
|
|
|
|
useFocusEffect(
|
|
useCallback(() => {
|
|
console.log(`${EditSet.name}.focus:`, set);
|
|
let title = 'Create set';
|
|
if (typeof set.id === 'number') title = 'Edit set';
|
|
else if (Number(set.sets) > 0)
|
|
title = `${set.name} (${count + 1} / ${set.sets})`;
|
|
navigation.setOptions({
|
|
title,
|
|
headerLeft: () => (
|
|
<IconButton
|
|
icon="arrow-back"
|
|
onPress={() => navigation.navigate('Home', {})}
|
|
/>
|
|
),
|
|
});
|
|
const onBack = () => {
|
|
navigation.navigate('Home', {});
|
|
return true;
|
|
};
|
|
BackHandler.addEventListener('hardwareBackPress', onBack);
|
|
return () => BackHandler.removeEventListener('hardwareBackPress', onBack);
|
|
}, [navigation, set, count]),
|
|
);
|
|
|
|
const startTimer = useCallback(async (_set: Set) => {
|
|
if (!settings.alarm) return;
|
|
const milliseconds =
|
|
Number(_set.minutes) * 60 * 1000 + Number(_set.seconds) * 1000;
|
|
NativeModules.AlarmModule.timer(
|
|
milliseconds,
|
|
!!settings.vibrate,
|
|
settings.sound,
|
|
);
|
|
const next = new Date();
|
|
next.setTime(next.getTime() + milliseconds);
|
|
await updateSettings({...settings, nextAlarm: next.toISOString()});
|
|
await getSettings();
|
|
}, []);
|
|
|
|
const update = useCallback(
|
|
async (_set: Set) => {
|
|
console.log(`${EditSet.name}.update`, _set);
|
|
await updateSet(_set);
|
|
navigation.goBack();
|
|
},
|
|
[navigation],
|
|
);
|
|
|
|
const add = useCallback(
|
|
async (_set: Set) => {
|
|
console.log(`${EditSet.name}.add`, {set: _set});
|
|
startTimer(_set);
|
|
await addSet(_set);
|
|
if (!settings.notify) return navigation.goBack();
|
|
if (
|
|
_set.weight > set.weight ||
|
|
(_set.reps > set.reps && _set.weight === set.weight)
|
|
)
|
|
toast("Great work King, that's a new record!", 3000);
|
|
navigation.goBack();
|
|
},
|
|
[navigation, startTimer, set, toast],
|
|
);
|
|
|
|
const save = useCallback(
|
|
async (_set: Set) => {
|
|
if (typeof set.id === 'number') return update(_set);
|
|
return add(_set);
|
|
},
|
|
[update, add, set.id],
|
|
);
|
|
|
|
return (
|
|
<View style={{padding: PADDING}}>
|
|
<SetForm save={save} set={set} workouts={workouts} />
|
|
</View>
|
|
);
|
|
}
|