|
1 | 1 | import { observer } from "mobx-react-lite"; |
2 | 2 | import { useEffect } from "react"; |
3 | | -import { useTranslation } from "react-i18next"; |
4 | 3 | import { Outlet } from "react-router-dom"; |
5 | 4 | import useNavigateTo from "./hooks/useNavigateTo"; |
6 | | -import { instanceStore, userStore } from "./store"; |
| 5 | +import { useUserLocale } from "./hooks/useUserLocale"; |
| 6 | +import { useUserTheme } from "./hooks/useUserTheme"; |
| 7 | +import { instanceStore } from "./store"; |
7 | 8 | import { cleanupExpiredOAuthState } from "./utils/oauth"; |
8 | | -import { getThemeWithFallback, loadTheme, setupSystemThemeListener } from "./utils/theme"; |
9 | 9 |
|
10 | 10 | const App = observer(() => { |
11 | | - const { i18n } = useTranslation(); |
12 | 11 | const navigateTo = useNavigateTo(); |
13 | 12 | const instanceProfile = instanceStore.state.profile; |
14 | | - const userGeneralSetting = userStore.state.userGeneralSetting; |
15 | 13 | const instanceGeneralSetting = instanceStore.state.generalSetting; |
16 | 14 |
|
| 15 | + // Apply user preferences reactively |
| 16 | + useUserLocale(); |
| 17 | + useUserTheme(); |
| 18 | + |
17 | 19 | // Clean up expired OAuth states on app initialization |
18 | 20 | useEffect(() => { |
19 | 21 | cleanupExpiredOAuthState(); |
@@ -54,45 +56,6 @@ const App = observer(() => { |
54 | 56 | link.href = instanceGeneralSetting.customProfile.logoUrl || "/logo.webp"; |
55 | 57 | }, [instanceGeneralSetting.customProfile]); |
56 | 58 |
|
57 | | - // Update HTML lang and dir attributes based on current locale |
58 | | - useEffect(() => { |
59 | | - const currentLocale = i18n.language; |
60 | | - document.documentElement.setAttribute("lang", currentLocale); |
61 | | - if (["ar", "fa"].includes(currentLocale)) { |
62 | | - document.documentElement.setAttribute("dir", "rtl"); |
63 | | - } else { |
64 | | - document.documentElement.setAttribute("dir", "ltr"); |
65 | | - } |
66 | | - }, [i18n.language]); |
67 | | - |
68 | | - // Apply theme when user setting changes |
69 | | - useEffect(() => { |
70 | | - if (!userGeneralSetting) { |
71 | | - return; |
72 | | - } |
73 | | - const theme = getThemeWithFallback(userGeneralSetting.theme); |
74 | | - loadTheme(theme); |
75 | | - }, [userGeneralSetting?.theme]); |
76 | | - |
77 | | - // Listen for system theme changes when using "system" theme |
78 | | - useEffect(() => { |
79 | | - const theme = getThemeWithFallback(userGeneralSetting?.theme); |
80 | | - |
81 | | - // Only set up listener if theme is "system" |
82 | | - if (theme !== "system") { |
83 | | - return; |
84 | | - } |
85 | | - |
86 | | - // Set up listener for OS theme preference changes |
87 | | - const cleanup = setupSystemThemeListener(() => { |
88 | | - // Reload theme when system preference changes |
89 | | - loadTheme(theme); |
90 | | - }); |
91 | | - |
92 | | - // Cleanup listener on unmount or when theme changes |
93 | | - return cleanup; |
94 | | - }, [userGeneralSetting?.theme]); |
95 | | - |
96 | 59 | return <Outlet />; |
97 | 60 | }); |
98 | 61 |
|
|
0 commit comments