Skip to content

Commit 02b5de6

Browse files
authored
feat: support movable (#271)
1 parent 771790a commit 02b5de6

File tree

4 files changed

+30
-17
lines changed

4 files changed

+30
-17
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ export default () => (
8080
| visible | boolean | - | Whether the preview is open or not |
8181
| closeIcon | React.ReactNode | - | Custom close icon |
8282
| src | string | - | Customize preview src |
83+
| movable | boolean | true | Enable drag |
8384
| scaleStep | number | 0.5 | The number to which the scale is increased or decreased |
8485
| minScale | number | 1 | Min scale |
8586
| maxScale | number | 50 | Max scale |
@@ -120,6 +121,7 @@ export default () => (
120121
| Name | Type | Default | Description |
121122
| --- | --- | --- | --- |
122123
| visible | boolean | - | Whether the preview is open or not |
124+
| movable | boolean | true | Enable drag |
123125
| current | number | - | Current index |
124126
| closeIcon | React.ReactNode | - | Custom close icon |
125127
| scaleStep | number | 0.5 | The number to which the scale is increased or decreased |

src/Image.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export interface ImagePreviewType
3030
maskClassName?: string;
3131
icons?: PreviewProps['icons'];
3232
scaleStep?: number;
33+
movable?: boolean;
3334
imageRender?: (
3435
originalNode: React.ReactNode,
3536
info: { transform: TransformType },
@@ -96,6 +97,7 @@ const ImageInternal: CompoundedComponent<ImageProps> = props => {
9697
getContainer: getPreviewContainer = undefined,
9798
mask: previewMask,
9899
maskClassName,
100+
movable,
99101
icons,
100102
scaleStep,
101103
minScale,
@@ -234,6 +236,7 @@ const ImageInternal: CompoundedComponent<ImageProps> = props => {
234236
fallback={fallback}
235237
getContainer={getPreviewContainer}
236238
icons={icons}
239+
movable={movable}
237240
scaleStep={scaleStep}
238241
minScale={minScale}
239242
maxScale={maxScale}

src/Preview.tsx

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export interface PreviewProps extends Omit<IDialogPropTypes, 'onClose'> {
4040
src?: string;
4141
alt?: string;
4242
fallback?: string;
43+
movable?: boolean;
4344
rootClassName?: string;
4445
icons?: {
4546
rotateLeft?: React.ReactNode;
@@ -98,6 +99,7 @@ const Preview: React.FC<PreviewProps> = props => {
9899
src,
99100
alt,
100101
fallback,
102+
movable = true,
101103
onClose,
102104
visible,
103105
icons = {},
@@ -229,7 +231,7 @@ const Preview: React.FC<PreviewProps> = props => {
229231

230232
const onMouseDown: React.MouseEventHandler<HTMLDivElement> = event => {
231233
// Only allow main button
232-
if (event.button !== 0) return;
234+
if (!movable || event.button !== 0) return;
233235
event.preventDefault();
234236
event.stopPropagation();
235237
downPositionRef.current = {
@@ -295,31 +297,35 @@ const Preview: React.FC<PreviewProps> = props => {
295297
useEffect(() => {
296298
let onTopMouseUpListener;
297299
let onTopMouseMoveListener;
298-
299-
const onMouseUpListener = addEventListener(window, 'mouseup', onMouseUp, false);
300-
const onMouseMoveListener = addEventListener(window, 'mousemove', onMouseMove, false);
301-
302-
try {
303-
// Resolve if in iframe lost event
304-
/* istanbul ignore next */
305-
if (window.top !== window.self) {
306-
onTopMouseUpListener = addEventListener(window.top, 'mouseup', onMouseUp, false);
307-
onTopMouseMoveListener = addEventListener(window.top, 'mousemove', onMouseMove, false);
300+
let onMouseUpListener;
301+
let onMouseMoveListener;
302+
303+
if (movable) {
304+
onMouseUpListener = addEventListener(window, 'mouseup', onMouseUp, false);
305+
onMouseMoveListener = addEventListener(window, 'mousemove', onMouseMove, false);
306+
307+
try {
308+
// Resolve if in iframe lost event
309+
/* istanbul ignore next */
310+
if (window.top !== window.self) {
311+
onTopMouseUpListener = addEventListener(window.top, 'mouseup', onMouseUp, false);
312+
onTopMouseMoveListener = addEventListener(window.top, 'mousemove', onMouseMove, false);
313+
}
314+
} catch (error) {
315+
/* istanbul ignore next */
316+
warning(false, `[rc-image] ${error}`);
308317
}
309-
} catch (error) {
310-
/* istanbul ignore next */
311-
warning(false, `[rc-image] ${error}`);
312318
}
313319

314320
return () => {
315-
onMouseUpListener.remove();
316-
onMouseMoveListener.remove();
321+
onMouseUpListener?.remove();
322+
onMouseMoveListener?.remove();
317323
/* istanbul ignore next */
318324
onTopMouseUpListener?.remove();
319325
/* istanbul ignore next */
320326
onTopMouseMoveListener?.remove();
321327
};
322-
}, [visible, isMoving, x, y, rotate]);
328+
}, [visible, isMoving, x, y, rotate, movable]);
323329

324330
useEffect(() => {
325331
const onKeyDownListener = addEventListener(window, 'keydown', onKeyDown, false);

src/PreviewGroup.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ const Group: React.FC<GroupConsumerProps> = ({
5151
onVisibleChange,
5252
getContainer,
5353
current: currentIndex,
54+
movable,
5455
minScale,
5556
maxScale,
5657
countRender,
@@ -133,6 +134,7 @@ const Group: React.FC<GroupConsumerProps> = ({
133134
{children}
134135
<Preview
135136
aria-hidden={!isShowPreview}
137+
movable={movable}
136138
visible={isShowPreview}
137139
prefixCls={previewPrefixCls}
138140
closeIcon={closeIcon}

0 commit comments

Comments
 (0)