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';