Procházet zdrojové kódy

refactor redirectFrom

Yuki Takei před 7 měsíci
rodič
revize
7308c936de

+ 2 - 2
apps/app/src/components/PageView/PageAlerts/PageRedirectedAlert.tsx

@@ -3,12 +3,12 @@ import React, { useState, useCallback, type JSX } from 'react';
 import { useTranslation } from 'next-i18next';
 import { useTranslation } from 'next-i18next';
 
 
 import { useCurrentPagePath } from '~/states/page';
 import { useCurrentPagePath } from '~/states/page';
-import { useRedirectFrom } from '~/stores/page-redirect';
+import { useRedirectFrom } from '~/states/page/redirect';
 
 
 export const PageRedirectedAlert = React.memo((): JSX.Element => {
 export const PageRedirectedAlert = React.memo((): JSX.Element => {
   const { t } = useTranslation();
   const { t } = useTranslation();
   const currentPagePath = useCurrentPagePath();
   const currentPagePath = useCurrentPagePath();
-  const { data: redirectFrom } = useRedirectFrom();
+  const [redirectFrom] = useRedirectFrom();
 
 
   const [isUnlinked, setIsUnlinked] = useState(false);
   const [isUnlinked, setIsUnlinked] = useState(false);
 
 

+ 3 - 10
apps/app/src/pages/[[...path]]/index.page.tsx

@@ -18,7 +18,6 @@ import {
   useCurrentPageData, useCurrentPageId, useCurrentPagePath, usePageNotFound,
   useCurrentPageData, useCurrentPageId, useCurrentPagePath, usePageNotFound,
 } from '~/states/page';
 } from '~/states/page';
 import { useHydratePageAtoms } from '~/states/page/hydrate';
 import { useHydratePageAtoms } from '~/states/page/hydrate';
-import { useRedirectFrom } from '~/states/page/redirect';
 import { useRendererConfig } from '~/states/server-configurations';
 import { useRendererConfig } from '~/states/server-configurations';
 import { useSetupGlobalSocket, useSetupGlobalSocketForPage } from '~/states/socket-io';
 import { useSetupGlobalSocket, useSetupGlobalSocketForPage } from '~/states/socket-io';
 import { useEditingMarkdown } from '~/states/ui/editor';
 import { useEditingMarkdown } from '~/states/ui/editor';
@@ -88,14 +87,15 @@ const Page: NextPageWithLayout<Props> = (props: Props) => {
 
 
   // Initialize Jotai atoms with initial data - must be called unconditionally
   // Initialize Jotai atoms with initial data - must be called unconditionally
   const pageData = isInitialProps(props) ? props.pageWithMeta?.data : undefined;
   const pageData = isInitialProps(props) ? props.pageWithMeta?.data : undefined;
-  useHydratePageAtoms(pageData);
+  useHydratePageAtoms(pageData, {
+    redirectFrom: props.redirectFrom ?? undefined,
+  });
 
 
   const currentPage = useCurrentPageData();
   const currentPage = useCurrentPageData();
   const pageId = useCurrentPageId();
   const pageId = useCurrentPageId();
   const currentPagePath = useCurrentPagePath();
   const currentPagePath = useCurrentPagePath();
   const isNotFound = usePageNotFound();
   const isNotFound = usePageNotFound();
   const rendererConfig = useRendererConfig();
   const rendererConfig = useRendererConfig();
-  const [, setRedirectFrom] = useRedirectFrom();
   const [, setEditingMarkdown] = useEditingMarkdown();
   const [, setEditingMarkdown] = useEditingMarkdown();
 
 
   const { trigger: mutateCurrentPageYjsDataFromApi } = useSWRMUTxCurrentPageYjsData();
   const { trigger: mutateCurrentPageYjsDataFromApi } = useSWRMUTxCurrentPageYjsData();
@@ -111,13 +111,6 @@ const Page: NextPageWithLayout<Props> = (props: Props) => {
   // If initial props and skipSSR, fetch page data on client-side
   // If initial props and skipSSR, fetch page data on client-side
   useInitialCSRFetch(isInitialProps(props) && props.skipSSR);
   useInitialCSRFetch(isInitialProps(props) && props.skipSSR);
 
 
-  // Initialize redirectFrom atom values
-  useEffect(() => {
-    setRedirectFrom(props.redirectFrom ?? null);
-    // cleanup
-    return () => setRedirectFrom(null);
-  }, [props.redirectFrom, setRedirectFrom]);
-
   // Optimized effects with minimal dependencies
   // Optimized effects with minimal dependencies
   useEffect(() => {
   useEffect(() => {
     // Load YJS data only when revision changes and page exists
     // Load YJS data only when revision changes and page exists

+ 3 - 0
apps/app/src/states/page/hooks.ts

@@ -12,6 +12,7 @@ import {
   latestRevisionAtom,
   latestRevisionAtom,
   pageNotCreatableAtom,
   pageNotCreatableAtom,
   pageNotFoundAtom,
   pageNotFoundAtom,
+  redirectFromAtom,
   remoteRevisionBodyAtom,
   remoteRevisionBodyAtom,
   remoteRevisionIdAtom,
   remoteRevisionIdAtom,
   remoteRevisionLastUpdatedAtAtom,
   remoteRevisionLastUpdatedAtAtom,
@@ -54,6 +55,8 @@ export const useRemoteRevisionLastUpdateUser = () =>
 export const useRemoteRevisionLastUpdatedAt = () =>
 export const useRemoteRevisionLastUpdatedAt = () =>
   useAtomValue(remoteRevisionLastUpdatedAtAtom);
   useAtomValue(remoteRevisionLastUpdatedAtAtom);
 
 
+export const useRedirectFrom = () => useAtomValue(redirectFromAtom);
+
 // Enhanced computed hooks (pure Jotai - no SWR needed)
 // Enhanced computed hooks (pure Jotai - no SWR needed)
 
 
 /**
 /**

+ 15 - 6
apps/app/src/states/page/hydrate.ts

@@ -7,6 +7,7 @@ import {
   latestRevisionAtom,
   latestRevisionAtom,
   pageNotCreatableAtom,
   pageNotCreatableAtom,
   pageNotFoundAtom,
   pageNotFoundAtom,
+  redirectFromAtom,
   remoteRevisionBodyAtom,
   remoteRevisionBodyAtom,
   remoteRevisionIdAtom,
   remoteRevisionIdAtom,
   shareLinkIdAtom,
   shareLinkIdAtom,
@@ -44,8 +45,9 @@ export const useHydratePageAtoms = (
     isNotCreatable?: boolean;
     isNotCreatable?: boolean;
     isLatestRevision?: boolean;
     isLatestRevision?: boolean;
     shareLinkId?: string;
     shareLinkId?: string;
-    templateTags?: string[];
-    templateBody?: string;
+    redirectFrom?: string; // always overwrited
+    templateTags?: string[]; // always overwrited
+    templateBody?: string; // always overwrited
   },
   },
 ): void => {
 ): void => {
   useHydrateAtoms([
   useHydrateAtoms([
@@ -59,12 +61,19 @@ export const useHydratePageAtoms = (
     // ShareLink page state
     // ShareLink page state
     [shareLinkIdAtom, options?.shareLinkId],
     [shareLinkIdAtom, options?.shareLinkId],
 
 
-    // Template data - from options (not auto-extracted from page)
-    [templateTagsAtom, options?.templateTags ?? []],
-    [templateBodyAtom, options?.templateBody ?? ''],
-
     // Remote revision data - auto-extracted from page.revision
     // Remote revision data - auto-extracted from page.revision
     [remoteRevisionIdAtom, page?.revision?._id],
     [remoteRevisionIdAtom, page?.revision?._id],
     [remoteRevisionBodyAtom, page?.revision?.body],
     [remoteRevisionBodyAtom, page?.revision?.body],
   ]);
   ]);
+
+  // always overwrited
+  useHydrateAtoms(
+    [
+      [redirectFromAtom, options?.redirectFrom ?? undefined],
+      // Template data - from options (not auto-extracted from page)
+      [templateTagsAtom, options?.templateTags ?? []],
+      [templateBodyAtom, options?.templateBody ?? ''],
+    ],
+    { dangerouslyForceHydrate: true },
+  );
 };
 };

+ 5 - 0
apps/app/src/states/page/internal-atoms.ts

@@ -111,3 +111,8 @@ export const setRemoteRevisionDataAtom = atom(
     }
     }
   },
   },
 );
 );
+
+/**
+ * Atom for redirect from path
+ */
+export const redirectFromAtom = atom<string | undefined>(undefined);

+ 0 - 8
apps/app/src/states/page/redirect.ts

@@ -1,8 +0,0 @@
-import { atom, useAtom } from 'jotai';
-
-/**
- * Atom for redirect from path
- */
-const redirectFromAtom = atom<string | null>(null);
-
-export const useRedirectFrom = () => useAtom(redirectFromAtom);

+ 0 - 8
apps/app/src/stores/page-redirect.tsx

@@ -1,8 +0,0 @@
-import type { SWRResponse } from 'swr';
-
-import { useStaticSWR } from './use-static-swr';
-
-
-export const useRedirectFrom = (initialData?: string | null): SWRResponse<string | null, Error> => {
-  return useStaticSWR('redirectFrom', initialData);
-};