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.
package/dist/index.js CHANGED
@@ -4150,6 +4150,137 @@ var useFocused = function useFocused() {
4150
4150
  return React.useContext(FocusedContext);
4151
4151
  };
4152
4152
 
4153
+ function isError(error) {
4154
+ return error instanceof Error;
4155
+ }
4156
+ /**
4157
+ * A React context for sharing the editor selector context in a way to control rerenders
4158
+ */
4159
+
4160
+
4161
+ var SlateSelectorContext = /*#__PURE__*/React.createContext({});
4162
+
4163
+ var refEquality = function refEquality(a, b) {
4164
+ return a === b;
4165
+ };
4166
+ /**
4167
+ * use redux style selectors to prevent rerendering on every keystroke.
4168
+ * 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.
4169
+ *
4170
+ * Example:
4171
+ * ```
4172
+ * const isSelectionActive = useSlateSelector(editor => Boolean(editor.selection));
4173
+ * ```
4174
+ */
4175
+
4176
+
4177
+ function useSlateSelector(selector) {
4178
+ var equalityFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : refEquality;
4179
+
4180
+ var _useReducer = React.useReducer(function (s) {
4181
+ return s + 1;
4182
+ }, 0),
4183
+ _useReducer2 = _slicedToArray(_useReducer, 2),
4184
+ forceRender = _useReducer2[1];
4185
+
4186
+ var context = React.useContext(SlateSelectorContext);
4187
+
4188
+ if (!context) {
4189
+ throw new Error("The `useSlateSelector` hook must be used inside the <Slate> component's context.");
4190
+ }
4191
+
4192
+ var getSlate = context.getSlate,
4193
+ addEventListener = context.addEventListener;
4194
+ var latestSubscriptionCallbackError = React.useRef();
4195
+ var latestSelector = React.useRef(function () {
4196
+ return null;
4197
+ });
4198
+ var latestSelectedState = React.useRef(null);
4199
+ var selectedState;
4200
+
4201
+ try {
4202
+ if (selector !== latestSelector.current || latestSubscriptionCallbackError.current) {
4203
+ selectedState = selector(getSlate());
4204
+ } else {
4205
+ selectedState = latestSelectedState.current;
4206
+ }
4207
+ } catch (err) {
4208
+ if (latestSubscriptionCallbackError.current && isError(err)) {
4209
+ err.message += "\nThe error may be correlated with this previous error:\n".concat(latestSubscriptionCallbackError.current.stack, "\n\n");
4210
+ }
4211
+
4212
+ throw err;
4213
+ }
4214
+
4215
+ useIsomorphicLayoutEffect(function () {
4216
+ latestSelector.current = selector;
4217
+ latestSelectedState.current = selectedState;
4218
+ latestSubscriptionCallbackError.current = undefined;
4219
+ });
4220
+ useIsomorphicLayoutEffect(function () {
4221
+ function checkForUpdates() {
4222
+ try {
4223
+ var newSelectedState = latestSelector.current(getSlate());
4224
+
4225
+ if (equalityFn(newSelectedState, latestSelectedState.current)) {
4226
+ return;
4227
+ }
4228
+
4229
+ latestSelectedState.current = newSelectedState;
4230
+ } catch (err) {
4231
+ // we ignore all errors here, since when the component
4232
+ // is re-rendered, the selectors are called again, and
4233
+ // will throw again, if neither props nor store state
4234
+ // changed
4235
+ latestSubscriptionCallbackError.current = err;
4236
+ }
4237
+
4238
+ forceRender();
4239
+ }
4240
+
4241
+ var unsubscribe = addEventListener(checkForUpdates);
4242
+ checkForUpdates();
4243
+ return function () {
4244
+ return unsubscribe();
4245
+ };
4246
+ }, // don't rerender on equalityFn change since we want to be able to define it inline
4247
+ [addEventListener, getSlate]);
4248
+ return selectedState;
4249
+ }
4250
+ /**
4251
+ * Create selector context with editor updating on every editor change
4252
+ */
4253
+
4254
+ function getSelectorContext(editor) {
4255
+ var eventListeners = React.useRef([]).current;
4256
+ var slateRef = React.useRef({
4257
+ editor: editor
4258
+ }).current;
4259
+ var onChange = React.useCallback(function (editor) {
4260
+ slateRef.editor = editor;
4261
+ eventListeners.forEach(function (listener) {
4262
+ return listener(editor);
4263
+ });
4264
+ }, []);
4265
+ var selectorContext = React.useMemo(function () {
4266
+ return {
4267
+ getSlate: function getSlate() {
4268
+ return slateRef.editor;
4269
+ },
4270
+ addEventListener: function addEventListener(callback) {
4271
+ eventListeners.push(callback);
4272
+ return function () {
4273
+ eventListeners.splice(eventListeners.indexOf(callback), 1);
4274
+ };
4275
+ }
4276
+ };
4277
+ }, [eventListeners, slateRef]);
4278
+ return {
4279
+ selectorContext: selectorContext,
4280
+ onChange: onChange
4281
+ };
4282
+ }
4283
+
4153
4284
  var _excluded = ["editor", "children", "onChange", "value"];
4154
4285
  /**
4155
4286
  * A wrapper around the provider to handle `onChange` events, because the editor
@@ -4182,9 +4313,14 @@ var Slate = function Slate(props) {
4182
4313
  context = _React$useState2[0],
4183
4314
  setContext = _React$useState2[1];
4184
4315
 
4316
+ var _getSelectorContext = getSelectorContext(editor),
4317
+ selectorContext = _getSelectorContext.selectorContext,
4318
+ handleSelectorChange = _getSelectorContext.onChange;
4319
+
4185
4320
  var onContextChange = React.useCallback(function () {
4186
4321
  onChange(editor.children);
4187
4322
  setContext([editor]);
4323
+ handleSelectorChange(editor);
4188
4324
  }, [onChange]);
4189
4325
  EDITOR_TO_ON_CHANGE.set(editor, onContextChange);
4190
4326
  React.useEffect(function () {
@@ -4220,13 +4356,15 @@ var Slate = function Slate(props) {
4220
4356
  document.removeEventListener('blur', fn, true);
4221
4357
  };
4222
4358
  }, []);
4223
- return /*#__PURE__*/React__default['default'].createElement(SlateContext.Provider, {
4359
+ return /*#__PURE__*/React__default['default'].createElement(SlateSelectorContext.Provider, {
4360
+ value: selectorContext
4361
+ }, /*#__PURE__*/React__default['default'].createElement(SlateContext.Provider, {
4224
4362
  value: context
4225
4363
  }, /*#__PURE__*/React__default['default'].createElement(EditorContext.Provider, {
4226
4364
  value: editor
4227
4365
  }, /*#__PURE__*/React__default['default'].createElement(FocusedContext.Provider, {
4228
4366
  value: isFocused
4229
- }, children)));
4367
+ }, children))));
4230
4368
  };
4231
4369
 
4232
4370
  /**
@@ -4634,6 +4772,7 @@ exports.useFocused = useFocused;
4634
4772
  exports.useReadOnly = useReadOnly;
4635
4773
  exports.useSelected = useSelected;
4636
4774
  exports.useSlate = useSlate;
4775
+ exports.useSlateSelector = useSlateSelector;
4637
4776
  exports.useSlateStatic = useSlateStatic;
4638
4777
  exports.withReact = withReact;
4639
4778
  //# sourceMappingURL=index.js.map