import ConfirmDialog from '$lib/components/shared-components/dialog/confirm-dialog.svelte'; import { mount, unmount, type Component, type ComponentProps } from 'svelte'; type OnCloseData = T extends { onClose: (data?: infer R) => void } ? R : never; type ExtendsEmptyObject = keyof T extends never ? Record : T; class ModalManager { show(Component: Component, props: ExtendsEmptyObject>) { return this.open(Component, props).onClose; } open>(Component: Component, props: ExtendsEmptyObject>) { let modal: object = {}; let onClose: () => Promise; const deferred = new Promise((resolve) => { onClose = async (data?: K) => { await unmount(modal); resolve(data); }; modal = mount(Component, { target: document.body, props: { ...(props as T), onClose, }, }); }); return { onClose: deferred, close: () => onClose(), }; } showDialog(options: Omit, 'onClose'>) { return this.show(ConfirmDialog, options); } } export const modalManager = new ModalManager();