import React, { PureComponent } from 'react'; import ModalBody from './ModalBody'; import { TransitionGroup, CSSTransition } from 'react-transition-group'; import './index.scss'; export interface IButton { text: string | React.ReactElement; type?: 'default' | 'primary' | 'success' | 'info' | 'warning' | 'danger' | 'link'; disabled?: boolean; onClick?(): void; } interface Props { isOpen?: boolean; title?: string; disableButtons?: boolean; children: any; buttons?: IButton[]; maxWidth?: number; handleClose(): void; } interface ModalStyle { width?: string; maxWidth?: string; } const Fade = ({ ...props }: any) => ( ); export default class Modal extends PureComponent { public modalBody: ModalBody; public componentDidUpdate(prevProps: Props) { if (prevProps.isOpen !== this.props.isOpen) { document.body.classList.toggle('no-scroll', !!this.props.isOpen); } } public componentWillUnmount() { document.body.classList.remove('no-scroll'); } public render() { const { isOpen, title, children, buttons, handleClose, maxWidth } = this.props; const hasButtons = buttons && buttons.length; const modalStyle: ModalStyle = {}; if (maxWidth) { modalStyle.width = '100%'; modalStyle.maxWidth = `${maxWidth}px`; } const modalBodyProps = { title, children, modalStyle, hasButtons, buttons, handleClose }; return ( {isOpen && ( // Trap focus in modal by focusing the first element after the animation is complete this.modalBody.firstTabStop.focus()}>
(this.modalBody = div as ModalBody)} />
)} ); } }