AdminLayout.tsx 1.7 KB

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