@vonaffenfels/slate-editor 1.1.60 → 1.1.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vonaffenfels/slate-editor",
3
- "version": "1.1.60",
3
+ "version": "1.1.65",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -72,7 +72,7 @@
72
72
  "cssnano": "^5.0.1",
73
73
  "escape-html": "^1.0.3"
74
74
  },
75
- "gitHead": "bf2b6e33737a0ebe24e02368b7b218a218b39a51",
75
+ "gitHead": "f14cc08783e4c357ee4c0887fa2965b3d020eda4",
76
76
  "publishConfig": {
77
77
  "access": "public"
78
78
  }
package/src/Renderer.js CHANGED
@@ -2,7 +2,7 @@ import React, {memo} from 'react';
2
2
  import {StorybookContext} from "./Context/StorybookContext";
3
3
  import {Serializer} from "./Serializer";
4
4
 
5
- function Renderer({
5
+ const Renderer = memo(function RendererInner({
6
6
  value,
7
7
  modifyElementFunc,
8
8
  specialClassMap,
@@ -10,6 +10,7 @@ function Renderer({
10
10
  transformAttributes,
11
11
  storybookComponentLoader,
12
12
  storybookComponentDataLoader,
13
+ filterContent,
13
14
  fixedPositions,
14
15
  fixedPositionTypes,
15
16
  adDefinitionDesktop,
@@ -23,6 +24,7 @@ function Renderer({
23
24
  defaultComponentReplacement={defaultComponentReplacement}
24
25
  transformAttributes={transformAttributes}
25
26
  value={value}
27
+ filterContent={filterContent}
26
28
  modifyElementFunc={modifyElementFunc}
27
29
  storybookComponentLoader={storybookComponentLoader}
28
30
  storybookComponentDataLoader={storybookComponentDataLoader}
@@ -31,8 +33,39 @@ function Renderer({
31
33
  adDefinitionDesktop={adDefinitionDesktop}
32
34
  adDefinitionMobile={adDefinitionMobile}
33
35
  isRenderer={true}
34
- onStorybookElementClick={onStorybookElementClick}/>;
35
- }
36
+ onStorybookElementClick={onStorybookElementClick}/>
37
+ }, (prevProps, nextProps) => {
38
+ let allKeys = Array.from(new Set([...Object.keys(nextProps), ...Object.keys(prevProps)]));
39
+
40
+ for (let i = 0; i < allKeys.length; i++) {
41
+ const key = allKeys[i];
42
+ const oldValue = prevProps[key];
43
+ const newValue = nextProps[key];
44
+
45
+ if (oldValue === newValue) {
46
+ continue;
47
+ }
48
+
49
+ if (!oldValue && !newValue) {
50
+ console.warn(`Renderer :: ${key} :: Both empty but type changed?`, {oldValue, newValue});
51
+ continue;
52
+ }
53
+
54
+ if (typeof oldValue === "object" && typeof newValue === "object" && oldValue && newValue) {
55
+ try {
56
+ if (JSON.stringify(oldValue) === JSON.stringify(newValue)) {
57
+ continue;
58
+ }
59
+ } catch (e) {
60
+ return false;
61
+ }
62
+ }
63
+
64
+ return false;
65
+ }
66
+
67
+ return true;
68
+ })
36
69
 
37
70
  const RendererMemo = memo(Renderer);
38
71
 
@@ -1,6 +1,6 @@
1
1
  import React, {
2
2
  isValidElement,
3
- Fragment,
3
+ Fragment, useMemo, useEffect,
4
4
  } from "react";
5
5
  import {Default} from "../Nodes/Default";
6
6
  import {Leaf} from "../Nodes/Leaf";
@@ -62,33 +62,19 @@ export function Serializer({
62
62
  storybookComponentDataLoader,
63
63
  defaultComponentReplacement,
64
64
  modifyElementFunc,
65
+ filterContent = null,
65
66
  isRenderer = false,
66
67
  fixedPositions = {},
67
68
  fixedPositionTypes = {},
68
69
  adDefinitionDesktop = [],
69
70
  adDefinitionMobile = [],
70
71
  }) {
71
- if (value) {
72
- value = value.filter((node) => {
73
- if (!node) {
74
- return false;
75
- }
76
-
77
- if (node.type === "paragraph") {
78
- if (!node.children || node.children.length === 0) {
79
- return false;
80
- }
81
-
82
- let children = node.children.filter((v) => !isEmptyNode(v));
83
-
84
- if (children.length === 0) {
85
- return false;
86
- }
87
- }
88
72
 
89
- return true;
90
- });
91
- }
73
+ const processedValue = useMemo(() => {
74
+ let val = addAdsToValue(value, adDefinitionDesktop, adDefinitionMobile);
75
+ val = addFixedPositionsToValue(val, fixedPositions, fixedPositionTypes);
76
+ return val;
77
+ }, [value, adDefinitionDesktop, adDefinitionMobile, fixedPositions, fixedPositionTypes]);
92
78
 
93
79
  const getPropsForType = (type, isInSlot = false) => {
94
80
  if (!elementPropsMap) {
@@ -230,6 +216,27 @@ export function Serializer({
230
216
  node = modifyElementFunc(node);
231
217
  }
232
218
 
219
+ if (node.type === "paragraph") {
220
+ if (!node.children || node.children.length === 0) {
221
+ return null;
222
+ }
223
+
224
+ let children = node.children.filter((v) => !isEmptyNode(v));
225
+
226
+ if (children.length === 0) {
227
+ return null;
228
+ }
229
+ }
230
+
231
+ try {
232
+ let filterCtx = {content: value};
233
+ if (filterContent && !filterContent(node, filterCtx)) {
234
+ return null;
235
+ }
236
+ } catch (e) {
237
+ console.error(e)
238
+ }
239
+
233
240
  if (!node.children || !node.children.length) {
234
241
  return serializeLeaf(node);
235
242
  }
@@ -254,18 +261,15 @@ export function Serializer({
254
261
  return <Leaf leaf={props} isRenderer={true} typeProps={getPropsForType("leaf")}>{props.text || ""}</Leaf>;
255
262
  }
256
263
 
257
- function renderValue(value) {
258
- let processedValue = addAdsToValue(value, adDefinitionDesktop, adDefinitionMobile);
259
- processedValue = addFixedPositionsToValue(processedValue, fixedPositions, fixedPositionTypes);
260
-
261
- return <>
262
- {!!processedValue && processedValue.map((v, i) => {
263
- return <Fragment key={v.block + "-pos-" + i}>{serializeNode(v, i)}</Fragment>;
264
- })}
265
- </>;
264
+ if (!value) {
265
+ return null;
266
266
  }
267
267
 
268
- return renderValue(value);
268
+ return <>
269
+ {!!processedValue && processedValue.map((v, i) => {
270
+ return <Fragment key={v.block + "-pos-" + i}>{serializeNode(v, i)}</Fragment>;
271
+ })}
272
+ </>;
269
273
  }
270
274
 
271
275
  function getFixedPosition(fixedPositions, i) {