@tanstack/virtual-core 3.0.0-beta.22 → 3.0.0-beta.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/index.d.ts +113 -0
- package/build/{esm/index.js → lib/index.esm.js} +44 -198
- package/build/lib/index.esm.js.map +1 -0
- package/build/{cjs → lib}/index.js +41 -157
- package/build/lib/index.js.map +1 -0
- package/build/lib/index.mjs +504 -0
- package/build/lib/index.mjs.map +1 -0
- package/build/lib/utils.d.ts +7 -0
- package/build/lib/utils.esm.js +48 -0
- package/build/lib/utils.esm.js.map +1 -0
- package/build/{cjs → lib}/utils.js +4 -9
- package/build/{cjs → lib}/utils.js.map +1 -1
- package/build/lib/utils.mjs +48 -0
- package/build/lib/utils.mjs.map +1 -0
- package/build/umd/index.development.js +45 -166
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +1 -1
- package/build/umd/index.production.js.map +1 -1
- package/package.json +15 -11
- package/src/index.ts +59 -78
- package/build/cjs/index.js.map +0 -1
- package/build/esm/index.js.map +0 -1
- package/build/stats.html +0 -2689
- package/build/stats.json +0 -76
- package/build/types/index.d.ts +0 -131
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../src/index.ts"],"sourcesContent":["import { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ntype ScrollBehavior = 'auto' | 'smooth'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n behavior?: ScrollBehavior\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\nexport interface VirtualItem {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = new ResizeObserver((entries) => {\n cb({\n width: entries[0]?.contentRect.width as number,\n height: entries[0]?.contentRect.height as number,\n })\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe(instance.scrollElement)\n\n return () => {\n observer.unobserve(instance.scrollElement)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n const offset =\n instance.scrollElement[instance.options.horizontal ? propX : propY]\n\n cb(Math.max(0, offset - instance.options.scrollMargin))\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = <TItemElement extends Element>(\n element: TItemElement,\n instance: Virtualizer<any, TItemElement>,\n) => {\n return Math.round(\n element.getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ],\n )\n}\n\nexport const windowScroll = <T extends Window>(\n offset: number,\n {\n adjustments,\n behavior,\n sync,\n }: { adjustments?: number; behavior?: ScrollBehavior; sync: boolean },\n instance: Virtualizer<T, any>,\n) => {\n const toOffset =\n (sync ? offset : offset + instance.options.scrollMargin) +\n (adjustments ?? 0)\n\n instance.scrollElement?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior,\n })\n}\n\nexport const elementScroll = <T extends Element>(\n offset: number,\n {\n adjustments,\n behavior,\n sync,\n }: { adjustments?: number; behavior?: ScrollBehavior; sync: boolean },\n instance: Virtualizer<T, any>,\n) => {\n const toOffset =\n (sync ? offset : offset + instance.options.scrollMargin) +\n (adjustments ?? 0)\n\n instance.scrollElement?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement | null\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n options: { adjustments?: number; behavior?: ScrollBehavior; sync: boolean },\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n scrollMargin?: number\n scrollingDelay?: number\n indexAttribute?: string\n}\n\nexport class Virtualizer<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n isScrolling: boolean = false\n private isScrollingTimeoutId: ReturnType<typeof setTimeout> | null = null\n measurementsCache: VirtualItem[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private scrollAdjustments: number = 0\n private measureElementCache: Record<Key, TItemElement> = {}\n private getResizeObserver = (() => {\n let _ro: ResizeObserver | null = null\n\n return () => {\n if (_ro) {\n return _ro\n } else if (typeof ResizeObserver !== 'undefined') {\n return (_ro = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n this._measureElement(entry.target as TItemElement, false)\n })\n }))\n } else {\n return null\n }\n }\n })()\n range: { startIndex: number; endIndex: number } = {\n startIndex: 0,\n endIndex: 0,\n }\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n\n this.calculateRange()\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n indexAttribute: 'data-index',\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.scrollElement = null\n }\n\n _didMount = () => {\n return () => {\n this.getResizeObserver()?.disconnect()\n this.measureElementCache = {}\n\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this._scrollToOffset(this.scrollOffset, {\n adjustments: undefined,\n behavior: undefined,\n sync: true,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n if (this.scrollOffset !== offset) {\n this.scrollOffset = offset\n this.isScrolling = true\n this.scrollAdjustments = 0\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.isScrolling = false\n\n this.notify()\n }, this.options.scrollingDelay)\n } else {\n this.isScrolling = false\n this.scrollAdjustments = 0\n }\n\n this.calculateRange()\n }),\n )\n } else if (!this.isScrolling) {\n this.calculateRange()\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n const range = calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n if (\n range.startIndex !== this.range.startIndex ||\n range.endIndex !== this.range.endIndex\n ) {\n this.range = range\n this.notify()\n }\n return this.range\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.range,\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n indexFromElement = (node: TItemElement) => {\n const attributeName = this.options.indexAttribute\n const indexStr = node.getAttribute(attributeName)\n\n if (!indexStr) {\n console.warn(\n `Missing attribute name '${attributeName}={index}' on measured element.`,\n )\n return -1\n }\n\n return parseInt(indexStr, 10)\n }\n\n private _measureElement = (node: TItemElement, _sync: boolean) => {\n const index = this.indexFromElement(node)\n\n const item = this.measurementsCache[index]\n if (!item) {\n return\n }\n\n const prevNode = this.measureElementCache[item.key]\n\n const ro = this.getResizeObserver()\n\n if (!node.isConnected) {\n if (prevNode) {\n ro?.unobserve(prevNode)\n delete this.measureElementCache[item.key]\n }\n return\n }\n\n if (!prevNode || prevNode !== node) {\n if (prevNode) {\n ro?.unobserve(prevNode)\n }\n this.measureElementCache[item.key] = node\n ro?.observe(node)\n }\n\n const measuredItemSize = this.options.measureElement(node, this)\n\n const itemSize = this.itemMeasurementsCache[item.key] ?? item.size\n\n const delta = measuredItemSize - itemSize\n\n if (delta !== 0) {\n if (item.start < this.scrollOffset && this.isScrolling) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', delta)\n }\n\n this._scrollToOffset(this.scrollOffset, {\n adjustments: (this.scrollAdjustments += delta),\n behavior: undefined,\n sync: false,\n })\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n\n measureElement = (node: TItemElement | null) => {\n if (!node) {\n return\n }\n\n this._measureElement(node, true)\n }\n\n getVirtualItems = memo(\n () => [this.getIndexes(), this.getMeasurements()],\n (indexes, measurements) => {\n const virtualItems: VirtualItem[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n virtualItems.push(measurement)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n { align = 'start', behavior }: ScrollToOffsetOptions = {},\n ) => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n const options = {\n adjustments: undefined,\n behavior,\n sync: false,\n }\n if (align === 'start') {\n this._scrollToOffset(toOffset, options)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, options)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, options)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', ...rest }: ScrollToIndexOptions = {},\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n {\n adjustments,\n behavior,\n sync,\n }: {\n adjustments: number | undefined\n behavior: ScrollBehavior | undefined\n sync: boolean\n },\n ) => {\n this.options.scrollToFn(offset, { behavior, sync, adjustments }, this)\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: VirtualItem[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["defaultKeyExtractor","index","defaultRangeExtractor","range","start","Math","max","startIndex","overscan","end","min","endIndex","count","arr","i","push","memoRectCallback","instance","cb","prev","height","width","rect","options","horizontal","observeElementRect","observer","ResizeObserver","entries","contentRect","scrollElement","getBoundingClientRect","observe","unobserve","observeWindowRect","memoizedCallback","onResize","innerWidth","innerHeight","addEventListener","capture","passive","removeEventListener","scrollProps","element","window","createOffsetObserver","mode","propX","propY","prevX","prevY","scroll","offset","scrollMargin","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","round","windowScroll","adjustments","behavior","sync","toOffset","scrollTo","elementScroll","Virtualizer","constructor","opts","unsubs","isScrolling","isScrollingTimeoutId","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","scrollAdjustments","measureElementCache","getResizeObserver","_ro","forEach","entry","_measureElement","setOptions","Object","key","value","debug","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","onChange","initialRect","scrollingDelay","indexAttribute","notify","cleanup","filter","Boolean","d","_didMount","disconnect","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","undefined","scrollRect","calculateRange","clearTimeout","setTimeout","getSize","getMeasurements","memo","length","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","outerSize","getIndexes","indexFromElement","node","attributeName","indexStr","getAttribute","console","warn","parseInt","_sync","item","prevNode","ro","isConnected","measuredItemSize","itemSize","delta","info","getVirtualItems","indexes","virtualItems","k","len","measurement","scrollToOffset","align","scrollToIndex","rest","getTotalSize","scrollToFn","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
|
|
@@ -15,19 +15,19 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
15
15
|
var utils = require('./utils.js');
|
|
16
16
|
|
|
17
17
|
//
|
|
18
|
+
|
|
19
|
+
//
|
|
20
|
+
|
|
18
21
|
const defaultKeyExtractor = index => index;
|
|
19
22
|
const defaultRangeExtractor = range => {
|
|
20
23
|
const start = Math.max(range.startIndex - range.overscan, 0);
|
|
21
24
|
const end = Math.min(range.endIndex + range.overscan, range.count - 1);
|
|
22
25
|
const arr = [];
|
|
23
|
-
|
|
24
26
|
for (let i = start; i <= end; i++) {
|
|
25
27
|
arr.push(i);
|
|
26
28
|
}
|
|
27
|
-
|
|
28
29
|
return arr;
|
|
29
30
|
};
|
|
30
|
-
|
|
31
31
|
const memoRectCallback = (instance, cb) => {
|
|
32
32
|
let prev = {
|
|
33
33
|
height: -1,
|
|
@@ -37,25 +37,20 @@ const memoRectCallback = (instance, cb) => {
|
|
|
37
37
|
if (instance.options.horizontal ? rect.width !== prev.width : rect.height !== prev.height) {
|
|
38
38
|
cb(rect);
|
|
39
39
|
}
|
|
40
|
-
|
|
41
40
|
prev = rect;
|
|
42
41
|
};
|
|
43
42
|
};
|
|
44
|
-
|
|
45
43
|
const observeElementRect = (instance, cb) => {
|
|
46
44
|
const observer = new ResizeObserver(entries => {
|
|
47
45
|
var _entries$, _entries$2;
|
|
48
|
-
|
|
49
46
|
cb({
|
|
50
47
|
width: (_entries$ = entries[0]) == null ? void 0 : _entries$.contentRect.width,
|
|
51
48
|
height: (_entries$2 = entries[0]) == null ? void 0 : _entries$2.contentRect.height
|
|
52
49
|
});
|
|
53
50
|
});
|
|
54
|
-
|
|
55
51
|
if (!instance.scrollElement) {
|
|
56
52
|
return;
|
|
57
53
|
}
|
|
58
|
-
|
|
59
54
|
cb(instance.scrollElement.getBoundingClientRect());
|
|
60
55
|
observer.observe(instance.scrollElement);
|
|
61
56
|
return () => {
|
|
@@ -64,16 +59,13 @@ const observeElementRect = (instance, cb) => {
|
|
|
64
59
|
};
|
|
65
60
|
const observeWindowRect = (instance, cb) => {
|
|
66
61
|
const memoizedCallback = memoRectCallback(instance, cb);
|
|
67
|
-
|
|
68
62
|
const onResize = () => memoizedCallback({
|
|
69
63
|
width: instance.scrollElement.innerWidth,
|
|
70
64
|
height: instance.scrollElement.innerHeight
|
|
71
65
|
});
|
|
72
|
-
|
|
73
66
|
if (!instance.scrollElement) {
|
|
74
67
|
return;
|
|
75
68
|
}
|
|
76
|
-
|
|
77
69
|
onResize();
|
|
78
70
|
instance.scrollElement.addEventListener('resize', onResize, {
|
|
79
71
|
capture: false,
|
|
@@ -87,38 +79,30 @@ const scrollProps = {
|
|
|
87
79
|
element: ['scrollLeft', 'scrollTop'],
|
|
88
80
|
window: ['scrollX', 'scrollY']
|
|
89
81
|
};
|
|
90
|
-
|
|
91
82
|
const createOffsetObserver = mode => {
|
|
92
83
|
return (instance, cb) => {
|
|
93
84
|
if (!instance.scrollElement) {
|
|
94
85
|
return;
|
|
95
86
|
}
|
|
96
|
-
|
|
97
87
|
const propX = scrollProps[mode][0];
|
|
98
88
|
const propY = scrollProps[mode][1];
|
|
99
89
|
let prevX = instance.scrollElement[propX];
|
|
100
90
|
let prevY = instance.scrollElement[propY];
|
|
101
|
-
|
|
102
91
|
const scroll = () => {
|
|
103
92
|
const offset = instance.scrollElement[instance.options.horizontal ? propX : propY];
|
|
104
93
|
cb(Math.max(0, offset - instance.options.scrollMargin));
|
|
105
94
|
};
|
|
106
|
-
|
|
107
95
|
scroll();
|
|
108
|
-
|
|
109
96
|
const onScroll = e => {
|
|
110
97
|
const target = e.currentTarget;
|
|
111
98
|
const scrollX = target[propX];
|
|
112
99
|
const scrollY = target[propY];
|
|
113
|
-
|
|
114
100
|
if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {
|
|
115
101
|
scroll();
|
|
116
102
|
}
|
|
117
|
-
|
|
118
103
|
prevX = scrollX;
|
|
119
104
|
prevY = scrollY;
|
|
120
105
|
};
|
|
121
|
-
|
|
122
106
|
instance.scrollElement.addEventListener('scroll', onScroll, {
|
|
123
107
|
capture: false,
|
|
124
108
|
passive: true
|
|
@@ -128,7 +112,6 @@ const createOffsetObserver = mode => {
|
|
|
128
112
|
};
|
|
129
113
|
};
|
|
130
114
|
};
|
|
131
|
-
|
|
132
115
|
const observeElementOffset = createOffsetObserver('element');
|
|
133
116
|
const observeWindowOffset = createOffsetObserver('window');
|
|
134
117
|
const measureElement = (element, instance) => {
|
|
@@ -136,34 +119,33 @@ const measureElement = (element, instance) => {
|
|
|
136
119
|
};
|
|
137
120
|
const windowScroll = (offset, _ref, instance) => {
|
|
138
121
|
var _instance$scrollEleme;
|
|
139
|
-
|
|
140
122
|
let {
|
|
141
|
-
|
|
123
|
+
adjustments,
|
|
124
|
+
behavior,
|
|
142
125
|
sync
|
|
143
126
|
} = _ref;
|
|
144
|
-
const toOffset = sync ? offset : offset + instance.options.scrollMargin;
|
|
127
|
+
const toOffset = (sync ? offset : offset + instance.options.scrollMargin) + (adjustments ?? 0);
|
|
145
128
|
(_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo == null ? void 0 : _instance$scrollEleme.scrollTo({
|
|
146
129
|
[instance.options.horizontal ? 'left' : 'top']: toOffset,
|
|
147
|
-
behavior
|
|
130
|
+
behavior
|
|
148
131
|
});
|
|
149
132
|
};
|
|
150
133
|
const elementScroll = (offset, _ref2, instance) => {
|
|
151
134
|
var _instance$scrollEleme2;
|
|
152
|
-
|
|
153
135
|
let {
|
|
154
|
-
|
|
136
|
+
adjustments,
|
|
137
|
+
behavior,
|
|
155
138
|
sync
|
|
156
139
|
} = _ref2;
|
|
157
|
-
const toOffset = sync ? offset : offset + instance.options.scrollMargin;
|
|
140
|
+
const toOffset = (sync ? offset : offset + instance.options.scrollMargin) + (adjustments ?? 0);
|
|
158
141
|
(_instance$scrollEleme2 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme2.scrollTo == null ? void 0 : _instance$scrollEleme2.scrollTo({
|
|
159
142
|
[instance.options.horizontal ? 'left' : 'top']: toOffset,
|
|
160
|
-
behavior
|
|
143
|
+
behavior
|
|
161
144
|
});
|
|
162
145
|
};
|
|
163
146
|
class Virtualizer {
|
|
164
147
|
constructor(_opts) {
|
|
165
148
|
var _this = this;
|
|
166
|
-
|
|
167
149
|
this.unsubs = [];
|
|
168
150
|
this.scrollElement = null;
|
|
169
151
|
this.isScrolling = false;
|
|
@@ -171,9 +153,8 @@ class Virtualizer {
|
|
|
171
153
|
this.measurementsCache = [];
|
|
172
154
|
this.itemMeasurementsCache = {};
|
|
173
155
|
this.pendingMeasuredCacheIndexes = [];
|
|
174
|
-
this.
|
|
156
|
+
this.scrollAdjustments = 0;
|
|
175
157
|
this.measureElementCache = {};
|
|
176
|
-
|
|
177
158
|
this.getResizeObserver = (() => {
|
|
178
159
|
let _ro = null;
|
|
179
160
|
return () => {
|
|
@@ -190,12 +171,10 @@ class Virtualizer {
|
|
|
190
171
|
}
|
|
191
172
|
};
|
|
192
173
|
})();
|
|
193
|
-
|
|
194
174
|
this.range = {
|
|
195
175
|
startIndex: 0,
|
|
196
176
|
endIndex: 0
|
|
197
177
|
};
|
|
198
|
-
|
|
199
178
|
this.setOptions = opts => {
|
|
200
179
|
Object.entries(opts).forEach(_ref3 => {
|
|
201
180
|
let [key, value] = _ref3;
|
|
@@ -212,7 +191,6 @@ class Virtualizer {
|
|
|
212
191
|
horizontal: false,
|
|
213
192
|
getItemKey: defaultKeyExtractor,
|
|
214
193
|
rangeExtractor: defaultRangeExtractor,
|
|
215
|
-
enableSmoothScroll: true,
|
|
216
194
|
onChange: () => {},
|
|
217
195
|
measureElement,
|
|
218
196
|
initialRect: {
|
|
@@ -225,42 +203,33 @@ class Virtualizer {
|
|
|
225
203
|
...opts
|
|
226
204
|
};
|
|
227
205
|
};
|
|
228
|
-
|
|
229
206
|
this.notify = () => {
|
|
230
207
|
var _this$options$onChang, _this$options;
|
|
231
|
-
|
|
232
208
|
(_this$options$onChang = (_this$options = this.options).onChange) == null ? void 0 : _this$options$onChang.call(_this$options, this);
|
|
233
209
|
};
|
|
234
|
-
|
|
235
210
|
this.cleanup = () => {
|
|
236
211
|
this.unsubs.filter(Boolean).forEach(d => d());
|
|
237
212
|
this.unsubs = [];
|
|
238
213
|
this.scrollElement = null;
|
|
239
214
|
};
|
|
240
|
-
|
|
241
215
|
this._didMount = () => {
|
|
242
216
|
return () => {
|
|
243
217
|
var _this$getResizeObserv;
|
|
244
|
-
|
|
245
218
|
(_this$getResizeObserv = this.getResizeObserver()) == null ? void 0 : _this$getResizeObserv.disconnect();
|
|
246
219
|
this.measureElementCache = {};
|
|
247
220
|
this.cleanup();
|
|
248
221
|
};
|
|
249
222
|
};
|
|
250
|
-
|
|
251
223
|
this._willUpdate = () => {
|
|
252
224
|
const scrollElement = this.options.getScrollElement();
|
|
253
|
-
|
|
254
225
|
if (this.scrollElement !== scrollElement) {
|
|
255
226
|
this.cleanup();
|
|
256
227
|
this.scrollElement = scrollElement;
|
|
257
|
-
|
|
258
228
|
this._scrollToOffset(this.scrollOffset, {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
229
|
+
adjustments: undefined,
|
|
230
|
+
behavior: undefined,
|
|
231
|
+
sync: true
|
|
262
232
|
});
|
|
263
|
-
|
|
264
233
|
this.unsubs.push(this.options.observeElementRect(this, rect => {
|
|
265
234
|
this.scrollRect = rect;
|
|
266
235
|
this.calculateRange();
|
|
@@ -270,11 +239,10 @@ class Virtualizer {
|
|
|
270
239
|
clearTimeout(this.isScrollingTimeoutId);
|
|
271
240
|
this.isScrollingTimeoutId = null;
|
|
272
241
|
}
|
|
273
|
-
|
|
274
242
|
if (this.scrollOffset !== offset) {
|
|
275
243
|
this.scrollOffset = offset;
|
|
276
244
|
this.isScrolling = true;
|
|
277
|
-
this.
|
|
245
|
+
this.scrollAdjustments = 0;
|
|
278
246
|
this.isScrollingTimeoutId = setTimeout(() => {
|
|
279
247
|
this.isScrollingTimeoutId = null;
|
|
280
248
|
this.isScrolling = false;
|
|
@@ -282,25 +250,21 @@ class Virtualizer {
|
|
|
282
250
|
}, this.options.scrollingDelay);
|
|
283
251
|
} else {
|
|
284
252
|
this.isScrolling = false;
|
|
285
|
-
this.
|
|
253
|
+
this.scrollAdjustments = 0;
|
|
286
254
|
}
|
|
287
|
-
|
|
288
255
|
this.calculateRange();
|
|
289
256
|
}));
|
|
290
257
|
} else if (!this.isScrolling) {
|
|
291
258
|
this.calculateRange();
|
|
292
259
|
}
|
|
293
260
|
};
|
|
294
|
-
|
|
295
261
|
this.getSize = () => {
|
|
296
262
|
return this.scrollRect[this.options.horizontal ? 'width' : 'height'];
|
|
297
263
|
};
|
|
298
|
-
|
|
299
264
|
this.getMeasurements = utils.memo(() => [this.options.count, this.options.paddingStart, this.options.getItemKey, this.itemMeasurementsCache], (count, paddingStart, getItemKey, measurementsCache) => {
|
|
300
265
|
const min = this.pendingMeasuredCacheIndexes.length > 0 ? Math.min(...this.pendingMeasuredCacheIndexes) : 0;
|
|
301
266
|
this.pendingMeasuredCacheIndexes = [];
|
|
302
267
|
const measurements = this.measurementsCache.slice(0, min);
|
|
303
|
-
|
|
304
268
|
for (let i = min; i < count; i++) {
|
|
305
269
|
const key = getItemKey(i);
|
|
306
270
|
const measuredSize = measurementsCache[key];
|
|
@@ -315,7 +279,6 @@ class Virtualizer {
|
|
|
315
279
|
key
|
|
316
280
|
};
|
|
317
281
|
}
|
|
318
|
-
|
|
319
282
|
this.measurementsCache = measurements;
|
|
320
283
|
return measurements;
|
|
321
284
|
}, {
|
|
@@ -328,19 +291,18 @@ class Virtualizer {
|
|
|
328
291
|
outerSize,
|
|
329
292
|
scrollOffset
|
|
330
293
|
});
|
|
331
|
-
|
|
332
294
|
if (range.startIndex !== this.range.startIndex || range.endIndex !== this.range.endIndex) {
|
|
333
295
|
this.range = range;
|
|
334
296
|
this.notify();
|
|
335
297
|
}
|
|
336
|
-
|
|
337
298
|
return this.range;
|
|
338
299
|
}, {
|
|
339
300
|
key: process.env.NODE_ENV !== 'production' && 'calculateRange',
|
|
340
301
|
debug: () => this.options.debug
|
|
341
302
|
});
|
|
342
303
|
this.getIndexes = utils.memo(() => [this.options.rangeExtractor, this.range, this.options.overscan, this.options.count], (rangeExtractor, range, overscan, count) => {
|
|
343
|
-
return rangeExtractor({
|
|
304
|
+
return rangeExtractor({
|
|
305
|
+
...range,
|
|
344
306
|
overscan,
|
|
345
307
|
count: count
|
|
346
308
|
});
|
|
@@ -348,110 +310,84 @@ class Virtualizer {
|
|
|
348
310
|
key: process.env.NODE_ENV !== 'production' && 'getIndexes',
|
|
349
311
|
debug: () => this.options.debug
|
|
350
312
|
});
|
|
351
|
-
|
|
352
313
|
this.indexFromElement = node => {
|
|
353
314
|
const attributeName = this.options.indexAttribute;
|
|
354
315
|
const indexStr = node.getAttribute(attributeName);
|
|
355
|
-
|
|
356
316
|
if (!indexStr) {
|
|
357
|
-
console.warn(
|
|
317
|
+
console.warn(`Missing attribute name '${attributeName}={index}' on measured element.`);
|
|
358
318
|
return -1;
|
|
359
319
|
}
|
|
360
|
-
|
|
361
320
|
return parseInt(indexStr, 10);
|
|
362
321
|
};
|
|
363
|
-
|
|
364
322
|
this._measureElement = (node, _sync) => {
|
|
365
|
-
var _this$itemMeasurement;
|
|
366
|
-
|
|
367
323
|
const index = this.indexFromElement(node);
|
|
368
324
|
const item = this.measurementsCache[index];
|
|
369
|
-
|
|
370
325
|
if (!item) {
|
|
371
326
|
return;
|
|
372
327
|
}
|
|
373
|
-
|
|
374
328
|
const prevNode = this.measureElementCache[item.key];
|
|
375
329
|
const ro = this.getResizeObserver();
|
|
376
|
-
|
|
377
330
|
if (!node.isConnected) {
|
|
378
331
|
if (prevNode) {
|
|
379
332
|
ro == null ? void 0 : ro.unobserve(prevNode);
|
|
380
333
|
delete this.measureElementCache[item.key];
|
|
381
334
|
}
|
|
382
|
-
|
|
383
335
|
return;
|
|
384
336
|
}
|
|
385
|
-
|
|
386
337
|
if (!prevNode || prevNode !== node) {
|
|
387
338
|
if (prevNode) {
|
|
388
339
|
ro == null ? void 0 : ro.unobserve(prevNode);
|
|
389
340
|
}
|
|
390
|
-
|
|
391
341
|
this.measureElementCache[item.key] = node;
|
|
392
342
|
ro == null ? void 0 : ro.observe(node);
|
|
393
343
|
}
|
|
394
|
-
|
|
395
344
|
const measuredItemSize = this.options.measureElement(node, this);
|
|
396
|
-
const itemSize =
|
|
397
|
-
|
|
398
|
-
if (
|
|
399
|
-
if (item.start < this.scrollOffset) {
|
|
345
|
+
const itemSize = this.itemMeasurementsCache[item.key] ?? item.size;
|
|
346
|
+
const delta = measuredItemSize - itemSize;
|
|
347
|
+
if (delta !== 0) {
|
|
348
|
+
if (item.start < this.scrollOffset && this.isScrolling) {
|
|
400
349
|
if (process.env.NODE_ENV !== 'production' && this.options.debug) {
|
|
401
|
-
console.info('correction',
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
if (this.destinationOffset === undefined) {
|
|
405
|
-
this.scrollDelta += measuredItemSize - itemSize;
|
|
406
|
-
|
|
407
|
-
this._scrollToOffset(this.scrollOffset + this.scrollDelta, {
|
|
408
|
-
canSmooth: false,
|
|
409
|
-
sync: false,
|
|
410
|
-
requested: false
|
|
411
|
-
});
|
|
350
|
+
console.info('correction', delta);
|
|
412
351
|
}
|
|
352
|
+
this._scrollToOffset(this.scrollOffset, {
|
|
353
|
+
adjustments: this.scrollAdjustments += delta,
|
|
354
|
+
behavior: undefined,
|
|
355
|
+
sync: false
|
|
356
|
+
});
|
|
413
357
|
}
|
|
414
|
-
|
|
415
358
|
this.pendingMeasuredCacheIndexes.push(index);
|
|
416
|
-
this.itemMeasurementsCache = {
|
|
359
|
+
this.itemMeasurementsCache = {
|
|
360
|
+
...this.itemMeasurementsCache,
|
|
417
361
|
[item.key]: measuredItemSize
|
|
418
362
|
};
|
|
419
363
|
this.notify();
|
|
420
364
|
}
|
|
421
365
|
};
|
|
422
|
-
|
|
423
366
|
this.measureElement = node => {
|
|
424
367
|
if (!node) {
|
|
425
368
|
return;
|
|
426
369
|
}
|
|
427
|
-
|
|
428
370
|
this._measureElement(node, true);
|
|
429
371
|
};
|
|
430
|
-
|
|
431
372
|
this.getVirtualItems = utils.memo(() => [this.getIndexes(), this.getMeasurements()], (indexes, measurements) => {
|
|
432
373
|
const virtualItems = [];
|
|
433
|
-
|
|
434
374
|
for (let k = 0, len = indexes.length; k < len; k++) {
|
|
435
375
|
const i = indexes[k];
|
|
436
376
|
const measurement = measurements[i];
|
|
437
377
|
virtualItems.push(measurement);
|
|
438
378
|
}
|
|
439
|
-
|
|
440
379
|
return virtualItems;
|
|
441
380
|
}, {
|
|
442
381
|
key: process.env.NODE_ENV !== 'production' && 'getIndexes',
|
|
443
382
|
debug: () => this.options.debug
|
|
444
383
|
});
|
|
445
|
-
|
|
446
384
|
this.scrollToOffset = function (toOffset, _temp) {
|
|
447
385
|
let {
|
|
448
386
|
align = 'start',
|
|
449
|
-
|
|
387
|
+
behavior
|
|
450
388
|
} = _temp === void 0 ? {} : _temp;
|
|
451
389
|
const offset = _this.scrollOffset;
|
|
452
|
-
|
|
453
390
|
const size = _this.getSize();
|
|
454
|
-
|
|
455
391
|
if (align === 'auto') {
|
|
456
392
|
if (toOffset <= offset) {
|
|
457
393
|
align = 'start';
|
|
@@ -461,13 +397,11 @@ class Virtualizer {
|
|
|
461
397
|
align = 'start';
|
|
462
398
|
}
|
|
463
399
|
}
|
|
464
|
-
|
|
465
400
|
const options = {
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
401
|
+
adjustments: undefined,
|
|
402
|
+
behavior,
|
|
403
|
+
sync: false
|
|
469
404
|
};
|
|
470
|
-
|
|
471
405
|
if (align === 'start') {
|
|
472
406
|
_this._scrollToOffset(toOffset, options);
|
|
473
407
|
} else if (align === 'end') {
|
|
@@ -476,29 +410,21 @@ class Virtualizer {
|
|
|
476
410
|
_this._scrollToOffset(toOffset - size / 2, options);
|
|
477
411
|
}
|
|
478
412
|
};
|
|
479
|
-
|
|
480
413
|
this.scrollToIndex = function (index, _temp2) {
|
|
481
414
|
let {
|
|
482
415
|
align = 'auto',
|
|
483
|
-
smoothScroll = _this.options.enableSmoothScroll,
|
|
484
416
|
...rest
|
|
485
417
|
} = _temp2 === void 0 ? {} : _temp2;
|
|
486
|
-
|
|
487
418
|
const measurements = _this.getMeasurements();
|
|
488
|
-
|
|
489
419
|
const offset = _this.scrollOffset;
|
|
490
|
-
|
|
491
420
|
const size = _this.getSize();
|
|
492
|
-
|
|
493
421
|
const {
|
|
494
422
|
count
|
|
495
423
|
} = _this.options;
|
|
496
424
|
const measurement = measurements[Math.max(0, Math.min(index, count - 1))];
|
|
497
|
-
|
|
498
425
|
if (!measurement) {
|
|
499
426
|
return;
|
|
500
427
|
}
|
|
501
|
-
|
|
502
428
|
if (align === 'auto') {
|
|
503
429
|
if (measurement.end >= offset + size - _this.options.scrollPaddingEnd) {
|
|
504
430
|
align = 'end';
|
|
@@ -508,78 +434,42 @@ class Virtualizer {
|
|
|
508
434
|
return;
|
|
509
435
|
}
|
|
510
436
|
}
|
|
511
|
-
|
|
512
437
|
const toOffset = align === 'end' ? measurement.end + _this.options.scrollPaddingEnd : measurement.start - _this.options.scrollPaddingStart;
|
|
513
|
-
|
|
514
438
|
_this.scrollToOffset(toOffset, {
|
|
515
439
|
align,
|
|
516
|
-
smoothScroll,
|
|
517
440
|
...rest
|
|
518
441
|
});
|
|
519
442
|
};
|
|
520
|
-
|
|
521
443
|
this.getTotalSize = () => {
|
|
522
444
|
var _this$getMeasurements;
|
|
523
|
-
|
|
524
445
|
return (((_this$getMeasurements = this.getMeasurements()[this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || this.options.paddingStart) + this.options.paddingEnd;
|
|
525
446
|
};
|
|
526
|
-
|
|
527
447
|
this._scrollToOffset = (offset, _ref4) => {
|
|
528
448
|
let {
|
|
529
|
-
|
|
530
|
-
|
|
449
|
+
adjustments,
|
|
450
|
+
behavior,
|
|
531
451
|
sync
|
|
532
452
|
} = _ref4;
|
|
533
|
-
clearTimeout(this.scrollCheckFrame);
|
|
534
|
-
|
|
535
|
-
if (requested) {
|
|
536
|
-
this.destinationOffset = offset;
|
|
537
|
-
}
|
|
538
|
-
|
|
539
453
|
this.options.scrollToFn(offset, {
|
|
540
|
-
|
|
541
|
-
sync
|
|
454
|
+
behavior,
|
|
455
|
+
sync,
|
|
456
|
+
adjustments
|
|
542
457
|
}, this);
|
|
543
|
-
let scrollCheckFrame;
|
|
544
|
-
|
|
545
|
-
const check = () => {
|
|
546
|
-
let lastOffset = this.scrollOffset;
|
|
547
|
-
this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {
|
|
548
|
-
if (this.scrollCheckFrame !== scrollCheckFrame) {
|
|
549
|
-
return;
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
if (this.scrollOffset === lastOffset) {
|
|
553
|
-
this.destinationOffset = undefined;
|
|
554
|
-
return;
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
lastOffset = this.scrollOffset;
|
|
558
|
-
check();
|
|
559
|
-
}, 100);
|
|
560
|
-
};
|
|
561
|
-
|
|
562
|
-
check();
|
|
563
458
|
};
|
|
564
|
-
|
|
565
459
|
this.measure = () => {
|
|
566
460
|
this.itemMeasurementsCache = {};
|
|
567
461
|
this.notify();
|
|
568
462
|
};
|
|
569
|
-
|
|
570
463
|
this.setOptions(_opts);
|
|
571
464
|
this.scrollRect = this.options.initialRect;
|
|
572
465
|
this.scrollOffset = this.options.initialOffset;
|
|
573
466
|
this.calculateRange();
|
|
574
467
|
}
|
|
575
|
-
|
|
576
468
|
}
|
|
577
|
-
|
|
578
469
|
const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
|
|
579
470
|
while (low <= high) {
|
|
580
471
|
const middle = (low + high) / 2 | 0;
|
|
581
472
|
const currentValue = getCurrentValue(middle);
|
|
582
|
-
|
|
583
473
|
if (currentValue < value) {
|
|
584
474
|
low = middle + 1;
|
|
585
475
|
} else if (currentValue > value) {
|
|
@@ -588,14 +478,12 @@ const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
|
|
|
588
478
|
return middle;
|
|
589
479
|
}
|
|
590
480
|
}
|
|
591
|
-
|
|
592
481
|
if (low > 0) {
|
|
593
482
|
return low - 1;
|
|
594
483
|
} else {
|
|
595
484
|
return 0;
|
|
596
485
|
}
|
|
597
486
|
};
|
|
598
|
-
|
|
599
487
|
function calculateRange(_ref5) {
|
|
600
488
|
let {
|
|
601
489
|
measurements,
|
|
@@ -603,16 +491,12 @@ function calculateRange(_ref5) {
|
|
|
603
491
|
scrollOffset
|
|
604
492
|
} = _ref5;
|
|
605
493
|
const count = measurements.length - 1;
|
|
606
|
-
|
|
607
494
|
const getOffset = index => measurements[index].start;
|
|
608
|
-
|
|
609
495
|
const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset);
|
|
610
496
|
let endIndex = startIndex;
|
|
611
|
-
|
|
612
497
|
while (endIndex < count && measurements[endIndex].end < scrollOffset + outerSize) {
|
|
613
498
|
endIndex++;
|
|
614
499
|
}
|
|
615
|
-
|
|
616
500
|
return {
|
|
617
501
|
startIndex,
|
|
618
502
|
endIndex
|