Massive/App.tsx

131 lines
3.4 KiB
TypeScript
Raw Normal View History

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,
2022-10-31 04:22:08 +00:00
} from '@react-navigation/native'
2023-01-01 02:20:56 +00:00
import React, {useEffect, useMemo, useState} from 'react'
import {DeviceEventEmitter, useColorScheme} from 'react-native'
import {
2022-07-15 06:06:33 +00:00
DarkTheme as PaperDarkTheme,
DefaultTheme as PaperDefaultTheme,
2022-10-29 23:56:58 +00:00
Provider as PaperProvider,
Snackbar,
2022-10-31 04:22:08 +00:00
} from 'react-native-paper'
import MaterialIcon from 'react-native-vector-icons/MaterialIcons'
2022-10-31 05:16:11 +00:00
import {AppDataSource} from './data-source'
import {settingsRepo} from './db'
2022-10-31 04:22:08 +00:00
import Routes from './Routes'
import {TOAST} from './toast'
import {ThemeContext} from './use-theme'
2022-07-03 01:50:01 +00:00
2022-08-26 01:54:51 +00:00
export const CombinedDefaultTheme = {
2022-07-15 06:06:33 +00:00
...NavigationDefaultTheme,
...PaperDefaultTheme,
2022-07-15 06:06:33 +00:00
colors: {
...NavigationDefaultTheme.colors,
...PaperDefaultTheme.colors,
2022-07-15 06:06:33 +00:00
},
2022-10-31 04:22:08 +00:00
}
2022-08-26 01:54:51 +00:00
export const CombinedDarkTheme = {
2022-07-15 06:06:33 +00:00
...NavigationDarkTheme,
...PaperDarkTheme,
2022-07-15 06:06:33 +00:00
colors: {
...NavigationDarkTheme.colors,
...PaperDarkTheme.colors,
2022-07-15 06:06:33 +00:00
},
2022-10-31 04:22:08 +00:00
}
2022-07-15 06:06:33 +00:00
2022-07-01 01:42:42 +00:00
const App = () => {
2022-10-31 04:22:08 +00:00
const isDark = useColorScheme() === 'dark'
2022-10-31 08:00:10 +00:00
const [initialized, setInitialized] = useState(false)
2022-11-01 03:11:39 +00:00
const [snackbar, setSnackbar] = useState('')
const [theme, setTheme] = useState('system')
2022-11-01 03:11:39 +00:00
const [lightColor, setLightColor] = useState<string>(
CombinedDefaultTheme.colors.primary,
)
const [darkColor, setDarkColor] = useState<string>(
CombinedDarkTheme.colors.primary,
)
useEffect(() => {
;(async () => {
if (!AppDataSource.isInitialized) await AppDataSource.initialize()
const settings = await settingsRepo.findOne({where: {}})
setTheme(settings.theme)
if (settings.lightColor) setLightColor(settings.lightColor)
if (settings.darkColor) setDarkColor(settings.darkColor)
setInitialized(true)
})()
const description = DeviceEventEmitter.addListener(
TOAST,
({value}: {value: string}) => {
setSnackbar(value)
},
)
return description.remove
}, [])
const paperTheme = useMemo(() => {
const darkTheme = lightColor
? {
...CombinedDarkTheme,
colors: {...CombinedDarkTheme.colors, primary: darkColor},
}
: CombinedDarkTheme
const lightTheme = lightColor
? {
...CombinedDefaultTheme,
colors: {...CombinedDefaultTheme.colors, primary: lightColor},
}
: CombinedDefaultTheme
2022-10-31 04:22:08 +00:00
let value = isDark ? darkTheme : lightTheme
if (theme === 'dark') value = darkTheme
else if (theme === 'light') value = lightTheme
2022-10-31 04:22:08 +00:00
return value
}, [isDark, theme, lightColor, darkColor])
2022-10-31 08:00:10 +00:00
2022-11-01 03:08:02 +00:00
const action = useMemo(
() => ({
label: 'Close',
onPress: () => setSnackbar(''),
2022-11-02 00:39:51 +00:00
color: paperTheme.colors.background,
2022-11-01 03:08:02 +00:00
}),
2022-11-02 00:39:51 +00:00
[paperTheme.colors.background],
2022-11-01 03:08:02 +00:00
)
2022-06-30 06:50:52 +00:00
return (
<PaperProvider
theme={paperTheme}
settings={{icon: props => <MaterialIcon {...props} />}}>
<NavigationContainer theme={paperTheme}>
{initialized && (
<ThemeContext.Provider
value={{
theme,
setTheme,
lightColor,
setLightColor,
darkColor,
setDarkColor,
}}>
<Routes />
</ThemeContext.Provider>
)}
</NavigationContainer>
<Snackbar
duration={3000}
onDismiss={() => setSnackbar('')}
visible={!!snackbar}
2022-11-01 03:08:02 +00:00
action={action}>
{snackbar}
</Snackbar>
</PaperProvider>
2022-10-31 04:22:08 +00:00
)
}
2022-06-30 06:50:52 +00:00
2022-10-31 04:22:08 +00:00
export default App