From 91ea0280fbe882a81bc80472e356460cf14e6a10 Mon Sep 17 00:00:00 2001 From: DefectingCat Date: Fri, 10 Nov 2023 10:29:19 +0800 Subject: [PATCH] add handle system theme --- components/pages/dark-mode-btn.tsx | 37 ++++++++++++++++++++++------- components/pages/theme-provider.tsx | 4 ++-- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/components/pages/dark-mode-btn.tsx b/components/pages/dark-mode-btn.tsx index 237b5e5..58ed200 100644 --- a/components/pages/dark-mode-btn.tsx +++ b/components/pages/dark-mode-btn.tsx @@ -1,22 +1,41 @@ import clsx from 'clsx'; import useMounted from 'lib/hooks/use-mounted'; import { useTheme } from 'next-themes'; -import { memo } from 'react'; +import { memo, useCallback, useEffect } from 'react'; import { FiMoon, FiSun } from 'react-icons/fi'; +const MEDIA = '(prefers-color-scheme: dark)'; + const DarkModeBtn = () => { const { mounted } = useMounted(); - const { systemTheme, theme, setTheme } = useTheme(); - const currentTheme = theme === 'system' ? systemTheme : theme; + const { theme, setTheme } = useTheme(); const handleTheme = (type: 'latte' | 'mocha') => () => { - // const map = { - // light: 'latte', - // dark: 'mocha', - // }; - // document.body.className = map[type]; setTheme(type); }; + const handleMediaQuery = useCallback( + (e: MediaQueryListEvent | MediaQueryList) => { + const isDark = e.matches; + if (isDark) { + setTheme('mocha'); + } else { + setTheme('latte'); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [], + ); + // Always listen to System preference + useEffect(() => { + const media = window.matchMedia(MEDIA); + + // Intentionally use deprecated listener methods to support iOS & old browsers + media.addListener(handleMediaQuery); + handleMediaQuery(media); + + return () => media.removeListener(handleMediaQuery); + }, [handleMediaQuery]); + if (!mounted) { return ( diff --git a/components/pages/theme-provider.tsx b/components/pages/theme-provider.tsx index 2e54fdb..32e3109 100644 --- a/components/pages/theme-provider.tsx +++ b/components/pages/theme-provider.tsx @@ -13,8 +13,8 @@ export default function RUAThemeProvider({ attribute="class" storageKey="rua-theme" themes={['latte', 'mocha']} - enableSystem - defaultTheme="system" + enableSystem={false} + defaultTheme="latte" > {children}