import { Fragment } from 'react' import { closeModal } from '../../actions/modal' import { cancelReplyCompose } from '../../actions/compose' import Bundle from '../../features/ui/util/bundle' import ModalBase from './modal_base' import BundleModalError from '../bundle_modal_error' import { MODAL_ACTIONS, MODAL_BLOCK_ACCOUNT, MODAL_BLOCK_DOMAIN, MODAL_BOOST, MODAL_COMMUNITY_TIMELINE_SETTINGS, MODAL_COMPOSE, MODAL_CONFIRM, MODAL_DISPLAY_OPTIONS, MODAL_EDIT_PROFILE, MODAL_EMBED, MODAL_GIF_PICKER, MODAL_GROUP_CREATE, MODAL_GROUP_DELETE, MODAL_GROUP_MEMBERS, MODAL_GROUP_REMOVED_ACCOUNTS, MODAL_HASHTAG_TIMELINE_SETTINGS, MODAL_HOME_TIMELINE_SETTINGS, MODAL_HOTKEYS, MODAL_LIST_CREATE, MODAL_LIST_DELETE, MODAL_LIST_EDITOR, MODAL_LIST_TIMELINE_SETTINGS, MODAL_MEDIA, MODAL_MUTE, MODAL_PRO_UPGRADE, MODAL_REPORT, MODAL_STATUS_LIKES, MODAL_STATUS_REPOSTS, MODAL_STATUS_REVISIONS, MODAL_UNAUTHORIZED, MODAL_UNFOLLOW, MODAL_VIDEO, } from '../../constants' import { ActionsModal, BlockAccountModal, BlockDomainModal, BoostModal, CommunityTimelineSettingsModal, ComposeModal, ConfirmationModal, DisplayOptionsModal, EditProfileModal, EmbedModal, GifPickerModal, GroupCreateModal, GroupDeleteModal, GroupMembersModal, GroupRemovedAccountsModal, HashtagTimelineSettingsModal, HomeTimelineSettingsModal, HotkeysModal, ListCreateModal, ListDeleteModal, ListEditorModal, ListTimelineSettingsModal, MediaModal, MuteModal, ProUpgradeModal, ReportModal, StatusLikesModal, StatusRepostsModal, StatusRevisionsModal, UnauthorizedModal, UnfollowModal, VideoModal, } from '../../features/ui/util/async_components' const MODAL_COMPONENTS = {} MODAL_COMPONENTS[MODAL_ACTIONS] = ActionsModal MODAL_COMPONENTS[MODAL_BLOCK_ACCOUNT] = BlockAccountModal MODAL_COMPONENTS[MODAL_BLOCK_DOMAIN] = BlockDomainModal MODAL_COMPONENTS[MODAL_BOOST] = BoostModal MODAL_COMPONENTS[MODAL_COMMUNITY_TIMELINE_SETTINGS] = CommunityTimelineSettingsModal MODAL_COMPONENTS[MODAL_COMPOSE] = ComposeModal MODAL_COMPONENTS[MODAL_CONFIRM] = ConfirmationModal MODAL_COMPONENTS[MODAL_DISPLAY_OPTIONS] = DisplayOptionsModal MODAL_COMPONENTS[MODAL_EDIT_PROFILE] = EditProfileModal MODAL_COMPONENTS[MODAL_EMBED] = EmbedModal MODAL_COMPONENTS[MODAL_GIF_PICKER] = GifPickerModal MODAL_COMPONENTS[MODAL_GROUP_CREATE] = GroupCreateModal MODAL_COMPONENTS[MODAL_GROUP_DELETE] = GroupDeleteModal MODAL_COMPONENTS[MODAL_GROUP_MEMBERS] = GroupMembersModal MODAL_COMPONENTS[MODAL_GROUP_REMOVED_ACCOUNTS] = GroupRemovedAccountsModal MODAL_COMPONENTS[MODAL_HASHTAG_TIMELINE_SETTINGS] = HashtagTimelineSettingsModal MODAL_COMPONENTS[MODAL_HOME_TIMELINE_SETTINGS] = HomeTimelineSettingsModal MODAL_COMPONENTS[MODAL_HOTKEYS] = HotkeysModal MODAL_COMPONENTS[MODAL_LIST_CREATE] = ListCreateModal MODAL_COMPONENTS[MODAL_LIST_DELETE] = ListDeleteModal MODAL_COMPONENTS[MODAL_LIST_EDITOR] = ListEditorModal MODAL_COMPONENTS[MODAL_LIST_TIMELINE_SETTINGS] = ListTimelineSettingsModal MODAL_COMPONENTS[MODAL_MEDIA] = MediaModal MODAL_COMPONENTS[MODAL_MUTE] = MuteModal MODAL_COMPONENTS[MODAL_PRO_UPGRADE] = ProUpgradeModal MODAL_COMPONENTS[MODAL_REPORT] = ReportModal MODAL_COMPONENTS[MODAL_STATUS_LIKES] = StatusLikesModal MODAL_COMPONENTS[MODAL_STATUS_REPOSTS] = StatusRepostsModal MODAL_COMPONENTS[MODAL_STATUS_REVISIONS] = StatusRevisionsModal MODAL_COMPONENTS[MODAL_UNAUTHORIZED] = UnauthorizedModal MODAL_COMPONENTS[MODAL_UNFOLLOW] = UnfollowModal MODAL_COMPONENTS[MODAL_VIDEO] = VideoModal const mapStateToProps = (state) => ({ type: state.getIn(['modal', 'modalType']), props: state.getIn(['modal', 'modalProps'], {}), }) const mapDispatchToProps = (dispatch) => ({ onClose(optionalType) { if (optionalType === 'COMPOSE') { dispatch(cancelReplyCompose()) } dispatch(closeModal()) }, }) export default @connect(mapStateToProps, mapDispatchToProps) class ModalRoot extends PureComponent { static propTypes = { type: PropTypes.string, props: PropTypes.object, onClose: PropTypes.func.isRequired, } getSnapshotBeforeUpdate() { return { visible: !!this.props.type } } componentDidUpdate(prevProps, prevState, { visible }) { if (visible) { document.body.classList.add(_s.overflowYHidden) } else { document.body.classList.remove(_s.overflowYHidden) } } renderLoading = () => { return null } renderError = () => { return } onClickClose = () => { this.props.onClose(this.props.type) } render() { const { type, props } = this.props const visible = !!type return ( { visible && { (Component) => } } ) } }