{"version":3,"file":"index.mjs","sources":["../../../../../../packages/components/infinite-scroll/src/index.ts"],"sourcesContent":["// @ts-nocheck\nimport { nextTick } from 'vue'\nimport { isFunction } from '@vue/shared'\nimport { throttle } from 'lodash-unified'\nimport {\n  getOffsetTopDistance,\n  getScrollContainer,\n  throwError,\n} from '@vuesax-plus/utils'\n\nimport type { ComponentPublicInstance, ObjectDirective } from 'vue'\n\nexport const SCOPE = 'VsInfiniteScroll'\nexport const CHECK_INTERVAL = 50\nexport const DEFAULT_DELAY = 200\nexport const DEFAULT_DISTANCE = 0\n\nconst attributes = {\n  delay: {\n    type: Number,\n    default: DEFAULT_DELAY,\n  },\n  distance: {\n    type: Number,\n    default: DEFAULT_DISTANCE,\n  },\n  disabled: {\n    type: Boolean,\n    default: false,\n  },\n  immediate: {\n    type: Boolean,\n    default: true,\n  },\n}\n\ntype Attrs = typeof attributes\ntype ScrollOptions = { [K in keyof Attrs]: Attrs[K]['default'] }\ntype InfiniteScrollCallback = () => void\ntype InfiniteScrollEl = HTMLElement & {\n  [SCOPE]: {\n    container: HTMLElement | Window\n    containerEl: HTMLElement\n    instance: ComponentPublicInstance\n    delay: number // export for test\n    lastScrollTop: number\n    cb: InfiniteScrollCallback\n    onScroll: () => void\n    observer?: MutationObserver\n  }\n}\n\nconst getScrollOptions = (\n  el: HTMLElement,\n  instance: ComponentPublicInstance\n): ScrollOptions => {\n  return Object.entries(attributes).reduce((acm, [name, option]) => {\n    const { type, default: defaultValue } = option\n    const attrVal = el.getAttribute(`infinite-scroll-${name}`)\n    let value = instance[attrVal] ?? attrVal ?? defaultValue\n    value = value === 'false' ? false : value\n    value = type(value)\n    acm[name] = Number.isNaN(value) ? defaultValue : value\n    return acm\n  }, {} as ScrollOptions)\n}\n\nconst destroyObserver = (el: InfiniteScrollEl) => {\n  const { observer } = el[SCOPE]\n\n  if (observer) {\n    observer.disconnect()\n    delete el[SCOPE].observer\n  }\n}\n\nconst handleScroll = (el: InfiniteScrollEl, cb: InfiniteScrollCallback) => {\n  const { container, containerEl, instance, observer, lastScrollTop } =\n    el[SCOPE]\n  const { disabled, distance } = getScrollOptions(el, instance)\n  const { clientHeight, scrollHeight, scrollTop } = containerEl\n  const delta = scrollTop - lastScrollTop\n\n  el[SCOPE].lastScrollTop = scrollTop\n\n  // trigger only if full check has done and not disabled and scroll down\n  if (observer || disabled || delta < 0) return\n\n  let shouldTrigger = false\n\n  if (container === el) {\n    shouldTrigger = scrollHeight - (clientHeight + scrollTop) <= distance\n  } else {\n    // get the scrollHeight since el might be visible overflow\n    const { clientTop, scrollHeight: height } = el\n    const offsetTop = getOffsetTopDistance(el, containerEl)\n    shouldTrigger =\n      scrollTop + clientHeight >= offsetTop + clientTop + height - distance\n  }\n\n  if (shouldTrigger) {\n    cb.call(instance)\n  }\n}\n\nfunction checkFull(el: InfiniteScrollEl, cb: InfiniteScrollCallback) {\n  const { containerEl, instance } = el[SCOPE]\n  const { disabled } = getScrollOptions(el, instance)\n\n  if (disabled || containerEl.clientHeight === 0) return\n\n  if (containerEl.scrollHeight <= containerEl.clientHeight) {\n    cb.call(instance)\n  } else {\n    destroyObserver(el)\n  }\n}\n\nconst InfiniteScroll: ObjectDirective<\n  InfiniteScrollEl,\n  InfiniteScrollCallback\n> = {\n  async mounted(el, binding) {\n    const { instance, value: cb } = binding\n\n    if (!isFunction(cb)) {\n      throwError(SCOPE, \"'v-infinite-scroll' binding value must be a function\")\n    }\n\n    // ensure parentNode mounted\n    await nextTick()\n\n    const { delay, immediate } = getScrollOptions(el, instance)\n    const container = getScrollContainer(el, true)\n    const containerEl =\n      container === window\n        ? document.documentElement\n        : (container as HTMLElement)\n    const onScroll = throttle(handleScroll.bind(null, el, cb), delay)\n\n    if (!container) return\n\n    el[SCOPE] = {\n      instance,\n      container,\n      containerEl,\n      delay,\n      cb,\n      onScroll,\n      lastScrollTop: containerEl.scrollTop,\n    }\n\n    if (immediate) {\n      const observer = new MutationObserver(\n        throttle(checkFull.bind(null, el, cb), CHECK_INTERVAL)\n      )\n      el[SCOPE].observer = observer\n      observer.observe(el, { childList: true, subtree: true })\n      checkFull(el, cb)\n    }\n\n    container.addEventListener('scroll', onScroll)\n  },\n  unmounted(el) {\n    const { container, onScroll } = el[SCOPE]\n\n    container?.removeEventListener('scroll', onScroll)\n    destroyObserver(el)\n  },\n  async updated(el) {\n    if (!el[SCOPE]) {\n      await nextTick()\n    }\n    const { containerEl, cb, observer } = el[SCOPE]\n    if (containerEl.clientHeight && observer) {\n      checkFull(el, cb)\n    }\n  },\n}\n\nexport default InfiniteScroll\n"],"names":[],"mappings":"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"}