Preview.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
  2. import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
  3. import _extends from "@babel/runtime/helpers/esm/extends";
  4. import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
  5. import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
  6. var _excluded = ["fallback", "src", "imgRef"],
  7. _excluded2 = ["prefixCls", "src", "alt", "imageInfo", "fallback", "movable", "onClose", "visible", "icons", "rootClassName", "closeIcon", "getContainer", "current", "count", "countRender", "scaleStep", "minScale", "maxScale", "transitionName", "maskTransitionName", "imageRender", "imgCommonProps", "toolbarRender", "onTransform", "onChange"];
  8. import classnames from 'classnames';
  9. import Dialog from 'rc-dialog';
  10. import addEventListener from "rc-util/es/Dom/addEventListener";
  11. import KeyCode from "rc-util/es/KeyCode";
  12. import React, { useContext, useEffect, useRef, useState } from 'react';
  13. import Operations from "./Operations";
  14. import { PreviewGroupContext } from "./context";
  15. import useImageTransform from "./hooks/useImageTransform";
  16. import useMouseEvent from "./hooks/useMouseEvent";
  17. import useStatus from "./hooks/useStatus";
  18. import useTouchEvent from "./hooks/useTouchEvent";
  19. import { BASE_SCALE_RATIO } from "./previewConfig";
  20. var PreviewImage = function PreviewImage(_ref) {
  21. var fallback = _ref.fallback,
  22. src = _ref.src,
  23. imgRef = _ref.imgRef,
  24. props = _objectWithoutProperties(_ref, _excluded);
  25. var _useStatus = useStatus({
  26. src: src,
  27. fallback: fallback
  28. }),
  29. _useStatus2 = _slicedToArray(_useStatus, 2),
  30. getImgRef = _useStatus2[0],
  31. srcAndOnload = _useStatus2[1];
  32. return /*#__PURE__*/React.createElement("img", _extends({
  33. ref: function ref(_ref2) {
  34. imgRef.current = _ref2;
  35. getImgRef(_ref2);
  36. }
  37. }, props, srcAndOnload));
  38. };
  39. var Preview = function Preview(props) {
  40. var prefixCls = props.prefixCls,
  41. src = props.src,
  42. alt = props.alt,
  43. imageInfo = props.imageInfo,
  44. fallback = props.fallback,
  45. _props$movable = props.movable,
  46. movable = _props$movable === void 0 ? true : _props$movable,
  47. onClose = props.onClose,
  48. visible = props.visible,
  49. _props$icons = props.icons,
  50. icons = _props$icons === void 0 ? {} : _props$icons,
  51. rootClassName = props.rootClassName,
  52. closeIcon = props.closeIcon,
  53. getContainer = props.getContainer,
  54. _props$current = props.current,
  55. current = _props$current === void 0 ? 0 : _props$current,
  56. _props$count = props.count,
  57. count = _props$count === void 0 ? 1 : _props$count,
  58. countRender = props.countRender,
  59. _props$scaleStep = props.scaleStep,
  60. scaleStep = _props$scaleStep === void 0 ? 0.5 : _props$scaleStep,
  61. _props$minScale = props.minScale,
  62. minScale = _props$minScale === void 0 ? 1 : _props$minScale,
  63. _props$maxScale = props.maxScale,
  64. maxScale = _props$maxScale === void 0 ? 50 : _props$maxScale,
  65. _props$transitionName = props.transitionName,
  66. transitionName = _props$transitionName === void 0 ? 'zoom' : _props$transitionName,
  67. _props$maskTransition = props.maskTransitionName,
  68. maskTransitionName = _props$maskTransition === void 0 ? 'fade' : _props$maskTransition,
  69. imageRender = props.imageRender,
  70. imgCommonProps = props.imgCommonProps,
  71. toolbarRender = props.toolbarRender,
  72. onTransform = props.onTransform,
  73. onChange = props.onChange,
  74. restProps = _objectWithoutProperties(props, _excluded2);
  75. var imgRef = useRef();
  76. var groupContext = useContext(PreviewGroupContext);
  77. var showLeftOrRightSwitches = groupContext && count > 1;
  78. var showOperationsProgress = groupContext && count >= 1;
  79. var _useState = useState(true),
  80. _useState2 = _slicedToArray(_useState, 2),
  81. enableTransition = _useState2[0],
  82. setEnableTransition = _useState2[1];
  83. var _useImageTransform = useImageTransform(imgRef, minScale, maxScale, onTransform),
  84. transform = _useImageTransform.transform,
  85. resetTransform = _useImageTransform.resetTransform,
  86. updateTransform = _useImageTransform.updateTransform,
  87. dispatchZoomChange = _useImageTransform.dispatchZoomChange;
  88. var _useMouseEvent = useMouseEvent(imgRef, movable, visible, scaleStep, transform, updateTransform, dispatchZoomChange),
  89. isMoving = _useMouseEvent.isMoving,
  90. onMouseDown = _useMouseEvent.onMouseDown,
  91. onWheel = _useMouseEvent.onWheel;
  92. var _useTouchEvent = useTouchEvent(imgRef, movable, visible, minScale, transform, updateTransform, dispatchZoomChange),
  93. isTouching = _useTouchEvent.isTouching,
  94. onTouchStart = _useTouchEvent.onTouchStart,
  95. onTouchMove = _useTouchEvent.onTouchMove,
  96. onTouchEnd = _useTouchEvent.onTouchEnd;
  97. var rotate = transform.rotate,
  98. scale = transform.scale;
  99. var wrapClassName = classnames(_defineProperty({}, "".concat(prefixCls, "-moving"), isMoving));
  100. useEffect(function () {
  101. if (!enableTransition) {
  102. setEnableTransition(true);
  103. }
  104. }, [enableTransition]);
  105. var onAfterClose = function onAfterClose() {
  106. resetTransform('close');
  107. };
  108. var onZoomIn = function onZoomIn() {
  109. dispatchZoomChange(BASE_SCALE_RATIO + scaleStep, 'zoomIn');
  110. };
  111. var onZoomOut = function onZoomOut() {
  112. dispatchZoomChange(BASE_SCALE_RATIO / (BASE_SCALE_RATIO + scaleStep), 'zoomOut');
  113. };
  114. var onRotateRight = function onRotateRight() {
  115. updateTransform({
  116. rotate: rotate + 90
  117. }, 'rotateRight');
  118. };
  119. var onRotateLeft = function onRotateLeft() {
  120. updateTransform({
  121. rotate: rotate - 90
  122. }, 'rotateLeft');
  123. };
  124. var onFlipX = function onFlipX() {
  125. updateTransform({
  126. flipX: !transform.flipX
  127. }, 'flipX');
  128. };
  129. var onFlipY = function onFlipY() {
  130. updateTransform({
  131. flipY: !transform.flipY
  132. }, 'flipY');
  133. };
  134. var onReset = function onReset() {
  135. resetTransform('reset');
  136. };
  137. var onActive = function onActive(offset) {
  138. var position = current + offset;
  139. if (!Number.isInteger(position) || position < 0 || position > count - 1) {
  140. return;
  141. }
  142. setEnableTransition(false);
  143. resetTransform(offset < 0 ? 'prev' : 'next');
  144. onChange === null || onChange === void 0 || onChange(position, current);
  145. };
  146. var onKeyDown = function onKeyDown(event) {
  147. if (!visible || !showLeftOrRightSwitches) return;
  148. if (event.keyCode === KeyCode.LEFT) {
  149. onActive(-1);
  150. } else if (event.keyCode === KeyCode.RIGHT) {
  151. onActive(1);
  152. }
  153. };
  154. var onDoubleClick = function onDoubleClick(event) {
  155. if (visible) {
  156. if (scale !== 1) {
  157. updateTransform({
  158. x: 0,
  159. y: 0,
  160. scale: 1
  161. }, 'doubleClick');
  162. } else {
  163. dispatchZoomChange(BASE_SCALE_RATIO + scaleStep, 'doubleClick', event.clientX, event.clientY);
  164. }
  165. }
  166. };
  167. useEffect(function () {
  168. var onKeyDownListener = addEventListener(window, 'keydown', onKeyDown, false);
  169. return function () {
  170. onKeyDownListener.remove();
  171. };
  172. }, [visible, showLeftOrRightSwitches, current]);
  173. var imgNode = /*#__PURE__*/React.createElement(PreviewImage, _extends({}, imgCommonProps, {
  174. width: props.width,
  175. height: props.height,
  176. imgRef: imgRef,
  177. className: "".concat(prefixCls, "-img"),
  178. alt: alt,
  179. style: {
  180. transform: "translate3d(".concat(transform.x, "px, ").concat(transform.y, "px, 0) scale3d(").concat(transform.flipX ? '-' : '').concat(scale, ", ").concat(transform.flipY ? '-' : '').concat(scale, ", 1) rotate(").concat(rotate, "deg)"),
  181. transitionDuration: (!enableTransition || isTouching) && '0s'
  182. },
  183. fallback: fallback,
  184. src: src,
  185. onWheel: onWheel,
  186. onMouseDown: onMouseDown,
  187. onDoubleClick: onDoubleClick,
  188. onTouchStart: onTouchStart,
  189. onTouchMove: onTouchMove,
  190. onTouchEnd: onTouchEnd,
  191. onTouchCancel: onTouchEnd
  192. }));
  193. var image = _objectSpread({
  194. url: src,
  195. alt: alt
  196. }, imageInfo);
  197. return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Dialog, _extends({
  198. transitionName: transitionName,
  199. maskTransitionName: maskTransitionName,
  200. closable: false,
  201. keyboard: true,
  202. prefixCls: prefixCls,
  203. onClose: onClose,
  204. visible: visible,
  205. classNames: {
  206. wrapper: wrapClassName
  207. },
  208. rootClassName: rootClassName,
  209. getContainer: getContainer
  210. }, restProps, {
  211. afterClose: onAfterClose
  212. }), /*#__PURE__*/React.createElement("div", {
  213. className: "".concat(prefixCls, "-img-wrapper")
  214. }, imageRender ? imageRender(imgNode, _objectSpread({
  215. transform: transform,
  216. image: image
  217. }, groupContext ? {
  218. current: current
  219. } : {})) : imgNode)), /*#__PURE__*/React.createElement(Operations, {
  220. visible: visible,
  221. transform: transform,
  222. maskTransitionName: maskTransitionName,
  223. closeIcon: closeIcon,
  224. getContainer: getContainer,
  225. prefixCls: prefixCls,
  226. rootClassName: rootClassName,
  227. icons: icons,
  228. countRender: countRender,
  229. showSwitch: showLeftOrRightSwitches,
  230. showProgress: showOperationsProgress,
  231. current: current,
  232. count: count,
  233. scale: scale,
  234. minScale: minScale,
  235. maxScale: maxScale,
  236. toolbarRender: toolbarRender,
  237. onActive: onActive,
  238. onZoomIn: onZoomIn,
  239. onZoomOut: onZoomOut,
  240. onRotateRight: onRotateRight,
  241. onRotateLeft: onRotateLeft,
  242. onFlipX: onFlipX,
  243. onFlipY: onFlipY,
  244. onClose: onClose,
  245. onReset: onReset,
  246. zIndex: restProps.zIndex !== undefined ? restProps.zIndex + 1 : undefined,
  247. image: image
  248. }));
  249. };
  250. export default Preview;