aboutsummaryrefslogtreecommitdiffstats
path: root/apps/mobile/lib
diff options
context:
space:
mode:
Diffstat (limited to 'apps/mobile/lib')
-rw-r--r--apps/mobile/lib/useColorScheme.tsx58
1 files changed, 58 insertions, 0 deletions
diff --git a/apps/mobile/lib/useColorScheme.tsx b/apps/mobile/lib/useColorScheme.tsx
new file mode 100644
index 00000000..a00a445d
--- /dev/null
+++ b/apps/mobile/lib/useColorScheme.tsx
@@ -0,0 +1,58 @@
+import * as React from "react";
+import { Platform } from "react-native";
+import * as NavigationBar from "expo-navigation-bar";
+import useAppSettings from "@/lib/settings";
+import { COLORS } from "@/theme/colors";
+import { useColorScheme as useNativewindColorScheme } from "nativewind";
+
+function useColorScheme() {
+ const { settings, isLoading } = useAppSettings();
+ const { colorScheme, setColorScheme: setNativewindColorScheme } =
+ useNativewindColorScheme();
+
+ // Sync user settings with native color scheme
+ React.useEffect(() => {
+ setNativewindColorScheme(settings.theme);
+ }, [settings.theme, isLoading]);
+
+ React.useEffect(() => {
+ if (Platform.OS === "android") {
+ setNavigationBar(colorScheme ?? "light").catch((error) => {
+ console.error('useColorScheme.tsx", "setColorScheme', error);
+ });
+ }
+ }, [colorScheme]);
+
+ return {
+ colorScheme: colorScheme ?? "light",
+ isDarkColorScheme: colorScheme === "dark",
+ colors: COLORS[colorScheme ?? "light"],
+ };
+}
+
+/**
+ * Set the Android navigation bar color based on the color scheme.
+ */
+function useInitialAndroidBarSync() {
+ const { colorScheme } = useColorScheme();
+ React.useEffect(() => {
+ if (Platform.OS !== "android") return;
+ setNavigationBar(colorScheme).catch((error) => {
+ console.error('useColorScheme.tsx", "useInitialColorScheme', error);
+ });
+ }, []);
+}
+
+export { useColorScheme, useInitialAndroidBarSync };
+
+function setNavigationBar(colorScheme: "light" | "dark") {
+ return Promise.all([
+ NavigationBar.setButtonStyleAsync(
+ colorScheme === "dark" ? "light" : "dark",
+ ),
+ NavigationBar.setPositionAsync("absolute"),
+ NavigationBar.setBackgroundColorAsync(
+ colorScheme === "dark" ? "#00000030" : "#ffffff80",
+ ),
+ ]);
+}