import React, {Dispatch, SetStateAction, ComponentType} from 'react'; import {Subject} from 'rxjs'; import {ModalContentComponent} from './modal-content-component'; import {Modal, ModalProps} from './modal'; import {ModalRef} from './modal-ref'; export class ModalManager { constructor( private _list: ModalRef[], private setList: Dispatch> ) {} get list(): ModalRef[] { return this._list; } set list(val: ModalRef[]) { this._list = val; this.setList(val); } open, Out>( ContentComponent: ModalContentComponent, contentProps: In, modalOptions: Omit, 'onClose'> ): ModalRef { const closeEmitter = new Subject(); const ModalComponent: ComponentType = () => ( {...modalOptions} onClose={res => closeEmitter.next(res)} > closeEmitter.next(res)} /> ); const ref = new ModalRef(closeEmitter, ModalComponent); const sub = closeEmitter.subscribe(() => { this.list = this.list.filter(elm => elm !== ref); sub.unsubscribe(); }); this.list = [...this.list, ref]; return ref; } close(result: Out, ref: ModalRef) { (ref || [...this.list].pop())?.close(result); } }