import PropTypes from "prop-types"; import { PureComponent } from "react"; import { Helmet } from "react-helmet"; import Base from "mastodon/components/modal_root"; import { MuteModal, BlockModal, ReportModal, EmbedModal, ListEditor, ListAdder, CompareHistoryModal, FilterModal, InteractionModal, SubscribedLanguagesModal, ClosedRegistrationsModal, } from "mastodon/features/ui/util/async-components"; import { getScrollbarWidth } from "mastodon/utils/scrollbar"; import BundleContainer from "../containers/bundle_container"; import ActionsModal from "./actions_modal"; import AudioModal from "./audio_modal"; import BoostModal from "./boost_modal"; import BundleModalError from "./bundle_modal_error"; import ConfirmationModal from "./confirmation_modal"; import FocalPointModal from "./focal_point_modal"; import ImageModal from "./image_modal"; import MediaModal from "./media_modal"; import ModalLoading from "./modal_loading"; import VideoModal from "./video_modal"; export const MODAL_COMPONENTS = { "MEDIA": () => Promise.resolve({ default: MediaModal }), "VIDEO": () => Promise.resolve({ default: VideoModal }), "AUDIO": () => Promise.resolve({ default: AudioModal }), "IMAGE": () => Promise.resolve({ default: ImageModal }), "BOOST": () => Promise.resolve({ default: BoostModal }), "CONFIRM": () => Promise.resolve({ default: ConfirmationModal }), "MUTE": MuteModal, "BLOCK": BlockModal, "REPORT": ReportModal, "ACTIONS": () => Promise.resolve({ default: ActionsModal }), "EMBED": EmbedModal, "LIST_EDITOR": ListEditor, "FOCAL_POINT": () => Promise.resolve({ default: FocalPointModal }), "LIST_ADDER": ListAdder, "COMPARE_HISTORY": CompareHistoryModal, "FILTER": FilterModal, "SUBSCRIBED_LANGUAGES": SubscribedLanguagesModal, "INTERACTION": InteractionModal, "CLOSED_REGISTRATIONS": ClosedRegistrationsModal, }; export default class ModalRoot extends PureComponent { static propTypes = { type: PropTypes.string, props: PropTypes.object, onClose: PropTypes.func.isRequired, ignoreFocus: PropTypes.bool, }; state = { backgroundColor: null, }; getSnapshotBeforeUpdate () { return { visible: !!this.props.type }; } componentDidUpdate (prevProps, prevState, { visible }) { if (visible) { document.body.classList.add("with-modals--active"); document.documentElement.style.marginRight = `${getScrollbarWidth()}px`; } else { document.body.classList.remove("with-modals--active"); document.documentElement.style.marginRight = "0"; } } setBackgroundColor = color => { this.setState({ backgroundColor: color }); }; renderLoading = modalId => () => { return ["MEDIA", "VIDEO", "BOOST", "CONFIRM", "ACTIONS"].indexOf(modalId) === -1 ? : null; }; renderError = (props) => { const { onClose } = this.props; return ; }; handleClose = (ignoreFocus = false) => { const { onClose } = this.props; const message = this._modal?.getCloseConfirmationMessage?.(); onClose(message, ignoreFocus); }; setModalRef = (c) => { this._modal = c; }; render () { const { type, props, ignoreFocus } = this.props; const { backgroundColor } = this.state; const visible = !!type; return ( {visible && ( <> {(SpecificComponent) => { const ref = typeof SpecificComponent !== "function" ? this.setModalRef : undefined; return ; }} )} ); } }