Jelajahi Sumber

reorganize atoms

Yuki Takei 7 bulan lalu
induk
melakukan
d15954a47a

+ 1 - 1
apps/app/src/pages/admin/audit-log.page.tsx

@@ -4,7 +4,7 @@ import dynamic from 'next/dynamic';
 
 import type { SupportedActionType } from '~/interfaces/activity';
 import type { CrowiRequest } from '~/interfaces/crowi-request';
-import { activityExpirationSecondsAtom, auditLogAvailableActionsAtom, auditLogEnabledAtom } from '~/states/global';
+import { activityExpirationSecondsAtom, auditLogAvailableActionsAtom, auditLogEnabledAtom } from '~/states/server-configurations';
 
 import type { NextPageWithLayout } from '../_app.page';
 import { mergeGetServerSidePropsResults } from '../utils/server-side-props';

+ 10 - 19
apps/app/src/pages/admin/customize.page.tsx

@@ -1,16 +1,10 @@
-import { useEffect } from 'react';
-
 import { useHydrateAtoms } from 'jotai/utils';
 import type { GetServerSideProps, GetServerSidePropsContext } from 'next';
 import dynamic from 'next/dynamic';
 
 import type { CrowiRequest } from '~/interfaces/crowi-request';
-import {
-  customizeTitleAtom,
-  isCustomizedLogoUploadedAtom,
-  useCustomizeTitle,
-  useIsCustomizedLogoUploaded,
-} from '~/states/global';
+import { _atomsForAdminPagesHydration as atoms } from '~/states/global';
+import { isCustomizedLogoUploadedAtom } from '~/states/server-configurations';
 
 import type { NextPageWithLayout } from '../_app.page';
 import { mergeGetServerSidePropsResults } from '../utils/server-side-props';
@@ -21,25 +15,21 @@ import { createAdminPageLayout, getServerSideAdminCommonProps } from './_shared'
 const CustomizeSettingContents = dynamic(() => import('~/client/components/Admin/Customize/Customize'), { ssr: false });
 
 type PageProps = {
-  customizeTitle?: string,
+  isDefaultBrandLogoUsed: boolean,
   isCustomizedLogoUploaded: boolean,
+  customTitleTemplate?: string,
 };
 
 type Props = AdminCommonProps & PageProps;
 
 // eslint-disable-next-line react/prop-types
-const AdminCustomizeSettingsPage: NextPageWithLayout<Props> = ({ customizeTitle, isCustomizedLogoUploaded }) => {
+const AdminCustomizeSettingsPage: NextPageWithLayout<Props> = (props: Props) => {
   useHydrateAtoms([
-    [customizeTitleAtom, customizeTitle],
-    [isCustomizedLogoUploadedAtom, isCustomizedLogoUploaded],
+    [atoms.isDefaultLogoAtom, props.isDefaultBrandLogoUsed],
+    [atoms.customTitleTemplateAtom, props.customTitleTemplate],
+    [isCustomizedLogoUploadedAtom, props.isCustomizedLogoUploaded],
   ], { dangerouslyForceHydrate: true });
 
-  const [, setCustomizeTitle] = useCustomizeTitle();
-  const [, setIsCustomizedLogoUploaded] = useIsCustomizedLogoUploaded();
-
-  useEffect(() => { setCustomizeTitle(customizeTitle) }, [customizeTitle, setCustomizeTitle]);
-  useEffect(() => { setIsCustomizedLogoUploaded(isCustomizedLogoUploaded) }, [isCustomizedLogoUploaded, setIsCustomizedLogoUploaded]);
-
   return <CustomizeSettingContents />;
 };
 
@@ -61,8 +51,9 @@ export const getServerSideProps: GetServerSideProps<Props> = async(context: GetS
 
   const customizePropsFragment = {
     props: {
-      customizeTitle: crowi.configManager.getConfig('customize:title'),
+      isDefaultBrandLogoUsed: await crowi.attachmentService.isDefaultBrandLogoUsed(),
       isCustomizedLogoUploaded: await crowi.attachmentService.isBrandLogoExist(),
+      customTitleTemplate: crowi.configManager.getConfig('customize:title'),
     },
   } satisfies { props: PageProps };
 

+ 3 - 6
apps/app/src/pages/admin/index.page.tsx

@@ -3,10 +3,7 @@ import type { GetServerSideProps, GetServerSidePropsContext } from 'next';
 import dynamic from 'next/dynamic';
 
 import type { CrowiRequest } from '~/interfaces/crowi-request';
-import {
-  growiCloudUriAtom,
-  growiAppIdForGrowiCloudAtom,
-} from '~/states/global';
+import { _atomsForAdminPagesHydration as atoms } from '~/states/global';
 
 import type { NextPageWithLayout } from '../_app.page';
 import { mergeGetServerSidePropsResults } from '../utils/server-side-props';
@@ -26,8 +23,8 @@ type Props = AdminCommonProps & ExtraProps;
 const AdminHomepage: NextPageWithLayout<Props> = ({ growiCloudUri, growiAppIdForGrowiCloud }) => {
   // Hydrate atoms with fragment values (idempotent if already set by common props)
   useHydrateAtoms([
-    [growiCloudUriAtom, growiCloudUri],
-    [growiAppIdForGrowiCloudAtom, growiAppIdForGrowiCloud],
+    [atoms.growiCloudUriAtom, growiCloudUri],
+    [atoms.growiAppIdForGrowiCloudAtom, growiAppIdForGrowiCloud],
   ], { dangerouslyForceHydrate: true });
 
   return <AdminHome />;

+ 2 - 2
apps/app/src/pages/admin/security.page.tsx

@@ -3,7 +3,7 @@ import type { GetServerSideProps, GetServerSidePropsContext } from 'next';
 import dynamic from 'next/dynamic';
 
 import type { CrowiRequest } from '~/interfaces/crowi-request';
-import { siteUrlWithEmptyValueWarnAtom } from '~/states/global';
+import { _atomsForAdminPagesHydration as atoms } from '~/states/global';
 import { isMailerSetupAtom } from '~/states/server-configurations';
 
 import type { NextPageWithLayout } from '../_app.page';
@@ -24,7 +24,7 @@ const AdminSecuritySettingsPage: NextPageWithLayout<Props> = (props: Props) => {
   // hydrate
   useHydrateAtoms([
     [isMailerSetupAtom, props.isMailerSetup],
-    [siteUrlWithEmptyValueWarnAtom, props.siteUrlWithEmptyValueWarn],
+    [atoms.siteUrlWithEmptyValueWarnAtom, props.siteUrlWithEmptyValueWarn],
   ], { dangerouslyForceHydrate: true });
 
   return <SecurityManagement />;

+ 2 - 2
apps/app/src/pages/admin/slack-integration.page.tsx

@@ -2,7 +2,7 @@ import { useHydrateAtoms } from 'jotai/utils';
 import type { GetServerSideProps, GetServerSidePropsContext } from 'next';
 import dynamic from 'next/dynamic';
 
-import { siteUrlWithEmptyValueWarnAtom } from '~/states/global';
+import { _atomsForAdminPagesHydration as atoms } from '~/states/global';
 
 import type { NextPageWithLayout } from '../_app.page';
 
@@ -16,7 +16,7 @@ type Props = AdminCommonProps;
 const AdminSlackIntegrationPage: NextPageWithLayout<Props> = (props: Props) => {
   // hydrate global state
   useHydrateAtoms([
-    [siteUrlWithEmptyValueWarnAtom, props.siteUrlWithEmptyValueWarn],
+    [atoms.siteUrlWithEmptyValueWarnAtom, props.siteUrlWithEmptyValueWarn],
   ], { dangerouslyForceHydrate: true });
 
   return <SlackIntegration />;

+ 8 - 54
apps/app/src/states/global/global.ts

@@ -1,6 +1,5 @@
 import type { ColorScheme, IUserHasId } from '@growi/core';
 import { atom, useAtomValue } from 'jotai';
-import type { SupportedActionType } from '~/interfaces/activity';
 
 /**
  * CSRF Token atom
@@ -107,25 +106,6 @@ const isDefaultLogoAtom = atom<boolean>(true);
  */
 export const useIsDefaultLogo = () => useAtomValue(isDefaultLogoAtom);
 
-/**
- * Customize Title
- */
-const customizeTitleAtom = atom<string | undefined>(undefined);
-/**
- * Customize Title atom setter
- */
-export const useCustomizeTitle = () => useAtomValue(customizeTitleAtom);
-
-/**
- * Is Customized Logo Uploaded
- */
-const isCustomizedLogoUploadedAtom = atom<boolean>(false);
-/**
- * Is Customized Logo Uploaded atom setter
- */
-export const useIsCustomizedLogoUploaded = () =>
-  useAtomValue(isCustomizedLogoUploadedAtom);
-
 /**
  * GROWI Cloud URI atom
  */
@@ -158,35 +138,6 @@ const forcedColorSchemeAtom = atom<ColorScheme | undefined>(undefined);
  */
 export const useForcedColorScheme = () => useAtomValue(forcedColorSchemeAtom);
 
-/**
- * Audit Log Enabled atom
- */
-const auditLogEnabledAtom = atom<boolean>(false);
-/**
- * Audit Log Enabled atom setter
- */
-export const useAuditLogEnabled = () => useAtomValue(auditLogEnabledAtom);
-
-/**
- * Activity Expiration Seconds atom
- */
-const activityExpirationSecondsAtom = atom<number>(0);
-/**
- * Activity Expiration Seconds atom setter
- */
-export const useActivityExpirationSeconds = () =>
-  useAtomValue(activityExpirationSecondsAtom);
-
-/**
- * Audit Log Available Actions atom
- */
-const auditLogAvailableActionsAtom = atom<SupportedActionType[]>([]);
-/**
- * Audit Log Available Actions atom setter
- */
-export const useAuditLogAvailableActions = () =>
-  useAtomValue(auditLogAvailableActionsAtom);
-
 export const _atomsForHydration = {
   csrfTokenAtom,
   currentPathnameAtom,
@@ -199,12 +150,15 @@ export const _atomsForHydration = {
   growiVersionAtom,
   isMaintenanceModeAtom,
   isDefaultLogoAtom,
-  customizeTitleAtom,
-  isCustomizedLogoUploadedAtom,
   growiCloudUriAtom,
   growiAppIdForGrowiCloudAtom,
   forcedColorSchemeAtom,
-  auditLogEnabledAtom,
-  activityExpirationSecondsAtom,
-  auditLogAvailableActionsAtom,
+};
+
+export const _atomsForAdminPagesHydration = {
+  siteUrlWithEmptyValueWarnAtom,
+  customTitleTemplateAtom,
+  isDefaultLogoAtom,
+  growiCloudUriAtom,
+  growiAppIdForGrowiCloudAtom,
 };

+ 21 - 0
apps/app/src/states/server-configurations/server-configurations.ts

@@ -1,4 +1,5 @@
 import { atom, useAtomValue } from 'jotai';
+import type { SupportedActionType } from '~/interfaces/activity';
 
 import type { RendererConfig } from '~/interfaces/services/renderer';
 
@@ -67,6 +68,11 @@ export const showPageLimitationXLAtom = atom<number>(20);
  */
 export const showPageSideAuthorsAtom = atom<boolean>(false);
 
+/**
+ * Atom for whether Customized Logo Uploaded
+ */
+export const isCustomizedLogoUploadedAtom = atom<boolean>(false);
+
 /**
  * Atom for container fluid
  */
@@ -142,6 +148,21 @@ export const isPdfBulkExportEnabledAtom = atom<boolean>(false);
  */
 export const isLocalAccountRegistrationEnabledAtom = atom<boolean>(false);
 
+/**
+ * Audit Log Enabled atom
+ */
+export const auditLogEnabledAtom = atom<boolean>(false);
+
+/**
+ * Activity Expiration Seconds atom
+ */
+export const activityExpirationSecondsAtom = atom<number>(0);
+
+/**
+ * Audit Log Available Actions atom
+ */
+export const auditLogAvailableActionsAtom = atom<SupportedActionType[]>([]);
+
 /**
  * Atom for renderer config
  */