|
@@ -1,11 +1,40 @@
|
|
|
-import { ReactNode } from 'react';
|
|
|
+import { ReactNode, useEffect, useState } from 'react';
|
|
|
import { HeaderPanel } from './HeaderPanel/HeaderPanel';
|
|
|
import { FooterPanel } from './FooterPanel';
|
|
|
|
|
|
-export const MainPanel = ({ children }: { children: ReactNode }) => {
|
|
|
+const ANIMATION_DURATION = 300;
|
|
|
+
|
|
|
+export const MainPanel = ({
|
|
|
+ left,
|
|
|
+ menuHidden,
|
|
|
+ onShowMenuClick,
|
|
|
+ children,
|
|
|
+}: {
|
|
|
+ left: number;
|
|
|
+ menuHidden: boolean;
|
|
|
+ onShowMenuClick: () => void;
|
|
|
+ children: ReactNode;
|
|
|
+}) => {
|
|
|
+ const [animation, setAnimation] = useState(false);
|
|
|
+ useEffect(() => {
|
|
|
+ if (!menuHidden) {
|
|
|
+ setTimeout(() => {
|
|
|
+ setAnimation(false);
|
|
|
+ }, ANIMATION_DURATION);
|
|
|
+ } else {
|
|
|
+ setAnimation(true);
|
|
|
+ }
|
|
|
+ }, [menuHidden]);
|
|
|
+
|
|
|
return (
|
|
|
- <div className={'flex h-full flex-1 flex-col'}>
|
|
|
- <HeaderPanel></HeaderPanel>
|
|
|
+ <div
|
|
|
+ className={`absolute inset-0 flex h-full flex-1 flex-col`}
|
|
|
+ style={{
|
|
|
+ transition: menuHidden || animation ? `left ${ANIMATION_DURATION}ms ease-out` : 'none',
|
|
|
+ left: `${menuHidden ? 0 : left}px`,
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <HeaderPanel menuHidden={menuHidden} onShowMenuClick={onShowMenuClick}></HeaderPanel>
|
|
|
<div className={'min-h-0 flex-1 overflow-auto'}>{children}</div>
|
|
|
<FooterPanel></FooterPanel>
|
|
|
</div>
|