react-sync-board 0.6.0 → 0.6.1

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/esm/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import React__default, { forwardRef, useContext, createContext, createElement, Fragment, useRef, useLayoutEffect, useEffect, useMemo, memo } from 'react';
2
+ import React__default, { forwardRef, useContext, createContext, createElement, Fragment, useRef, useLayoutEffect, useEffect, useMemo, memo, useCallback } from 'react';
3
3
  import { atom, selector, useRecoilValue, useRecoilCallback, useRecoilState, useSetRecoilState, RecoilRoot } from 'recoil';
4
4
 
5
5
  function ownKeys(object, enumerableOnly) {
@@ -4110,10 +4110,6 @@ var useItemList = function useItemList() {
4110
4110
  return items;
4111
4111
  };
4112
4112
 
4113
- var useSelectedItems = function useSelectedItems() {
4114
- return useRecoilValue(SelectedItemsAtom);
4115
- };
4116
-
4117
4113
  /**
4118
4114
  * Run effect only when component is unmounted.
4119
4115
  *
@@ -4301,6 +4297,28 @@ function useThrottledCallback(callback, deps, delay, noTrailing) {
4301
4297
  }, __spreadArray([delay, noTrailing], deps, true));
4302
4298
  }
4303
4299
 
4300
+ /* eslint-disable @typescript-eslint/no-explicit-any */
4301
+ /**
4302
+ * Like `useEffect`, but passed function is debounced.
4303
+ *
4304
+ * @param callback Callback like for `useEffect`, but without ability to return
4305
+ * a cleanup function.
4306
+ * @param deps Dependencies list that will be passed to underlying `useEffect`
4307
+ * and `useDebouncedCallback`.
4308
+ * @param delay Debounce delay.
4309
+ * @param maxWait Maximum amount of milliseconds that function can be delayed
4310
+ * before it's force execution. 0 means no max wait.
4311
+ */
4312
+
4313
+ function useDebouncedEffect(callback, deps, delay, maxWait) {
4314
+ if (maxWait === void 0) {
4315
+ maxWait = 0;
4316
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
4317
+
4318
+
4319
+ useEffect(useDebouncedCallback(callback, deps, delay, maxWait), deps);
4320
+ }
4321
+
4304
4322
  /* eslint-disable @typescript-eslint/no-explicit-any */
4305
4323
  /**
4306
4324
  * Like `useEffect`, but passed function is throttled.
@@ -4445,6 +4463,45 @@ function useResizeObserver(target, callback, enabled) {
4445
4463
  }, [target, ro]);
4446
4464
  }
4447
4465
 
4466
+ var useDebouncedItems = function useDebouncedItems() {
4467
+ var items = useRecoilValue(AllItemsSelector);
4468
+
4469
+ var _React$useState = React__default.useState(items),
4470
+ _React$useState2 = _slicedToArray(_React$useState, 2),
4471
+ debouncedItems = _React$useState2[0],
4472
+ setDebouncedItems = _React$useState2[1];
4473
+
4474
+ var updateDebouncedItems = useRecoilCallback(function (_ref) {
4475
+ var snapshot = _ref.snapshot;
4476
+ return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
4477
+ var currentItemMap;
4478
+ return regeneratorRuntime.wrap(function _callee$(_context) {
4479
+ while (1) {
4480
+ switch (_context.prev = _context.next) {
4481
+ case 0:
4482
+ _context.next = 2;
4483
+ return snapshot.getPromise(AllItemsSelector);
4484
+
4485
+ case 2:
4486
+ currentItemMap = _context.sent;
4487
+ setDebouncedItems(currentItemMap);
4488
+
4489
+ case 4:
4490
+ case "end":
4491
+ return _context.stop();
4492
+ }
4493
+ }
4494
+ }, _callee);
4495
+ }));
4496
+ }, []);
4497
+ useDebouncedEffect(updateDebouncedItems, [items], 300);
4498
+ return debouncedItems;
4499
+ };
4500
+
4501
+ var useSelectedItems = function useSelectedItems() {
4502
+ return useRecoilValue(SelectedItemsAtom);
4503
+ };
4504
+
4448
4505
  var isMacOS = function isMacOS() {
4449
4506
  var userAgent = navigator.userAgent.toLowerCase();
4450
4507
  return /mac os ?x 10/.test(userAgent);
@@ -5319,8 +5376,6 @@ var PositionedItem = function PositionedItem(_ref12) {
5319
5376
  rest = _objectWithoutProperties(_ref12, _excluded2);
5320
5377
 
5321
5378
  if (!rest.itemMap[state.type]) {
5322
- // eslint-disable-next-line no-console
5323
- console.warn("Item type ".concat(state.type, " not recognized!"));
5324
5379
  return null;
5325
5380
  }
5326
5381
 
@@ -8658,8 +8713,10 @@ var getActionsFromItem = function getActionsFromItem(item, itemMap) {
8658
8713
  };
8659
8714
 
8660
8715
  var useAvailableActions = function useAvailableActions() {
8716
+ var itemMap = useRecoilValue(ItemMapAtom);
8717
+
8661
8718
  var _useRecoilValue = useRecoilValue(ConfigurationAtom),
8662
- itemMap = _useRecoilValue.itemTemplates;
8719
+ itemTemplates = _useRecoilValue.itemTemplates;
8663
8720
 
8664
8721
  var selected = useRecoilValue(SelectedItemsAtom);
8665
8722
 
@@ -8669,6 +8726,13 @@ var useAvailableActions = function useAvailableActions() {
8669
8726
  setAvailableActions = _React$useState2[1];
8670
8727
 
8671
8728
  var isMountedRef = React__default.useRef(false);
8729
+ React__default.useEffect(function () {
8730
+ // Mounted guard
8731
+ isMountedRef.current = true;
8732
+ return function () {
8733
+ isMountedRef.current = false;
8734
+ };
8735
+ }, []);
8672
8736
  var getItemListOrSelected = useRecoilCallback(function (_ref) {
8673
8737
  var snapshot = _ref.snapshot;
8674
8738
  return /*#__PURE__*/function () {
@@ -8716,19 +8780,12 @@ var useAvailableActions = function useAvailableActions() {
8716
8780
  };
8717
8781
  }();
8718
8782
  }, []);
8719
- React__default.useEffect(function () {
8720
- // Mounted guard
8721
- isMountedRef.current = true;
8722
- return function () {
8723
- isMountedRef.current = false;
8724
- };
8725
- }, []);
8726
8783
  /**
8727
8784
  * Returns available actions for selected items. An action is kept only if all
8728
8785
  * items have this exact same action with same parameters.
8729
8786
  */
8730
8787
 
8731
- var updateAvailableActions = React__default.useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
8788
+ var updateAvailableActions = useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
8732
8789
  var _yield$getItemListOrS, _yield$getItemListOrS2, selectedItemIds, selectedItemList, allActions;
8733
8790
 
8734
8791
  return regeneratorRuntime.wrap(function _callee2$(_context2) {
@@ -8758,13 +8815,13 @@ var useAvailableActions = function useAvailableActions() {
8758
8815
 
8759
8816
  case 9:
8760
8817
  allActions = selectedItemList.reduce(function (acc, item) {
8761
- var itemActions = getActionsFromItem(item, itemMap);
8818
+ var itemActions = getActionsFromItem(item, itemTemplates);
8762
8819
  return acc.filter(function (value) {
8763
8820
  return itemActions.some(function (itemAction) {
8764
8821
  return es6(value, itemAction);
8765
8822
  });
8766
8823
  });
8767
- }, getActionsFromItem(selectedItemList[0], itemMap));
8824
+ }, getActionsFromItem(selectedItemList[0], itemTemplates));
8768
8825
  setAvailableActions(allActions);
8769
8826
  _context2.next = 14;
8770
8827
  break;
@@ -8778,11 +8835,11 @@ var useAvailableActions = function useAvailableActions() {
8778
8835
  }
8779
8836
  }
8780
8837
  }, _callee2);
8781
- })), [getItemListOrSelected, itemMap]); // Update available actions when selection change
8838
+ })), [getItemListOrSelected, itemTemplates]); // Update available actions when selection change
8782
8839
 
8783
- React__default.useEffect(function () {
8784
- updateAvailableActions();
8785
- }, [updateAvailableActions, selected]);
8840
+ React__default.useEffect(updateAvailableActions, [updateAvailableActions, selected]); // Debounced update available actions when items change
8841
+
8842
+ useDebouncedEffect(updateAvailableActions, [itemMap, updateAvailableActions], 300);
8786
8843
  return {
8787
8844
  availableActions: availableActions
8788
8845
  };
@@ -9367,7 +9424,11 @@ var SyncBoard = function SyncBoard(_ref) {
9367
9424
  });
9368
9425
  }, [setConfiguration, uid]);
9369
9426
  useResizeObserver(boardWrapperRef, function () {
9370
- return setConfiguration(function (prev) {
9427
+ if (!boardWrapperRef.current) {
9428
+ return;
9429
+ }
9430
+
9431
+ setConfiguration(function (prev) {
9371
9432
  return _objectSpread2(_objectSpread2({}, prev), {}, {
9372
9433
  boardWrapperRect: boardWrapperRef.current.getBoundingClientRect()
9373
9434
  });
@@ -9435,5 +9496,5 @@ var ConnectedSyncRoom = function ConnectedSyncRoom(_ref) {
9435
9496
  }, /*#__PURE__*/React__default.createElement(SubscribeUserEvents, null), children));
9436
9497
  };
9437
9498
 
9438
- export { Board, ConnectedSyncBoard as BoardWrapper, ConnectedSyncRoom as RoomWrapper, useAvailableActions, useBoardConfig, useDim as useBoardPosition, useBoardState, useItemActions, useItemInteraction, useItemList as useItems, useMessage, useSelectedItems, useSelectionBox, useUsers, useWire };
9499
+ export { Board, ConnectedSyncBoard as BoardWrapper, ConnectedSyncRoom as RoomWrapper, useAvailableActions, useBoardConfig, useDim as useBoardPosition, useBoardState, useDebouncedItems, useItemActions, useItemInteraction, useItemList as useItems, useMessage, useSelectedItems, useSelectionBox, useUsers, useWire };
9439
9500
  //# sourceMappingURL=index.js.map