import React, { useState, memo } from 'react'; import ReactDom from 'react-dom'; import { Wrapper, ModalWrap, FooterWrap, Title, Close } from './style'; import Button from '../button'; import { useSpring } from 'react-spring'; import { IModal } from './types'; import { useKeyDown, usePrevious } from 'utils/hooks'; import { mountContainer } from 'utils'; const mount = mountContainer('kwaiModalMount'); export const Modal = function({ visible, onCancel, onOk, title, footer = ( <> ), footerAlign, children, width = 448, style: propStyle, ...rest }: IModal) { const [delayVisible, setDelayVisible] = useState(false); //useLockBodyScroll(visible || delayVisible); const esc = useKeyDown('Escape'); const stamp = usePrevious(+new Date()); if (esc && visible && onCancel && +new Date() - 10 > stamp!) { onCancel(); } const wrapStyle = useSpring({ opacity: visible ? 1 : 0, config: { mass: 5, friction: 180, tension: 3000, clamp: true }, }); const style = useSpring({ opacity: visible ? 1 : 0, transform: `translate3d(0, -${visible ? 0 : 15}%, 0)`, onRest: (item: any) => { setDelayVisible(!!item.opacity); }, config: { mass: 5, friction: 180, tension: 3000, clamp: true }, }); const modal = ( e.stopPropagation()} width={width} style={{ ...propStyle, ...style }} className="modal-body" > {title && {title}} {children} {footer} ); return ReactDom.createPortal(modal, mount); }; Modal.defaultProps = { footerAlign: 'right', }; export default memo(Modal);