Просмотр исходного кода

Refactor generateResolveConflictHandler

Shun Miyazawa 2 лет назад
Родитель
Сommit
d77806cb49
1 измененных файлов с 26 добавлено и 25 удалено
  1. 26 25
      apps/app/src/components/PageEditor/PageEditor.tsx

+ 26 - 25
apps/app/src/components/PageEditor/PageEditor.tsx

@@ -43,13 +43,7 @@ import {
 } from '~/stores/page';
 import { mutatePageTree } from '~/stores/page-listing';
 import type { RemoteRevisionData } from '~/stores/remote-latest-page';
-import {
-  useRemoteRevisionId,
-  useRemoteRevisionBody,
-  useRemoteRevisionLastUpdatedAt,
-  useRemoteRevisionLastUpdateUser,
-  useSetRemoteLatestPageData,
-} from '~/stores/remote-latest-page';
+import { useSetRemoteLatestPageData } from '~/stores/remote-latest-page';
 import { usePreviewOptions } from '~/stores/renderer';
 import {
   EditorMode,
@@ -79,15 +73,21 @@ declare global {
 let isOriginOfScrollSyncEditor = false;
 let isOriginOfScrollSyncPreview = false;
 
+type SaveOptions = {
+  slackChannels: string,
+  overwriteScopesOfDescendants?: boolean
+}
+
 type ConflictHandler = (
   conflictData: RemoteRevisionData,
-  newMarkdown: string
+  newMarkdown: string,
+  saveOptions?: SaveOptions
 ) => void;
 
 type Save = (
   revisionId?: string,
-  opts?: { slackChannels?: string, overwriteScopesOfDescendants?: boolean },
-  onConflict?: ConflictHandler
+  opts?: SaveOptions,
+  onConflict?: ConflictHandler,
 ) => Promise<IPageHasId | null>
 
 type Props = {
@@ -122,11 +122,6 @@ export const PageEditor = React.memo((props: Props): JSX.Element => {
   const { data: acceptedUploadFileType } = useAcceptedUploadFileType();
   const { data: conflictDiffModalStatus, close: closeConflictDiffModal } = useConflictDiffModal();
   const { data: editorSettings } = useEditorSettings();
-  const { mutate: mutateIsLatestRevision } = useIsLatestRevision();
-  const { mutate: mutateRemotePageId } = useRemoteRevisionId();
-  const { mutate: mutateRemoteRevisionId } = useRemoteRevisionBody();
-  const { mutate: mutateRemoteRevisionLastUpdatedAt } = useRemoteRevisionLastUpdatedAt();
-  const { mutate: mutateRemoteRevisionLastUpdateUser } = useRemoteRevisionLastUpdateUser();
   const { setRemoteLatestPageData } = useSetRemoteLatestPageData();
   const { data: user } = useCurrentUser();
   const { onEditorsUpdated } = useEditingUsers();
@@ -203,15 +198,6 @@ export const PageEditor = React.memo((props: Props): JSX.Element => {
 
   }, [socket, checkIsConflict]);
 
-  const generateResolveConflictHandler = useCallback((revisionId: string, onConflict: ConflictHandler) => {
-    //
-  }, []);
-
-  const onConflictHandler: ConflictHandler = useCallback((remoteRevidsionData, newMarkdown) => {
-    setRemoteLatestPageData(remoteRevidsionData);
-
-  }, [setRemoteLatestPageData]);
-
   const save: Save = useCallback(async(revisionId, opts, onConflict) => {
     if (pageId == null || grantData == null) {
       logger.error('Some materials to save are invalid', {
@@ -248,7 +234,7 @@ export const PageEditor = React.memo((props: Props): JSX.Element => {
 
       const remoteRevisionData = extractRemoteRevisionDataFromErrorObj(error);
       if (remoteRevisionData != null) {
-        onConflict?.(remoteRevisionData, newMarkdown);
+        onConflict?.(remoteRevisionData, newMarkdown, opts);
         toastWarning(t('modal_resolve_conflict.conflicts_with_new_body_on_server_side'));
         return null;
       }
@@ -261,6 +247,21 @@ export const PageEditor = React.memo((props: Props): JSX.Element => {
     }
   }, [pageId, grantData, codeMirrorEditor, currentRevisionId, mutateWaitingSaveProcessing, currentPage?.revision?.origin, t]);
 
+  const generateResolveConflictHandler = useCallback((revisionId: string, saveOptions?: SaveOptions, onConflict?: ConflictHandler) => {
+    return async() => {
+      // eslint-disable-next-line @typescript-eslint/no-use-before-define
+      await save(revisionId, saveOptions, onConflict);
+    };
+  }, [save]);
+
+  const onConflictHandler: ConflictHandler = useCallback((remoteRevidsionData, newMarkdown, saveOptions) => {
+    setRemoteLatestPageData(remoteRevidsionData);
+
+    const resolveConflictHandler = generateResolveConflictHandler(remoteRevidsionData.remoteRevisionId, saveOptions, onConflictHandler);
+    resolveConflictHandler();
+
+  }, [generateResolveConflictHandler, setRemoteLatestPageData]);
+
   const saveAndReturnToViewHandler = useCallback(async(opts: {slackChannels: string, overwriteScopesOfDescendants?: boolean}) => {
     const page = await save(currentRevisionId, opts, onConflictHandler);
     if (page == null) {