{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/composables/usePopover/index.ts"],"sourcesContent":["import {\n  inject,\n  isReadonly,\n  isRef,\n  markRaw,\n  onScopeDispose,\n  type Ref,\n  shallowRef,\n  toValue,\n  watch,\n} from 'vue'\nimport {orchestratorRegistryKey} from '../../utils/keys'\nimport type {\n  OrchestratorCreateOptions,\n  PopoverOrchestratorArrayValue,\n  PopoverOrchestratorCreateParam,\n  PopoverOrchestratorParam,\n  PromiseWithComponent,\n  TooltipOrchestratorArrayValue,\n  TooltipOrchestratorCreateParam,\n  TooltipOrchestratorParam,\n} from '../../types/ComponentOrchestratorTypes'\nimport {BPopover, BTooltip} from '../../components'\nimport {buildPromise} from '../orchestratorShared'\n\nexport const usePopover = () => {\n  const orchestratorRegistry = inject(orchestratorRegistryKey, null)\n  if (!orchestratorRegistry) {\n    throw new Error(\n      'usePopover() must be called within setup(), and BApp, useRegistry or plugin must be installed/provided.'\n    )\n  }\n\n  const {store, _isOrchestratorInstalled} = orchestratorRegistry\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 {PromiseWithComponent<typeof BPopover | typeof BTooltip, PopoverOrchestratorParam>} A promise object with methods to control the popover (show, hide, toggle, get, set, destroy)\n   */\n  const create = (\n    obj: PopoverOrchestratorCreateParam | TooltipOrchestratorCreateParam,\n    tooltip?: boolean,\n    options: OrchestratorCreateOptions = {keep: true}\n  ): PromiseWithComponent<\n    typeof BPopover | typeof BTooltip,\n    PopoverOrchestratorParam | TooltipOrchestratorParam\n  > => {\n    if (!_isOrchestratorInstalled.value) {\n      throw new Error('The BApp component must be mounted to use the popover controller')\n    }\n\n    const resolvedProps = isRef(obj) ? obj : shallowRef(obj)\n    const _self = resolvedProps.value?.id || Symbol('Popover controller')\n\n    const promise = buildPromise<\n      typeof BPopover | typeof BTooltip,\n      PopoverOrchestratorParam | TooltipOrchestratorParam,\n      PopoverOrchestratorArrayValue | TooltipOrchestratorArrayValue\n    >(_self, store as Ref<PopoverOrchestratorArrayValue[] | TooltipOrchestratorArrayValue[]>)\n\n    promise.stop = watch(\n      resolvedProps,\n      (_newValue) => {\n        const newValue = {...toValue(_newValue)}\n        const previousIndex = store.value.findIndex((el) => el._self === _self)\n        const previous =\n          previousIndex === -1\n            ? {_component: tooltip ? markRaw(BTooltip) : markRaw(BPopover)}\n            : store.value[previousIndex]\n        // if (!previous) return\n        const v: PopoverOrchestratorArrayValue | TooltipOrchestratorArrayValue = tooltip\n          ? ({\n              ...previous,\n              type: 'tooltip',\n              _self,\n              position: 'popover',\n              promise,\n              options,\n            } as TooltipOrchestratorArrayValue)\n          : ({\n              ...previous,\n              type: 'popover',\n              _self,\n              position: 'popover',\n              promise,\n              options,\n            } as PopoverOrchestratorArrayValue)\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 if (key === 'component' && newValue.component) {\n            v._component = markRaw(newValue.component)\n          } else if (key === 'slots' && newValue.slots) {\n            v.slots = markRaw(newValue.slots)\n          } else {\n            v[key as keyof PopoverOrchestratorCreateParam] = toValue(\n              newValue[key as keyof PopoverOrchestratorCreateParam]\n            )\n          }\n        }\n\n        v.modelValue = v.modelValue ?? false\n        v['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 = store.value.find((el) => el._self === _self)\n            if (popover) {\n              popover.modelValue = val\n            }\n          }\n        }\n        if (previousIndex === -1) {\n          store.value.push(v)\n        } else {\n          store.value.splice(previousIndex, 1, v)\n        }\n      },\n      {\n        immediate: true,\n        deep: true,\n      }\n    )\n\n    onScopeDispose(() => {\n      const popover = store.value.find((el) => el._self === _self)\n      if (popover) {\n        popover.promise.value.destroy?.()\n      }\n    }, true)\n\n    return promise.value\n  }\n\n  const tooltip = (\n    obj: TooltipOrchestratorCreateParam,\n    options: OrchestratorCreateOptions = {keep: true}\n  ) => create(obj, true, options)\n\n  const popover = (\n    obj: PopoverOrchestratorCreateParam,\n    options: OrchestratorCreateOptions = {keep: true}\n  ) => create(obj, false, options)\n\n  return {\n    _isOrchestratorInstalled,\n    create,\n    popover,\n    tooltip,\n    store,\n  }\n}\n\n/**\n * @deprecated use usePopover() instead.\n * @returns {ReturnType<typeof usePopover>} The popover controller\n */\nexport const usePopoverController = usePopover\n"],"mappings":";;;;;;;AAyBA,IAAa,mBAAmB;CAC9B,MAAM,uBAAuB,OAAO,yBAAyB,KAAK;AAClE,KAAI,CAAC,qBACH,OAAM,IAAI,MACR,0GACD;CAGH,MAAM,EAAC,OAAO,6BAA4B;;;;;;;CAQ1C,MAAM,UACJ,KACA,SACA,UAAqC,EAAC,MAAM,MAAK,KAI9C;AACH,MAAI,CAAC,yBAAyB,MAC5B,OAAM,IAAI,MAAM,mEAAmE;EAGrF,MAAM,gBAAgB,MAAM,IAAI,GAAG,MAAM,WAAW,IAAI;EACxD,MAAM,QAAQ,cAAc,OAAO,MAAM,OAAO,qBAAqB;EAErE,MAAM,UAAU,aAId,OAAO,MAAgF;AAEzF,UAAQ,OAAO,MACb,gBACC,cAAc;GACb,MAAM,WAAW,EAAC,GAAG,QAAQ,UAAU,EAAC;GACxC,MAAM,gBAAgB,MAAM,MAAM,WAAW,OAAO,GAAG,UAAU,MAAM;GACvE,MAAM,WACJ,kBAAkB,KACd,EAAC,YAAY,UAAU,QAAQ,iBAAS,GAAG,QAAQ,iBAAS,EAAC,GAC7D,MAAM,MAAM;GAElB,MAAM,IAAmE,UACpE;IACC,GAAG;IACH,MAAM;IACN;IACA,UAAU;IACV;IACA;IACD,GACA;IACC,GAAG;IACH,MAAM;IACN;IACA,UAAU;IACV;IACA;IACD;AAEL,QAAK,MAAM,OAAO,SAChB,KAAI,IAAI,WAAW,KAAK,CACtB,GAAE,OACA,SAAS;YACF,QAAQ,eAAe,SAAS,UACzC,GAAE,aAAa,QAAQ,SAAS,UAAU;YACjC,QAAQ,WAAW,SAAS,MACrC,GAAE,QAAQ,QAAQ,SAAS,MAAM;OAEjC,GAAE,OAA+C,QAC/C,SAAS,KACV;AAIL,KAAE,aAAa,EAAE,cAAc;AAC/B,KAAE,0BAA0B,QAAiB;AAC3C,aAAS,yBAAyB,IAAI;IACtC,MAAM,EAAC,eAAc,QAAQ,IAAI;AACjC,QAAI,MAAM,IAAI,IAAI,CAAC,MAAM,WAAW,CAAE,KAAI,MAAM,aAAa;AAC7D,QAAI,MAAM,WAAW,IAAI,CAAC,WAAW,WAAW,CAC5C,YAA2D,QAAQ;AAEvE,QAAI,EAAE,eAAe,KAAK;KACxB,MAAM,UAAU,MAAM,MAAM,MAAM,OAAO,GAAG,UAAU,MAAM;AAC5D,SAAI,QACF,SAAQ,aAAa;;;AAI3B,OAAI,kBAAkB,GACpB,OAAM,MAAM,KAAK,EAAE;OAEnB,OAAM,MAAM,OAAO,eAAe,GAAG,EAAE;KAG3C;GACE,WAAW;GACX,MAAM;GACP,CACF;AAED,uBAAqB;GACnB,MAAM,UAAU,MAAM,MAAM,MAAM,OAAO,GAAG,UAAU,MAAM;AAC5D,OAAI,QACF,SAAQ,QAAQ,MAAM,WAAW;KAElC,KAAK;AAER,SAAO,QAAQ;;CAGjB,MAAM,WACJ,KACA,UAAqC,EAAC,MAAM,MAAK,KAC9C,OAAO,KAAK,MAAM,QAAQ;CAE/B,MAAM,WACJ,KACA,UAAqC,EAAC,MAAM,MAAK,KAC9C,OAAO,KAAK,OAAO,QAAQ;AAEhC,QAAO;EACL;EACA;EACA;EACA;EACA;EACD;;;;;;AAOH,IAAa,uBAAuB"}