AdminLayout.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import type { JSX, ReactNode } from 'react';
  2. import dynamic from 'next/dynamic';
  3. import Link from 'next/link';
  4. import GrowiLogo from '~/components/Common/GrowiLogo';
  5. import { RawLayout } from './RawLayout';
  6. import styles from './Admin.module.scss';
  7. const AdminNavigation = dynamic(
  8. () =>
  9. import('../Admin/Common/AdminNavigation').then(
  10. (mod) => mod.AdminNavigation,
  11. ),
  12. { ssr: false },
  13. );
  14. const PageCreateModal = dynamic(
  15. // biome-ignore lint/style/noRestrictedImports: no-problem dynamic import
  16. () => import('~/client/components/PageCreateModal'),
  17. { ssr: false },
  18. );
  19. const HotkeysManager = dynamic(
  20. // biome-ignore lint/style/noRestrictedImports: no-problem dynamic import
  21. () => import('~/client/components/Hotkeys/HotkeysManager'),
  22. { ssr: false },
  23. );
  24. type Props = {
  25. componentTitle?: string;
  26. children?: ReactNode;
  27. };
  28. const AdminLayout = ({ children, componentTitle }: Props): JSX.Element => {
  29. return (
  30. <RawLayout>
  31. <div className={`admin-page ${styles['admin-page']}`}>
  32. <header className="py-0 container">
  33. <h1 className="p-3 fs-2 d-flex align-items-center">
  34. <Link href="/" className="d-block mb-1 me-2">
  35. <GrowiLogo />
  36. </Link>
  37. {componentTitle}
  38. </h1>
  39. </header>
  40. <div className="main">
  41. <div className="container">
  42. <div className="row">
  43. <div className="col-lg-3">
  44. <AdminNavigation />
  45. </div>
  46. <div className="col-lg-9 mb-5">{children}</div>
  47. </div>
  48. </div>
  49. </div>
  50. <PageCreateModal />
  51. <SystemVersion />
  52. </div>
  53. <HotkeysManager />
  54. </RawLayout>
  55. );
  56. };
  57. export default AdminLayout;