Skip to content

Commit

Permalink
feat: support onChange when current change (#141)
Browse files Browse the repository at this point in the history
* feat: support onChange when current change

* feat: support onChange when current change

* feat: optimize code

* feat: styles

* feat: update snapshots
  • Loading branch information
kiner-tang authored Jan 20, 2023
1 parent c403700 commit 38ba334
Showing 4 changed files with 54 additions and 5 deletions.
1 change: 1 addition & 0 deletions docs/examples/previewgroup.tsx
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@ export default function PreviewGroup() {
<Image.PreviewGroup
preview={{
countRender: (current, total) => `第${current}张 / 总共${total}张`,
onChange: (current, prev) => console.log(`当前第${current}张,上一次第${prev === undefined ? '-' : prev}张`)
}}
>
<Image wrapperStyle={{ marginRight: 24, width: 200 }} src={require('./images/1.jpeg')} />
1 change: 1 addition & 0 deletions src/Preview.tsx
Original file line number Diff line number Diff line change
@@ -44,6 +44,7 @@ const Preview: React.FC<PreviewProps> = (props) => {
scaleStep = 0.5,
transitionName = 'zoom',
maskTransitionName = 'fade',
onChange,
...restProps
} = props;

18 changes: 15 additions & 3 deletions src/PreviewGroup.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import useMergedState from 'rc-util/lib/hooks/useMergedState';
import * as React from 'react';
import { useState } from 'react';
import useMergedState from 'rc-util/lib/hooks/useMergedState';
import type { ImagePreviewType } from './Image';
import type { PreviewProps } from './Preview';
import Preview from './Preview';
@@ -13,6 +13,7 @@ export interface PreviewGroupPreview
*/
current?: number;
countRender?: (current: number, total: number) => string;
onChange?: (current: number, prevCurrent: number) => void;
}

export interface GroupConsumerProps {
@@ -65,14 +66,25 @@ const Group: React.FC<GroupConsumerProps> = ({
getContainer = undefined,
current: currentIndex = 0,
countRender = undefined,
onChange = undefined,
...dialogProps
} = typeof preview === 'object' ? preview : {};
const [previewUrls, setPreviewUrls] = useState<Map<number, PreviewUrl>>(new Map());
const [current, setCurrent] = useState<number>();
const prevCurrent = React.useRef<number | undefined>();
const [current, setCurrent] = useMergedState<number>(undefined, {
onChange: (val, prev) => {
onChange?.(val, prev);
prevCurrent.current = prev;
}
});
const [isShowPreview, setShowPreview] = useMergedState(!!previewVisible, {
value: previewVisible,
onChange: onPreviewVisibleChange,
onChange: (val, prevVal) => {
onPreviewVisibleChange?.(val, prevVal);
onChange?.(current, prevCurrent.current);
},
});

const [mousePosition, setMousePosition] = useState<null | { x: number; y: number }>(null);
const isControlled = previewVisible !== undefined;
const previewUrlsKeys = Array.from(previewUrls.keys());
39 changes: 37 additions & 2 deletions tests/previewGroup.test.tsx
Original file line number Diff line number Diff line change
@@ -12,6 +12,40 @@ describe('PreviewGroup', () => {
jest.useRealTimers();
});

it('onChange should be called', () => {
const onChange = jest.fn();
const { container } = render(
<Image.PreviewGroup preview={{ onChange }}>
<Image src="src1" className='firstImg' />
<Image
preview={false}
src="src2"
/>
<Image src="src3" />
<Image src="errorsrc" alt="error" />
</Image.PreviewGroup>,
);

fireEvent.click(container.querySelector('.firstImg'));
act(() => {
jest.runAllTimers();
});
expect(onChange).toHaveBeenCalledWith(1, undefined);

fireEvent.click(document.querySelector('.rc-image-preview-switch-right'));
act(() => {
jest.runAllTimers();
});
expect(onChange).toHaveBeenCalledWith(3, 1);

fireEvent.click(document.querySelector('.rc-image-preview-switch-right'));
act(() => {
jest.runAllTimers();
});
expect(onChange).toHaveBeenCalledWith(4, 3);

});

it('Mount and UnMount', () => {
const { container, unmount } = render(
<Image.PreviewGroup>
@@ -160,11 +194,12 @@ describe('PreviewGroup', () => {
});

it('should show error img', () => {
const { rerender } = render(
render(
<Image.PreviewGroup preview={{ visible: true }}>
<Image src="errorsrc" />
</Image.PreviewGroup>,
);
expect(document.querySelector('.rc-image-preview-img')).toHaveAttribute('src', 'errorsrc');
})
});

});

1 comment on commit 38ba334

@vercel
Copy link

@vercel vercel bot commented on 38ba334 Jan 20, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.