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