skolplattformen-backup/apps/skolplattformen-app/App.tsx

109 lines
3.6 KiB
TypeScript
Raw Normal View History

2020-12-20 23:03:49 +00:00
import * as eva from '@eva-design/eva'
import AsyncStorage from '@react-native-async-storage/async-storage'
2021-11-24 06:17:44 +00:00
import { ApiProvider, Reporter } from '@skolplattformen/hooks'
import { ApplicationProvider, IconRegistry, Text } from '@ui-kitten/components'
import { EvaIconsPack } from '@ui-kitten/eva-icons'
2021-11-24 06:17:44 +00:00
import React from 'react'
import { StatusBar, useColorScheme, View } from 'react-native'
import { SafeAreaProvider } from 'react-native-safe-area-context'
import { AppNavigator } from './components/navigation.component'
2021-11-24 06:17:44 +00:00
import { FeatureProvider } from './context/feature/featureContext'
import { LanguageProvider } from './context/language/languageContext'
2021-11-12 20:42:53 +00:00
import { SchoolPlatformProvider } from './context/schoolPlatform/schoolPlatformContext'
2021-11-24 06:17:44 +00:00
import { schoolPlatforms } from './data/schoolPlatforms'
import { default as customMapping } from './design/mapping.json'
import { darkTheme, lightTheme } from './design/themes'
import useSettingsStorage from './hooks/useSettingsStorage'
import { translations } from './utils/translation'
2021-11-12 20:42:53 +00:00
const reporter: Reporter | undefined = __DEV__
? {
2021-11-12 20:42:53 +00:00
log: (message: string) => console.log(message),
2021-12-02 22:58:57 +00:00
error: (error: Error, label?: string) => console.log(label, error),
}
2021-10-06 20:47:50 +00:00
: undefined
if (__DEV__) {
2021-11-12 20:42:53 +00:00
// eslint-disable-next-line @typescript-eslint/no-var-requires
const DevMenu = require('react-native-dev-menu')
DevMenu.addItem('Clear AsyncStorage from all contents', () =>
AsyncStorage.clear().then(() => logAsyncStorage())
)
DevMenu.addItem('Log AsyncStorage contents', () => logAsyncStorage())
}
2021-11-12 20:42:53 +00:00
const safeJsonParse = (maybeJson: string) => {
if (maybeJson) {
try {
return JSON.parse(maybeJson)
} catch (error) {
return maybeJson
}
}
return 'null'
}
const logAsyncStorage = async () => {
const allKeys = await AsyncStorage.getAllKeys()
const keysAndValues = await AsyncStorage.multiGet(allKeys)
console.log('*** AsyncStorage contents:')
keysAndValues.forEach((keyAndValue) => {
console.log(
keyAndValue[0],
'=>',
keyAndValue[1] ? safeJsonParse(keyAndValue[1]) : 'null'
)
})
console.log('***')
}
2020-12-20 19:18:05 +00:00
export default () => {
const [usingSystemTheme] = useSettingsStorage('usingSystemTheme')
2021-11-12 20:42:53 +00:00
const [currentSchoolPlatform] = useSettingsStorage('currentSchoolPlatform')
const [theme] = useSettingsStorage('theme')
const systemTheme = useColorScheme()
const colorScheme = usingSystemTheme ? systemTheme : theme
2021-11-12 20:42:53 +00:00
2021-11-24 06:17:44 +00:00
const platform = schoolPlatforms.find((pf) => pf.id === currentSchoolPlatform)
if (!platform)
return (
<View>
<Text>ERROR</Text>
</View>
)
2021-11-12 20:42:53 +00:00
2020-12-20 19:18:05 +00:00
return (
2021-11-24 06:17:44 +00:00
<FeatureProvider features={platform.features}>
2021-11-22 09:47:11 +00:00
<SchoolPlatformProvider>
2021-11-24 06:17:44 +00:00
<ApiProvider
api={platform.api}
storage={AsyncStorage}
reporter={reporter}
>
2021-11-22 09:47:11 +00:00
<SafeAreaProvider>
<StatusBar
backgroundColor={colorScheme === 'dark' ? '#2E3137' : '#FFF'}
barStyle={
colorScheme === 'dark' ? 'light-content' : 'dark-content'
}
translucent
/>
<IconRegistry icons={EvaIconsPack} />
<ApplicationProvider
{...eva}
// @ts-expect-error Unknown error
customMapping={customMapping}
theme={colorScheme === 'dark' ? darkTheme : lightTheme}
>
<LanguageProvider cache={true} data={translations}>
<AppNavigator />
</LanguageProvider>
</ApplicationProvider>
</SafeAreaProvider>
</ApiProvider>
</SchoolPlatformProvider>
</FeatureProvider>
2020-12-20 19:18:05 +00:00
)
}