{"version":3,"file":"messageBox.mjs","sources":["../../../../../../packages/components/message-box/src/messageBox.ts"],"sourcesContent":["import { createVNode, render } from 'vue'\nimport { isClient } from '@vueuse/core'\nimport {\n  hasOwn,\n  isFunction,\n  isObject,\n  isString,\n  isUndefined,\n  isVNode,\n} from '@bigin/utils'\nimport MessageBoxConstructor from './index.vue'\n\nimport type { AppContext, ComponentPublicInstance, VNode } from 'vue'\nimport type {\n  Action,\n  BMessageBoxOptions,\n  BMessageBoxShortcutMethod,\n  Callback,\n  IBMessageBox,\n  MessageBoxData,\n  MessageBoxState,\n} from './message-box.type'\n\n// component default merge props & data\n\nconst messageInstance = new Map<\n  ComponentPublicInstance<{ doClose: () => void }>, // marking doClose as function\n  {\n    options: any\n    callback: Callback | undefined\n    resolve: (res: any) => void\n    reject: (reason?: any) => void\n  }\n>()\n\nconst initInstance = (\n  props: any,\n  container: HTMLElement,\n  appContext: AppContext | null = null\n) => {\n  const vnode = createVNode(\n    MessageBoxConstructor,\n    props,\n    isFunction(props.message) || isVNode(props.message)\n      ? {\n          default: isFunction(props.message)\n            ? props.message\n            : () => props.message,\n        }\n      : null\n  )\n  vnode.appContext = appContext\n  render(vnode, container)\n  document.body.appendChild(container.firstElementChild!)\n  return vnode.component\n}\n\nconst genContainer = () => {\n  return document.createElement('div')\n}\n\nconst showMessage = (options: any, appContext?: AppContext | null) => {\n  const container = genContainer()\n  // Adding destruct method.\n  // when transition leaves emitting `vanish` evt. so that we can do the clean job.\n  options.onVanish = () => {\n    // not sure if this causes mem leak, need proof to verify that.\n    // maybe calling out like 1000 msg-box then close them all.\n    render(null, container)\n    messageInstance.delete(vm) // Remove vm to avoid mem leak.\n    // here we were suppose to call document.body.removeChild(container.firstElementChild)\n    // but render(null, container) did that job for us. so that we do not call that directly\n  }\n\n  options.onAction = (action: Action) => {\n    const currentMsg = messageInstance.get(vm)!\n    let resolve: Action | { value: string; action: Action }\n    if (options.showInput) {\n      resolve = { value: vm.inputValue, action }\n    } else {\n      resolve = action\n    }\n    if (options.callback) {\n      options.callback(resolve, instance.proxy)\n    } else {\n      if (action === 'cancel' || action === 'close') {\n        if (options.distinguishCancelAndClose && action !== 'cancel') {\n          currentMsg.reject('close')\n        } else {\n          currentMsg.reject('cancel')\n        }\n      } else {\n        currentMsg.resolve(resolve)\n      }\n    }\n  }\n\n  const instance = initInstance(options, container, appContext)!\n\n  // This is how we use message box programmably.\n  // Maybe consider releasing a template version?\n  // get component instance like v2.\n  const vm = instance.proxy as ComponentPublicInstance<\n    {\n      visible: boolean\n      doClose: () => void\n    } & MessageBoxState\n  >\n\n  for (const prop in options) {\n    if (hasOwn(options, prop) && !hasOwn(vm.$props, prop)) {\n      vm[prop as keyof ComponentPublicInstance] = options[prop]\n    }\n  }\n\n  // change visibility after everything is settled\n  vm.visible = true\n  return vm\n}\n\nasync function MessageBox(\n  options: BMessageBoxOptions,\n  appContext?: AppContext | null\n): Promise<MessageBoxData>\nfunction MessageBox(\n  options: BMessageBoxOptions | string | VNode,\n  appContext: AppContext | null = null\n): Promise<{ value: string; action: Action } | Action> {\n  if (!isClient) return Promise.reject()\n  let callback: Callback | undefined\n  if (isString(options) || isVNode(options)) {\n    options = {\n      message: options,\n    }\n  } else {\n    callback = options.callback\n  }\n\n  return new Promise((resolve, reject) => {\n    const vm = showMessage(\n      options,\n      appContext ?? (MessageBox as IBMessageBox)._context\n    )\n    // collect this vm in order to handle upcoming events.\n    messageInstance.set(vm, {\n      options,\n      callback,\n      resolve,\n      reject,\n    })\n  })\n}\n\nconst MESSAGE_BOX_VARIANTS = ['alert', 'confirm', 'prompt'] as const\nconst MESSAGE_BOX_DEFAULT_OPTS: Record<\n  typeof MESSAGE_BOX_VARIANTS[number],\n  Partial<BMessageBoxOptions>\n> = {\n  alert: { closeOnPressEscape: false, closeOnClickModal: false },\n  confirm: { showCancelButton: true },\n  prompt: { showCancelButton: true, showInput: true },\n}\n\nMESSAGE_BOX_VARIANTS.forEach((boxType) => {\n  ;(MessageBox as IBMessageBox)[boxType] = messageBoxFactory(\n    boxType\n  ) as BMessageBoxShortcutMethod\n})\n\nfunction messageBoxFactory(boxType: typeof MESSAGE_BOX_VARIANTS[number]) {\n  return (\n    message: string | VNode,\n    title: string | BMessageBoxOptions,\n    options?: BMessageBoxOptions,\n    appContext?: AppContext | null\n  ) => {\n    let titleOrOpts = ''\n    if (isObject(title)) {\n      options = title as BMessageBoxOptions\n      titleOrOpts = ''\n    } else if (isUndefined(title)) {\n      titleOrOpts = ''\n    } else {\n      titleOrOpts = title as string\n    }\n\n    return MessageBox(\n      Object.assign(\n        {\n          title: titleOrOpts,\n          message,\n          type: '',\n          ...MESSAGE_BOX_DEFAULT_OPTS[boxType],\n        },\n        options,\n        {\n          boxType,\n        }\n      ),\n      appContext\n    )\n  }\n}\n\nMessageBox.close = () => {\n  // instance.setupInstall.doClose()\n  // instance.setupInstall.state.visible = false\n\n  messageInstance.forEach((_, vm) => {\n    vm.doClose()\n  })\n\n  messageInstance.clear()\n}\n;(MessageBox as IBMessageBox)._context = null\n\nexport default MessageBox as IBMessageBox\n"],"names":[],"mappings":"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"}