Yuki Takei 6 месяцев назад
Родитель
Сommit
29e761ea54
1 измененных файлов с 27 добавлено и 30 удалено
  1. 27 30
      apps/app/src/client/components/PageDeleteModal.tsx

+ 27 - 30
apps/app/src/client/components/PageDeleteModal.tsx

@@ -202,7 +202,7 @@ const PageDeleteModal: FC = () => {
     await deletePage();
   }, [deletePage]);
 
-  function renderDeleteRecursivelyForm() {
+  const renderDeleteRecursivelyForm = useCallback(() => {
     return (
       <div className="form-check form-check-warning">
         <input
@@ -219,9 +219,9 @@ const PageDeleteModal: FC = () => {
         </label>
       </div>
     );
-  }
+  }, [isDeleteRecursively, changeIsDeleteRecursivelyHandler, t]);
 
-  function renderDeleteCompletelyForm() {
+  const renderDeleteCompletelyForm = useCallback(() => {
     return (
       <div className="form-check form-check-danger">
         <input
@@ -245,25 +245,9 @@ const PageDeleteModal: FC = () => {
         )}
       </div>
     );
-  }
+  }, [isAbleToDeleteCompletely, isDeleteCompletely, changeIsDeleteCompletelyHandler, t]);
 
-  const renderPagePathsToDelete = () => {
-    const renderingPages = injectedPages != null && injectedPages.length > 0 ? injectedPages : pages;
-
-    if (renderingPages != null) {
-      return renderingPages.map(page => (
-        <p key={page.data._id} className="mb-1">
-          <code>{ page.data.path }</code>
-          { isIPageInfoForEntity(page.meta)
-            && !page.meta.isDeletable
-            && <span className="ms-3 text-danger"><strong>(CAN NOT TO DELETE)</strong></span> }
-        </p>
-      ));
-    }
-    return <></>;
-  };
-
-  const headerContent = () => {
+  const headerContent = useMemo(() => {
     if (!isOpened) {
       return <></>;
     }
@@ -274,27 +258,40 @@ const PageDeleteModal: FC = () => {
         <b>{ t(`modal_delete.delete_${deleteIconAndKey[deleteMode].translationKey}`) }</b>
       </span>
     );
-  };
+  }, [isOpened, deleteMode, t]);
 
-  const bodyContent = () => {
+  const bodyContent = useMemo(() => {
     if (!isOpened) {
       return <></>;
     }
 
+    // Render page paths to delete inline for better performance
+    const renderingPages = injectedPages != null && injectedPages.length > 0 ? injectedPages : pages;
+    const pagePathsElements = renderingPages != null ? renderingPages.map(page => (
+      <p key={page.data._id} className="mb-1">
+        <code>{ page.data.path }</code>
+        { isIPageInfoForEntity(page.meta)
+          && !page.meta.isDeletable
+          && <span className="ms-3 text-danger"><strong>(CAN NOT TO DELETE)</strong></span> }
+      </p>
+    )) : <></>;
+
     return (
       <>
         <div className="grw-scrollable-modal-body pb-1">
           <label className="form-label">{ t('modal_delete.deleting_page') }:</label><br />
           {/* Todo: change the way to show path on modal when too many pages are selected */}
-          {renderPagePathsToDelete()}
+          {pagePathsElements}
         </div>
         { isDeletable && renderDeleteRecursivelyForm()}
         { isDeletable && !forceDeleteCompletelyMode && renderDeleteCompletelyForm() }
       </>
     );
-  };
+    // Optimization: Use direct dependencies instead of JSX.Element reference for better performance
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [isOpened, t, pageIds, pagesLength, injectedPages, isDeletable, renderDeleteRecursivelyForm, forceDeleteCompletelyMode, renderDeleteCompletelyForm]);
 
-  const footerContent = () => {
+  const footerContent = useMemo(() => {
     if (!isOpened) {
       return <></>;
     }
@@ -314,18 +311,18 @@ const PageDeleteModal: FC = () => {
         </button>
       </>
     );
-  };
+  }, [isOpened, errs, deleteMode, isDeletable, deleteButtonHandler, t]);
 
   return (
     <Modal size="lg" isOpen={isOpened} toggle={closeDeleteModal} data-testid="page-delete-modal">
       <ModalHeader toggle={closeDeleteModal}>
-        {headerContent()}
+        {headerContent}
       </ModalHeader>
       <ModalBody>
-        {bodyContent()}
+        {bodyContent}
       </ModalBody>
       <ModalFooter>
-        {footerContent()}
+        {footerContent}
       </ModalFooter>
     </Modal>