@extclp/vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 14.4 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../../components/notice/index.ts"],"sourcesContent":["import { createApp, createVNode, markRaw, render } from 'vue'\r\n\r\nimport Component from './notice.vue'\r\nimport { proxyExposed, unrefElement } from '@vexip-ui/hooks'\r\nimport { destroyObject, isClient, isNull, isObject, noop, toNumber } from '@vexip-ui/utils'\r\n\r\nimport type { App, MaybeRef } from 'vue'\r\nimport type { MaybeInstance } from '@vexip-ui/hooks'\r\nimport type {\r\n Key,\r\n NoticeConfig,\r\n NoticeInstance,\r\n NoticeOptions,\r\n NoticePlacement,\r\n NoticeType,\r\n} from './symbol'\r\n\r\nexport type { NoticeConfig, NoticeType, NoticePlacement, NoticeOptions }\r\n\r\ntype FuzzyOptions = string | NoticeOptions\r\ntype ManagerOptions = { marker?: boolean, duration?: number } & NoticeConfig &\r\n Record<string, unknown>\r\n\r\ninterface AipMethod {\r\n (options: NoticeOptions): () => void,\r\n (title: string, duration?: number): () => void,\r\n (title: string, content: string, duration?: number): () => void,\r\n /** @internal */\r\n (options: FuzzyOptions, duration?: number): () => void,\r\n}\r\n\r\nconst placementWhiteList: NoticePlacement[] = [\r\n 'top-right',\r\n 'top-left',\r\n 'bottom-right',\r\n 'bottom-left',\r\n]\r\n\r\nlet count = 1\r\n\r\nfunction getKey() {\r\n return `notice-${count++}`\r\n}\r\n\r\nexport class NoticeManager {\r\n name: string\r\n defaults: Record<string, unknown>\r\n\r\n open: AipMethod\r\n primary: AipMethod\r\n info: AipMethod\r\n success: AipMethod\r\n warning: AipMethod\r\n error: AipMethod\r\n\r\n private _mountedApp: App<unknown> | null\r\n private _instance: NoticeInstance | null\r\n private _innerApp: App<unknown> | null\r\n private _container: HTMLElement | null\r\n private _wrapper: HTMLElement | SVGElement | null\r\n private _mountedEl: HTMLElement | null\r\n private _installed: boolean\r\n private _configRecord: NoticeConfig | null\r\n\r\n constructor(options: ManagerOptions = {}) {\r\n options = {\r\n ...options,\r\n marker: !!options.marker,\r\n duration: options.duration ? toNumber(options.duration) : 4000,\r\n }\r\n\r\n this._mountedApp = null\r\n this._instance = null\r\n this._innerApp = null\r\n this._container = null\r\n this._wrapper = null\r\n this._mountedEl = null\r\n this._installed = false\r\n this._configRecord = null\r\n this.name = 'Notice'\r\n this.defaults = {}\r\n\r\n this.config(options)\r\n\r\n this.open = (title: FuzzyOptions, content?: string | number, duration?: number) => {\r\n return this._open(null, title, content, duration)\r\n }\r\n\r\n this.primary = (title: FuzzyOptions, content?: string | number, duration?: number) => {\r\n return this._open('primary', title, content, duration)\r\n }\r\n\r\n this.info = (title: FuzzyOptions, content?: string | number, duration?: number) => {\r\n return this._open('info', title, content, duration)\r\n }\r\n\r\n this.success = (title: FuzzyOptions, content?: string | number, duration?: number) => {\r\n return this._open('success', title, content, duration)\r\n }\r\n\r\n this.warning = (title: FuzzyOptions, content?: string | number, duration?: number) => {\r\n return this._open('warning', title, content, duration)\r\n }\r\n\r\n this.error = (title: FuzzyOptions, content?: string | number, duration?: number) => {\r\n return this._open('error', title, content, duration)\r\n }\r\n }\r\n\r\n judge(state: boolean, success: string, error: string, duration?: number): void\r\n judge(state: boolean, success: NoticeOptions, error: string, duration?: number): void\r\n judge(state: boolean, success: string, error: NoticeOptions, duration?: number): void\r\n judge(state: boolean, success: NoticeOptions, error: NoticeOptions): void\r\n judge(\r\n state: boolean,\r\n success: string | NoticeOptions,\r\n error: string | NoticeOptions,\r\n duration?: number,\r\n ) {\r\n if (state) {\r\n this.success(success, duration)\r\n } else {\r\n this.error(error, duration)\r\n }\r\n }\r\n\r\n close(key: Key) {\r\n if (isNull(key)) {\r\n this.clear()\r\n } else {\r\n this._getInstance()?.remove(key)\r\n }\r\n }\r\n\r\n config({ placement, startOffset, itemGap, ...others }: NoticeConfig & NoticeOptions) {\r\n this._configRecord = { placement, startOffset, itemGap }\r\n this.defaults = { ...this.defaults, ...others }\r\n\r\n if (this._installed) {\r\n const instance = this._getInstance()\r\n\r\n if (instance) {\r\n if (placement) {\r\n instance.config({\r\n placement: placementWhiteList.includes(placement) ? placement : placementWhiteList[0],\r\n })\r\n }\r\n\r\n instance.config({ startOffset, itemGap })\r\n }\r\n }\r\n }\r\n\r\n clone() {\r\n const manager = new NoticeManager(this.defaults)\r\n\r\n manager._mountedApp = this._mountedApp\r\n manager._configRecord = this._configRecord\r\n manager._installed = this._installed\r\n\r\n return manager\r\n }\r\n\r\n clear() {\r\n this._getInstance()?.clear()\r\n }\r\n\r\n destroy() {\r\n this._mountedEl && this._wrapper?.removeChild(this._mountedEl)\r\n this._innerApp?.unmount()\r\n this._container && render(null, this._container)\r\n destroyObject(this)\r\n }\r\n\r\n isDestroyed() {\r\n return false\r\n }\r\n\r\n install(app: App, options: ManagerOptions & { property?: string } = {}) {\r\n const { property, ...others } = options\r\n\r\n this._mountedApp = app\r\n this._installed = true\r\n this.config({ ...this._configRecord, ...others })\r\n\r\n if (property || !app.config.globalProperties.$notice) {\r\n app.config.globalProperties[property || '$notice'] = this\r\n }\r\n }\r\n\r\n transferTo(target: MaybeRef<string | MaybeInstance>) {\r\n if (!isClient) return\r\n\r\n const el = unrefElement(target)\r\n\r\n if (el) {\r\n this._wrapper = el\r\n\r\n if (this._instance) {\r\n this._mountedEl && this._wrapper.appendChild(this._mountedEl)\r\n } else {\r\n this._getInstance()\r\n }\r\n }\r\n }\r\n\r\n private _getInstance() {\r\n if (!this._instance && isClient) {\r\n if (!this._mountedApp) {\r\n console.warn('[vexip-ui:Notice]: App missing, the plugin maybe not installed.')\r\n\r\n this._container = document.createElement('div')\r\n this._innerApp = createApp(Component)\r\n this._instance = this._innerApp.mount(this._container) as NoticeInstance\r\n } else {\r\n const vnode = createVNode(Component, null, null)\r\n\r\n this._container = document.createElement('div')\r\n vnode.appContext = this._mountedApp._context\r\n\r\n render(vnode, this._container)\r\n\r\n this._instance = proxyExposed<NoticeInstance>(vnode)\r\n }\r\n\r\n this._mountedEl = this._container.firstElementChild as HTMLElement\r\n ;(this._wrapper || document.body).appendChild(this._mountedEl)\r\n }\r\n\r\n return this._instance\r\n }\r\n\r\n private _open(\r\n type: null | NoticeType,\r\n title: FuzzyOptions,\r\n content?: string | number,\r\n _duration?: number,\r\n ) {\r\n if (!isClient) {\r\n return noop\r\n }\r\n\r\n let options: NoticeOptions\r\n\r\n if (isObject(title)) {\r\n options = title\r\n } else {\r\n if (typeof content === 'number') {\r\n options = { title, duration: content }\r\n } else if (!content) {\r\n options = { title, duration: _duration }\r\n } else {\r\n options = { title, content, duration: _duration }\r\n }\r\n }\r\n\r\n const key = options.key ?? getKey()\r\n const notice = this._getInstance()!\r\n\r\n let timer: ReturnType<typeof setTimeout>\r\n\r\n const userCloseFn = options.onClose\r\n const onClose = () => {\r\n clearTimeout(timer)\r\n\r\n if (typeof userCloseFn === 'function') {\r\n return userCloseFn()\r\n }\r\n }\r\n\r\n const userEnterFn = options.onEnter\r\n const onEnter = () => {\r\n if (options.liveOnEnter) {\r\n clearTimeout(timer)\r\n }\r\n\r\n if (typeof userEnterFn === 'function') {\r\n return userEnterFn()\r\n }\r\n }\r\n\r\n const userLeaveFn = options.onLeave\r\n const onLeave = () => {\r\n if (options.liveOnEnter) {\r\n clearTimeout(timer)\r\n setDelayClose()\r\n }\r\n\r\n if (typeof userLeaveFn === 'function') {\r\n return userLeaveFn()\r\n }\r\n }\r\n\r\n const item: NoticeOptions = {\r\n ...this.defaults,\r\n ...options,\r\n key,\r\n type: type ?? options.type,\r\n onClose,\r\n onEnter,\r\n onLeave,\r\n }\r\n\r\n if (item.icon && typeof item.icon !== 'function') {\r\n item.icon = markRaw(item.icon)\r\n }\r\n\r\n notice.add(item)\r\n setDelayClose()\r\n\r\n function setDelayClose() {\r\n const duration = typeof item.duration === 'number' ? item.duration : 4000\r\n\r\n if (duration >= 500) {\r\n timer = setTimeout(() => {\r\n notice.remove(key)\r\n }, duration)\r\n }\r\n }\r\n\r\n return () => {\r\n clearTimeout(timer)\r\n notice.remove(key)\r\n }\r\n }\r\n}\r\n\r\nexport const Notice = new NoticeManager()\r\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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"}