editor-left-menu.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { useLayoutContext } from '../../../shared/context/layout-context'
  2. import LeftMenuMask from './left-menu-mask'
  3. import AccessibleModal from '../../../shared/components/accessible-modal'
  4. import { Modal } from 'react-bootstrap'
  5. import classNames from 'classnames'
  6. import { lazy, memo, Suspense } from 'react'
  7. import { FullSizeLoadingSpinner } from '@/shared/components/loading-spinner'
  8. import BootstrapVersionSwitcher from '@/features/ui/components/bootstrap-5/bootstrap-version-switcher'
  9. import { Offcanvas } from 'react-bootstrap-5'
  10. import { EditorLeftMenuProvider } from './editor-left-menu-context'
  11. const EditorLeftMenuBody = lazy(() => import('./editor-left-menu-body'))
  12. function EditorLeftMenu() {
  13. const { leftMenuShown, setLeftMenuShown } = useLayoutContext()
  14. const closeLeftMenu = () => {
  15. setLeftMenuShown(false)
  16. }
  17. return (
  18. <BootstrapVersionSwitcher
  19. bs3={
  20. <EditorLeftMenuProvider>
  21. <AccessibleModal
  22. backdropClassName="left-menu-modal-backdrop"
  23. keyboard
  24. onHide={closeLeftMenu}
  25. id="left-menu-modal"
  26. show={leftMenuShown}
  27. >
  28. <Modal.Body
  29. className={classNames('full-size', { shown: leftMenuShown })}
  30. id="left-menu"
  31. >
  32. <Suspense fallback={<FullSizeLoadingSpinner delay={500} />}>
  33. <EditorLeftMenuBody />
  34. </Suspense>
  35. </Modal.Body>
  36. </AccessibleModal>
  37. {leftMenuShown && <LeftMenuMask />}
  38. </EditorLeftMenuProvider>
  39. }
  40. bs5={
  41. <EditorLeftMenuProvider>
  42. <Offcanvas
  43. show={leftMenuShown}
  44. onHide={closeLeftMenu}
  45. backdropClassName="left-menu-modal-backdrop"
  46. id="left-menu-offcanvas"
  47. >
  48. <Offcanvas.Body
  49. className={classNames('full-size', 'left-menu', {
  50. shown: leftMenuShown,
  51. })}
  52. id="left-menu"
  53. >
  54. <Suspense fallback={<FullSizeLoadingSpinner delay={500} />}>
  55. <EditorLeftMenuBody />
  56. </Suspense>
  57. </Offcanvas.Body>
  58. </Offcanvas>
  59. {leftMenuShown && <LeftMenuMask />}
  60. </EditorLeftMenuProvider>
  61. }
  62. />
  63. )
  64. }
  65. export default memo(EditorLeftMenu)