BasicLayout.tsx 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import React, { ReactNode } from 'react';
  2. import dynamic from 'next/dynamic';
  3. import { DndProvider } from 'react-dnd';
  4. import { HTML5Backend } from 'react-dnd-html5-backend';
  5. import { useEditorModeClassName } from '../../client/services/layout';
  6. import { GrowiNavbar } from '../Navbar/GrowiNavbar';
  7. import Sidebar from '../Sidebar';
  8. import { RawLayout } from './RawLayout';
  9. const AlertSiteUrlUndefined = dynamic(() => import('../AlertSiteUrlUndefined').then(mod => mod.AlertSiteUrlUndefined), { ssr: false });
  10. const HotkeysManager = dynamic(() => import('../Hotkeys/HotkeysManager'), { ssr: false });
  11. // const PageCreateModal = dynamic(() => import('../client/js/components/PageCreateModal'), { ssr: false });
  12. const GrowiNavbarBottom = dynamic(() => import('../Navbar/GrowiNavbarBottom').then(mod => mod.GrowiNavbarBottom), { ssr: false });
  13. const ShortcutsModal = dynamic(() => import('../ShortcutsModal'), { ssr: false });
  14. const SystemVersion = dynamic(() => import('../SystemVersion'), { ssr: false });
  15. // Page modals
  16. const PageCreateModal = dynamic(() => import('../PageCreateModal'), { ssr: false });
  17. const PageDuplicateModal = dynamic(() => import('../PageDuplicateModal'), { ssr: false });
  18. const PageDeleteModal = dynamic(() => import('../PageDeleteModal'), { ssr: false });
  19. const PageRenameModal = dynamic(() => import('../PageRenameModal'), { ssr: false });
  20. const PagePresentationModal = dynamic(() => import('../PagePresentationModal'), { ssr: false });
  21. const PageAccessoriesModal = dynamic(() => import('../PageAccessoriesModal'), { ssr: false });
  22. // Fab
  23. const Fab = dynamic(() => import('../Fab').then(mod => mod.Fab), { ssr: false });
  24. type Props = {
  25. children?: ReactNode
  26. className?: string
  27. }
  28. export const BasicLayout = ({ children, className }: Props): JSX.Element => {
  29. return (
  30. <RawLayout className={className ?? ''}>
  31. <DndProvider backend={HTML5Backend}>
  32. <GrowiNavbar />
  33. <div className="page-wrapper d-flex d-print-block">
  34. <div className="grw-sidebar-wrapper" data-testid="grw-sidebar-wrapper">
  35. <Sidebar />
  36. </div>
  37. <div className="flex-fill mw-0" style={{ position: 'relative' }}>
  38. <AlertSiteUrlUndefined />
  39. {children}
  40. </div>
  41. </div>
  42. <GrowiNavbarBottom />
  43. <PageCreateModal />
  44. <PageDuplicateModal />
  45. <PageDeleteModal />
  46. <PageRenameModal />
  47. <PageAccessoriesModal />
  48. </DndProvider>
  49. <PagePresentationModal />
  50. <HotkeysManager />
  51. <Fab />
  52. <ShortcutsModal />
  53. <SystemVersion showShortcutsButton />
  54. </RawLayout>
  55. );
  56. };
  57. export const BasicLayoutWithEditorMode = ({ children }: Props): JSX.Element => {
  58. const className = useEditorModeClassName();
  59. return (
  60. <BasicLayout className={className}>
  61. {children}
  62. </BasicLayout>
  63. );
  64. };