@douyinfe/semi-ui 2.49.0-beta.0 → 2.49.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -53,6 +53,8 @@ export interface PreviewProps extends BaseProps {
53
53
  zIndex?: number;
54
54
  children?: ReactNode;
55
55
  crossOrigin?: "anonymous" | "use-credentials";
56
+ maxZoom?: number;
57
+ minZoom?: number;
56
58
  renderHeader?: (info: any) => ReactNode;
57
59
  renderPreviewMenu?: (props: MenuProps) => ReactNode;
58
60
  getPopupContainer?: () => HTMLElement;
@@ -138,14 +140,12 @@ export interface FooterProps extends SliderProps {
138
140
  onRotate?: (direction: string) => void;
139
141
  onDownload?: () => void;
140
142
  renderPreviewMenu?: (props: MenuProps) => ReactNode;
143
+ forwardRef?: React.RefObject<HTMLElement>;
141
144
  }
142
145
  export interface PreviewImageProps {
143
146
  src?: string;
144
147
  rotation?: number;
145
148
  style?: React.CSSProperties;
146
- maxZoom?: number;
147
- minZoom?: number;
148
- zoomStep?: number;
149
149
  zoom?: number;
150
150
  ratio?: RatioType;
151
151
  disableDownload?: boolean;
@@ -19,14 +19,9 @@ var _localeConsumer = _interopRequireDefault(require("../locale/localeConsumer")
19
19
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
20
  const prefixCls = _constants.cssClasses.PREFIX;
21
21
  const footerPrefixCls = `${_constants.cssClasses.PREFIX}-preview-footer`;
22
- let mouseActiveTime = 0;
23
22
  class Footer extends _baseComponent.default {
24
23
  get adapter() {
25
- return Object.assign(Object.assign({}, super.adapter), {
26
- setStartMouseOffset: time => {
27
- mouseActiveTime = time;
28
- }
29
- });
24
+ return Object.assign({}, super.adapter);
30
25
  }
31
26
  constructor(props) {
32
27
  super(props);
@@ -266,13 +261,15 @@ class Footer extends _baseComponent.default {
266
261
  render() {
267
262
  const {
268
263
  className,
269
- renderPreviewMenu
264
+ renderPreviewMenu,
265
+ forwardRef
270
266
  } = this.props;
271
267
  const menuCls = (0, _classnames.default)(footerPrefixCls, `${footerPrefixCls}-wrapper`, className, {
272
268
  [`${footerPrefixCls}-content`]: !Boolean(renderPreviewMenu)
273
269
  });
274
270
  return /*#__PURE__*/_react.default.createElement("section", {
275
- className: menuCls
271
+ className: menuCls,
272
+ ref: forwardRef
276
273
  }, renderPreviewMenu ? this.customRenderViewMenu() : this.getFooterMenu());
277
274
  }
278
275
  }
@@ -1,4 +1,4 @@
1
- import * as React from "react";
1
+ import React from "react";
2
2
  import { HeaderProps } from "./interface";
3
- declare const Header: React.FC<HeaderProps>;
3
+ declare const Header: React.ForwardRefExoticComponent<HeaderProps & React.RefAttributes<HTMLElement>>;
4
4
  export default Header;
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var React = _interopRequireWildcard(require("react"));
7
+ var _react = _interopRequireWildcard(require("react"));
8
8
  var _semiIcons = require("@douyinfe/semi-icons");
9
9
  var _constants = require("@douyinfe/semi-foundation/lib/cjs/image/constants");
10
10
  var _classnames = _interopRequireDefault(require("classnames"));
@@ -13,14 +13,14 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
13
13
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
14
14
  function _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; }
15
15
  const prefixCls = `${_constants.cssClasses.PREFIX}-preview-header`;
16
- const Header = _ref => {
16
+ const Header = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
17
17
  let {
18
18
  onClose,
19
19
  titleStyle,
20
20
  className,
21
21
  renderHeader
22
22
  } = _ref;
23
- return /*#__PURE__*/React.createElement(_previewContext.PreviewContext.Consumer, null, _ref2 => {
23
+ return /*#__PURE__*/_react.default.createElement(_previewContext.PreviewContext.Consumer, null, _ref2 => {
24
24
  let {
25
25
  currentIndex,
26
26
  titles
@@ -29,16 +29,17 @@ const Header = _ref => {
29
29
  if (titles && typeof currentIndex === "number") {
30
30
  title = titles[currentIndex];
31
31
  }
32
- return /*#__PURE__*/React.createElement("section", {
32
+ return /*#__PURE__*/_react.default.createElement("section", {
33
+ ref: ref,
33
34
  className: (0, _classnames.default)(prefixCls, className)
34
- }, /*#__PURE__*/React.createElement("section", {
35
+ }, /*#__PURE__*/_react.default.createElement("section", {
35
36
  className: `${prefixCls}-title`,
36
37
  style: titleStyle
37
- }, renderHeader ? renderHeader(title) : title), /*#__PURE__*/React.createElement("section", {
38
+ }, renderHeader ? renderHeader(title) : title), /*#__PURE__*/_react.default.createElement("section", {
38
39
  className: `${prefixCls}-close`,
39
40
  onMouseUp: onClose
40
- }, /*#__PURE__*/React.createElement(_semiIcons.IconClose, null)));
41
+ }, /*#__PURE__*/_react.default.createElement(_semiIcons.IconClose, null)));
41
42
  });
42
- };
43
+ });
43
44
  var _default = Header;
44
45
  exports.default = _default;
@@ -8,9 +8,6 @@ export default class PreviewImage extends BaseComponent<PreviewImageProps, Previ
8
8
  src: PropTypes.Requireable<string>;
9
9
  rotation: PropTypes.Requireable<number>;
10
10
  style: PropTypes.Requireable<object>;
11
- maxZoom: PropTypes.Requireable<number>;
12
- minZoom: PropTypes.Requireable<number>;
13
- zoomStep: PropTypes.Requireable<number>;
14
11
  zoom: PropTypes.Requireable<number>;
15
12
  ratio: PropTypes.Requireable<string>;
16
13
  disableDownload: PropTypes.Requireable<boolean>;
@@ -21,29 +18,21 @@ export default class PreviewImage extends BaseComponent<PreviewImageProps, Previ
21
18
  onError: PropTypes.Requireable<(...args: any[]) => any>;
22
19
  };
23
20
  static defaultProps: {
24
- maxZoom: number;
25
- minZoom: number;
26
- zoomStep: number;
27
21
  zoom: any;
28
22
  };
29
23
  get adapter(): PreviewImageAdapter<PreviewImageProps, PreviewImageStates>;
30
24
  containerRef: React.RefObject<HTMLDivElement>;
31
- imageRef: HTMLImageElement | null;
25
+ imageRef: React.RefObject<HTMLImageElement>;
32
26
  foundation: PreviewImageFoundation;
33
27
  constructor(props: any);
34
28
  componentDidMount(): void;
35
29
  componentWillUnmount(): void;
36
30
  componentDidUpdate(prevProps: PreviewImageProps, prevStates: PreviewImageStates): void;
37
31
  onWindowResize: () => void;
38
- handleZoomChange: (newZoom: any, e: any) => void;
39
32
  handleRightClickImage: (e: any) => void;
40
- handleWheel: (e: any) => void;
41
33
  handleLoad: (e: any) => void;
42
34
  handleError: (e: any) => void;
43
- resizeImage: () => void;
44
35
  handleMoveImage: (e: any) => void;
45
- registryImageRef: (ref: any) => void;
46
36
  onImageMouseDown: (e: React.MouseEvent<HTMLImageElement>) => void;
47
- onImageMouseUp: () => void;
48
37
  render(): JSX.Element;
49
38
  }
@@ -13,38 +13,14 @@ var _previewImageFoundation = _interopRequireDefault(require("@douyinfe/semi-fou
13
13
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
14
  const prefixCls = _constants.cssClasses.PREFIX;
15
15
  const preViewImgPrefixCls = `${prefixCls}-preview-image`;
16
- let originImageWidth = null;
17
- let originImageHeight = null;
18
- let startMouseMove = false;
19
- // startMouseOffset:The offset of the mouse relative to the left and top of the picture
20
- let startMouseOffset = {
21
- x: 0,
22
- y: 0
23
- };
24
16
  class PreviewImage extends _baseComponent.default {
25
17
  get adapter() {
26
18
  return Object.assign(Object.assign({}, super.adapter), {
27
- getOriginImageSize: () => ({
28
- originImageWidth,
29
- originImageHeight
30
- }),
31
- setOriginImageSize: size => {
32
- originImageWidth = size.originImageWidth;
33
- originImageHeight = size.originImageHeight;
34
- },
35
19
  getContainer: () => {
36
20
  return this.containerRef.current;
37
21
  },
38
22
  getImage: () => {
39
- return this.imageRef;
40
- },
41
- getMouseMove: () => startMouseMove,
42
- setStartMouseMove: move => {
43
- startMouseMove = move;
44
- },
45
- getMouseOffset: () => startMouseOffset,
46
- setStartMouseOffset: offset => {
47
- startMouseOffset = offset;
23
+ return this.imageRef.current;
48
24
  },
49
25
  setLoading: loading => {
50
26
  this.setState({
@@ -52,7 +28,7 @@ class PreviewImage extends _baseComponent.default {
52
28
  });
53
29
  },
54
30
  setImageCursor: canDrag => {
55
- this.imageRef.style.cursor = canDrag ? "grab" : "default";
31
+ this.imageRef.current.style.cursor = canDrag ? "grab" : "default";
56
32
  }
57
33
  });
58
34
  }
@@ -61,52 +37,22 @@ class PreviewImage extends _baseComponent.default {
61
37
  this.onWindowResize = () => {
62
38
  this.foundation.handleWindowResize();
63
39
  };
64
- this.handleZoomChange = (newZoom, e) => {
65
- this.foundation.handleZoomChange(newZoom, e);
66
- };
67
40
  // Determine the response method of right click according to the disableDownload parameter in props
68
41
  this.handleRightClickImage = e => {
69
42
  this.foundation.handleRightClickImage(e);
70
43
  };
71
- this.handleWheel = e => {
72
- this.foundation.handleWheel(e);
73
- };
74
44
  this.handleLoad = e => {
75
45
  this.foundation.handleLoad(e);
76
46
  };
77
47
  this.handleError = e => {
78
48
  this.foundation.handleError(e);
79
49
  };
80
- this.resizeImage = () => {
81
- this.foundation.handleResizeImage();
82
- };
83
50
  this.handleMoveImage = e => {
84
51
  this.foundation.handleMoveImage(e);
85
52
  };
86
- // 为什么通过ref注册wheel而不是使用onWheel事件?
87
- // 因为对于wheel事件,浏览器将 addEventListener 的 passive 默认值更改为 true。如此,事件监听器便不能取消事件,也不会在用户滚动页面时阻止页面呈现。
88
- // 这里我们需要保持页面不动,仅放大图片,因此此处需要将 passive 更改设置为 false。
89
- // Why register wheel via ref instead of using onWheel event?
90
- // Because for wheel events, the browser changes the passive default of addEventListener to true. This way, the event listener cannot cancel the event, nor prevent the page from rendering when the user scrolls.
91
- // Here we need to keep the page still and only zoom in on the image, so here we need to set the passive change to false.
92
- // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#improving_scrolling_performance_with_passive_listeners。
93
- this.registryImageRef = ref => {
94
- if (this.imageRef) {
95
- this.imageRef.removeEventListener("wheel", this.handleWheel);
96
- }
97
- if (ref) {
98
- ref.addEventListener("wheel", this.handleWheel, {
99
- passive: false
100
- });
101
- }
102
- this.imageRef = ref;
103
- };
104
53
  this.onImageMouseDown = e => {
105
54
  this.foundation.handleImageMouseDown(e);
106
55
  };
107
- this.onImageMouseUp = () => {
108
- this.foundation.handleImageMouseUp();
109
- };
110
56
  this.state = {
111
57
  width: 0,
112
58
  height: 0,
@@ -120,7 +66,7 @@ class PreviewImage extends _baseComponent.default {
120
66
  left: 0
121
67
  };
122
68
  this.containerRef = /*#__PURE__*/_react.default.createRef();
123
- this.imageRef = null;
69
+ this.imageRef = /*#__PURE__*/_react.default.createRef();
124
70
  this.foundation = new _previewImageFoundation.default(this.adapter);
125
71
  }
126
72
  componentDidMount() {
@@ -131,27 +77,22 @@ class PreviewImage extends _baseComponent.default {
131
77
  }
132
78
  componentDidUpdate(prevProps, prevStates) {
133
79
  // If src changes, start a new loading
134
- if (this.props.src && this.props.src !== prevProps.src) {
80
+ const zoomChange = "zoom" in this.props && this.props.zoom !== this.state.currZoom;
81
+ const srcChange = this.props.src && this.props.src !== prevProps.src;
82
+ if (srcChange) {
135
83
  this.foundation.setLoading(true);
136
84
  }
137
85
  // If the incoming zoom changes, other content changes are determined based on the new zoom value
138
- if ("zoom" in this.props && this.props.zoom !== prevStates.currZoom) {
139
- this.handleZoomChange(this.props.zoom, null);
86
+ if (zoomChange) {
87
+ this.foundation.calculatePreviewImage(this.props.zoom, null);
140
88
  }
141
- // When the incoming ratio is changed, if it"s adaptation, then resizeImage is triggered to make the image adapt to the page
142
- // else if it"s adaptation is realSize, then onZoom(1) is called to make the image size the original size;
143
- if ("ratio" in this.props && this.props.ratio !== prevProps.ratio) {
144
- if (originImageWidth && originImageHeight) {
145
- if (this.props.ratio === "adaptation") {
146
- this.resizeImage();
147
- } else {
148
- this.props.onZoom(1);
149
- }
89
+ if (!zoomChange && !srcChange && prevProps) {
90
+ if ("ratio" in this.props && this.props.ratio !== prevProps.ratio) {
91
+ this.foundation.handleRatioChange();
92
+ }
93
+ if ("rotation" in this.props && this.props.rotation !== prevProps.rotation) {
94
+ this.onWindowResize();
150
95
  }
151
- }
152
- // When the incoming rotation angle of the image changes, it needs to be resized to make the image fit on the page
153
- if ("rotation" in this.props && this.props.rotation !== prevProps.rotation) {
154
- this.onWindowResize();
155
96
  }
156
97
  }
157
98
  render() {
@@ -173,21 +114,20 @@ class PreviewImage extends _baseComponent.default {
173
114
  transform: `rotate(${-rotation}deg)`,
174
115
  top,
175
116
  left,
176
- width: loading ? "auto" : `${width}px`,
177
- height: loading ? "auto" : `${height}px`
117
+ width,
118
+ height
178
119
  };
179
120
  return /*#__PURE__*/_react.default.createElement("div", {
180
121
  className: `${preViewImgPrefixCls}`,
181
122
  ref: this.containerRef
182
123
  }, /*#__PURE__*/_react.default.createElement("img", {
183
- ref: this.registryImageRef,
124
+ ref: this.imageRef,
184
125
  src: src,
185
126
  alt: "previewImag",
186
127
  className: `${preViewImgPrefixCls}-img`,
187
128
  key: src,
188
129
  onMouseMove: this.handleMoveImage,
189
130
  onMouseDown: this.onImageMouseDown,
190
- onMouseUp: this.onImageMouseUp,
191
131
  onContextMenu: this.handleRightClickImage,
192
132
  onDragStart: e => e.preventDefault(),
193
133
  onLoad: this.handleLoad,
@@ -205,9 +145,9 @@ PreviewImage.propTypes = {
205
145
  src: _propTypes.default.string,
206
146
  rotation: _propTypes.default.number,
207
147
  style: _propTypes.default.object,
208
- maxZoom: _propTypes.default.number,
209
- minZoom: _propTypes.default.number,
210
- zoomStep: _propTypes.default.number,
148
+ // maxZoom: PropTypes.number,
149
+ // minZoom: PropTypes.number,
150
+ // zoomStep: PropTypes.number,
211
151
  zoom: _propTypes.default.number,
212
152
  ratio: _propTypes.default.string,
213
153
  disableDownload: _propTypes.default.bool,
@@ -218,8 +158,8 @@ PreviewImage.propTypes = {
218
158
  onError: _propTypes.default.func
219
159
  };
220
160
  PreviewImage.defaultProps = {
221
- maxZoom: 5,
222
- minZoom: 0.1,
223
- zoomStep: 0.1,
161
+ // maxZoom: 5,
162
+ // minZoom: 0.1,
163
+ // zoomStep: 0.1,
224
164
  zoom: undefined
225
165
  };
@@ -33,6 +33,8 @@ export default class PreviewInner extends BaseComponent<PreviewInnerProps, Previ
33
33
  disableDownload: PropTypes.Requireable<boolean>;
34
34
  viewerVisibleDelay: PropTypes.Requireable<number>;
35
35
  zIndex: PropTypes.Requireable<number>;
36
+ maxZoom: PropTypes.Requireable<number>;
37
+ minZoom: PropTypes.Requireable<number>;
36
38
  renderHeader: PropTypes.Requireable<(...args: any[]) => any>;
37
39
  renderPreviewMenu: PropTypes.Requireable<(...args: any[]) => any>;
38
40
  getPopupContainer: PropTypes.Requireable<(...args: any[]) => any>;
@@ -58,14 +60,20 @@ export default class PreviewInner extends BaseComponent<PreviewInnerProps, Previ
58
60
  zIndex: number;
59
61
  maskClosable: boolean;
60
62
  viewerVisibleDelay: number;
63
+ maxZoom: number;
64
+ minZoom: number;
61
65
  };
62
66
  private bodyOverflow;
63
67
  private scrollBarWidth;
64
68
  private originBodyWidth;
65
69
  get adapter(): PreviewInnerAdapter<PreviewInnerProps, PreviewInnerStates>;
66
- timer: any;
67
70
  context: PreviewContextProps;
68
71
  foundation: PreviewInnerFoundation;
72
+ imageWrapRef: React.RefObject<HTMLDivElement>;
73
+ headerRef: React.RefObject<HTMLElement>;
74
+ footerRef: React.RefObject<HTMLElement>;
75
+ leftIconRef: React.RefObject<HTMLDivElement>;
76
+ rightIconRef: React.RefObject<HTMLDivElement>;
69
77
  constructor(props: PreviewInnerProps);
70
78
  static getDerivedStateFromProps(props: PreviewInnerProps, state: PreviewInnerStates): Partial<PreviewInnerStates>;
71
79
  componentDidMount(): void;
@@ -81,10 +89,11 @@ export default class PreviewInner extends BaseComponent<PreviewInnerProps, Previ
81
89
  handleZoomImage: (newZoom: number) => void;
82
90
  handleMouseUp: (e: any) => void;
83
91
  handleMouseMove: (e: any) => void;
84
- handleMouseEvent: (e: any, event: string) => void;
85
92
  handleKeyDown: (e: KeyboardEvent) => void;
86
93
  onImageError: () => void;
87
94
  onImageLoad: (src: any) => void;
88
95
  handleMouseDown: (e: any) => void;
96
+ handleWheel: (e: any) => void;
97
+ registryImageWrapRef: (ref: any) => void;
89
98
  render(): JSX.Element;
90
99
  }
@@ -21,14 +21,6 @@ var _previewContext = require("./previewContext");
21
21
  var _utils = require("../_utils");
22
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
23
  const prefixCls = _constants.cssClasses.PREFIX;
24
- let startMouseDown = {
25
- x: 0,
26
- y: 0
27
- };
28
- let mouseActiveTime = null;
29
- let stopTiming = false;
30
- let timer = null;
31
- // let bodyOverflowValue = document.body.style.overflow;
32
24
  class PreviewInner extends _baseComponent.default {
33
25
  get adapter() {
34
26
  return Object.assign(Object.assign({}, super.adapter), {
@@ -112,30 +104,22 @@ class PreviewInner extends _baseComponent.default {
112
104
  unregisterKeyDownListener: () => {
113
105
  window && window.removeEventListener("keydown", this.handleKeyDown);
114
106
  },
115
- getMouseActiveTime: () => {
116
- return mouseActiveTime;
117
- },
118
- getStopTiming: () => {
119
- return stopTiming;
120
- },
121
- setStopTiming: value => {
122
- stopTiming = value;
123
- },
124
- getStartMouseDown: () => {
125
- return startMouseDown;
126
- },
127
- setStartMouseDown: (x, y) => {
128
- startMouseDown = {
129
- x,
130
- y
131
- };
132
- },
133
- setMouseActiveTime: time => {
134
- mouseActiveTime = time;
135
- },
136
107
  getSetDownloadFunc: () => {
137
108
  var _a, _b;
138
109
  return (_b = (_a = this.context) === null || _a === void 0 ? void 0 : _a.setDownloadName) !== null && _b !== void 0 ? _b : this.props.setDownloadName;
110
+ },
111
+ isValidTarget: e => {
112
+ const headerDom = this.headerRef && this.headerRef.current;
113
+ const footerDom = this.footerRef && this.footerRef.current;
114
+ const leftIconDom = this.leftIconRef && this.leftIconRef.current;
115
+ const rightIconDom = this.rightIconRef && this.rightIconRef.current;
116
+ const target = e.target;
117
+ if (headerDom && headerDom.contains(target) || footerDom && footerDom.contains(target) || leftIconDom && leftIconDom.contains(target) || rightIconDom && rightIconDom.contains(target)) {
118
+ // Move in the operation area, return false
119
+ return false;
120
+ }
121
+ // Move in the preview area except the operation area, return true
122
+ return true;
139
123
  }
140
124
  });
141
125
  }
@@ -168,9 +152,6 @@ class PreviewInner extends _baseComponent.default {
168
152
  this.handleMouseMove = e => {
169
153
  this.foundation.handleMouseMove(e);
170
154
  };
171
- this.handleMouseEvent = (e, event) => {
172
- this.foundation.handleMouseMoveEvent(e, event);
173
- };
174
155
  this.handleKeyDown = e => {
175
156
  this.foundation.handleKeyDown(e);
176
157
  };
@@ -183,6 +164,31 @@ class PreviewInner extends _baseComponent.default {
183
164
  this.handleMouseDown = e => {
184
165
  this.foundation.handleMouseDown(e);
185
166
  };
167
+ this.handleWheel = e => {
168
+ this.foundation.handleWheel(e);
169
+ };
170
+ // 为什么通过 addEventListener 注册 wheel 事件而不是使用 onWheel 事件?
171
+ // 因为 Passive Event Listeners(https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#improving_scrolling_performance_with_passive_listeners)
172
+ // Passive Event Listeners 是一种优化技术,用于提高滚动性能。在默认情况下,浏览器会假设事件的监听器不会调用
173
+ // preventDefault() 方法来阻止事件的默认行为,从而允许进行一些优化操作,例如滚动平滑。
174
+ // 对于 Image 而言,如果使用触控板,双指朝不同方向分开放大图片,则需要 preventDefault 防止页面整体放大。
175
+ // Why register wheel event through addEventListener instead of using onWheel event?
176
+ // Because of Passive Event Listeners(an optimization technique used to improve scrolling performance. By default,
177
+ // the browser will assume that event listeners will not call preventDefault() method to prevent the default behavior of the event,
178
+ // allowing some optimization operations such as scroll smoothing.)
179
+ // For Image, if we use the trackpad and spread your fingers in different directions to enlarge the image, we need to preventDefault
180
+ // to prevent the page from being enlarged as a whole.
181
+ this.registryImageWrapRef = ref => {
182
+ if (this.imageWrapRef) {
183
+ this.imageWrapRef.removeEventListener("wheel", this.handleWheel);
184
+ }
185
+ if (ref) {
186
+ ref.addEventListener("wheel", this.handleWheel, {
187
+ passive: false
188
+ });
189
+ }
190
+ this.imageWrapRef = ref;
191
+ };
186
192
  this.state = {
187
193
  imgSrc: [],
188
194
  imgLoadStatus: new Map(),
@@ -199,6 +205,11 @@ class PreviewInner extends _baseComponent.default {
199
205
  this.bodyOverflow = '';
200
206
  this.originBodyWidth = '100%';
201
207
  this.scrollBarWidth = 0;
208
+ this.imageWrapRef = null;
209
+ this.headerRef = /*#__PURE__*/_react.default.createRef();
210
+ this.footerRef = /*#__PURE__*/_react.default.createRef();
211
+ this.leftIconRef = /*#__PURE__*/_react.default.createRef();
212
+ this.rightIconRef = /*#__PURE__*/_react.default.createRef();
202
213
  }
203
214
  static getDerivedStateFromProps(props, state) {
204
215
  const willUpdateStates = {};
@@ -214,6 +225,9 @@ class PreviewInner extends _baseComponent.default {
214
225
  willUpdateStates.visible = props.visible;
215
226
  if (props.visible) {
216
227
  willUpdateStates.preloadAfterVisibleChange = true;
228
+ willUpdateStates.viewerVisible = true;
229
+ willUpdateStates.rotation = 0;
230
+ willUpdateStates.ratio = 'adaptation';
217
231
  }
218
232
  }
219
233
  if ("currentIndex" in props && props.currentIndex !== state.currentIndex) {
@@ -232,10 +246,8 @@ class PreviewInner extends _baseComponent.default {
232
246
  }
233
247
  }
234
248
  componentDidUpdate(prevProps, prevState) {
235
- if (prevState.visible !== this.props.visible && this.props.visible) {
236
- mouseActiveTime = new Date().getTime();
237
- timer && clearInterval(timer);
238
- timer = setInterval(this.viewVisibleChange, 1000);
249
+ if (prevProps.src !== this.props.src) {
250
+ this.foundation.updateTimer();
239
251
  }
240
252
  // hide => show
241
253
  if (!prevProps.visible && this.props.visible) {
@@ -247,7 +259,7 @@ class PreviewInner extends _baseComponent.default {
247
259
  }
248
260
  }
249
261
  componentWillUnmount() {
250
- timer && clearInterval(timer);
262
+ this.foundation.clearTimer();
251
263
  }
252
264
  isInGroup() {
253
265
  return Boolean(this.context && this.context.isGroup);
@@ -312,10 +324,10 @@ class PreviewInner extends _baseComponent.default {
312
324
  style: style,
313
325
  onMouseDown: this.handleMouseDown,
314
326
  onMouseUp: this.handleMouseUp,
315
- onMouseMove: this.handleMouseMove,
316
- onMouseOver: e => this.handleMouseEvent(e.nativeEvent, "over"),
317
- onMouseOut: e => this.handleMouseEvent(e.nativeEvent, "out")
327
+ ref: this.registryImageWrapRef,
328
+ onMouseMove: this.handleMouseMove
318
329
  }, /*#__PURE__*/_react.default.createElement(_previewHeader.default, {
330
+ ref: this.headerRef,
319
331
  className: (0, _classnames.default)(hideViewerCls),
320
332
  onClose: this.handlePreviewClose,
321
333
  renderHeader: renderHeader
@@ -326,7 +338,6 @@ class PreviewInner extends _baseComponent.default {
326
338
  setRatio: this.handleAdjustRatio,
327
339
  zoom: zoom,
328
340
  ratio: ratio,
329
- zoomStep: zoomStep,
330
341
  rotation: rotation,
331
342
  crossOrigin: crossOrigin,
332
343
  onError: this.onImageError,
@@ -335,6 +346,7 @@ class PreviewInner extends _baseComponent.default {
335
346
  /*#__PURE__*/
336
347
  // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions
337
348
  _react.default.createElement("div", {
349
+ ref: this.leftIconRef,
338
350
  className: (0, _classnames.default)(`${previewPrefixCls}-icon`, `${previewPrefixCls}-prev`, hideViewerCls),
339
351
  onClick: () => this.handleSwitchImage("prev")
340
352
  }, /*#__PURE__*/_react.default.createElement(_semiIcons.IconArrowLeft, {
@@ -343,11 +355,13 @@ class PreviewInner extends _baseComponent.default {
343
355
  /*#__PURE__*/
344
356
  // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions
345
357
  _react.default.createElement("div", {
358
+ ref: this.rightIconRef,
346
359
  className: (0, _classnames.default)(`${previewPrefixCls}-icon`, `${previewPrefixCls}-next`, hideViewerCls),
347
360
  onClick: () => this.handleSwitchImage("next")
348
361
  }, /*#__PURE__*/_react.default.createElement(_semiIcons.IconArrowRight, {
349
362
  size: "large"
350
363
  })), /*#__PURE__*/_react.default.createElement(_previewFooter.default, {
364
+ forwardRef: this.footerRef,
351
365
  className: hideViewerCls,
352
366
  totalNum: total,
353
367
  curPage: currentIndex + 1,
@@ -406,6 +420,8 @@ PreviewInner.propTypes = {
406
420
  disableDownload: _propTypes.default.bool,
407
421
  viewerVisibleDelay: _propTypes.default.number,
408
422
  zIndex: _propTypes.default.number,
423
+ maxZoom: _propTypes.default.number,
424
+ minZoom: _propTypes.default.number,
409
425
  renderHeader: _propTypes.default.func,
410
426
  renderPreviewMenu: _propTypes.default.func,
411
427
  getPopupContainer: _propTypes.default.func,
@@ -430,5 +446,7 @@ PreviewInner.defaultProps = {
430
446
  preLoadGap: 2,
431
447
  zIndex: 1000,
432
448
  maskClosable: true,
433
- viewerVisibleDelay: 10000
449
+ viewerVisibleDelay: 10000,
450
+ maxZoom: 5,
451
+ minZoom: 0.1
434
452
  };
@@ -1,4 +1,6 @@
1
1
  import './_base/base.css';
2
+ export { default as BaseFoundation } from '@douyinfe/semi-foundation/lib/cjs/base/foundation';
3
+ export { default as BaseComponent } from "./_base/baseComponent";
2
4
  export { default as Anchor } from './anchor';
3
5
  export { default as AutoComplete } from './autoComplete';
4
6
  export { default as Avatar } from './avatar';
package/lib/cjs/index.js CHANGED
@@ -51,6 +51,18 @@ Object.defineProperty(exports, "Banner", {
51
51
  return _banner.default;
52
52
  }
53
53
  });
54
+ Object.defineProperty(exports, "BaseComponent", {
55
+ enumerable: true,
56
+ get: function () {
57
+ return _baseComponent.default;
58
+ }
59
+ });
60
+ Object.defineProperty(exports, "BaseFoundation", {
61
+ enumerable: true,
62
+ get: function () {
63
+ return _foundation.default;
64
+ }
65
+ });
54
66
  Object.defineProperty(exports, "Breadcrumb", {
55
67
  enumerable: true,
56
68
  get: function () {
@@ -562,6 +574,8 @@ Object.defineProperty(exports, "withFormState", {
562
574
  }
563
575
  });
564
576
  require("./_base/base.css");
577
+ var _foundation = _interopRequireDefault(require("@douyinfe/semi-foundation/lib/cjs/base/foundation"));
578
+ var _baseComponent = _interopRequireDefault(require("./_base/baseComponent"));
565
579
  var _anchor = _interopRequireDefault(require("./anchor"));
566
580
  var _autoComplete = _interopRequireDefault(require("./autoComplete"));
567
581
  var _avatar = _interopRequireDefault(require("./avatar"));