slate-react 0.71.0 → 0.71.1-20211141648

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/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # slate-react
2
2
 
3
+ ## 0.71.1-20211141648
4
+
5
+ ### Patch Changes
6
+
7
+ - [#4706](https://github.com/ianstormtaylor/slate/pull/4706) [`6d194077`](https://github.com/ianstormtaylor/slate/commit/6d194077763ec0a9d5642be5cafef20e65dbce8e) Thanks [@BitPhinix](https://github.com/BitPhinix)! - Update android restoreDOM to use partial dom restoring
8
+
9
+ - Updated dependencies [[`2fc7ad92`](https://github.com/ianstormtaylor/slate/commit/2fc7ad924cfbb75de59f685eeabb0375769201b9)]:
10
+ - slate@0.71.1-20211141648
11
+
3
12
  ## 0.71.0
4
13
 
5
14
  ### Minor Changes
@@ -1 +1 @@
1
- {"version":3,"file":"android-editable.d.ts","sourceRoot":"","sources":["../../packages/slate-react/src/components/android/android-editable.tsx"],"names":[],"mappings":";AACA,OAAO,EAAsB,OAAO,EAA2B,MAAM,OAAO,CAAA;AA2B5E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAY3C;;GAEG;AAEH,eAAO,MAAM,eAAe,UAAW,aAAa,KAAG,GAAG,CAAC,OAqb1D,CAAA"}
1
+ {"version":3,"file":"android-editable.d.ts","sourceRoot":"","sources":["../../packages/slate-react/src/components/android/android-editable.tsx"],"names":[],"mappings":";AACA,OAAO,EAAsB,OAAO,EAA2B,MAAM,OAAO,CAAA;AAyB5E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAa3C;;GAEG;AAEH,eAAO,MAAM,eAAe,UAAW,aAAa,KAAG,GAAG,CAAC,OAgb1D,CAAA"}
@@ -20,10 +20,12 @@ import { ReactEditor } from '../../plugin/react-editor';
20
20
  * - Line breaks
21
21
  *
22
22
  * @param editor
23
+ * @param restoreDOM
23
24
  */
24
25
  export declare class AndroidInputManager {
25
26
  private editor;
26
- constructor(editor: ReactEditor);
27
+ private restoreDOM;
28
+ constructor(editor: ReactEditor, restoreDOM: () => void);
27
29
  /**
28
30
  * Handle MutationObserver flush
29
31
  *
@@ -1 +1 @@
1
- {"version":3,"file":"android-input-manager.d.ts","sourceRoot":"","sources":["../../packages/slate-react/src/components/android/android-input-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAuBvD;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,qBAAa,mBAAmB;IAClB,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAIvC;;;;OAIG;IAEH,KAAK,cAAe,cAAc,EAAE,UAYnC;IAED;;;;OAIG;IAEH,OAAO,CAAC,kBAAkB,CAkBzB;IAED;;OAEG;IAEH,OAAO,CAAC,UAAU,CAuBjB;IAED;;OAEG;IAEH,OAAO,CAAC,WAAW,CAsBlB;IAED;;OAEG;IAEH,OAAO,CAAC,wBAAwB,CAY/B;IAED;;OAEG;IAEH,OAAO,CAAC,cAAc,CAOrB;IAED;;OAEG;IACH,OAAO,CAAC,eAAe,CAWtB;CACF;AAED,eAAe,mBAAmB,CAAA"}
1
+ {"version":3,"file":"android-input-manager.d.ts","sourceRoot":"","sources":["../../packages/slate-react/src/components/android/android-input-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAsBvD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,qBAAa,mBAAmB;IAClB,OAAO,CAAC,MAAM;IAAe,OAAO,CAAC,UAAU;gBAAvC,MAAM,EAAE,WAAW,EAAU,UAAU,EAAE,MAAM,IAAI;IAKvE;;;;OAIG;IAEH,KAAK,cAAe,cAAc,EAAE,UAYnC;IAED;;;;OAIG;IAEH,OAAO,CAAC,kBAAkB,CAkBzB;IAED;;OAEG;IAEH,OAAO,CAAC,UAAU,CAuBjB;IAED;;OAEG;IAEH,OAAO,CAAC,WAAW,CAoBlB;IAED;;OAEG;IAEH,OAAO,CAAC,wBAAwB,CAY/B;IAED;;OAEG;IAEH,OAAO,CAAC,cAAc,CAOrB;IAED;;OAEG;IACH,OAAO,CAAC,eAAe,CAWtB;CACF;AAED,eAAe,mBAAmB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-android-input-manager.d.ts","sourceRoot":"","sources":["../../packages/slate-react/src/components/android/use-android-input-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAiC,MAAM,OAAO,CAAA;AAehE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC;;;EA8BlE"}
1
+ {"version":3,"file":"use-android-input-manager.d.ts","sourceRoot":"","sources":["../../packages/slate-react/src/components/android/use-android-input-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0C,MAAM,OAAO,CAAA;AAgBzE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC;;;EAqClE"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare function useRestoreDom(node: React.RefObject<HTMLElement>, receivedUserInput: React.RefObject<boolean>): () => void;
3
+ //# sourceMappingURL=use-restore-dom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-restore-dom.d.ts","sourceRoot":"","sources":["../../packages/slate-react/src/components/android/use-restore-dom.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAA;AAgC7D,wBAAgB,aAAa,CAC3B,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,EAClC,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,cA8C5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../packages/slate-react/src/components/element.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiB,MAAM,OAAO,CAAA;AAErC,OAAO,EAAgB,KAAK,EAAa,OAAO,IAAI,YAAY,EAAE,MAAM,OAAO,CAAA;AAc/E,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACvB,MAAM,YAAY,CAAA;AAEnB;;GAEG;AAEH,QAAA,MAAM,OAAO;iBACE,KAAK,EAAE;aACX,YAAY;6BACG,kBAAkB,KAAK,GAAG,CAAC,OAAO;+BAC/B,sBAAsB,KAAK,GAAG,CAAC,OAAO;0BAC5C,eAAe,KAAK,GAAG,CAAC,OAAO;eACzC,KAAK,GAAG,IAAI;iBAsGxB,CAAA;AAED,QAAA,MAAM,eAAe;iBA7GN,KAAK,EAAE;aACX,YAAY;6BACG,kBAAkB,KAAK,GAAG,CAAC,OAAO;+BAC/B,sBAAsB,KAAK,GAAG,CAAC,OAAO;0BAC5C,eAAe,KAAK,GAAG,CAAC,OAAO;eACzC,KAAK,GAAG,IAAI;kBAmHvB,CAAA;AAEF;;GAEG;AAEH,eAAO,MAAM,cAAc,UAAW,kBAAkB,gBASvD,CAAA;AAED,eAAe,eAAe,CAAA"}
1
+ {"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../packages/slate-react/src/components/element.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2B,MAAM,OAAO,CAAA;AAE/C,OAAO,EAAgB,KAAK,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,OAAO,CAAA;AAcpE,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACvB,MAAM,YAAY,CAAA;AAInB;;GAEG;AAEH,QAAA,MAAM,OAAO;iBACE,KAAK,EAAE;aACX,YAAY;6BACG,kBAAkB,KAAK,GAAG,CAAC,OAAO;+BAC/B,sBAAsB,KAAK,GAAG,CAAC,OAAO;0BAC5C,eAAe,KAAK,GAAG,CAAC,OAAO;eACzC,KAAK,GAAG,IAAI;iBA6GxB,CAAA;AAED,QAAA,MAAM,eAAe;iBApHN,KAAK,EAAE;aACX,YAAY;6BACG,kBAAkB,KAAK,GAAG,CAAC,OAAO;+BAC/B,sBAAsB,KAAK,GAAG,CAAC,OAAO;0BAC5C,eAAe,KAAK,GAAG,CAAC,OAAO;eACzC,KAAK,GAAG,IAAI;kBA0HvB,CAAA;AAEF;;GAEG;AAEH,eAAO,MAAM,cAAc,UAAW,kBAAkB,gBASvD,CAAA;AAED,eAAe,eAAe,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../packages/slate-react/src/components/text.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiB,MAAM,OAAO,CAAA;AACrC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,OAAO,CAAA;AAIzD,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAuEpE,QAAA,MAAM,YAAY;iBAzDH,KAAK,EAAE;YACZ,OAAO;YACP,OAAO;+BACY,sBAAsB,KAAK,GAAG,CAAC,OAAO;0BAC5C,eAAe,KAAK,GAAG,CAAC,OAAO;UAC9C,SAAS;kBA4Df,CAAA;AAEF,eAAe,YAAY,CAAA"}
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../packages/slate-react/src/components/text.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiB,MAAM,OAAO,CAAA;AACrC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,OAAO,CAAA;AAIzD,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AA2EpE,QAAA,MAAM,YAAY;iBA3DH,KAAK,EAAE;YACZ,OAAO;YACP,OAAO;+BACY,sBAAsB,KAAK,GAAG,CAAC,OAAO;0BAC5C,eAAe,KAAK,GAAG,CAAC,OAAO;UAC9C,SAAS;kBA8Df,CAAA;AAEF,eAAe,YAAY,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-children.d.ts","sourceRoot":"","sources":["../packages/slate-react/src/hooks/use-children.tsx"],"names":[],"mappings":";AACA,OAAO,EAAU,KAAK,EAAE,OAAO,EAAa,QAAQ,EAAc,MAAM,OAAO,CAAA;AAQ/E,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACvB,MAAM,wBAAwB,CAAA;AAG/B;;GAEG;AAEH,QAAA,MAAM,WAAW;iBACF,KAAK,EAAE;UACd,QAAQ;6BACU,kBAAkB,KAAK,GAAG,CAAC,OAAO;+BAC/B,sBAAsB,KAAK,GAAG,CAAC,OAAO;0BAC5C,eAAe,KAAK,GAAG,CAAC,OAAO;eACzC,KAAK,GAAG,IAAI;mBAoExB,CAAA;AAED,eAAe,WAAW,CAAA"}
1
+ {"version":3,"file":"use-children.d.ts","sourceRoot":"","sources":["../packages/slate-react/src/hooks/use-children.tsx"],"names":[],"mappings":";AACA,OAAO,EAAU,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAc,MAAM,OAAO,CAAA;AAQpE,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACvB,MAAM,wBAAwB,CAAA;AAG/B;;GAEG;AAEH,QAAA,MAAM,WAAW;iBACF,KAAK,EAAE;UACd,QAAQ;6BACU,kBAAkB,KAAK,GAAG,CAAC,OAAO;+BAC/B,sBAAsB,KAAK,GAAG,CAAC,OAAO;0BAC5C,eAAe,KAAK,GAAG,CAAC,OAAO;eACzC,KAAK,GAAG,IAAI;mBAoExB,CAAA;AAED,eAAe,WAAW,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { Node as SlateNode } from 'slate';
2
+ export declare function useContentKey(node: SlateNode): number;
3
+ //# sourceMappingURL=use-content-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-content-key.d.ts","sourceRoot":"","sources":["../packages/slate-react/src/hooks/use-content-key.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,OAAO,CAAA;AAGzC,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,UAiC5C"}
package/dist/index.es.js CHANGED
@@ -1,4 +1,4 @@
1
- import React, { useRef, useEffect, useLayoutEffect, useContext, createContext, useState, useMemo, useCallback } from 'react';
1
+ import React, { useRef, useEffect, useLayoutEffect, useState, Fragment, useContext, createContext, useMemo, useCallback } from 'react';
2
2
  import { Path, Node, Editor, Text as Text$1, Range, Element as Element$1, Transforms } from 'slate';
3
3
  import getDirection from 'direction';
4
4
  import debounce from 'lodash/debounce';
@@ -177,7 +177,7 @@ var IS_FOCUSED = new WeakMap();
177
177
  */
178
178
 
179
179
  var EDITOR_TO_ON_CHANGE = new WeakMap();
180
- var EDITOR_TO_RESTORE_DOM = new WeakMap();
180
+ var NODE_TO_RESTORE_DOM = new WeakMap();
181
181
  /**
182
182
  * Symbols.
183
183
  */
@@ -327,6 +327,36 @@ var isDecoratorRangeListEqual = (list, another) => {
327
327
  return true;
328
328
  };
329
329
 
330
+ function useContentKey(node) {
331
+ var contentKeyRef = useRef(0);
332
+ var updateAnimationFrameRef = useRef(null);
333
+ var [, setForceRerenderCounter] = useState(0);
334
+ useEffect(() => {
335
+ NODE_TO_RESTORE_DOM.set(node, () => {
336
+ // Update is already queued and node hasn't re-render yet
337
+ if (updateAnimationFrameRef.current) {
338
+ return;
339
+ }
340
+
341
+ updateAnimationFrameRef.current = requestAnimationFrame(() => {
342
+ setForceRerenderCounter(state => state + 1);
343
+ updateAnimationFrameRef.current = null;
344
+ });
345
+ contentKeyRef.current++;
346
+ });
347
+ return () => {
348
+ NODE_TO_RESTORE_DOM.delete(node);
349
+ };
350
+ }, [node]); // Node was restored => clear scheduled update
351
+
352
+ if (updateAnimationFrameRef.current) {
353
+ cancelAnimationFrame(updateAnimationFrameRef.current);
354
+ updateAnimationFrameRef.current = null;
355
+ }
356
+
357
+ return contentKeyRef.current;
358
+ }
359
+
330
360
  /**
331
361
  * Text.
332
362
  */
@@ -372,9 +402,11 @@ var Text = props => {
372
402
  NODE_TO_ELEMENT.delete(text);
373
403
  }
374
404
  });
405
+ var contentKey = IS_ANDROID ? useContentKey(text) : undefined;
375
406
  return /*#__PURE__*/React.createElement("span", {
376
407
  "data-slate-node": "text",
377
- ref: ref
408
+ ref: ref,
409
+ key: contentKey
378
410
  }, children);
379
411
  };
380
412
 
@@ -472,11 +504,20 @@ var Element = props => {
472
504
  NODE_TO_ELEMENT.delete(element);
473
505
  }
474
506
  });
475
- return renderElement({
507
+ var content = renderElement({
476
508
  attributes,
477
509
  children,
478
510
  element
479
511
  });
512
+
513
+ if (IS_ANDROID) {
514
+ var contentKey = useContentKey(element);
515
+ return /*#__PURE__*/React.createElement(Fragment, {
516
+ key: contentKey
517
+ }, content);
518
+ }
519
+
520
+ return content;
480
521
  };
481
522
 
482
523
  var MemoizedElement = /*#__PURE__*/React.memo(Element, (prev, next) => {
@@ -3032,19 +3073,6 @@ var isRemoveLeafNodes = (_, _ref7) => {
3032
3073
  return removedNodes.length > 0 && addedNodes.length === 0 && characterDataMutations.length > 0;
3033
3074
  };
3034
3075
 
3035
- function restoreDOM(editor) {
3036
- try {
3037
- var onRestoreDOM = EDITOR_TO_RESTORE_DOM.get(editor);
3038
-
3039
- if (onRestoreDOM) {
3040
- onRestoreDOM();
3041
- }
3042
- } catch (err) {
3043
- // eslint-disable-next-line no-console
3044
- console.error(err);
3045
- }
3046
- }
3047
-
3048
3076
  function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
3049
3077
 
3050
3078
  function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
@@ -3069,12 +3097,14 @@ function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) {
3069
3097
  * - Line breaks
3070
3098
  *
3071
3099
  * @param editor
3100
+ * @param restoreDOM
3072
3101
  */
3073
3102
 
3074
3103
 
3075
3104
  class AndroidInputManager {
3076
- constructor(editor) {
3105
+ constructor(editor, restoreDOM) {
3077
3106
  this.editor = editor;
3107
+ this.restoreDOM = restoreDOM;
3078
3108
  /**
3079
3109
  * Handle MutationObserver flush
3080
3110
  *
@@ -3089,7 +3119,7 @@ class AndroidInputManager {
3089
3119
  // eslint-disable-next-line no-console
3090
3120
  console.error(err); // Failed to reconcile mutations, restore DOM to its previous state
3091
3121
 
3092
- restoreDOM(this.editor);
3122
+ this.restoreDOM();
3093
3123
  }
3094
3124
  };
3095
3125
  /**
@@ -3161,10 +3191,8 @@ class AndroidInputManager {
3161
3191
  var {
3162
3192
  selection
3163
3193
  } = this.editor;
3164
- Editor.insertBreak(this.editor); // To-do: Need a more granular solution to restoring only a specific portion
3165
- // of the document. Restoring the entire document is expensive.
3166
-
3167
- restoreDOM(this.editor);
3194
+ Editor.insertBreak(this.editor);
3195
+ this.restoreDOM();
3168
3196
 
3169
3197
  if (selection) {
3170
3198
  // Compat: Move selection to the newly inserted block if it has not moved
@@ -3189,7 +3217,7 @@ class AndroidInputManager {
3189
3217
  Editor.insertText(this.editor, text);
3190
3218
  }
3191
3219
 
3192
- restoreDOM(this.editor);
3220
+ this.restoreDOM();
3193
3221
  };
3194
3222
  /**
3195
3223
  * Handle `backspace` that merges blocks
@@ -3199,7 +3227,7 @@ class AndroidInputManager {
3199
3227
  this.deleteBackward = () => {
3200
3228
  Editor.deleteBackward(this.editor);
3201
3229
  ReactEditor.focus(this.editor);
3202
- restoreDOM(this.editor);
3230
+ this.restoreDOM();
3203
3231
  };
3204
3232
  /**
3205
3233
  * Handle mutations that remove specific leaves
@@ -3215,12 +3243,13 @@ class AndroidInputManager {
3215
3243
  Transforms.delete(this.editor, {
3216
3244
  at: path
3217
3245
  });
3218
- restoreDOM(this.editor);
3246
+ this.restoreDOM();
3219
3247
  }
3220
3248
  }
3221
3249
  };
3222
3250
 
3223
3251
  this.editor = editor;
3252
+ this.restoreDOM = restoreDOM;
3224
3253
  }
3225
3254
 
3226
3255
  }
@@ -3243,6 +3272,70 @@ function useMutationObserver(node, callback, options) {
3243
3272
  });
3244
3273
  }
3245
3274
 
3275
+ var MUTATION_OBSERVER_CONFIG$1 = {
3276
+ childList: true,
3277
+ characterData: true,
3278
+ subtree: true
3279
+ };
3280
+
3281
+ function findClosestKnowSlateNode(domNode) {
3282
+ var _domEl;
3283
+
3284
+ var domEl = isDOMElement(domNode) ? domNode : domNode.parentElement;
3285
+
3286
+ if (domEl && !domEl.hasAttribute('data-slate-node')) {
3287
+ domEl = domEl.closest("[data-slate-node]");
3288
+ }
3289
+
3290
+ var slateNode = domEl && ELEMENT_TO_NODE.get(domEl);
3291
+
3292
+ if (slateNode) {
3293
+ return slateNode;
3294
+ } // Unknown dom element with a slate-slate-node attribute => the IME
3295
+ // most likely duplicated the node so we have to restore the parent
3296
+
3297
+
3298
+ return (_domEl = domEl) !== null && _domEl !== void 0 && _domEl.parentElement ? findClosestKnowSlateNode(domEl.parentElement) : null;
3299
+ }
3300
+
3301
+ function useRestoreDom(node, receivedUserInput) {
3302
+ var editor = useSlateStatic();
3303
+ var mutatedNodes = useRef(new Set());
3304
+ var handleDOMMutation = useCallback(mutations => {
3305
+ if (!receivedUserInput.current) {
3306
+ return;
3307
+ }
3308
+
3309
+ mutations.forEach(_ref => {
3310
+ var {
3311
+ target
3312
+ } = _ref;
3313
+ var slateNode = findClosestKnowSlateNode(target);
3314
+
3315
+ if (!slateNode) {
3316
+ return;
3317
+ }
3318
+
3319
+ return mutatedNodes.current.add(slateNode);
3320
+ });
3321
+ }, []);
3322
+ useMutationObserver(node, handleDOMMutation, MUTATION_OBSERVER_CONFIG$1); // Clear mutated nodes on every render
3323
+
3324
+ mutatedNodes.current.clear();
3325
+ var restore = useCallback(() => {
3326
+ var mutated = Array.from(mutatedNodes.current.values()); // Filter out child nodes of nodes that will be restored anyway
3327
+
3328
+ var nodesToRestore = mutated.filter(n => !mutated.some(m => Path.isParent(ReactEditor.findPath(editor, m), ReactEditor.findPath(editor, n))));
3329
+ nodesToRestore.forEach(n => {
3330
+ var _NODE_TO_RESTORE_DOM$;
3331
+
3332
+ (_NODE_TO_RESTORE_DOM$ = NODE_TO_RESTORE_DOM.get(n)) === null || _NODE_TO_RESTORE_DOM$ === void 0 ? void 0 : _NODE_TO_RESTORE_DOM$();
3333
+ });
3334
+ mutatedNodes.current.clear();
3335
+ }, []);
3336
+ return restore;
3337
+ }
3338
+
3246
3339
  function useTrackUserInput() {
3247
3340
  var editor = useSlateStatic();
3248
3341
  var receivedUserInput = useRef(false);
@@ -3282,11 +3375,12 @@ var MUTATION_OBSERVER_CONFIG = {
3282
3375
  };
3283
3376
  function useAndroidInputManager(node) {
3284
3377
  var editor = useSlateStatic();
3285
- var [inputManager] = useState(() => new AndroidInputManager(editor));
3286
3378
  var {
3287
3379
  receivedUserInput,
3288
3380
  onUserInput
3289
3381
  } = useTrackUserInput();
3382
+ var restoreDom = useRestoreDom(node, receivedUserInput);
3383
+ var inputManager = useMemo(() => new AndroidInputManager(editor, restoreDom), [restoreDom, editor]);
3290
3384
  var timeoutId = useRef(null);
3291
3385
  var isReconciling = useRef(false);
3292
3386
  var flush = useCallback(mutations => {
@@ -3347,10 +3441,7 @@ var AndroidEditable = props => {
3347
3441
  isUpdatingSelection: false,
3348
3442
  latestElement: null
3349
3443
  }), []);
3350
- var [contentKey, setContentKey] = useState(0);
3351
- var onRestoreDOM = useCallback(() => {
3352
- setContentKey(prev => prev + 1);
3353
- }, [contentKey]); // Whenever the editor updates...
3444
+ var contentKey = useContentKey(editor); // Whenever the editor updates...
3354
3445
 
3355
3446
  useIsomorphicLayoutEffect(() => {
3356
3447
  // Update element-related weak maps with the DOM element ref.
@@ -3361,10 +3452,8 @@ var AndroidEditable = props => {
3361
3452
  EDITOR_TO_ELEMENT.set(editor, ref.current);
3362
3453
  NODE_TO_ELEMENT.set(editor, ref.current);
3363
3454
  ELEMENT_TO_NODE.set(ref.current, editor);
3364
- EDITOR_TO_RESTORE_DOM.set(editor, onRestoreDOM);
3365
3455
  } else {
3366
3456
  NODE_TO_ELEMENT.delete(editor);
3367
- EDITOR_TO_RESTORE_DOM.delete(editor);
3368
3457
  }
3369
3458
 
3370
3459
  try {