diff --git a/.gitignore b/.gitignore index 0497e3e..fe8ecda 100644 --- a/.gitignore +++ b/.gitignore @@ -44,4 +44,5 @@ es/ .dumi/tmp .dumi/tmp-production -bun.lockb \ No newline at end of file +bun.lockb +.vscode \ No newline at end of file diff --git a/assets/preview.less b/assets/preview.less index dc7eff3..e60e906 100644 --- a/assets/preview.less +++ b/assets/preview.less @@ -5,6 +5,7 @@ overflow: hidden; user-select: none; inset: 0; + z-index: 1055; &-mask { position: absolute; diff --git a/docs/demo/nested.md b/docs/demo/nested.md new file mode 100644 index 0000000..cbe3076 --- /dev/null +++ b/docs/demo/nested.md @@ -0,0 +1,8 @@ +--- +title: nested +nav: + title: Demo + path: /demo +--- + + \ No newline at end of file diff --git a/docs/examples/nested.tsx b/docs/examples/nested.tsx new file mode 100644 index 0000000..9b581c1 --- /dev/null +++ b/docs/examples/nested.tsx @@ -0,0 +1,71 @@ +import React, { useState } from 'react'; +import Dialog from '@rc-component/dialog'; +import Image from '@rc-component/image'; +import '@rc-component/dialog/assets/index.css'; +import '../../assets/index.less'; + +const App: React.FC = () => { + const [show, setShow] = useState(false); + return ( + <> + + { + setShow(open); + }} + onClose={() => { + setShow(false); + }} + footer={ + <> + + + + } + > + svg image + + console.log(`current index: ${current}, prev index: ${prev}`), + }} + > + svg image + + + + + ); +}; + +export default App; diff --git a/package.json b/package.json index 7ca72ee..9d98386 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ }, "dependencies": { "@rc-component/motion": "^1.0.0", - "@rc-component/portal": "^2.0.0", + "@rc-component/portal": "^2.1.2", "@rc-component/util": "^1.3.0", "clsx": "^2.1.1" }, @@ -49,6 +49,7 @@ "@ant-design/icons": "^5.0.1", "@rc-component/father-plugin": "^2.0.2", "@rc-component/np": "^1.0.0", + "@rc-component/dialog": "^1.7.0", "@testing-library/jest-dom": "^6.4.0", "@testing-library/react": "^15.0.6", "@types/jest": "^30.0.0", diff --git a/src/Preview/index.tsx b/src/Preview/index.tsx index 2aab1c8..bd4f67c 100644 --- a/src/Preview/index.tsx +++ b/src/Preview/index.tsx @@ -332,10 +332,6 @@ const Preview: React.FC = props => { if (open) { const { keyCode } = event; - if (keyCode === KeyCode.ESC) { - onClose?.(); - } - if (showLeftOrRightSwitches) { if (keyCode === KeyCode.LEFT) { onActive(-1); @@ -380,6 +376,12 @@ const Preview: React.FC = props => { } }, [open]); + const onEsc: PortalProps['onEsc'] = ({ top }) => { + if (top) { + onClose?.(); + } + }; + // ========================== Render ========================== const bodyStyle: React.CSSProperties = { ...styles.body, @@ -389,7 +391,13 @@ const Preview: React.FC = props => { } return ( - + { const MockPreview = (props: any) => { @@ -1052,6 +1053,25 @@ describe('Preview', () => { expect(afterOpenChange).toHaveBeenCalledTimes(2); }); + it('Esc closes preview then modal', () => { + const onClose = jest.fn(); + + const { baseElement, getByRole } = render( + + + , + ); + + fireEvent.click(getByRole('img')); + expect(baseElement.querySelector('.rc-image-preview')).toBeTruthy(); + + fireEvent.keyDown(window, { key: 'Escape' }); + expect(baseElement.querySelector('.rc-image-preview')).toBeFalsy(); + + fireEvent.keyDown(window, { key: 'Escape' }); + expect(onClose).toHaveBeenCalled(); + }); + it('not modify preview image size', () => { render(