{"version":3,"file":"index.mjs","sources":["../../../../packages/hooks/use-model-toggle/index.ts"],"sourcesContent":["import {\n  computed,\n  getCurrentInstance,\n  watch,\n  onMounted,\n  type PropType\n} from 'vue'\nimport { isFunction } from '@vue/shared'\nimport { isClient } from '@vueuse/core'\nimport { isBoolean } from '@element-ultra/utils'\nimport type { RouteLocationNormalizedLoaded } from 'vue-router'\n\nimport type { Ref, ComponentPublicInstance, ExtractPropTypes } from 'vue'\n\nconst _prop = {\n  type: Boolean as PropType<boolean | null>,\n  default: null\n}\nconst _event = {\n  type: Function as PropType<(val: boolean) => void>\n}\n\ntype _UseModelToggleProps<T extends string> = {\n  [K in T]: typeof _prop\n} & {\n  [K in `onUpdate:${T}`]: typeof _event\n}\n\nexport const createModelToggleComposable = <T extends string>(name: T) => {\n  const useModelToggleProps = {\n    [name]: _prop,\n    [`onUpdate:${name}`]: _event\n  } as _UseModelToggleProps<T>\n\n  const useModelToggleEmits = [`update:${name}`]\n\n  const useModelToggle = ({\n    indicator,\n    shouldHideWhenRouteChanges,\n    shouldProceed,\n    onShow,\n    onHide\n  }: ModelToggleParams) => {\n    const instance = getCurrentInstance()!\n    const props = instance.props as _UseModelToggleProps<T> & {\n      disabled: boolean\n    }\n    const { emit } = instance\n\n    const updateEventKey = `update:${name}`\n\n    const hasUpdateHandler = computed(() =>\n      isFunction(props[`onUpdate:${name}`])\n    )\n    // when it matches the default value we say this is absent\n    // though this could be mistakenly passed from the user but we need to rule out that\n    // condition\n    const isModelBindingAbsent = computed(() => props[name] === null)\n\n    const doShow = () => {\n      if (indicator.value === true) {\n        return\n      }\n\n      indicator.value = true\n      if (isFunction(onShow)) {\n        onShow()\n      }\n    }\n\n    const doHide = () => {\n      if (indicator.value === false) {\n        return\n      }\n\n      indicator.value = false\n\n      if (isFunction(onHide)) {\n        onHide()\n      }\n    }\n\n    const show = () => {\n      if (\n        props.disabled === true ||\n        (isFunction(shouldProceed) && !shouldProceed())\n      )\n        return\n\n      const shouldEmit = hasUpdateHandler.value && isClient\n\n      if (shouldEmit) {\n        emit(updateEventKey, true)\n      }\n\n      if (isModelBindingAbsent.value || !shouldEmit) {\n        doShow()\n      }\n    }\n\n    const hide = () => {\n      if (props.disabled === true || !isClient) return\n\n      const shouldEmit = hasUpdateHandler.value && isClient\n\n      if (shouldEmit) {\n        emit(updateEventKey, false)\n      }\n\n      if (isModelBindingAbsent.value || !shouldEmit) {\n        doHide()\n      }\n    }\n\n    const onChange = (val: boolean) => {\n      if (!isBoolean(val)) return\n      if (props.disabled && val) {\n        if (hasUpdateHandler.value) {\n          emit(updateEventKey, false)\n        }\n      } else if (indicator.value !== val) {\n        if (val) {\n          doShow()\n        } else {\n          doHide()\n        }\n      }\n    }\n\n    const toggle = () => {\n      if (indicator.value) {\n        hide()\n      } else {\n        show()\n      }\n    }\n\n    watch(() => props[name], onChange as any)\n\n    if (\n      shouldHideWhenRouteChanges &&\n      instance.appContext.config.globalProperties.$route !== undefined\n    ) {\n      watch(\n        () => ({\n          ...(\n            instance.proxy as ComponentPublicInstance<{\n              $route: RouteLocationNormalizedLoaded\n            }>\n          ).$route\n        }),\n        () => {\n          if (shouldHideWhenRouteChanges.value && indicator.value) {\n            hide()\n          }\n        }\n      )\n    }\n\n    onMounted(() => {\n      onChange(props[name] as boolean)\n    })\n\n    return {\n      hide,\n      show,\n      toggle\n    }\n  }\n\n  return {\n    useModelToggle,\n    useModelToggleProps,\n    useModelToggleEmits\n  }\n}\n\nconst { useModelToggle, useModelToggleProps, useModelToggleEmits } =\n  createModelToggleComposable('modelValue')\n\nexport { useModelToggle, useModelToggleEmits, useModelToggleProps }\n\nexport type UseModelToggleProps = ExtractPropTypes<typeof useModelToggleProps>\n\nexport type ModelToggleParams = {\n  indicator: Ref<boolean>\n  shouldHideWhenRouteChanges?: Ref<boolean>\n  shouldProceed?: () => boolean\n  onShow?: () => void\n  onHide?: () => void\n}\n"],"names":["useModelToggleProps","useModelToggleEmits","useModelToggle"],"mappings":"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"}