customize.page.tsx 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { useEffect, useMemo } from 'react';
  2. import type {
  3. NextPage, GetServerSideProps, GetServerSidePropsContext,
  4. } from 'next';
  5. import { useTranslation } from 'next-i18next';
  6. import dynamic from 'next/dynamic';
  7. import Head from 'next/head';
  8. import type { Container } from 'unstated';
  9. import { Provider } from 'unstated';
  10. import type { CrowiRequest } from '~/interfaces/crowi-request';
  11. import type { CommonProps } from '~/pages/utils/commons';
  12. import { generateCustomTitle } from '~/pages/utils/commons';
  13. import { useCustomizeTitle, useCurrentUser, useIsCustomizedLogoUploaded } from '~/stores-universal/context';
  14. import { retrieveServerSideProps } from '../../utils/admin-page-util';
  15. const AdminLayout = dynamic(() => import('~/components/Layout/AdminLayout'), { ssr: false });
  16. const CustomizeSettingContents = dynamic(() => import('~/client/components/Admin/Customize/Customize'), { ssr: false });
  17. const ForbiddenPage = dynamic(() => import('~/client/components/Admin/ForbiddenPage').then(mod => mod.ForbiddenPage), { ssr: false });
  18. type Props = CommonProps & {
  19. customizeTitle: string,
  20. isCustomizedLogoUploaded: boolean,
  21. };
  22. const AdminCustomizeSettingsPage: NextPage<Props> = (props) => {
  23. const { t } = useTranslation('admin');
  24. useCustomizeTitle(props.customizeTitle);
  25. useCurrentUser(props.currentUser ?? null);
  26. useIsCustomizedLogoUploaded(props.isCustomizedLogoUploaded);
  27. const componentTitle = t('customize_settings.customize_settings');
  28. const pageTitle = generateCustomTitle(props, componentTitle);
  29. const injectableContainers: Container<any>[] = useMemo(() => [], []);
  30. useEffect(() => {
  31. (async() => {
  32. const AdminCustomizeContainer = (await import('~/client/services/AdminCustomizeContainer')).default;
  33. const adminCustomizeContainer = new AdminCustomizeContainer();
  34. injectableContainers.push(adminCustomizeContainer);
  35. })();
  36. }, [injectableContainers]);
  37. if (props.isAccessDeniedForNonAdminUser) {
  38. return <ForbiddenPage />;
  39. }
  40. return (
  41. <Provider inject={[...injectableContainers]}>
  42. <AdminLayout componentTitle={componentTitle}>
  43. <Head>
  44. <title>{pageTitle}</title>
  45. </Head>
  46. <CustomizeSettingContents />
  47. </AdminLayout>
  48. </Provider>
  49. );
  50. };
  51. const injectServerConfigurations = async(context: GetServerSidePropsContext, props: Props): Promise<void> => {
  52. const req: CrowiRequest = context.req as CrowiRequest;
  53. const { crowi } = req;
  54. props.customizeTitle = crowi.configManager.getConfig('crowi', 'customize:title');
  55. props.isCustomizedLogoUploaded = await crowi.attachmentService.isBrandLogoExist();
  56. };
  57. export const getServerSideProps: GetServerSideProps = async(context: GetServerSidePropsContext) => {
  58. const props = await retrieveServerSideProps(context, injectServerConfigurations);
  59. return props;
  60. };
  61. export default AdminCustomizeSettingsPage;