diff --git a/components/Footer.tsx b/components/Footer.tsx index f7dae2e..542fca8 100644 --- a/components/Footer.tsx +++ b/components/Footer.tsx @@ -1,11 +1,12 @@ import * as React from 'react' -import { useTheme } from 'next-themes' import { FaTwitter } from '@react-icons/all-files/fa/FaTwitter' import { FaZhihu } from '@react-icons/all-files/fa/FaZhihu' import { FaGithub } from '@react-icons/all-files/fa/FaGithub' import { FaLinkedin } from '@react-icons/all-files/fa/FaLinkedin' import { IoSunnyOutline } from '@react-icons/all-files/io5/IoSunnyOutline' import { IoMoonSharp } from '@react-icons/all-files/io5/IoMoonSharp' + +import { useDarkMode } from 'lib/use-dark-mode' import * as config from 'lib/config' import styles from './styles.module.css' @@ -14,14 +15,14 @@ import styles from './styles.module.css' export const FooterImpl: React.FC = () => { const [hasMounted, setHasMounted] = React.useState(false) - const { setTheme, resolvedTheme } = useTheme() + const { isDarkMode, toggleDarkMode } = useDarkMode() const onToggleDarkMode = React.useCallback( (e) => { e.preventDefault() - setTheme(resolvedTheme === 'light' ? 'dark' : 'light') + toggleDarkMode() }, - [resolvedTheme, setTheme] + [toggleDarkMode] ) React.useEffect(() => { @@ -41,7 +42,7 @@ export const FooterImpl: React.FC = () => { onClick={onToggleDarkMode} title='Toggle dark mode' > - {resolvedTheme === 'dark' ? : } + {isDarkMode ? : } )} diff --git a/components/NotionPage.tsx b/components/NotionPage.tsx index 68719f7..dcb2c06 100644 --- a/components/NotionPage.tsx +++ b/components/NotionPage.tsx @@ -6,7 +6,6 @@ import cs from 'classnames' import { useRouter } from 'next/router' import { useSearchParam } from 'react-use' import BodyClassName from 'react-body-classname' -import { useTheme } from 'next-themes' import { PageBlock } from 'notion-types' import TweetEmbed from 'react-tweet-embed' @@ -19,6 +18,7 @@ import { getBlockTitle, getPageProperty, formatDate } from 'notion-utils' import { mapPageUrl, getCanonicalPageUrl } from 'lib/map-page-url' import { mapImageUrl } from 'lib/map-image-url' import { searchNotion } from 'lib/search-notion' +import { useDarkMode } from 'lib/use-dark-mode' import * as types from 'lib/types' import * as config from 'lib/config' @@ -177,8 +177,7 @@ export const NotionPage: React.FC = ({ // lite mode is for oembed const isLiteMode = lite === 'true' - const { resolvedTheme } = useTheme() - const isDarkMode = resolvedTheme === 'dark' + const { isDarkMode } = useDarkMode() const siteMapPageUrl = React.useMemo(() => { const params: any = {} @@ -267,6 +266,7 @@ export const NotionPage: React.FC = ({ styles.notion, pageId === site.rootNotionPageId && 'index-page' )} + darkMode={isDarkMode} components={components} recordMap={recordMap} rootPageId={site.rootNotionPageId} diff --git a/components/NotionPageHeader.tsx b/components/NotionPageHeader.tsx index 1a8f401..6458305 100644 --- a/components/NotionPageHeader.tsx +++ b/components/NotionPageHeader.tsx @@ -1,37 +1,33 @@ import * as React from 'react' import cs from 'classnames' -import { useTheme } from 'next-themes' import { IoSunnyOutline } from '@react-icons/all-files/io5/IoSunnyOutline' import { IoMoonSharp } from '@react-icons/all-files/io5/IoMoonSharp' import { Header, Breadcrumbs, Search, useNotionContext } from 'react-notion-x' import * as types from 'notion-types' +import { useDarkMode } from 'lib/use-dark-mode' import { navigationStyle, navigationLinks, isSearchEnabled } from 'lib/config' import styles from './styles.module.css' const ToggleThemeButton = () => { const [hasMounted, setHasMounted] = React.useState(false) - const { resolvedTheme, setTheme } = useTheme() + const { isDarkMode, toggleDarkMode } = useDarkMode() React.useEffect(() => { setHasMounted(true) }, []) const onToggleTheme = React.useCallback(() => { - setTheme(resolvedTheme === 'light' ? 'dark' : 'light') - }, [resolvedTheme, setTheme]) + toggleDarkMode() + }, [toggleDarkMode]) return (
- {hasMounted && resolvedTheme === 'dark' ? ( - - ) : ( - - )} + {hasMounted && isDarkMode ? : }
) } diff --git a/components/PageSocial.module.css b/components/PageSocial.module.css index 37ff001..bb16f8d 100644 --- a/components/PageSocial.module.css +++ b/components/PageSocial.module.css @@ -68,7 +68,7 @@ fill: var(--bg-color); } -:global([data-theme='dark']) .action:hover svg { +:global(.dark-mode) .action:hover svg { fill: var(--fg-color); } diff --git a/lib/use-dark-mode.ts b/lib/use-dark-mode.ts new file mode 100644 index 0000000..1e6a1d2 --- /dev/null +++ b/lib/use-dark-mode.ts @@ -0,0 +1,10 @@ +import useDarkModeImpl from '@fisch0920/use-dark-mode' + +export function useDarkMode() { + const darkMode = useDarkModeImpl(false, { classNameDark: 'dark-mode' }) + + return { + isDarkMode: darkMode.value, + toggleDarkMode: darkMode.toggle + } +} diff --git a/package.json b/package.json index 196cdc4..0b956e1 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "test:prettier": "prettier '**/*.{js,jsx,ts,tsx}' --check" }, "dependencies": { + "@fisch0920/use-dark-mode": "^2.4.0", "@keyvhq/core": "^1.6.9", "@keyvhq/redis": "^1.6.10", "@react-icons/all-files": "^4.1.0", @@ -37,7 +38,6 @@ "lqip-modern": "^1.2.0", "next": "^12.1.1", "next-api-og-image": "^2.2.1", - "next-themes": "^0.1.1", "node-fetch": "^2.6.1", "notion-client": "^6.12.0", "notion-types": "^6.11.0", diff --git a/pages/_app.tsx b/pages/_app.tsx index 44bfc19..0b1961f 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -23,7 +23,6 @@ import * as React from 'react' import * as Fathom from 'fathom-client' import type { AppProps } from 'next/app' import { useRouter } from 'next/router' -import { ThemeProvider } from 'next-themes' import posthog from 'posthog-js' import { bootstrap } from 'lib/bootstrap-client' @@ -68,9 +67,5 @@ export default function App({ Component, pageProps }: AppProps) { } }, [router.events]) - return ( - - - - ) + return } diff --git a/pages/_document.tsx b/pages/_document.tsx index 9dfba43..a60676d 100644 --- a/pages/_document.tsx +++ b/pages/_document.tsx @@ -20,6 +20,46 @@ export default class MyDocument extends Document { +