Massive/App.tsx

137 lines
3.9 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,
2022-10-29 23:56:58 +00:00
Provider as PaperProvider,
ProgressBar,
Snackbar,
} from "react-native-paper";
2023-10-19 05:28:56 +00:00
import MaterialIcon from "react-native-vector-icons/MaterialCommunityIcons";
import { AppDataSource } from "./data-source";
import { settingsRepo } from "./db";
import { emitter } from "./emitter";
import { TOAST } from "./toast";
import { ThemeContext } from "./use-theme";
import AppStack from "./AppStack";
import { TickEvent } from "./TimerPage";
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);
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: {} });
setAppTheme(settings.theme);
if (settings.lightColor) setLightColor(settings.lightColor);
if (settings.darkColor) setDarkColor(settings.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 />
</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 progress={progress} />}
</PaperProvider>
);
};
2022-06-30 06:50:52 +00:00
export default App;