Massive/App.tsx

126 lines
3.7 KiB
TypeScript
Raw Permalink Normal View History

2022-06-30 06:50:52 +00:00
import {
NavigationContainer,
2022-07-15 06:06:33 +00:00
DarkTheme as NavigationDarkTheme,
DefaultTheme as NavigationDefaultTheme,
} from "@react-navigation/native";
import React, { useEffect, useMemo, useState } from "react";
import { useColorScheme } from "react-native";
import {
2023-07-15 01:21:09 +00:00
MD3DarkTheme as PaperDarkTheme,
MD3LightTheme as PaperDefaultTheme,
2023-11-12 04:05:37 +00:00
Provider as PaperProvider,
} from "react-native-paper";
2023-10-19 05:28:56 +00:00
import MaterialIcon from "react-native-vector-icons/MaterialCommunityIcons";
import AppSnack from "./AppSnack";
2023-11-12 04:05:37 +00:00
import AppStack from "./AppStack";
import FatalError from "./FatalError";
import { AppDataSource } from "./data-source";
import { settingsRepo } from "./db";
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-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-07-15 06:06:33 +00:00
2022-07-01 01:42:42 +00:00
const App = () => {
console.log("Re rendered app");
2023-11-13 06:40:05 +00:00
const systemTheme = useColorScheme();
2022-11-01 03:11:39 +00:00
const [appSettings, setAppSettings] = useState({
startup: undefined,
theme: "system",
lightColor: CombinedDefaultTheme.colors.primary,
darkColor: CombinedDarkTheme.colors.primary,
});
const [error, setError] = useState("");
useEffect(() => {
(async () => {
if (!AppDataSource.isInitialized)
await AppDataSource.initialize().catch((e) => setError(e.toString()));
const gotSettings = await settingsRepo.findOne({ where: {} });
console.log(`${App.name}.mount`, { gotSettings });
setAppSettings({
startup: gotSettings.startup,
theme: gotSettings.theme,
2023-11-14 01:34:10 +00:00
lightColor:
gotSettings.lightColor || CombinedDefaultTheme.colors.primary,
darkColor: gotSettings.darkColor || CombinedDarkTheme.colors.primary,
});
})();
}, []);
const paperTheme = useMemo(() => {
2023-11-13 06:40:05 +00:00
const darkTheme = {
...CombinedDarkTheme,
colors: {
...CombinedDarkTheme.colors,
primary: appSettings.darkColor,
},
};
const lightTheme = {
...CombinedDefaultTheme,
colors: {
...CombinedDefaultTheme.colors,
primary: appSettings.lightColor,
},
};
let theme = systemTheme === "dark" ? darkTheme : lightTheme;
if (appSettings.theme === "dark") theme = darkTheme;
else if (appSettings.theme === "light") theme = lightTheme;
return theme;
}, [systemTheme, appSettings]);
2022-11-01 03:08:02 +00:00
2022-06-30 06:50:52 +00:00
return (
<PaperProvider
theme={paperTheme}
2023-06-27 03:16:59 +00:00
settings={{ icon: (props) => <MaterialIcon {...props} /> }}
>
<NavigationContainer theme={paperTheme}>
{error && (
<FatalError
message={error}
setAppSettings={setAppSettings}
setError={setError}
/>
)}
{appSettings.startup !== undefined && (
<ThemeContext.Provider
value={{
theme: appSettings.theme,
setTheme: (theme) => setAppSettings({ ...appSettings, theme }),
lightColor: appSettings.lightColor,
setLightColor: (color) =>
setAppSettings({ ...appSettings, lightColor: color }),
darkColor: appSettings.darkColor,
setDarkColor: (color) =>
setAppSettings({ ...appSettings, darkColor: color }),
2023-06-27 03:16:59 +00:00
}}
>
<AppStack startup={appSettings.startup} />
</ThemeContext.Provider>
)}
</NavigationContainer>
<AppSnack textColor={paperTheme.colors.background} />
</PaperProvider>
);
};
2022-06-30 06:50:52 +00:00
export default App;