{"version":3,"file":"use-collapse.mjs","names":[],"sources":["../../../../../../packages/components/collapse/src/use-collapse.ts"],"sourcesContent":["import { computed, provide, ref, watch } from 'vue'\nimport {\n  debugWarn,\n  ensureArray,\n  isBoolean,\n  isPromise,\n  throwError,\n} from '@element-plus/utils'\nimport { useNamespace } from '@element-plus/hooks'\nimport { CHANGE_EVENT, UPDATE_MODEL_EVENT } from '@element-plus/constants'\nimport { collapseContextKey } from './constants'\n\nimport type { SetupContext } from 'vue'\nimport type {\n  CollapseActiveName,\n  CollapseEmits,\n  CollapseProps,\n} from './collapse'\n\nconst SCOPE = 'ElCollapse'\nexport const useCollapse = (\n  props: CollapseProps,\n  emit: SetupContext<CollapseEmits>['emit']\n) => {\n  const activeNames = ref(ensureArray(props.modelValue))\n\n  const setActiveNames = (_activeNames: CollapseActiveName[]) => {\n    activeNames.value = _activeNames\n    const value = props.accordion ? activeNames.value[0] : activeNames.value\n    emit(UPDATE_MODEL_EVENT, value)\n    emit(CHANGE_EVENT, value)\n  }\n\n  const handleChange = (name: CollapseActiveName) => {\n    if (props.accordion) {\n      setActiveNames([activeNames.value[0] === name ? '' : name])\n    } else {\n      const _activeNames = [...activeNames.value]\n      const index = _activeNames.indexOf(name)\n\n      if (index > -1) {\n        _activeNames.splice(index, 1)\n      } else {\n        _activeNames.push(name)\n      }\n      setActiveNames(_activeNames)\n    }\n  }\n\n  const handleItemClick = async (name: CollapseActiveName) => {\n    const { beforeCollapse } = props\n    if (!beforeCollapse) {\n      handleChange(name)\n      return\n    }\n\n    const shouldChange = beforeCollapse(name)\n    const isPromiseOrBool = [\n      isPromise(shouldChange),\n      isBoolean(shouldChange),\n    ].includes(true)\n    if (!isPromiseOrBool) {\n      throwError(\n        SCOPE,\n        'beforeCollapse must return type `Promise<boolean>` or `boolean`'\n      )\n    }\n\n    if (isPromise(shouldChange)) {\n      shouldChange\n        .then((result) => {\n          if (result !== false) {\n            handleChange(name)\n          }\n        })\n        .catch((e) => {\n          debugWarn(SCOPE, `some error occurred: ${e}`)\n        })\n    } else if (shouldChange) {\n      handleChange(name)\n    }\n  }\n\n  watch(\n    () => props.modelValue,\n    () => (activeNames.value = ensureArray(props.modelValue)),\n    { deep: true }\n  )\n\n  provide(collapseContextKey, {\n    activeNames,\n    handleItemClick,\n  })\n  return {\n    activeNames,\n    setActiveNames,\n  }\n}\n\nexport const useCollapseDOM = (props: CollapseProps) => {\n  const ns = useNamespace('collapse')\n\n  const rootKls = computed(() => [\n    ns.b(),\n    ns.b(`icon-position-${props.expandIconPosition}`),\n  ])\n\n  return {\n    rootKls,\n  }\n}\n"],"mappings":";;;;;;;;AAmBA,MAAM,QAAQ;AACd,MAAa,eACX,OACA,SACG;CACH,MAAM,cAAc,IAAI,YAAY,MAAM,UAAU,CAAC;CAErD,MAAM,kBAAkB,iBAAuC;EAC7D,YAAY,QAAQ;EACpB,MAAM,QAAQ,MAAM,YAAY,YAAY,MAAM,KAAK,YAAY;EACnE,KAAK,oBAAoB,KAAK;EAC9B,KAAK,cAAc,KAAK;CAC1B;CAEA,MAAM,gBAAgB,SAA6B;EACjD,IAAI,MAAM,WACR,eAAe,CAAC,YAAY,MAAM,OAAO,OAAO,KAAK,IAAI,CAAC;OACrD;GACL,MAAM,eAAe,CAAC,GAAG,YAAY,KAAK;GAC1C,MAAM,QAAQ,aAAa,QAAQ,IAAI;GAEvC,IAAI,QAAQ,IACV,aAAa,OAAO,OAAO,CAAC;QAE5B,aAAa,KAAK,IAAI;GAExB,eAAe,YAAY;EAC7B;CACF;CAEA,MAAM,kBAAkB,OAAO,SAA6B;EAC1D,MAAM,EAAE,mBAAmB;EAC3B,IAAI,CAAC,gBAAgB;GACnB,aAAa,IAAI;GACjB;EACF;EAEA,MAAM,eAAe,eAAe,IAAI;EAKxC,IAAI,CAJoB,CACtB,UAAU,YAAY,GACtB,UAAU,YAAY,CACxB,CAAC,CAAC,SAAS,IACQ,GACjB,WACE,OACA,iEACF;EAGF,IAAI,UAAU,YAAY,GACxB,aACG,MAAM,WAAW;GAChB,IAAI,WAAW,OACb,aAAa,IAAI;EAErB,CAAC,CAAC,CACD,OAAO,MAAM;GACZ,UAAU,OAAO,wBAAwB,GAAG;EAC9C,CAAC;OACE,IAAI,cACT,aAAa,IAAI;CAErB;CAEA,YACQ,MAAM,kBACL,YAAY,QAAQ,YAAY,MAAM,UAAU,GACvD,EAAE,MAAM,KAAK,CACf;CAEA,QAAQ,oBAAoB;EAC1B;EACA;CACF,CAAC;CACD,OAAO;EACL;EACA;CACF;AACF;AAEA,MAAa,kBAAkB,UAAyB;CACtD,MAAM,KAAK,aAAa,UAAU;CAOlC,OAAO,EACL,SANc,eAAe,CAC7B,GAAG,EAAE,GACL,GAAG,EAAE,iBAAiB,MAAM,oBAAoB,CAClD,CAGQ,EACR;AACF"}