{"version":3,"file":"useScrollTo.cjs","sources":["../../../../../../../packages/vue-components/vc-virtual-list/src/hooks/useScrollTo.tsx"],"sourcesContent":["import type { Ref, ShallowRef } from 'vue';\nimport type { GetKey } from '../interface';\nimport type { CacheMap } from './useHeights';\nimport { raf } from '@antdv/utils';\n\nexport default function useScrollTo(\n  containerRef: Ref<Element | undefined>,\n  mergedData: ShallowRef<any[]>,\n  heights: CacheMap,\n  props,\n  getKey: GetKey,\n  collectHeight: () => void,\n  syncScrollTop: (newTop: number) => void,\n  triggerFlash: () => void,\n) {\n  let scroll: number;\n\n  return (arg?: any) => {\n    // When not argument provided, we think dev may want to show the scrollbar\n    if (arg === null || arg === undefined) {\n      triggerFlash();\n      return;\n    }\n\n    // Normal scroll logic\n    raf.cancel(scroll!);\n    const data = mergedData.value;\n    const itemHeight = props.itemHeight;\n    if (typeof arg === 'number') {\n      syncScrollTop(arg);\n    } else if (arg && typeof arg === 'object') {\n      let index: number;\n      const { align } = arg;\n\n      if ('index' in arg)\n        ({ index } = arg);\n      else\n        index = data.findIndex((item: object) => getKey(item) === arg.key);\n\n      const { offset = 0 } = arg;\n\n      // We will retry 3 times in case dynamic height shaking\n      const syncScroll = (times: number, targetAlign?: 'top' | 'bottom') => {\n        if (times < 0 || !containerRef.value) return;\n\n        const height = containerRef.value.clientHeight;\n        let needCollectHeight = false;\n        let newTargetAlign = targetAlign;\n\n        // Go to next frame if height not exist\n        if (height) {\n          const mergedAlign = targetAlign || align;\n\n          // Get top & bottom\n          let stackTop = 0;\n          let itemTop = 0;\n          let itemBottom = 0;\n\n          const maxLen = Math.min(data.length, index);\n          for (let i = 0; i <= maxLen; i += 1) {\n            const key = getKey(data[i]);\n            itemTop = stackTop;\n            const cacheHeight = heights.get(key);\n            itemBottom = itemTop + (cacheHeight === undefined ? itemHeight : cacheHeight);\n\n            stackTop = itemBottom;\n\n            if (i === index && cacheHeight === undefined)\n              needCollectHeight = true;\n          }\n          const scrollTop = containerRef.value.scrollTop;\n          // Scroll to\n          let targetTop: number | null = null;\n\n          switch (mergedAlign) {\n            case 'top':\n              targetTop = itemTop - offset;\n              break;\n            case 'bottom':\n              targetTop = itemBottom - height + offset;\n              break;\n\n            default: {\n              const scrollBottom = scrollTop + height;\n              if (itemTop < scrollTop)\n                newTargetAlign = 'top';\n              else if (itemBottom > scrollBottom)\n                newTargetAlign = 'bottom';\n            }\n          }\n\n          if (targetTop !== null && targetTop !== scrollTop)\n            syncScrollTop(targetTop);\n        }\n\n        // We will retry since element may not sync height as it described\n        scroll = raf(() => {\n          if (needCollectHeight)\n            collectHeight();\n\n          syncScroll(times - 1, newTargetAlign);\n        }, 2);\n      };\n\n      syncScroll(5);\n    }\n  };\n}\n"],"names":["useScrollTo","containerRef","mergedData","heights","props","getKey","collectHeight","syncScrollTop","triggerFlash","scroll","arg","undefined","raf","cancel","data","value","itemHeight","index","align","findIndex","item","key","offset","syncScroll","times","targetAlign","height","clientHeight","needCollectHeight","newTargetAlign","mergedAlign","stackTop","itemTop","itemBottom","maxLen","Math","min","length","i","cacheHeight","get","scrollTop","targetTop","scrollBottom"],"mappings":"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"}