Yuki Takei 7 месяцев назад
Родитель
Сommit
e1baf34a10

+ 7 - 9
apps/app/src/pages/[[...path]]/index.page.tsx

@@ -22,15 +22,15 @@ import { useRedirectFrom } from '~/states/page/redirect';
 import { useRendererConfig } from '~/states/server-configurations';
 import { useSetupGlobalSocket, useSetupGlobalSocketForPage } from '~/states/socket-io';
 import { useEditingMarkdown } from '~/states/ui/editor';
-import { useHydrateSidebarAtoms } from '~/states/ui/sidebar/hydrate';
 import { useSWRMUTxCurrentPageYjsData } from '~/stores/yjs';
 
 import type { NextPageWithLayout } from '../_app.page';
-import type { UserUISettingsProps } from '../common-props';
-import type { GeneralPageInitialProps, SidebarConfigProps } from '../general-page';
+import type { BasicLayoutConfigurationProps } from '../basic-layout-page';
+import { useHydrateBasicLayoutConfigurationAtoms } from '../basic-layout-page/hydrate';
+import type { GeneralPageInitialProps } from '../general-page';
 import { useInitialCSRFetch } from '../general-page';
+import { useHydrateGeneralPageConfigurationAtoms } from '../general-page/hydrate';
 import { registerPageToShowRevisionWithMeta } from '../general-page/superjson';
-import { useHydrateServerConfigurationAtoms } from '../general-page/use-hydrate-server-configurations';
 import { NextjsRoutingType, detectNextjsRoutingType } from '../utils/nextjs-routing-utils';
 import { useCustomTitleForPage } from '../utils/page-title-customization';
 
@@ -69,7 +69,7 @@ const ConflictDiffModal = dynamic(() => import('~/client/components/PageEditor/C
 
 const EditablePageEffects = dynamic(() => import('~/client/components/Page/EditablePageEffects').then(mod => mod.EditablePageEffects), { ssr: false });
 
-type InitialProps = EachProps & GeneralPageInitialProps & UserUISettingsProps & SidebarConfigProps;
+type InitialProps = EachProps & GeneralPageInitialProps & BasicLayoutConfigurationProps;
 type Props = EachProps | InitialProps;
 
 const isInitialProps = (props: Props): props is InitialProps => {
@@ -171,10 +171,8 @@ type LayoutProps = Props & {
 const Layout = ({ children, ...props }: LayoutProps): JSX.Element => {
   // Hydrate sidebar atoms with server-side data - must be called unconditionally
   const initialProps = isInitialProps(props) ? props : undefined;
-  const sidebarConfig = initialProps?.sidebarConfig;
-  const userUISettings = initialProps?.userUISettings;
-  useHydrateSidebarAtoms(sidebarConfig, userUISettings);
-  useHydrateServerConfigurationAtoms(initialProps?.serverConfig, initialProps?.rendererConfig);
+  useHydrateBasicLayoutConfigurationAtoms(initialProps?.searchConfig, initialProps?.sidebarConfig, initialProps?.userUISettings);
+  useHydrateGeneralPageConfigurationAtoms(initialProps?.serverConfig, initialProps?.rendererConfig);
 
   return <BasicLayoutWithEditor>{children}</BasicLayoutWithEditor>;
 };

+ 8 - 10
apps/app/src/pages/[[...path]]/server-side-props.ts

@@ -1,11 +1,12 @@
 import type { GetServerSidePropsContext, GetServerSidePropsResult } from 'next';
 
+import { getServerSideBasicLayoutProps } from '../basic-layout-page';
 import {
-  getServerSideI18nProps, getServerSideUserUISettingsProps, getServerSideCommonInitialProps, getServerSideCommonEachProps, isValidCommonEachRouteProps,
+  getServerSideI18nProps, getServerSideCommonInitialProps, getServerSideCommonEachProps, isValidCommonEachRouteProps,
 } from '../common-props';
 import type { GeneralPageInitialProps } from '../general-page';
 import {
-  getServerSideRendererConfigProps, getServerSideSidebarConfigProps,
+  getServerSideRendererConfigProps,
   getActivityAction, isValidInitialAndSameRouteProps,
 } from '../general-page';
 import { getServerSideConfigurationProps } from '../general-page/configuration-props';
@@ -51,18 +52,16 @@ export async function getServerSidePropsForInitial(context: GetServerSidePropsCo
 
   const [
     commonInitialResult,
-    userUIResult,
+    basicLayoutResult,
     serverConfigResult,
     rendererConfigResult,
-    sidebarConfigResult,
     i18nPropsResult,
     pageDataResult,
   ] = await Promise.all([
     getServerSideCommonInitialProps(context),
-    getServerSideUserUISettingsProps(context),
+    getServerSideBasicLayoutProps(context),
     getServerSideConfigurationProps(context),
     getServerSideRendererConfigProps(context),
-    getServerSideSidebarConfigProps(context),
     getServerSideI18nProps(context, ['translation']),
     getPageDataForInitial(context),
   ]);
@@ -70,12 +69,11 @@ export async function getServerSidePropsForInitial(context: GetServerSidePropsCo
   // Merge all results in a type-safe manner (using sequential merging)
   const mergedResult = mergeGetServerSidePropsResults(commonEachPropsResult,
     mergeGetServerSidePropsResults(commonInitialResult,
-      mergeGetServerSidePropsResults(userUIResult,
+      mergeGetServerSidePropsResults(basicLayoutResult,
         mergeGetServerSidePropsResults(serverConfigResult,
           mergeGetServerSidePropsResults(rendererConfigResult,
-            mergeGetServerSidePropsResults(sidebarConfigResult,
-              mergeGetServerSidePropsResults(i18nPropsResult,
-                mergeGetServerSidePropsResults(pageDataResult, nextjsRoutingProps))))))));
+            mergeGetServerSidePropsResults(i18nPropsResult,
+              mergeGetServerSidePropsResults(pageDataResult, nextjsRoutingProps)))))));
 
   // Check for early return (redirect/notFound)
   if ('redirect' in mergedResult || 'notFound' in mergedResult) {

+ 22 - 0
apps/app/src/pages/basic-layout-page/get-server-side-props/index.ts

@@ -0,0 +1,22 @@
+import type { GetServerSideProps, GetServerSidePropsContext } from 'next';
+
+import { mergeGetServerSidePropsResults } from '../../utils/server-side-props';
+
+import { getServerSideSearchConfigurationProps } from './search-configurations';
+import { getServerSideSidebarConfigProps } from './sidebar-configurations';
+import { getServerSideUserUISettingsProps } from './user-ui-settings';
+
+export const getServerSideBasicLayoutProps: GetServerSideProps = async(context: GetServerSidePropsContext) => {
+  const [
+    searchConfigResult,
+    sidebarConfigResult,
+    userUIResult,
+  ] = await Promise.all([
+    getServerSideSearchConfigurationProps(context),
+    getServerSideSidebarConfigProps(context),
+    getServerSideUserUISettingsProps(context),
+  ]);
+
+  return mergeGetServerSidePropsResults(searchConfigResult,
+    mergeGetServerSidePropsResults(sidebarConfigResult, userUIResult));
+};

+ 21 - 0
apps/app/src/pages/basic-layout-page/get-server-side-props/search-configurations.ts

@@ -0,0 +1,21 @@
+import type { GetServerSideProps, GetServerSidePropsContext } from 'next';
+
+import type { CrowiRequest } from '~/interfaces/crowi-request';
+
+import type { SearchConfigurationProps } from '../types';
+
+export const getServerSideSearchConfigurationProps: GetServerSideProps<SearchConfigurationProps> = async(context: GetServerSidePropsContext) => {
+  const req: CrowiRequest = context.req as CrowiRequest;
+  const { crowi } = req;
+  const { configManager, searchService } = crowi;
+
+  return {
+    props: {
+      searchConfig: {
+        isSearchServiceConfigured: searchService.isConfigured,
+        isSearchServiceReachable: searchService.isReachable,
+        isSearchScopeChildrenAsDefault: configManager.getConfig('customize:isSearchScopeChildrenAsDefault'),
+      },
+    },
+  };
+};

+ 20 - 0
apps/app/src/pages/basic-layout-page/get-server-side-props/sidebar-configurations.ts

@@ -0,0 +1,20 @@
+import type { GetServerSideProps, GetServerSidePropsContext } from 'next';
+
+import type { CrowiRequest } from '~/interfaces/crowi-request';
+
+import type { SidebarConfigurationProps } from '../types';
+
+export const getServerSideSidebarConfigProps: GetServerSideProps<SidebarConfigurationProps> = async(context: GetServerSidePropsContext) => {
+  const req: CrowiRequest = context.req as CrowiRequest;
+  const { crowi } = req;
+  const { configManager } = crowi;
+
+  return {
+    props: {
+      sidebarConfig: {
+        isSidebarCollapsedMode: configManager.getConfig('customize:isSidebarCollapsedMode'),
+        isSidebarClosedAtDockMode: configManager.getConfig('customize:isSidebarClosedAtDockMode'),
+      },
+    },
+  };
+};

+ 2 - 3
apps/app/src/pages/common-props/user-ui-settings.ts → apps/app/src/pages/basic-layout-page/get-server-side-props/user-ui-settings.ts

@@ -5,9 +5,8 @@ import type { IUserUISettings } from '~/interfaces/user-ui-settings';
 import type { UserUISettingsDocument } from '~/server/models/user-ui-settings';
 import { getModelSafely } from '~/server/util/mongoose-utils';
 
-export type UserUISettingsProps = {
-  userUISettings?: IUserUISettings,
-};
+import type { UserUISettingsProps } from '../types';
+
 
 export const getServerSideUserUISettingsProps: GetServerSideProps<UserUISettingsProps> = async(context: GetServerSidePropsContext) => {
   const req = context.req as CrowiRequest;

+ 29 - 0
apps/app/src/pages/basic-layout-page/hydrate.ts

@@ -0,0 +1,29 @@
+import { useHydrateAtoms } from 'jotai/utils';
+
+import {
+  isSearchScopeChildrenAsDefaultAtom,
+  isSearchServiceConfiguredAtom,
+  isSearchServiceReachableAtom,
+} from '~/states/server-configurations';
+import { useHydrateSidebarAtoms } from '~/states/ui/sidebar/hydrate';
+
+import type { SearchConfigurationProps, SidebarConfigurationProps, UserUISettingsProps } from './types';
+
+/**
+ * Hook for hydrating server configuration atoms with server-side data
+ * This should be called early in the app component to ensure atoms are properly initialized before rendering
+ */
+export const useHydrateBasicLayoutConfigurationAtoms = (
+    searchConfig: SearchConfigurationProps['searchConfig'] | undefined,
+    sidebarConfig: SidebarConfigurationProps['sidebarConfig'] | undefined,
+    userUISettings: UserUISettingsProps['userUISettings'] | undefined,
+): void => {
+  // Hydrate server configuration atoms with server-side data
+  useHydrateAtoms(searchConfig == null ? [] : [
+    [isSearchServiceConfiguredAtom, searchConfig.isSearchServiceConfigured],
+    [isSearchServiceReachableAtom, searchConfig.isSearchServiceReachable],
+    [isSearchScopeChildrenAsDefaultAtom, searchConfig.isSearchScopeChildrenAsDefault],
+  ]);
+
+  useHydrateSidebarAtoms(sidebarConfig, userUISettings);
+};

+ 2 - 0
apps/app/src/pages/basic-layout-page/index.ts

@@ -0,0 +1,2 @@
+export { getServerSideBasicLayoutProps } from './get-server-side-props';
+export type * from './types';

+ 20 - 0
apps/app/src/pages/basic-layout-page/types.ts

@@ -0,0 +1,20 @@
+import type { ISidebarConfig } from '~/interfaces/sidebar-config';
+import type { IUserUISettings } from '~/interfaces/user-ui-settings';
+
+export type UserUISettingsProps = {
+  userUISettings?: IUserUISettings,
+};
+
+export type SidebarConfigurationProps = {
+  sidebarConfig: ISidebarConfig,
+}
+
+export type SearchConfigurationProps = {
+  searchConfig: {
+    isSearchServiceConfigured: boolean;
+    isSearchServiceReachable: boolean;
+    isSearchScopeChildrenAsDefault: boolean;
+  },
+}
+
+export type BasicLayoutConfigurationProps = UserUISettingsProps & SidebarConfigurationProps & SearchConfigurationProps;

+ 0 - 1
apps/app/src/pages/common-props/index.ts

@@ -3,4 +3,3 @@ export {
   type CommonEachProps, getServerSideCommonEachProps, isValidCommonEachRouteProps,
 } from './commons';
 export { getServerSideI18nProps } from './i18n';
-export { getServerSideUserUISettingsProps, type UserUISettingsProps } from './user-ui-settings';

+ 2 - 20
apps/app/src/pages/general-page/configuration-props.ts

@@ -3,22 +3,7 @@ import type { GetServerSideProps, GetServerSidePropsContext } from 'next';
 import type { CrowiRequest } from '~/interfaces/crowi-request';
 import { RegistrationMode } from '~/interfaces/registration-mode';
 
-import type { RendererConfigProps, ServerConfigurationProps, SidebarConfigProps } from './types';
-
-export const getServerSideSidebarConfigProps: GetServerSideProps<SidebarConfigProps> = async(context: GetServerSidePropsContext) => {
-  const req: CrowiRequest = context.req as CrowiRequest;
-  const { crowi } = req;
-  const { configManager } = crowi;
-
-  return {
-    props: {
-      sidebarConfig: {
-        isSidebarCollapsedMode: configManager.getConfig('customize:isSidebarCollapsedMode'),
-        isSidebarClosedAtDockMode: configManager.getConfig('customize:isSidebarClosedAtDockMode'),
-      },
-    },
-  };
-};
+import type { RendererConfigProps, ServerConfigurationProps } from './types';
 
 export const getServerSideRendererConfigProps: GetServerSideProps<RendererConfigProps> = async(context: GetServerSidePropsContext) => {
   const req: CrowiRequest = context.req as CrowiRequest;
@@ -54,7 +39,7 @@ export const getServerSideConfigurationProps: GetServerSideProps<ServerConfigura
   const req: CrowiRequest = context.req as CrowiRequest;
   const { crowi } = req;
   const {
-    configManager, searchService, aclService, fileUploadService,
+    configManager, aclService, fileUploadService,
     slackIntegrationService, passportService,
   } = crowi;
 
@@ -64,9 +49,6 @@ export const getServerSideConfigurationProps: GetServerSideProps<ServerConfigura
         aiEnabled: configManager.getConfig('app:aiEnabled'),
         limitLearnablePageCountPerAssistant: configManager.getConfig('openai:limitLearnablePageCountPerAssistant'),
         isUsersHomepageDeletionEnabled: configManager.getConfig('security:user-homepage-deletion:isEnabled'),
-        isSearchServiceConfigured: searchService.isConfigured,
-        isSearchServiceReachable: searchService.isReachable,
-        isSearchScopeChildrenAsDefault: configManager.getConfig('customize:isSearchScopeChildrenAsDefault'),
         elasticsearchMaxBodyLengthToIndex: configManager.getConfig('app:elasticsearchMaxBodyLengthToIndex'),
 
         isRomUserAllowedToComment: configManager.getConfig('security:isRomUserAllowedToComment'),

+ 1 - 7
apps/app/src/pages/general-page/use-hydrate-server-configurations.ts → apps/app/src/pages/general-page/hydrate.ts

@@ -6,7 +6,6 @@ import {
   limitLearnablePageCountPerAssistantAtom,
   isUsersHomepageDeletionEnabledAtom,
   defaultIndentSizeAtom,
-  isSearchScopeChildrenAsDefaultAtom,
   elasticsearchMaxBodyLengthToIndexAtom,
   isRomUserAllowedToCommentAtom,
   drawioUriAtom,
@@ -17,8 +16,6 @@ import {
   disableLinkSharingAtom,
   isIndentSizeForcedAtom,
   isEnabledAttachTitleHeaderAtom,
-  isSearchServiceConfiguredAtom,
-  isSearchServiceReachableAtom,
   isSlackConfiguredAtom,
   isAclEnabledAtom,
   isUploadAllFileAllowedAtom,
@@ -35,7 +32,7 @@ import type { ServerConfigurationProps } from './types';
  * Hook for hydrating server configuration atoms with server-side data
  * This should be called early in the app component to ensure atoms are properly initialized before rendering
  */
-export const useHydrateServerConfigurationAtoms = (
+export const useHydrateGeneralPageConfigurationAtoms = (
     serverConfig: ServerConfigurationProps['serverConfig'] | undefined,
     rendererConfigs: RendererConfig | undefined,
 ): void => {
@@ -45,7 +42,6 @@ export const useHydrateServerConfigurationAtoms = (
     [limitLearnablePageCountPerAssistantAtom, serverConfig.limitLearnablePageCountPerAssistant],
     [isUsersHomepageDeletionEnabledAtom, serverConfig.isUsersHomepageDeletionEnabled],
     [defaultIndentSizeAtom, serverConfig.adminPreferredIndentSize],
-    [isSearchScopeChildrenAsDefaultAtom, serverConfig.isSearchScopeChildrenAsDefault],
     [elasticsearchMaxBodyLengthToIndexAtom, serverConfig.elasticsearchMaxBodyLengthToIndex],
     [isRomUserAllowedToCommentAtom, serverConfig.isRomUserAllowedToComment],
     [drawioUriAtom, serverConfig.drawioUri],
@@ -56,8 +52,6 @@ export const useHydrateServerConfigurationAtoms = (
     [disableLinkSharingAtom, serverConfig.disableLinkSharing],
     [isIndentSizeForcedAtom, serverConfig.isIndentSizeForced],
     [isEnabledAttachTitleHeaderAtom, serverConfig.isEnabledAttachTitleHeader],
-    [isSearchServiceConfiguredAtom, serverConfig.isSearchServiceConfigured],
-    [isSearchServiceReachableAtom, serverConfig.isSearchServiceReachable],
     [isSlackConfiguredAtom, serverConfig.isSlackConfigured],
     [isAclEnabledAtom, serverConfig.isAclEnabled],
     [isUploadAllFileAllowedAtom, serverConfig.isUploadAllFileAllowed],

+ 1 - 1
apps/app/src/pages/general-page/index.ts

@@ -1,4 +1,4 @@
-export { getServerSideSidebarConfigProps, getServerSideRendererConfigProps, getServerSideConfigurationProps } from './configuration-props';
+export { getServerSideRendererConfigProps, getServerSideConfigurationProps } from './configuration-props';
 export { getActivityAction } from './get-activity-action';
 export type * from './types';
 export { isValidInitialAndSameRouteProps } from './type-guards';

+ 0 - 8
apps/app/src/pages/general-page/types.ts

@@ -3,17 +3,12 @@ import type {
 } from '@growi/core';
 
 import type { RendererConfig } from '~/interfaces/services/renderer';
-import type { ISidebarConfig } from '~/interfaces/sidebar-config';
 import type { PageDocument } from '~/server/models/page';
 
 import type { CommonInitialProps } from '../common-props';
 
 export type IPageToShowRevisionWithMeta = IDataWithMeta<IPagePopulatedToShowRevision & PageDocument, IPageInfo>;
 
-export type SidebarConfigProps = {
-  sidebarConfig: ISidebarConfig,
-}
-
 export type RendererConfigProps = {
   rendererConfig: RendererConfig,
 }
@@ -24,9 +19,6 @@ export type ServerConfigurationProps = {
     limitLearnablePageCountPerAssistant: number;
     isUsersHomepageDeletionEnabled: boolean;
     adminPreferredIndentSize: number;
-    isSearchServiceConfigured: boolean;
-    isSearchServiceReachable: boolean;
-    isSearchScopeChildrenAsDefault: boolean;
     elasticsearchMaxBodyLengthToIndex: number;
     isRomUserAllowedToComment: boolean;
     drawioUri: string | null;