import Observable from "../../helper/observable"; import { h, Component } from "preact"; export default abstract class Modal { // Static private static modalObservableServer = new Observable<{ modal: Modal, close: boolean }>(false); public static modalObservable = Modal.modalObservableServer.getPublicApi(); protected abstract title: string; // Private private onResult: (result: T | null) => void; // Protected protected result(value: T | null) { if (this.onResult) this.onResult(value); } //Public /** * This function shows the modal * Do not cell when using getResult() */ public async show() { Modal.modalObservableServer.send({ modal: this, close: false }); } /** * Shows the modal and waits for result. * * Call close when successful */ public async getResult() { this.show(); return new Promise((yes) => this.onResult = yes); } public close() { Modal.modalObservableServer.send({ modal: this, close: true }); } public abstract getComponent(): JSX.Element; public static BaseModal = class BaseModal extends Component<{ modal: Modal }, {}> { render() { return } } } // export default abstract class Modal extends Component<{}, S> { // // Abstract // protected abstract renderChilds(): JSX.Element; // protected abstract title: string; // render() { // return // } // } export class ModalComponent extends Component<{}, { modal: Modal | undefined, component: JSX.Element | undefined }>{ constructor(props) { super(props); this.onModal = this.onModal.bind(this); } onModal([{ modal, close }]: { modal: Modal, close: boolean }[]) { if (!close && this.state.modal !== modal) { this.setState({ modal: modal, component: modal.getComponent() }) } else { if (this.state.modal === modal) // Only close if the same this.setState({ modal: undefined, component: undefined }) } } componentWillMount() { Modal.modalObservable.subscribe(this.onModal, true); } componentWillUnmount() { Modal.modalObservable.unsubscribe(this.onModal); } render() { return
{this.state.component}
} }