MainPanel.tsx 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import { ReactNode, useEffect, useState } from 'react';
  2. import { HeaderPanel } from './HeaderPanel/HeaderPanel';
  3. import { FooterPanel } from './FooterPanel';
  4. import { ANIMATION_DURATION } from '../_shared/constants';
  5. export const MainPanel = ({
  6. left,
  7. menuHidden,
  8. onShowMenuClick,
  9. children,
  10. }: {
  11. left: number;
  12. menuHidden: boolean;
  13. onShowMenuClick: () => void;
  14. children: ReactNode;
  15. }) => {
  16. const [animation, setAnimation] = useState(false);
  17. useEffect(() => {
  18. if (!menuHidden) {
  19. setTimeout(() => {
  20. setAnimation(false);
  21. }, ANIMATION_DURATION);
  22. } else {
  23. setAnimation(true);
  24. }
  25. }, [menuHidden]);
  26. return (
  27. <div
  28. className={`absolute inset-0 flex h-full flex-1 flex-col`}
  29. style={{
  30. transition: menuHidden || animation ? `left ${ANIMATION_DURATION}ms ease-out` : 'none',
  31. left: `${menuHidden ? 0 : left}px`,
  32. }}
  33. >
  34. <HeaderPanel menuHidden={menuHidden} onShowMenuClick={onShowMenuClick}></HeaderPanel>
  35. <div className={'min-h-0 flex-1 overflow-auto'}>{children}</div>
  36. <FooterPanel></FooterPanel>
  37. </div>
  38. );
  39. };