{"version":3,"file":"index.cjs","sources":["../../../components/toast/index.ts"],"sourcesContent":["import { createApp, createVNode, markRaw, render } from 'vue'\n\nimport Component from './toast.vue'\nimport { proxyExposed, unrefElement } from '@vexip-ui/hooks'\nimport { destroyObject, isClient, noop, toNumber } from '@vexip-ui/utils'\n\nimport type { App, MaybeRef } from 'vue'\nimport type { MaybeInstance } from '@vexip-ui/hooks'\nimport type { ToastInstance, ToastOptions, ToastType } from './symbol'\n\nexport { toastProps } from './props'\n\nexport type { ToastProps, ToastCProps } from './props'\nexport type { ToastType, ToastOptions }\n\ntype FuzzyOptions = string | ToastOptions\n\ninterface AipMethod {\n  (options: ToastOptions): () => void,\n  (content: string, duration?: number): () => void,\n  /** @internal */\n  (options: FuzzyOptions, duration?: number): () => void\n}\n\nconst conveniences: Record<ToastType, Record<string, any>> = {\n  success: {},\n  warning: {},\n  error: {},\n  loading: {\n    showMask: true,\n  },\n}\n\nexport class ToastManager {\n  name: string\n  defaults: Record<string, unknown>\n\n  open: AipMethod\n  success: AipMethod\n  warning: AipMethod\n  error: AipMethod\n  loading: AipMethod\n\n  private _mountedApp: App<unknown> | null\n  private _instance: ToastInstance | null\n  private _innerApp: App<unknown> | null\n  private _container: HTMLElement | null\n  private _timer: ReturnType<typeof setTimeout> | null\n  private _wrapper: HTMLElement | SVGElement | null\n  private _mountedEl: HTMLElement | null\n\n  constructor(options: Partial<ToastOptions> = {}) {\n    options = {\n      ...options,\n      duration: options.duration ? toNumber(options.duration) : 2000,\n    }\n\n    this._mountedApp = null\n    this._instance = null\n    this._innerApp = null\n    this._container = null\n    this._timer = null\n    this._wrapper = null\n    this._mountedEl = null\n    this.name = 'Toast'\n    this.defaults = {}\n\n    this.config(options)\n\n    this.open = (content: FuzzyOptions, duration?: number) => {\n      return this._open(null, content, duration)\n    }\n\n    this.success = (content: FuzzyOptions, duration?: number) => {\n      return this._open('success', content, duration)\n    }\n\n    this.warning = (content: FuzzyOptions, duration?: number) => {\n      return this._open('warning', content, duration)\n    }\n\n    this.error = (content: FuzzyOptions, duration?: number) => {\n      return this._open('error', content, duration)\n    }\n\n    this.loading = (content: FuzzyOptions, duration?: number) => {\n      return this._open('loading', content, duration)\n    }\n  }\n\n  close() {\n    this._timer && clearTimeout(this._timer)\n    this._getInstance()?.closeToast()\n  }\n\n  config(options: Record<string, unknown>) {\n    this.defaults = { ...this.defaults, ...options }\n  }\n\n  clone() {\n    const manager = new ToastManager(this.defaults)\n\n    manager._mountedApp = this._mountedApp\n\n    return manager\n  }\n\n  destroy() {\n    this._mountedEl && this._wrapper?.removeChild(this._mountedEl)\n    this._innerApp?.unmount()\n    this._container && render(null, this._container)\n    destroyObject(this)\n  }\n\n  isDestroyed() {\n    return false\n  }\n\n  install(app: App, options: Partial<ToastOptions> & { property?: string } = {}) {\n    const { property, ...others } = options\n\n    this.config(others)\n    this._mountedApp = app\n\n    if (property || !app.config.globalProperties.$toast) {\n      app.config.globalProperties[property || '$toast'] = this\n    }\n  }\n\n  transferTo(target: MaybeRef<string | MaybeInstance>) {\n    if (!isClient) return\n\n    const el = unrefElement(target)\n\n    if (el) {\n      this._wrapper = el\n\n      if (this._instance) {\n        this._mountedEl && this._wrapper.appendChild(this._mountedEl)\n      } else {\n        this._getInstance()\n      }\n    }\n  }\n\n  private _getInstance() {\n    if (!this._instance && isClient) {\n      if (!this._mountedApp) {\n        console.warn('[vexip-ui:Toast]: App missing, the plugin maybe not installed.')\n\n        this._container = document.createElement('div')\n        this._innerApp = createApp(Component)\n        this._instance = this._innerApp.mount(this._container) as ToastInstance\n      } else {\n        const vnode = createVNode(Component, null, null)\n\n        this._container = document.createElement('div')\n        vnode.appContext = this._mountedApp._context\n\n        render(vnode, this._container)\n\n        this._instance = proxyExposed<ToastInstance>(vnode)\n      }\n\n      this._mountedEl = this._container.firstElementChild as HTMLElement\n      ;(this._wrapper || document.body).appendChild(this._mountedEl)\n    }\n\n    return this._instance\n  }\n\n  private _open(type: null | ToastType, content: FuzzyOptions, _duration?: number) {\n    if (!isClient) {\n      return noop\n    }\n\n    this._timer && clearTimeout(this._timer)\n\n    const options = typeof content === 'string' ? { content, duration: _duration } : content\n    const convenienceOptions = type ? (conveniences[type] ?? {}) : {}\n\n    const userCloseFn = options.onClose\n    const onClose = () => {\n      this._timer && clearTimeout(this._timer)\n\n      if (typeof userCloseFn === 'function') {\n        return userCloseFn()\n      }\n    }\n\n    const toast = this._getInstance()!\n    const item: ToastOptions = {\n      ...this.defaults,\n      ...convenienceOptions,\n      ...options,\n      type: type ?? options.type,\n      onClose,\n    }\n\n    if (item.icon && typeof item.icon !== 'function') {\n      item.icon = markRaw(item.icon)\n    }\n\n    toast.openToast(item)\n\n    const duration = typeof item.duration === 'number' ? item.duration : 2000\n\n    if (duration >= 500) {\n      this._timer = setTimeout(() => {\n        toast.closeToast()\n      }, duration)\n    }\n\n    return () => {\n      this._timer && clearTimeout(this._timer)\n      toast.closeToast()\n    }\n  }\n}\n\nexport const Toast = new ToastManager()\n"],"names":["conveniences","ToastManager","options","__publicField","toNumber","content","duration","_a","manager","_b","render","destroyObject","app","property","others","target","isClient","el","unrefElement","createApp","Component","vnode","createVNode","proxyExposed","type","_duration","noop","convenienceOptions","userCloseFn","onClose","toast","item","markRaw","Toast"],"mappings":"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"}