From 386c8fe16a3437fb2ffb20cae9c024800f465c35 Mon Sep 17 00:00:00 2001
From: chris <kokosias@yahoo.gr>
Date: Thu, 18 Feb 2021 18:01:48 +0200
Subject: [PATCH] only rerender editor on certain props

---
 editors/editoria/src/Editoria.js              |   7 +-
 .../customtag/CustomTagInlineComponent.js     |  12 +-
 .../EditingSuggestingDropDown.js              |   8 +-
 .../findAndReplace/FindAndReplaceTool.js      |   4 +-
 .../SpecialCharactersTool.js                  |   2 +-
 .../TrackChangeOptionsComponent.js            |   2 +-
 wax-prosemirror-core/src/WaxView.js           | 107 +++++++++---------
 7 files changed, 77 insertions(+), 65 deletions(-)

diff --git a/editors/editoria/src/Editoria.js b/editors/editoria/src/Editoria.js
index 76c7c1409..00db23f7e 100644
--- a/editors/editoria/src/Editoria.js
+++ b/editors/editoria/src/Editoria.js
@@ -52,11 +52,6 @@ const Editoria = () => {
     key = 'editoriaMobile';
   }
 
-  console.log(JSON.stringify('["test"]'));
-  // console.log(
-  //   JSON.parse('[{&quot;item&quot;:&quot;custom-tag-label-1&quot;}]'),
-  // );
-
   const EditoriaComponent = useMemo(
     () => (
       <>
@@ -71,7 +66,7 @@ const Editoria = () => {
           // value={demo}
           // readonly
           layout={layout}
-          onChange={source => console.log(source)}
+          // onChange={source => console.log(source)}
           user={user}
         />
       </>
diff --git a/wax-prosemirror-components/src/components/customtag/CustomTagInlineComponent.js b/wax-prosemirror-components/src/components/customtag/CustomTagInlineComponent.js
index 522afa887..a75341ccc 100644
--- a/wax-prosemirror-components/src/components/customtag/CustomTagInlineComponent.js
+++ b/wax-prosemirror-components/src/components/customtag/CustomTagInlineComponent.js
@@ -1,8 +1,16 @@
 import React, { useMemo, useState, useContext } from 'react';
 import { WaxContext } from 'wax-prosemirror-core';
+import styled from 'styled-components';
 
 import MenuButton from '../../ui/buttons/MenuButton';
 
+const StyledButton = styled(MenuButton)`
+  svg {
+    height: 15px;
+    width: 17px;
+  }
+`;
+
 const CustomTagInlineComponent = ({ view: { state }, item }) => {
   const { icon, title } = item;
   const localInline = JSON.parse(localStorage.getItem('isInline'));
@@ -27,7 +35,7 @@ const CustomTagInlineComponent = ({ view: { state }, item }) => {
 
   return useMemo(
     () => (
-      <MenuButton
+      <StyledButton
         active={isOpen}
         disabled={isDisabled}
         iconName={icon}
@@ -35,7 +43,7 @@ const CustomTagInlineComponent = ({ view: { state }, item }) => {
         title={title}
       />
     ),
-    [isOpen],
+    [isOpen, isDisabled],
   );
 };
 
diff --git a/wax-prosemirror-components/src/components/editingSuggesting/EditingSuggestingDropDown.js b/wax-prosemirror-components/src/components/editingSuggesting/EditingSuggestingDropDown.js
index 7c0dadbae..5ac65f9e2 100644
--- a/wax-prosemirror-components/src/components/editingSuggesting/EditingSuggestingDropDown.js
+++ b/wax-prosemirror-components/src/components/editingSuggesting/EditingSuggestingDropDown.js
@@ -76,9 +76,13 @@ const dropDownOptions = [
 ];
 
 const EditingSuggesting = ({ view: { dispatch, state }, item }) => {
-  const { app, activeView } = useContext(WaxContext);
+  const { app, activeView, view } = useContext(WaxContext);
   const isDisabled = app.config.get('config.EnableTrackChangeService').toggle;
 
+  const isEditable = view.main.props.editable(editable => {
+    return editable;
+  });
+
   const enableDisableTrackChanges = () => {
     app.config.get('config.EnableTrackChangeService').enabled = !app.config.get(
       'config.EnableTrackChangeService',
@@ -109,7 +113,7 @@ const EditingSuggesting = ({ view: { dispatch, state }, item }) => {
     [],
   );
 
-  if (app.config.get('readonly')) return <Viewing />;
+  if (!isEditable) return <Viewing />;
 
   return EditingSuggestingComponent;
 };
diff --git a/wax-prosemirror-components/src/components/findAndReplace/FindAndReplaceTool.js b/wax-prosemirror-components/src/components/findAndReplace/FindAndReplaceTool.js
index 0d843993a..0475fad67 100644
--- a/wax-prosemirror-components/src/components/findAndReplace/FindAndReplaceTool.js
+++ b/wax-prosemirror-components/src/components/findAndReplace/FindAndReplaceTool.js
@@ -69,7 +69,7 @@ const FindAndReplaceTool = ({ view = {}, item }) => {
         />
 
         {isOpen && (
-          <DropWrapper style={style} ref={dropElement}>
+          <DropWrapper ref={dropElement} style={style}>
             <FindAndReplaceComponent
               close={() => {
                 setIsOpen(false);
@@ -79,7 +79,7 @@ const FindAndReplaceTool = ({ view = {}, item }) => {
         )}
       </Wrapper>
     ),
-    [isOpen, style],
+    [isOpen, style, isDisabled],
   );
 
   return MemorizedDropdown;
diff --git a/wax-prosemirror-components/src/components/specialCharacters/SpecialCharactersTool.js b/wax-prosemirror-components/src/components/specialCharacters/SpecialCharactersTool.js
index 4576c9533..2f5d74d33 100644
--- a/wax-prosemirror-components/src/components/specialCharacters/SpecialCharactersTool.js
+++ b/wax-prosemirror-components/src/components/specialCharacters/SpecialCharactersTool.js
@@ -62,7 +62,7 @@ const SpecialCharactersTool = ({ view = {}, item }) => {
         )}
       </Wrapper>
     ),
-    [isOpen],
+    [isOpen, isDisabled],
   );
 
   return MemorizedDropdown;
diff --git a/wax-prosemirror-components/src/components/trackChanges/TrackChangeOptionsComponent.js b/wax-prosemirror-components/src/components/trackChanges/TrackChangeOptionsComponent.js
index ae95ecb26..7f4a06f43 100644
--- a/wax-prosemirror-components/src/components/trackChanges/TrackChangeOptionsComponent.js
+++ b/wax-prosemirror-components/src/components/trackChanges/TrackChangeOptionsComponent.js
@@ -108,7 +108,7 @@ const AcceptRejectAllControls = styled.div`
   position: absolute;
   right: 207px;
   transform-origin: 50% 50% 0px;
-  width: 200px;
+  width: 209px;
   z-index: 9999;
 `;
 
diff --git a/wax-prosemirror-core/src/WaxView.js b/wax-prosemirror-core/src/WaxView.js
index 2ca97051b..b195a3a64 100644
--- a/wax-prosemirror-core/src/WaxView.js
+++ b/wax-prosemirror-core/src/WaxView.js
@@ -1,4 +1,4 @@
-import React, { useRef, useContext, useCallback } from 'react';
+import React, { useRef, useContext, useCallback, useMemo } from 'react';
 
 import applyDevTools from 'prosemirror-dev-tools';
 import { EditorState } from 'prosemirror-state';
@@ -12,60 +12,61 @@ import transformPasted from './helpers/TransformPasted';
 
 export default props => {
   const { readonly, onBlur, options, debug, autoFocus, user } = props;
-
   const editorRef = useRef();
   let view;
   const context = useContext(WaxContext);
 
-  const setEditorRef = useCallback(node => {
-    if (editorRef.current) {
-      // this is where you do cleanup if you have to. the editorRef.current will
-      // still point to the old ref, the old node. so you have some time here to
-      // clean up the unmount if you need to.
-    }
-
-    if (node) {
-      view = new EditorView(
-        { mount: node },
-        {
-          editable: () => !readonly,
-          state: EditorState.create(options),
-          dispatchTransaction,
-          user,
-          scrollMargin: 200,
-          scrollThreshold: 200,
-          handleDOMEvents: {
-            blur: onBlur
-              ? view => {
-                  onBlur(view.state.doc.content);
-                }
-              : null,
+  const setEditorRef = useCallback(
+    node => {
+      if (editorRef.current) {
+        // this is where you do cleanup if you have to. the editorRef.current will
+        // still point to the old ref, the old node. so you have some time here to
+        // clean up the unmount if you need to.
+      }
+      if (node) {
+        view = new EditorView(
+          { mount: node },
+          {
+            editable: () => !readonly,
+            state: EditorState.create(options),
+            dispatchTransaction,
+            user,
+            scrollMargin: 200,
+            scrollThreshold: 200,
+            handleDOMEvents: {
+              blur: onBlur
+                ? view => {
+                    onBlur(view.state.doc.content);
+                  }
+                : null,
+            },
+            transformPasted: slice => {
+              return transformPasted(slice, view);
+            },
+            attributes: {
+              spellcheck: 'false',
+            },
           },
-          transformPasted: slice => {
-            return transformPasted(slice, view);
-          },
-          attributes: {
-            spellcheck: 'false',
-          },
-        },
-      );
+        );
 
-      context.updateView(
-        {
-          main: view,
-        },
-        'main',
-      );
-      if (debug) applyDevTools(view);
-      if (autoFocus)
-        setTimeout(() => {
-          view.focus();
-        }, 1000);
+        context.updateView(
+          {
+            main: view,
+          },
+          'main',
+        );
+        if (debug) applyDevTools(view);
+        if (autoFocus)
+          setTimeout(() => {
+            view.focus();
+          }, 1000);
 
-      return () => view.destroy();
-    }
-    editorRef.current = node;
-  }, []);
+        return () => view.destroy();
+      }
+      editorRef.current = node;
+    },
+    [readonly],
+  );
 
   const dispatchTransaction = transaction => {
     const { TrackChange } = props;
@@ -94,7 +95,11 @@ export default props => {
   };
 
   const editor = <div ref={setEditorRef} />;
-  return props.children({
-    editor,
-  });
+  return useMemo(
+    () =>
+      props.children({
+        editor,
+      }),
+    [readonly],
+  );
 };
-- 
GitLab