modal_root.js (2044B)
- import React from 'react';
- import PropTypes from 'prop-types';
- import Base from '../../../components/modal_root';
- import BundleContainer from '../containers/bundle_container';
- import BundleModalError from './bundle_modal_error';
- import ModalLoading from './modal_loading';
- import ActionsModal from './actions_modal';
- import MediaModal from './media_modal';
- import VideoModal from './video_modal';
- import BoostModal from './boost_modal';
- import ConfirmationModal from './confirmation_modal';
- import FocalPointModal from './focal_point_modal';
- import {
- OnboardingModal,
- ListEditor,
- } from '../../../features/ui/util/async-components';
- const MODAL_COMPONENTS = {
- 'MEDIA': () => Promise.resolve({ default: MediaModal }),
- 'ONBOARDING': OnboardingModal,
- 'VIDEO': () => Promise.resolve({ default: VideoModal }),
- 'BOOST': () => Promise.resolve({ default: BoostModal }),
- 'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }),
- 'ACTIONS': () => Promise.resolve({ default: ActionsModal }),
- 'LIST_EDITOR': ListEditor,
- 'FOCAL_POINT': () => Promise.resolve({ default: FocalPointModal }),
- };
- export default class ModalRoot extends React.PureComponent {
- static propTypes = {
- type: PropTypes.string,
- props: PropTypes.object,
- onClose: PropTypes.func.isRequired,
- };
- renderLoading = modalId => () => {
- return ['MEDIA', 'VIDEO', 'BOOST', 'CONFIRM', 'ACTIONS'].indexOf(modalId) === -1 ? <ModalLoading /> : null;
- }
- renderError = (props) => {
- const { onClose } = this.props;
- return <BundleModalError {...props} onClose={onClose} />;
- }
- render () {
- const { type, props, onClose } = this.props;
- const visible = !!type;
- return (
- <Base onClose={onClose}>
- {visible && (
- <BundleContainer fetchComponent={MODAL_COMPONENTS[type]} loading={this.renderLoading(type)} error={this.renderError} renderDelay={200}>
- {(SpecificComponent) => <SpecificComponent {...props} onClose={onClose} />}
- </BundleContainer>
- )}
- </Base>
- );
- }
- }