import { type StructureProcessor, StructureSchema } from '@ephox/boulder'; import { createDialog, type Dialog, type DialogData, type DialogInstanceApi, type DialogSpec } from '../components/dialog/Dialog'; import { createUrlDialog, type UrlDialog, type UrlDialogInstanceApi, type UrlDialogSpec } from '../components/dialog/UrlDialog'; import { createDataValidator } from '../core/DialogData'; interface DialogManager { readonly open: (factory: DialogFactory, structure: DialogSpec) => DialogInstanceApi; readonly openUrl: (factory: UrlDialogFactory, structure: UrlDialogSpec) => UrlDialogInstanceApi; readonly redial: (structure: DialogSpec) => DialogInit; } export type DialogFactory = (internalDialog: Dialog, initialData: Partial, dataValidator: StructureProcessor) => DialogInstanceApi; export type UrlDialogFactory = (internalDialog: UrlDialog) => UrlDialogInstanceApi; export interface DialogInit { readonly internalDialog: Dialog; readonly initialData: Partial; readonly dataValidator: StructureProcessor; } const extract = (structure: DialogSpec): DialogInit => { const internalDialog = StructureSchema.getOrDie(createDialog(structure)); const dataValidator = createDataValidator(structure); // We used to validate data here, but it's done when loading the dialog in tinymce const initialData = structure.initialData ?? {}; return { internalDialog, dataValidator, initialData }; }; const DialogManager: DialogManager = { open: (factory: DialogFactory, structure: DialogSpec): DialogInstanceApi => { const extraction = extract(structure); return factory(extraction.internalDialog, extraction.initialData, extraction.dataValidator); }, openUrl: (factory: UrlDialogFactory, structure: UrlDialogSpec): UrlDialogInstanceApi => { const internalDialog = StructureSchema.getOrDie(createUrlDialog(structure)); return factory(internalDialog); }, redial: (structure: DialogSpec): DialogInit => extract(structure) }; export { DialogManager };