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

+ 21 - 0
apps/app/src/pages/_private-legacy-pages/configuration-props.ts

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

+ 23 - 24
apps/app/src/pages/_private-legacy-pages.page.tsx → apps/app/src/pages/_private-legacy-pages/index.page.tsx

@@ -5,32 +5,30 @@ import type {
 import { useTranslation } from 'next-i18next';
 import dynamic from 'next/dynamic';
 import Head from 'next/head';
+import { useIsomorphicLayoutEffect } from 'usehooks-ts';
 
 import { DrawioViewerScript } from '~/components/Script/DrawioViewerScript';
 import type { CrowiRequest } from '~/interfaces/crowi-request';
+import { useIsSearchPage } from '~/states/context';
 import { useHydrateSidebarAtoms } from '~/states/ui/sidebar/hydrate';
 
 import type {
   CommonEachProps,
   CommonInitialProps, UserUISettingsProps,
-} from './common-props';
+} from '../common-props';
 import {
   getServerSideCommonEachProps, getServerSideCommonInitialProps, getServerSideI18nProps, getServerSideUserUISettingsProps,
-} from './common-props';
-import type { RendererConfigProps, SidebarConfigProps } from './general-page';
-import { getServerSideRendererConfigProps, getServerSideSidebarConfigProps } from './general-page';
-import { useCustomTitle } from './utils/page-title-customization';
-import { mergeGetServerSidePropsResults } from './utils/server-side-props';
+} from '../common-props';
+import type { RendererConfigProps, SidebarConfigProps } from '../general-page';
+import { getServerSideRendererConfigProps, getServerSideSidebarConfigProps } from '../general-page';
+import { useCustomTitle } from '../utils/page-title-customization';
+import { mergeGetServerSidePropsResults } from '../utils/server-side-props';
 
-const SearchResultLayout = dynamic(() => import('~/components/Layout/SearchResultLayout'), { ssr: false });
+import type { ServerConfigurationProps } from './types';
+import { useHydrateServerConfigurationAtoms } from './use-hydrate-server-configurations';
 
+const SearchResultLayout = dynamic(() => import('~/components/Layout/SearchResultLayout'), { ssr: false });
 
-type ServerConfigurationProps = {
-  isSearchServiceConfigured: boolean,
-  isSearchServiceReachable: boolean,
-  isSearchScopeChildrenAsDefault: boolean,
-  isEnabledMarp: boolean,
-}
 
 type Props = CommonInitialProps & CommonEachProps & ServerConfigurationProps & RendererConfigProps & UserUISettingsProps & SidebarConfigProps;
 
@@ -44,16 +42,16 @@ const PrivateLegacyPage: NextPage<Props> = (props: Props) => {
   // useHydratePageAtoms(undefined);
   // useCurrentPathname('/_private-legacy-pages');
 
-  // Search
-  useIsSearchPage(true);
-  useIsSearchServiceConfigured(props.isSearchServiceConfigured);
-  useIsSearchServiceReachable(props.isSearchServiceReachable);
-  useIsSearchScopeChildrenAsDefault(props.isSearchScopeChildrenAsDefault);
-  useIsEnabledMarp(props.isEnabledMarp);
+  const [, setSearchPage] = useIsSearchPage();
 
-  // Hydrate sidebar atoms with server-side data
+  // Hydrate server-side data
+  useHydrateServerConfigurationAtoms(props.serverConfig, props.rendererConfig);
   useHydrateSidebarAtoms(props.sidebarConfig, props.userUISettings);
 
+  useIsomorphicLayoutEffect(() => {
+    setSearchPage(true);
+  }, [setSearchPage]);
+
   const title = useCustomTitle(t('private_legacy_pages.title'));
 
   return (
@@ -82,10 +80,11 @@ const getServerSideConfigurationProps: GetServerSideProps<ServerConfigurationPro
 
   return {
     props: {
-      isSearchServiceConfigured: searchService.isConfigured,
-      isSearchServiceReachable: searchService.isReachable,
-      isSearchScopeChildrenAsDefault: configManager.getConfig('customize:isSearchScopeChildrenAsDefault'),
-      isEnabledMarp: configManager.getConfig('customize:isEnabledMarp'),
+      serverConfig: {
+        isSearchServiceConfigured: searchService.isConfigured,
+        isSearchServiceReachable: searchService.isReachable,
+        isSearchScopeChildrenAsDefault: configManager.getConfig('customize:isSearchScopeChildrenAsDefault'),
+      },
     },
   };
 };

+ 7 - 0
apps/app/src/pages/_private-legacy-pages/types.ts

@@ -0,0 +1,7 @@
+export type ServerConfigurationProps = {
+  serverConfig: {
+    isSearchServiceConfigured: boolean;
+    isSearchServiceReachable: boolean;
+    isSearchScopeChildrenAsDefault: boolean;
+  },
+}

+ 28 - 0
apps/app/src/pages/_private-legacy-pages/use-hydrate-server-configurations.ts

@@ -0,0 +1,28 @@
+import { useHydrateAtoms } from 'jotai/utils';
+
+import type { RendererConfig } from '~/interfaces/services/renderer';
+import {
+  isSearchScopeChildrenAsDefaultAtom,
+  isSearchServiceConfiguredAtom,
+  isSearchServiceReachableAtom,
+  rendererConfigAtom,
+} from '~/states/server-configurations/server-configurations';
+
+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 = (
+    serverConfig: ServerConfigurationProps['serverConfig'] | undefined,
+    rendererConfigs: RendererConfig | undefined,
+): void => {
+  // Hydrate server configuration atoms with server-side data
+  useHydrateAtoms(serverConfig == null || rendererConfigs == null ? [] : [
+    [isSearchServiceConfiguredAtom, serverConfig.isSearchServiceConfigured],
+    [isSearchServiceReachableAtom, serverConfig.isSearchServiceReachable],
+    [isSearchScopeChildrenAsDefaultAtom, serverConfig.isSearchScopeChildrenAsDefault],
+    [rendererConfigAtom, rendererConfigs],
+  ]);
+};