BasicLayout.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import type { ReactNode } from 'react';
  2. import React from 'react';
  3. import dynamic from 'next/dynamic';
  4. import { DndProvider } from 'react-dnd';
  5. import { HTML5Backend } from 'react-dnd-html5-backend';
  6. import { Sidebar } from '../Sidebar';
  7. import { RawLayout } from './RawLayout';
  8. import styles from './BasicLayout.module.scss';
  9. const moduleClass = styles['grw-basic-layout'] ?? '';
  10. const AlertSiteUrlUndefined = dynamic(() => import('../AlertSiteUrlUndefined').then(mod => mod.AlertSiteUrlUndefined), { ssr: false });
  11. const DeleteAttachmentModal = dynamic(() => import('../PageAttachment/DeleteAttachmentModal').then(mod => mod.DeleteAttachmentModal), { ssr: false });
  12. const HotkeysManager = dynamic(() => import('../Hotkeys/HotkeysManager'), { ssr: false });
  13. const GrowiNavbarBottom = dynamic(() => import('../Navbar/GrowiNavbarBottom').then(mod => mod.GrowiNavbarBottom), { ssr: false });
  14. const ShortcutsModal = dynamic(() => import('../ShortcutsModal'), { ssr: false });
  15. const SystemVersion = dynamic(() => import('../SystemVersion'), { ssr: false });
  16. const PutbackPageModal = dynamic(() => import('../PutbackPageModal'), { ssr: false });
  17. // Page modals
  18. const PageCreateModal = dynamic(() => import('../PageCreateModal'), { ssr: false });
  19. const PageDuplicateModal = dynamic(() => import('../PageDuplicateModal'), { ssr: false });
  20. const PageDeleteModal = dynamic(() => import('../PageDeleteModal'), { ssr: false });
  21. const PageRenameModal = dynamic(() => import('../PageRenameModal'), { ssr: false });
  22. const PagePresentationModal = dynamic(() => import('../PagePresentationModal'), { ssr: false });
  23. const PageAccessoriesModal = dynamic(() => import('../PageAccessoriesModal').then(mod => mod.PageAccessoriesModal), { ssr: false });
  24. const DeleteBookmarkFolderModal = dynamic(() => import('../DeleteBookmarkFolderModal').then(mod => mod.DeleteBookmarkFolderModal), { ssr: false });
  25. const SearchModal = dynamic(() => import('../../features/search/client/components/SearchModal'), { ssr: false });
  26. type Props = {
  27. children?: ReactNode
  28. className?: string
  29. }
  30. export const BasicLayout = ({ children, className }: Props): JSX.Element => {
  31. return (
  32. <RawLayout className={`${moduleClass} ${className ?? ''}`}>
  33. <DndProvider backend={HTML5Backend}>
  34. <div className="page-wrapper flex-row">
  35. <div className="z-2">
  36. <Sidebar />
  37. </div>
  38. <div className="d-flex flex-grow-1 flex-column mw-0 z-1">{/* neccessary for nested {children} make expanded */}
  39. <AlertSiteUrlUndefined />
  40. {children}
  41. </div>
  42. </div>
  43. <GrowiNavbarBottom />
  44. <PageCreateModal />
  45. <PageDuplicateModal />
  46. <PageDeleteModal />
  47. <PageRenameModal />
  48. <PageAccessoriesModal />
  49. <DeleteAttachmentModal />
  50. <DeleteBookmarkFolderModal />
  51. <PutbackPageModal />
  52. <SearchModal />
  53. </DndProvider>
  54. <PagePresentationModal />
  55. <HotkeysManager />
  56. <ShortcutsModal />
  57. <SystemVersion showShortcutsButton />
  58. </RawLayout>
  59. );
  60. };