diff --git a/jest.config.js b/jest.config.js index 0a096396..2778c10e 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,4 +1,5 @@ module.exports = { setupFiles: ["./tests/setup.js"], + setupFilesAfterEnv: ["./tests/setupFilesAfterEnv.ts"], snapshotSerializers: [require.resolve("enzyme-to-json/serializer")], }; diff --git a/package.json b/package.json index a0dea423..42b6ce0e 100644 --- a/package.json +++ b/package.json @@ -47,11 +47,14 @@ }, "dependencies": { "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", "classnames": "^2.2.6", "rc-motion": "^2.3.0", "rc-util": "^5.21.0" }, "devDependencies": { + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^12.0.0", "@types/enzyme": "^3.10.7", "@types/jest": "^26.0.14", "@types/react": "^16.9.2", diff --git a/src/Dialog/Content/Panel.tsx b/src/Dialog/Content/Panel.tsx index 53004f23..8b35b590 100644 --- a/src/Dialog/Content/Panel.tsx +++ b/src/Dialog/Content/Panel.tsx @@ -1,11 +1,11 @@ import React, { useRef } from 'react'; import classNames from 'classnames'; -import type { IDialogChildProps } from '..'; import MemoChildren from './MemoChildren'; +import type { IDialogPropTypes } from '../../IDialogPropTypes'; const sentinelStyle = { width: 0, height: 0, overflow: 'hidden', outline: 'none' }; -export interface PanelProps extends Omit { +export interface PanelProps extends Omit { prefixCls: string; ariaId?: string; onMouseDown?: React.MouseEventHandler; diff --git a/src/Dialog/index.tsx b/src/Dialog/index.tsx index 7a24e3c9..eb769d8f 100644 --- a/src/Dialog/index.tsx +++ b/src/Dialog/index.tsx @@ -5,28 +5,20 @@ import KeyCode from 'rc-util/lib/KeyCode'; import useId from 'rc-util/lib/hooks/useId'; import contains from 'rc-util/lib/Dom/contains'; import pickAttrs from 'rc-util/lib/pickAttrs'; -import type ScollLocker from 'rc-util/lib/Dom/scrollLocker'; import type { IDialogPropTypes } from '../IDialogPropTypes'; import Mask from './Mask'; import { getMotionName } from '../util'; import Content from './Content'; import type { ContentRef } from './Content/Panel'; -export type IDialogChildProps = { - // zombieJ: This should be handle on top instead of each Dialog. - // TODO: refactor to remove this. - getOpenCount: () => number; - scrollLocker?: ScollLocker; -} & IDialogPropTypes; - -export default function Dialog(props: IDialogChildProps) { +export default function Dialog(props: IDialogPropTypes) { const { prefixCls = 'rc-dialog', zIndex, visible = false, keyboard = true, focusTriggerAfterClose = true, - scrollLocker, + // scrollLocker, // Wrapper wrapStyle, @@ -151,13 +143,13 @@ export default function Dialog(props: IDialogChildProps) { [], ); - useEffect(() => { - if (animatedVisible) { - scrollLocker?.lock(); - return scrollLocker?.unLock; - } - return () => {}; - }, [animatedVisible, scrollLocker]); + // useEffect(() => { + // if (animatedVisible) { + // scrollLocker?.lock(); + // return scrollLocker?.unLock; + // } + // return () => {}; + // }, [animatedVisible, scrollLocker]); // ========================= Render ========================= return ( diff --git a/src/DialogWrap.tsx b/src/DialogWrap.tsx index 683354d6..344a9631 100644 --- a/src/DialogWrap.tsx +++ b/src/DialogWrap.tsx @@ -1,6 +1,5 @@ import * as React from 'react'; -import Portal from 'rc-util/lib/PortalWrapper'; -import type { IDialogChildProps } from './Dialog'; +import Portal from '@rc-component/portal'; import Dialog from './Dialog'; import type { IDialogPropTypes } from './IDialogPropTypes'; @@ -23,15 +22,15 @@ const DialogWrap: React.FC = (props: IDialogPropTypes) => { } }, [visible]); - // 渲染在当前 dom 里; - if (getContainer === false) { - return ( - 2} // 不对 body 做任何操作。。 - /> - ); - } + // // 渲染在当前 dom 里; + // if (getContainer === false) { + // return ( + // 2} // 不对 body 做任何操作。。 + // /> + // ); + // } // Destroy on close will remove wrapped div if (!forceRender && destroyOnClose && !animatedVisible) { @@ -39,18 +38,20 @@ const DialogWrap: React.FC = (props: IDialogPropTypes) => { } return ( - - {(childProps: IDialogChildProps) => ( - { - afterClose?.(); - setAnimatedVisible(false); - }} - {...childProps} - /> - )} + + { + afterClose?.(); + setAnimatedVisible(false); + }} + /> ); }; diff --git a/tests/index.spec.tsx b/tests/index.spec.tsx index c4dd0099..e650f06b 100644 --- a/tests/index.spec.tsx +++ b/tests/index.spec.tsx @@ -1,9 +1,9 @@ /* eslint-disable react/no-render-return-value, max-classes-per-file, func-names, no-console */ import React, { cloneElement } from 'react'; import { act } from 'react-dom/test-utils'; +import { render } from '@testing-library/react'; import type { ReactWrapper } from 'enzyme'; import { mount } from 'enzyme'; -import Portal from 'rc-util/lib/Portal'; import KeyCode from 'rc-util/lib/KeyCode'; import type { DialogProps } from '../src'; import Dialog from '../src'; @@ -295,23 +295,24 @@ describe('dialog', () => { describe('getContainer is false', () => { it('not set', () => { - const wrapper = mount( + const { container } = render( -
forceRender element
+
, ); - expect(wrapper.find('.rc-dialog-body > div').text()).toEqual('forceRender element'); - expect(wrapper.find(Portal)).toHaveLength(1); + + expect(container.querySelector('.bamboo')).toBeFalsy(); + expect(document.body.querySelector('.bamboo')).toBeTruthy(); }); it('set to false', () => { - const wrapper = mount( + const { container } = render( -
forceRender element
+
, ); - expect(wrapper.find('.rc-dialog-body > div').text()).toEqual('forceRender element'); - expect(wrapper.find(Portal)).toHaveLength(0); + + expect(container.querySelector('.bamboo')).toBeTruthy(); }); }); diff --git a/tests/scroll.spec.tsx b/tests/scroll.spec.tsx index 85054fd3..6f4a3aa0 100644 --- a/tests/scroll.spec.tsx +++ b/tests/scroll.spec.tsx @@ -1,6 +1,6 @@ /* eslint-disable react/no-render-return-value, max-classes-per-file, func-names, no-console */ import React from 'react'; -import { mount } from 'enzyme'; +import { render } from '@testing-library/react'; import Dialog from '../src'; /** @@ -17,25 +17,22 @@ describe('Dialog.Scroll', () => { }); it('Single Dialog body overflow set correctly', () => { - const wrapper = mount(, { attachTo: document.body }); - document.body.style.overflow = 'scroll'; + const { unmount, rerender } = render(); - wrapper.setProps({ visible: true }); - jest.runAllTimers(); - wrapper.update(); - expect(document.body.style.overflow).toBe('hidden'); + expect(document.body).toHaveStyle({ + overflowY: 'hidden', + }); - wrapper.setProps({ visible: false }); - jest.runAllTimers(); - wrapper.update(); - expect(document.body.style.overflow).toBe('scroll'); + rerender(); + expect(document.body).not.toHaveStyle({ + overflowY: 'hidden', + }); - wrapper.unmount(); + // wrapper.unmount(); + unmount(); }); it('Multiple Dialog body overflow set correctly', () => { - document.body.style.overflow = 'scroll'; - const Demo = ({ visible = false, visible2 = false, ...restProps }) => (
@@ -43,49 +40,42 @@ describe('Dialog.Scroll', () => {
); - const wrapper = mount(, { attachTo: document.body }); - - expect(wrapper.find('.rc-dialog').length).toBe(0); - - wrapper.setProps({ visible: true }); - jest.runAllTimers(); + const { rerender, unmount } = render(); - expect(wrapper.find('div.rc-dialog').length).toBe(1); - expect(document.body.style.overflow).toBe('hidden'); + expect(document.querySelector('.rc-dialog')).toBeFalsy(); - wrapper.setProps({ visible2: true }); - jest.runAllTimers(); - - expect(wrapper.find('div.rc-dialog').length).toBe(2); - expect(document.body.style.overflow).toBe('hidden'); + rerender(); + expect(document.querySelectorAll('.rc-dialog')).toHaveLength(1); + expect(document.body).toHaveStyle({ + overflowY: 'hidden', + }); - wrapper.setProps({ - visible: false, - visible2: false, + rerender(); + expect(document.querySelectorAll('.rc-dialog')).toHaveLength(2); + expect(document.body).toHaveStyle({ + overflowY: 'hidden', }); - jest.runAllTimers(); - expect(document.body.style.overflow).toBe('scroll'); + rerender(); + expect(document.body).not.toHaveStyle({ + overflowY: 'hidden', + }); - wrapper.setProps({ - visible: true, + rerender(); + expect(document.body).toHaveStyle({ + overflowY: 'hidden', }); - jest.runAllTimers(); - expect(document.body.style.overflow).toBe('hidden'); - wrapper.setProps({ - visible: false, - visible2: true, + rerender(); + expect(document.body).toHaveStyle({ + overflowY: 'hidden', }); - jest.runAllTimers(); - expect(document.body.style.overflow).toBe('hidden'); - wrapper.setProps({ - visible: false, - visible2: false, + rerender(); + expect(document.body).not.toHaveStyle({ + overflowY: 'hidden', }); - jest.runAllTimers(); - expect(document.body.style.overflow).toBe('scroll'); - wrapper.unmount(); + + unmount(); }); }); diff --git a/tests/setupFilesAfterEnv.ts b/tests/setupFilesAfterEnv.ts new file mode 100644 index 00000000..7b0828bf --- /dev/null +++ b/tests/setupFilesAfterEnv.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom';