import React, { useCallback, useEffect } from 'react'; import { useSidebarContext } from '../SidebarContext'; import _isNil from 'lodash/isNil'; import { useDrag } from 'react-use-gesture'; import { useIsMobile } from '@/hooks/useIsMobile'; import clsx from 'clsx'; const PageContentRoot: React.FC = (props) => (
{props.children}
); const PageGestureWrapper: React.FC = React.memo((props) => { const { setShowSidebar } = useSidebarContext(); const bind = useDrag( (state) => { const { swipe } = state; const swipeX = swipe[0]; if (swipeX > 0) { setShowSidebar(true); } else if (swipeX < 0) { setShowSidebar(false); } }, { axis: 'x', swipeDistance: 5, } ); return {props.children}; }); PageGestureWrapper.displayName = 'PageGestureWrapper'; interface PageContentProps { sidebar?: React.ReactNode; 'data-tc-role'?: string; } /** * 用于渲染实际页面的组件,即除了导航栏剩余的内容 */ export const PageContent: React.FC = React.memo((props) => { const { sidebar, children } = props; const { showSidebar, setShowSidebar } = useSidebarContext(); const isMobile = useIsMobile(); const handleHideSidebar = useCallback( (e: React.MouseEvent) => { e.stopPropagation(); e.preventDefault(); setShowSidebar(false); }, [] ); useEffect(() => { if (isMobile === false) { // 如果不为移动端, 则一定显示侧边栏 setShowSidebar(true); } }, [isMobile]); const sidebarEl = _isNil(sidebar) ? null : (
{props.sidebar}
); // 是否显示遮罩层 const showMask = isMobile === true && showSidebar === true && !_isNil(sidebarEl); const contentMaskEl = showMask ? (
) : null; const contentEl = children; const el = ( <> {sidebarEl}
{contentMaskEl} {contentEl}
); if (isMobile) { return {el}; } else { return {el}; } }); PageContent.displayName = 'PageContent';