slate-react 0.73.0 → 0.74.0

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.
@@ -5060,6 +5060,137 @@
5060
5060
  return React.useContext(FocusedContext);
5061
5061
  };
5062
5062
 
5063
+ function isError(error) {
5064
+ return error instanceof Error;
5065
+ }
5066
+ /**
5067
+ * A React context for sharing the editor selector context in a way to control rerenders
5068
+ */
5069
+
5070
+
5071
+ var SlateSelectorContext = /*#__PURE__*/React.createContext({});
5072
+
5073
+ var refEquality = function refEquality(a, b) {
5074
+ return a === b;
5075
+ };
5076
+ /**
5077
+ * use redux style selectors to prevent rerendering on every keystroke.
5078
+ * Bear in mind rerendering can only prevented if the returned value is a value type or for reference types (e.g. objects and arrays) add a custom equality function.
5079
+ *
5080
+ * Example:
5081
+ * ```
5082
+ * const isSelectionActive = useSlateSelector(editor => Boolean(editor.selection));
5083
+ * ```
5084
+ */
5085
+
5086
+
5087
+ function useSlateSelector(selector) {
5088
+ var equalityFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : refEquality;
5089
+
5090
+ var _useReducer = React.useReducer(function (s) {
5091
+ return s + 1;
5092
+ }, 0),
5093
+ _useReducer2 = _slicedToArray(_useReducer, 2),
5094
+ forceRender = _useReducer2[1];
5095
+
5096
+ var context = React.useContext(SlateSelectorContext);
5097
+
5098
+ if (!context) {
5099
+ throw new Error("The `useSlateSelector` hook must be used inside the <Slate> component's context.");
5100
+ }
5101
+
5102
+ var getSlate = context.getSlate,
5103
+ addEventListener = context.addEventListener;
5104
+ var latestSubscriptionCallbackError = React.useRef();
5105
+ var latestSelector = React.useRef(function () {
5106
+ return null;
5107
+ });
5108
+ var latestSelectedState = React.useRef(null);
5109
+ var selectedState;
5110
+
5111
+ try {
5112
+ if (selector !== latestSelector.current || latestSubscriptionCallbackError.current) {
5113
+ selectedState = selector(getSlate());
5114
+ } else {
5115
+ selectedState = latestSelectedState.current;
5116
+ }
5117
+ } catch (err) {
5118
+ if (latestSubscriptionCallbackError.current && isError(err)) {
5119
+ err.message += "\nThe error may be correlated with this previous error:\n".concat(latestSubscriptionCallbackError.current.stack, "\n\n");
5120
+ }
5121
+
5122
+ throw err;
5123
+ }
5124
+
5125
+ useIsomorphicLayoutEffect(function () {
5126
+ latestSelector.current = selector;
5127
+ latestSelectedState.current = selectedState;
5128
+ latestSubscriptionCallbackError.current = undefined;
5129
+ });
5130
+ useIsomorphicLayoutEffect(function () {
5131
+ function checkForUpdates() {
5132
+ try {
5133
+ var newSelectedState = latestSelector.current(getSlate());
5134
+
5135
+ if (equalityFn(newSelectedState, latestSelectedState.current)) {
5136
+ return;
5137
+ }
5138
+
5139
+ latestSelectedState.current = newSelectedState;
5140
+ } catch (err) {
5141
+ // we ignore all errors here, since when the component
5142
+ // is re-rendered, the selectors are called again, and
5143
+ // will throw again, if neither props nor store state
5144
+ // changed
5145
+ latestSubscriptionCallbackError.current = err;
5146
+ }
5147
+
5148
+ forceRender();
5149
+ }
5150
+
5151
+ var unsubscribe = addEventListener(checkForUpdates);
5152
+ checkForUpdates();
5153
+ return function () {
5154
+ return unsubscribe();
5155
+ };
5156
+ }, // don't rerender on equalityFn change since we want to be able to define it inline
5157
+ [addEventListener, getSlate]);
5158
+ return selectedState;
5159
+ }
5160
+ /**
5161
+ * Create selector context with editor updating on every editor change
5162
+ */
5163
+
5164
+ function getSelectorContext(editor) {
5165
+ var eventListeners = React.useRef([]).current;
5166
+ var slateRef = React.useRef({
5167
+ editor: editor
5168
+ }).current;
5169
+ var onChange = React.useCallback(function (editor) {
5170
+ slateRef.editor = editor;
5171
+ eventListeners.forEach(function (listener) {
5172
+ return listener(editor);
5173
+ });
5174
+ }, []);
5175
+ var selectorContext = React.useMemo(function () {
5176
+ return {
5177
+ getSlate: function getSlate() {
5178
+ return slateRef.editor;
5179
+ },
5180
+ addEventListener: function addEventListener(callback) {
5181
+ eventListeners.push(callback);
5182
+ return function () {
5183
+ eventListeners.splice(eventListeners.indexOf(callback), 1);
5184
+ };
5185
+ }
5186
+ };
5187
+ }, [eventListeners, slateRef]);
5188
+ return {
5189
+ selectorContext: selectorContext,
5190
+ onChange: onChange
5191
+ };
5192
+ }
5193
+
5063
5194
  var _excluded = ["editor", "children", "onChange", "value"];
5064
5195
  /**
5065
5196
  * A wrapper around the provider to handle `onChange` events, because the editor
@@ -5092,9 +5223,14 @@
5092
5223
  context = _React$useState2[0],
5093
5224
  setContext = _React$useState2[1];
5094
5225
 
5226
+ var _getSelectorContext = getSelectorContext(editor),
5227
+ selectorContext = _getSelectorContext.selectorContext,
5228
+ handleSelectorChange = _getSelectorContext.onChange;
5229
+
5095
5230
  var onContextChange = React.useCallback(function () {
5096
5231
  onChange(editor.children);
5097
5232
  setContext([editor]);
5233
+ handleSelectorChange(editor);
5098
5234
  }, [onChange]);
5099
5235
  EDITOR_TO_ON_CHANGE.set(editor, onContextChange);
5100
5236
  React.useEffect(function () {
@@ -5130,13 +5266,15 @@
5130
5266
  document.removeEventListener('blur', fn, true);
5131
5267
  };
5132
5268
  }, []);
5133
- return /*#__PURE__*/React__default['default'].createElement(SlateContext.Provider, {
5269
+ return /*#__PURE__*/React__default['default'].createElement(SlateSelectorContext.Provider, {
5270
+ value: selectorContext
5271
+ }, /*#__PURE__*/React__default['default'].createElement(SlateContext.Provider, {
5134
5272
  value: context
5135
5273
  }, /*#__PURE__*/React__default['default'].createElement(EditorContext.Provider, {
5136
5274
  value: editor
5137
5275
  }, /*#__PURE__*/React__default['default'].createElement(FocusedContext.Provider, {
5138
5276
  value: isFocused
5139
- }, children)));
5277
+ }, children))));
5140
5278
  };
5141
5279
 
5142
5280
  /**
@@ -32968,6 +33106,7 @@
32968
33106
  exports.useReadOnly = useReadOnly;
32969
33107
  exports.useSelected = useSelected;
32970
33108
  exports.useSlate = useSlate;
33109
+ exports.useSlateSelector = useSlateSelector;
32971
33110
  exports.useSlateStatic = useSlateStatic;
32972
33111
  exports.withReact = withReact;
32973
33112