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.
Files changed (283) hide show
  1. package/.gitlab-ci.yml +1 -1
  2. package/CHANGELOG.md +71 -1
  3. package/README.md +434 -151
  4. package/bundle/index-bypass.html +1 -1
  5. package/bundle/index-dom.html +1 -1
  6. package/bundle/index-grid.html +1 -2
  7. package/bundle/index-scrollableContainer.html +1 -1
  8. package/bundle/index-tbody-scrollableContainer.html +2 -0
  9. package/bundle/index-tbody.html +2 -0
  10. package/bundle/virtual-scroller-dom.js +1 -1
  11. package/bundle/virtual-scroller-dom.js.map +1 -1
  12. package/bundle/virtual-scroller-react.js +1 -1
  13. package/bundle/virtual-scroller-react.js.map +1 -1
  14. package/bundle/virtual-scroller.js +1 -1
  15. package/bundle/virtual-scroller.js.map +1 -1
  16. package/commonjs/BeforeResize.js +315 -0
  17. package/commonjs/BeforeResize.js.map +1 -0
  18. package/commonjs/DOM/Engine.js +46 -0
  19. package/commonjs/DOM/Engine.js.map +1 -0
  20. package/commonjs/DOM/ItemsContainer.js +78 -0
  21. package/commonjs/DOM/ItemsContainer.js.map +1 -0
  22. package/commonjs/DOM/{WaitForStylesToLoad.js → ListTopOffsetWatcher.js} +71 -44
  23. package/commonjs/DOM/ListTopOffsetWatcher.js.map +1 -0
  24. package/commonjs/DOM/ScrollableContainer.js +69 -101
  25. package/commonjs/DOM/ScrollableContainer.js.map +1 -1
  26. package/commonjs/DOM/VirtualScroller.js +37 -29
  27. package/commonjs/DOM/VirtualScroller.js.map +1 -1
  28. package/commonjs/DOM/tbody.js +17 -11
  29. package/commonjs/DOM/tbody.js.map +1 -1
  30. package/commonjs/ItemHeights.js +33 -34
  31. package/commonjs/ItemHeights.js.map +1 -1
  32. package/commonjs/Layout.js +591 -216
  33. package/commonjs/Layout.js.map +1 -1
  34. package/commonjs/Layout.test.js +196 -0
  35. package/commonjs/Layout.test.js.map +1 -0
  36. package/commonjs/ListHeightMeasurement.js +124 -0
  37. package/commonjs/ListHeightMeasurement.js.map +1 -0
  38. package/commonjs/Resize.js +50 -39
  39. package/commonjs/Resize.js.map +1 -1
  40. package/commonjs/Scroll.js +139 -95
  41. package/commonjs/Scroll.js.map +1 -1
  42. package/commonjs/VirtualScroller.columns.js +43 -0
  43. package/commonjs/VirtualScroller.columns.js.map +1 -0
  44. package/commonjs/VirtualScroller.constructor.js +408 -0
  45. package/commonjs/VirtualScroller.constructor.js.map +1 -0
  46. package/commonjs/VirtualScroller.items.js +305 -0
  47. package/commonjs/VirtualScroller.items.js.map +1 -0
  48. package/commonjs/VirtualScroller.js +160 -1021
  49. package/commonjs/VirtualScroller.js.map +1 -1
  50. package/commonjs/VirtualScroller.layout.js +562 -0
  51. package/commonjs/VirtualScroller.layout.js.map +1 -0
  52. package/commonjs/VirtualScroller.onRender.js +357 -0
  53. package/commonjs/VirtualScroller.onRender.js.map +1 -0
  54. package/commonjs/VirtualScroller.resize.js +186 -0
  55. package/commonjs/VirtualScroller.resize.js.map +1 -0
  56. package/commonjs/VirtualScroller.state.js +301 -0
  57. package/commonjs/VirtualScroller.state.js.map +1 -0
  58. package/commonjs/VirtualScroller.verticalSpacing.js +65 -0
  59. package/commonjs/VirtualScroller.verticalSpacing.js.map +1 -0
  60. package/commonjs/getItemCoordinates.js.map +1 -1
  61. package/commonjs/getItemsDiff.js.map +1 -1
  62. package/commonjs/getVerticalSpacing.js +8 -8
  63. package/commonjs/getVerticalSpacing.js.map +1 -1
  64. package/commonjs/package.json +5 -0
  65. package/commonjs/react/VirtualScroller.js +182 -628
  66. package/commonjs/react/VirtualScroller.js.map +1 -1
  67. package/commonjs/react/useClassName.js +26 -0
  68. package/commonjs/react/useClassName.js.map +1 -0
  69. package/commonjs/react/useHandleItemsChange.js +116 -0
  70. package/commonjs/react/useHandleItemsChange.js.map +1 -0
  71. package/commonjs/react/useInstanceMethods.js +37 -0
  72. package/commonjs/react/useInstanceMethods.js.map +1 -0
  73. package/commonjs/react/useItemKeys.js +60 -0
  74. package/commonjs/react/useItemKeys.js.map +1 -0
  75. package/commonjs/react/useOnItemHeightChange.js +32 -0
  76. package/commonjs/react/useOnItemHeightChange.js.map +1 -0
  77. package/commonjs/react/useOnItemStateChange.js +32 -0
  78. package/commonjs/react/useOnItemStateChange.js.map +1 -0
  79. package/commonjs/react/useState.js +140 -0
  80. package/commonjs/react/useState.js.map +1 -0
  81. package/commonjs/react/useStyle.js +29 -0
  82. package/commonjs/react/useStyle.js.map +1 -0
  83. package/commonjs/react/useVirtualScroller.js +62 -0
  84. package/commonjs/react/useVirtualScroller.js.map +1 -0
  85. package/commonjs/react/useVirtualScrollerStartStop.js +20 -0
  86. package/commonjs/react/useVirtualScrollerStartStop.js.map +1 -0
  87. package/commonjs/test/Engine.js +23 -0
  88. package/commonjs/test/Engine.js.map +1 -0
  89. package/commonjs/test/ItemsContainer.js +127 -0
  90. package/commonjs/test/ItemsContainer.js.map +1 -0
  91. package/commonjs/test/ScrollableContainer.js +130 -0
  92. package/commonjs/test/ScrollableContainer.js.map +1 -0
  93. package/commonjs/test/VirtualScroller.js +281 -0
  94. package/commonjs/test/VirtualScroller.js.map +1 -0
  95. package/commonjs/utility/debounce.js +28 -6
  96. package/commonjs/utility/debounce.js.map +1 -1
  97. package/commonjs/utility/debug.js +51 -12
  98. package/commonjs/utility/debug.js.map +1 -1
  99. package/commonjs/utility/getStateSnapshot.js +50 -0
  100. package/commonjs/utility/getStateSnapshot.js.map +1 -0
  101. package/commonjs/utility/px.js +1 -1
  102. package/commonjs/utility/px.js.map +1 -1
  103. package/commonjs/utility/px.test.js +14 -0
  104. package/commonjs/utility/px.test.js.map +1 -0
  105. package/commonjs/utility/shallowEqual.js +1 -1
  106. package/commonjs/utility/shallowEqual.js.map +1 -1
  107. package/commonjs/utility/throttle.js.map +1 -1
  108. package/dom/index.cjs +4 -0
  109. package/dom/index.cjs.js +9 -0
  110. package/dom/index.d.ts +25 -0
  111. package/dom/index.js +1 -1
  112. package/dom/package.json +10 -4
  113. package/index.cjs +4 -0
  114. package/index.cjs.js +9 -0
  115. package/index.d.ts +99 -0
  116. package/index.js +1 -1
  117. package/modules/BeforeResize.js +305 -0
  118. package/modules/BeforeResize.js.map +1 -0
  119. package/modules/DOM/Engine.js +27 -0
  120. package/modules/DOM/Engine.js.map +1 -0
  121. package/modules/DOM/ItemsContainer.js +71 -0
  122. package/modules/DOM/ItemsContainer.js.map +1 -0
  123. package/modules/DOM/{WaitForStylesToLoad.js → ListTopOffsetWatcher.js} +72 -44
  124. package/modules/DOM/ListTopOffsetWatcher.js.map +1 -0
  125. package/modules/DOM/ScrollableContainer.js +68 -100
  126. package/modules/DOM/ScrollableContainer.js.map +1 -1
  127. package/modules/DOM/VirtualScroller.js +32 -28
  128. package/modules/DOM/VirtualScroller.js.map +1 -1
  129. package/modules/DOM/tbody.js +11 -9
  130. package/modules/DOM/tbody.js.map +1 -1
  131. package/modules/ItemHeights.js +28 -33
  132. package/modules/ItemHeights.js.map +1 -1
  133. package/modules/Layout.js +585 -214
  134. package/modules/Layout.js.map +1 -1
  135. package/modules/Layout.test.js +190 -0
  136. package/modules/Layout.test.js.map +1 -0
  137. package/modules/ListHeightMeasurement.js +117 -0
  138. package/modules/ListHeightMeasurement.js.map +1 -0
  139. package/modules/Resize.js +50 -39
  140. package/modules/Resize.js.map +1 -1
  141. package/modules/Scroll.js +139 -94
  142. package/modules/Scroll.js.map +1 -1
  143. package/modules/VirtualScroller.columns.js +36 -0
  144. package/modules/VirtualScroller.columns.js.map +1 -0
  145. package/modules/VirtualScroller.constructor.js +371 -0
  146. package/modules/VirtualScroller.constructor.js.map +1 -0
  147. package/modules/VirtualScroller.items.js +288 -0
  148. package/modules/VirtualScroller.items.js.map +1 -0
  149. package/modules/VirtualScroller.js +159 -1014
  150. package/modules/VirtualScroller.js.map +1 -1
  151. package/modules/VirtualScroller.layout.js +549 -0
  152. package/modules/VirtualScroller.layout.js.map +1 -0
  153. package/modules/VirtualScroller.onRender.js +337 -0
  154. package/modules/VirtualScroller.onRender.js.map +1 -0
  155. package/modules/VirtualScroller.resize.js +176 -0
  156. package/modules/VirtualScroller.resize.js.map +1 -0
  157. package/modules/VirtualScroller.state.js +283 -0
  158. package/modules/VirtualScroller.state.js.map +1 -0
  159. package/modules/VirtualScroller.verticalSpacing.js +54 -0
  160. package/modules/VirtualScroller.verticalSpacing.js.map +1 -0
  161. package/modules/getItemCoordinates.js.map +1 -1
  162. package/modules/getItemsDiff.js.map +1 -1
  163. package/modules/getVerticalSpacing.js +8 -8
  164. package/modules/getVerticalSpacing.js.map +1 -1
  165. package/modules/react/VirtualScroller.js +179 -634
  166. package/modules/react/VirtualScroller.js.map +1 -1
  167. package/modules/react/useClassName.js +18 -0
  168. package/modules/react/useClassName.js.map +1 -0
  169. package/modules/react/useHandleItemsChange.js +108 -0
  170. package/modules/react/useHandleItemsChange.js.map +1 -0
  171. package/modules/react/useInstanceMethods.js +28 -0
  172. package/modules/react/useInstanceMethods.js.map +1 -0
  173. package/modules/react/useItemKeys.js +52 -0
  174. package/modules/react/useItemKeys.js.map +1 -0
  175. package/modules/react/useOnItemHeightChange.js +24 -0
  176. package/modules/react/useOnItemHeightChange.js.map +1 -0
  177. package/modules/react/useOnItemStateChange.js +24 -0
  178. package/modules/react/useOnItemStateChange.js.map +1 -0
  179. package/modules/react/useState.js +132 -0
  180. package/modules/react/useState.js.map +1 -0
  181. package/modules/react/useStyle.js +19 -0
  182. package/modules/react/useStyle.js.map +1 -0
  183. package/modules/react/useVirtualScroller.js +51 -0
  184. package/modules/react/useVirtualScroller.js.map +1 -0
  185. package/modules/react/useVirtualScrollerStartStop.js +12 -0
  186. package/modules/react/useVirtualScrollerStartStop.js.map +1 -0
  187. package/modules/test/Engine.js +11 -0
  188. package/modules/test/Engine.js.map +1 -0
  189. package/modules/test/ItemsContainer.js +120 -0
  190. package/modules/test/ItemsContainer.js.map +1 -0
  191. package/modules/test/ScrollableContainer.js +123 -0
  192. package/modules/test/ScrollableContainer.js.map +1 -0
  193. package/modules/test/VirtualScroller.js +270 -0
  194. package/modules/test/VirtualScroller.js.map +1 -0
  195. package/modules/utility/debounce.js +28 -6
  196. package/modules/utility/debounce.js.map +1 -1
  197. package/modules/utility/debug.js +47 -10
  198. package/modules/utility/debug.js.map +1 -1
  199. package/modules/utility/getStateSnapshot.js +43 -0
  200. package/modules/utility/getStateSnapshot.js.map +1 -0
  201. package/modules/utility/px.js +1 -1
  202. package/modules/utility/px.js.map +1 -1
  203. package/modules/utility/px.test.js +9 -0
  204. package/modules/utility/px.test.js.map +1 -0
  205. package/modules/utility/shallowEqual.js +1 -1
  206. package/modules/utility/shallowEqual.js.map +1 -1
  207. package/modules/utility/throttle.js.map +1 -1
  208. package/package.json +54 -29
  209. package/react/index.cjs +4 -0
  210. package/react/index.cjs.js +9 -0
  211. package/react/index.d.ts +28 -0
  212. package/react/index.js +1 -1
  213. package/react/package.json +10 -4
  214. package/rollup.config.mjs +62 -0
  215. package/runnable/create-commonjs-package-json.js +11 -0
  216. package/source/BeforeResize.js +312 -0
  217. package/source/DOM/Engine.js +30 -0
  218. package/source/DOM/ItemsContainer.js +48 -0
  219. package/source/DOM/{WaitForStylesToLoad.js → ListTopOffsetWatcher.js} +61 -30
  220. package/source/DOM/ScrollableContainer.js +51 -73
  221. package/source/DOM/VirtualScroller.js +33 -18
  222. package/source/DOM/tbody.js +30 -21
  223. package/source/ItemHeights.js +27 -27
  224. package/source/Layout.js +629 -252
  225. package/source/Layout.test.js +176 -0
  226. package/source/ListHeightMeasurement.js +95 -0
  227. package/source/Resize.js +56 -32
  228. package/source/Scroll.js +135 -82
  229. package/source/VirtualScroller.columns.js +26 -0
  230. package/source/VirtualScroller.constructor.js +336 -0
  231. package/source/VirtualScroller.items.js +302 -0
  232. package/source/VirtualScroller.js +162 -936
  233. package/source/VirtualScroller.layout.js +539 -0
  234. package/source/VirtualScroller.onRender.js +345 -0
  235. package/source/VirtualScroller.resize.js +189 -0
  236. package/source/VirtualScroller.state.js +284 -0
  237. package/source/VirtualScroller.verticalSpacing.js +51 -0
  238. package/source/getVerticalSpacing.js +7 -7
  239. package/source/react/VirtualScroller.js +243 -603
  240. package/source/react/useClassName.js +14 -0
  241. package/source/react/useHandleItemsChange.js +115 -0
  242. package/source/react/useInstanceMethods.js +25 -0
  243. package/source/react/useItemKeys.js +59 -0
  244. package/source/react/useOnItemHeightChange.js +28 -0
  245. package/source/react/useOnItemStateChange.js +28 -0
  246. package/source/react/useState.js +114 -0
  247. package/source/react/useStyle.js +20 -0
  248. package/source/react/useVirtualScroller.js +59 -0
  249. package/source/react/useVirtualScrollerStartStop.js +12 -0
  250. package/source/test/Engine.js +11 -0
  251. package/source/test/ItemsContainer.js +87 -0
  252. package/source/test/ScrollableContainer.js +88 -0
  253. package/source/test/VirtualScroller.js +232 -0
  254. package/source/utility/debounce.js +22 -5
  255. package/source/utility/debug.js +34 -3
  256. package/source/utility/getStateSnapshot.js +36 -0
  257. package/source/utility/px.js +1 -1
  258. package/source/utility/px.test.js +9 -0
  259. package/website/index-bypass.html +195 -0
  260. package/website/index-grid.html +0 -1
  261. package/website/index-scrollableContainer.html +208 -0
  262. package/website/index-tbody-scrollableContainer.html +68 -0
  263. package/website/index-tbody.html +55 -0
  264. package/commonjs/DOM/RenderingEngine.js +0 -33
  265. package/commonjs/DOM/RenderingEngine.js.map +0 -1
  266. package/commonjs/DOM/Screen.js +0 -87
  267. package/commonjs/DOM/Screen.js.map +0 -1
  268. package/commonjs/DOM/WaitForStylesToLoad.js.map +0 -1
  269. package/commonjs/RestoreScroll.js +0 -118
  270. package/commonjs/RestoreScroll.js.map +0 -1
  271. package/dom/index.commonjs.js +0 -4
  272. package/index.commonjs.js +0 -4
  273. package/modules/DOM/RenderingEngine.js +0 -19
  274. package/modules/DOM/RenderingEngine.js.map +0 -1
  275. package/modules/DOM/Screen.js +0 -80
  276. package/modules/DOM/Screen.js.map +0 -1
  277. package/modules/DOM/WaitForStylesToLoad.js.map +0 -1
  278. package/modules/RestoreScroll.js +0 -111
  279. package/modules/RestoreScroll.js.map +0 -1
  280. package/react/index.commonjs.js +0 -4
  281. package/source/DOM/RenderingEngine.js +0 -22
  282. package/source/DOM/Screen.js +0 -51
  283. package/source/RestoreScroll.js +0 -86
@@ -0,0 +1,305 @@
1
+ "use strict";
2
+
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = _default;
9
+
10
+ var _debug = _interopRequireWildcard(require("./utility/debug.js"));
11
+
12
+ var _getItemsDiff = _interopRequireDefault(require("./getItemsDiff.js"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
15
+
16
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
+
18
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
+
20
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
21
+
22
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
23
+
24
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
25
+
26
+ function _default() {
27
+ var _this = this;
28
+
29
+ this.getItemsCount = function () {
30
+ return _this.getState().items.length;
31
+ };
32
+ /**
33
+ * Updates `items`. For example, can prepend or append new items to the list.
34
+ * @param {any[]} newItems
35
+ * @param {boolean} [options.preserveScrollPositionOnPrependItems] — Set to `true` to enable "restore scroll position after prepending items" feature (could be useful when implementing "Show previous items" button).
36
+ */
37
+
38
+
39
+ this._setItems = function (newItems) {
40
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
41
+
42
+ var _this$getState = _this.getState(),
43
+ previousItems = _this$getState.items; // Even if `newItems` are equal to `this.state.items`,
44
+ // still perform a `updateState()` call, because, if `updateState()` calls
45
+ // were "asynchronous", there could be a situation when a developer
46
+ // first calls `setItems(newItems)` and then `setItems(oldItems)`:
47
+ // if this function did `return` `if (newItems === this.state.items)`
48
+ // then `updateState({ items: newItems })` would be scheduled as part of
49
+ // `setItems(newItems)` call, but the subsequent `setItems(oldItems)` call
50
+ // wouldn't do anything resulting in `newItems` being set as a result,
51
+ // and that wouldn't be what the developer intended.
52
+
53
+
54
+ var _this$getState2 = _this.getState(),
55
+ itemStates = _this$getState2.itemStates;
56
+
57
+ var _ref = _this.widthHasChanged ? _this.widthHasChanged.stateUpdate : _this.getState(),
58
+ itemHeights = _ref.itemHeights;
59
+
60
+ (0, _debug["default"])('~ Update items ~');
61
+ var layoutUpdate;
62
+ var itemsUpdateInfo; // Compare the new items to the current items.
63
+
64
+ var itemsDiff = _this.getItemsDiff(previousItems, newItems); // See if it's an "incremental" items update.
65
+
66
+
67
+ if (itemsDiff) {
68
+ var _ref2 = _this.widthHasChanged ? _this.widthHasChanged.stateUpdate : _this.getState(),
69
+ firstShownItemIndex = _ref2.firstShownItemIndex,
70
+ lastShownItemIndex = _ref2.lastShownItemIndex,
71
+ beforeItemsHeight = _ref2.beforeItemsHeight,
72
+ afterItemsHeight = _ref2.afterItemsHeight;
73
+
74
+ var shouldRestoreScrollPosition = firstShownItemIndex === 0 && ( // `preserveScrollPosition` option name is deprecated,
75
+ // use `preserveScrollPositionOnPrependItems` instead.
76
+ options.preserveScrollPositionOnPrependItems || options.preserveScrollPosition);
77
+ var prependedItemsCount = itemsDiff.prependedItemsCount,
78
+ appendedItemsCount = itemsDiff.appendedItemsCount;
79
+ var shouldResetGridLayout;
80
+ layoutUpdate = _this.layout.getLayoutUpdateForItemsDiff({
81
+ firstShownItemIndex: firstShownItemIndex,
82
+ lastShownItemIndex: lastShownItemIndex,
83
+ beforeItemsHeight: beforeItemsHeight,
84
+ afterItemsHeight: afterItemsHeight
85
+ }, {
86
+ prependedItemsCount: prependedItemsCount,
87
+ appendedItemsCount: appendedItemsCount
88
+ }, {
89
+ itemsCount: newItems.length,
90
+ columnsCount: _this.getActualColumnsCount(),
91
+ shouldRestoreScrollPosition: shouldRestoreScrollPosition,
92
+ onResetGridLayout: function onResetGridLayout() {
93
+ return shouldResetGridLayout = true;
94
+ }
95
+ });
96
+
97
+ if (prependedItemsCount > 0) {
98
+ (0, _debug["default"])('Prepend', prependedItemsCount, 'items');
99
+ itemHeights = new Array(prependedItemsCount).concat(itemHeights);
100
+
101
+ if (itemStates) {
102
+ itemStates = new Array(prependedItemsCount).concat(itemStates);
103
+ } // Restore scroll position after prepending items (if requested).
104
+
105
+
106
+ if (shouldRestoreScrollPosition) {
107
+ (0, _debug["default"])('Will restore scroll position');
108
+
109
+ _this.listHeightMeasurement.snapshotListHeightBeforeAddingNewItems({
110
+ previousItems: previousItems,
111
+ newItems: newItems,
112
+ prependedItemsCount: prependedItemsCount
113
+ }); // "Seamless prepend" scenario doesn't result in a re-layout,
114
+ // so if any "non measured item" is currently pending,
115
+ // it doesn't get reset and will be handled after `state` is updated.
116
+
117
+
118
+ if (_this.firstNonMeasuredItemIndex !== undefined) {
119
+ _this.firstNonMeasuredItemIndex += prependedItemsCount;
120
+ }
121
+ } else {
122
+ (0, _debug["default"])('Reset layout');
123
+
124
+ if (shouldResetGridLayout) {
125
+ (0, _debug["default"])('Reason: Prepended items count', prependedItemsCount, 'is not divisible by Columns Count', _this.getActualColumnsCount()); // Reset item heights because the whole grid is going to be rebalanced
126
+ // and re-rendered in a different configuration.
127
+
128
+ itemHeights = new Array(newItems.length);
129
+ } else {
130
+ // Reset layout because none of the prepended items have been measured.
131
+ (0, _debug["default"])('Reason: Prepended items\' heights are unknown');
132
+ }
133
+
134
+ layoutUpdate = _this.layout.getInitialLayoutValues({
135
+ itemsCount: newItems.length,
136
+ columnsCount: _this.getActualColumnsCount()
137
+ }); // Unschedule a potentially scheduled layout update
138
+ // after measuring a previously non-measured item
139
+ // because the list will be re-layout anyway
140
+ // due to the new items being set.
141
+
142
+ _this.firstNonMeasuredItemIndex = undefined;
143
+ }
144
+ }
145
+
146
+ if (appendedItemsCount > 0) {
147
+ (0, _debug["default"])('Append', appendedItemsCount, 'items');
148
+ itemHeights = itemHeights.concat(new Array(appendedItemsCount));
149
+
150
+ if (itemStates) {
151
+ itemStates = itemStates.concat(new Array(appendedItemsCount));
152
+ }
153
+ }
154
+
155
+ itemsUpdateInfo = {
156
+ prepend: prependedItemsCount > 0,
157
+ append: appendedItemsCount > 0
158
+ };
159
+ } else {
160
+ (0, _debug["default"])('Items have changed, and', itemsDiff ? 'a re-layout from scratch has been requested.' : 'it\'s not a simple append and/or prepend.', 'Rerender the entire list from scratch.');
161
+ (0, _debug["default"])('Previous items', previousItems);
162
+ (0, _debug["default"])('New items', newItems); // Reset item heights and item states.
163
+
164
+ itemHeights = new Array(newItems.length);
165
+ itemStates = new Array(newItems.length);
166
+ layoutUpdate = _this.layout.getInitialLayoutValues({
167
+ itemsCount: newItems.length,
168
+ columnsCount: _this.getActualColumnsCount()
169
+ }); // Unschedule a potentially scheduled layout update
170
+ // after measuring a previously non-measured item
171
+ // because the list will be re-layout from scratch
172
+ // due to the new items being set.
173
+
174
+ _this.firstNonMeasuredItemIndex = undefined; // Also reset any potential pending scroll position restoration.
175
+ // For example, imagine a developer first called `.setItems(incrementalItemsUpdate)`
176
+ // and then called `.setItems(differentItems)` and there was no state update
177
+ // in between those two calls. This could happen because state updates aren't
178
+ // required to be "synchronous". On other words, calling `this.updateState()`
179
+ // doesn't necessarily mean that the state is applied immediately.
180
+ // Imagine also that such "delayed" state updates could be batched,
181
+ // like they do in React inside event handlers (though that doesn't apply to this case):
182
+ // https://github.com/facebook/react/issues/10231#issuecomment-316644950
183
+ // If `this.listHeightMeasurement` wasn't reset on `.setItems(differentItems)`
184
+ // and if the second `this.updateState()` call overwrites the first one
185
+ // then it would attempt to restore scroll position in a situation when
186
+ // it should no longer do that. Hence the reset here.
187
+
188
+ _this.listHeightMeasurement.reset();
189
+
190
+ itemsUpdateInfo = {
191
+ replace: true
192
+ };
193
+ }
194
+
195
+ (0, _debug["default"])('~ Update state ~'); // const layoutValuesAfterUpdate = {
196
+ // ...this.getState(),
197
+ // ...layoutUpdate
198
+ // }
199
+ // `layoutUpdate` is equivalent to `layoutValuesAfterUpdate` because
200
+ // `layoutUpdate` contains all the relevant properties.
201
+
202
+ (0, _debug["default"])('First shown item index', layoutUpdate.firstShownItemIndex);
203
+ (0, _debug["default"])('Last shown item index', layoutUpdate.lastShownItemIndex);
204
+ (0, _debug["default"])('Before items height', layoutUpdate.beforeItemsHeight);
205
+ (0, _debug["default"])('After items height (actual or estimated)', layoutUpdate.afterItemsHeight); // Optionally preload items to be rendered.
206
+ //
207
+ // `layoutUpdate` is equivalent to `layoutValuesAfterUpdate` because
208
+ // `layoutUpdate` contains all the relevant properties.
209
+ //
210
+
211
+ _this.onBeforeShowItems(newItems, itemHeights, layoutUpdate.firstShownItemIndex, layoutUpdate.lastShownItemIndex); // `this.newItemsWillBeRendered` signals that new `items` are being rendered,
212
+ // and that `VirtualScroller` should temporarily stop all other updates.
213
+ //
214
+ // `this.newItemsWillBeRendered` is cleared in `onRender()`.
215
+ //
216
+ // The values in `this.newItemsWillBeRendered` are used, for example,
217
+ // in `.onResize()` handler in order to not break state consistency when
218
+ // state updates are "asynchronous" (delayed) and there's a window resize event
219
+ // in between calling `updateState()` below and that call actually being applied.
220
+ //
221
+
222
+
223
+ _this.newItemsWillBeRendered = _objectSpread(_objectSpread({}, itemsUpdateInfo), {}, {
224
+ count: newItems.length,
225
+ // `layoutUpdate` now contains all layout-related properties, even if those that
226
+ // didn't change. So `firstShownItemIndex` is always in `this.newItemsWillBeRendered`.
227
+ layout: layoutUpdate
228
+ }); // `layoutUpdate` now contains all layout-related properties, even if those that
229
+ // didn't change. So this part is no longer relevant.
230
+ //
231
+ // // If `firstShownItemIndex` is gonna be modified as a result of setting new items
232
+ // // then keep that "new" `firstShownItemIndex` in order for it to be used by
233
+ // // `onResize()` handler when it calculates "new" `firstShownItemIndex`
234
+ // // based on the new columns count (corresponding to the new window width).
235
+ // if (layoutUpdate.firstShownItemIndex !== undefined) {
236
+ // this.newItemsWillBeRendered = {
237
+ // ...this.newItemsWillBeRendered,
238
+ // firstShownItemIndex: layoutUpdate.firstShownItemIndex
239
+ // }
240
+ // }
241
+ // Update `VirtualScroller` state.
242
+ //
243
+ // This state update should overwrite all the `state` properties
244
+ // that are also updated in the "on scroll" handler (`getShownItemIndexes()`):
245
+ //
246
+ // * `firstShownItemIndex`
247
+ // * `lastShownItemIndex`
248
+ // * `beforeItemsHeight`
249
+ // * `afterItemsHeight`
250
+ //
251
+ // That's because this `updateState()` update has a higher priority
252
+ // than that of the "on scroll" handler, so it should overwrite
253
+ // any potential state changes dispatched by the "on scroll" handler.
254
+ //
255
+
256
+ var newState = _objectSpread(_objectSpread({}, layoutUpdate), {}, {
257
+ items: newItems,
258
+ itemStates: itemStates,
259
+ itemHeights: itemHeights
260
+ }); // Introduced `shouldIncludeBeforeResizeValuesInState()` getter just to prevent
261
+ // cluttering `state` with `beforeResize: undefined` property if `beforeResize`
262
+ // hasn't ever been set in `state` previously.
263
+
264
+
265
+ if (_this.beforeResize.shouldIncludeBeforeResizeValuesInState()) {
266
+ if (_this.shouldDiscardBeforeResizeItemHeights()) {
267
+ // Reset "before resize" item heights because now there're new items prepended
268
+ // with unknown heights, or completely new items with unknown heights, so
269
+ // `beforeItemsHeight` value won't be preserved anyway.
270
+ newState.beforeResize = undefined;
271
+ } else {
272
+ // Overwrite `beforeResize` property in `state` even if it wasn't modified
273
+ // because state updates could be "asynchronous" and in that case there could be
274
+ // some previous `updateState()` call from some previous `setItems()` call that
275
+ // hasn't yet been applied, and that previous call might have scheduled setting
276
+ // `state.beforeResize` property to `undefined` in order to reset it, but this
277
+ // next `updateState()` call might not require resetting `state.beforeResize` property
278
+ // so it should undo resetting it by simply overwriting it with its normal value.
279
+ newState.beforeResize = _this.widthHasChanged ? _this.widthHasChanged.stateUpdate.beforeResize : _this.getState().beforeResize;
280
+ }
281
+ } // `newState` should also overwrite all `state` properties that're updated in `onResize()`
282
+ // because `setItems()`'s state updates always overwrite `onResize()`'s state updates.
283
+ // (The least-priority ones are `onScroll()` state updates, but those're simply skipped
284
+ // if there's a pending `setItems()` or `onResize()` update).
285
+ //
286
+ // `state` property exceptions:
287
+ //
288
+ // `verticalSpacing` property is not updated here because it's fine setting it to
289
+ // `undefined` in `onResize()` — it will simply be re-measured after the component re-renders.
290
+ //
291
+ // `columnsCount` property is also not updated here because by definition it's only
292
+ // updated in `onResize()`.
293
+ // Render.
294
+
295
+
296
+ _this._isSettingNewItems = true;
297
+
298
+ _this.updateState(newState);
299
+ };
300
+
301
+ this.getItemsDiff = function (previousItems, newItems) {
302
+ return (0, _getItemsDiff["default"])(previousItems, newItems, _this.isItemEqual);
303
+ };
304
+ }
305
+ //# sourceMappingURL=VirtualScroller.items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VirtualScroller.items.js","names":["getItemsCount","getState","items","length","_setItems","newItems","options","previousItems","itemStates","widthHasChanged","stateUpdate","itemHeights","log","layoutUpdate","itemsUpdateInfo","itemsDiff","getItemsDiff","firstShownItemIndex","lastShownItemIndex","beforeItemsHeight","afterItemsHeight","shouldRestoreScrollPosition","preserveScrollPositionOnPrependItems","preserveScrollPosition","prependedItemsCount","appendedItemsCount","shouldResetGridLayout","layout","getLayoutUpdateForItemsDiff","itemsCount","columnsCount","getActualColumnsCount","onResetGridLayout","Array","concat","listHeightMeasurement","snapshotListHeightBeforeAddingNewItems","firstNonMeasuredItemIndex","undefined","getInitialLayoutValues","prepend","append","reset","replace","onBeforeShowItems","newItemsWillBeRendered","count","newState","beforeResize","shouldIncludeBeforeResizeValuesInState","shouldDiscardBeforeResizeItemHeights","_isSettingNewItems","updateState","isItemEqual"],"sources":["../source/VirtualScroller.items.js"],"sourcesContent":["import log, { isDebug } from './utility/debug.js'\r\nimport getItemsDiff from './getItemsDiff.js'\r\n\r\nexport default function() {\r\n\tthis.getItemsCount = () => {\r\n\t\treturn this.getState().items.length\r\n\t}\r\n\r\n\t/**\r\n\t * Updates `items`. For example, can prepend or append new items to the list.\r\n\t * @param {any[]} newItems\r\n\t * @param {boolean} [options.preserveScrollPositionOnPrependItems] — Set to `true` to enable \"restore scroll position after prepending items\" feature (could be useful when implementing \"Show previous items\" button).\r\n\t */\r\n\tthis._setItems = (newItems, options = {}) => {\r\n\t\tconst {\r\n\t\t\titems: previousItems\r\n\t\t} = this.getState()\r\n\r\n\t\t// Even if `newItems` are equal to `this.state.items`,\r\n\t\t// still perform a `updateState()` call, because, if `updateState()` calls\r\n\t\t// were \"asynchronous\", there could be a situation when a developer\r\n\t\t// first calls `setItems(newItems)` and then `setItems(oldItems)`:\r\n\t\t// if this function did `return` `if (newItems === this.state.items)`\r\n\t\t// then `updateState({ items: newItems })` would be scheduled as part of\r\n\t\t// `setItems(newItems)` call, but the subsequent `setItems(oldItems)` call\r\n\t\t// wouldn't do anything resulting in `newItems` being set as a result,\r\n\t\t// and that wouldn't be what the developer intended.\r\n\r\n\t\tlet { itemStates } = this.getState()\r\n\t\tlet { itemHeights } = this.widthHasChanged\r\n\t\t\t? this.widthHasChanged.stateUpdate\r\n\t\t\t: this.getState()\r\n\r\n\t\tlog('~ Update items ~')\r\n\r\n\t\tlet layoutUpdate\r\n\t\tlet itemsUpdateInfo\r\n\r\n\t\t// Compare the new items to the current items.\r\n\t\tconst itemsDiff = this.getItemsDiff(previousItems, newItems)\r\n\r\n\t\t// See if it's an \"incremental\" items update.\r\n\t\tif (itemsDiff) {\r\n\t\t\tconst {\r\n\t\t\t\tfirstShownItemIndex,\r\n\t\t\t\tlastShownItemIndex,\r\n\t\t\t\tbeforeItemsHeight,\r\n\t\t\t\tafterItemsHeight\r\n\t\t\t} = this.widthHasChanged\r\n\t\t\t\t? this.widthHasChanged.stateUpdate\r\n\t\t\t\t: this.getState()\r\n\r\n\t\t\tconst shouldRestoreScrollPosition = firstShownItemIndex === 0 &&\r\n\t\t\t\t// `preserveScrollPosition` option name is deprecated,\r\n\t\t\t\t// use `preserveScrollPositionOnPrependItems` instead.\r\n\t\t\t\t(options.preserveScrollPositionOnPrependItems || options.preserveScrollPosition)\r\n\r\n\t\t\tconst {\r\n\t\t\t\tprependedItemsCount,\r\n\t\t\t\tappendedItemsCount\r\n\t\t\t} = itemsDiff\r\n\r\n\t\t\tlet shouldResetGridLayout\r\n\r\n\t\t\tlayoutUpdate = this.layout.getLayoutUpdateForItemsDiff({\r\n\t\t\t\tfirstShownItemIndex,\r\n\t\t\t\tlastShownItemIndex,\r\n\t\t\t\tbeforeItemsHeight,\r\n\t\t\t\tafterItemsHeight\r\n\t\t\t}, {\r\n\t\t\t\tprependedItemsCount,\r\n\t\t\t\tappendedItemsCount\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: newItems.length,\r\n\t\t\t\tcolumnsCount: this.getActualColumnsCount(),\r\n\t\t\t\tshouldRestoreScrollPosition,\r\n\t\t\t\tonResetGridLayout: () => shouldResetGridLayout = true\r\n\t\t\t})\r\n\r\n\t\t\tif (prependedItemsCount > 0) {\r\n\t\t\t\tlog('Prepend', prependedItemsCount, 'items')\r\n\r\n\t\t\t\titemHeights = new Array(prependedItemsCount).concat(itemHeights)\r\n\r\n\t\t\t\tif (itemStates) {\r\n\t\t\t\t\titemStates = new Array(prependedItemsCount).concat(itemStates)\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Restore scroll position after prepending items (if requested).\r\n\t\t\t\tif (shouldRestoreScrollPosition) {\r\n\t\t\t\t\tlog('Will restore scroll position')\r\n\t\t\t\t\tthis.listHeightMeasurement.snapshotListHeightBeforeAddingNewItems({\r\n\t\t\t\t\t\tpreviousItems,\r\n\t\t\t\t\t\tnewItems,\r\n\t\t\t\t\t\tprependedItemsCount\r\n\t\t\t\t\t})\r\n\t\t\t\t\t// \"Seamless prepend\" scenario doesn't result in a re-layout,\r\n\t\t\t\t\t// so if any \"non measured item\" is currently pending,\r\n\t\t\t\t\t// it doesn't get reset and will be handled after `state` is updated.\r\n\t\t\t\t\tif (this.firstNonMeasuredItemIndex !== undefined) {\r\n\t\t\t\t\t\tthis.firstNonMeasuredItemIndex += prependedItemsCount\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tlog('Reset layout')\r\n\t\t\t\t\tif (shouldResetGridLayout) {\r\n\t\t\t\t\t\tlog('Reason: Prepended items count', prependedItemsCount, 'is not divisible by Columns Count', this.getActualColumnsCount())\r\n\t\t\t\t\t\t// Reset item heights because the whole grid is going to be rebalanced\r\n\t\t\t\t\t\t// and re-rendered in a different configuration.\r\n\t\t\t\t\t\titemHeights = new Array(newItems.length)\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// Reset layout because none of the prepended items have been measured.\r\n\t\t\t\t\t\tlog('Reason: Prepended items\\' heights are unknown')\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlayoutUpdate = this.layout.getInitialLayoutValues({\r\n\t\t\t\t\t\titemsCount: newItems.length,\r\n\t\t\t\t\t\tcolumnsCount: this.getActualColumnsCount()\r\n\t\t\t\t\t})\r\n\t\t\t\t\t// Unschedule a potentially scheduled layout update\r\n\t\t\t\t\t// after measuring a previously non-measured item\r\n\t\t\t\t\t// because the list will be re-layout anyway\r\n\t\t\t\t\t// due to the new items being set.\r\n\t\t\t\t\tthis.firstNonMeasuredItemIndex = undefined\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (appendedItemsCount > 0) {\r\n\t\t\t\tlog('Append', appendedItemsCount, 'items')\r\n\t\t\t\titemHeights = itemHeights.concat(new Array(appendedItemsCount))\r\n\t\t\t\tif (itemStates) {\r\n\t\t\t\t\titemStates = itemStates.concat(new Array(appendedItemsCount))\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\titemsUpdateInfo = {\r\n\t\t\t\tprepend: prependedItemsCount > 0,\r\n\t\t\t\tappend: appendedItemsCount > 0\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tlog('Items have changed, and', (itemsDiff ? 'a re-layout from scratch has been requested.' : 'it\\'s not a simple append and/or prepend.'), 'Rerender the entire list from scratch.')\r\n\t\t\tlog('Previous items', previousItems)\r\n\t\t\tlog('New items', newItems)\r\n\r\n\t\t\t// Reset item heights and item states.\r\n\t\t\titemHeights = new Array(newItems.length)\r\n\t\t\titemStates = new Array(newItems.length)\r\n\r\n\t\t\tlayoutUpdate = this.layout.getInitialLayoutValues({\r\n\t\t\t\titemsCount: newItems.length,\r\n\t\t\t\tcolumnsCount: this.getActualColumnsCount()\r\n\t\t\t})\r\n\r\n\t\t\t// Unschedule a potentially scheduled layout update\r\n\t\t\t// after measuring a previously non-measured item\r\n\t\t\t// because the list will be re-layout from scratch\r\n\t\t\t// due to the new items being set.\r\n\t\t\tthis.firstNonMeasuredItemIndex = undefined\r\n\r\n\t\t\t// Also reset any potential pending scroll position restoration.\r\n\t\t\t// For example, imagine a developer first called `.setItems(incrementalItemsUpdate)`\r\n\t\t\t// and then called `.setItems(differentItems)` and there was no state update\r\n\t\t\t// in between those two calls. This could happen because state updates aren't\r\n\t\t\t// required to be \"synchronous\". On other words, calling `this.updateState()`\r\n\t\t\t// doesn't necessarily mean that the state is applied immediately.\r\n\t\t\t// Imagine also that such \"delayed\" state updates could be batched,\r\n\t\t\t// like they do in React inside event handlers (though that doesn't apply to this case):\r\n\t\t\t// https://github.com/facebook/react/issues/10231#issuecomment-316644950\r\n\t\t\t// If `this.listHeightMeasurement` wasn't reset on `.setItems(differentItems)`\r\n\t\t\t// and if the second `this.updateState()` call overwrites the first one\r\n\t\t\t// then it would attempt to restore scroll position in a situation when\r\n\t\t\t// it should no longer do that. Hence the reset here.\r\n\t\t\tthis.listHeightMeasurement.reset()\r\n\r\n\t\t\titemsUpdateInfo = {\r\n\t\t\t\treplace: true\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlog('~ Update state ~')\r\n\r\n\t\t// const layoutValuesAfterUpdate = {\r\n\t\t// \t...this.getState(),\r\n\t\t// \t...layoutUpdate\r\n\t\t// }\r\n\r\n\t\t// `layoutUpdate` is equivalent to `layoutValuesAfterUpdate` because\r\n\t\t// `layoutUpdate` contains all the relevant properties.\r\n\t\tlog('First shown item index', layoutUpdate.firstShownItemIndex)\r\n\t\tlog('Last shown item index', layoutUpdate.lastShownItemIndex)\r\n\t\tlog('Before items height', layoutUpdate.beforeItemsHeight)\r\n\t\tlog('After items height (actual or estimated)', layoutUpdate.afterItemsHeight)\r\n\r\n\t\t// Optionally preload items to be rendered.\r\n\t\t//\r\n\t\t// `layoutUpdate` is equivalent to `layoutValuesAfterUpdate` because\r\n\t\t// `layoutUpdate` contains all the relevant properties.\r\n\t\t//\r\n\t\tthis.onBeforeShowItems(\r\n\t\t\tnewItems,\r\n\t\t\titemHeights,\r\n\t\t\tlayoutUpdate.firstShownItemIndex,\r\n\t\t\tlayoutUpdate.lastShownItemIndex\r\n\t\t)\r\n\r\n\t\t// `this.newItemsWillBeRendered` signals that new `items` are being rendered,\r\n\t\t// and that `VirtualScroller` should temporarily stop all other updates.\r\n\t\t//\r\n\t\t// `this.newItemsWillBeRendered` is cleared in `onRender()`.\r\n\t\t//\r\n\t\t// The values in `this.newItemsWillBeRendered` are used, for example,\r\n\t\t// in `.onResize()` handler in order to not break state consistency when\r\n\t\t// state updates are \"asynchronous\" (delayed) and there's a window resize event\r\n\t\t// in between calling `updateState()` below and that call actually being applied.\r\n\t\t//\r\n\t\tthis.newItemsWillBeRendered = {\r\n\t\t\t...itemsUpdateInfo,\r\n\t\t\tcount: newItems.length,\r\n\t\t\t// `layoutUpdate` now contains all layout-related properties, even if those that\r\n\t\t\t// didn't change. So `firstShownItemIndex` is always in `this.newItemsWillBeRendered`.\r\n\t\t\tlayout: layoutUpdate\r\n\t\t}\r\n\r\n\t\t// `layoutUpdate` now contains all layout-related properties, even if those that\r\n\t\t// didn't change. So this part is no longer relevant.\r\n\t\t//\r\n\t\t// // If `firstShownItemIndex` is gonna be modified as a result of setting new items\r\n\t\t// // then keep that \"new\" `firstShownItemIndex` in order for it to be used by\r\n\t\t// // `onResize()` handler when it calculates \"new\" `firstShownItemIndex`\r\n\t\t// // based on the new columns count (corresponding to the new window width).\r\n\t\t// if (layoutUpdate.firstShownItemIndex !== undefined) {\r\n\t\t// \tthis.newItemsWillBeRendered = {\r\n\t\t// \t\t...this.newItemsWillBeRendered,\r\n\t\t// \t\tfirstShownItemIndex: layoutUpdate.firstShownItemIndex\r\n\t\t// \t}\r\n\t\t// }\r\n\r\n\t\t// Update `VirtualScroller` state.\r\n\t\t//\r\n\t\t// This state update should overwrite all the `state` properties\r\n\t\t// that are also updated in the \"on scroll\" handler (`getShownItemIndexes()`):\r\n\t\t//\r\n\t\t// * `firstShownItemIndex`\r\n\t\t// * `lastShownItemIndex`\r\n\t\t// * `beforeItemsHeight`\r\n\t\t// * `afterItemsHeight`\r\n\t\t//\r\n\t\t// That's because this `updateState()` update has a higher priority\r\n\t\t// than that of the \"on scroll\" handler, so it should overwrite\r\n\t\t// any potential state changes dispatched by the \"on scroll\" handler.\r\n\t\t//\r\n\t\tconst newState = {\r\n\t\t\t...layoutUpdate,\r\n\t\t\titems: newItems,\r\n\t\t\titemStates,\r\n\t\t\titemHeights\r\n\t\t}\r\n\r\n\t\t// Introduced `shouldIncludeBeforeResizeValuesInState()` getter just to prevent\r\n\t\t// cluttering `state` with `beforeResize: undefined` property if `beforeResize`\r\n\t\t// hasn't ever been set in `state` previously.\r\n\t\tif (this.beforeResize.shouldIncludeBeforeResizeValuesInState()) {\r\n\t\t\tif (this.shouldDiscardBeforeResizeItemHeights()) {\r\n\t\t\t\t// Reset \"before resize\" item heights because now there're new items prepended\r\n\t\t\t\t// with unknown heights, or completely new items with unknown heights, so\r\n\t\t\t\t// `beforeItemsHeight` value won't be preserved anyway.\r\n\t\t\t\tnewState.beforeResize = undefined\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// Overwrite `beforeResize` property in `state` even if it wasn't modified\r\n\t\t\t\t// because state updates could be \"asynchronous\" and in that case there could be\r\n\t\t\t\t// some previous `updateState()` call from some previous `setItems()` call that\r\n\t\t\t\t// hasn't yet been applied, and that previous call might have scheduled setting\r\n\t\t\t\t// `state.beforeResize` property to `undefined` in order to reset it, but this\r\n\t\t\t\t// next `updateState()` call might not require resetting `state.beforeResize` property\r\n\t\t\t\t// so it should undo resetting it by simply overwriting it with its normal value.\r\n\t\t\t\tnewState.beforeResize = this.widthHasChanged\r\n\t\t\t\t\t? this.widthHasChanged.stateUpdate.beforeResize\r\n\t\t\t\t\t: this.getState().beforeResize\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// `newState` should also overwrite all `state` properties that're updated in `onResize()`\r\n\t\t// because `setItems()`'s state updates always overwrite `onResize()`'s state updates.\r\n\t\t// (The least-priority ones are `onScroll()` state updates, but those're simply skipped\r\n\t\t// if there's a pending `setItems()` or `onResize()` update).\r\n\t\t//\r\n\t\t// `state` property exceptions:\r\n\t\t//\r\n\t\t// `verticalSpacing` property is not updated here because it's fine setting it to\r\n\t\t// `undefined` in `onResize()` — it will simply be re-measured after the component re-renders.\r\n\t\t//\r\n\t\t// `columnsCount` property is also not updated here because by definition it's only\r\n\t\t// updated in `onResize()`.\r\n\r\n\t\t// Render.\r\n\t\tthis._isSettingNewItems = true\r\n\t\tthis.updateState(newState)\r\n\t}\r\n\r\n\tthis.getItemsDiff = (previousItems, newItems) => {\r\n\t\treturn getItemsDiff(previousItems, newItems, this.isItemEqual)\r\n\t}\r\n}"],"mappings":"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"}