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,288 @@
1
+ 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; }
2
+
3
+ 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; }
4
+
5
+ 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; }
6
+
7
+ import log, { isDebug } from './utility/debug.js';
8
+ import getItemsDiff from './getItemsDiff.js';
9
+ export default function () {
10
+ var _this = this;
11
+
12
+ this.getItemsCount = function () {
13
+ return _this.getState().items.length;
14
+ };
15
+ /**
16
+ * Updates `items`. For example, can prepend or append new items to the list.
17
+ * @param {any[]} newItems
18
+ * @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).
19
+ */
20
+
21
+
22
+ this._setItems = function (newItems) {
23
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
24
+
25
+ var _this$getState = _this.getState(),
26
+ previousItems = _this$getState.items; // Even if `newItems` are equal to `this.state.items`,
27
+ // still perform a `updateState()` call, because, if `updateState()` calls
28
+ // were "asynchronous", there could be a situation when a developer
29
+ // first calls `setItems(newItems)` and then `setItems(oldItems)`:
30
+ // if this function did `return` `if (newItems === this.state.items)`
31
+ // then `updateState({ items: newItems })` would be scheduled as part of
32
+ // `setItems(newItems)` call, but the subsequent `setItems(oldItems)` call
33
+ // wouldn't do anything resulting in `newItems` being set as a result,
34
+ // and that wouldn't be what the developer intended.
35
+
36
+
37
+ var _this$getState2 = _this.getState(),
38
+ itemStates = _this$getState2.itemStates;
39
+
40
+ var _ref = _this.widthHasChanged ? _this.widthHasChanged.stateUpdate : _this.getState(),
41
+ itemHeights = _ref.itemHeights;
42
+
43
+ log('~ Update items ~');
44
+ var layoutUpdate;
45
+ var itemsUpdateInfo; // Compare the new items to the current items.
46
+
47
+ var itemsDiff = _this.getItemsDiff(previousItems, newItems); // See if it's an "incremental" items update.
48
+
49
+
50
+ if (itemsDiff) {
51
+ var _ref2 = _this.widthHasChanged ? _this.widthHasChanged.stateUpdate : _this.getState(),
52
+ firstShownItemIndex = _ref2.firstShownItemIndex,
53
+ lastShownItemIndex = _ref2.lastShownItemIndex,
54
+ beforeItemsHeight = _ref2.beforeItemsHeight,
55
+ afterItemsHeight = _ref2.afterItemsHeight;
56
+
57
+ var shouldRestoreScrollPosition = firstShownItemIndex === 0 && ( // `preserveScrollPosition` option name is deprecated,
58
+ // use `preserveScrollPositionOnPrependItems` instead.
59
+ options.preserveScrollPositionOnPrependItems || options.preserveScrollPosition);
60
+ var prependedItemsCount = itemsDiff.prependedItemsCount,
61
+ appendedItemsCount = itemsDiff.appendedItemsCount;
62
+ var shouldResetGridLayout;
63
+ layoutUpdate = _this.layout.getLayoutUpdateForItemsDiff({
64
+ firstShownItemIndex: firstShownItemIndex,
65
+ lastShownItemIndex: lastShownItemIndex,
66
+ beforeItemsHeight: beforeItemsHeight,
67
+ afterItemsHeight: afterItemsHeight
68
+ }, {
69
+ prependedItemsCount: prependedItemsCount,
70
+ appendedItemsCount: appendedItemsCount
71
+ }, {
72
+ itemsCount: newItems.length,
73
+ columnsCount: _this.getActualColumnsCount(),
74
+ shouldRestoreScrollPosition: shouldRestoreScrollPosition,
75
+ onResetGridLayout: function onResetGridLayout() {
76
+ return shouldResetGridLayout = true;
77
+ }
78
+ });
79
+
80
+ if (prependedItemsCount > 0) {
81
+ log('Prepend', prependedItemsCount, 'items');
82
+ itemHeights = new Array(prependedItemsCount).concat(itemHeights);
83
+
84
+ if (itemStates) {
85
+ itemStates = new Array(prependedItemsCount).concat(itemStates);
86
+ } // Restore scroll position after prepending items (if requested).
87
+
88
+
89
+ if (shouldRestoreScrollPosition) {
90
+ log('Will restore scroll position');
91
+
92
+ _this.listHeightMeasurement.snapshotListHeightBeforeAddingNewItems({
93
+ previousItems: previousItems,
94
+ newItems: newItems,
95
+ prependedItemsCount: prependedItemsCount
96
+ }); // "Seamless prepend" scenario doesn't result in a re-layout,
97
+ // so if any "non measured item" is currently pending,
98
+ // it doesn't get reset and will be handled after `state` is updated.
99
+
100
+
101
+ if (_this.firstNonMeasuredItemIndex !== undefined) {
102
+ _this.firstNonMeasuredItemIndex += prependedItemsCount;
103
+ }
104
+ } else {
105
+ log('Reset layout');
106
+
107
+ if (shouldResetGridLayout) {
108
+ log('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
109
+ // and re-rendered in a different configuration.
110
+
111
+ itemHeights = new Array(newItems.length);
112
+ } else {
113
+ // Reset layout because none of the prepended items have been measured.
114
+ log('Reason: Prepended items\' heights are unknown');
115
+ }
116
+
117
+ layoutUpdate = _this.layout.getInitialLayoutValues({
118
+ itemsCount: newItems.length,
119
+ columnsCount: _this.getActualColumnsCount()
120
+ }); // Unschedule a potentially scheduled layout update
121
+ // after measuring a previously non-measured item
122
+ // because the list will be re-layout anyway
123
+ // due to the new items being set.
124
+
125
+ _this.firstNonMeasuredItemIndex = undefined;
126
+ }
127
+ }
128
+
129
+ if (appendedItemsCount > 0) {
130
+ log('Append', appendedItemsCount, 'items');
131
+ itemHeights = itemHeights.concat(new Array(appendedItemsCount));
132
+
133
+ if (itemStates) {
134
+ itemStates = itemStates.concat(new Array(appendedItemsCount));
135
+ }
136
+ }
137
+
138
+ itemsUpdateInfo = {
139
+ prepend: prependedItemsCount > 0,
140
+ append: appendedItemsCount > 0
141
+ };
142
+ } else {
143
+ log('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.');
144
+ log('Previous items', previousItems);
145
+ log('New items', newItems); // Reset item heights and item states.
146
+
147
+ itemHeights = new Array(newItems.length);
148
+ itemStates = new Array(newItems.length);
149
+ layoutUpdate = _this.layout.getInitialLayoutValues({
150
+ itemsCount: newItems.length,
151
+ columnsCount: _this.getActualColumnsCount()
152
+ }); // Unschedule a potentially scheduled layout update
153
+ // after measuring a previously non-measured item
154
+ // because the list will be re-layout from scratch
155
+ // due to the new items being set.
156
+
157
+ _this.firstNonMeasuredItemIndex = undefined; // Also reset any potential pending scroll position restoration.
158
+ // For example, imagine a developer first called `.setItems(incrementalItemsUpdate)`
159
+ // and then called `.setItems(differentItems)` and there was no state update
160
+ // in between those two calls. This could happen because state updates aren't
161
+ // required to be "synchronous". On other words, calling `this.updateState()`
162
+ // doesn't necessarily mean that the state is applied immediately.
163
+ // Imagine also that such "delayed" state updates could be batched,
164
+ // like they do in React inside event handlers (though that doesn't apply to this case):
165
+ // https://github.com/facebook/react/issues/10231#issuecomment-316644950
166
+ // If `this.listHeightMeasurement` wasn't reset on `.setItems(differentItems)`
167
+ // and if the second `this.updateState()` call overwrites the first one
168
+ // then it would attempt to restore scroll position in a situation when
169
+ // it should no longer do that. Hence the reset here.
170
+
171
+ _this.listHeightMeasurement.reset();
172
+
173
+ itemsUpdateInfo = {
174
+ replace: true
175
+ };
176
+ }
177
+
178
+ log('~ Update state ~'); // const layoutValuesAfterUpdate = {
179
+ // ...this.getState(),
180
+ // ...layoutUpdate
181
+ // }
182
+ // `layoutUpdate` is equivalent to `layoutValuesAfterUpdate` because
183
+ // `layoutUpdate` contains all the relevant properties.
184
+
185
+ log('First shown item index', layoutUpdate.firstShownItemIndex);
186
+ log('Last shown item index', layoutUpdate.lastShownItemIndex);
187
+ log('Before items height', layoutUpdate.beforeItemsHeight);
188
+ log('After items height (actual or estimated)', layoutUpdate.afterItemsHeight); // Optionally preload items to be rendered.
189
+ //
190
+ // `layoutUpdate` is equivalent to `layoutValuesAfterUpdate` because
191
+ // `layoutUpdate` contains all the relevant properties.
192
+ //
193
+
194
+ _this.onBeforeShowItems(newItems, itemHeights, layoutUpdate.firstShownItemIndex, layoutUpdate.lastShownItemIndex); // `this.newItemsWillBeRendered` signals that new `items` are being rendered,
195
+ // and that `VirtualScroller` should temporarily stop all other updates.
196
+ //
197
+ // `this.newItemsWillBeRendered` is cleared in `onRender()`.
198
+ //
199
+ // The values in `this.newItemsWillBeRendered` are used, for example,
200
+ // in `.onResize()` handler in order to not break state consistency when
201
+ // state updates are "asynchronous" (delayed) and there's a window resize event
202
+ // in between calling `updateState()` below and that call actually being applied.
203
+ //
204
+
205
+
206
+ _this.newItemsWillBeRendered = _objectSpread(_objectSpread({}, itemsUpdateInfo), {}, {
207
+ count: newItems.length,
208
+ // `layoutUpdate` now contains all layout-related properties, even if those that
209
+ // didn't change. So `firstShownItemIndex` is always in `this.newItemsWillBeRendered`.
210
+ layout: layoutUpdate
211
+ }); // `layoutUpdate` now contains all layout-related properties, even if those that
212
+ // didn't change. So this part is no longer relevant.
213
+ //
214
+ // // If `firstShownItemIndex` is gonna be modified as a result of setting new items
215
+ // // then keep that "new" `firstShownItemIndex` in order for it to be used by
216
+ // // `onResize()` handler when it calculates "new" `firstShownItemIndex`
217
+ // // based on the new columns count (corresponding to the new window width).
218
+ // if (layoutUpdate.firstShownItemIndex !== undefined) {
219
+ // this.newItemsWillBeRendered = {
220
+ // ...this.newItemsWillBeRendered,
221
+ // firstShownItemIndex: layoutUpdate.firstShownItemIndex
222
+ // }
223
+ // }
224
+ // Update `VirtualScroller` state.
225
+ //
226
+ // This state update should overwrite all the `state` properties
227
+ // that are also updated in the "on scroll" handler (`getShownItemIndexes()`):
228
+ //
229
+ // * `firstShownItemIndex`
230
+ // * `lastShownItemIndex`
231
+ // * `beforeItemsHeight`
232
+ // * `afterItemsHeight`
233
+ //
234
+ // That's because this `updateState()` update has a higher priority
235
+ // than that of the "on scroll" handler, so it should overwrite
236
+ // any potential state changes dispatched by the "on scroll" handler.
237
+ //
238
+
239
+ var newState = _objectSpread(_objectSpread({}, layoutUpdate), {}, {
240
+ items: newItems,
241
+ itemStates: itemStates,
242
+ itemHeights: itemHeights
243
+ }); // Introduced `shouldIncludeBeforeResizeValuesInState()` getter just to prevent
244
+ // cluttering `state` with `beforeResize: undefined` property if `beforeResize`
245
+ // hasn't ever been set in `state` previously.
246
+
247
+
248
+ if (_this.beforeResize.shouldIncludeBeforeResizeValuesInState()) {
249
+ if (_this.shouldDiscardBeforeResizeItemHeights()) {
250
+ // Reset "before resize" item heights because now there're new items prepended
251
+ // with unknown heights, or completely new items with unknown heights, so
252
+ // `beforeItemsHeight` value won't be preserved anyway.
253
+ newState.beforeResize = undefined;
254
+ } else {
255
+ // Overwrite `beforeResize` property in `state` even if it wasn't modified
256
+ // because state updates could be "asynchronous" and in that case there could be
257
+ // some previous `updateState()` call from some previous `setItems()` call that
258
+ // hasn't yet been applied, and that previous call might have scheduled setting
259
+ // `state.beforeResize` property to `undefined` in order to reset it, but this
260
+ // next `updateState()` call might not require resetting `state.beforeResize` property
261
+ // so it should undo resetting it by simply overwriting it with its normal value.
262
+ newState.beforeResize = _this.widthHasChanged ? _this.widthHasChanged.stateUpdate.beforeResize : _this.getState().beforeResize;
263
+ }
264
+ } // `newState` should also overwrite all `state` properties that're updated in `onResize()`
265
+ // because `setItems()`'s state updates always overwrite `onResize()`'s state updates.
266
+ // (The least-priority ones are `onScroll()` state updates, but those're simply skipped
267
+ // if there's a pending `setItems()` or `onResize()` update).
268
+ //
269
+ // `state` property exceptions:
270
+ //
271
+ // `verticalSpacing` property is not updated here because it's fine setting it to
272
+ // `undefined` in `onResize()` — it will simply be re-measured after the component re-renders.
273
+ //
274
+ // `columnsCount` property is also not updated here because by definition it's only
275
+ // updated in `onResize()`.
276
+ // Render.
277
+
278
+
279
+ _this._isSettingNewItems = true;
280
+
281
+ _this.updateState(newState);
282
+ };
283
+
284
+ this.getItemsDiff = function (previousItems, newItems) {
285
+ return getItemsDiff(previousItems, newItems, _this.isItemEqual);
286
+ };
287
+ }
288
+ //# sourceMappingURL=VirtualScroller.items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VirtualScroller.items.js","names":["log","isDebug","getItemsDiff","getItemsCount","getState","items","length","_setItems","newItems","options","previousItems","itemStates","widthHasChanged","stateUpdate","itemHeights","layoutUpdate","itemsUpdateInfo","itemsDiff","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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"}