{"version":3,"file":"index.cjs","sources":["../../../components/notice/index.ts"],"sourcesContent":["import { createApp, createVNode, markRaw, render } from 'vue'\n\nimport Component from './notice.vue'\nimport { proxyExposed, unrefElement } from '@vexip-ui/hooks'\nimport { destroyObject, isClient, isNull, isObject, noop, toNumber } from '@vexip-ui/utils'\n\nimport type { App, MaybeRef } from 'vue'\nimport type { MaybeInstance } from '@vexip-ui/hooks'\nimport type {\n  Key,\n  NoticeConfig,\n  NoticeInstance,\n  NoticeOptions,\n  NoticePlacement,\n  NoticeType,\n} from './symbol'\n\nexport type { NoticeConfig, NoticeType, NoticePlacement, NoticeOptions }\n\ntype FuzzyOptions = string | NoticeOptions\ntype ManagerOptions = { marker?: boolean, duration?: number } & NoticeConfig &\n  Record<string, unknown>\n\ninterface AipMethod {\n  (options: NoticeOptions): () => void,\n  (title: string, duration?: number): () => void,\n  (title: string, content: string, duration?: number): () => void,\n  /** @internal */\n  (options: FuzzyOptions, duration?: number): () => void,\n}\n\nconst placementWhiteList: NoticePlacement[] = [\n  'top-right',\n  'top-left',\n  'bottom-right',\n  'bottom-left',\n]\n\nlet count = 1\n\nfunction getKey() {\n  return `notice-${count++}`\n}\n\nexport class NoticeManager {\n  name: string\n  defaults: Record<string, unknown>\n\n  open: AipMethod\n  primary: AipMethod\n  info: AipMethod\n  success: AipMethod\n  warning: AipMethod\n  error: AipMethod\n\n  private _mountedApp: App<unknown> | null\n  private _instance: NoticeInstance | null\n  private _innerApp: App<unknown> | null\n  private _container: HTMLElement | null\n  private _wrapper: HTMLElement | SVGElement | null\n  private _mountedEl: HTMLElement | null\n  private _installed: boolean\n  private _configRecord: NoticeConfig | null\n\n  constructor(options: ManagerOptions = {}) {\n    options = {\n      ...options,\n      marker: !!options.marker,\n      duration: options.duration ? toNumber(options.duration) : 4000,\n    }\n\n    this._mountedApp = null\n    this._instance = null\n    this._innerApp = null\n    this._container = null\n    this._wrapper = null\n    this._mountedEl = null\n    this._installed = false\n    this._configRecord = null\n    this.name = 'Notice'\n    this.defaults = {}\n\n    this.config(options)\n\n    this.open = (title: FuzzyOptions, content?: string | number, duration?: number) => {\n      return this._open(null, title, content, duration)\n    }\n\n    this.primary = (title: FuzzyOptions, content?: string | number, duration?: number) => {\n      return this._open('primary', title, content, duration)\n    }\n\n    this.info = (title: FuzzyOptions, content?: string | number, duration?: number) => {\n      return this._open('info', title, content, duration)\n    }\n\n    this.success = (title: FuzzyOptions, content?: string | number, duration?: number) => {\n      return this._open('success', title, content, duration)\n    }\n\n    this.warning = (title: FuzzyOptions, content?: string | number, duration?: number) => {\n      return this._open('warning', title, content, duration)\n    }\n\n    this.error = (title: FuzzyOptions, content?: string | number, duration?: number) => {\n      return this._open('error', title, content, duration)\n    }\n  }\n\n  judge(state: boolean, success: string, error: string, duration?: number): void\n  judge(state: boolean, success: NoticeOptions, error: string, duration?: number): void\n  judge(state: boolean, success: string, error: NoticeOptions, duration?: number): void\n  judge(state: boolean, success: NoticeOptions, error: NoticeOptions): void\n  judge(\n    state: boolean,\n    success: string | NoticeOptions,\n    error: string | NoticeOptions,\n    duration?: number,\n  ) {\n    if (state) {\n      this.success(success, duration)\n    } else {\n      this.error(error, duration)\n    }\n  }\n\n  close(key: Key) {\n    if (isNull(key)) {\n      this.clear()\n    } else {\n      this._getInstance()?.remove(key)\n    }\n  }\n\n  config({ placement, startOffset, itemGap, ...others }: NoticeConfig & NoticeOptions) {\n    this._configRecord = { placement, startOffset, itemGap }\n    this.defaults = { ...this.defaults, ...others }\n\n    if (this._installed) {\n      const instance = this._getInstance()\n\n      if (instance) {\n        if (placement) {\n          instance.config({\n            placement: placementWhiteList.includes(placement) ? placement : placementWhiteList[0],\n          })\n        }\n\n        instance.config({ startOffset, itemGap })\n      }\n    }\n  }\n\n  clone() {\n    const manager = new NoticeManager(this.defaults)\n\n    manager._mountedApp = this._mountedApp\n    manager._configRecord = this._configRecord\n    manager._installed = this._installed\n\n    return manager\n  }\n\n  clear() {\n    this._getInstance()?.clear()\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: ManagerOptions & { property?: string } = {}) {\n    const { property, ...others } = options\n\n    this._mountedApp = app\n    this._installed = true\n    this.config({ ...this._configRecord, ...others })\n\n    if (property || !app.config.globalProperties.$notice) {\n      app.config.globalProperties[property || '$notice'] = 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:Notice]: 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 NoticeInstance\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<NoticeInstance>(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(\n    type: null | NoticeType,\n    title: FuzzyOptions,\n    content?: string | number,\n    _duration?: number,\n  ) {\n    if (!isClient) {\n      return noop\n    }\n\n    let options: NoticeOptions\n\n    if (isObject(title)) {\n      options = title\n    } else {\n      if (typeof content === 'number') {\n        options = { title, duration: content }\n      } else if (!content) {\n        options = { title, duration: _duration }\n      } else {\n        options = { title, content, duration: _duration }\n      }\n    }\n\n    const key = options.key ?? getKey()\n    const notice = this._getInstance()!\n\n    let timer: ReturnType<typeof setTimeout>\n\n    const userCloseFn = options.onClose\n    const onClose = () => {\n      clearTimeout(timer)\n\n      if (typeof userCloseFn === 'function') {\n        return userCloseFn()\n      }\n    }\n\n    const userEnterFn = options.onEnter\n    const onEnter = () => {\n      if (options.liveOnEnter) {\n        clearTimeout(timer)\n      }\n\n      if (typeof userEnterFn === 'function') {\n        return userEnterFn()\n      }\n    }\n\n    const userLeaveFn = options.onLeave\n    const onLeave = () => {\n      if (options.liveOnEnter) {\n        clearTimeout(timer)\n        setDelayClose()\n      }\n\n      if (typeof userLeaveFn === 'function') {\n        return userLeaveFn()\n      }\n    }\n\n    const item: NoticeOptions = {\n      ...this.defaults,\n      ...options,\n      key,\n      type: type ?? options.type,\n      onClose,\n      onEnter,\n      onLeave,\n    }\n\n    if (item.icon && typeof item.icon !== 'function') {\n      item.icon = markRaw(item.icon)\n    }\n\n    notice.add(item)\n    setDelayClose()\n\n    function setDelayClose() {\n      const duration = typeof item.duration === 'number' ? item.duration : 4000\n\n      if (duration >= 500) {\n        timer = setTimeout(() => {\n          notice.remove(key)\n        }, duration)\n      }\n    }\n\n    return () => {\n      clearTimeout(timer)\n      notice.remove(key)\n    }\n  }\n}\n\nexport const Notice = new NoticeManager()\n"],"names":["placementWhiteList","count","getKey","NoticeManager","options","__publicField","toNumber","title","content","duration","state","success","error","key","isNull","_a","placement","startOffset","itemGap","others","instance","manager","_b","render","destroyObject","app","property","target","isClient","el","unrefElement","createApp","Component","vnode","createVNode","proxyExposed","type","_duration","noop","isObject","notice","timer","userCloseFn","onClose","userEnterFn","onEnter","userLeaveFn","onLeave","setDelayClose","item","markRaw","Notice"],"mappings":"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"}