Skip to content

Commit befefe2

Browse files
authored
feat: support reset action in toolbarRender (#345)
* feat: support reset action in toolbarRender * feat: support reset action in toolbarRender * feat: support reset action in toolbarRender * feat: support reset action in toolbarRender * feat: support reset action in toolbarRender * feat: support reset action in toolbarRender
1 parent 4c9bdbd commit befefe2

File tree

6 files changed

+65
-16
lines changed

6 files changed

+65
-16
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,8 @@ type TransformAction =
186186
onRotateRight: () => void;
187187
onZoomOut: () => void;
188188
onZoomIn: () => void;
189+
onClose: () => void;
190+
onReset: () => void;
189191
};
190192
transform: {
191193
x: number;

docs/examples/toolbarRender.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,23 @@ export default function ToolbarRender() {
2222
onZoomIn,
2323
onZoomOut,
2424
onClose,
25+
onReset,
2526
},
2627
},
2728
) => {
2829
return (
2930
<div
30-
style={{ position: 'fixed', display: 'flex', bottom: 0, width: '100%', gap: 10 }}
31+
style={{ position: 'fixed', display: 'flex', bottom: 100, width: '100%', gap: 10, justifyContent: 'center' }}
3132
>
32-
<div onClick={onFlipY}>flipY</div>
33-
<div onClick={onFlipX}>flipX</div>
34-
<div onClick={onRotateLeft}>rotateLeft</div>
35-
<div onClick={onRotateRight}>rotateRight</div>
36-
<div onClick={onZoomIn}>zoomIn</div>
37-
<div onClick={onZoomOut}>zoomOut</div>
38-
<div onClick={onClose}>close</div>
33+
<button onClick={onFlipY}>flipY</button>
34+
<button onClick={onFlipX}>flipX</button>
35+
<button onClick={onRotateLeft}>rotateLeft</button>
36+
<button onClick={onRotateRight}>rotateRight</button>
37+
<button onClick={onZoomIn}>zoomIn</button>
38+
<button onClick={onZoomOut}>zoomOut</button>
39+
<button onClick={() => onReset()}>reset</button>
40+
<button onClick={onClose}>close</button>
41+
3942
</div>
4043
);
4144
},

src/Operations.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ interface OperationsProps
3838
onRotateLeft: () => void;
3939
onFlipX: () => void;
4040
onFlipY: () => void;
41+
onReset: () => void;
4142
toolbarRender: (
4243
originalNode: React.ReactElement,
4344
info: ToolbarRenderInfoType | Omit<ToolbarRenderInfoType, 'current' | 'total'>,
@@ -73,6 +74,7 @@ const Operations: React.FC<OperationsProps> = props => {
7374
onRotateLeft,
7475
onFlipX,
7576
onFlipY,
77+
onReset,
7678
toolbarRender,
7779
zIndex,
7880
image,
@@ -209,6 +211,8 @@ const Operations: React.FC<OperationsProps> = props => {
209211
onRotateRight,
210212
onZoomOut,
211213
onZoomIn,
214+
onReset,
215+
onClose
212216
},
213217
transform,
214218
...(groupContext ? { current, total: count } : {}),

src/Preview.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ import Dialog from 'rc-dialog';
44
import addEventListener from 'rc-util/lib/Dom/addEventListener';
55
import KeyCode from 'rc-util/lib/KeyCode';
66
import React, { useContext, useEffect, useRef, useState } from 'react';
7-
import type { ImgInfo } from './Image';
8-
import Operations from './Operations';
97
import { PreviewGroupContext } from './context';
108
import type { TransformAction, TransformType } from './hooks/useImageTransform';
119
import useImageTransform from './hooks/useImageTransform';
1210
import useMouseEvent from './hooks/useMouseEvent';
1311
import useStatus from './hooks/useStatus';
1412
import useTouchEvent from './hooks/useTouchEvent';
13+
import type { ImgInfo } from './Image';
14+
import Operations from './Operations';
1515
import { BASE_SCALE_RATIO } from './previewConfig';
1616

1717
export type ToolbarRenderInfoType = {
@@ -30,6 +30,8 @@ export type ToolbarRenderInfoType = {
3030
onRotateRight: () => void;
3131
onZoomOut: () => void;
3232
onZoomIn: () => void;
33+
onClose: () => void;
34+
onReset: () => void;
3335
};
3436
transform: TransformType;
3537
current: number;
@@ -200,6 +202,10 @@ const Preview: React.FC<PreviewProps> = props => {
200202
updateTransform({ flipY: !transform.flipY }, 'flipY');
201203
};
202204

205+
const onReset = () => {
206+
resetTransform("reset");
207+
};
208+
203209
const onSwitchLeft = (event?: React.MouseEvent<HTMLDivElement, MouseEvent>) => {
204210
event?.preventDefault();
205211
event?.stopPropagation();
@@ -337,6 +343,7 @@ const Preview: React.FC<PreviewProps> = props => {
337343
onFlipX={onFlipX}
338344
onFlipY={onFlipY}
339345
onClose={onClose}
346+
onReset={onReset}
340347
zIndex={restProps.zIndex !== undefined ? restProps.zIndex + 1 : undefined}
341348
image={image}
342349
/>

src/hooks/useImageTransform.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ export type TransformAction =
2626
| 'doubleClick'
2727
| 'move'
2828
| 'dragRebound'
29-
| 'touchZoom';
29+
| 'touchZoom'
30+
| 'reset';
3031

3132
export type UpdateTransformFunc = (
3233
newTransform: Partial<TransformType>,
@@ -62,7 +63,6 @@ export default function useImageTransform(
6263

6364
const resetTransform = (action: TransformAction) => {
6465
setTransform(initialTransform);
65-
console.log('resetTransform', initialTransform, transform);
6666
if (!isEqual(initialTransform, transform)) {
6767
onTransform?.({ transform: initialTransform, action });
6868
}

tests/preview.test.tsx

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -792,12 +792,17 @@ describe('Preview', () => {
792792
width={200}
793793
height={200}
794794
preview={{
795-
toolbarRender: (_, { icons, image }) => {
795+
toolbarRender: (_, { icons, image, actions }) => {
796796
printImage(image);
797797
return (
798798
<>
799-
{icons.flipYIcon}
800-
{icons.flipXIcon}
799+
<div id="flipY" onClick={() => actions.onFlipY()}>{icons.flipYIcon}</div>
800+
<div id="flipX" onClick={() => actions.onFlipX()}>{icons.flipXIcon}</div>
801+
<div id="zoomIn" onClick={() => actions.onZoomIn()}>{icons.zoomInIcon}</div>
802+
<div id="zoomOut" onClick={() => actions.onZoomOut()}>{icons.zoomOutIcon}</div>
803+
<div id="rotateLeft" onClick={() => actions.onRotateLeft()}>{icons.rotateLeftIcon}</div>
804+
<div id="rotateRight" onClick={() => actions.onRotateRight()}>{icons.rotateRightIcon}</div>
805+
<div id="reset" onClick={() => actions.onReset()}>reset</div>
801806
</>
802807
);
803808
},
@@ -810,13 +815,41 @@ describe('Preview', () => {
810815
jest.runAllTimers();
811816
});
812817

813-
expect(document.querySelectorAll('.rc-image-preview-operations-operation')).toHaveLength(2);
814818
expect(printImage).toHaveBeenCalledWith({
815819
alt: 'alt',
816820
height: 200,
817821
url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
818822
width: 200,
819823
});
824+
// flipY
825+
fireEvent.click(document.getElementById('flipY'));
826+
act(() => {
827+
jest.runAllTimers();
828+
});
829+
fireEvent.click(document.getElementById('flipX'));
830+
act(() => {
831+
jest.runAllTimers();
832+
});
833+
fireEvent.click(document.getElementById('zoomIn'));
834+
act(() => {
835+
jest.runAllTimers();
836+
});
837+
fireEvent.click(document.getElementById('rotateLeft'));
838+
act(() => {
839+
jest.runAllTimers();
840+
});
841+
expect(document.querySelector('.rc-image-preview-img')).toHaveStyle({
842+
transform: 'translate3d(-206px, -142px, 0) scale3d(-1.5, -1.5, 1) rotate(-90deg)',
843+
});
844+
845+
// reset
846+
fireEvent.click(document.getElementById('reset'));
847+
act(() => {
848+
jest.runAllTimers();
849+
});
850+
expect(document.querySelector('.rc-image-preview-img')).toHaveStyle({
851+
transform: 'translate3d(0px, 0px, 0) scale3d(1, 1, 1) rotate(0deg)',
852+
});
820853
});
821854

822855
it('onTransform should be triggered when transform change', () => {

0 commit comments

Comments
 (0)