From 7b9ce8224572fc1d929acf564d7428081694e9c3 Mon Sep 17 00:00:00 2001 From: Nahiyan Khan Date: Wed, 9 Apr 2025 10:09:12 -0400 Subject: [PATCH] added system theme option (#2104) --- .../src/components/more_menu/MoreMenu.tsx | 116 +++++++++++------- 1 file changed, 71 insertions(+), 45 deletions(-) diff --git a/ui/desktop/src/components/more_menu/MoreMenu.tsx b/ui/desktop/src/components/more_menu/MoreMenu.tsx index 4412d45b..12a1d207 100644 --- a/ui/desktop/src/components/more_menu/MoreMenu.tsx +++ b/ui/desktop/src/components/more_menu/MoreMenu.tsx @@ -51,33 +51,55 @@ const MenuButton: React.FC = ({ ); -interface DarkModeToggleProps { - isDarkMode: boolean; - onToggle: () => void; +interface ThemeSelectProps { + themeMode: 'light' | 'dark' | 'system'; + onThemeChange: (theme: 'light' | 'dark' | 'system') => void; } -const DarkModeToggle: React.FC = ({ isDarkMode, onToggle }) => ( - -
- + + +
- -); + ); +}; export default function MoreMenu({ setView, @@ -90,16 +112,21 @@ export default function MoreMenu({ const { remove } = useConfig(); const [versions, setVersions] = useState(null); const [showVersions, setShowVersions] = useState(false); - const [useSystemTheme, setUseSystemTheme] = useState( - () => localStorage.getItem('use_system_theme') === 'true' - ); - const [isDarkMode, setDarkMode] = useState(() => { - const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; - if (useSystemTheme) { - return systemPrefersDark; + const [themeMode, setThemeMode] = useState<'light' | 'dark' | 'system'>(() => { + const savedUseSystemTheme = localStorage.getItem('use_system_theme') === 'true'; + if (savedUseSystemTheme) { + return 'system'; } const savedTheme = localStorage.getItem('theme'); - return savedTheme ? savedTheme === 'dark' : systemPrefersDark; + return savedTheme === 'dark' ? 'dark' : 'light'; + }); + + const [isDarkMode, setDarkMode] = useState(() => { + const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; + if (themeMode === 'system') { + return systemPrefersDark; + } + return themeMode === 'dark'; }); useEffect(() => { @@ -128,7 +155,7 @@ export default function MoreMenu({ // Handler for system theme changes const handleThemeChange = (e: { matches: boolean }) => { - if (useSystemTheme) { + if (themeMode === 'system') { setDarkMode(e.matches); } }; @@ -137,32 +164,31 @@ export default function MoreMenu({ mediaQuery.addEventListener('change', handleThemeChange); // Initial setup - if (useSystemTheme) { + if (themeMode === 'system') { setDarkMode(mediaQuery.matches); + localStorage.setItem('use_system_theme', 'true'); } else { - const savedTheme = localStorage.getItem('theme'); - setDarkMode(savedTheme ? savedTheme === 'dark' : mediaQuery.matches); + setDarkMode(themeMode === 'dark'); + localStorage.setItem('use_system_theme', 'false'); + localStorage.setItem('theme', themeMode); } // Cleanup return () => mediaQuery.removeEventListener('change', handleThemeChange); - }, [useSystemTheme]); + }, [themeMode]); useEffect(() => { if (isDarkMode) { document.documentElement.classList.add('dark'); + document.documentElement.classList.remove('light'); } else { document.documentElement.classList.remove('dark'); + document.documentElement.classList.add('light'); } - if (!useSystemTheme) { - localStorage.setItem('theme', isDarkMode ? 'dark' : 'light'); - } - }, [isDarkMode, useSystemTheme]); + }, [isDarkMode]); - const toggleTheme = () => { - if (!useSystemTheme) { - setDarkMode(!isDarkMode); - } + const handleThemeChange = (newTheme: 'light' | 'dark' | 'system') => { + setThemeMode(newTheme); }; return ( @@ -229,8 +255,6 @@ export default function MoreMenu({ Configure .goosehints - - {/* Make Agent from Chat */} { @@ -257,6 +281,8 @@ export default function MoreMenu({ ⌘, + + {settingsV2Enabled && ( {