import React from 'react'; import PropTypes from 'prop-types'; import TransitionMotion from 'react-motion/lib/TransitionMotion'; import spring from 'react-motion/lib/spring'; import BundleContainer from '../containers/bundle_container'; import BundleModalError from './bundle_modal_error'; import ModalLoading from './modal_loading'; import { MediaModal, OnboardingModal, VideoModal, BoostModal, ConfirmationModal, ReportModal, SettingsModal, } from '../../../features/ui/util/async-components'; const MODAL_COMPONENTS = { 'MEDIA': MediaModal, 'ONBOARDING': OnboardingModal, 'VIDEO': VideoModal, 'BOOST': BoostModal, 'CONFIRM': ConfirmationModal, 'REPORT': ReportModal, 'SETTINGS': SettingsModal, }; export default class ModalRoot extends React.PureComponent { static propTypes = { type: PropTypes.string, props: PropTypes.object, onClose: PropTypes.func.isRequired, }; handleKeyUp = (e) => { if ((e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27) && !!this.props.type) { this.props.onClose(); } } componentDidMount () { window.addEventListener('keyup', this.handleKeyUp, false); } componentWillUnmount () { window.removeEventListener('keyup', this.handleKeyUp); } willEnter () { return { opacity: 0, scale: 0.98 }; } willLeave () { return { opacity: spring(0), scale: spring(0.98) }; } renderModal = (SpecificComponent) => { const { props, onClose } = this.props; return ; } renderLoading = () => { return ; } renderError = (props) => { const { onClose } = this.props; return ; } render () { const { type, props, onClose } = this.props; const visible = !!type; const items = []; if (visible) { items.push({ key: type, data: { type, props }, style: { opacity: spring(1), scale: spring(1, { stiffness: 120, damping: 14 }) }, }); } return ( {interpolatedStyles => {interpolatedStyles.map(({ key, data: { type }, style }) => ( {this.renderModal} ))} } ); } }