useMouseEvent.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = useMouseEvent;
  7. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  8. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  9. var _addEventListener = _interopRequireDefault(require("rc-util/lib/Dom/addEventListener"));
  10. var _warning = require("rc-util/lib/warning");
  11. var _react = require("react");
  12. var _getFixScaleEleTransPosition = _interopRequireDefault(require("../getFixScaleEleTransPosition"));
  13. var _previewConfig = require("../previewConfig");
  14. function useMouseEvent(imgRef, movable, visible, scaleStep, transform, updateTransform, dispatchZoomChange) {
  15. var rotate = transform.rotate,
  16. scale = transform.scale,
  17. x = transform.x,
  18. y = transform.y;
  19. var _useState = (0, _react.useState)(false),
  20. _useState2 = (0, _slicedToArray2.default)(_useState, 2),
  21. isMoving = _useState2[0],
  22. setMoving = _useState2[1];
  23. var startPositionInfo = (0, _react.useRef)({
  24. diffX: 0,
  25. diffY: 0,
  26. transformX: 0,
  27. transformY: 0
  28. });
  29. var onMouseDown = function onMouseDown(event) {
  30. // Only allow main button
  31. if (!movable || event.button !== 0) return;
  32. event.preventDefault();
  33. event.stopPropagation();
  34. startPositionInfo.current = {
  35. diffX: event.pageX - x,
  36. diffY: event.pageY - y,
  37. transformX: x,
  38. transformY: y
  39. };
  40. setMoving(true);
  41. };
  42. var onMouseMove = function onMouseMove(event) {
  43. if (visible && isMoving) {
  44. updateTransform({
  45. x: event.pageX - startPositionInfo.current.diffX,
  46. y: event.pageY - startPositionInfo.current.diffY
  47. }, 'move');
  48. }
  49. };
  50. var onMouseUp = function onMouseUp() {
  51. if (visible && isMoving) {
  52. setMoving(false);
  53. /** No need to restore the position when the picture is not moved, So as not to interfere with the click */
  54. var _startPositionInfo$cu = startPositionInfo.current,
  55. transformX = _startPositionInfo$cu.transformX,
  56. transformY = _startPositionInfo$cu.transformY;
  57. var hasChangedPosition = x !== transformX && y !== transformY;
  58. if (!hasChangedPosition) return;
  59. var width = imgRef.current.offsetWidth * scale;
  60. var height = imgRef.current.offsetHeight * scale;
  61. // eslint-disable-next-line @typescript-eslint/no-shadow
  62. var _imgRef$current$getBo = imgRef.current.getBoundingClientRect(),
  63. left = _imgRef$current$getBo.left,
  64. top = _imgRef$current$getBo.top;
  65. var isRotate = rotate % 180 !== 0;
  66. var fixState = (0, _getFixScaleEleTransPosition.default)(isRotate ? height : width, isRotate ? width : height, left, top);
  67. if (fixState) {
  68. updateTransform((0, _objectSpread2.default)({}, fixState), 'dragRebound');
  69. }
  70. }
  71. };
  72. var onWheel = function onWheel(event) {
  73. if (!visible || event.deltaY == 0) return;
  74. // Scale ratio depends on the deltaY size
  75. var scaleRatio = Math.abs(event.deltaY / 100);
  76. // Limit the maximum scale ratio
  77. var mergedScaleRatio = Math.min(scaleRatio, _previewConfig.WHEEL_MAX_SCALE_RATIO);
  78. // Scale the ratio each time
  79. var ratio = _previewConfig.BASE_SCALE_RATIO + mergedScaleRatio * scaleStep;
  80. if (event.deltaY > 0) {
  81. ratio = _previewConfig.BASE_SCALE_RATIO / ratio;
  82. }
  83. dispatchZoomChange(ratio, 'wheel', event.clientX, event.clientY);
  84. };
  85. (0, _react.useEffect)(function () {
  86. var onTopMouseUpListener;
  87. var onTopMouseMoveListener;
  88. var onMouseUpListener;
  89. var onMouseMoveListener;
  90. if (movable) {
  91. onMouseUpListener = (0, _addEventListener.default)(window, 'mouseup', onMouseUp, false);
  92. onMouseMoveListener = (0, _addEventListener.default)(window, 'mousemove', onMouseMove, false);
  93. try {
  94. // Resolve if in iframe lost event
  95. /* istanbul ignore next */
  96. if (window.top !== window.self) {
  97. onTopMouseUpListener = (0, _addEventListener.default)(window.top, 'mouseup', onMouseUp, false);
  98. onTopMouseMoveListener = (0, _addEventListener.default)(window.top, 'mousemove', onMouseMove, false);
  99. }
  100. } catch (error) {
  101. /* istanbul ignore next */
  102. (0, _warning.warning)(false, "[rc-image] ".concat(error));
  103. }
  104. }
  105. return function () {
  106. var _onMouseUpListener, _onMouseMoveListener, _onTopMouseUpListener, _onTopMouseMoveListen;
  107. (_onMouseUpListener = onMouseUpListener) === null || _onMouseUpListener === void 0 || _onMouseUpListener.remove();
  108. (_onMouseMoveListener = onMouseMoveListener) === null || _onMouseMoveListener === void 0 || _onMouseMoveListener.remove();
  109. /* istanbul ignore next */
  110. (_onTopMouseUpListener = onTopMouseUpListener) === null || _onTopMouseUpListener === void 0 || _onTopMouseUpListener.remove();
  111. /* istanbul ignore next */
  112. (_onTopMouseMoveListen = onTopMouseMoveListener) === null || _onTopMouseMoveListen === void 0 || _onTopMouseMoveListen.remove();
  113. };
  114. }, [visible, isMoving, x, y, rotate, movable]);
  115. return {
  116. isMoving: isMoving,
  117. onMouseDown: onMouseDown,
  118. onMouseMove: onMouseMove,
  119. onMouseUp: onMouseUp,
  120. onWheel: onWheel
  121. };
  122. }