parent
8499795c97
commit
cb446be7b0
|
@ -18,7 +18,7 @@ export default function BestList() {
|
||||||
|
|
||||||
const refresh = useCallback(async () => {
|
const refresh = useCallback(async () => {
|
||||||
const weights = await getBestWeights(search);
|
const weights = await getBestWeights(search);
|
||||||
console.log(BestList.name, {weights});
|
console.log(`${BestList.name}.refresh:`, {length: weights.length});
|
||||||
let newBest: Set[] = [];
|
let newBest: Set[] = [];
|
||||||
for (const set of weights) {
|
for (const set of weights) {
|
||||||
const reps = await getBestReps(set.name, set.weight);
|
const reps = await getBestReps(set.name, set.weight);
|
||||||
|
|
|
@ -5,7 +5,7 @@ import {
|
||||||
useRoute,
|
useRoute,
|
||||||
} from '@react-navigation/native';
|
} from '@react-navigation/native';
|
||||||
import React, {useCallback, useState} from 'react';
|
import React, {useCallback, useState} from 'react';
|
||||||
import {Pressable, ScrollView} from 'react-native';
|
import {Pressable, ScrollView, View} from 'react-native';
|
||||||
import DocumentPicker from 'react-native-document-picker';
|
import DocumentPicker from 'react-native-document-picker';
|
||||||
import {Button, Card, IconButton} from 'react-native-paper';
|
import {Button, Card, IconButton} from 'react-native-paper';
|
||||||
import {MARGIN, PADDING} from './constants';
|
import {MARGIN, PADDING} from './constants';
|
||||||
|
@ -13,10 +13,13 @@ import MassiveInput from './MassiveInput';
|
||||||
import {updateWorkouts} from './plan.service';
|
import {updateWorkouts} from './plan.service';
|
||||||
import Set from './set';
|
import Set from './set';
|
||||||
import {addSet, getSets, updateSetImage, updateSetName} from './set.service';
|
import {addSet, getSets, updateSetImage, updateSetName} from './set.service';
|
||||||
|
import Workout from './workout';
|
||||||
|
import {addWorkout, getWorkout, updateSteps} from './workout.service';
|
||||||
import {WorkoutsPageParams} from './WorkoutsPage';
|
import {WorkoutsPageParams} from './WorkoutsPage';
|
||||||
|
|
||||||
export default function EditWorkout() {
|
export default function EditWorkout() {
|
||||||
const [name, setName] = useState('');
|
const [name, setName] = useState('');
|
||||||
|
const [steps, setSteps] = useState('');
|
||||||
const [uri, setUri] = useState<string>();
|
const [uri, setUri] = useState<string>();
|
||||||
const {params} = useRoute<RouteProp<WorkoutsPageParams, 'EditWorkout'>>();
|
const {params} = useRoute<RouteProp<WorkoutsPageParams, 'EditWorkout'>>();
|
||||||
const navigation = useNavigation();
|
const navigation = useNavigation();
|
||||||
|
@ -30,10 +33,11 @@ export default function EditWorkout() {
|
||||||
headerRight: null,
|
headerRight: null,
|
||||||
title: params.value.name ? params.value.name : 'New workout',
|
title: params.value.name ? params.value.name : 'New workout',
|
||||||
});
|
});
|
||||||
if (params.value.name)
|
if (!params.value.name) return;
|
||||||
getSets({search: params.value.name, limit: 1, offset: 0}).then(sets =>
|
getSets({search: params.value.name, limit: 1, offset: 0}).then(sets =>
|
||||||
setUri(sets[0]?.image),
|
setUri(sets[0]?.image),
|
||||||
);
|
);
|
||||||
|
getWorkout(params.value.name).then(workout => setSteps(workout.steps));
|
||||||
}, [navigation, params.value.name]),
|
}, [navigation, params.value.name]),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -42,19 +46,22 @@ export default function EditWorkout() {
|
||||||
params: params.value.name,
|
params: params.value.name,
|
||||||
name,
|
name,
|
||||||
uri,
|
uri,
|
||||||
|
steps,
|
||||||
});
|
});
|
||||||
if (name) {
|
if (name) {
|
||||||
await updateSetName(params.value.name, name);
|
await updateSetName(params.value.name, name);
|
||||||
await updateWorkouts(params.value.name, name);
|
await updateWorkouts(params.value.name, name);
|
||||||
}
|
}
|
||||||
if (uri) await updateSetImage(params.value.name, uri);
|
if (uri) await updateSetImage(params.value.name, uri);
|
||||||
|
if (steps) await updateSteps(params.value.name, steps);
|
||||||
navigation.goBack();
|
navigation.goBack();
|
||||||
}, [navigation, params.value.name, name, uri]);
|
}, [navigation, params.value.name, name, uri, steps]);
|
||||||
|
|
||||||
const add = useCallback(async () => {
|
const add = useCallback(async () => {
|
||||||
await addSet({name, reps: 0, weight: 0, hidden: true} as Set);
|
await addSet({name, reps: 0, weight: 0, hidden: true, image: uri} as Set);
|
||||||
|
await addWorkout({name, steps} as Workout);
|
||||||
navigation.goBack();
|
navigation.goBack();
|
||||||
}, [navigation, name]);
|
}, [navigation, name, steps, uri]);
|
||||||
|
|
||||||
const save = useCallback(async () => {
|
const save = useCallback(async () => {
|
||||||
if (params.value.name) return update();
|
if (params.value.name) return update();
|
||||||
|
@ -70,31 +77,36 @@ export default function EditWorkout() {
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ScrollView style={{padding: PADDING}}>
|
<View style={{padding: PADDING}}>
|
||||||
<MassiveInput
|
<ScrollView style={{height: '90%'}}>
|
||||||
label={params.value.name}
|
{uri ? (
|
||||||
value={name}
|
<Pressable style={{marginBottom: MARGIN}} onPress={changeImage}>
|
||||||
onChangeText={setName}
|
<Card.Cover source={{uri}} />
|
||||||
/>
|
</Pressable>
|
||||||
{uri ? (
|
) : (
|
||||||
<Pressable style={{marginBottom: MARGIN}} onPress={changeImage}>
|
<Button
|
||||||
<Card.Cover source={{uri}} />
|
style={{marginBottom: MARGIN}}
|
||||||
</Pressable>
|
onPress={changeImage}
|
||||||
) : (
|
icon="image">
|
||||||
<Button
|
Image
|
||||||
style={{marginBottom: MARGIN}}
|
</Button>
|
||||||
onPress={changeImage}
|
)}
|
||||||
icon="image">
|
<MassiveInput
|
||||||
Image
|
label={params.value.name || 'Name'}
|
||||||
</Button>
|
value={name}
|
||||||
)}
|
onChangeText={setName}
|
||||||
<Button
|
/>
|
||||||
disabled={!name && !!params.value.name && !uri}
|
<MassiveInput
|
||||||
mode="contained"
|
selectTextOnFocus={false}
|
||||||
icon="save"
|
value={steps}
|
||||||
onPress={save}>
|
onChangeText={setSteps}
|
||||||
|
label="Steps"
|
||||||
|
multiline
|
||||||
|
/>
|
||||||
|
</ScrollView>
|
||||||
|
<Button mode="contained" icon="save" onPress={save}>
|
||||||
Save
|
Save
|
||||||
</Button>
|
</Button>
|
||||||
</ScrollView>
|
</View>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ import React, {useCallback, useEffect, useState} from 'react';
|
||||||
import {FlatList} from 'react-native';
|
import {FlatList} from 'react-native';
|
||||||
import {List} from 'react-native-paper';
|
import {List} from 'react-native-paper';
|
||||||
import Page from './Page';
|
import Page from './Page';
|
||||||
import {getWorkouts} from './set.service';
|
import {getDistinctSets} from './set.service';
|
||||||
import SetList from './SetList';
|
import SetList from './SetList';
|
||||||
import Workout from './workout';
|
import Workout from './workout';
|
||||||
import WorkoutItem from './WorkoutItem';
|
import WorkoutItem from './WorkoutItem';
|
||||||
|
@ -23,7 +23,7 @@ export default function WorkoutList() {
|
||||||
const navigation = useNavigation<NavigationProp<WorkoutsPageParams>>();
|
const navigation = useNavigation<NavigationProp<WorkoutsPageParams>>();
|
||||||
|
|
||||||
const refresh = useCallback(async () => {
|
const refresh = useCallback(async () => {
|
||||||
const newWorkouts = await getWorkouts({
|
const newWorkouts = await getDistinctSets({
|
||||||
search: `%${search}%`,
|
search: `%${search}%`,
|
||||||
limit,
|
limit,
|
||||||
offset: 0,
|
offset: 0,
|
||||||
|
@ -59,7 +59,7 @@ export default function WorkoutList() {
|
||||||
newOffset,
|
newOffset,
|
||||||
search,
|
search,
|
||||||
});
|
});
|
||||||
const newWorkouts = await getWorkouts({
|
const newWorkouts = await getDistinctSets({
|
||||||
search: `%${search}%`,
|
search: `%${search}%`,
|
||||||
limit,
|
limit,
|
||||||
offset: newOffset,
|
offset: newOffset,
|
||||||
|
@ -73,7 +73,7 @@ export default function WorkoutList() {
|
||||||
|
|
||||||
const onAdd = useCallback(async () => {
|
const onAdd = useCallback(async () => {
|
||||||
navigation.navigate('EditWorkout', {
|
navigation.navigate('EditWorkout', {
|
||||||
value: {name: '', sets: 3, image: ''},
|
value: {name: '', sets: 3, image: '', steps: ''},
|
||||||
});
|
});
|
||||||
}, [navigation]);
|
}, [navigation]);
|
||||||
|
|
||||||
|
|
5
db.ts
5
db.ts
|
@ -71,6 +71,10 @@ const insertSettings = `
|
||||||
INSERT INTO settings(minutes) VALUES(3);
|
INSERT INTO settings(minutes) VALUES(3);
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
const addSteps = `
|
||||||
|
ALTER TABLE workouts ADD COLUMN steps TEXT NULL;
|
||||||
|
`;
|
||||||
|
|
||||||
export let db: SQLiteDatabase;
|
export let db: SQLiteDatabase;
|
||||||
|
|
||||||
export const migrations = async () => {
|
export const migrations = async () => {
|
||||||
|
@ -84,6 +88,7 @@ export const migrations = async () => {
|
||||||
await db.executeSql(addNotify).catch(() => null);
|
await db.executeSql(addNotify).catch(() => null);
|
||||||
await db.executeSql(addImage).catch(() => null);
|
await db.executeSql(addImage).catch(() => null);
|
||||||
await db.executeSql(addImages).catch(() => null);
|
await db.executeSql(addImages).catch(() => null);
|
||||||
|
await db.executeSql(addSteps).catch(() => null);
|
||||||
const [result] = await db.executeSql(selectSettings);
|
const [result] = await db.executeSql(selectSettings);
|
||||||
if (result.rows.length === 0) await db.executeSql(insertSettings);
|
if (result.rows.length === 0) await db.executeSql(insertSettings);
|
||||||
};
|
};
|
||||||
|
|
|
@ -106,7 +106,7 @@ export const getNames = async (): Promise<string[]> => {
|
||||||
return values.map(value => value.name);
|
return values.map(value => value.name);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getWorkouts = async ({
|
export const getDistinctSets = async ({
|
||||||
search,
|
search,
|
||||||
limit,
|
limit,
|
||||||
offset,
|
offset,
|
||||||
|
|
27
workout.service.ts
Normal file
27
workout.service.ts
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import {db} from './db';
|
||||||
|
import Workout from './workout';
|
||||||
|
|
||||||
|
export const getWorkout = async (name: string): Promise<Workout> => {
|
||||||
|
const select = `
|
||||||
|
SELECT * FROM workouts
|
||||||
|
WHERE workouts.name = ?
|
||||||
|
LIMIT 1
|
||||||
|
`;
|
||||||
|
const [result] = await db.executeSql(select, [name]);
|
||||||
|
return result.rows.raw()[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
export const updateSteps = (name: string, steps: string): Promise<unknown> => {
|
||||||
|
const select = `
|
||||||
|
UPDATE workouts SET steps = ? WHERE name = ?
|
||||||
|
`;
|
||||||
|
return db.executeSql(select, [steps, name]);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const addWorkout = (value: Workout) => {
|
||||||
|
const insert = `
|
||||||
|
INSERT INTO workouts(name, steps)
|
||||||
|
VALUES (?, ?)
|
||||||
|
`;
|
||||||
|
return db.executeSql(insert, [value.name, value.steps]);
|
||||||
|
};
|
|
@ -2,4 +2,5 @@ export default interface Workout {
|
||||||
name: string;
|
name: string;
|
||||||
sets: number;
|
sets: number;
|
||||||
image: string;
|
image: string;
|
||||||
|
steps: string;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user