Massive/App.tsx

153 lines
4.3 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,
} 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,
ProgressBar,
2023-11-12 04:05:37 +00:00
Provider as PaperProvider,
Snackbar,
} from "react-native-paper";
2023-10-19 05:28:56 +00:00
import MaterialIcon from "react-native-vector-icons/MaterialCommunityIcons";
2023-11-12 04:05:37 +00:00
import AppStack from "./AppStack";
import { AppDataSource } from "./data-source";
import { settingsRepo } from "./db";
import { emitter } from "./emitter";
2023-11-12 04:05:37 +00:00
import { TickEvent } from "./TimerPage";
import { TOAST } from "./toast";
import { ThemeContext } from "./use-theme";
import Settings from "./settings";
import { MARGIN } from "./constants";
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 = () => {
const phoneTheme = useColorScheme();
const [initialized, setInitialized] = useState(false);
const [snackbar, setSnackbar] = useState("");
const [appTheme, setAppTheme] = useState("system");
const [progress, setProgress] = useState(0);
const [settings, setSettings] = useState<Settings>();
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 gotSettings = await settingsRepo.findOne({ where: {} });
console.log({ gotSettings });
setSettings(gotSettings);
setAppTheme(gotSettings.theme);
if (gotSettings.lightColor) setLightColor(gotSettings.lightColor);
if (gotSettings.darkColor) setDarkColor(gotSettings.darkColor);
setInitialized(true);
})();
const descriptions = [
emitter.addListener(TOAST, ({ value }: { value: string }) => {
setSnackbar(value);
}),
emitter.addListener("tick", (event: TickEvent) => {
setProgress((Number(event.minutes) * 60 + Number(event.seconds)) / 210);
}),
];
return () => descriptions.forEach((description) => 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;
let value = phoneTheme === "dark" ? darkTheme : lightTheme;
if (appTheme === "dark") value = darkTheme;
else if (appTheme === "light") value = lightTheme;
return value;
}, [phoneTheme, appTheme, lightColor, darkColor]);
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}>
{initialized && (
<ThemeContext.Provider
value={{
2023-07-17 04:21:56 +00:00
theme: appTheme,
setTheme: setAppTheme,
lightColor,
setLightColor,
darkColor,
setDarkColor,
2023-06-27 03:16:59 +00:00
}}
>
<AppStack settings={settings} />
</ThemeContext.Provider>
)}
</NavigationContainer>
<Snackbar
duration={3000}
onDismiss={() => setSnackbar("")}
visible={!!snackbar}
2023-07-17 04:21:56 +00:00
action={{
label: "Close",
onPress: () => setSnackbar(""),
2023-07-17 04:21:56 +00:00
textColor: paperTheme.colors.background,
}}
2023-06-27 03:16:59 +00:00
>
{snackbar}
</Snackbar>
{progress > 0 && (
<ProgressBar
2023-11-13 03:07:12 +00:00
style={{
position: "absolute",
bottom: MARGIN / 2,
left: MARGIN,
right: MARGIN,
}}
progress={progress}
/>
)}
</PaperProvider>
);
};
2022-06-30 06:50:52 +00:00
export default App;