UNPKG

15.5 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4var _typeof = require("@babel/runtime/helpers/typeof");
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.default = void 0;
9var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
10var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
12var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
14var _classnames2 = _interopRequireDefault(require("classnames"));
15var _rcDialog = _interopRequireDefault(require("rc-dialog"));
16var _addEventListener = _interopRequireDefault(require("rc-util/lib/Dom/addEventListener"));
17var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode"));
18var _warning = require("rc-util/lib/warning");
19var _react = _interopRequireWildcard(require("react"));
20var _context = require("./context");
21var _getFixScaleEleTransPosition = _interopRequireDefault(require("./getFixScaleEleTransPosition"));
22var _useImageTransform2 = _interopRequireDefault(require("./hooks/useImageTransform"));
23var _useStatus3 = _interopRequireDefault(require("./hooks/useStatus"));
24var _Operations = _interopRequireDefault(require("./Operations"));
25var _previewConfig = require("./previewConfig");
26var _excluded = ["fallback", "src", "imgRef"],
27 _excluded2 = ["prefixCls", "src", "alt", "fallback", "movable", "onClose", "visible", "icons", "rootClassName", "closeIcon", "getContainer", "current", "count", "countRender", "scaleStep", "minScale", "maxScale", "transitionName", "maskTransitionName", "imageRender", "imgCommonProps", "toolbarRender", "onTransform", "onChange"];
28function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
29function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
30var PreviewImage = function PreviewImage(_ref) {
31 var fallback = _ref.fallback,
32 src = _ref.src,
33 imgRef = _ref.imgRef,
34 props = (0, _objectWithoutProperties2.default)(_ref, _excluded);
35 var _useStatus = (0, _useStatus3.default)({
36 src: src,
37 fallback: fallback
38 }),
39 _useStatus2 = (0, _slicedToArray2.default)(_useStatus, 2),
40 getImgRef = _useStatus2[0],
41 srcAndOnload = _useStatus2[1];
42 return /*#__PURE__*/_react.default.createElement("img", (0, _extends2.default)({
43 ref: function ref(_ref2) {
44 imgRef.current = _ref2;
45 getImgRef(_ref2);
46 }
47 }, props, srcAndOnload));
48};
49var Preview = function Preview(props) {
50 var prefixCls = props.prefixCls,
51 src = props.src,
52 alt = props.alt,
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 downPositionRef = (0, _react.useRef)({
86 deltaX: 0,
87 deltaY: 0,
88 transformX: 0,
89 transformY: 0
90 });
91 var _useState = (0, _react.useState)(false),
92 _useState2 = (0, _slicedToArray2.default)(_useState, 2),
93 isMoving = _useState2[0],
94 setMoving = _useState2[1];
95 var groupContext = (0, _react.useContext)(_context.PreviewGroupContext);
96 var showLeftOrRightSwitches = groupContext && count > 1;
97 var showOperationsProgress = groupContext && count >= 1;
98 var _useImageTransform = (0, _useImageTransform2.default)(imgRef, minScale, maxScale, onTransform),
99 transform = _useImageTransform.transform,
100 resetTransform = _useImageTransform.resetTransform,
101 updateTransform = _useImageTransform.updateTransform,
102 dispatchZoomChange = _useImageTransform.dispatchZoomChange;
103 var _useState3 = (0, _react.useState)(true),
104 _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
105 enableTransition = _useState4[0],
106 setEnableTransition = _useState4[1];
107 var rotate = transform.rotate,
108 scale = transform.scale,
109 x = transform.x,
110 y = transform.y;
111 var wrapClassName = (0, _classnames2.default)((0, _defineProperty2.default)({}, "".concat(prefixCls, "-moving"), isMoving));
112 (0, _react.useEffect)(function () {
113 if (!enableTransition) {
114 setEnableTransition(true);
115 }
116 }, [enableTransition]);
117 var onAfterClose = function onAfterClose() {
118 resetTransform('close');
119 };
120 var onZoomIn = function onZoomIn() {
121 dispatchZoomChange(_previewConfig.BASE_SCALE_RATIO + scaleStep, 'zoomIn');
122 };
123 var onZoomOut = function onZoomOut() {
124 dispatchZoomChange(_previewConfig.BASE_SCALE_RATIO / (_previewConfig.BASE_SCALE_RATIO + scaleStep), 'zoomOut');
125 };
126 var onRotateRight = function onRotateRight() {
127 updateTransform({
128 rotate: rotate + 90
129 }, 'rotateRight');
130 };
131 var onRotateLeft = function onRotateLeft() {
132 updateTransform({
133 rotate: rotate - 90
134 }, 'rotateLeft');
135 };
136 var onFlipX = function onFlipX() {
137 updateTransform({
138 flipX: !transform.flipX
139 }, 'flipX');
140 };
141 var onFlipY = function onFlipY() {
142 updateTransform({
143 flipY: !transform.flipY
144 }, 'flipY');
145 };
146 var onSwitchLeft = function onSwitchLeft(event) {
147 event === null || event === void 0 ? void 0 : event.preventDefault();
148 event === null || event === void 0 ? void 0 : event.stopPropagation();
149 if (current > 0) {
150 setEnableTransition(false);
151 resetTransform('prev');
152 onChange === null || onChange === void 0 ? void 0 : onChange(current - 1, current);
153 }
154 };
155 var onSwitchRight = function onSwitchRight(event) {
156 event === null || event === void 0 ? void 0 : event.preventDefault();
157 event === null || event === void 0 ? void 0 : event.stopPropagation();
158 if (current < count - 1) {
159 setEnableTransition(false);
160 resetTransform('next');
161 onChange === null || onChange === void 0 ? void 0 : onChange(current + 1, current);
162 }
163 };
164 var onMouseUp = function onMouseUp() {
165 if (visible && isMoving) {
166 setMoving(false);
167 /** No need to restore the position when the picture is not moved, So as not to interfere with the click */
168 var _downPositionRef$curr = downPositionRef.current,
169 transformX = _downPositionRef$curr.transformX,
170 transformY = _downPositionRef$curr.transformY;
171 var hasChangedPosition = x !== transformX && y !== transformY;
172 if (!hasChangedPosition) {
173 return;
174 }
175 var width = imgRef.current.offsetWidth * scale;
176 var height = imgRef.current.offsetHeight * scale;
177 // eslint-disable-next-line @typescript-eslint/no-shadow
178 var _imgRef$current$getBo = imgRef.current.getBoundingClientRect(),
179 left = _imgRef$current$getBo.left,
180 top = _imgRef$current$getBo.top;
181 var isRotate = rotate % 180 !== 0;
182 var fixState = (0, _getFixScaleEleTransPosition.default)(isRotate ? height : width, isRotate ? width : height, left, top);
183 if (fixState) {
184 updateTransform((0, _objectSpread2.default)({}, fixState), 'dragRebound');
185 }
186 }
187 };
188 var onMouseDown = function onMouseDown(event) {
189 // Only allow main button
190 if (!movable || event.button !== 0) return;
191 event.preventDefault();
192 event.stopPropagation();
193 downPositionRef.current = {
194 deltaX: event.pageX - transform.x,
195 deltaY: event.pageY - transform.y,
196 transformX: transform.x,
197 transformY: transform.y
198 };
199 setMoving(true);
200 };
201 var onMouseMove = function onMouseMove(event) {
202 if (visible && isMoving) {
203 updateTransform({
204 x: event.pageX - downPositionRef.current.deltaX,
205 y: event.pageY - downPositionRef.current.deltaY
206 }, 'move');
207 }
208 };
209 var onWheel = function onWheel(event) {
210 if (!visible || event.deltaY == 0) return;
211 // Scale ratio depends on the deltaY size
212 var scaleRatio = Math.abs(event.deltaY / 100);
213 // Limit the maximum scale ratio
214 var mergedScaleRatio = Math.min(scaleRatio, _previewConfig.WHEEL_MAX_SCALE_RATIO);
215 // Scale the ratio each time
216 var ratio = _previewConfig.BASE_SCALE_RATIO + mergedScaleRatio * scaleStep;
217 if (event.deltaY > 0) {
218 ratio = _previewConfig.BASE_SCALE_RATIO / ratio;
219 }
220 dispatchZoomChange(ratio, 'wheel', event.clientX, event.clientY);
221 };
222 var onKeyDown = function onKeyDown(event) {
223 if (!visible || !showLeftOrRightSwitches) return;
224 if (event.keyCode === _KeyCode.default.LEFT) {
225 onSwitchLeft();
226 } else if (event.keyCode === _KeyCode.default.RIGHT) {
227 onSwitchRight();
228 }
229 };
230 var onDoubleClick = function onDoubleClick(event) {
231 if (visible) {
232 if (scale !== 1) {
233 updateTransform({
234 x: 0,
235 y: 0,
236 scale: 1
237 }, 'doubleClick');
238 } else {
239 dispatchZoomChange(_previewConfig.BASE_SCALE_RATIO + scaleStep, 'doubleClick', event.clientX, event.clientY);
240 }
241 }
242 };
243 (0, _react.useEffect)(function () {
244 var onTopMouseUpListener;
245 var onTopMouseMoveListener;
246 var onMouseUpListener;
247 var onMouseMoveListener;
248 if (movable) {
249 onMouseUpListener = (0, _addEventListener.default)(window, 'mouseup', onMouseUp, false);
250 onMouseMoveListener = (0, _addEventListener.default)(window, 'mousemove', onMouseMove, false);
251 try {
252 // Resolve if in iframe lost event
253 /* istanbul ignore next */
254 if (window.top !== window.self) {
255 onTopMouseUpListener = (0, _addEventListener.default)(window.top, 'mouseup', onMouseUp, false);
256 onTopMouseMoveListener = (0, _addEventListener.default)(window.top, 'mousemove', onMouseMove, false);
257 }
258 } catch (error) {
259 /* istanbul ignore next */
260 (0, _warning.warning)(false, "[rc-image] ".concat(error));
261 }
262 }
263 return function () {
264 var _onMouseUpListener, _onMouseMoveListener, _onTopMouseUpListener, _onTopMouseMoveListen;
265 (_onMouseUpListener = onMouseUpListener) === null || _onMouseUpListener === void 0 ? void 0 : _onMouseUpListener.remove();
266 (_onMouseMoveListener = onMouseMoveListener) === null || _onMouseMoveListener === void 0 ? void 0 : _onMouseMoveListener.remove();
267 /* istanbul ignore next */
268 (_onTopMouseUpListener = onTopMouseUpListener) === null || _onTopMouseUpListener === void 0 ? void 0 : _onTopMouseUpListener.remove();
269 /* istanbul ignore next */
270 (_onTopMouseMoveListen = onTopMouseMoveListener) === null || _onTopMouseMoveListen === void 0 ? void 0 : _onTopMouseMoveListen.remove();
271 };
272 }, [visible, isMoving, x, y, rotate, movable]);
273 (0, _react.useEffect)(function () {
274 var onKeyDownListener = (0, _addEventListener.default)(window, 'keydown', onKeyDown, false);
275 return function () {
276 onKeyDownListener.remove();
277 };
278 }, [visible, showLeftOrRightSwitches, current]);
279 var imgNode = /*#__PURE__*/_react.default.createElement(PreviewImage, (0, _extends2.default)({}, imgCommonProps, {
280 width: props.width,
281 height: props.height,
282 imgRef: imgRef,
283 className: "".concat(prefixCls, "-img"),
284 alt: alt,
285 style: {
286 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)"),
287 transitionDuration: !enableTransition && '0s'
288 },
289 fallback: fallback,
290 src: src,
291 onWheel: onWheel,
292 onMouseDown: onMouseDown,
293 onDoubleClick: onDoubleClick
294 }));
295 return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_rcDialog.default, (0, _extends2.default)({
296 transitionName: transitionName,
297 maskTransitionName: maskTransitionName,
298 closable: false,
299 keyboard: true,
300 prefixCls: prefixCls,
301 onClose: onClose,
302 visible: visible,
303 wrapClassName: wrapClassName,
304 rootClassName: rootClassName,
305 getContainer: getContainer
306 }, restProps, {
307 afterClose: onAfterClose
308 }), /*#__PURE__*/_react.default.createElement("div", {
309 className: "".concat(prefixCls, "-img-wrapper")
310 }, imageRender ? imageRender(imgNode, (0, _objectSpread2.default)({
311 transform: transform
312 }, groupContext ? {
313 current: current
314 } : {})) : imgNode)), /*#__PURE__*/_react.default.createElement(_Operations.default, {
315 visible: visible,
316 transform: transform,
317 maskTransitionName: maskTransitionName,
318 closeIcon: closeIcon,
319 getContainer: getContainer,
320 prefixCls: prefixCls,
321 rootClassName: rootClassName,
322 icons: icons,
323 countRender: countRender,
324 showSwitch: showLeftOrRightSwitches,
325 showProgress: showOperationsProgress,
326 current: current,
327 count: count,
328 scale: scale,
329 minScale: minScale,
330 maxScale: maxScale,
331 toolbarRender: toolbarRender,
332 onSwitchLeft: onSwitchLeft,
333 onSwitchRight: onSwitchRight,
334 onZoomIn: onZoomIn,
335 onZoomOut: onZoomOut,
336 onRotateRight: onRotateRight,
337 onRotateLeft: onRotateLeft,
338 onFlipX: onFlipX,
339 onFlipY: onFlipY,
340 onClose: onClose
341 }));
342};
343var _default = Preview;
344exports.default = _default;
\No newline at end of file