import React, { FC } from 'react'; import ReactDOM from 'react-dom'; import { provideTheme } from '../ConfigProvider/ConfigProvider'; interface ModalWrapperProps { showModal: (component: React.ComponentType, props: T) => void; hideModal: () => void; } type ModalWrapper = FC; interface Props { children: ModalWrapper; } interface State { component: React.ComponentType | null; props: any; } export class ModalController extends React.Component { modalRoot = document.body; modalNode = document.createElement('div'); constructor(props: Props) { super(props); this.state = { component: null, props: {}, }; } showModal = (component: React.ComponentType, props: any) => { this.setState({ component, props, }); }; hideModal = () => { this.modalRoot.removeChild(this.modalNode); this.setState({ component: null, props: {}, }); }; renderModal() { const { component, props } = this.state; if (!component) { return null; } this.modalRoot.appendChild(this.modalNode); const modal = React.createElement(provideTheme(component), props); return ReactDOM.createPortal(modal, this.modalNode); } render() { const { children } = this.props; const ChildrenComponent = children; return ( <> {this.renderModal()} ); } }