{"version":3,"file":"hooks.mjs","sources":["../../../../../../packages/components/list/src/hooks.ts"],"sourcesContent":["import { computed, h, nextTick, ref } from 'vue'\nimport { useLocale } from 'element-plus'\nimport { isFunction } from '@element-plus/utils'\nimport { DIV_TAG } from '@element-plus/constants'\nimport LoadMore from '@element-plus/components/load-more'\nimport type { Ref } from 'vue'\n\ninterface LoadFnOptions {\n  successCallback?: () => void\n  errorCallback?: () => void\n  finallyCallback?: () => void\n}\ntype DirectionType = 'top' | 'bottom'\n\ninterface Options {\n  direction: DirectionType\n  handleError?: () => void\n}\n\nexport const useLoad = (\n  props: Record<string, Ref<any>>,\n  options: Options = {\n    direction: 'bottom',\n  }\n) => {\n  const {\n    load,\n    preLoad,\n    finished,\n    loadingText,\n    errorText,\n    noMoreText,\n    infiniteScrollDistance,\n  } = props\n  const { t } = useLocale()\n  const loading = ref(false)\n  const error = ref(false)\n\n  const isBottomDirection = options.direction === 'bottom'\n\n  const hasLoad = computed(() =>\n    isBottomDirection\n      ? load.value && isFunction(load.value)\n      : preLoad.value && isFunction(preLoad.value)\n  )\n\n  const shouldRenderLoading = computed(\n    () => hasLoad.value && loading.value && !error.value && !finished.value\n  )\n  const shouldRenderError = computed(\n    () => hasLoad.value && error.value && !finished.value\n  )\n  const shouldRenderFinished = computed(() => hasLoad.value && finished.value)\n\n  const calcLoadingText = computed(\n    () => loadingText.value ?? t('epx.loadMore.loadingText')\n  )\n  const calcErrorText = computed(\n    () => errorText.value ?? t('epx.loadMore.errorText')\n  )\n  const calcFinishedText = computed(\n    () => noMoreText.value ?? t('epx.loadMore.noMoreText')\n  )\n\n  const status = computed(() => {\n    let status = ''\n    if (shouldRenderLoading.value) {\n      status = 'loading'\n    }\n    if (shouldRenderFinished.value) {\n      status = 'noMore'\n    }\n    if (shouldRenderError.value) {\n      status = 'error'\n    }\n    return status\n  })\n\n  const handleLoad = async (\n    shouldTrigger: boolean,\n    options?: LoadFnOptions\n  ) => {\n    if (\n      shouldTrigger &&\n      hasLoad.value &&\n      !loading.value &&\n      !finished.value &&\n      !error.value\n    ) {\n      try {\n        loading.value = true\n        error.value = false\n        await load.value?.()\n        options?.successCallback?.()\n      } catch {\n        error.value = true\n        options?.errorCallback?.()\n      } finally {\n        loading.value = false\n        options?.finallyCallback?.()\n      }\n    }\n  }\n\n  const cache = {\n    scrollHeight: 0,\n  }\n  const recordCache = (target: HTMLDivElement) => {\n    cache.scrollHeight = target?.scrollHeight ?? 0\n  }\n  const fixedScrollbarPosition = (target: HTMLDivElement) => {\n    nextTick(() => {\n      if (target) {\n        const scrollHeight = target.scrollHeight ?? 0\n        const oldScrollHeight = cache.scrollHeight\n        target.scrollTop = Math.max(scrollHeight - oldScrollHeight, 0)\n      }\n    })\n  }\n\n  const handlePreLoad = async (\n    shouldTrigger: boolean,\n    target: HTMLDivElement\n  ) => {\n    if (\n      shouldTrigger &&\n      hasLoad.value &&\n      !loading.value &&\n      !finished.value &&\n      !error.value\n    ) {\n      try {\n        loading.value = true\n        error.value = false\n        recordCache(target)\n        await preLoad.value?.()\n      } catch {\n        error.value = true\n      } finally {\n        loading.value = false\n        fixedScrollbarPosition(target)\n      }\n    }\n  }\n\n  const handleClickError = (type: string) => {\n    if (type === 'error') {\n      loading.value = false\n      error.value = false\n      options.handleError?.()\n    }\n  }\n\n  const renderLoadMore = (placeholder: boolean = false) => {\n    const loadMoreVNode =\n      hasLoad.value && status.value\n        ? h(LoadMore, {\n            status: status.value,\n            loadingText: calcLoadingText.value,\n            noMoreText: calcFinishedText.value,\n            errorText: calcErrorText.value,\n            onClick: handleClickError,\n          })\n        : ''\n    return placeholder && hasLoad.value\n      ? h(\n          DIV_TAG,\n          {\n            style: {\n              height: '36px',\n            },\n          },\n          [loadMoreVNode]\n        )\n      : loadMoreVNode\n  }\n\n  let preScrollTop = 0\n  const isShouldTrigger = (target: HTMLElement) => {\n    const { scrollHeight, scrollTop, clientHeight } = target\n    if (isBottomDirection) {\n      const isDownward = scrollTop > preScrollTop // 向下滚动\n      preScrollTop = scrollTop\n\n      const shouldTrigger =\n        scrollHeight - (scrollTop + clientHeight) < infiniteScrollDistance.value\n      return isDownward && shouldTrigger\n    } else {\n      return scrollTop === 0\n    }\n  }\n\n  return {\n    handleLoad,\n    handlePreLoad,\n    renderLoadMore,\n    isShouldTrigger,\n  }\n}\n"],"names":["status","options","LoadMore"],"mappings":";;;;;;AAmBa,MAAA,OAAA,GAAU,CACrB,KAAA,EACA,OAAmB,GAAA;AAAA,EACjB,SAAW,EAAA,QAAA;AACb,CACG,KAAA;AACH,EAAM,MAAA;AAAA,IACJ,IAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,sBAAA;AAAA,GACE,GAAA,KAAA,CAAA;AACJ,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,SAAU,EAAA,CAAA;AACxB,EAAM,MAAA,OAAA,GAAU,IAAI,KAAK,CAAA,CAAA;AACzB,EAAM,MAAA,KAAA,GAAQ,IAAI,KAAK,CAAA,CAAA;AAEvB,EAAM,MAAA,iBAAA,GAAoB,QAAQ,SAAc,KAAA,QAAA,CAAA;AAEhD,EAAA,MAAM,OAAU,GAAA,QAAA;AAAA,IAAS,MACvB,iBAAA,GACI,IAAK,CAAA,KAAA,IAAS,UAAW,CAAA,IAAA,CAAK,KAAK,CAAA,GACnC,OAAQ,CAAA,KAAA,IAAS,UAAW,CAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,GAC/C,CAAA;AAEA,EAAA,MAAM,mBAAsB,GAAA,QAAA;AAAA,IAC1B,MAAM,QAAQ,KAAS,IAAA,OAAA,CAAQ,SAAS,CAAC,KAAA,CAAM,KAAS,IAAA,CAAC,QAAS,CAAA,KAAA;AAAA,GACpE,CAAA;AACA,EAAA,MAAM,iBAAoB,GAAA,QAAA;AAAA,IACxB,MAAM,OAAQ,CAAA,KAAA,IAAS,KAAM,CAAA,KAAA,IAAS,CAAC,QAAS,CAAA,KAAA;AAAA,GAClD,CAAA;AACA,EAAA,MAAM,uBAAuB,QAAS,CAAA,MAAM,OAAQ,CAAA,KAAA,IAAS,SAAS,KAAK,CAAA,CAAA;AAE3E,EAAA,MAAM,eAAkB,GAAA,QAAA;AAAA,IACtB,MAAG;AAvDP,MAAA,IAAA,EAAA,CAAA;AAuDU,MAAY,OAAA,CAAA,EAAA,GAAA,WAAA,CAAA,KAAA,KAAZ,IAAqB,GAAA,EAAA,GAAA,CAAA,CAAE,0BAA0B,CAAA,CAAA;AAAA,KAAA;AAAA,GACzD,CAAA;AACA,EAAA,MAAM,aAAgB,GAAA,QAAA;AAAA,IACpB,MAAG;AA1DP,MAAA,IAAA,EAAA,CAAA;AA0DU,MAAU,OAAA,CAAA,EAAA,GAAA,SAAA,CAAA,KAAA,KAAV,IAAmB,GAAA,EAAA,GAAA,CAAA,CAAE,wBAAwB,CAAA,CAAA;AAAA,KAAA;AAAA,GACrD,CAAA;AACA,EAAA,MAAM,gBAAmB,GAAA,QAAA;AAAA,IACvB,MAAG;AA7DP,MAAA,IAAA,EAAA,CAAA;AA6DU,MAAW,OAAA,CAAA,EAAA,GAAA,UAAA,CAAA,KAAA,KAAX,IAAoB,GAAA,EAAA,GAAA,CAAA,CAAE,yBAAyB,CAAA,CAAA;AAAA,KAAA;AAAA,GACvD,CAAA;AAEA,EAAM,MAAA,MAAA,GAAS,SAAS,MAAM;AAC5B,IAAA,IAAIA,OAAS,GAAA,EAAA,CAAA;AACb,IAAA,IAAI,oBAAoB,KAAO,EAAA;AAC7B,MAAAA,OAAS,GAAA,SAAA,CAAA;AAAA,KACX;AACA,IAAA,IAAI,qBAAqB,KAAO,EAAA;AAC9B,MAAAA,OAAS,GAAA,QAAA,CAAA;AAAA,KACX;AACA,IAAA,IAAI,kBAAkB,KAAO,EAAA;AAC3B,MAAAA,OAAS,GAAA,OAAA,CAAA;AAAA,KACX;AACA,IAAOA,OAAAA,OAAAA,CAAAA;AAAA,GACR,CAAA,CAAA;AAED,EAAM,MAAA,UAAA,GAAa,OACjB,aAAA,EACAC,QACG,KAAA;AAjFP,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAkFI,IACE,IAAA,aAAA,IACA,OAAQ,CAAA,KAAA,IACR,CAAC,OAAA,CAAQ,KACT,IAAA,CAAC,QAAS,CAAA,KAAA,IACV,CAAC,KAAA,CAAM,KACP,EAAA;AACA,MAAI,IAAA;AACF,QAAA,OAAA,CAAQ,KAAQ,GAAA,IAAA,CAAA;AAChB,QAAA,KAAA,CAAM,KAAQ,GAAA,KAAA,CAAA;AACd,QAAA,OAAA,CAAM,UAAK,KAAL,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA;AACN,QAAA,CAAA,EAAA,GAAAA,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,QAAS,CAAA,eAAA,KAAT,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,EAAAA,CAAAA,IAAAA,CAAAA,QAAAA,CAAAA,CAAAA;AAAA,eACM,CAAN,EAAA;AACA,QAAA,KAAA,CAAM,KAAQ,GAAA,IAAA,CAAA;AACd,QAAA,CAAA,EAAA,GAAAA,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,QAAS,CAAA,aAAA,KAAT,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,EAAAA,CAAAA,IAAAA,CAAAA,QAAAA,CAAAA,CAAAA;AAAA,OACA,SAAA;AACA,QAAA,OAAA,CAAQ,KAAQ,GAAA,KAAA,CAAA;AAChB,QAAA,CAAA,EAAA,GAAAA,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,QAAS,CAAA,eAAA,KAAT,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,EAAAA,CAAAA,IAAAA,CAAAA,QAAAA,CAAAA,CAAAA;AAAA,OACF;AAAA,KACF;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,KAAQ,GAAA;AAAA,IACZ,YAAc,EAAA,CAAA;AAAA,GAChB,CAAA;AACA,EAAM,MAAA,WAAA,GAAc,CAAC,MAA2B,KAAA;AA3GlD,IAAA,IAAA,EAAA,CAAA;AA4GI,IAAM,KAAA,CAAA,YAAA,GAAA,CAAe,EAAQ,GAAA,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAA,YAAA,KAAR,IAAwB,GAAA,EAAA,GAAA,CAAA,CAAA;AAAA,GAC/C,CAAA;AACA,EAAM,MAAA,sBAAA,GAAyB,CAAC,MAA2B,KAAA;AACzD,IAAA,QAAA,CAAS,MAAM;AA/GnB,MAAA,IAAA,EAAA,CAAA;AAgHM,MAAA,IAAI,MAAQ,EAAA;AACV,QAAM,MAAA,YAAA,GAAA,CAAe,EAAO,GAAA,MAAA,CAAA,YAAA,KAAP,IAAuB,GAAA,EAAA,GAAA,CAAA,CAAA;AAC5C,QAAA,MAAM,kBAAkB,KAAM,CAAA,YAAA,CAAA;AAC9B,QAAA,MAAA,CAAO,SAAY,GAAA,IAAA,CAAK,GAAI,CAAA,YAAA,GAAe,iBAAiB,CAAC,CAAA,CAAA;AAAA,OAC/D;AAAA,KACD,CAAA,CAAA;AAAA,GACH,CAAA;AAEA,EAAM,MAAA,aAAA,GAAgB,OACpB,aAAA,EACA,MACG,KAAA;AA3HP,IAAA,IAAA,EAAA,CAAA;AA4HI,IACE,IAAA,aAAA,IACA,OAAQ,CAAA,KAAA,IACR,CAAC,OAAA,CAAQ,KACT,IAAA,CAAC,QAAS,CAAA,KAAA,IACV,CAAC,KAAA,CAAM,KACP,EAAA;AACA,MAAI,IAAA;AACF,QAAA,OAAA,CAAQ,KAAQ,GAAA,IAAA,CAAA;AAChB,QAAA,KAAA,CAAM,KAAQ,GAAA,KAAA,CAAA;AACd,QAAA,WAAA,CAAY,MAAM,CAAA,CAAA;AAClB,QAAA,OAAA,CAAM,aAAQ,KAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,OAAA,CAAA,CAAA,CAAA;AAAA,eACA,CAAN,EAAA;AACA,QAAA,KAAA,CAAM,KAAQ,GAAA,IAAA,CAAA;AAAA,OACd,SAAA;AACA,QAAA,OAAA,CAAQ,KAAQ,GAAA,KAAA,CAAA;AAChB,QAAA,sBAAA,CAAuB,MAAM,CAAA,CAAA;AAAA,OAC/B;AAAA,KACF;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,gBAAA,GAAmB,CAAC,IAAiB,KAAA;AAjJ7C,IAAA,IAAA,EAAA,CAAA;AAkJI,IAAA,IAAI,SAAS,OAAS,EAAA;AACpB,MAAA,OAAA,CAAQ,KAAQ,GAAA,KAAA,CAAA;AAChB,MAAA,KAAA,CAAM,KAAQ,GAAA,KAAA,CAAA;AACd,MAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,WAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,OAAA,CAAA,CAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,cAAA,GAAiB,CAAC,WAAA,GAAuB,KAAU,KAAA;AACvD,IAAA,MAAM,gBACJ,OAAQ,CAAA,KAAA,IAAS,MAAO,CAAA,KAAA,GACpB,EAAEC,UAAU,EAAA;AAAA,MACV,QAAQ,MAAO,CAAA,KAAA;AAAA,MACf,aAAa,eAAgB,CAAA,KAAA;AAAA,MAC7B,YAAY,gBAAiB,CAAA,KAAA;AAAA,MAC7B,WAAW,aAAc,CAAA,KAAA;AAAA,MACzB,OAAS,EAAA,gBAAA;AAAA,KACV,CACD,GAAA,EAAA,CAAA;AACN,IAAO,OAAA,WAAA,IAAe,QAAQ,KAC1B,GAAA,CAAA;AAAA,MACE,OAAA;AAAA,MACA;AAAA,QACE,KAAO,EAAA;AAAA,UACL,MAAQ,EAAA,MAAA;AAAA,SACV;AAAA,OACF;AAAA,MACA,CAAC,aAAa,CAAA;AAAA,KAEhB,GAAA,aAAA,CAAA;AAAA,GACN,CAAA;AAEA,EAAA,IAAI,YAAe,GAAA,CAAA,CAAA;AACnB,EAAM,MAAA,eAAA,GAAkB,CAAC,MAAwB,KAAA;AAC/C,IAAA,MAAM,EAAE,YAAA,EAAc,SAAW,EAAA,YAAA,EAAiB,GAAA,MAAA,CAAA;AAClD,IAAA,IAAI,iBAAmB,EAAA;AACrB,MAAA,MAAM,aAAa,SAAY,GAAA,YAAA,CAAA;AAC/B,MAAe,YAAA,GAAA,SAAA,CAAA;AAEf,MAAA,MAAM,aACJ,GAAA,YAAA,IAAgB,SAAY,GAAA,YAAA,CAAA,GAAgB,sBAAuB,CAAA,KAAA,CAAA;AACrE,MAAA,OAAO,UAAc,IAAA,aAAA,CAAA;AAAA,KAChB,MAAA;AACL,MAAA,OAAO,SAAc,KAAA,CAAA,CAAA;AAAA,KACvB;AAAA,GACF,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,UAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,GACF,CAAA;AACF;;;;"}