diff --git a/src/App.tsx b/src/App.tsx index 2a1fdca..0faafe9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -14,10 +14,12 @@ import { Languages, LogIn, MessageCircle, + Moon, Network, PackageOpen, ServerCog, Settings, + Sun, X, } from 'lucide-react'; import appLogo from './assets/logo.jpg'; @@ -35,6 +37,7 @@ import { languageOptions, useI18n } from './i18n'; import { AppUpdateDialog, AppUpdateProvider, useAppUpdate } from './appUpdate'; import { appUpdateIndicatorState } from './appUpdateModel'; import { canOpenAppPage, isAlwaysAvailablePage } from './navigation'; +import { detectInitialTheme, saveTheme, type AppTheme } from './theme'; const CONTACT_URL = 'https://qm.qq.com/q/3queDaIG'; @@ -132,6 +135,7 @@ function AppContent() { const { info: appUpdateInfo, hasUpdate, processing: appUpdateProcessing } = useAppUpdate(); const [active, setActive] = useState('home'); const [languageMenuOpen, setLanguageMenuOpen] = useState(false); + const [theme, setTheme] = useState(detectInitialTheme); const [windowsClosePrompt, setWindowsClosePrompt] = useState(null); const closeDialogRef = useRef(null); const languageMenuRef = useRef(null); @@ -143,6 +147,10 @@ function AppContent() { const selectedLanguage = languageOptions.find((option) => option.value === locale) ?? languageOptions[0]; + useEffect(() => { + saveTheme(theme); + }, [theme]); + useEffect(() => { if (!canOpenAppPage(active, coreRunning)) { setActive('home'); @@ -300,6 +308,22 @@ function AppContent() {
+