import type React from 'react'; import { createDomTreeMounter } from './mounter/domTree'; import type { ConfirmableDialog, Mounter } from './types'; import { register } from './controls'; export const createConfirmationCreater = (mounter: Mounter) => (Component: ConfirmableDialog, unmountDelay: number = 1000, mountingNode?: HTMLElement) => { return (props: P): Promise => { let mountId: string; let resolveRef: (value: R) => void = () => {}; let rejectRef: (reason?: any) => void = () => {}; let setShowRef: ((show: boolean) => void) | undefined; function dispose() { setTimeout(() => { mounter.unmount(mountId); }, unmountDelay); } // Callback for confirmable to register its setShow function const registerSetShow = (setShow: (show: boolean) => void) => { setShowRef = setShow; }; const inner = new Promise((resolve, reject) => { resolveRef = resolve; rejectRef = reject; try { mountId = mounter.mount(Component as React.ComponentType, { reject, resolve, dispose, registerSetShow, ...props }, mountingNode); } catch (e) { // keep behavior identical to JS version console.error(e); throw e; } }); const wrapped = inner.then( (result) => { dispose(); return result; }, (err) => { dispose(); return Promise.reject(err); } ); // Register to controls layer for external control register(wrapped, { resolve: resolveRef, reject: rejectRef, dispose, get setShow() { return setShowRef; } }); return wrapped; }; }; const defaultCreateConfirmation = createConfirmationCreater(createDomTreeMounter()); export default defaultCreateConfirmation as ( component: ConfirmableDialog, unmountDelay?: number, mountingNode?: HTMLElement ) => (props: P) => Promise;