customize.page.tsx 2.9 KB

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