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