Preview.js 11 KB

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