Files
NotionNext/layouts/BaseLayout.js
tangly1024 f13ce77cd5 feature:
排版微调,增加文章易读性
2021-12-03 17:18:53 +08:00

147 lines
4.2 KiB
JavaScript

import PropTypes from 'prop-types'
import React, { useCallback, useEffect, useRef } from 'react'
import CommonHead from '@/components/CommonHead'
import throttle from 'lodash.throttle'
import BLOG from '@/blog.config'
import TopNav from '@/components/TopNav'
import Footer from '@/components/Footer'
import SideBar from '@/components/SideBar'
import JumpToTopButton from '@/components/JumpToTopButton'
import { useGlobal } from '@/lib/global'
import DarkModeButton from '@/components/DarkModeButton'
/**
* 基础布局 采用左右两侧布局,移动端使用顶部导航栏
* @param children
* @param layout
* @param fullWidth
* @param tags
* @param meta
* @param post
* @param totalPosts
* @param currentSearch
* @param currentCategory
* @param currentTag
* @param categories
* @param customMeta
* @returns {JSX.Element}
* @constructor
*/
const BaseLayout = ({
children,
layout,
fullWidth,
tags,
meta,
post,
totalPosts,
currentSearch,
currentCategory,
currentTag,
categories,
...customMeta
}) => {
let windowTop = 0
const scrollTrigger = useCallback(throttle(() => {
const scrollS = window.scrollY
if (scrollS >= windowTop && scrollS > 10) {
handleScrollDown()
windowTop = scrollS
} else {
handleScrollUp()
windowTop = scrollS
}
}, 200))
// 监听滚动
useEffect(() => {
window.addEventListener('scroll', scrollTrigger)
scrollTrigger()
return () => {
window.removeEventListener('scroll', scrollTrigger)
}
})
const { theme } = useGlobal()
const targetRef = useRef(null)
return (
<div id='wrapper' className={[BLOG.font, 'subpixel-antialiased', theme].join(' ')}>
<CommonHead meta={meta} />
{/* 顶部导航栏 */}
<div className='block lg:hidden'>
<TopNav tags={tags} post={post} posts={totalPosts} currentSearch={currentSearch} categories={categories}
currentCategory={currentCategory} />
</div>
{/* Middle Wrapper */}
<main className='flex dark:bg-black'>
<div className='hidden lg:block z-10'>
<SideBar post={post} posts={totalPosts} tags={tags} currentSearch={currentSearch} currentTag={currentTag} categories={categories} currentCategory={currentCategory} />
</div>
<div className='flex flex-grow' ref={targetRef}>
{children}
</div>
<JumpToTopButton targetRef={targetRef} showPercent={true} />
<div className='hidden lg:block fixed right-1 bottom-52 p-1
bg-white text-black shadow-card dark:border-gray-500 dark:bg-gray-700 dark:text-white'>
<DarkModeButton />
</div>
</main>
<Footer />
</div>
)
}
/**
* 隐藏导航
* 划到页面下方
*/
const handleScrollDown = () => {
if (document) {
const nav = document.querySelector('#sticky-nav')
nav && nav.classList.replace('top-0', '-top-16')
const stickyBar = document.querySelector('#sticky-bar')
stickyBar && stickyBar.classList.replace('top-16', 'top-0')
const tocDrawerButton = document.querySelector('#toc-drawer-button')
tocDrawerButton && tocDrawerButton.classList.replace('hidden', 'block')
// const sidebar = document.querySelector('#sidebar')
// sidebar && sidebar.classList.replace('top-20', 'top-2')
// const rightToc = document.querySelector('#right-toc')
// rightToc && rightToc.classList.replace('top-16', 'top-0')
}
}
/**
* 显示导航
* 划到顶部
*/
const handleScrollUp = () => {
if (document) {
const nav = document.querySelector('#sticky-nav')
nav && nav.classList.replace('-top-16', 'top-0')
const stickyBar = document.querySelector('#sticky-bar')
stickyBar && stickyBar.classList.replace('top-0', 'top-16')
// const tocDrawerButton = document.querySelector('#toc-drawer-button')
// tocDrawerButton && tocDrawerButton.classList.replace('block', 'hidden')
// const sidebar = document.querySelector('#sidebar')
// sidebar && sidebar.classList.replace('top-2', 'top-20')
// const rightToc = document.querySelector('#right-toc')
// rightToc && rightToc.classList.replace('top-0', 'top-16')
}
}
BaseLayout.propTypes = {
children: PropTypes.node
}
export default BaseLayout