Skip to content

Commit f6ffd6b

Browse files
authored
[codex] support preview mask closable (#506)
1 parent 8514cd1 commit f6ffd6b

File tree

3 files changed

+32
-1
lines changed

3 files changed

+32
-1
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export default () => (
6969
| --- | --- | --- | --- |
7070
| open | boolean | - | Whether the preview is open or not |
7171
| closeIcon | React.ReactNode | - | Custom close icon |
72+
| maskClosable | boolean | true | Whether to close preview on clicking mask |
7273
| src | string | - | Customize preview src |
7374
| movable | boolean | true | Enable drag |
7475
| scaleStep | number | 0.5 | The number to which the scale is increased or decreased |
@@ -114,6 +115,7 @@ export default () => (
114115
| movable | boolean | true | Enable drag |
115116
| current | number | - | Current index |
116117
| closeIcon | React.ReactNode | - | Custom close icon |
118+
| maskClosable | boolean | true | Whether to close preview on clicking mask |
117119
| scaleStep | number | 0.5 | The number to which the scale is increased or decreased |
118120
| minScale | number | 1 | Min scale |
119121
| maxScale | number | 50 | Max scale |

src/Preview/index.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ export interface InternalPreviewConfig {
8787
open?: boolean;
8888
getContainer?: PortalProps['getContainer'];
8989
zIndex?: number;
90+
maskClosable?: boolean;
9091
afterOpenChange?: (open: boolean) => void;
9192

9293
// Operation
@@ -174,6 +175,7 @@ const Preview: React.FC<PreviewProps> = props => {
174175
onClose,
175176
open,
176177
afterOpenChange,
178+
maskClosable = true,
177179
icons = {},
178180
closeIcon,
179181
getContainer,
@@ -450,7 +452,7 @@ const Preview: React.FC<PreviewProps> = props => {
450452
<div
451453
className={clsx(`${prefixCls}-mask`, classNames.mask)}
452454
style={styles.mask}
453-
onClick={onClose}
455+
onClick={maskClosable ? onClose : undefined}
454456
/>
455457

456458
{/* Body */}

tests/preview.test.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,33 @@ describe('Preview', () => {
101101
expect(onPreviewCloseMock).toHaveBeenCalledWith(false);
102102
});
103103

104+
it('maskClosable should control mask close behavior only', () => {
105+
const onPreviewOpenChange = jest.fn();
106+
const { container } = render(
107+
<Image
108+
src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
109+
preview={{
110+
maskClosable: false,
111+
onOpenChange: onPreviewOpenChange,
112+
}}
113+
/>,
114+
);
115+
116+
fireEvent.click(container.querySelector('.rc-image'));
117+
act(() => {
118+
jest.runAllTimers();
119+
});
120+
121+
onPreviewOpenChange.mockReset();
122+
123+
fireEvent.click(document.querySelector('.rc-image-preview-mask'));
124+
expect(document.querySelector('.rc-image-preview')).toBeTruthy();
125+
expect(onPreviewOpenChange).not.toHaveBeenCalled();
126+
127+
fireEvent.click(document.querySelector('.rc-image-preview-close'));
128+
expect(onPreviewOpenChange).toHaveBeenCalledWith(false);
129+
});
130+
104131
it('Unmount', () => {
105132
const { container, unmount } = render(
106133
<Image src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png" />,

0 commit comments

Comments
 (0)