{"version":3,"file":"index.mjs","sources":["../../../../src/plugins/popoverController/index.ts"],"sourcesContent":["import {\n  isReadonly,\n  isRef,\n  markRaw,\n  nextTick,\n  onScopeDispose,\n  type Plugin,\n  ref,\n  type Ref,\n  toRef,\n  toValue,\n  watch,\n  type WatchHandle,\n} from 'vue'\nimport {popoverPluginKey} from '../../utils/keys'\nimport type {\n  ControllerKey,\n  PopoverOrchestratorCreateParam,\n  PopoverOrchestratorMapValue,\n  PopoverOrchestratorParam,\n  PromiseWithPopover,\n  PromiseWithPopoverInternal,\n  TooltipOrchestratorCreateParam,\n  TooltipOrchestratorMapValue,\n  TooltipOrchestratorParam,\n} from '../../types/ComponentOrchestratorTypes'\nimport type {BvTriggerableEvent} from '../../utils'\n\nexport const popoverPlugin: Plugin = {\n  install(app) {\n    const _isOrchestratorInstalled = ref(false)\n    const popovers = ref(\n      new Map<ControllerKey, PopoverOrchestratorMapValue | TooltipOrchestratorMapValue>()\n    )\n\n    const buildPromise = (\n      _id: ControllerKey,\n      store: Ref<Map<ControllerKey, PopoverOrchestratorMapValue | TooltipOrchestratorMapValue>>\n    ): {\n      value: PromiseWithPopover\n      resolve: (value: BvTriggerableEvent) => void\n      stop?: WatchHandle\n    } => {\n      let resolveFunc: (value: BvTriggerableEvent) => void = () => {}\n\n      const promise = new Promise<BvTriggerableEvent>((resolve) => {\n        resolveFunc = resolve\n      }) as PromiseWithPopover\n      Object.assign(promise, {\n        id: _id,\n        ref: null,\n        show() {\n          if (!this.ref) return this.set({modelValue: true})\n          this.ref.show()\n          return promise\n        },\n        hide(trigger?: string) {\n          if (!this.ref) return this.set({modelValue: false})\n          this.ref.hide(trigger, true)\n          return promise\n        },\n        toggle() {\n          if (!this.ref) return this.set({modelValue: !this.get()?.modelValue})\n          this.ref.toggle()\n          return promise\n        },\n        get() {\n          return store.value.get(_id)\n        },\n        set(val: Partial<PopoverOrchestratorParam | TooltipOrchestratorParam>) {\n          const item = store.value.get(_id)\n          if (item) {\n            const v = {...toValue(item), ...toValue(val)}\n            // add modal to v\n            if (item.modelValue !== v.modelValue) {\n              item['onUpdate:modelValue']?.(v.modelValue as boolean)\n            }\n            store.value.set(_id, {\n              ...v,\n              title: toValue(v.title),\n              body: toValue(v.body),\n              modelValue: toValue(v.modelValue),\n            })\n          }\n          return promise\n        },\n        async destroy() {\n          const item = store.value.get(_id)\n          if (!item) return\n          item.promise.stop?.()\n          if (item.modelValue) {\n            await new Promise((resolve) => {\n              item.modelValue = false\n              const prev = item['onHidden']\n              item['onHidden'] = (e) => {\n                prev?.(e)\n                resolve(e)\n              }\n              nextTick(() => {\n                item['onUpdate:modelValue']?.(false)\n              })\n            })\n          }\n          store.value.delete(_id)\n        },\n\n        async [Symbol.asyncDispose]() {\n          await this.destroy()\n        },\n      } as PromiseWithPopoverInternal)\n\n      return {\n        value: promise,\n        resolve: resolveFunc,\n      }\n    }\n\n    /**\n     * Create a popover or tooltip\n     * @param obj The popover or tooltip props\n     * @param tooltip If true, create a tooltip, otherwise create a popover\n     * @returns {PromiseWithPopover} A promise object with methods to control the popover (show, hide, toggle, get, set, destroy)\n     */\n    const create = (obj: PopoverOrchestratorCreateParam, tooltip?: boolean): PromiseWithPopover => {\n      if (!_isOrchestratorInstalled.value) {\n        throw new Error(\n          'The BPopoverOrchestrator component must be mounted to use the popover controller'\n        )\n      }\n      const {component, slots} = toValue(obj)\n      if (component) {\n        if (isRef(obj)) obj.value.component = markRaw(component)\n        else if (typeof obj === 'object') obj.component = markRaw(component)\n      }\n      if (slots) {\n        if (isRef(obj)) obj.value.slots = markRaw(slots)\n        else if (typeof obj === 'object') obj.slots = markRaw(slots)\n      }\n      const resolvedProps = toRef(obj)\n      const _self = resolvedProps.value?.id || Symbol('Popover controller')\n\n      const promise = buildPromise(_self, popovers)\n\n      promise.stop = watch(\n        resolvedProps,\n        (_newValue) => {\n          const newValue = {...toValue(_newValue)}\n          const previous = popovers.value.get(_self)\n          // if (!previous) return\n          const v: Partial<PopoverOrchestratorMapValue> = {\n            ...(previous || {}),\n          }\n\n          for (const key in newValue) {\n            if (key.startsWith('on')) {\n              v[key as keyof PopoverOrchestratorCreateParam] =\n                newValue[key as keyof PopoverOrchestratorCreateParam]\n            } else {\n              v[key as keyof PopoverOrchestratorCreateParam] = toValue(\n                newValue[key as keyof PopoverOrchestratorCreateParam]\n              )\n            }\n          }\n          popovers.value.set(_self, {\n            ...v,\n            ...(v.modelValue === undefined && {modelValue: false}),\n            'onUpdate:modelValue': (val: boolean) => {\n              newValue['onUpdate:modelValue']?.(val)\n              const {modelValue} = toValue(obj)\n              if (isRef(obj) && !isRef(modelValue)) obj.value.modelValue = val\n              if (isRef(modelValue) && !isReadonly(modelValue)) {\n                ;(modelValue as Ref<PopoverOrchestratorParam['modelValue']>).value = val\n              }\n              if (v.modelValue !== val) {\n                const popover = popovers.value.get(_self)\n                if (popover) {\n                  popover.modelValue = val\n                }\n              }\n            },\n            tooltip,\n            promise,\n          })\n        },\n        {\n          immediate: true,\n          deep: true,\n        }\n      )\n\n      onScopeDispose(() => {\n        const popover = popovers.value.get(_self)\n        if (popover) {\n          popover.promise.value.destroy?.()\n        }\n      }, true)\n\n      return promise.value\n    }\n\n    const tooltip = (obj: TooltipOrchestratorCreateParam): PromiseWithPopover => create(obj, true)\n\n    const popover = (obj: PopoverOrchestratorCreateParam): PromiseWithPopover => create(obj, false)\n\n    app.provide(popoverPluginKey, {\n      _isOrchestratorInstalled,\n      popovers,\n      tooltip,\n      popover,\n    })\n  },\n}\n"],"names":["_a","tooltip","popover"],"mappings":"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"}