Massive/App.tsx

106 lines
3.0 KiB
TypeScript
Raw Normal View History

import {createDrawerNavigator} from '@react-navigation/drawer';
2022-06-30 06:50:52 +00:00
import {
2022-07-15 06:06:33 +00:00
DarkTheme as NavigationDarkTheme,
DefaultTheme as NavigationDefaultTheme,
2022-07-03 01:50:01 +00:00
NavigationContainer,
} from '@react-navigation/native';
import React, {useEffect, useState} from 'react';
2022-07-05 12:06:16 +00:00
import {StatusBar, useColorScheme} from 'react-native';
import {
2022-07-15 06:06:33 +00:00
DarkTheme as PaperDarkTheme,
DefaultTheme as PaperDefaultTheme,
Provider,
Snackbar,
} from 'react-native-paper';
import {SQLiteDatabase} from 'react-native-sqlite-storage';
import Ionicon from 'react-native-vector-icons/Ionicons';
import {addSound, createPlans, createSets, createSettings, getDb} from './db';
2022-07-15 04:34:06 +00:00
import Routes from './Routes';
2022-07-03 01:50:01 +00:00
2022-07-15 04:34:06 +00:00
export const Drawer = createDrawerNavigator<DrawerParamList>();
export type DrawerParamList = {
2022-07-03 01:50:01 +00:00
Home: {};
Settings: {};
Best: {};
2022-07-11 00:28:30 +00:00
Plans: {};
2022-07-03 01:50:01 +00:00
};
export const DatabaseContext = React.createContext<SQLiteDatabase>({} as any);
export const SnackbarContext = React.createContext<{
toast: (value: string, timeout: number) => void;
}>({toast: () => null});
2022-06-30 06:50:52 +00:00
2022-07-15 06:06:33 +00:00
const CombinedDefaultTheme = {
...PaperDefaultTheme,
...NavigationDefaultTheme,
colors: {
...PaperDefaultTheme.colors,
...NavigationDefaultTheme.colors,
},
};
const CombinedDarkTheme = {
...PaperDarkTheme,
...NavigationDarkTheme,
colors: {
...PaperDarkTheme.colors,
...NavigationDarkTheme.colors,
},
};
2022-07-01 01:42:42 +00:00
const App = () => {
const [db, setDb] = useState<SQLiteDatabase | null>(null);
const [snackbar, setSnackbar] = useState('');
2022-07-01 01:42:42 +00:00
const dark = useColorScheme() === 'dark';
2022-07-03 01:50:01 +00:00
useEffect(() => {
2022-07-09 01:27:19 +00:00
const init = async () => {
const _db = await getDb();
await _db.executeSql(createPlans);
await _db.executeSql(createSets);
await _db.executeSql(createSettings);
await _db.executeSql(addSound).catch(() => null);
setDb(_db);
const [result] = await _db.executeSql(`SELECT * FROM settings LIMIT 1`);
if (result.rows.length === 0)
return _db.executeSql(`
INSERT INTO settings(minutes,seconds,alarm,vibrate,predict,sets)
VALUES(3,30,false,true,true,3);
`);
2022-07-09 01:27:19 +00:00
};
init();
2022-07-03 01:50:01 +00:00
}, []);
2022-06-30 06:50:52 +00:00
const toast = (value: string, timeout: number) => {
setSnackbar(value);
setTimeout(() => setSnackbar(''), timeout);
};
2022-06-30 06:50:52 +00:00
return (
<Provider
2022-07-15 06:06:33 +00:00
theme={dark ? CombinedDarkTheme : CombinedDefaultTheme}
settings={{icon: props => <Ionicon {...props} />}}>
2022-07-15 06:06:33 +00:00
<NavigationContainer
theme={dark ? CombinedDarkTheme : CombinedDefaultTheme}>
<StatusBar barStyle={dark ? 'light-content' : 'dark-content'} />
<SnackbarContext.Provider value={{toast}}>
<Routes db={db} />
</SnackbarContext.Provider>
</NavigationContainer>
<Snackbar
onDismiss={() => setSnackbar('')}
visible={!!snackbar}
action={{
label: 'Close',
onPress: () => setSnackbar(''),
color: dark
? CombinedDarkTheme.colors.primary
: CombinedDefaultTheme.colors.primary,
}}>
{snackbar}
</Snackbar>
</Provider>
2022-06-30 06:50:52 +00:00
);
};
export default App;