virtual-scroller 1.7.9 → 1.9.0
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/.gitlab-ci.yml +1 -1
- package/CHANGELOG.md +71 -1
- package/README.md +434 -151
- package/bundle/index-bypass.html +1 -1
- package/bundle/index-dom.html +1 -1
- package/bundle/index-grid.html +1 -2
- package/bundle/index-scrollableContainer.html +1 -1
- package/bundle/index-tbody-scrollableContainer.html +2 -0
- package/bundle/index-tbody.html +2 -0
- package/bundle/virtual-scroller-dom.js +1 -1
- package/bundle/virtual-scroller-dom.js.map +1 -1
- package/bundle/virtual-scroller-react.js +1 -1
- package/bundle/virtual-scroller-react.js.map +1 -1
- package/bundle/virtual-scroller.js +1 -1
- package/bundle/virtual-scroller.js.map +1 -1
- package/commonjs/BeforeResize.js +315 -0
- package/commonjs/BeforeResize.js.map +1 -0
- package/commonjs/DOM/Engine.js +46 -0
- package/commonjs/DOM/Engine.js.map +1 -0
- package/commonjs/DOM/ItemsContainer.js +78 -0
- package/commonjs/DOM/ItemsContainer.js.map +1 -0
- package/commonjs/DOM/{WaitForStylesToLoad.js → ListTopOffsetWatcher.js} +71 -44
- package/commonjs/DOM/ListTopOffsetWatcher.js.map +1 -0
- package/commonjs/DOM/ScrollableContainer.js +69 -101
- package/commonjs/DOM/ScrollableContainer.js.map +1 -1
- package/commonjs/DOM/VirtualScroller.js +37 -29
- package/commonjs/DOM/VirtualScroller.js.map +1 -1
- package/commonjs/DOM/tbody.js +17 -11
- package/commonjs/DOM/tbody.js.map +1 -1
- package/commonjs/ItemHeights.js +33 -34
- package/commonjs/ItemHeights.js.map +1 -1
- package/commonjs/Layout.js +591 -216
- package/commonjs/Layout.js.map +1 -1
- package/commonjs/Layout.test.js +196 -0
- package/commonjs/Layout.test.js.map +1 -0
- package/commonjs/ListHeightMeasurement.js +124 -0
- package/commonjs/ListHeightMeasurement.js.map +1 -0
- package/commonjs/Resize.js +50 -39
- package/commonjs/Resize.js.map +1 -1
- package/commonjs/Scroll.js +139 -95
- package/commonjs/Scroll.js.map +1 -1
- package/commonjs/VirtualScroller.columns.js +43 -0
- package/commonjs/VirtualScroller.columns.js.map +1 -0
- package/commonjs/VirtualScroller.constructor.js +408 -0
- package/commonjs/VirtualScroller.constructor.js.map +1 -0
- package/commonjs/VirtualScroller.items.js +305 -0
- package/commonjs/VirtualScroller.items.js.map +1 -0
- package/commonjs/VirtualScroller.js +160 -1021
- package/commonjs/VirtualScroller.js.map +1 -1
- package/commonjs/VirtualScroller.layout.js +562 -0
- package/commonjs/VirtualScroller.layout.js.map +1 -0
- package/commonjs/VirtualScroller.onRender.js +357 -0
- package/commonjs/VirtualScroller.onRender.js.map +1 -0
- package/commonjs/VirtualScroller.resize.js +186 -0
- package/commonjs/VirtualScroller.resize.js.map +1 -0
- package/commonjs/VirtualScroller.state.js +301 -0
- package/commonjs/VirtualScroller.state.js.map +1 -0
- package/commonjs/VirtualScroller.verticalSpacing.js +65 -0
- package/commonjs/VirtualScroller.verticalSpacing.js.map +1 -0
- package/commonjs/getItemCoordinates.js.map +1 -1
- package/commonjs/getItemsDiff.js.map +1 -1
- package/commonjs/getVerticalSpacing.js +8 -8
- package/commonjs/getVerticalSpacing.js.map +1 -1
- package/commonjs/package.json +5 -0
- package/commonjs/react/VirtualScroller.js +182 -628
- package/commonjs/react/VirtualScroller.js.map +1 -1
- package/commonjs/react/useClassName.js +26 -0
- package/commonjs/react/useClassName.js.map +1 -0
- package/commonjs/react/useHandleItemsChange.js +116 -0
- package/commonjs/react/useHandleItemsChange.js.map +1 -0
- package/commonjs/react/useInstanceMethods.js +37 -0
- package/commonjs/react/useInstanceMethods.js.map +1 -0
- package/commonjs/react/useItemKeys.js +60 -0
- package/commonjs/react/useItemKeys.js.map +1 -0
- package/commonjs/react/useOnItemHeightChange.js +32 -0
- package/commonjs/react/useOnItemHeightChange.js.map +1 -0
- package/commonjs/react/useOnItemStateChange.js +32 -0
- package/commonjs/react/useOnItemStateChange.js.map +1 -0
- package/commonjs/react/useState.js +140 -0
- package/commonjs/react/useState.js.map +1 -0
- package/commonjs/react/useStyle.js +29 -0
- package/commonjs/react/useStyle.js.map +1 -0
- package/commonjs/react/useVirtualScroller.js +62 -0
- package/commonjs/react/useVirtualScroller.js.map +1 -0
- package/commonjs/react/useVirtualScrollerStartStop.js +20 -0
- package/commonjs/react/useVirtualScrollerStartStop.js.map +1 -0
- package/commonjs/test/Engine.js +23 -0
- package/commonjs/test/Engine.js.map +1 -0
- package/commonjs/test/ItemsContainer.js +127 -0
- package/commonjs/test/ItemsContainer.js.map +1 -0
- package/commonjs/test/ScrollableContainer.js +130 -0
- package/commonjs/test/ScrollableContainer.js.map +1 -0
- package/commonjs/test/VirtualScroller.js +281 -0
- package/commonjs/test/VirtualScroller.js.map +1 -0
- package/commonjs/utility/debounce.js +28 -6
- package/commonjs/utility/debounce.js.map +1 -1
- package/commonjs/utility/debug.js +51 -12
- package/commonjs/utility/debug.js.map +1 -1
- package/commonjs/utility/getStateSnapshot.js +50 -0
- package/commonjs/utility/getStateSnapshot.js.map +1 -0
- package/commonjs/utility/px.js +1 -1
- package/commonjs/utility/px.js.map +1 -1
- package/commonjs/utility/px.test.js +14 -0
- package/commonjs/utility/px.test.js.map +1 -0
- package/commonjs/utility/shallowEqual.js +1 -1
- package/commonjs/utility/shallowEqual.js.map +1 -1
- package/commonjs/utility/throttle.js.map +1 -1
- package/dom/index.cjs +4 -0
- package/dom/index.cjs.js +9 -0
- package/dom/index.d.ts +25 -0
- package/dom/index.js +1 -1
- package/dom/package.json +10 -4
- package/index.cjs +4 -0
- package/index.cjs.js +9 -0
- package/index.d.ts +99 -0
- package/index.js +1 -1
- package/modules/BeforeResize.js +305 -0
- package/modules/BeforeResize.js.map +1 -0
- package/modules/DOM/Engine.js +27 -0
- package/modules/DOM/Engine.js.map +1 -0
- package/modules/DOM/ItemsContainer.js +71 -0
- package/modules/DOM/ItemsContainer.js.map +1 -0
- package/modules/DOM/{WaitForStylesToLoad.js → ListTopOffsetWatcher.js} +72 -44
- package/modules/DOM/ListTopOffsetWatcher.js.map +1 -0
- package/modules/DOM/ScrollableContainer.js +68 -100
- package/modules/DOM/ScrollableContainer.js.map +1 -1
- package/modules/DOM/VirtualScroller.js +32 -28
- package/modules/DOM/VirtualScroller.js.map +1 -1
- package/modules/DOM/tbody.js +11 -9
- package/modules/DOM/tbody.js.map +1 -1
- package/modules/ItemHeights.js +28 -33
- package/modules/ItemHeights.js.map +1 -1
- package/modules/Layout.js +585 -214
- package/modules/Layout.js.map +1 -1
- package/modules/Layout.test.js +190 -0
- package/modules/Layout.test.js.map +1 -0
- package/modules/ListHeightMeasurement.js +117 -0
- package/modules/ListHeightMeasurement.js.map +1 -0
- package/modules/Resize.js +50 -39
- package/modules/Resize.js.map +1 -1
- package/modules/Scroll.js +139 -94
- package/modules/Scroll.js.map +1 -1
- package/modules/VirtualScroller.columns.js +36 -0
- package/modules/VirtualScroller.columns.js.map +1 -0
- package/modules/VirtualScroller.constructor.js +371 -0
- package/modules/VirtualScroller.constructor.js.map +1 -0
- package/modules/VirtualScroller.items.js +288 -0
- package/modules/VirtualScroller.items.js.map +1 -0
- package/modules/VirtualScroller.js +159 -1014
- package/modules/VirtualScroller.js.map +1 -1
- package/modules/VirtualScroller.layout.js +549 -0
- package/modules/VirtualScroller.layout.js.map +1 -0
- package/modules/VirtualScroller.onRender.js +337 -0
- package/modules/VirtualScroller.onRender.js.map +1 -0
- package/modules/VirtualScroller.resize.js +176 -0
- package/modules/VirtualScroller.resize.js.map +1 -0
- package/modules/VirtualScroller.state.js +283 -0
- package/modules/VirtualScroller.state.js.map +1 -0
- package/modules/VirtualScroller.verticalSpacing.js +54 -0
- package/modules/VirtualScroller.verticalSpacing.js.map +1 -0
- package/modules/getItemCoordinates.js.map +1 -1
- package/modules/getItemsDiff.js.map +1 -1
- package/modules/getVerticalSpacing.js +8 -8
- package/modules/getVerticalSpacing.js.map +1 -1
- package/modules/react/VirtualScroller.js +179 -634
- package/modules/react/VirtualScroller.js.map +1 -1
- package/modules/react/useClassName.js +18 -0
- package/modules/react/useClassName.js.map +1 -0
- package/modules/react/useHandleItemsChange.js +108 -0
- package/modules/react/useHandleItemsChange.js.map +1 -0
- package/modules/react/useInstanceMethods.js +28 -0
- package/modules/react/useInstanceMethods.js.map +1 -0
- package/modules/react/useItemKeys.js +52 -0
- package/modules/react/useItemKeys.js.map +1 -0
- package/modules/react/useOnItemHeightChange.js +24 -0
- package/modules/react/useOnItemHeightChange.js.map +1 -0
- package/modules/react/useOnItemStateChange.js +24 -0
- package/modules/react/useOnItemStateChange.js.map +1 -0
- package/modules/react/useState.js +132 -0
- package/modules/react/useState.js.map +1 -0
- package/modules/react/useStyle.js +19 -0
- package/modules/react/useStyle.js.map +1 -0
- package/modules/react/useVirtualScroller.js +51 -0
- package/modules/react/useVirtualScroller.js.map +1 -0
- package/modules/react/useVirtualScrollerStartStop.js +12 -0
- package/modules/react/useVirtualScrollerStartStop.js.map +1 -0
- package/modules/test/Engine.js +11 -0
- package/modules/test/Engine.js.map +1 -0
- package/modules/test/ItemsContainer.js +120 -0
- package/modules/test/ItemsContainer.js.map +1 -0
- package/modules/test/ScrollableContainer.js +123 -0
- package/modules/test/ScrollableContainer.js.map +1 -0
- package/modules/test/VirtualScroller.js +270 -0
- package/modules/test/VirtualScroller.js.map +1 -0
- package/modules/utility/debounce.js +28 -6
- package/modules/utility/debounce.js.map +1 -1
- package/modules/utility/debug.js +47 -10
- package/modules/utility/debug.js.map +1 -1
- package/modules/utility/getStateSnapshot.js +43 -0
- package/modules/utility/getStateSnapshot.js.map +1 -0
- package/modules/utility/px.js +1 -1
- package/modules/utility/px.js.map +1 -1
- package/modules/utility/px.test.js +9 -0
- package/modules/utility/px.test.js.map +1 -0
- package/modules/utility/shallowEqual.js +1 -1
- package/modules/utility/shallowEqual.js.map +1 -1
- package/modules/utility/throttle.js.map +1 -1
- package/package.json +54 -29
- package/react/index.cjs +4 -0
- package/react/index.cjs.js +9 -0
- package/react/index.d.ts +28 -0
- package/react/index.js +1 -1
- package/react/package.json +10 -4
- package/rollup.config.mjs +62 -0
- package/runnable/create-commonjs-package-json.js +11 -0
- package/source/BeforeResize.js +312 -0
- package/source/DOM/Engine.js +30 -0
- package/source/DOM/ItemsContainer.js +48 -0
- package/source/DOM/{WaitForStylesToLoad.js → ListTopOffsetWatcher.js} +61 -30
- package/source/DOM/ScrollableContainer.js +51 -73
- package/source/DOM/VirtualScroller.js +33 -18
- package/source/DOM/tbody.js +30 -21
- package/source/ItemHeights.js +27 -27
- package/source/Layout.js +629 -252
- package/source/Layout.test.js +176 -0
- package/source/ListHeightMeasurement.js +95 -0
- package/source/Resize.js +56 -32
- package/source/Scroll.js +135 -82
- package/source/VirtualScroller.columns.js +26 -0
- package/source/VirtualScroller.constructor.js +336 -0
- package/source/VirtualScroller.items.js +302 -0
- package/source/VirtualScroller.js +162 -936
- package/source/VirtualScroller.layout.js +539 -0
- package/source/VirtualScroller.onRender.js +345 -0
- package/source/VirtualScroller.resize.js +189 -0
- package/source/VirtualScroller.state.js +284 -0
- package/source/VirtualScroller.verticalSpacing.js +51 -0
- package/source/getVerticalSpacing.js +7 -7
- package/source/react/VirtualScroller.js +243 -603
- package/source/react/useClassName.js +14 -0
- package/source/react/useHandleItemsChange.js +115 -0
- package/source/react/useInstanceMethods.js +25 -0
- package/source/react/useItemKeys.js +59 -0
- package/source/react/useOnItemHeightChange.js +28 -0
- package/source/react/useOnItemStateChange.js +28 -0
- package/source/react/useState.js +114 -0
- package/source/react/useStyle.js +20 -0
- package/source/react/useVirtualScroller.js +59 -0
- package/source/react/useVirtualScrollerStartStop.js +12 -0
- package/source/test/Engine.js +11 -0
- package/source/test/ItemsContainer.js +87 -0
- package/source/test/ScrollableContainer.js +88 -0
- package/source/test/VirtualScroller.js +232 -0
- package/source/utility/debounce.js +22 -5
- package/source/utility/debug.js +34 -3
- package/source/utility/getStateSnapshot.js +36 -0
- package/source/utility/px.js +1 -1
- package/source/utility/px.test.js +9 -0
- package/website/index-bypass.html +195 -0
- package/website/index-grid.html +0 -1
- package/website/index-scrollableContainer.html +208 -0
- package/website/index-tbody-scrollableContainer.html +68 -0
- package/website/index-tbody.html +55 -0
- package/commonjs/DOM/RenderingEngine.js +0 -33
- package/commonjs/DOM/RenderingEngine.js.map +0 -1
- package/commonjs/DOM/Screen.js +0 -87
- package/commonjs/DOM/Screen.js.map +0 -1
- package/commonjs/DOM/WaitForStylesToLoad.js.map +0 -1
- package/commonjs/RestoreScroll.js +0 -118
- package/commonjs/RestoreScroll.js.map +0 -1
- package/dom/index.commonjs.js +0 -4
- package/index.commonjs.js +0 -4
- package/modules/DOM/RenderingEngine.js +0 -19
- package/modules/DOM/RenderingEngine.js.map +0 -1
- package/modules/DOM/Screen.js +0 -80
- package/modules/DOM/Screen.js.map +0 -1
- package/modules/DOM/WaitForStylesToLoad.js.map +0 -1
- package/modules/RestoreScroll.js +0 -111
- package/modules/RestoreScroll.js.map +0 -1
- package/react/index.commonjs.js +0 -4
- package/source/DOM/RenderingEngine.js +0 -22
- package/source/DOM/Screen.js +0 -51
- package/source/RestoreScroll.js +0 -86
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import { supportsTbody, BROWSER_NOT_SUPPORTED_ERROR } from './DOM/tbody.js';
|
|
2
|
+
import DOMEngine from './DOM/Engine.js';
|
|
3
|
+
import Layout, { LAYOUT_REASON } from './Layout.js';
|
|
4
|
+
import Resize from './Resize.js';
|
|
5
|
+
import BeforeResize from './BeforeResize.js';
|
|
6
|
+
import Scroll from './Scroll.js';
|
|
7
|
+
import ListHeightMeasurement from './ListHeightMeasurement.js';
|
|
8
|
+
import ItemHeights from './ItemHeights.js';
|
|
9
|
+
import log, { warn, isDebug, reportError } from './utility/debug.js';
|
|
10
|
+
import createStateHelpers from './VirtualScroller.state.js';
|
|
11
|
+
import createVerticalSpacingHelpers from './VirtualScroller.verticalSpacing.js';
|
|
12
|
+
import createColumnsHelpers from './VirtualScroller.columns.js';
|
|
13
|
+
import createLayoutHelpers from './VirtualScroller.layout.js';
|
|
14
|
+
import createOnRenderHelpers from './VirtualScroller.onRender.js';
|
|
15
|
+
import createResizeHelpers from './VirtualScroller.resize.js';
|
|
16
|
+
import createItemsHelpers from './VirtualScroller.items.js';
|
|
17
|
+
/**
|
|
18
|
+
* @param {function} getItemsContainerElement — Returns the container DOM `Element`.
|
|
19
|
+
* @param {any[]} items — The list of items.
|
|
20
|
+
* @param {Object} [options] — See README.md.
|
|
21
|
+
* @return {VirtualScroller}
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
export default function VirtualScrollerConstructor(getItemsContainerElement, items) {
|
|
25
|
+
var _this = this;
|
|
26
|
+
|
|
27
|
+
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
28
|
+
var render = options.render,
|
|
29
|
+
state = options.state,
|
|
30
|
+
onStateChange = options.onStateChange,
|
|
31
|
+
initialScrollPosition = options.initialScrollPosition,
|
|
32
|
+
onScrollPositionChange = options.onScrollPositionChange,
|
|
33
|
+
scrollableContainer = options.scrollableContainer,
|
|
34
|
+
_options$measureItems = options.measureItemsBatchSize,
|
|
35
|
+
measureItemsBatchSize = _options$measureItems === void 0 ? 50 : _options$measureItems,
|
|
36
|
+
getColumnsCount = options.getColumnsCount,
|
|
37
|
+
getItemId = options.getItemId,
|
|
38
|
+
tbody = options.tbody,
|
|
39
|
+
estimatedItemHeight = options.estimatedItemHeight,
|
|
40
|
+
onItemInitialRender = options.onItemInitialRender,
|
|
41
|
+
onItemFirstRender = options.onItemFirstRender,
|
|
42
|
+
_useTimeoutInRenderLoop = options._useTimeoutInRenderLoop,
|
|
43
|
+
_waitForScrollingToStop = options._waitForScrollingToStop,
|
|
44
|
+
engine = options.engine;
|
|
45
|
+
var bypass = options.bypass,
|
|
46
|
+
getScrollableContainer = options.getScrollableContainer;
|
|
47
|
+
log('~ Initialize ~'); // Could support non-DOM rendering engines.
|
|
48
|
+
// For example, React Native, `<canvas/>`, etc.
|
|
49
|
+
|
|
50
|
+
this.engine = engine || DOMEngine; // `scrollableContainer` option is deprecated.
|
|
51
|
+
// Use `getScrollableContainer()` option instead.
|
|
52
|
+
|
|
53
|
+
if (!getScrollableContainer && scrollableContainer) {
|
|
54
|
+
getScrollableContainer = function getScrollableContainer() {
|
|
55
|
+
return scrollableContainer;
|
|
56
|
+
};
|
|
57
|
+
} // Sometimes, when `new VirtualScroller()` instance is created,
|
|
58
|
+
// `getItemsContainerElement()` might not be ready to return the "container" DOM Element yet
|
|
59
|
+
// (for example, because it's not rendered yet). That's the reason why it's a getter function.
|
|
60
|
+
// For example, in React `<VirtualScroller/>` component, a `VirtualScroller`
|
|
61
|
+
// instance is created in the React component's `constructor()`, and at that time
|
|
62
|
+
// the container Element is not yet available. The container Element is available
|
|
63
|
+
// in `componentDidMount()`, but `componentDidMount()` is not executed on server,
|
|
64
|
+
// which would mean that React `<VirtualScroller/>` wouldn't render at all
|
|
65
|
+
// on server side, while with the `getItemsContainerElement()` approach, on server side,
|
|
66
|
+
// it still "renders" a list with a predefined amount of items in it by default.
|
|
67
|
+
// (`initiallyRenderedItemsCount`, or `1`).
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
this.getItemsContainerElement = getItemsContainerElement; // if (prerenderMargin === undefined) {
|
|
71
|
+
// // Renders items which are outside of the screen by this "prerender margin".
|
|
72
|
+
// // Is the screen height by default: seems to be the optimal value
|
|
73
|
+
// // for "Page Up" / "Page Down" navigation and optimized mouse wheel scrolling.
|
|
74
|
+
// prerenderMargin = this.scrollableContainer ? this.scrollableContainer.getHeight() : 0
|
|
75
|
+
// }
|
|
76
|
+
|
|
77
|
+
if (options.getState || options.setState) {
|
|
78
|
+
throw new Error('[virtual-scroller] `getState`/`setState` options usage has changed in the new version. See the readme for more details.');
|
|
79
|
+
} // Work around `<tbody/>` not being able to have `padding`.
|
|
80
|
+
// https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
if (tbody) {
|
|
84
|
+
if (this.engine !== DOMEngine) {
|
|
85
|
+
throw new Error('[virtual-scroller] `tbody` option is only supported for DOM rendering engine');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
log('~ <tbody/> detected ~');
|
|
89
|
+
this.tbody = true;
|
|
90
|
+
|
|
91
|
+
if (!supportsTbody()) {
|
|
92
|
+
log('~ <tbody/> not supported ~');
|
|
93
|
+
reportError(BROWSER_NOT_SUPPORTED_ERROR);
|
|
94
|
+
bypass = true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (bypass) {
|
|
99
|
+
log('~ "bypass" mode ~');
|
|
100
|
+
} // In `bypass` mode, `VirtualScroller` doesn't wait
|
|
101
|
+
// for the user to scroll down to render all items:
|
|
102
|
+
// instead, it renders all items right away, as if
|
|
103
|
+
// the list is rendered without using `VirtualScroller`.
|
|
104
|
+
// It was added just to measure how much is the
|
|
105
|
+
// performance difference between using a `VirtualScroller`
|
|
106
|
+
// and not using a `VirtualScroller`.
|
|
107
|
+
// It turned out that unmounting large React component trees
|
|
108
|
+
// is a very long process, so `VirtualScroller` does seem to
|
|
109
|
+
// make sense when used in a React application.
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
this.bypass = bypass; // this.bypassBatchSize = bypassBatchSize || 10
|
|
113
|
+
// Using `setTimeout()` in render loop is a workaround
|
|
114
|
+
// for avoiding a React error message:
|
|
115
|
+
// "Maximum update depth exceeded.
|
|
116
|
+
// This can happen when a component repeatedly calls
|
|
117
|
+
// `.setState()` inside `componentWillUpdate()` or `componentDidUpdate()`.
|
|
118
|
+
// React limits the number of nested updates to prevent infinite loops."
|
|
119
|
+
|
|
120
|
+
this._useTimeoutInRenderLoop = _useTimeoutInRenderLoop;
|
|
121
|
+
|
|
122
|
+
if (getItemId) {
|
|
123
|
+
this.isItemEqual = function (a, b) {
|
|
124
|
+
return getItemId(a) === getItemId(b);
|
|
125
|
+
};
|
|
126
|
+
} else {
|
|
127
|
+
this.isItemEqual = function (a, b) {
|
|
128
|
+
return a === b;
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (onItemInitialRender) {
|
|
133
|
+
this.onItemInitialRender = onItemInitialRender;
|
|
134
|
+
} // `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.
|
|
135
|
+
else if (onItemFirstRender) {
|
|
136
|
+
this.onItemInitialRender = function (item) {
|
|
137
|
+
warn('`onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.');
|
|
138
|
+
|
|
139
|
+
var _this$getState = _this.getState(),
|
|
140
|
+
items = _this$getState.items;
|
|
141
|
+
|
|
142
|
+
var i = items.indexOf(item); // The `item` could also be non-found due to the inconsistency bug:
|
|
143
|
+
// The reason is that `i` can be non-consistent with the `items`
|
|
144
|
+
// passed to `<VirtualScroller/>` in React due to `updateState()` not being
|
|
145
|
+
// instanteneous: when new `items` are passed to `<VirtualScroller/>`,
|
|
146
|
+
// `VirtualScroller.updateState({ items })` is called, and if `onItemFirstRender(i)`
|
|
147
|
+
// is called after the aforementioned `updateState()` is called but before it finishes,
|
|
148
|
+
// `i` would point to an index in "previous" `items` while the application
|
|
149
|
+
// would assume that `i` points to an index in the "new" `items`,
|
|
150
|
+
// resulting in an incorrect item being assumed by the application
|
|
151
|
+
// or even in an "array index out of bounds" error.
|
|
152
|
+
|
|
153
|
+
if (i >= 0) {
|
|
154
|
+
onItemFirstRender(i);
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
} // If initial `state` is passed then use `items` from `state`
|
|
158
|
+
// instead of the `items` argument.
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
if (state) {
|
|
162
|
+
items = state.items;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
log('Items count', items.length);
|
|
166
|
+
|
|
167
|
+
if (estimatedItemHeight) {
|
|
168
|
+
log('Estimated item height', estimatedItemHeight);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
createStateHelpers.call(this, {
|
|
172
|
+
state: state,
|
|
173
|
+
onStateChange: onStateChange,
|
|
174
|
+
render: render,
|
|
175
|
+
items: items
|
|
176
|
+
});
|
|
177
|
+
createVerticalSpacingHelpers.call(this);
|
|
178
|
+
createColumnsHelpers.call(this, {
|
|
179
|
+
getColumnsCount: getColumnsCount
|
|
180
|
+
});
|
|
181
|
+
createLayoutHelpers.call(this);
|
|
182
|
+
createOnRenderHelpers.call(this);
|
|
183
|
+
createResizeHelpers.call(this);
|
|
184
|
+
createItemsHelpers.call(this);
|
|
185
|
+
createHelpers.call(this, {
|
|
186
|
+
getScrollableContainer: getScrollableContainer,
|
|
187
|
+
estimatedItemHeight: estimatedItemHeight,
|
|
188
|
+
measureItemsBatchSize: measureItemsBatchSize,
|
|
189
|
+
initialScrollPosition: initialScrollPosition,
|
|
190
|
+
onScrollPositionChange: onScrollPositionChange,
|
|
191
|
+
waitForScrollingToStop: _waitForScrollingToStop
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
if (state) {
|
|
195
|
+
// Initialize `ItemHeights` from previously measured `state.itemHeights`.
|
|
196
|
+
this.itemHeights.readItemHeightsFromState(state); // Initialize some `BeforeResize` internal flags from a previously saved state.
|
|
197
|
+
|
|
198
|
+
this.beforeResize.initializeFromState(state);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function createHelpers(_ref) {
|
|
203
|
+
var _this2 = this;
|
|
204
|
+
|
|
205
|
+
var getScrollableContainer = _ref.getScrollableContainer,
|
|
206
|
+
estimatedItemHeight = _ref.estimatedItemHeight,
|
|
207
|
+
measureItemsBatchSize = _ref.measureItemsBatchSize,
|
|
208
|
+
initialScrollPosition = _ref.initialScrollPosition,
|
|
209
|
+
onScrollPositionChange = _ref.onScrollPositionChange,
|
|
210
|
+
waitForScrollingToStop = _ref.waitForScrollingToStop;
|
|
211
|
+
this.itemsContainer = this.engine.createItemsContainer(this.getItemsContainerElement); // If the items "container" element is mounted at this stage,
|
|
212
|
+
// remove any accidental text nodes from it (like whitespace).
|
|
213
|
+
//
|
|
214
|
+
// Also, this guards against cases when someone accidentally tries
|
|
215
|
+
// using `VirtualScroller` on a non-empty element.
|
|
216
|
+
//
|
|
217
|
+
|
|
218
|
+
if (this.getItemsContainerElement()) {
|
|
219
|
+
this.itemsContainer.clear();
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
this.scrollableContainer = this.engine.createScrollableContainer(getScrollableContainer, this.getItemsContainerElement); // Create `ItemHeights` instance.
|
|
223
|
+
|
|
224
|
+
this.itemHeights = new ItemHeights({
|
|
225
|
+
container: this.itemsContainer,
|
|
226
|
+
getItemHeight: function getItemHeight(i) {
|
|
227
|
+
return _this2.getState().itemHeights[i];
|
|
228
|
+
},
|
|
229
|
+
setItemHeight: function setItemHeight(i, height) {
|
|
230
|
+
return _this2.getState().itemHeights[i] = height;
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
this.layout = new Layout({
|
|
234
|
+
bypass: this.bypass,
|
|
235
|
+
estimatedItemHeight: estimatedItemHeight,
|
|
236
|
+
measureItemsBatchSize: measureItemsBatchSize,
|
|
237
|
+
getPrerenderMargin: function getPrerenderMargin() {
|
|
238
|
+
return _this2.getPrerenderMargin();
|
|
239
|
+
},
|
|
240
|
+
getVerticalSpacing: function getVerticalSpacing() {
|
|
241
|
+
return _this2.getVerticalSpacing();
|
|
242
|
+
},
|
|
243
|
+
getVerticalSpacingBeforeResize: function getVerticalSpacingBeforeResize() {
|
|
244
|
+
return _this2.getVerticalSpacingBeforeResize();
|
|
245
|
+
},
|
|
246
|
+
getColumnsCount: function getColumnsCount() {
|
|
247
|
+
return _this2.getColumnsCount();
|
|
248
|
+
},
|
|
249
|
+
getColumnsCountBeforeResize: function getColumnsCountBeforeResize() {
|
|
250
|
+
return _this2.getState().beforeResize && _this2.getState().beforeResize.columnsCount;
|
|
251
|
+
},
|
|
252
|
+
getItemHeight: function getItemHeight(i) {
|
|
253
|
+
return _this2.getState().itemHeights[i];
|
|
254
|
+
},
|
|
255
|
+
getItemHeightBeforeResize: function getItemHeightBeforeResize(i) {
|
|
256
|
+
return _this2.getState().beforeResize && _this2.getState().beforeResize.itemHeights[i];
|
|
257
|
+
},
|
|
258
|
+
getBeforeResizeItemsCount: function getBeforeResizeItemsCount() {
|
|
259
|
+
return _this2.getState().beforeResize ? _this2.getState().beforeResize.itemHeights.length : 0;
|
|
260
|
+
},
|
|
261
|
+
getAverageItemHeight: function getAverageItemHeight() {
|
|
262
|
+
return _this2.itemHeights.getAverage();
|
|
263
|
+
},
|
|
264
|
+
getMaxVisibleAreaHeight: function getMaxVisibleAreaHeight() {
|
|
265
|
+
return _this2.scrollableContainer && _this2.scrollableContainer.getHeight();
|
|
266
|
+
},
|
|
267
|
+
//
|
|
268
|
+
// The "previously calculated layout" feature is not currently used.
|
|
269
|
+
//
|
|
270
|
+
// The current layout snapshot could be stored as a "previously calculated layout" variable
|
|
271
|
+
// so that it could theoretically be used when calculating new layout incrementally
|
|
272
|
+
// rather than from scratch, which would be an optimization.
|
|
273
|
+
//
|
|
274
|
+
getPreviouslyCalculatedLayout: function getPreviouslyCalculatedLayout() {
|
|
275
|
+
return _this2.previouslyCalculatedLayout;
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
this.resize = new Resize({
|
|
279
|
+
bypass: this.bypass,
|
|
280
|
+
getWidth: function getWidth() {
|
|
281
|
+
return _this2.scrollableContainer.getWidth();
|
|
282
|
+
},
|
|
283
|
+
getHeight: function getHeight() {
|
|
284
|
+
return _this2.scrollableContainer.getHeight();
|
|
285
|
+
},
|
|
286
|
+
listenForResize: function listenForResize(listener) {
|
|
287
|
+
return _this2.scrollableContainer.onResize(listener);
|
|
288
|
+
},
|
|
289
|
+
onResizeStart: function onResizeStart() {
|
|
290
|
+
log('~ Scrollable container resize started ~');
|
|
291
|
+
_this2._isResizing = true;
|
|
292
|
+
},
|
|
293
|
+
onResizeStop: function onResizeStop() {
|
|
294
|
+
log('~ Scrollable container resize finished ~');
|
|
295
|
+
_this2._isResizing = undefined;
|
|
296
|
+
},
|
|
297
|
+
onNoChange: function onNoChange() {
|
|
298
|
+
// There might have been some missed `this.onUpdateShownItemIndexes()` calls
|
|
299
|
+
// due to setting `this._isResizing` flag to `true` during the resize.
|
|
300
|
+
// So, update shown item indexes just in case.
|
|
301
|
+
_this2.onUpdateShownItemIndexes({
|
|
302
|
+
reason: LAYOUT_REASON.VIEWPORT_SIZE_UNCHANGED
|
|
303
|
+
});
|
|
304
|
+
},
|
|
305
|
+
onHeightChange: function onHeightChange() {
|
|
306
|
+
return _this2.onUpdateShownItemIndexes({
|
|
307
|
+
reason: LAYOUT_REASON.VIEWPORT_HEIGHT_CHANGED
|
|
308
|
+
});
|
|
309
|
+
},
|
|
310
|
+
onWidthChange: function onWidthChange(prevWidth, newWidth) {
|
|
311
|
+
log('~ Scrollable container width changed from', prevWidth, 'to', newWidth, '~');
|
|
312
|
+
|
|
313
|
+
_this2.onResize();
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
this.scroll = new Scroll({
|
|
317
|
+
bypass: this.bypass,
|
|
318
|
+
scrollableContainer: this.scrollableContainer,
|
|
319
|
+
itemsContainer: this.itemsContainer,
|
|
320
|
+
waitForScrollingToStop: waitForScrollingToStop,
|
|
321
|
+
onScroll: function onScroll() {
|
|
322
|
+
var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
323
|
+
delayed = _ref2.delayed;
|
|
324
|
+
|
|
325
|
+
_this2.onUpdateShownItemIndexes({
|
|
326
|
+
reason: delayed ? LAYOUT_REASON.STOPPED_SCROLLING : LAYOUT_REASON.SCROLL
|
|
327
|
+
});
|
|
328
|
+
},
|
|
329
|
+
initialScrollPosition: initialScrollPosition,
|
|
330
|
+
onScrollPositionChange: onScrollPositionChange,
|
|
331
|
+
isImmediateLayoutScheduled: function isImmediateLayoutScheduled() {
|
|
332
|
+
return Boolean(_this2.layoutTimer);
|
|
333
|
+
},
|
|
334
|
+
hasNonRenderedItemsAtTheTop: function hasNonRenderedItemsAtTheTop() {
|
|
335
|
+
return _this2.getState().firstShownItemIndex > 0;
|
|
336
|
+
},
|
|
337
|
+
hasNonRenderedItemsAtTheBottom: function hasNonRenderedItemsAtTheBottom() {
|
|
338
|
+
return _this2.getState().lastShownItemIndex < _this2.getItemsCount() - 1;
|
|
339
|
+
},
|
|
340
|
+
getLatestLayoutVisibleArea: function getLatestLayoutVisibleArea() {
|
|
341
|
+
return _this2.latestLayoutVisibleArea;
|
|
342
|
+
},
|
|
343
|
+
getListTopOffset: this.getListTopOffsetInsideScrollableContainer,
|
|
344
|
+
getPrerenderMargin: function getPrerenderMargin() {
|
|
345
|
+
return _this2.getPrerenderMargin();
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
this.listHeightMeasurement = new ListHeightMeasurement({
|
|
349
|
+
itemsContainer: this.itemsContainer,
|
|
350
|
+
getListTopOffset: this.getListTopOffsetInsideScrollableContainer
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
if (this.engine.watchListTopOffset) {
|
|
354
|
+
this.listTopOffsetWatcher = this.engine.watchListTopOffset({
|
|
355
|
+
getListTopOffset: this.getListTopOffsetInsideScrollableContainer,
|
|
356
|
+
onListTopOffsetChange: function onListTopOffsetChange(_ref3) {
|
|
357
|
+
var reason = _ref3.reason;
|
|
358
|
+
return _this2.onUpdateShownItemIndexes({
|
|
359
|
+
reason: LAYOUT_REASON.TOP_OFFSET_CHANGED
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
this.beforeResize = new BeforeResize({
|
|
366
|
+
getState: this.getState,
|
|
367
|
+
getVerticalSpacing: this.getVerticalSpacing,
|
|
368
|
+
getColumnsCount: this.getColumnsCount
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
//# sourceMappingURL=VirtualScroller.constructor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VirtualScroller.constructor.js","names":["supportsTbody","BROWSER_NOT_SUPPORTED_ERROR","DOMEngine","Layout","LAYOUT_REASON","Resize","BeforeResize","Scroll","ListHeightMeasurement","ItemHeights","log","warn","isDebug","reportError","createStateHelpers","createVerticalSpacingHelpers","createColumnsHelpers","createLayoutHelpers","createOnRenderHelpers","createResizeHelpers","createItemsHelpers","VirtualScrollerConstructor","getItemsContainerElement","items","options","render","state","onStateChange","initialScrollPosition","onScrollPositionChange","scrollableContainer","measureItemsBatchSize","getColumnsCount","getItemId","tbody","estimatedItemHeight","onItemInitialRender","onItemFirstRender","_useTimeoutInRenderLoop","_waitForScrollingToStop","engine","bypass","getScrollableContainer","getState","setState","Error","isItemEqual","a","b","item","i","indexOf","length","call","createHelpers","waitForScrollingToStop","itemHeights","readItemHeightsFromState","beforeResize","initializeFromState","itemsContainer","createItemsContainer","clear","createScrollableContainer","container","getItemHeight","setItemHeight","height","layout","getPrerenderMargin","getVerticalSpacing","getVerticalSpacingBeforeResize","getColumnsCountBeforeResize","columnsCount","getItemHeightBeforeResize","getBeforeResizeItemsCount","getAverageItemHeight","getAverage","getMaxVisibleAreaHeight","getHeight","getPreviouslyCalculatedLayout","previouslyCalculatedLayout","resize","getWidth","listenForResize","listener","onResize","onResizeStart","_isResizing","onResizeStop","undefined","onNoChange","onUpdateShownItemIndexes","reason","VIEWPORT_SIZE_UNCHANGED","onHeightChange","VIEWPORT_HEIGHT_CHANGED","onWidthChange","prevWidth","newWidth","scroll","onScroll","delayed","STOPPED_SCROLLING","SCROLL","isImmediateLayoutScheduled","Boolean","layoutTimer","hasNonRenderedItemsAtTheTop","firstShownItemIndex","hasNonRenderedItemsAtTheBottom","lastShownItemIndex","getItemsCount","getLatestLayoutVisibleArea","latestLayoutVisibleArea","getListTopOffset","getListTopOffsetInsideScrollableContainer","listHeightMeasurement","watchListTopOffset","listTopOffsetWatcher","onListTopOffsetChange","TOP_OFFSET_CHANGED"],"sources":["../source/VirtualScroller.constructor.js"],"sourcesContent":["import {\r\n\tsupportsTbody,\r\n\tBROWSER_NOT_SUPPORTED_ERROR\r\n} from './DOM/tbody.js'\r\n\r\nimport DOMEngine from './DOM/Engine.js'\r\n\r\nimport Layout, { LAYOUT_REASON } from './Layout.js'\r\nimport Resize from './Resize.js'\r\nimport BeforeResize from './BeforeResize.js'\r\nimport Scroll from './Scroll.js'\r\nimport ListHeightMeasurement from './ListHeightMeasurement.js'\r\nimport ItemHeights from './ItemHeights.js'\r\n\r\nimport log, { warn, isDebug, reportError } from './utility/debug.js'\r\n\r\nimport createStateHelpers from './VirtualScroller.state.js'\r\nimport createVerticalSpacingHelpers from './VirtualScroller.verticalSpacing.js'\r\nimport createColumnsHelpers from './VirtualScroller.columns.js'\r\nimport createLayoutHelpers from './VirtualScroller.layout.js'\r\nimport createOnRenderHelpers from './VirtualScroller.onRender.js'\r\nimport createResizeHelpers from './VirtualScroller.resize.js'\r\nimport createItemsHelpers from './VirtualScroller.items.js'\r\n\r\n/**\r\n * @param {function} getItemsContainerElement — Returns the container DOM `Element`.\r\n * @param {any[]} items — The list of items.\r\n * @param {Object} [options] — See README.md.\r\n * @return {VirtualScroller}\r\n */\r\nexport default function VirtualScrollerConstructor(\r\n\tgetItemsContainerElement,\r\n\titems,\r\n\toptions = {}\r\n) {\r\n\tconst {\r\n\t\trender,\r\n\t\tstate,\r\n\t\tonStateChange,\r\n\t\tinitialScrollPosition,\r\n\t\tonScrollPositionChange,\r\n\t\t// `scrollableContainer` option is deprecated.\r\n\t\t// Use `getScrollableContainer()` option instead.\r\n\t\tscrollableContainer,\r\n\t\tmeasureItemsBatchSize = 50,\r\n\t\tgetColumnsCount,\r\n\t\tgetItemId,\r\n\t\ttbody,\r\n\t\testimatedItemHeight,\r\n\t\tonItemInitialRender,\r\n\t\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\t\tonItemFirstRender,\r\n\t\t_useTimeoutInRenderLoop,\r\n\t\t_waitForScrollingToStop,\r\n\t\tengine\r\n\t} = options\r\n\r\n\tlet {\r\n\t\tbypass,\r\n\t\tgetScrollableContainer\r\n\t} = options\r\n\r\n\tlog('~ Initialize ~')\r\n\r\n\t// Could support non-DOM rendering engines.\r\n\t// For example, React Native, `<canvas/>`, etc.\r\n\tthis.engine = engine || DOMEngine\r\n\r\n\t// `scrollableContainer` option is deprecated.\r\n\t// Use `getScrollableContainer()` option instead.\r\n\tif (!getScrollableContainer && scrollableContainer) {\r\n\t\tgetScrollableContainer = () => scrollableContainer\r\n\t}\r\n\r\n\t// Sometimes, when `new VirtualScroller()` instance is created,\r\n\t// `getItemsContainerElement()` might not be ready to return the \"container\" DOM Element yet\r\n\t// (for example, because it's not rendered yet). That's the reason why it's a getter function.\r\n\t// For example, in React `<VirtualScroller/>` component, a `VirtualScroller`\r\n\t// instance is created in the React component's `constructor()`, and at that time\r\n\t// the container Element is not yet available. The container Element is available\r\n\t// in `componentDidMount()`, but `componentDidMount()` is not executed on server,\r\n\t// which would mean that React `<VirtualScroller/>` wouldn't render at all\r\n\t// on server side, while with the `getItemsContainerElement()` approach, on server side,\r\n\t// it still \"renders\" a list with a predefined amount of items in it by default.\r\n\t// (`initiallyRenderedItemsCount`, or `1`).\r\n\tthis.getItemsContainerElement = getItemsContainerElement\r\n\r\n\t// if (prerenderMargin === undefined) {\r\n\t// \t// Renders items which are outside of the screen by this \"prerender margin\".\r\n\t// \t// Is the screen height by default: seems to be the optimal value\r\n\t// \t// for \"Page Up\" / \"Page Down\" navigation and optimized mouse wheel scrolling.\r\n\t// \tprerenderMargin = this.scrollableContainer ? this.scrollableContainer.getHeight() : 0\r\n\t// }\r\n\r\n\tif (options.getState || options.setState) {\r\n\t\tthrow new Error('[virtual-scroller] `getState`/`setState` options usage has changed in the new version. See the readme for more details.')\r\n\t}\r\n\r\n\t// Work around `<tbody/>` not being able to have `padding`.\r\n\t// https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n\tif (tbody) {\r\n\t\tif (this.engine !== DOMEngine) {\r\n\t\t\tthrow new Error('[virtual-scroller] `tbody` option is only supported for DOM rendering engine')\r\n\t\t}\r\n\t\tlog('~ <tbody/> detected ~')\r\n\t\tthis.tbody = true\r\n\t\tif (!supportsTbody()) {\r\n\t\t\tlog('~ <tbody/> not supported ~')\r\n\t\t\treportError(BROWSER_NOT_SUPPORTED_ERROR)\r\n\t\t\tbypass = true\r\n\t\t}\r\n\t}\r\n\r\n\tif (bypass) {\r\n\t\tlog('~ \"bypass\" mode ~')\r\n\t}\r\n\r\n\t// In `bypass` mode, `VirtualScroller` doesn't wait\r\n\t// for the user to scroll down to render all items:\r\n\t// instead, it renders all items right away, as if\r\n\t// the list is rendered without using `VirtualScroller`.\r\n\t// It was added just to measure how much is the\r\n\t// performance difference between using a `VirtualScroller`\r\n\t// and not using a `VirtualScroller`.\r\n\t// It turned out that unmounting large React component trees\r\n\t// is a very long process, so `VirtualScroller` does seem to\r\n\t// make sense when used in a React application.\r\n\tthis.bypass = bypass\r\n\t// this.bypassBatchSize = bypassBatchSize || 10\r\n\r\n\t// Using `setTimeout()` in render loop is a workaround\r\n\t// for avoiding a React error message:\r\n\t// \"Maximum update depth exceeded.\r\n\t// This can happen when a component repeatedly calls\r\n\t// `.setState()` inside `componentWillUpdate()` or `componentDidUpdate()`.\r\n\t// React limits the number of nested updates to prevent infinite loops.\"\r\n\tthis._useTimeoutInRenderLoop = _useTimeoutInRenderLoop\r\n\r\n\tif (getItemId) {\r\n\t\tthis.isItemEqual = (a, b) => getItemId(a) === getItemId(b)\r\n\t} else {\r\n\t\tthis.isItemEqual = (a, b) => a === b\r\n\t}\r\n\r\n\tif (onItemInitialRender) {\r\n\t\tthis.onItemInitialRender = onItemInitialRender\r\n\t}\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\telse if (onItemFirstRender) {\r\n\t\tthis.onItemInitialRender = (item) => {\r\n\t\t\twarn('`onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.')\r\n\t\t\tconst { items } = this.getState()\r\n\t\t\tconst i = items.indexOf(item)\r\n\t\t\t// The `item` could also be non-found due to the inconsistency bug:\r\n\t\t\t// The reason is that `i` can be non-consistent with the `items`\r\n\t\t\t// passed to `<VirtualScroller/>` in React due to `updateState()` not being\r\n\t\t\t// instanteneous: when new `items` are passed to `<VirtualScroller/>`,\r\n\t\t\t// `VirtualScroller.updateState({ items })` is called, and if `onItemFirstRender(i)`\r\n\t\t\t// is called after the aforementioned `updateState()` is called but before it finishes,\r\n\t\t\t// `i` would point to an index in \"previous\" `items` while the application\r\n\t\t\t// would assume that `i` points to an index in the \"new\" `items`,\r\n\t\t\t// resulting in an incorrect item being assumed by the application\r\n\t\t\t// or even in an \"array index out of bounds\" error.\r\n\t\t\tif (i >= 0) {\r\n\t\t\t\tonItemFirstRender(i)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// If initial `state` is passed then use `items` from `state`\r\n\t// instead of the `items` argument.\r\n\tif (state) {\r\n\t\titems = state.items\r\n\t}\r\n\r\n\tlog('Items count', items.length)\r\n\tif (estimatedItemHeight) {\r\n\t\tlog('Estimated item height', estimatedItemHeight)\r\n\t}\r\n\r\n\tcreateStateHelpers.call(this, { state, onStateChange, render, items })\r\n\r\n\tcreateVerticalSpacingHelpers.call(this)\r\n\tcreateColumnsHelpers.call(this, { getColumnsCount })\r\n\r\n\tcreateLayoutHelpers.call(this)\r\n\tcreateOnRenderHelpers.call(this)\r\n\tcreateResizeHelpers.call(this)\r\n\tcreateItemsHelpers.call(this)\r\n\r\n\tcreateHelpers.call(this, {\r\n\t\tgetScrollableContainer,\r\n\t\testimatedItemHeight,\r\n\t\tmeasureItemsBatchSize,\r\n\t\tinitialScrollPosition,\r\n\t\tonScrollPositionChange,\r\n\t\twaitForScrollingToStop: _waitForScrollingToStop\r\n\t})\r\n\r\n\tif (state) {\r\n\t\t// Initialize `ItemHeights` from previously measured `state.itemHeights`.\r\n\t\tthis.itemHeights.readItemHeightsFromState(state)\r\n\r\n\t\t// Initialize some `BeforeResize` internal flags from a previously saved state.\r\n\t\tthis.beforeResize.initializeFromState(state)\r\n\t}\r\n}\r\n\r\nfunction createHelpers({\r\n\tgetScrollableContainer,\r\n\testimatedItemHeight,\r\n\tmeasureItemsBatchSize,\r\n\tinitialScrollPosition,\r\n\tonScrollPositionChange,\r\n\twaitForScrollingToStop\r\n}) {\r\n\tthis.itemsContainer = this.engine.createItemsContainer(\r\n\t\tthis.getItemsContainerElement\r\n\t)\r\n\r\n\t// If the items \"container\" element is mounted at this stage,\r\n\t// remove any accidental text nodes from it (like whitespace).\r\n\t//\r\n\t// Also, this guards against cases when someone accidentally tries\r\n\t// using `VirtualScroller` on a non-empty element.\r\n\t//\r\n\tif (this.getItemsContainerElement()) {\r\n\t\tthis.itemsContainer.clear()\r\n\t}\r\n\r\n\tthis.scrollableContainer = this.engine.createScrollableContainer(\r\n\t\tgetScrollableContainer,\r\n\t\tthis.getItemsContainerElement\r\n\t)\r\n\r\n\t// Create `ItemHeights` instance.\r\n\tthis.itemHeights = new ItemHeights({\r\n\t\tcontainer: this.itemsContainer,\r\n\t\tgetItemHeight: (i) => this.getState().itemHeights[i],\r\n\t\tsetItemHeight: (i, height) => this.getState().itemHeights[i] = height\r\n\t})\r\n\r\n\tthis.layout = new Layout({\r\n\t\tbypass: this.bypass,\r\n\t\testimatedItemHeight,\r\n\t\tmeasureItemsBatchSize,\r\n\t\tgetPrerenderMargin: () => this.getPrerenderMargin(),\r\n\t\tgetVerticalSpacing: () => this.getVerticalSpacing(),\r\n\t\tgetVerticalSpacingBeforeResize: () => this.getVerticalSpacingBeforeResize(),\r\n\t\tgetColumnsCount: () => this.getColumnsCount(),\r\n\t\tgetColumnsCountBeforeResize: () => this.getState().beforeResize && this.getState().beforeResize.columnsCount,\r\n\t\tgetItemHeight: (i) => this.getState().itemHeights[i],\r\n\t\tgetItemHeightBeforeResize: (i) => this.getState().beforeResize && this.getState().beforeResize.itemHeights[i],\r\n\t\tgetBeforeResizeItemsCount: () => this.getState().beforeResize ? this.getState().beforeResize.itemHeights.length : 0,\r\n\t\tgetAverageItemHeight: () => this.itemHeights.getAverage(),\r\n\t\tgetMaxVisibleAreaHeight: () => this.scrollableContainer && this.scrollableContainer.getHeight(),\r\n\t\t//\r\n\t\t// The \"previously calculated layout\" feature is not currently used.\r\n\t\t//\r\n\t\t// The current layout snapshot could be stored as a \"previously calculated layout\" variable\r\n\t\t// so that it could theoretically be used when calculating new layout incrementally\r\n\t\t// rather than from scratch, which would be an optimization.\r\n\t\t//\r\n\t\tgetPreviouslyCalculatedLayout: () => this.previouslyCalculatedLayout\r\n\t})\r\n\r\n\tthis.resize = new Resize({\r\n\t\tbypass: this.bypass,\r\n\t\tgetWidth: () => this.scrollableContainer.getWidth(),\r\n\t\tgetHeight: () => this.scrollableContainer.getHeight(),\r\n\t\tlistenForResize: (listener) => this.scrollableContainer.onResize(listener),\r\n\t\tonResizeStart: () => {\r\n\t\t\tlog('~ Scrollable container resize started ~')\r\n\t\t\tthis._isResizing = true\r\n\t\t},\r\n\t\tonResizeStop: () => {\r\n\t\t\tlog('~ Scrollable container resize finished ~')\r\n\t\t\tthis._isResizing = undefined\r\n\t\t},\r\n\t\tonNoChange: () => {\r\n\t\t\t// There might have been some missed `this.onUpdateShownItemIndexes()` calls\r\n\t\t\t// due to setting `this._isResizing` flag to `true` during the resize.\r\n\t\t\t// So, update shown item indexes just in case.\r\n\t\t\tthis.onUpdateShownItemIndexes({\r\n\t\t\t\treason: LAYOUT_REASON.VIEWPORT_SIZE_UNCHANGED\r\n\t\t\t})\r\n\t\t},\r\n\t\tonHeightChange: () => this.onUpdateShownItemIndexes({\r\n\t\t\treason: LAYOUT_REASON.VIEWPORT_HEIGHT_CHANGED\r\n\t\t}),\r\n\t\tonWidthChange: (prevWidth, newWidth) => {\r\n\t\t\tlog('~ Scrollable container width changed from', prevWidth, 'to', newWidth, '~')\r\n\t\t\tthis.onResize()\r\n\t\t}\r\n\t})\r\n\r\n\tthis.scroll = new Scroll({\r\n\t\tbypass: this.bypass,\r\n\t\tscrollableContainer: this.scrollableContainer,\r\n\t\titemsContainer: this.itemsContainer,\r\n\t\twaitForScrollingToStop,\r\n\t\tonScroll: ({ delayed } = {}) => {\r\n\t\t\tthis.onUpdateShownItemIndexes({\r\n\t\t\t\treason: delayed ? LAYOUT_REASON.STOPPED_SCROLLING : LAYOUT_REASON.SCROLL\r\n\t\t\t})\r\n\t\t},\r\n\t\tinitialScrollPosition,\r\n\t\tonScrollPositionChange,\r\n\t\tisImmediateLayoutScheduled: () => Boolean(this.layoutTimer),\r\n\t\thasNonRenderedItemsAtTheTop: () => this.getState().firstShownItemIndex > 0,\r\n\t\thasNonRenderedItemsAtTheBottom: () => this.getState().lastShownItemIndex < this.getItemsCount() - 1,\r\n\t\tgetLatestLayoutVisibleArea: () => this.latestLayoutVisibleArea,\r\n\t\tgetListTopOffset: this.getListTopOffsetInsideScrollableContainer,\r\n\t\tgetPrerenderMargin: () => this.getPrerenderMargin()\r\n\t})\r\n\r\n\tthis.listHeightMeasurement = new ListHeightMeasurement({\r\n\t\titemsContainer: this.itemsContainer,\r\n\t\tgetListTopOffset: this.getListTopOffsetInsideScrollableContainer\r\n\t})\r\n\r\n\tif (this.engine.watchListTopOffset) {\r\n\t\tthis.listTopOffsetWatcher = this.engine.watchListTopOffset({\r\n\t\t\tgetListTopOffset: this.getListTopOffsetInsideScrollableContainer,\r\n\t\t\tonListTopOffsetChange: ({ reason }) => this.onUpdateShownItemIndexes({\r\n\t\t\t\treason: LAYOUT_REASON.TOP_OFFSET_CHANGED\r\n\t\t\t})\r\n\t\t})\r\n\t}\r\n\r\n\tthis.beforeResize = new BeforeResize({\r\n\t\tgetState: this.getState,\r\n\t\tgetVerticalSpacing: this.getVerticalSpacing,\r\n\t\tgetColumnsCount: this.getColumnsCount\r\n\t})\r\n}"],"mappings":"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"}
|