useMouseEvent.js 4.8 KB

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