Massive/App.tsx

96 lines
2.7 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'
import {useEffect, useMemo, useState} from 'react'
import {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,
2022-10-31 04:22:08 +00:00
} from 'react-native-paper'
import MaterialIcon from 'react-native-vector-icons/MaterialIcons'
import {Color} from './color'
import {lightColors} from './colors'
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 MassiveSnack from './MassiveSnack'
import Routes from './Routes'
import Settings from './settings'
import {SettingsContext} from './use-settings'
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,
primary: lightColors[0].hex,
background: '#0E0E0E',
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'
const [settings, setSettings] = useState<Settings>()
const [color, setColor] = useState(
isDark
? CombinedDarkTheme.colors.primary.toUpperCase()
: CombinedDefaultTheme.colors.primary.toUpperCase(),
2022-10-31 04:22:08 +00:00
)
useEffect(() => {
2022-10-31 05:16:11 +00:00
AppDataSource.initialize().then(async () => {
2022-10-31 04:22:08 +00:00
const gotSettings = await settingsRepo.findOne({where: {}})
2022-10-31 05:16:11 +00:00
console.log(`${App.name}.useEffect:`, {gotSettings})
2022-10-31 04:22:08 +00:00
setSettings(gotSettings)
if (gotSettings.color) setColor(gotSettings.color)
})
}, [setColor])
const theme = useMemo(() => {
const darkTheme = {
...CombinedDarkTheme,
colors: {...CombinedDarkTheme.colors, primary: color},
2022-10-31 04:22:08 +00:00
}
const lightTheme = {
...CombinedDefaultTheme,
colors: {...CombinedDefaultTheme.colors, primary: color},
2022-10-31 04:22:08 +00:00
}
let value = isDark ? darkTheme : lightTheme
if (settings?.theme === 'dark') value = darkTheme
else if (settings?.theme === 'light') value = lightTheme
return value
}, [color, isDark, settings])
2022-06-30 06:50:52 +00:00
return (
<Color.Provider value={{color, setColor}}>
2022-10-29 23:56:58 +00:00
<PaperProvider
theme={theme}
settings={{icon: props => <MaterialIcon {...props} />}}>
<NavigationContainer theme={theme}>
<MassiveSnack>
{settings && (
<SettingsContext.Provider value={{settings, setSettings}}>
<Routes />
</SettingsContext.Provider>
)}
</MassiveSnack>
</NavigationContainer>
2022-10-29 23:56:58 +00:00
</PaperProvider>
</Color.Provider>
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