Browse Source

refactor ConflictDiffModal

Yuki Takei 5 months ago
parent
commit
7b0b479811
1 changed files with 44 additions and 18 deletions
  1. 44 18
      apps/app/src/client/components/PageEditor/ConflictDiffModal.tsx

+ 44 - 18
apps/app/src/client/components/PageEditor/ConflictDiffModal.tsx

@@ -32,22 +32,28 @@ type IRevisionOnConflict = {
   user: IUser
 }
 
-type ConflictDiffModalCoreProps = {
+/**
+ * ConflictDiffModalSubstance - Presentation component (heavy logic, rendered only when isOpen)
+ */
+type ConflictDiffModalSubstanceProps = {
   request: IRevisionOnConflict
   latest: IRevisionOnConflict
+  isModalExpanded: boolean
+  setIsModalExpanded: React.Dispatch<React.SetStateAction<boolean>>
 };
 
 const formatedDate = (date: Date): string => {
   return format(date, 'yyyy/MM/dd HH:mm:ss');
 };
 
-const ConflictDiffModalCore = (props: ConflictDiffModalCoreProps): React.JSX.Element => {
-  const { request, latest } = props;
+const ConflictDiffModalSubstance = (props: ConflictDiffModalSubstanceProps): React.JSX.Element => {
+  const {
+    request, latest, isModalExpanded, setIsModalExpanded,
+  } = props;
 
   const [resolvedRevision, setResolvedRevision] = useState<string>('');
   const [isRevisionselected, setIsRevisionSelected] = useState<boolean>(false);
   const [revisionSelectedToggler, setRevisionSelectedToggler] = useState<boolean>(false);
-  const [isModalExpanded, setIsModalExpanded] = useState<boolean>(false);
 
   const { t } = useTranslation();
   const conflictDiffModalStatus = useConflictDiffModalStatus();
@@ -90,11 +96,10 @@ const ConflictDiffModalCore = (props: ConflictDiffModalCoreProps): React.JSX.Ele
         <span className="material-symbols-outlined">close</span>
       </button>
     </div>
-  ), [closeConflictDiffModal, isModalExpanded]);
+  ), [closeConflictDiffModal, isModalExpanded, setIsModalExpanded]);
 
   return (
-    <Modal isOpen={conflictDiffModalStatus?.isOpened} className={`${styles['conflict-diff-modal']} ${isModalExpanded ? ' grw-modal-expanded' : ''}`} size="xl">
-
+    <>
       <ModalHeader tag="h4" className="d-flex align-items-center" close={headerButtons}>
         <span className="material-symbols-outlined me-1">error</span>{t('modal_resolve_conflict.resolve_conflict')}
       </ModalHeader>
@@ -188,11 +193,13 @@ const ConflictDiffModalCore = (props: ConflictDiffModalCoreProps): React.JSX.Ele
           {t('modal_resolve_conflict.resolve_and_save')}
         </button>
       </ModalFooter>
-    </Modal>
+    </>
   );
 };
 
-
+/**
+ * ConflictDiffModal - Container component (lightweight, always rendered)
+ */
 export const ConflictDiffModal = (): React.JSX.Element => {
   const currentUser = useCurrentUser();
   const currentPage = useCurrentPageData();
@@ -206,23 +213,42 @@ export const ConflictDiffModal = (): React.JSX.Element => {
 
   const isRemotePageDataInappropriate = remoteRevisionId == null || remoteRevisionBody == null || remoteRevisionLastUpdateUser == null;
 
-  if (!conflictDiffModalStatus?.isOpened || currentUser == null || currentPage == null || isRemotePageDataInappropriate) {
-    return <></>;
-  }
+  const [isModalExpanded, setIsModalExpanded] = useState<boolean>(false);
+
+  // Check if all required data is available
+  const isDataReady = conflictDiffModalStatus?.isOpened
+    && currentUser != null
+    && currentPage != null
+    && !isRemotePageDataInappropriate;
 
+  // Prepare data for Substance
   const currentTime: Date = new Date();
-
-  const request: IRevisionOnConflict = {
+  const request: IRevisionOnConflict | null = isDataReady ? {
     revisionBody: conflictDiffModalStatus.requestRevisionBody ?? '',
     createdAt: currentTime,
     user: currentUser,
-  };
+  } : null;
 
-  const latest: IRevisionOnConflict = {
+  const latest: IRevisionOnConflict | null = isDataReady ? {
     revisionBody: remoteRevisionBody,
     createdAt: new Date(remoteRevisionLastUpdatedAt ?? currentTime.toString()),
     user: remoteRevisionLastUpdateUser,
-  };
+  } : null;
 
-  return <ConflictDiffModalCore request={request} latest={latest} />;
+  return (
+    <Modal
+      isOpen={conflictDiffModalStatus?.isOpened ?? false}
+      className={`${styles['conflict-diff-modal']} ${isModalExpanded ? ' grw-modal-expanded' : ''}`}
+      size="xl"
+    >
+      {isDataReady && request != null && latest != null && (
+        <ConflictDiffModalSubstance
+          request={request}
+          latest={latest}
+          isModalExpanded={isModalExpanded}
+          setIsModalExpanded={setIsModalExpanded}
+        />
+      )}
+    </Modal>
+  );
 };