Prevent empty plans from being created

This commit is contained in:
Brandon Presley 2022-09-18 18:45:05 +12:00
parent 910cfddfc5
commit 0cee774136
2 changed files with 20 additions and 10 deletions

View File

@ -18,23 +18,27 @@ import {DAYS} from './time';
export default function EditPlan() { export default function EditPlan() {
const {params} = useRoute<RouteProp<PlanPageParams, 'EditPlan'>>(); const {params} = useRoute<RouteProp<PlanPageParams, 'EditPlan'>>();
const [days, setDays] = useState<string[]>(params.plan.days.split(',')); const {plan} = params;
const [days, setDays] = useState<string[]>(
plan.days ? plan.days.split(',') : [],
);
const [workouts, setWorkouts] = useState<string[]>( const [workouts, setWorkouts] = useState<string[]>(
params.plan.workouts.split(','), plan.workouts ? plan.workouts.split(',') : [],
); );
const [names, setNames] = useState<string[]>([]); const [names, setNames] = useState<string[]>([]);
const navigation = useNavigation<NavigationProp<DrawerParamList>>(); const navigation = useNavigation<NavigationProp<DrawerParamList>>();
useFocusEffect( useFocusEffect(
useCallback(() => { useCallback(() => {
console.log(`${EditPlan.name}.focus:`, {plan});
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: params.plan.id ? 'Edit plan' : 'Create plan', title: plan.id ? 'Edit plan' : 'Create plan',
}); });
}, [navigation, params.plan.id]), }, [navigation, plan]),
); );
useEffect(() => { useEffect(() => {
@ -45,19 +49,19 @@ export default function EditPlan() {
}, []); }, []);
const save = useCallback(async () => { const save = useCallback(async () => {
console.log(`${EditPlan.name}.save`, {days, workouts, params}); console.log(`${EditPlan.name}.save`, {days, workouts, plan});
if (!days || !workouts) return; if (!days || !workouts) return;
const newWorkouts = workouts.filter(workout => workout).join(','); const newWorkouts = workouts.filter(workout => workout).join(',');
const newDays = days.filter(day => day).join(','); const newDays = days.filter(day => day).join(',');
if (!params.plan.id) await addPlan({days: newDays, workouts: newWorkouts}); if (!plan.id) await addPlan({days: newDays, workouts: newWorkouts});
else else
await updatePlan({ await updatePlan({
days: newDays, days: newDays,
workouts: newWorkouts, workouts: newWorkouts,
id: params.plan.id, id: plan.id,
}); });
navigation.goBack(); navigation.goBack();
}, [days, workouts, params, navigation]); }, [days, workouts, plan, navigation]);
const toggleWorkout = useCallback( const toggleWorkout = useCallback(
(on: boolean, name: string) => { (on: boolean, name: string) => {
@ -116,6 +120,7 @@ export default function EditPlan() {
</ScrollView> </ScrollView>
{names.length === 0 ? ( {names.length === 0 ? (
<Button <Button
disabled={workouts.length === 0 && days.length === 0}
mode="contained" mode="contained"
onPress={() => { onPress={() => {
navigation.goBack(); navigation.goBack();
@ -128,6 +133,7 @@ export default function EditPlan() {
</Button> </Button>
) : ( ) : (
<Button <Button
disabled={workouts.length === 0 && days.length === 0}
style={{marginTop: MARGIN}} style={{marginTop: MARGIN}}
mode="contained" mode="contained"
icon="save" icon="save"

View File

@ -35,8 +35,12 @@ export default function PlanItem({
<> <>
<List.Item <List.Item
onPress={() => navigation.navigate('EditPlan', {plan: item})} onPress={() => navigation.navigate('EditPlan', {plan: item})}
title={item.days.replace(/,/g, ', ')} title={
description={item.workouts.replace(/,/g, ', ')} item.days
? item.days.replace(/,/g, ', ')
: item.workouts.replace(/,/g, ', ')
}
description={item.days ? item.workouts.replace(/,/g, ', ') : null}
onLongPress={longPress} onLongPress={longPress}
right={() => ( right={() => (
<Menu anchor={anchor} visible={show} onDismiss={() => setShow(false)}> <Menu anchor={anchor} visible={show} onDismiss={() => setShow(false)}>