import CONFIG from './config' import FloatDarkModeButton from './components/FloatDarkModeButton' import Footer from './components/Footer' import JumpToBottomButton from './components/JumpToBottomButton' import JumpToTopButton from './components/JumpToTopButton' import SideAreaLeft from './components/SideAreaLeft' import SideAreaRight from './components/SideAreaRight' import TopNav from './components/TopNav' import { useGlobal } from '@/lib/global' import { createContext, useContext, useEffect, useRef, useState } from 'react' import BlogPostListScroll from './components/BlogPostListScroll' import BlogPostListPage from './components/BlogPostListPage' import StickyBar from './components/StickyBar' import { isBrowser } from '@/lib/utils' import TocDrawerButton from './components/TocDrawerButton' import TocDrawer from './components/TocDrawer' import { ArticleLock } from './components/ArticleLock' import BlogPostArchive from './components/BlogPostArchive' import TagItem from './components/TagItem' import { useRouter } from 'next/router' import ArticleDetail from './components/ArticleDetail' import Link from 'next/link' import BlogListBar from './components/BlogListBar' import { Style } from './style' import replaceSearchResult from '@/components/Mark' import { siteConfig } from '@/lib/config' import AlgoliaSearchModal from '@/components/AlgoliaSearchModal' import Announcement from './components/Announcement' import Card from './components/Card' // 主题全局状态 const ThemeGlobalNext = createContext() export const useNextGlobal = () => useContext(ThemeGlobalNext) /** * 基础布局 采用左中右三栏布局,移动端使用顶部导航栏 * @returns {JSX.Element} * @constructor */ const LayoutBase = (props) => { const { children, headerSlot, rightAreaSlot, post } = props const targetRef = useRef(null) const floatButtonGroup = useRef(null) const [showRightFloat, switchShow] = useState(false) const [percent, changePercent] = useState(0) // 页面阅读百分比 const scrollListener = () => { const targetRef = document.getElementById('wrapper') const clientHeight = targetRef?.clientHeight const scrollY = window.pageYOffset const fullHeight = clientHeight - window.outerHeight let per = parseFloat(((scrollY / fullHeight * 100)).toFixed(0)) if (per > 100) per = 100 const shouldShow = scrollY > 100 && per > 0 if (shouldShow !== showRightFloat) { switchShow(shouldShow) } changePercent(per) } useEffect(() => { // facebook messenger 插件需要调整右下角悬浮按钮的高度 const fb = document.getElementsByClassName('fb-customerchat') if (fb.length === 0) { floatButtonGroup?.current?.classList.replace('bottom-24', 'bottom-12') } else { floatButtonGroup?.current?.classList.replace('bottom-12', 'bottom-24') } document.addEventListener('scroll', scrollListener) return () => document.removeEventListener('scroll', scrollListener) }, [showRightFloat]) // 悬浮抽屉 const drawerRight = useRef(null) const floatSlot =
{ drawerRight?.current?.handleSwitchVisible() }} />
const tocRef = isBrowser ? document.getElementById('article-wrapper') : null const searchModal = useRef(null) return (