import React, { useCallback, useState, useEffect } from 'react'; import ReactDOM from 'react-dom'; import { CSSTransition } from 'react-transition-group'; import cx from 'classnames'; import DialogWrap, { DialogWrapProps } from './Wrap'; import DialogContent, { DialogContentProps } from './Content'; import bem from '../utils/bem'; import { isBrowser, noop } from '../utils/vars'; const b = bem('rdf-dialog'); export interface DialogProps extends Omit, Omit { visible?: boolean; mask?: boolean; onVisibleChange?: (visible: boolean) => void; onExited?: () => void; className?: string; style?: React.CSSProperties; contentClassName?: string; contentStyle?: React.CSSProperties; } export const Dialog: React.FC & { dialogRoot?: HTMLElement; open: (props: DialogProps) => void; } = props => { if (!isBrowser) { return null; } const { visible, mask, maskClosable, keyClosable, onVisibleChange, onExited, className, style, contentClassName, contentStyle, ...restProps } = props; const handleClose = useCallback(() => { if (onVisibleChange) { onVisibleChange(false); } }, [onVisibleChange]); if (!Dialog.dialogRoot) { Dialog.dialogRoot = document.createElement('div'); Dialog.dialogRoot.id = 'rdf-dialog-root'; document.body.appendChild(Dialog.dialogRoot); } return ReactDOM.createPortal(
{mask &&
}
, Dialog.dialogRoot ); }; Dialog.defaultProps = { visible: false, mask: true, maskClosable: true, keyClosable: true, }; Dialog.open = props => { let close = noop; // create mount node const div = document.createElement('div'); document.body.appendChild(div); const Alone = (props: DialogProps) => { const [visible, setVisible] = useState(true); const handleVisibleChange = useCallback(visible => { setVisible(visible); }, []); const handleExited = useCallback(() => { // trigger unmount ReactDOM.unmountComponentAtNode(div); }, []); useEffect(() => { close = () => setVisible(false); return () => { // clean close = noop; document.body.removeChild(div); }; }, []); return ( ); }; ReactDOM.render(, div); // closure return () => close(); }; export default Dialog;