Replace react context with let statement in db.ts
1. I can't easily import context with my editor. 2. It's extra complexity everyone has to understand. 3. I hate the antichrist.
This commit is contained in:
parent
87b807336a
commit
607f83955d
|
@ -3,18 +3,17 @@ import {
|
||||||
useFocusEffect,
|
useFocusEffect,
|
||||||
useNavigation,
|
useNavigation,
|
||||||
} from '@react-navigation/native';
|
} from '@react-navigation/native';
|
||||||
import React, {useCallback, useContext, useEffect, useState} from 'react';
|
import React, {useCallback, useEffect, useState} from 'react';
|
||||||
import {FlatList, StyleSheet, View} from 'react-native';
|
import {FlatList, StyleSheet, View} from 'react-native';
|
||||||
import {List, Searchbar} from 'react-native-paper';
|
import {List, Searchbar} from 'react-native-paper';
|
||||||
import Best from './best';
|
import Best from './best';
|
||||||
import {BestPageParams} from './BestPage';
|
import {BestPageParams} from './BestPage';
|
||||||
import {DatabaseContext} from './Routes';
|
import {db} from './db';
|
||||||
|
|
||||||
export default function BestList() {
|
export default function BestList() {
|
||||||
const [bests, setBests] = useState<Best[]>([]);
|
const [bests, setBests] = useState<Best[]>([]);
|
||||||
const [search, setSearch] = useState('');
|
const [search, setSearch] = useState('');
|
||||||
const [refreshing, setRefresing] = useState(false);
|
const [refreshing, setRefresing] = useState(false);
|
||||||
const db = useContext(DatabaseContext);
|
|
||||||
const navigation = useNavigation<NavigationProp<BestPageParams>>();
|
const navigation = useNavigation<NavigationProp<BestPageParams>>();
|
||||||
|
|
||||||
const refresh = useCallback(async () => {
|
const refresh = useCallback(async () => {
|
||||||
|
@ -41,7 +40,7 @@ export default function BestList() {
|
||||||
newBest = newBest.concat(reps.rows.raw());
|
newBest = newBest.concat(reps.rows.raw());
|
||||||
}
|
}
|
||||||
setBests(newBest);
|
setBests(newBest);
|
||||||
}, [search, db]);
|
}, [search]);
|
||||||
|
|
||||||
useFocusEffect(
|
useFocusEffect(
|
||||||
useCallback(() => {
|
useCallback(() => {
|
||||||
|
|
|
@ -5,8 +5,8 @@ import {FileSystem} from 'react-native-file-access';
|
||||||
import {Divider, IconButton, Menu} from 'react-native-paper';
|
import {Divider, IconButton, Menu} from 'react-native-paper';
|
||||||
import {DrawerParamList, SnackbarContext} from './App';
|
import {DrawerParamList, SnackbarContext} from './App';
|
||||||
import ConfirmDialog from './ConfirmDialog';
|
import ConfirmDialog from './ConfirmDialog';
|
||||||
|
import {db} from './db';
|
||||||
import {Plan} from './plan';
|
import {Plan} from './plan';
|
||||||
import {DatabaseContext} from './Routes';
|
|
||||||
import Set from './set';
|
import Set from './set';
|
||||||
import {write} from './write';
|
import {write} from './write';
|
||||||
|
|
||||||
|
@ -16,7 +16,6 @@ const planFields = 'id,days,workouts';
|
||||||
export default function DrawerMenu({name}: {name: keyof DrawerParamList}) {
|
export default function DrawerMenu({name}: {name: keyof DrawerParamList}) {
|
||||||
const [showMenu, setShowMenu] = useState(false);
|
const [showMenu, setShowMenu] = useState(false);
|
||||||
const [showRemove, setShowRemove] = useState(false);
|
const [showRemove, setShowRemove] = useState(false);
|
||||||
const db = useContext(DatabaseContext);
|
|
||||||
const {toast} = useContext(SnackbarContext);
|
const {toast} = useContext(SnackbarContext);
|
||||||
const {reset} = useNavigation<NavigationProp<DrawerParamList>>();
|
const {reset} = useNavigation<NavigationProp<DrawerParamList>>();
|
||||||
|
|
||||||
|
@ -34,7 +33,7 @@ export default function DrawerMenu({name}: {name: keyof DrawerParamList}) {
|
||||||
.join('\n');
|
.join('\n');
|
||||||
console.log(`${DrawerMenu.name}.exportSets`, {length: sets.length});
|
console.log(`${DrawerMenu.name}.exportSets`, {length: sets.length});
|
||||||
await write('sets.csv', data);
|
await write('sets.csv', data);
|
||||||
}, [db]);
|
}, []);
|
||||||
|
|
||||||
const exportPlans = useCallback(async () => {
|
const exportPlans = useCallback(async () => {
|
||||||
const [result] = await db.executeSql('SELECT * FROM plans');
|
const [result] = await db.executeSql('SELECT * FROM plans');
|
||||||
|
@ -45,7 +44,7 @@ export default function DrawerMenu({name}: {name: keyof DrawerParamList}) {
|
||||||
.join('\n');
|
.join('\n');
|
||||||
console.log(`${DrawerMenu.name}.exportPlans`, {length: sets.length});
|
console.log(`${DrawerMenu.name}.exportPlans`, {length: sets.length});
|
||||||
await write('plans.csv', data);
|
await write('plans.csv', data);
|
||||||
}, [db]);
|
}, []);
|
||||||
|
|
||||||
const download = useCallback(async () => {
|
const download = useCallback(async () => {
|
||||||
setShowMenu(false);
|
setShowMenu(false);
|
||||||
|
|
|
@ -5,13 +5,13 @@ import {
|
||||||
useNavigation,
|
useNavigation,
|
||||||
useRoute,
|
useRoute,
|
||||||
} from '@react-navigation/native';
|
} from '@react-navigation/native';
|
||||||
import React, {useCallback, useContext, useEffect, useState} from 'react';
|
import React, {useCallback, useEffect, useState} from 'react';
|
||||||
import {ScrollView, StyleSheet, Text, View} from 'react-native';
|
import {ScrollView, StyleSheet, Text, View} from 'react-native';
|
||||||
import {Button, IconButton} from 'react-native-paper';
|
import {Button, IconButton} from 'react-native-paper';
|
||||||
import {DrawerParamList} from './App';
|
import {DrawerParamList} from './App';
|
||||||
|
import {db} from './db';
|
||||||
import MassiveSwitch from './MassiveSwitch';
|
import MassiveSwitch from './MassiveSwitch';
|
||||||
import {PlanPageParams} from './PlanPage';
|
import {PlanPageParams} from './PlanPage';
|
||||||
import {DatabaseContext} from './Routes';
|
|
||||||
import {DAYS} from './time';
|
import {DAYS} from './time';
|
||||||
|
|
||||||
export default function EditPlan() {
|
export default function EditPlan() {
|
||||||
|
@ -21,7 +21,6 @@ export default function EditPlan() {
|
||||||
params.plan.workouts.split(','),
|
params.plan.workouts.split(','),
|
||||||
);
|
);
|
||||||
const [names, setNames] = useState<string[]>([]);
|
const [names, setNames] = useState<string[]>([]);
|
||||||
const db = useContext(DatabaseContext);
|
|
||||||
const navigation = useNavigation<NavigationProp<DrawerParamList>>();
|
const navigation = useNavigation<NavigationProp<DrawerParamList>>();
|
||||||
|
|
||||||
useFocusEffect(
|
useFocusEffect(
|
||||||
|
@ -45,7 +44,7 @@ export default function EditPlan() {
|
||||||
setNames(namesResult.rows.raw().map(({name}) => name));
|
setNames(namesResult.rows.raw().map(({name}) => name));
|
||||||
};
|
};
|
||||||
refresh();
|
refresh();
|
||||||
}, [db]);
|
}, []);
|
||||||
|
|
||||||
const save = useCallback(async () => {
|
const save = useCallback(async () => {
|
||||||
console.log(`${EditPlan.name}.save`, {days, workouts, params});
|
console.log(`${EditPlan.name}.save`, {days, workouts, params});
|
||||||
|
@ -63,7 +62,7 @@ export default function EditPlan() {
|
||||||
[newDays, newWorkouts, params.plan.id],
|
[newDays, newWorkouts, params.plan.id],
|
||||||
);
|
);
|
||||||
navigation.goBack();
|
navigation.goBack();
|
||||||
}, [days, workouts, db, params, navigation]);
|
}, [days, workouts, params, navigation]);
|
||||||
|
|
||||||
const toggleWorkout = useCallback(
|
const toggleWorkout = useCallback(
|
||||||
(on: boolean, name: string) => {
|
(on: boolean, name: string) => {
|
||||||
|
|
|
@ -8,15 +8,14 @@ import React, {useCallback, useContext} from 'react';
|
||||||
import {NativeModules, View} from 'react-native';
|
import {NativeModules, View} from 'react-native';
|
||||||
import {IconButton} from 'react-native-paper';
|
import {IconButton} from 'react-native-paper';
|
||||||
import {SnackbarContext} from './App';
|
import {SnackbarContext} from './App';
|
||||||
|
import {db} from './db';
|
||||||
import {HomePageParams} from './HomePage';
|
import {HomePageParams} from './HomePage';
|
||||||
import {DatabaseContext} from './Routes';
|
|
||||||
import Set from './set';
|
import Set from './set';
|
||||||
import SetForm from './SetForm';
|
import SetForm from './SetForm';
|
||||||
import Settings from './settings';
|
import Settings from './settings';
|
||||||
|
|
||||||
export default function EditSet() {
|
export default function EditSet() {
|
||||||
const {params} = useRoute<RouteProp<HomePageParams, 'EditSet'>>();
|
const {params} = useRoute<RouteProp<HomePageParams, 'EditSet'>>();
|
||||||
const db = useContext(DatabaseContext);
|
|
||||||
const navigation = useNavigation();
|
const navigation = useNavigation();
|
||||||
const {toast} = useContext(SnackbarContext);
|
const {toast} = useContext(SnackbarContext);
|
||||||
|
|
||||||
|
@ -42,7 +41,7 @@ export default function EditSet() {
|
||||||
!!settings.vibrate,
|
!!settings.vibrate,
|
||||||
settings.sound,
|
settings.sound,
|
||||||
);
|
);
|
||||||
}, [db]);
|
}, []);
|
||||||
|
|
||||||
const update = useCallback(
|
const update = useCallback(
|
||||||
async (set: Set) => {
|
async (set: Set) => {
|
||||||
|
@ -53,7 +52,7 @@ export default function EditSet() {
|
||||||
);
|
);
|
||||||
navigation.goBack();
|
navigation.goBack();
|
||||||
},
|
},
|
||||||
[db, navigation],
|
[navigation],
|
||||||
);
|
);
|
||||||
|
|
||||||
const add = useCallback(
|
const add = useCallback(
|
||||||
|
@ -75,7 +74,7 @@ export default function EditSet() {
|
||||||
toast("Great work King, that's a new record!", 3000);
|
toast("Great work King, that's a new record!", 3000);
|
||||||
navigation.goBack();
|
navigation.goBack();
|
||||||
},
|
},
|
||||||
[db, navigation, startTimer, params.set, toast],
|
[navigation, startTimer, params.set, toast],
|
||||||
);
|
);
|
||||||
|
|
||||||
const save = useCallback(
|
const save = useCallback(
|
||||||
|
|
|
@ -4,20 +4,19 @@ import {
|
||||||
useNavigation,
|
useNavigation,
|
||||||
useRoute,
|
useRoute,
|
||||||
} from '@react-navigation/native';
|
} from '@react-navigation/native';
|
||||||
import React, {useCallback, useContext, useState} from 'react';
|
import React, {useCallback, useState} from 'react';
|
||||||
import {Image, ScrollView, View} from 'react-native';
|
import {Image, ScrollView, View} from 'react-native';
|
||||||
import DocumentPicker from 'react-native-document-picker';
|
import DocumentPicker from 'react-native-document-picker';
|
||||||
import {Button, IconButton} from 'react-native-paper';
|
import {Button, IconButton} from 'react-native-paper';
|
||||||
import {set} from 'react-native-reanimated';
|
import {set} from 'react-native-reanimated';
|
||||||
|
import {db} from './db';
|
||||||
import MassiveInput from './MassiveInput';
|
import MassiveInput from './MassiveInput';
|
||||||
import {DatabaseContext} from './Routes';
|
|
||||||
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 [uri, setUri] = useState('');
|
const [uri, setUri] = useState('');
|
||||||
const {params} = useRoute<RouteProp<WorkoutsPageParams, 'EditWorkout'>>();
|
const {params} = useRoute<RouteProp<WorkoutsPageParams, 'EditWorkout'>>();
|
||||||
const db = useContext(DatabaseContext);
|
|
||||||
const navigation = useNavigation();
|
const navigation = useNavigation();
|
||||||
|
|
||||||
useFocusEffect(
|
useFocusEffect(
|
||||||
|
@ -32,7 +31,7 @@ export default function EditWorkout() {
|
||||||
db.executeSql(`SELECT image FROM sets WHERE name = ? LIMIT 1`, [
|
db.executeSql(`SELECT image FROM sets WHERE name = ? LIMIT 1`, [
|
||||||
params.value.name,
|
params.value.name,
|
||||||
]).then(([result]) => setUri(result.rows.item(0)?.image));
|
]).then(([result]) => setUri(result.rows.item(0)?.image));
|
||||||
}, [navigation, params.value.name, db]),
|
}, [navigation, params.value.name]),
|
||||||
);
|
);
|
||||||
|
|
||||||
const update = useCallback(async () => {
|
const update = useCallback(async () => {
|
||||||
|
@ -54,7 +53,7 @@ export default function EditWorkout() {
|
||||||
params.value.name,
|
params.value.name,
|
||||||
]);
|
]);
|
||||||
navigation.goBack();
|
navigation.goBack();
|
||||||
}, [db, navigation, params.value.name, name, uri]);
|
}, [navigation, params.value.name, name, uri]);
|
||||||
|
|
||||||
const add = useCallback(async () => {
|
const add = useCallback(async () => {
|
||||||
const insert = `
|
const insert = `
|
||||||
|
@ -63,7 +62,7 @@ export default function EditWorkout() {
|
||||||
`;
|
`;
|
||||||
await db.executeSql(insert, [name]);
|
await db.executeSql(insert, [name]);
|
||||||
navigation.goBack();
|
navigation.goBack();
|
||||||
}, [db, navigation, name]);
|
}, [navigation, name]);
|
||||||
|
|
||||||
const save = useCallback(async () => {
|
const save = useCallback(async () => {
|
||||||
if (params.value.name) return update();
|
if (params.value.name) return update();
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import {NavigationProp, useNavigation} from '@react-navigation/native';
|
import {NavigationProp, useNavigation} from '@react-navigation/native';
|
||||||
import React, {useCallback, useContext, useState} from 'react';
|
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 {db} from './db';
|
||||||
import {Plan} from './plan';
|
import {Plan} from './plan';
|
||||||
import {PlanPageParams} from './PlanPage';
|
import {PlanPageParams} from './PlanPage';
|
||||||
import {DatabaseContext} from './Routes';
|
|
||||||
|
|
||||||
export default function PlanItem({
|
export default function PlanItem({
|
||||||
item,
|
item,
|
||||||
|
@ -15,14 +15,13 @@ export default function PlanItem({
|
||||||
}) {
|
}) {
|
||||||
const [show, setShow] = useState(false);
|
const [show, setShow] = useState(false);
|
||||||
const [anchor, setAnchor] = useState({x: 0, y: 0});
|
const [anchor, setAnchor] = useState({x: 0, y: 0});
|
||||||
const db = useContext(DatabaseContext);
|
|
||||||
const navigation = useNavigation<NavigationProp<PlanPageParams>>();
|
const navigation = useNavigation<NavigationProp<PlanPageParams>>();
|
||||||
|
|
||||||
const remove = useCallback(async () => {
|
const remove = useCallback(async () => {
|
||||||
await db.executeSql(`DELETE FROM plans WHERE id = ?`, [item.id]);
|
await db.executeSql(`DELETE FROM plans WHERE id = ?`, [item.id]);
|
||||||
setShow(false);
|
setShow(false);
|
||||||
onRemove();
|
onRemove();
|
||||||
}, [db, setShow, item.id, onRemove]);
|
}, [setShow, item.id, onRemove]);
|
||||||
|
|
||||||
const longPress = useCallback(
|
const longPress = useCallback(
|
||||||
(e: GestureResponderEvent) => {
|
(e: GestureResponderEvent) => {
|
||||||
|
|
|
@ -3,21 +3,20 @@ import {
|
||||||
useFocusEffect,
|
useFocusEffect,
|
||||||
useNavigation,
|
useNavigation,
|
||||||
} from '@react-navigation/native';
|
} from '@react-navigation/native';
|
||||||
import React, {useCallback, useContext, useEffect, useState} from 'react';
|
import React, {useCallback, useEffect, useState} from 'react';
|
||||||
import {FlatList, StyleSheet, View} from 'react-native';
|
import {FlatList, StyleSheet, View} from 'react-native';
|
||||||
import {List, Searchbar} from 'react-native-paper';
|
import {List, Searchbar} from 'react-native-paper';
|
||||||
|
import {db} from './db';
|
||||||
import DrawerMenu from './DrawerMenu';
|
import DrawerMenu from './DrawerMenu';
|
||||||
import MassiveFab from './MassiveFab';
|
import MassiveFab from './MassiveFab';
|
||||||
import {Plan} from './plan';
|
import {Plan} from './plan';
|
||||||
import PlanItem from './PlanItem';
|
import PlanItem from './PlanItem';
|
||||||
import {PlanPageParams} from './PlanPage';
|
import {PlanPageParams} from './PlanPage';
|
||||||
import {DatabaseContext} from './Routes';
|
|
||||||
|
|
||||||
export default function PlanList() {
|
export default function PlanList() {
|
||||||
const [search, setSearch] = useState('');
|
const [search, setSearch] = useState('');
|
||||||
const [plans, setPlans] = useState<Plan[]>([]);
|
const [plans, setPlans] = useState<Plan[]>([]);
|
||||||
const [refreshing, setRefresing] = useState(false);
|
const [refreshing, setRefresing] = useState(false);
|
||||||
const db = useContext(DatabaseContext);
|
|
||||||
const navigation = useNavigation<NavigationProp<PlanPageParams>>();
|
const navigation = useNavigation<NavigationProp<PlanPageParams>>();
|
||||||
|
|
||||||
const refresh = useCallback(async () => {
|
const refresh = useCallback(async () => {
|
||||||
|
@ -29,7 +28,7 @@ export default function PlanList() {
|
||||||
db.executeSql(selectPlans, [`%${s}%`, `%${s}%`]);
|
db.executeSql(selectPlans, [`%${s}%`, `%${s}%`]);
|
||||||
const [plansResult] = await getPlans({s: search});
|
const [plansResult] = await getPlans({s: search});
|
||||||
setPlans(plansResult.rows.raw());
|
setPlans(plansResult.rows.raw());
|
||||||
}, [search, db]);
|
}, [search]);
|
||||||
|
|
||||||
useFocusEffect(
|
useFocusEffect(
|
||||||
useCallback(() => {
|
useCallback(() => {
|
||||||
|
|
53
Routes.tsx
53
Routes.tsx
|
@ -1,10 +1,9 @@
|
||||||
import React, {useEffect, useState} from 'react';
|
import React, {useEffect, useState} from 'react';
|
||||||
import {useColorScheme} from 'react-native';
|
import {useColorScheme} from 'react-native';
|
||||||
import {IconButton} from 'react-native-paper';
|
import {IconButton} from 'react-native-paper';
|
||||||
import {SQLiteDatabase} from 'react-native-sqlite-storage';
|
|
||||||
import {Drawer, DrawerParamList} from './App';
|
import {Drawer, DrawerParamList} from './App';
|
||||||
import BestPage from './BestPage';
|
import BestPage from './BestPage';
|
||||||
import {getDb} from './db';
|
import {migrations} from './db';
|
||||||
import HomePage from './HomePage';
|
import HomePage from './HomePage';
|
||||||
import PlanPage from './PlanPage';
|
import PlanPage from './PlanPage';
|
||||||
import SettingsPage from './SettingsPage';
|
import SettingsPage from './SettingsPage';
|
||||||
|
@ -16,17 +15,15 @@ interface Route {
|
||||||
icon: string;
|
icon: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const DatabaseContext = React.createContext<SQLiteDatabase>(null as any);
|
|
||||||
|
|
||||||
export default function Routes() {
|
export default function Routes() {
|
||||||
const [db, setDb] = useState<SQLiteDatabase | null>(null);
|
const [migrated, setMigrated] = useState(false);
|
||||||
const dark = useColorScheme() === 'dark';
|
const dark = useColorScheme() === 'dark';
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
getDb().then(setDb);
|
migrations().then(() => setMigrated(true));
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
if (!db) return null;
|
if (!migrated) return null;
|
||||||
|
|
||||||
const routes: Route[] = [
|
const routes: Route[] = [
|
||||||
{name: 'Home', component: HomePage, icon: 'home'},
|
{name: 'Home', component: HomePage, icon: 'home'},
|
||||||
|
@ -37,27 +34,25 @@ export default function Routes() {
|
||||||
];
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DatabaseContext.Provider value={db}>
|
<Drawer.Navigator
|
||||||
<Drawer.Navigator
|
screenOptions={{
|
||||||
screenOptions={{
|
headerTintColor: dark ? 'white' : 'black',
|
||||||
headerTintColor: dark ? 'white' : 'black',
|
swipeEdgeWidth: 1000,
|
||||||
swipeEdgeWidth: 1000,
|
}}>
|
||||||
}}>
|
{routes.map(route => (
|
||||||
{routes.map(route => (
|
<Drawer.Screen
|
||||||
<Drawer.Screen
|
key={route.name}
|
||||||
key={route.name}
|
name={route.name}
|
||||||
name={route.name}
|
component={route.component}
|
||||||
component={route.component}
|
options={{
|
||||||
options={{
|
drawerIcon: ({focused}) => (
|
||||||
drawerIcon: ({focused}) => (
|
<IconButton
|
||||||
<IconButton
|
icon={focused ? route.icon : `${route.icon}-outline`}
|
||||||
icon={focused ? route.icon : `${route.icon}-outline`}
|
/>
|
||||||
/>
|
),
|
||||||
),
|
}}
|
||||||
}}
|
/>
|
||||||
/>
|
))}
|
||||||
))}
|
</Drawer.Navigator>
|
||||||
</Drawer.Navigator>
|
|
||||||
</DatabaseContext.Provider>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import React, {useContext, useEffect, useRef, useState} from 'react';
|
import React, {useEffect, useRef, useState} from 'react';
|
||||||
import {ScrollView} from 'react-native';
|
import {ScrollView} from 'react-native';
|
||||||
import {Button, Text} from 'react-native-paper';
|
import {Button, Text} from 'react-native-paper';
|
||||||
|
import {db} from './db';
|
||||||
import MassiveInput from './MassiveInput';
|
import MassiveInput from './MassiveInput';
|
||||||
import {DatabaseContext} from './Routes';
|
|
||||||
import Set from './set';
|
import Set from './set';
|
||||||
|
|
||||||
export default function SetForm({
|
export default function SetForm({
|
||||||
|
@ -25,7 +25,6 @@ export default function SetForm({
|
||||||
});
|
});
|
||||||
const weightRef = useRef<any>(null);
|
const weightRef = useRef<any>(null);
|
||||||
const repsRef = useRef<any>(null);
|
const repsRef = useRef<any>(null);
|
||||||
const db = useContext(DatabaseContext);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
console.log('SetForm.useEffect:', {uri, name: set.name});
|
console.log('SetForm.useEffect:', {uri, name: set.name});
|
||||||
|
@ -33,7 +32,7 @@ export default function SetForm({
|
||||||
db.executeSql(`SELECT image FROM sets WHERE name = ? LIMIT 1`, [
|
db.executeSql(`SELECT image FROM sets WHERE name = ? LIMIT 1`, [
|
||||||
set.name,
|
set.name,
|
||||||
]).then(([result]) => setUri(result.rows.item(0)?.image));
|
]).then(([result]) => setUri(result.rows.item(0)?.image));
|
||||||
}, [uri, db, set.name]);
|
}, [uri, set.name]);
|
||||||
|
|
||||||
const handleSubmit = () => {
|
const handleSubmit = () => {
|
||||||
if (!name) return;
|
if (!name) return;
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import {NavigationProp, useNavigation} from '@react-navigation/native';
|
import {NavigationProp, useNavigation} from '@react-navigation/native';
|
||||||
import React, {useCallback, useContext, useState} from 'react';
|
import React, {useCallback, useState} from 'react';
|
||||||
import {GestureResponderEvent, Image} from 'react-native';
|
import {GestureResponderEvent, Image} from 'react-native';
|
||||||
import {Divider, List, Menu, Text} from 'react-native-paper';
|
import {Divider, List, Menu, Text} from 'react-native-paper';
|
||||||
|
import {db} from './db';
|
||||||
import {HomePageParams} from './HomePage';
|
import {HomePageParams} from './HomePage';
|
||||||
import {DatabaseContext} from './Routes';
|
|
||||||
import Set from './set';
|
import Set from './set';
|
||||||
|
|
||||||
export default function SetItem({
|
export default function SetItem({
|
||||||
|
@ -23,14 +23,13 @@ export default function SetItem({
|
||||||
}) {
|
}) {
|
||||||
const [showMenu, setShowMenu] = useState(false);
|
const [showMenu, setShowMenu] = useState(false);
|
||||||
const [anchor, setAnchor] = useState({x: 0, y: 0});
|
const [anchor, setAnchor] = useState({x: 0, y: 0});
|
||||||
const db = useContext(DatabaseContext);
|
|
||||||
const navigation = useNavigation<NavigationProp<HomePageParams>>();
|
const navigation = useNavigation<NavigationProp<HomePageParams>>();
|
||||||
|
|
||||||
const remove = useCallback(async () => {
|
const remove = useCallback(async () => {
|
||||||
await db.executeSql(`DELETE FROM sets WHERE id = ?`, [item.id]);
|
await db.executeSql(`DELETE FROM sets WHERE id = ?`, [item.id]);
|
||||||
setShowMenu(false);
|
setShowMenu(false);
|
||||||
onRemove();
|
onRemove();
|
||||||
}, [setShowMenu, db, onRemove, item.id]);
|
}, [setShowMenu, onRemove, item.id]);
|
||||||
|
|
||||||
const copy = useCallback(() => {
|
const copy = useCallback(() => {
|
||||||
const set: Set = {...item};
|
const set: Set = {...item};
|
||||||
|
|
|
@ -3,14 +3,14 @@ import {
|
||||||
useFocusEffect,
|
useFocusEffect,
|
||||||
useNavigation,
|
useNavigation,
|
||||||
} from '@react-navigation/native';
|
} from '@react-navigation/native';
|
||||||
import React, {useCallback, useContext, useEffect, useState} from 'react';
|
import React, {useCallback, useEffect, useState} from 'react';
|
||||||
import {FlatList, StyleSheet, View} from 'react-native';
|
import {FlatList, StyleSheet, View} from 'react-native';
|
||||||
import {List, Searchbar} from 'react-native-paper';
|
import {List, Searchbar} from 'react-native-paper';
|
||||||
|
import {db} from './db';
|
||||||
import DrawerMenu from './DrawerMenu';
|
import DrawerMenu from './DrawerMenu';
|
||||||
import {HomePageParams} from './HomePage';
|
import {HomePageParams} from './HomePage';
|
||||||
import MassiveFab from './MassiveFab';
|
import MassiveFab from './MassiveFab';
|
||||||
import {Plan} from './plan';
|
import {Plan} from './plan';
|
||||||
import {DatabaseContext} from './Routes';
|
|
||||||
import Set from './set';
|
import Set from './set';
|
||||||
import SetItem from './SetItem';
|
import SetItem from './SetItem';
|
||||||
import Settings from './settings';
|
import Settings from './settings';
|
||||||
|
@ -35,7 +35,6 @@ export default function SetList() {
|
||||||
const [end, setEnd] = useState(false);
|
const [end, setEnd] = useState(false);
|
||||||
const [dates, setDates] = useState(false);
|
const [dates, setDates] = useState(false);
|
||||||
const [images, setImages] = useState(true);
|
const [images, setImages] = useState(true);
|
||||||
const db = useContext(DatabaseContext);
|
|
||||||
const navigation = useNavigation<NavigationProp<HomePageParams>>();
|
const navigation = useNavigation<NavigationProp<HomePageParams>>();
|
||||||
|
|
||||||
const selectSets = `
|
const selectSets = `
|
||||||
|
@ -52,7 +51,7 @@ export default function SetList() {
|
||||||
setSets(result.rows.raw());
|
setSets(result.rows.raw());
|
||||||
setOffset(0);
|
setOffset(0);
|
||||||
setEnd(false);
|
setEnd(false);
|
||||||
}, [search, db, selectSets]);
|
}, [search, selectSets]);
|
||||||
|
|
||||||
const refreshLoader = useCallback(async () => {
|
const refreshLoader = useCallback(async () => {
|
||||||
setRefreshing(true);
|
setRefreshing(true);
|
||||||
|
|
|
@ -10,9 +10,9 @@ import DocumentPicker from 'react-native-document-picker';
|
||||||
import {Button, Searchbar, Text} from 'react-native-paper';
|
import {Button, Searchbar, Text} from 'react-native-paper';
|
||||||
import {SnackbarContext} from './App';
|
import {SnackbarContext} from './App';
|
||||||
import ConfirmDialog from './ConfirmDialog';
|
import ConfirmDialog from './ConfirmDialog';
|
||||||
|
import {db} from './db';
|
||||||
import MassiveInput from './MassiveInput';
|
import MassiveInput from './MassiveInput';
|
||||||
import MassiveSwitch from './MassiveSwitch';
|
import MassiveSwitch from './MassiveSwitch';
|
||||||
import {DatabaseContext} from './Routes';
|
|
||||||
import Settings from './settings';
|
import Settings from './settings';
|
||||||
|
|
||||||
export default function SettingsPage() {
|
export default function SettingsPage() {
|
||||||
|
@ -28,7 +28,6 @@ export default function SettingsPage() {
|
||||||
const [battery, setBattery] = useState(false);
|
const [battery, setBattery] = useState(false);
|
||||||
const [ignoring, setIgnoring] = useState(false);
|
const [ignoring, setIgnoring] = useState(false);
|
||||||
const [search, setSearch] = useState('');
|
const [search, setSearch] = useState('');
|
||||||
const db = useContext(DatabaseContext);
|
|
||||||
const {toast} = useContext(SnackbarContext);
|
const {toast} = useContext(SnackbarContext);
|
||||||
|
|
||||||
const refresh = useCallback(async () => {
|
const refresh = useCallback(async () => {
|
||||||
|
@ -45,7 +44,7 @@ export default function SettingsPage() {
|
||||||
setNotify(!!settings.notify);
|
setNotify(!!settings.notify);
|
||||||
setImages(!!settings.images);
|
setImages(!!settings.images);
|
||||||
NativeModules.AlarmModule.ignoringBattery(setIgnoring);
|
NativeModules.AlarmModule.ignoringBattery(setIgnoring);
|
||||||
}, [db]);
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
refresh();
|
refresh();
|
||||||
|
@ -75,7 +74,6 @@ export default function SettingsPage() {
|
||||||
predict,
|
predict,
|
||||||
sound,
|
sound,
|
||||||
notify,
|
notify,
|
||||||
db,
|
|
||||||
images,
|
images,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
17
ViewBest.tsx
17
ViewBest.tsx
|
@ -4,13 +4,7 @@ import {
|
||||||
useNavigation,
|
useNavigation,
|
||||||
useRoute,
|
useRoute,
|
||||||
} from '@react-navigation/native';
|
} from '@react-navigation/native';
|
||||||
import React, {
|
import React, {useCallback, useEffect, useRef, useState} from 'react';
|
||||||
useCallback,
|
|
||||||
useContext,
|
|
||||||
useEffect,
|
|
||||||
useRef,
|
|
||||||
useState,
|
|
||||||
} from 'react';
|
|
||||||
import {FileSystem} from 'react-native-file-access';
|
import {FileSystem} from 'react-native-file-access';
|
||||||
import {IconButton} from 'react-native-paper';
|
import {IconButton} from 'react-native-paper';
|
||||||
import RNPickerSelect from 'react-native-picker-select';
|
import RNPickerSelect from 'react-native-picker-select';
|
||||||
|
@ -18,7 +12,7 @@ import Share from 'react-native-share';
|
||||||
import ViewShot from 'react-native-view-shot';
|
import ViewShot from 'react-native-view-shot';
|
||||||
import {BestPageParams} from './BestPage';
|
import {BestPageParams} from './BestPage';
|
||||||
import Chart from './Chart';
|
import Chart from './Chart';
|
||||||
import {DatabaseContext} from './Routes';
|
import {db} from './db';
|
||||||
import Set from './set';
|
import Set from './set';
|
||||||
import {formatMonth} from './time';
|
import {formatMonth} from './time';
|
||||||
|
|
||||||
|
@ -46,7 +40,6 @@ export default function ViewBest() {
|
||||||
const [volumes, setVolumes] = useState<Volume[]>([]);
|
const [volumes, setVolumes] = useState<Volume[]>([]);
|
||||||
const [metric, setMetric] = useState(Metrics.Weight);
|
const [metric, setMetric] = useState(Metrics.Weight);
|
||||||
const [period, setPeriod] = useState(Periods.Monthly);
|
const [period, setPeriod] = useState(Periods.Monthly);
|
||||||
const db = useContext(DatabaseContext);
|
|
||||||
const navigation = useNavigation();
|
const navigation = useNavigation();
|
||||||
const viewShot = useRef<ViewShot>(null);
|
const viewShot = useRef<ViewShot>(null);
|
||||||
|
|
||||||
|
@ -97,7 +90,7 @@ export default function ViewBest() {
|
||||||
]);
|
]);
|
||||||
if (result.rows.length === 0) return;
|
if (result.rows.length === 0) return;
|
||||||
setWeights(result.rows.raw());
|
setWeights(result.rows.raw());
|
||||||
}, [params.best.name, db, period]);
|
}, [params.best.name, period]);
|
||||||
|
|
||||||
const refreshVolume = useCallback(async () => {
|
const refreshVolume = useCallback(async () => {
|
||||||
const select = `
|
const select = `
|
||||||
|
@ -117,13 +110,13 @@ export default function ViewBest() {
|
||||||
]);
|
]);
|
||||||
if (result.rows.length === 0) return;
|
if (result.rows.length === 0) return;
|
||||||
setVolumes(result.rows.raw());
|
setVolumes(result.rows.raw());
|
||||||
}, [db, params.best.name, period]);
|
}, [params.best.name, period]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (metric === Metrics.Weight) refreshWeight();
|
if (metric === Metrics.Weight) refreshWeight();
|
||||||
else if (metric === Metrics.Volume) refreshVolume();
|
else if (metric === Metrics.Volume) refreshVolume();
|
||||||
console.log(`${ViewBest.name}.useEffect`, {metric, period});
|
console.log(`${ViewBest.name}.useEffect`, {metric, period});
|
||||||
}, [params.best.name, db, metric, period, refreshVolume, refreshWeight]);
|
}, [params.best.name, metric, period, refreshVolume, refreshWeight]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ViewShot style={{padding: 10}} ref={viewShot}>
|
<ViewShot style={{padding: 10}} ref={viewShot}>
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import {NavigationProp, useNavigation} from '@react-navigation/native';
|
import {NavigationProp, useNavigation} from '@react-navigation/native';
|
||||||
import React, {useCallback, useContext, useEffect, useState} from 'react';
|
import React, {useCallback, useEffect, useState} from 'react';
|
||||||
import {GestureResponderEvent, Image} from 'react-native';
|
import {GestureResponderEvent, Image} from 'react-native';
|
||||||
import {List, Menu, Text} from 'react-native-paper';
|
import {List, Menu, Text} from 'react-native-paper';
|
||||||
import ConfirmDialog from './ConfirmDialog';
|
import ConfirmDialog from './ConfirmDialog';
|
||||||
import {DatabaseContext} from './Routes';
|
import {db} from './db';
|
||||||
import Workout from './workout';
|
import Workout from './workout';
|
||||||
import {WorkoutsPageParams} from './WorkoutsPage';
|
import {WorkoutsPageParams} from './WorkoutsPage';
|
||||||
|
|
||||||
|
@ -18,7 +18,6 @@ export default function WorkoutItem({
|
||||||
const [anchor, setAnchor] = useState({x: 0, y: 0});
|
const [anchor, setAnchor] = useState({x: 0, y: 0});
|
||||||
const [showRemove, setShowRemove] = useState('');
|
const [showRemove, setShowRemove] = useState('');
|
||||||
const [uri, setUri] = useState('');
|
const [uri, setUri] = useState('');
|
||||||
const db = useContext(DatabaseContext);
|
|
||||||
const navigation = useNavigation<NavigationProp<WorkoutsPageParams>>();
|
const navigation = useNavigation<NavigationProp<WorkoutsPageParams>>();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
@ -28,13 +27,13 @@ export default function WorkoutItem({
|
||||||
setUri(result.rows.item(0)?.image);
|
setUri(result.rows.item(0)?.image);
|
||||||
console.log(WorkoutItem.name, item.name, result.rows.item(0)?.image);
|
console.log(WorkoutItem.name, item.name, result.rows.item(0)?.image);
|
||||||
});
|
});
|
||||||
}, [db, item.name]);
|
}, [item.name]);
|
||||||
|
|
||||||
const remove = useCallback(async () => {
|
const remove = useCallback(async () => {
|
||||||
await db.executeSql(`DELETE FROM sets WHERE name = ?`, [item.name]);
|
await db.executeSql(`DELETE FROM sets WHERE name = ?`, [item.name]);
|
||||||
setShowMenu(false);
|
setShowMenu(false);
|
||||||
onRemoved();
|
onRemoved();
|
||||||
}, [setShowMenu, db, onRemoved, item.name]);
|
}, [setShowMenu, onRemoved, item.name]);
|
||||||
|
|
||||||
const longPress = useCallback(
|
const longPress = useCallback(
|
||||||
(e: GestureResponderEvent) => {
|
(e: GestureResponderEvent) => {
|
||||||
|
|
|
@ -3,11 +3,11 @@ import {
|
||||||
useFocusEffect,
|
useFocusEffect,
|
||||||
useNavigation,
|
useNavigation,
|
||||||
} from '@react-navigation/native';
|
} from '@react-navigation/native';
|
||||||
import React, {useCallback, useContext, useEffect, useState} from 'react';
|
import React, {useCallback, useEffect, useState} from 'react';
|
||||||
import {FlatList, StyleSheet, View} from 'react-native';
|
import {FlatList, StyleSheet, View} from 'react-native';
|
||||||
import {List, Searchbar} from 'react-native-paper';
|
import {List, Searchbar} from 'react-native-paper';
|
||||||
|
import {db} from './db';
|
||||||
import MassiveFab from './MassiveFab';
|
import MassiveFab from './MassiveFab';
|
||||||
import {DatabaseContext} from './Routes';
|
|
||||||
import SetList from './SetList';
|
import SetList from './SetList';
|
||||||
import Workout from './workout';
|
import Workout from './workout';
|
||||||
import WorkoutItem from './WorkoutItem';
|
import WorkoutItem from './WorkoutItem';
|
||||||
|
@ -21,7 +21,6 @@ export default function WorkoutList() {
|
||||||
const [search, setSearch] = useState('');
|
const [search, setSearch] = useState('');
|
||||||
const [refreshing, setRefreshing] = useState(false);
|
const [refreshing, setRefreshing] = useState(false);
|
||||||
const [end, setEnd] = useState(false);
|
const [end, setEnd] = useState(false);
|
||||||
const db = useContext(DatabaseContext);
|
|
||||||
const navigation = useNavigation<NavigationProp<WorkoutsPageParams>>();
|
const navigation = useNavigation<NavigationProp<WorkoutsPageParams>>();
|
||||||
|
|
||||||
const select = `
|
const select = `
|
||||||
|
@ -39,7 +38,7 @@ export default function WorkoutList() {
|
||||||
setWorkouts(result.rows.raw());
|
setWorkouts(result.rows.raw());
|
||||||
setOffset(0);
|
setOffset(0);
|
||||||
setEnd(false);
|
setEnd(false);
|
||||||
}, [search, db, select]);
|
}, [search, select]);
|
||||||
|
|
||||||
const refreshLoader = useCallback(async () => {
|
const refreshLoader = useCallback(async () => {
|
||||||
setRefreshing(true);
|
setRefreshing(true);
|
||||||
|
@ -81,7 +80,7 @@ export default function WorkoutList() {
|
||||||
setWorkouts([...workouts, ...result.rows.raw()]);
|
setWorkouts([...workouts, ...result.rows.raw()]);
|
||||||
if (result.rows.length < limit) return setEnd(true);
|
if (result.rows.length < limit) return setEnd(true);
|
||||||
setOffset(newOffset);
|
setOffset(newOffset);
|
||||||
}, [search, end, offset, workouts, db, select]);
|
}, [search, end, offset, workouts, select]);
|
||||||
|
|
||||||
const onAdd = useCallback(async () => {
|
const onAdd = useCallback(async () => {
|
||||||
navigation.navigate('EditWorkout', {
|
navigation.navigate('EditWorkout', {
|
||||||
|
|
12
db.ts
12
db.ts
|
@ -1,4 +1,8 @@
|
||||||
import {enablePromise, openDatabase} from 'react-native-sqlite-storage';
|
import {
|
||||||
|
enablePromise,
|
||||||
|
openDatabase,
|
||||||
|
SQLiteDatabase,
|
||||||
|
} from 'react-native-sqlite-storage';
|
||||||
|
|
||||||
enablePromise(true);
|
enablePromise(true);
|
||||||
|
|
||||||
|
@ -67,8 +71,10 @@ const insertSettings = `
|
||||||
INSERT INTO settings(minutes) VALUES(3);
|
INSERT INTO settings(minutes) VALUES(3);
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export const getDb = async () => {
|
export let db: SQLiteDatabase;
|
||||||
const db = await openDatabase({name: 'massive.db'});
|
|
||||||
|
export const migrations = async () => {
|
||||||
|
db = await openDatabase({name: 'massive.db'});
|
||||||
await db.executeSql(createPlans);
|
await db.executeSql(createPlans);
|
||||||
await db.executeSql(createSets);
|
await db.executeSql(createSets);
|
||||||
await db.executeSql(createSettings);
|
await db.executeSql(createSettings);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user