diff --git a/components/Footer.tsx b/components/Footer.tsx index fca17b8..77ef2d2 100644 --- a/components/Footer.tsx +++ b/components/Footer.tsx @@ -1,4 +1,5 @@ import React from 'react' +import useDarkMode from '@fisch0920/use-dark-mode' 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' @@ -11,39 +12,31 @@ import styles from './styles.module.css' // TODO: merge the data and icons from PageSocial with the social links in Footer -export const Footer: React.FC<{ - isDarkMode: boolean - toggleDarkMode: () => void -}> = ({ isDarkMode, toggleDarkMode }) => { - const [hasMounted, setHasMounted] = React.useState(false) - const toggleDarkModeCb = React.useCallback( +export const FooterImpl: React.FC = () => { + const darkMode = useDarkMode(false, { classNameDark: 'dark-mode' }) + + const onToggleDarkMode = React.useCallback( (e) => { e.preventDefault() - toggleDarkMode() + darkMode.toggle() }, - [toggleDarkMode] + [darkMode] ) - React.useEffect(() => { - setHasMounted(true) - }, []) - return ( ) } + +export const Footer = React.memo(FooterImpl) diff --git a/components/NotionPage.tsx b/components/NotionPage.tsx index e6a6638..3e9e397 100644 --- a/components/NotionPage.tsx +++ b/components/NotionPage.tsx @@ -58,7 +58,11 @@ const Pdf = dynamic( } ) const Modal = dynamic( - () => import('react-notion-x/build/third-party/modal').then((m) => m.Modal), + () => + import('react-notion-x/build/third-party/modal').then((m) => { + m.Modal.setAppElement('.notion-viewport') + return m.Modal + }), { ssr: false } @@ -73,15 +77,48 @@ export const NotionPage: React.FC = ({ const router = useRouter() const lite = useSearchParam('lite') - const params: any = {} - if (lite) params.lite = lite + const components = React.useMemo( + () => ({ + nextImage: Image, + nextLink: Link, + Code, + Collection, + Equation, + Pdf, + Modal, + Tweet, + Header: NotionPageHeader + }), + [] + ) + + const twitterContextValue = React.useMemo(() => { + if (!recordMap) { + return null + } + + return { + tweetAstMap: (recordMap as any).tweetAstMap || {}, + swrOptions: { + fetcher: (id: string) => + fetch(`/api/get-tweet-ast/${id}`).then((r) => r.json()) + } + } + }, [recordMap]) // lite mode is for oembed const isLiteMode = lite === 'true' - const searchParams = new URLSearchParams(params) const darkMode = useDarkMode(false, { classNameDark: 'dark-mode' }) + const siteMapPageUrl = React.useMemo(() => { + const params: any = {} + if (lite) params.lite = lite + + const searchParams = new URLSearchParams(params) + return mapPageUrl(site, recordMap, searchParams) + }, [site, recordMap, lite]) + if (router.isFallback) { return } @@ -111,8 +148,6 @@ export const NotionPage: React.FC = ({ g.block = block } - const siteMapPageUrl = mapPageUrl(site, recordMap, searchParams) - const canonicalPageUrl = !config.isDev && getCanonicalPageUrl(site, recordMap)(pageId) @@ -147,15 +182,7 @@ export const NotionPage: React.FC = ({ } return ( - - fetch(`/api/get-tweet-ast/${id}`).then((r) => r.json()) - } - }} - > + = ({ styles.notion, pageId === site.rootNotionPageId && 'index-page' )} - components={{ - nextImage: Image, - nextLink: Link, - Code, - Collection, - Equation, - Pdf, - Modal, - Tweet, - Header: NotionPageHeader - }} + components={components} recordMap={recordMap} rootPageId={site.rootNotionPageId} rootDomain={site.domain} @@ -199,14 +216,9 @@ export const NotionPage: React.FC = ({ defaultPageCoverPosition={config.defaultPageCoverPosition} mapPageUrl={siteMapPageUrl} mapImageUrl={mapImageUrl} - searchNotion={searchNotion} + searchNotion={config.isSearchEnabled ? searchNotion : null} pageAside={pageAside} - footer={ -