react-sync-board 0.6.2 → 0.7.2

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/cjs/index.js CHANGED
@@ -4578,6 +4578,18 @@ var computeDistance = function computeDistance(_ref, _ref2) {
4578
4578
 
4579
4579
  var empty = function empty() {};
4580
4580
 
4581
+ var stopPropagation = function stopPropagation(fn) {
4582
+ return function (arg) {
4583
+ var event = arg.event;
4584
+
4585
+ if (!event.isPropagationStopped()) {
4586
+ return fn(arg);
4587
+ }
4588
+
4589
+ return null;
4590
+ };
4591
+ };
4592
+
4581
4593
  var protect = function protect(fn) {
4582
4594
  return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
4583
4595
  var _args = arguments;
@@ -4608,6 +4620,35 @@ var protect = function protect(fn) {
4608
4620
  }));
4609
4621
  };
4610
4622
 
4623
+ var PromiseQueue = /*#__PURE__*/function () {
4624
+ function PromiseQueue() {
4625
+ _classCallCheck(this, PromiseQueue);
4626
+
4627
+ _defineProperty(this, "lastPromise", Promise.resolve(true));
4628
+ }
4629
+
4630
+ _createClass(PromiseQueue, [{
4631
+ key: "add",
4632
+ value: function add(operation) {
4633
+ var _this = this;
4634
+
4635
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
4636
+ args[_key - 1] = arguments[_key];
4637
+ }
4638
+
4639
+ return new Promise(function (resolve, reject) {
4640
+ _this.lastPromise = _this.lastPromise.then(function () {
4641
+ return stopPropagation(protect(operation)).apply(void 0, args);
4642
+ }).then(resolve)["catch"](reject);
4643
+ });
4644
+ }
4645
+ }]);
4646
+
4647
+ return PromiseQueue;
4648
+ }();
4649
+
4650
+ var promiseQueue = new PromiseQueue();
4651
+
4611
4652
  var Gesture = function Gesture(_ref6) {
4612
4653
  var children = _ref6.children,
4613
4654
  _ref6$onDrag = _ref6.onDrag,
@@ -4624,57 +4665,25 @@ var Gesture = function Gesture(_ref6) {
4624
4665
  onLongTap = _ref6$onLongTap === void 0 ? empty : _ref6$onLongTap,
4625
4666
  _ref6$onDoubleTap = _ref6.onDoubleTap,
4626
4667
  onDoubleTap = _ref6$onDoubleTap === void 0 ? empty : _ref6$onDoubleTap,
4627
- onZoom = _ref6.onZoom;
4668
+ onZoom = _ref6.onZoom,
4669
+ _ref6$mainAction = _ref6.mainAction,
4670
+ mainAction = _ref6$mainAction === void 0 ? "drag" : _ref6$mainAction;
4628
4671
  var wrapperRef = React__default['default'].useRef(null);
4629
4672
  var stateRef = React__default['default'].useRef({
4630
4673
  moving: false,
4631
4674
  pointers: {},
4632
4675
  mainPointer: undefined
4633
4676
  });
4634
- var queueRef = React__default['default'].useRef([]); // Queue event to avoid async mess
4635
-
4636
- var queue = React__default['default'].useCallback(function (callback, args) {
4637
- queueRef.current.push( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
4638
- return regeneratorRuntime.wrap(function _callee2$(_context2) {
4639
- while (1) {
4640
- switch (_context2.prev = _context2.next) {
4641
- case 0:
4642
- _context2.next = 2;
4643
- return protect(callback)(args);
4644
-
4645
- case 2:
4646
- queueRef.current.shift();
4647
-
4648
- if (!(queueRef.current.length !== 0)) {
4649
- _context2.next = 6;
4650
- break;
4651
- }
4652
-
4653
- _context2.next = 6;
4654
- return protect(queueRef.current[0])();
4655
-
4656
- case 6:
4657
- case "end":
4658
- return _context2.stop();
4659
- }
4660
- }
4661
- }, _callee2);
4662
- })));
4663
-
4664
- if (queueRef.current.length === 1) {
4665
- protect(queueRef.current[0])();
4666
- }
4667
- }, []);
4668
- var onWheel = React__default['default'].useCallback(function (e) {
4669
- var deltaX = e.deltaX,
4670
- deltaY = e.deltaY,
4671
- clientX = e.clientX,
4672
- clientY = e.clientY,
4673
- deltaMode = e.deltaMode,
4674
- ctrlKey = e.ctrlKey,
4675
- altKey = e.altKey,
4676
- metaKey = e.metaKey,
4677
- target = e.target; // On a MacOs trackpad, the pinch gesture sets the ctrlKey to true.
4677
+ var onWheel = React__default['default'].useCallback(function (event) {
4678
+ var deltaX = event.deltaX,
4679
+ deltaY = event.deltaY,
4680
+ clientX = event.clientX,
4681
+ clientY = event.clientY,
4682
+ deltaMode = event.deltaMode,
4683
+ ctrlKey = event.ctrlKey,
4684
+ altKey = event.altKey,
4685
+ metaKey = event.metaKey,
4686
+ target = event.target; // On a MacOs trackpad, the pinch gesture sets the ctrlKey to true.
4678
4687
  // In that situation, we want to use the custom scaling, not the browser default zoom.
4679
4688
  // Hence in this situation we avoid to return immediately.
4680
4689
 
@@ -4687,14 +4696,14 @@ var Gesture = function Gesture(_ref6) {
4687
4696
 
4688
4697
 
4689
4698
  if (isMacOS() && !ctrlKey) {
4690
- queue(onPan, {
4699
+ promiseQueue.add(onPan, {
4691
4700
  deltaX: -2 * deltaX,
4692
4701
  deltaY: -2 * deltaY,
4693
4702
  button: 1,
4694
4703
  ctrlKey: ctrlKey,
4695
4704
  metaKey: metaKey,
4696
4705
  target: target,
4697
- event: e
4706
+ event: event
4698
4707
  });
4699
4708
  } else {
4700
4709
  // Quit if onZoom is not set
@@ -4716,25 +4725,25 @@ var Gesture = function Gesture(_ref6) {
4716
4725
  scale *= 2;
4717
4726
  }
4718
4727
 
4719
- queue(onZoom, {
4728
+ promiseQueue.add(onZoom, {
4720
4729
  scale: scale,
4721
4730
  clientX: clientX,
4722
4731
  clientY: clientY,
4723
- event: e
4732
+ event: event
4724
4733
  });
4725
4734
  }
4726
- }, [onPan, onZoom, queue]);
4727
- var onPointerDown = React__default['default'].useCallback(function (_ref8) {
4728
- var target = _ref8.target,
4729
- button = _ref8.button,
4730
- clientX = _ref8.clientX,
4731
- clientY = _ref8.clientY,
4732
- pointerId = _ref8.pointerId,
4733
- altKey = _ref8.altKey,
4734
- ctrlKey = _ref8.ctrlKey,
4735
- metaKey = _ref8.metaKey,
4736
- isPrimary = _ref8.isPrimary;
4737
- // Add pointer to map
4735
+ }, [onPan, onZoom]);
4736
+ var onPointerDown = React__default['default'].useCallback(function (event) {
4737
+ var target = event.target,
4738
+ button = event.button,
4739
+ clientX = event.clientX,
4740
+ clientY = event.clientY,
4741
+ pointerId = event.pointerId,
4742
+ altKey = event.altKey,
4743
+ ctrlKey = event.ctrlKey,
4744
+ metaKey = event.metaKey,
4745
+ isPrimary = event.isPrimary; // Add pointer to map
4746
+
4738
4747
  stateRef.current.pointers[pointerId] = {
4739
4748
  clientX: clientX,
4740
4749
  clientY: clientY
@@ -4755,7 +4764,7 @@ var Gesture = function Gesture(_ref6) {
4755
4764
 
4756
4765
  var newClientX = (clientX2 + clientX) / 2;
4757
4766
  var newClientY = (clientY2 + clientY) / 2;
4758
- var distance = computeDistance([clientX2, clientY2], [clientX, clientY]); // We update previous position as the new position is the center beetween both finger
4767
+ var distance = computeDistance([clientX2, clientY2], [clientX, clientY]); // We update previous position as the new position is the center between both fingers
4759
4768
 
4760
4769
  Object.assign(stateRef.current, {
4761
4770
  pressed: true,
@@ -4791,29 +4800,31 @@ var Gesture = function Gesture(_ref6) {
4791
4800
  prevX: clientX,
4792
4801
  prevY: clientY,
4793
4802
  currentButton: button,
4803
+ pointerDownEvent: event,
4794
4804
  target: target,
4795
4805
  timeStart: Date.now(),
4796
- longTapTimeout: setTimeout( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
4797
- return regeneratorRuntime.wrap(function _callee3$(_context3) {
4806
+ longTapTimeout: setTimeout( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
4807
+ return regeneratorRuntime.wrap(function _callee2$(_context2) {
4798
4808
  while (1) {
4799
- switch (_context3.prev = _context3.next) {
4809
+ switch (_context2.prev = _context2.next) {
4800
4810
  case 0:
4801
4811
  stateRef.current.noTap = true;
4802
- queue(onLongTap, {
4812
+ promiseQueue.add(onLongTap, {
4803
4813
  clientX: clientX,
4804
4814
  clientY: clientY,
4805
4815
  altKey: altKey,
4806
4816
  ctrlKey: ctrlKey,
4807
4817
  metaKey: metaKey,
4808
- target: target
4818
+ target: target,
4819
+ event: event
4809
4820
  });
4810
4821
 
4811
4822
  case 2:
4812
4823
  case "end":
4813
- return _context3.stop();
4824
+ return _context2.stop();
4814
4825
  }
4815
4826
  }
4816
- }, _callee3);
4827
+ }, _callee2);
4817
4828
  })), 750)
4818
4829
  });
4819
4830
 
@@ -4823,16 +4834,17 @@ var Gesture = function Gesture(_ref6) {
4823
4834
  // eslint-disable-next-line no-console
4824
4835
  console.log("Fail to capture pointer", e);
4825
4836
  }
4826
- }, [onLongTap, queue]);
4827
- var onPointerMove = React__default['default'].useCallback(function (e) {
4837
+ }, [onLongTap]);
4838
+ var onPointerMove = React__default['default'].useCallback(function (event) {
4828
4839
  if (stateRef.current.pressed) {
4829
- var pointerId = e.pointerId,
4830
- eventClientX = e.clientX,
4831
- eventClientY = e.clientY,
4832
- altKey = e.altKey,
4833
- ctrlKey = e.ctrlKey,
4834
- metaKey = e.metaKey,
4835
- pointerType = e.pointerType;
4840
+ var pointerId = event.pointerId,
4841
+ eventClientX = event.clientX,
4842
+ eventClientY = event.clientY,
4843
+ altKey = event.altKey,
4844
+ ctrlKey = event.ctrlKey,
4845
+ metaKey = event.metaKey,
4846
+ buttons = event.buttons,
4847
+ pointerType = event.pointerType;
4836
4848
 
4837
4849
  if (stateRef.current.mainPointer !== pointerId) {
4838
4850
  // Event from other pointer
@@ -4865,13 +4877,20 @@ var Gesture = function Gesture(_ref6) {
4865
4877
  clientY = eventClientY;
4866
4878
  } // We drag if
4867
4879
  // On non touch device
4868
- // - Button is 0
4869
- // - Alt key is no pressed
4880
+ // - Only button is pressed (1)
4881
+ // - any special key is no pressed
4870
4882
  // or on touch devices
4871
4883
  // - We use only one finger
4872
4884
 
4873
4885
 
4874
- var shouldDrag = pointerType !== "touch" ? stateRef.current.currentButton === 0 && !altKey : !twoFingers;
4886
+ var altAction = altKey || ctrlKey || metaKey || buttons !== 1;
4887
+
4888
+ if (mainAction !== "drag") {
4889
+ altAction = !altAction;
4890
+ }
4891
+
4892
+ var shouldDrag = pointerType !== "touch" ? !altAction : !twoFingers;
4893
+ var shouldPan = pointerType !== "touch" ? altAction : twoFingers;
4875
4894
 
4876
4895
  if (shouldDrag) {
4877
4896
  // Send drag start on first move
@@ -4880,7 +4899,7 @@ var Gesture = function Gesture(_ref6) {
4880
4899
  stateRef.current.gestureStart = true; // Clear tap timeout
4881
4900
 
4882
4901
  clearTimeout(stateRef.current.longTapTimeout);
4883
- queue(onDragStart, {
4902
+ promiseQueue.add(onDragStart, {
4884
4903
  deltaX: 0,
4885
4904
  deltaY: 0,
4886
4905
  startX: stateRef.current.startX,
@@ -4894,17 +4913,16 @@ var Gesture = function Gesture(_ref6) {
4894
4913
  ctrlKey: ctrlKey,
4895
4914
  metaKey: metaKey,
4896
4915
  target: stateRef.current.target,
4897
- event: e
4916
+ event: stateRef.current.pointerDownEvent
4898
4917
  });
4899
- } // Create closure
4900
-
4918
+ }
4901
4919
 
4902
4920
  var deltaX = clientX - stateRef.current.prevX;
4903
4921
  var deltaY = clientY - stateRef.current.prevY;
4904
4922
  var distanceX = clientX - stateRef.current.startX;
4905
4923
  var distanceY = clientY - stateRef.current.startY; // Drag event
4906
4924
 
4907
- queue(onDrag, {
4925
+ promiseQueue.add(onDrag, {
4908
4926
  deltaX: deltaX,
4909
4927
  deltaY: deltaY,
4910
4928
  startX: stateRef.current.startX,
@@ -4918,9 +4936,11 @@ var Gesture = function Gesture(_ref6) {
4918
4936
  ctrlKey: ctrlKey,
4919
4937
  metaKey: metaKey,
4920
4938
  target: stateRef.current.target,
4921
- event: e
4939
+ event: event
4922
4940
  });
4923
- } else {
4941
+ }
4942
+
4943
+ if (shouldPan) {
4924
4944
  if (!stateRef.current.gestureStart) {
4925
4945
  wrapperRef.current.style.cursor = "move";
4926
4946
  stateRef.current.gestureStart = true; // Clear tap timeout on first move
@@ -4935,7 +4955,7 @@ var Gesture = function Gesture(_ref6) {
4935
4955
 
4936
4956
  var target = stateRef.current.target; // Pan event
4937
4957
 
4938
- queue(onPan, {
4958
+ promiseQueue.add(onPan, {
4939
4959
  deltaX: _deltaX,
4940
4960
  deltaY: _deltaY,
4941
4961
  button: stateRef.current.currentButton,
@@ -4943,18 +4963,18 @@ var Gesture = function Gesture(_ref6) {
4943
4963
  ctrlKey: ctrlKey,
4944
4964
  metaKey: metaKey,
4945
4965
  target: target,
4946
- event: e
4966
+ event: event
4947
4967
  });
4948
4968
 
4949
4969
  if (twoFingers && distance !== stateRef.current.prevDistance && onZoom) {
4950
4970
  var scale = stateRef.current.prevDistance - distance;
4951
4971
 
4952
4972
  if (Math.abs(scale) > 0) {
4953
- queue(onZoom, {
4973
+ promiseQueue.add(onZoom, {
4954
4974
  scale: scale,
4955
4975
  clientX: clientX,
4956
4976
  clientY: clientY,
4957
- event: e
4977
+ event: event
4958
4978
  });
4959
4979
  stateRef.current.prevDistance = distance;
4960
4980
  }
@@ -4964,15 +4984,15 @@ var Gesture = function Gesture(_ref6) {
4964
4984
  stateRef.current.prevX = clientX;
4965
4985
  stateRef.current.prevY = clientY;
4966
4986
  }
4967
- }, [onDrag, onDragStart, onPan, onZoom, queue]);
4968
- var onPointerUp = React__default['default'].useCallback(function (e) {
4969
- var clientX = e.clientX,
4970
- clientY = e.clientY,
4971
- altKey = e.altKey,
4972
- ctrlKey = e.ctrlKey,
4973
- metaKey = e.metaKey,
4974
- target = e.target,
4975
- pointerId = e.pointerId;
4987
+ }, [mainAction, onDrag, onDragStart, onPan, onZoom]);
4988
+ var onPointerUp = React__default['default'].useCallback(function (event) {
4989
+ var clientX = event.clientX,
4990
+ clientY = event.clientY,
4991
+ altKey = event.altKey,
4992
+ ctrlKey = event.ctrlKey,
4993
+ metaKey = event.metaKey,
4994
+ target = event.target,
4995
+ pointerId = event.pointerId;
4976
4996
 
4977
4997
  if (!stateRef.current.pointers[pointerId]) {
4978
4998
  // Pointer already gone previously with another event
@@ -5011,7 +5031,7 @@ var Gesture = function Gesture(_ref6) {
5011
5031
  if (stateRef.current.moving) {
5012
5032
  // If we were moving, send drag end event
5013
5033
  stateRef.current.moving = false;
5014
- queue(onDragEnd, {
5034
+ promiseQueue.add(onDragEnd, {
5015
5035
  deltaX: clientX - stateRef.current.prevX,
5016
5036
  deltaY: clientY - stateRef.current.prevY,
5017
5037
  startX: stateRef.current.startX,
@@ -5024,7 +5044,7 @@ var Gesture = function Gesture(_ref6) {
5024
5044
  altKey: altKey,
5025
5045
  ctrlKey: ctrlKey,
5026
5046
  metaKey: metaKey,
5027
- event: e
5047
+ event: event
5028
5048
  });
5029
5049
  wrapperRef.current.style.cursor = "auto";
5030
5050
  } else {
@@ -5034,20 +5054,35 @@ var Gesture = function Gesture(_ref6) {
5034
5054
  stateRef.current.noTap = false;
5035
5055
  } // Send tap event only if time less than 300ms
5036
5056
  else if (stateRef.current.timeStart - now < 300) {
5037
- queue(onTap, {
5057
+ promiseQueue.add(onTap, {
5038
5058
  clientX: clientX,
5039
5059
  clientY: clientY,
5040
5060
  altKey: altKey,
5041
5061
  ctrlKey: ctrlKey,
5042
5062
  metaKey: metaKey,
5043
- target: target
5063
+ target: target,
5064
+ event: event
5044
5065
  });
5045
5066
  }
5046
5067
  }
5047
- }, [onDragEnd, onTap, queue]);
5068
+ }, [onDragEnd, onTap]);
5048
5069
  var onDoubleTapHandler = React__default['default'].useCallback(function (event) {
5049
- queue(onDoubleTap, event);
5050
- }, [onDoubleTap, queue]);
5070
+ var clientX = event.clientX,
5071
+ clientY = event.clientY,
5072
+ altKey = event.altKey,
5073
+ ctrlKey = event.ctrlKey,
5074
+ metaKey = event.metaKey,
5075
+ target = event.target;
5076
+ promiseQueue.add(onDoubleTap, {
5077
+ clientX: clientX,
5078
+ clientY: clientY,
5079
+ altKey: altKey,
5080
+ ctrlKey: ctrlKey,
5081
+ metaKey: metaKey,
5082
+ target: target,
5083
+ event: event
5084
+ });
5085
+ }, [onDoubleTap]);
5051
5086
  return /*#__PURE__*/React__default['default'].createElement("div", {
5052
5087
  onWheel: onWheel,
5053
5088
  onPointerDown: onPointerDown,
@@ -5939,24 +5974,20 @@ var Selector = function Selector(_ref) {
5939
5974
  }));
5940
5975
  }, [setSelected]);
5941
5976
  useThrottledEffect(updateSelected, [selector, updateSelected], 200);
5942
-
5943
- var onDragStart = /*#__PURE__*/function () {
5977
+ var onDragStart = React__default['default'].useCallback( /*#__PURE__*/function () {
5944
5978
  var _ref4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(event) {
5945
- var button, altKey, ctrlKey, metaKey, foundElement, metaKeyPressed, goodButton;
5979
+ var foundElement;
5946
5980
  return regeneratorRuntime.wrap(function _callee2$(_context2) {
5947
5981
  while (1) {
5948
5982
  switch (_context2.prev = _context2.next) {
5949
5983
  case 0:
5950
- button = event.button, altKey = event.altKey, ctrlKey = event.ctrlKey, metaKey = event.metaKey;
5951
- _context2.next = 3;
5984
+ _context2.next = 2;
5952
5985
  return findElementUnderPointer(event);
5953
5986
 
5954
- case 3:
5987
+ case 2:
5955
5988
  foundElement = _context2.sent;
5956
- metaKeyPressed = altKey || ctrlKey || metaKey;
5957
- goodButton = moveFirst ? button === 1 || button === 0 && metaKeyPressed : button === 0 && !metaKeyPressed;
5958
5989
 
5959
- if (goodButton && (!foundElement || moveFirst)) {
5990
+ if (!foundElement) {
5960
5991
  stateRef.current.moving = true;
5961
5992
  setBoardState(function (prev) {
5962
5993
  return _objectSpread2(_objectSpread2({}, prev), {}, {
@@ -5966,7 +5997,7 @@ var Selector = function Selector(_ref) {
5966
5997
  wrapperRef.current.style.cursor = "crosshair";
5967
5998
  }
5968
5999
 
5969
- case 7:
6000
+ case 4:
5970
6001
  case "end":
5971
6002
  return _context2.stop();
5972
6003
  }
@@ -5974,11 +6005,10 @@ var Selector = function Selector(_ref) {
5974
6005
  }, _callee2);
5975
6006
  }));
5976
6007
 
5977
- return function onDragStart(_x) {
6008
+ return function (_x) {
5978
6009
  return _ref4.apply(this, arguments);
5979
6010
  };
5980
- }();
5981
-
6011
+ }(), [findElementUnderPointer, setBoardState]);
5982
6012
  var onDrag = recoil.useRecoilCallback(function (_ref5) {
5983
6013
  var snapshot = _ref5.snapshot;
5984
6014
  return /*#__PURE__*/function () {
@@ -6041,8 +6071,7 @@ var Selector = function Selector(_ref) {
6041
6071
  };
6042
6072
  }();
6043
6073
  }, []);
6044
-
6045
- var onDragEnd = function onDragEnd() {
6074
+ var onDragEnd = React__default['default'].useCallback(function () {
6046
6075
  if (stateRef.current.moving) {
6047
6076
  setBoardState(function (prev) {
6048
6077
  return _objectSpread2(_objectSpread2({}, prev), {}, {
@@ -6055,8 +6084,7 @@ var Selector = function Selector(_ref) {
6055
6084
  });
6056
6085
  wrapperRef.current.style.cursor = "auto";
6057
6086
  }
6058
- };
6059
-
6087
+ }, [setBoardState]);
6060
6088
  var onLongTap = React__default['default'].useCallback(function (_ref8) {
6061
6089
  var target = _ref8.target;
6062
6090
  var foundElement = insideClass(target, "item");
@@ -6137,7 +6165,8 @@ var Selector = function Selector(_ref) {
6137
6165
  onDrag: onDrag,
6138
6166
  onDragEnd: onDragEnd,
6139
6167
  onTap: onTap,
6140
- onLongTap: onLongTap
6168
+ onLongTap: onLongTap,
6169
+ mainAction: moveFirst ? "pan" : "drag"
6141
6170
  }, /*#__PURE__*/React__default['default'].createElement("div", {
6142
6171
  ref: wrapperRef
6143
6172
  }, selector.moving && /*#__PURE__*/React__default['default'].createElement("div", {
@@ -6230,23 +6259,24 @@ var ActionPane = function ActionPane(_ref) {
6230
6259
  var snapshot = _ref4.snapshot;
6231
6260
  return /*#__PURE__*/function () {
6232
6261
  var _ref6 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(_ref5) {
6233
- var deltaX, deltaY, _yield$snapshot$getPr, scale, moveX, moveY;
6262
+ var deltaX, deltaY, originalEvent, _yield$snapshot$getPr, scale, moveX, moveY;
6234
6263
 
6235
6264
  return regeneratorRuntime.wrap(function _callee2$(_context2) {
6236
6265
  while (1) {
6237
6266
  switch (_context2.prev = _context2.next) {
6238
6267
  case 0:
6239
- deltaX = _ref5.deltaX, deltaY = _ref5.deltaY;
6268
+ deltaX = _ref5.deltaX, deltaY = _ref5.deltaY, originalEvent = _ref5.event;
6240
6269
 
6241
6270
  if (!actionRef.current.moving) {
6242
- _context2.next = 10;
6271
+ _context2.next = 11;
6243
6272
  break;
6244
6273
  }
6245
6274
 
6246
- _context2.next = 4;
6275
+ originalEvent.stopPropagation();
6276
+ _context2.next = 5;
6247
6277
  return snapshot.getPromise(BoardTransformAtom);
6248
6278
 
6249
- case 4:
6279
+ case 5:
6250
6280
  _yield$snapshot$getPr = _context2.sent;
6251
6281
  scale = _yield$snapshot$getPr.scale;
6252
6282
  moveX = actionRef.current.remainX + deltaX / scale;
@@ -6261,7 +6291,7 @@ var ActionPane = function ActionPane(_ref) {
6261
6291
  }) : prev;
6262
6292
  });
6263
6293
 
6264
- case 10:
6294
+ case 11:
6265
6295
  case "end":
6266
6296
  return _context2.stop();
6267
6297
  }
@@ -6986,8 +7016,6 @@ var usePositionNavigator = function usePositionNavigator() {
6986
7016
  return null;
6987
7017
  };
6988
7018
 
6989
- var SCALE_TOLERANCE = 0.8;
6990
-
6991
7019
  var PanZoom = function PanZoom(_ref) {
6992
7020
  var children = _ref.children,
6993
7021
  _ref$moveFirst = _ref.moveFirst,
@@ -6997,7 +7025,8 @@ var PanZoom = function PanZoom(_ref) {
6997
7025
 
6998
7026
  var _useDim = useDim(),
6999
7027
  setDim = _useDim.setDim,
7000
- zoomTo = _useDim.zoomTo;
7028
+ zoomToCenter = _useDim.zoomToCenter,
7029
+ zoomToExtent = _useDim.zoomToExtent;
7001
7030
 
7002
7031
  var _useRecoilValue = recoil.useRecoilValue(ConfigurationAtom),
7003
7032
  itemExtentGlobal = _useRecoilValue.itemExtent;
@@ -7013,10 +7042,14 @@ var PanZoom = function PanZoom(_ref) {
7013
7042
  var getMouseInfo = useMousePosition(wrappedRef); // Hooks to save/restore position
7014
7043
 
7015
7044
  usePositionNavigator();
7045
+ /**
7046
+ * Center board on startup
7047
+ */
7048
+
7016
7049
  var centerBoard = recoil.useRecoilCallback(function (_ref2) {
7017
7050
  var snapshot = _ref2.snapshot;
7018
7051
  return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
7019
- var _yield$snapshot$getPr, _yield$snapshot$getPr2, left, top, width, height, boardWrapperRect, scaleX, scaleY, newScale, scaleWithTolerance, centerX, centerY;
7052
+ var _yield$snapshot$getPr, itemExtent;
7020
7053
 
7021
7054
  return regeneratorRuntime.wrap(function _callee$(_context) {
7022
7055
  while (1) {
@@ -7027,34 +7060,17 @@ var PanZoom = function PanZoom(_ref) {
7027
7060
 
7028
7061
  case 2:
7029
7062
  _yield$snapshot$getPr = _context.sent;
7030
- _yield$snapshot$getPr2 = _yield$snapshot$getPr.itemExtent;
7031
- left = _yield$snapshot$getPr2.left;
7032
- top = _yield$snapshot$getPr2.top;
7033
- width = _yield$snapshot$getPr2.width;
7034
- height = _yield$snapshot$getPr2.height;
7035
- boardWrapperRect = _yield$snapshot$getPr.boardWrapperRect;
7036
- scaleX = boardWrapperRect.width / width;
7037
- scaleY = boardWrapperRect.height / height;
7038
- newScale = Math.min(scaleX, scaleY);
7039
- scaleWithTolerance = newScale * SCALE_TOLERANCE;
7040
- centerX = boardWrapperRect.width / 2 - (left + width / 2) * scaleWithTolerance;
7041
- centerY = boardWrapperRect.height / 2 - (top + height / 2) * scaleWithTolerance;
7042
- setDim(function (prev) {
7043
- return _objectSpread2(_objectSpread2({}, prev), {}, {
7044
- translateX: centerX,
7045
- translateY: centerY,
7046
- scale: scaleWithTolerance
7047
- });
7048
- });
7063
+ itemExtent = _yield$snapshot$getPr.itemExtent;
7064
+ zoomToExtent(itemExtent);
7049
7065
 
7050
- case 16:
7066
+ case 5:
7051
7067
  case "end":
7052
7068
  return _context.stop();
7053
7069
  }
7054
7070
  }
7055
7071
  }, _callee);
7056
7072
  }));
7057
- }, [setDim]);
7073
+ }, [zoomToExtent]);
7058
7074
  React__default['default'].useEffect(function () {
7059
7075
  if (!centered && itemExtentGlobal.left) {
7060
7076
  // Center board on first valid extent
@@ -7066,7 +7082,7 @@ var PanZoom = function PanZoom(_ref) {
7066
7082
  var clientX = _ref4.clientX,
7067
7083
  clientY = _ref4.clientY,
7068
7084
  scale = _ref4.scale;
7069
- zoomTo(1 - scale / 500, {
7085
+ zoomToCenter(1 - scale / 500, {
7070
7086
  x: clientX,
7071
7087
  y: clientY
7072
7088
  }); // Update the board zooming state
@@ -7084,7 +7100,7 @@ var PanZoom = function PanZoom(_ref) {
7084
7100
  zooming: true
7085
7101
  }) : prev;
7086
7102
  });
7087
- }, [setBoardState, zoomTo]);
7103
+ }, [setBoardState, zoomToCenter]);
7088
7104
  var onPan = React__default['default'].useCallback( /*#__PURE__*/function () {
7089
7105
  var _ref6 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(_ref5) {
7090
7106
  var deltaX, deltaY;
@@ -7126,14 +7142,6 @@ var PanZoom = function PanZoom(_ref) {
7126
7142
  return _ref6.apply(this, arguments);
7127
7143
  };
7128
7144
  }(), [setBoardState, setDim]);
7129
- var onDrag = React__default['default'].useCallback(function (state) {
7130
- var target = state.target;
7131
- var outsideItem = !insideClass(target, "item") || insideClass(target, "locked");
7132
-
7133
- if (moveFirst && outsideItem) {
7134
- onPan(state);
7135
- }
7136
- }, [moveFirst, onPan]);
7137
7145
  var onKeyDown = recoil.useRecoilCallback(function (_ref7) {
7138
7146
  var snapshot = _ref7.snapshot;
7139
7147
  return /*#__PURE__*/function () {
@@ -7218,14 +7226,14 @@ var PanZoom = function PanZoom(_ref) {
7218
7226
  translateX: prev.translateX + moveX
7219
7227
  });
7220
7228
  });
7221
- zoomTo(zoom);
7229
+ zoomToCenter(zoom);
7222
7230
  e.preventDefault();
7223
7231
 
7224
7232
  case 31:
7225
7233
  // Temporary zoom
7226
7234
  if (e.key === " " && !e.repeat) {
7227
7235
  if (getMouseInfo().hover) {
7228
- zoomTo(3, getMouseInfo());
7236
+ zoomToCenter(3, getMouseInfo());
7229
7237
  }
7230
7238
  }
7231
7239
 
@@ -7241,15 +7249,15 @@ var PanZoom = function PanZoom(_ref) {
7241
7249
  return _ref8.apply(this, arguments);
7242
7250
  };
7243
7251
  }();
7244
- }, [setDim, zoomTo, getMouseInfo]);
7252
+ }, [setDim, zoomToCenter, getMouseInfo]);
7245
7253
  var onKeyUp = React__default['default'].useCallback(function (e) {
7246
7254
  // Ignore text in Input or Textarea
7247
7255
  if (["INPUT", "TEXTAREA"].includes(e.target.tagName)) return; // Zoom out on release
7248
7256
 
7249
7257
  if (e.key === " " && getMouseInfo().hover) {
7250
- zoomTo(1 / 3, getMouseInfo());
7258
+ zoomToCenter(1 / 3, getMouseInfo());
7251
7259
  }
7252
- }, [getMouseInfo, zoomTo]);
7260
+ }, [getMouseInfo, zoomToCenter]);
7253
7261
  React__default['default'].useEffect(function () {
7254
7262
  document.addEventListener("keydown", onKeyDown);
7255
7263
  document.addEventListener("keyup", onKeyUp);
@@ -7261,7 +7269,7 @@ var PanZoom = function PanZoom(_ref) {
7261
7269
  return /*#__PURE__*/React__default['default'].createElement(Gesture, {
7262
7270
  onPan: onPan,
7263
7271
  onZoom: onZoom,
7264
- onDrag: onDrag
7272
+ mainAction: moveFirst ? "pan" : "drag"
7265
7273
  }, /*#__PURE__*/React__default['default'].createElement("div", {
7266
7274
  style: {
7267
7275
  display: "inline-block",
@@ -7429,7 +7437,9 @@ var Board = function Board(_ref) {
7429
7437
  moveFirst: moveFirst
7430
7438
  }, /*#__PURE__*/React__default['default'].createElement(Selector, {
7431
7439
  moveFirst: moveFirst
7432
- }, /*#__PURE__*/React__default['default'].createElement(ActionPane, null, /*#__PURE__*/React__default['default'].createElement(CursorPane, null, /*#__PURE__*/React__default['default'].createElement("div", {
7440
+ }, /*#__PURE__*/React__default['default'].createElement(ActionPane, {
7441
+ moveFirst: moveFirst
7442
+ }, /*#__PURE__*/React__default['default'].createElement(CursorPane, null, /*#__PURE__*/React__default['default'].createElement("div", {
7433
7443
  onContextMenu: function onContextMenu(e) {
7434
7444
  e.preventDefault();
7435
7445
  },
@@ -7440,6 +7450,7 @@ var Board = function Board(_ref) {
7440
7450
 
7441
7451
  var TOLERANCE = 100;
7442
7452
  var MIN_SIZE = 1000;
7453
+ var SCALE_TOLERANCE = 0.8;
7443
7454
 
7444
7455
  var translateBoundaries = function translateBoundaries(_ref) {
7445
7456
  var x = _ref.x,
@@ -7557,7 +7568,7 @@ var useDim = function useDim() {
7557
7568
  };
7558
7569
  }();
7559
7570
  }, [setDim]);
7560
- var zoomTo = recoil.useRecoilCallback(function (_ref5) {
7571
+ var zoomToCenter = recoil.useRecoilCallback(function (_ref5) {
7561
7572
  var snapshot = _ref5.snapshot;
7562
7573
  return /*#__PURE__*/function () {
7563
7574
  var _ref6 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(factor, zoomCenter) {
@@ -7636,24 +7647,68 @@ var useDim = function useDim() {
7636
7647
  };
7637
7648
  }();
7638
7649
  }, [setDim]);
7639
- var updateScaleBoundaries = recoil.useRecoilCallback(function (_ref7) {
7650
+ var zoomToExtent = recoil.useRecoilCallback(function (_ref7) {
7640
7651
  var snapshot = _ref7.snapshot;
7641
- return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
7642
- var _yield$snapshot$getPr3, _yield$snapshot$getPr4, width, height, boardWrapperRect, scaleX, scaleY, newScale;
7652
+ return /*#__PURE__*/function () {
7653
+ var _ref9 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(_ref8) {
7654
+ var left, top, width, height, _yield$snapshot$getPr3, boardWrapperRect, scaleX, scaleY, newScale, scaleWithTolerance, centerX, centerY;
7643
7655
 
7644
- return regeneratorRuntime.wrap(function _callee3$(_context3) {
7656
+ return regeneratorRuntime.wrap(function _callee3$(_context3) {
7657
+ while (1) {
7658
+ switch (_context3.prev = _context3.next) {
7659
+ case 0:
7660
+ left = _ref8.left, top = _ref8.top, width = _ref8.width, height = _ref8.height;
7661
+ _context3.next = 3;
7662
+ return snapshot.getPromise(ConfigurationAtom);
7663
+
7664
+ case 3:
7665
+ _yield$snapshot$getPr3 = _context3.sent;
7666
+ boardWrapperRect = _yield$snapshot$getPr3.boardWrapperRect;
7667
+ scaleX = boardWrapperRect.width / width;
7668
+ scaleY = boardWrapperRect.height / height;
7669
+ newScale = Math.min(scaleX, scaleY);
7670
+ scaleWithTolerance = newScale * SCALE_TOLERANCE;
7671
+ centerX = boardWrapperRect.width / 2 - (left + width / 2) * scaleWithTolerance;
7672
+ centerY = boardWrapperRect.height / 2 - (top + height / 2) * scaleWithTolerance;
7673
+ setDim(function (prev) {
7674
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
7675
+ translateX: centerX,
7676
+ translateY: centerY,
7677
+ scale: scaleWithTolerance
7678
+ });
7679
+ });
7680
+
7681
+ case 12:
7682
+ case "end":
7683
+ return _context3.stop();
7684
+ }
7685
+ }
7686
+ }, _callee3);
7687
+ }));
7688
+
7689
+ return function (_x4) {
7690
+ return _ref9.apply(this, arguments);
7691
+ };
7692
+ }();
7693
+ }, [setDim]);
7694
+ var updateScaleBoundaries = recoil.useRecoilCallback(function (_ref10) {
7695
+ var snapshot = _ref10.snapshot;
7696
+ return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {
7697
+ var _yield$snapshot$getPr4, _yield$snapshot$getPr5, width, height, boardWrapperRect, scaleX, scaleY, newScale;
7698
+
7699
+ return regeneratorRuntime.wrap(function _callee4$(_context4) {
7645
7700
  while (1) {
7646
- switch (_context3.prev = _context3.next) {
7701
+ switch (_context4.prev = _context4.next) {
7647
7702
  case 0:
7648
- _context3.next = 2;
7703
+ _context4.next = 2;
7649
7704
  return snapshot.getPromise(ConfigurationAtom);
7650
7705
 
7651
7706
  case 2:
7652
- _yield$snapshot$getPr3 = _context3.sent;
7653
- _yield$snapshot$getPr4 = _yield$snapshot$getPr3.itemExtent;
7654
- width = _yield$snapshot$getPr4.width;
7655
- height = _yield$snapshot$getPr4.height;
7656
- boardWrapperRect = _yield$snapshot$getPr3.boardWrapperRect;
7707
+ _yield$snapshot$getPr4 = _context4.sent;
7708
+ _yield$snapshot$getPr5 = _yield$snapshot$getPr4.itemExtent;
7709
+ width = _yield$snapshot$getPr5.width;
7710
+ height = _yield$snapshot$getPr5.height;
7711
+ boardWrapperRect = _yield$snapshot$getPr4.boardWrapperRect;
7657
7712
  scaleX = boardWrapperRect.width / width;
7658
7713
  scaleY = boardWrapperRect.height / height;
7659
7714
  newScale = Math.min(scaleX, scaleY);
@@ -7661,86 +7716,86 @@ var useDim = function useDim() {
7661
7716
 
7662
7717
  case 11:
7663
7718
  case "end":
7664
- return _context3.stop();
7719
+ return _context4.stop();
7665
7720
  }
7666
7721
  }
7667
- }, _callee3);
7722
+ }, _callee4);
7668
7723
  }));
7669
7724
  }, []);
7670
- var getCenterCoordinates = recoil.useRecoilCallback(function (_ref9) {
7671
- var snapshot = _ref9.snapshot;
7672
- return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {
7673
- var _yield$snapshot$getPr5, boardWrapperRect, boardSize, _yield$snapshot$getPr6, translateX, translateY, scale;
7725
+ var getCenterCoordinates = recoil.useRecoilCallback(function (_ref12) {
7726
+ var snapshot = _ref12.snapshot;
7727
+ return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
7728
+ var _yield$snapshot$getPr6, boardWrapperRect, boardSize, _yield$snapshot$getPr7, translateX, translateY, scale;
7674
7729
 
7675
- return regeneratorRuntime.wrap(function _callee4$(_context4) {
7730
+ return regeneratorRuntime.wrap(function _callee5$(_context5) {
7676
7731
  while (1) {
7677
- switch (_context4.prev = _context4.next) {
7732
+ switch (_context5.prev = _context5.next) {
7678
7733
  case 0:
7679
- _context4.next = 2;
7734
+ _context5.next = 2;
7680
7735
  return snapshot.getPromise(ConfigurationAtom);
7681
7736
 
7682
7737
  case 2:
7683
- _yield$snapshot$getPr5 = _context4.sent;
7684
- boardWrapperRect = _yield$snapshot$getPr5.boardWrapperRect;
7685
- boardSize = _yield$snapshot$getPr5.boardSize;
7686
- _context4.next = 7;
7738
+ _yield$snapshot$getPr6 = _context5.sent;
7739
+ boardWrapperRect = _yield$snapshot$getPr6.boardWrapperRect;
7740
+ boardSize = _yield$snapshot$getPr6.boardSize;
7741
+ _context5.next = 7;
7687
7742
  return snapshot.getPromise(BoardTransformAtom);
7688
7743
 
7689
7744
  case 7:
7690
- _yield$snapshot$getPr6 = _context4.sent;
7691
- translateX = _yield$snapshot$getPr6.translateX;
7692
- translateY = _yield$snapshot$getPr6.translateY;
7693
- scale = _yield$snapshot$getPr6.scale;
7694
- return _context4.abrupt("return", {
7745
+ _yield$snapshot$getPr7 = _context5.sent;
7746
+ translateX = _yield$snapshot$getPr7.translateX;
7747
+ translateY = _yield$snapshot$getPr7.translateY;
7748
+ scale = _yield$snapshot$getPr7.scale;
7749
+ return _context5.abrupt("return", {
7695
7750
  x: (boardWrapperRect.width / 2 - translateX) / scale - boardSize / 2,
7696
7751
  y: (boardWrapperRect.height / 2 - translateY) / scale - boardSize / 2
7697
7752
  });
7698
7753
 
7699
7754
  case 12:
7700
7755
  case "end":
7701
- return _context4.stop();
7756
+ return _context5.stop();
7702
7757
  }
7703
7758
  }
7704
- }, _callee4);
7759
+ }, _callee5);
7705
7760
  }));
7706
7761
  }, []);
7707
- var updateItemExtent = recoil.useRecoilCallback(function (_ref11) {
7708
- var snapshot = _ref11.snapshot,
7709
- set = _ref11.set;
7710
- return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
7711
- var itemIds, _yield$snapshot$getPr7, boardWrapperRect, boardWrapper, boardSize, _yield$snapshot$getPr8, scale, translateX, translateY, _ref13, left, top, width, height, relativeExtent, delta, _delta;
7762
+ var updateItemExtent = recoil.useRecoilCallback(function (_ref14) {
7763
+ var snapshot = _ref14.snapshot,
7764
+ set = _ref14.set;
7765
+ return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {
7766
+ var itemIds, _yield$snapshot$getPr8, boardWrapperRect, boardWrapper, boardSize, _yield$snapshot$getPr9, scale, translateX, translateY, _ref16, left, top, width, height, relativeExtent, delta, _delta;
7712
7767
 
7713
- return regeneratorRuntime.wrap(function _callee5$(_context5) {
7768
+ return regeneratorRuntime.wrap(function _callee6$(_context6) {
7714
7769
  while (1) {
7715
- switch (_context5.prev = _context5.next) {
7770
+ switch (_context6.prev = _context6.next) {
7716
7771
  case 0:
7717
- _context5.next = 2;
7772
+ _context6.next = 2;
7718
7773
  return snapshot.getPromise(ItemListAtom);
7719
7774
 
7720
7775
  case 2:
7721
- itemIds = _context5.sent;
7722
- _context5.next = 5;
7776
+ itemIds = _context6.sent;
7777
+ _context6.next = 5;
7723
7778
  return snapshot.getPromise(ConfigurationAtom);
7724
7779
 
7725
7780
  case 5:
7726
- _yield$snapshot$getPr7 = _context5.sent;
7727
- boardWrapperRect = _yield$snapshot$getPr7.boardWrapperRect;
7728
- boardWrapper = _yield$snapshot$getPr7.boardWrapper;
7729
- boardSize = _yield$snapshot$getPr7.boardSize;
7730
- _context5.next = 11;
7781
+ _yield$snapshot$getPr8 = _context6.sent;
7782
+ boardWrapperRect = _yield$snapshot$getPr8.boardWrapperRect;
7783
+ boardWrapper = _yield$snapshot$getPr8.boardWrapper;
7784
+ boardSize = _yield$snapshot$getPr8.boardSize;
7785
+ _context6.next = 11;
7731
7786
  return snapshot.getPromise(BoardTransformAtom);
7732
7787
 
7733
7788
  case 11:
7734
- _yield$snapshot$getPr8 = _context5.sent;
7735
- scale = _yield$snapshot$getPr8.scale;
7736
- translateX = _yield$snapshot$getPr8.translateX;
7737
- translateY = _yield$snapshot$getPr8.translateY;
7738
- _ref13 = getItemBoundingBox(itemIds, boardWrapper) || {
7789
+ _yield$snapshot$getPr9 = _context6.sent;
7790
+ scale = _yield$snapshot$getPr9.scale;
7791
+ translateX = _yield$snapshot$getPr9.translateX;
7792
+ translateY = _yield$snapshot$getPr9.translateY;
7793
+ _ref16 = getItemBoundingBox(itemIds, boardWrapper) || {
7739
7794
  left: boardSize / 2 * scale + boardWrapperRect.left + translateX,
7740
7795
  top: boardSize / 2 * scale + boardWrapperRect.top + translateY,
7741
7796
  width: 0,
7742
7797
  height: 0
7743
- }, left = _ref13.left, top = _ref13.top, width = _ref13.width, height = _ref13.height;
7798
+ }, left = _ref16.left, top = _ref16.top, width = _ref16.width, height = _ref16.height;
7744
7799
  relativeExtent = {
7745
7800
  left: (left - boardWrapperRect.left - translateX) / scale,
7746
7801
  top: (top - boardWrapperRect.top - translateY) / scale,
@@ -7772,10 +7827,10 @@ var useDim = function useDim() {
7772
7827
 
7773
7828
  case 22:
7774
7829
  case "end":
7775
- return _context5.stop();
7830
+ return _context6.stop();
7776
7831
  }
7777
7832
  }
7778
- }, _callee5);
7833
+ }, _callee6);
7779
7834
  }));
7780
7835
  }, []);
7781
7836
  var debouncedUpdateItemExtent = useDebouncedCallback(updateItemExtent, [], 300);
@@ -7787,7 +7842,9 @@ var useDim = function useDim() {
7787
7842
  return {
7788
7843
  setDim: setDimSafe,
7789
7844
  getDim: getDim,
7790
- zoomTo: zoomTo,
7845
+ zoomTo: zoomToCenter,
7846
+ zoomToCenter: zoomToCenter,
7847
+ zoomToExtent: zoomToExtent,
7791
7848
  getCenter: getCenterCoordinates,
7792
7849
  updateItemExtent: debouncedUpdateItemExtent
7793
7850
  };