virtual-scroller 1.8.0 → 1.9.1

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 (248) hide show
  1. package/.gitlab-ci.yml +1 -1
  2. package/CHANGELOG.md +57 -0
  3. package/README.md +337 -160
  4. package/bundle/virtual-scroller-dom.js +1 -1
  5. package/bundle/virtual-scroller-dom.js.map +1 -1
  6. package/bundle/virtual-scroller-react.js +1 -1
  7. package/bundle/virtual-scroller-react.js.map +1 -1
  8. package/bundle/virtual-scroller.js +1 -1
  9. package/bundle/virtual-scroller.js.map +1 -1
  10. package/commonjs/BeforeResize.js +23 -27
  11. package/commonjs/BeforeResize.js.map +1 -1
  12. package/commonjs/DOM/Engine.js +7 -7
  13. package/commonjs/DOM/Engine.js.map +1 -1
  14. package/commonjs/DOM/ItemsContainer.js +1 -1
  15. package/commonjs/DOM/ItemsContainer.js.map +1 -1
  16. package/commonjs/DOM/ListTopOffsetWatcher.js +15 -9
  17. package/commonjs/DOM/ListTopOffsetWatcher.js.map +1 -1
  18. package/commonjs/DOM/ScrollableContainer.js +28 -28
  19. package/commonjs/DOM/ScrollableContainer.js.map +1 -1
  20. package/commonjs/DOM/VirtualScroller.js +20 -17
  21. package/commonjs/DOM/VirtualScroller.js.map +1 -1
  22. package/commonjs/DOM/tbody.js +16 -10
  23. package/commonjs/DOM/tbody.js.map +1 -1
  24. package/commonjs/ItemHeights.js +23 -17
  25. package/commonjs/ItemHeights.js.map +1 -1
  26. package/commonjs/Layout.js +15 -13
  27. package/commonjs/Layout.js.map +1 -1
  28. package/commonjs/Layout.test.js +8 -3
  29. package/commonjs/Layout.test.js.map +1 -1
  30. package/commonjs/{ListHeightChangeWatcher.js → ListHeightMeasurement.js} +26 -28
  31. package/commonjs/ListHeightMeasurement.js.map +1 -0
  32. package/commonjs/Resize.js +38 -28
  33. package/commonjs/Resize.js.map +1 -1
  34. package/commonjs/Scroll.js +28 -44
  35. package/commonjs/Scroll.js.map +1 -1
  36. package/commonjs/VirtualScroller.columns.js +43 -0
  37. package/commonjs/VirtualScroller.columns.js.map +1 -0
  38. package/commonjs/VirtualScroller.constructor.js +408 -0
  39. package/commonjs/VirtualScroller.constructor.js.map +1 -0
  40. package/commonjs/VirtualScroller.items.js +305 -0
  41. package/commonjs/VirtualScroller.items.js.map +1 -0
  42. package/commonjs/VirtualScroller.js +132 -1872
  43. package/commonjs/VirtualScroller.js.map +1 -1
  44. package/commonjs/VirtualScroller.layout.js +562 -0
  45. package/commonjs/VirtualScroller.layout.js.map +1 -0
  46. package/commonjs/VirtualScroller.onRender.js +357 -0
  47. package/commonjs/VirtualScroller.onRender.js.map +1 -0
  48. package/commonjs/VirtualScroller.resize.js +186 -0
  49. package/commonjs/VirtualScroller.resize.js.map +1 -0
  50. package/commonjs/VirtualScroller.state.js +301 -0
  51. package/commonjs/VirtualScroller.state.js.map +1 -0
  52. package/commonjs/VirtualScroller.verticalSpacing.js +65 -0
  53. package/commonjs/VirtualScroller.verticalSpacing.js.map +1 -0
  54. package/commonjs/getItemCoordinates.js.map +1 -1
  55. package/commonjs/getItemsDiff.js.map +1 -1
  56. package/commonjs/getVerticalSpacing.js.map +1 -1
  57. package/commonjs/package.json +5 -0
  58. package/commonjs/react/VirtualScroller.js +184 -618
  59. package/commonjs/react/VirtualScroller.js.map +1 -1
  60. package/commonjs/react/useClassName.js +26 -0
  61. package/commonjs/react/useClassName.js.map +1 -0
  62. package/commonjs/react/useHandleItemsChange.js +116 -0
  63. package/commonjs/react/useHandleItemsChange.js.map +1 -0
  64. package/commonjs/react/useInstanceMethods.js +37 -0
  65. package/commonjs/react/useInstanceMethods.js.map +1 -0
  66. package/commonjs/react/useItemKeys.js +60 -0
  67. package/commonjs/react/useItemKeys.js.map +1 -0
  68. package/commonjs/react/useOnItemHeightChange.js +32 -0
  69. package/commonjs/react/useOnItemHeightChange.js.map +1 -0
  70. package/commonjs/react/useOnItemStateChange.js +32 -0
  71. package/commonjs/react/useOnItemStateChange.js.map +1 -0
  72. package/commonjs/react/useState.js +140 -0
  73. package/commonjs/react/useState.js.map +1 -0
  74. package/commonjs/react/useStyle.js +29 -0
  75. package/commonjs/react/useStyle.js.map +1 -0
  76. package/commonjs/react/useVirtualScroller.js +62 -0
  77. package/commonjs/react/useVirtualScroller.js.map +1 -0
  78. package/commonjs/react/useVirtualScrollerStartStop.js +20 -0
  79. package/commonjs/react/useVirtualScrollerStartStop.js.map +1 -0
  80. package/commonjs/test/Engine.js +23 -0
  81. package/commonjs/test/Engine.js.map +1 -0
  82. package/commonjs/test/ItemsContainer.js +127 -0
  83. package/commonjs/test/ItemsContainer.js.map +1 -0
  84. package/commonjs/test/ScrollableContainer.js +130 -0
  85. package/commonjs/test/ScrollableContainer.js.map +1 -0
  86. package/commonjs/test/VirtualScroller.js +281 -0
  87. package/commonjs/test/VirtualScroller.js.map +1 -0
  88. package/commonjs/utility/debounce.js +2 -2
  89. package/commonjs/utility/debounce.js.map +1 -1
  90. package/commonjs/utility/debug.js.map +1 -1
  91. package/commonjs/utility/getStateSnapshot.js +2 -2
  92. package/commonjs/utility/getStateSnapshot.js.map +1 -1
  93. package/commonjs/utility/px.js.map +1 -1
  94. package/commonjs/utility/px.test.js +1 -1
  95. package/commonjs/utility/px.test.js.map +1 -1
  96. package/commonjs/utility/shallowEqual.js +1 -1
  97. package/commonjs/utility/shallowEqual.js.map +1 -1
  98. package/commonjs/utility/throttle.js.map +1 -1
  99. package/dom/index.cjs +4 -0
  100. package/dom/index.cjs.js +9 -0
  101. package/dom/index.d.ts +6 -4
  102. package/dom/index.js +1 -1
  103. package/dom/package.json +10 -4
  104. package/index.cjs +4 -0
  105. package/index.cjs.js +9 -0
  106. package/index.d.ts +30 -15
  107. package/index.js +1 -1
  108. package/modules/BeforeResize.js +22 -27
  109. package/modules/BeforeResize.js.map +1 -1
  110. package/modules/DOM/Engine.js +6 -6
  111. package/modules/DOM/Engine.js.map +1 -1
  112. package/modules/DOM/ItemsContainer.js +1 -1
  113. package/modules/DOM/ItemsContainer.js.map +1 -1
  114. package/modules/DOM/ListTopOffsetWatcher.js +15 -9
  115. package/modules/DOM/ListTopOffsetWatcher.js.map +1 -1
  116. package/modules/DOM/ScrollableContainer.js +28 -28
  117. package/modules/DOM/ScrollableContainer.js.map +1 -1
  118. package/modules/DOM/VirtualScroller.js +19 -16
  119. package/modules/DOM/VirtualScroller.js.map +1 -1
  120. package/modules/DOM/tbody.js +11 -9
  121. package/modules/DOM/tbody.js.map +1 -1
  122. package/modules/ItemHeights.js +22 -16
  123. package/modules/ItemHeights.js.map +1 -1
  124. package/modules/Layout.js +14 -12
  125. package/modules/Layout.js.map +1 -1
  126. package/modules/Layout.test.js +8 -3
  127. package/modules/Layout.test.js.map +1 -1
  128. package/modules/{ListHeightChangeWatcher.js → ListHeightMeasurement.js} +25 -27
  129. package/modules/ListHeightMeasurement.js.map +1 -0
  130. package/modules/Resize.js +38 -28
  131. package/modules/Resize.js.map +1 -1
  132. package/modules/Scroll.js +28 -44
  133. package/modules/Scroll.js.map +1 -1
  134. package/modules/VirtualScroller.columns.js +36 -0
  135. package/modules/VirtualScroller.columns.js.map +1 -0
  136. package/modules/VirtualScroller.constructor.js +371 -0
  137. package/modules/VirtualScroller.constructor.js.map +1 -0
  138. package/modules/VirtualScroller.items.js +288 -0
  139. package/modules/VirtualScroller.items.js.map +1 -0
  140. package/modules/VirtualScroller.js +132 -1860
  141. package/modules/VirtualScroller.js.map +1 -1
  142. package/modules/VirtualScroller.layout.js +549 -0
  143. package/modules/VirtualScroller.layout.js.map +1 -0
  144. package/modules/VirtualScroller.onRender.js +337 -0
  145. package/modules/VirtualScroller.onRender.js.map +1 -0
  146. package/modules/VirtualScroller.resize.js +176 -0
  147. package/modules/VirtualScroller.resize.js.map +1 -0
  148. package/modules/VirtualScroller.state.js +283 -0
  149. package/modules/VirtualScroller.state.js.map +1 -0
  150. package/modules/VirtualScroller.verticalSpacing.js +54 -0
  151. package/modules/VirtualScroller.verticalSpacing.js.map +1 -0
  152. package/modules/getItemCoordinates.js.map +1 -1
  153. package/modules/getItemsDiff.js.map +1 -1
  154. package/modules/getVerticalSpacing.js.map +1 -1
  155. package/modules/react/VirtualScroller.js +176 -625
  156. package/modules/react/VirtualScroller.js.map +1 -1
  157. package/modules/react/useClassName.js +18 -0
  158. package/modules/react/useClassName.js.map +1 -0
  159. package/modules/react/useHandleItemsChange.js +108 -0
  160. package/modules/react/useHandleItemsChange.js.map +1 -0
  161. package/modules/react/useInstanceMethods.js +28 -0
  162. package/modules/react/useInstanceMethods.js.map +1 -0
  163. package/modules/react/useItemKeys.js +52 -0
  164. package/modules/react/useItemKeys.js.map +1 -0
  165. package/modules/react/useOnItemHeightChange.js +24 -0
  166. package/modules/react/useOnItemHeightChange.js.map +1 -0
  167. package/modules/react/useOnItemStateChange.js +24 -0
  168. package/modules/react/useOnItemStateChange.js.map +1 -0
  169. package/modules/react/useState.js +132 -0
  170. package/modules/react/useState.js.map +1 -0
  171. package/modules/react/useStyle.js +19 -0
  172. package/modules/react/useStyle.js.map +1 -0
  173. package/modules/react/useVirtualScroller.js +51 -0
  174. package/modules/react/useVirtualScroller.js.map +1 -0
  175. package/modules/react/useVirtualScrollerStartStop.js +12 -0
  176. package/modules/react/useVirtualScrollerStartStop.js.map +1 -0
  177. package/modules/test/Engine.js +11 -0
  178. package/modules/test/Engine.js.map +1 -0
  179. package/modules/test/ItemsContainer.js +120 -0
  180. package/modules/test/ItemsContainer.js.map +1 -0
  181. package/modules/test/ScrollableContainer.js +123 -0
  182. package/modules/test/ScrollableContainer.js.map +1 -0
  183. package/modules/test/VirtualScroller.js +270 -0
  184. package/modules/test/VirtualScroller.js.map +1 -0
  185. package/modules/utility/debounce.js +2 -2
  186. package/modules/utility/debounce.js.map +1 -1
  187. package/modules/utility/debug.js.map +1 -1
  188. package/modules/utility/getStateSnapshot.js +2 -2
  189. package/modules/utility/getStateSnapshot.js.map +1 -1
  190. package/modules/utility/px.js.map +1 -1
  191. package/modules/utility/px.test.js +1 -1
  192. package/modules/utility/px.test.js.map +1 -1
  193. package/modules/utility/shallowEqual.js +1 -1
  194. package/modules/utility/shallowEqual.js.map +1 -1
  195. package/modules/utility/throttle.js.map +1 -1
  196. package/package.json +46 -23
  197. package/react/index.cjs +4 -0
  198. package/react/index.cjs.js +9 -0
  199. package/react/index.d.ts +10 -9
  200. package/react/index.js +1 -1
  201. package/react/package.json +10 -4
  202. package/rollup.config.mjs +62 -0
  203. package/runnable/create-commonjs-package-json.js +11 -0
  204. package/source/BeforeResize.js +16 -21
  205. package/source/DOM/Engine.js +8 -10
  206. package/source/DOM/ListTopOffsetWatcher.js +13 -8
  207. package/source/DOM/ScrollableContainer.js +23 -21
  208. package/source/DOM/VirtualScroller.js +27 -11
  209. package/source/DOM/tbody.js +30 -21
  210. package/source/ItemHeights.js +19 -14
  211. package/source/Layout.js +12 -9
  212. package/source/Layout.test.js +8 -3
  213. package/source/{ListHeightChangeWatcher.js → ListHeightMeasurement.js} +21 -20
  214. package/source/Resize.js +41 -25
  215. package/source/Scroll.js +27 -35
  216. package/source/VirtualScroller.columns.js +26 -0
  217. package/source/VirtualScroller.constructor.js +336 -0
  218. package/source/VirtualScroller.items.js +302 -0
  219. package/source/VirtualScroller.js +144 -1872
  220. package/source/VirtualScroller.layout.js +539 -0
  221. package/source/VirtualScroller.onRender.js +345 -0
  222. package/source/VirtualScroller.resize.js +189 -0
  223. package/source/VirtualScroller.state.js +284 -0
  224. package/source/VirtualScroller.verticalSpacing.js +51 -0
  225. package/source/react/VirtualScroller.js +243 -587
  226. package/source/react/useClassName.js +14 -0
  227. package/source/react/useHandleItemsChange.js +115 -0
  228. package/source/react/useInstanceMethods.js +25 -0
  229. package/source/react/useItemKeys.js +59 -0
  230. package/source/react/useOnItemHeightChange.js +28 -0
  231. package/source/react/useOnItemStateChange.js +28 -0
  232. package/source/react/useState.js +114 -0
  233. package/source/react/useStyle.js +20 -0
  234. package/source/react/useVirtualScroller.js +59 -0
  235. package/source/react/useVirtualScrollerStartStop.js +12 -0
  236. package/source/test/Engine.js +11 -0
  237. package/source/test/ItemsContainer.js +87 -0
  238. package/source/test/ScrollableContainer.js +88 -0
  239. package/source/test/VirtualScroller.js +232 -0
  240. package/source/utility/debounce.js +2 -2
  241. package/source/utility/px.test.js +1 -1
  242. package/babel.config.js +0 -25
  243. package/babel.js +0 -5
  244. package/commonjs/ListHeightChangeWatcher.js.map +0 -1
  245. package/dom/index.commonjs.js +0 -4
  246. package/index.commonjs.js +0 -4
  247. package/modules/ListHeightChangeWatcher.js.map +0 -1
  248. package/react/index.commonjs.js +0 -4
@@ -1,649 +1,222 @@
1
1
  "use strict";
2
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
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
6
8
  exports["default"] = void 0;
7
9
 
8
- var _react = _interopRequireDefault(require("react"));
10
+ var _react = _interopRequireWildcard(require("react"));
9
11
 
10
12
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
13
 
12
- var _VirtualScroller = _interopRequireDefault(require("../VirtualScroller"));
13
-
14
- var _debug = require("../utility/debug");
15
-
16
- var _px = _interopRequireDefault(require("../utility/px"));
17
-
18
- var _excluded = ["as", "itemComponent", "itemComponentProps", "items", "estimatedItemHeight", "bypass", "preserveScrollPositionOnPrependItems", "preserveScrollPosition", "initialScrollPosition", "onScrollPositionChange", "measureItemsBatchSize", "scrollableContainer", "getScrollableContainer", "getColumnsCount", "initialState", "initialCustomState", "onStateChange", "onItemInitialRender", "onItemFirstRender", "getItemId", "onMount", "className"];
19
-
20
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
21
-
22
- function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
23
-
24
- function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
25
-
26
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
27
-
28
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
29
-
30
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
14
+ var _useState2 = _interopRequireDefault(require("./useState.js"));
31
15
 
32
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
16
+ var _useVirtualScroller = _interopRequireDefault(require("./useVirtualScroller.js"));
33
17
 
34
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
18
+ var _useVirtualScrollerStartStop = _interopRequireDefault(require("./useVirtualScrollerStartStop.js"));
35
19
 
36
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
20
+ var _useInstanceMethods = _interopRequireDefault(require("./useInstanceMethods.js"));
37
21
 
38
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
22
+ var _useItemKeys2 = _interopRequireDefault(require("./useItemKeys.js"));
39
23
 
40
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
24
+ var _useOnItemStateChange = _interopRequireDefault(require("./useOnItemStateChange.js"));
41
25
 
42
- function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
26
+ var _useOnItemHeightChange = _interopRequireDefault(require("./useOnItemHeightChange.js"));
43
27
 
44
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
28
+ var _useHandleItemsChange = _interopRequireDefault(require("./useHandleItemsChange.js"));
45
29
 
46
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
30
+ var _useClassName = _interopRequireDefault(require("./useClassName.js"));
47
31
 
48
- function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
32
+ var _useStyle = _interopRequireDefault(require("./useStyle.js"));
49
33
 
50
- 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; }
51
-
52
- // `PropTypes.elementType` is available in some version of `prop-types`.
53
- // https://github.com/facebook/prop-types/issues/200
54
- var elementType = _propTypes["default"].elementType || _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].func, _propTypes["default"].object]);
55
-
56
- var VirtualScroller = /*#__PURE__*/function (_React$Component) {
57
- _inherits(VirtualScroller, _React$Component);
58
-
59
- var _super = _createSuper(VirtualScroller);
60
-
61
- // `this.state` is already reserved for `virtual-scroller`.
62
- // static getDerivedStateFromProps(props, state) {
63
- // return {
64
- // prevProps: {
65
- // items: props.items
66
- // }
67
- // }
68
- // }
69
- // Handler function caches.
70
- // Just so that the props passed to `itemComponent`
71
- // are not changed on every `.render()` and so
72
- // `itemComponent` won't re-render if it's a `PureComponent`.
73
- // Item refs for `.renderItem(i)`.
74
- // List items are rendered with `key`s
75
- // so that React doesn't reuse `itemComponent`s
76
- // in cases when `items` are changed.
77
- function VirtualScroller(props) {
78
- var _this;
79
-
80
- _classCallCheck(this, VirtualScroller);
81
-
82
- _this = _super.call(this, props); // `this.previousItemsProperty` is only used for comparing
83
- // `previousItems` with `newItems` inside `render()`.
84
-
85
- _defineProperty(_assertThisInitialized(_this), "container", /*#__PURE__*/_react["default"].createRef());
86
-
87
- _defineProperty(_assertThisInitialized(_this), "onItemStateChange", new Array(_this.props.items.length));
88
-
89
- _defineProperty(_assertThisInitialized(_this), "onItemHeightChange", new Array(_this.props.items.length));
90
-
91
- _defineProperty(_assertThisInitialized(_this), "itemRefs", new Array(_this.props.items.length));
92
-
93
- _defineProperty(_assertThisInitialized(_this), "itemKeyPrefixes", []);
94
-
95
- _defineProperty(_assertThisInitialized(_this), "updateLayout", function () {
96
- return _this.virtualScroller.updateLayout();
97
- });
98
-
99
- _defineProperty(_assertThisInitialized(_this), "layout", function () {
100
- return _this.updateLayout();
101
- });
102
-
103
- _defineProperty(_assertThisInitialized(_this), "onItemInitialRender", function () {
104
- var onItemInitialRender = _this.props.onItemInitialRender;
105
-
106
- if (onItemInitialRender) {
107
- onItemInitialRender.apply(void 0, arguments);
108
- }
109
- });
110
-
111
- _defineProperty(_assertThisInitialized(_this), "onItemFirstRender", function () {
112
- var onItemFirstRender = _this.props.onItemFirstRender;
113
-
114
- if (onItemFirstRender) {
115
- onItemFirstRender.apply(void 0, arguments);
116
- }
117
- });
118
-
119
- _this.previousItemsProperty = props.items; // Generate unique `key` prefix for list item components.
120
-
121
- _this.generateItemKeyPrefix(); // Create `VirtualScroller` instance.
122
-
123
-
124
- _this.createVirtualScroller();
125
-
126
- return _this;
127
- }
128
-
129
- _createClass(VirtualScroller, [{
130
- key: "createVirtualScroller",
131
- value: function createVirtualScroller() {
132
- var _this2 = this;
133
-
134
- var _this$props = this.props,
135
- AsComponent = _this$props.as,
136
- items = _this$props.items,
137
- initialState = _this$props.initialState,
138
- initialCustomState = _this$props.initialCustomState,
139
- onStateChange = _this$props.onStateChange,
140
- estimatedItemHeight = _this$props.estimatedItemHeight,
141
- initialScrollPosition = _this$props.initialScrollPosition,
142
- onScrollPositionChange = _this$props.onScrollPositionChange,
143
- measureItemsBatchSize = _this$props.measureItemsBatchSize,
144
- scrollableContainer = _this$props.scrollableContainer,
145
- getScrollableContainer = _this$props.getScrollableContainer,
146
- getColumnsCount = _this$props.getColumnsCount,
147
- getItemId = _this$props.getItemId,
148
- bypass = _this$props.bypass; // Create `virtual-scroller` instance.
149
-
150
- this.virtualScroller = new _VirtualScroller["default"](function () {
151
- return _this2.container.current;
152
- }, items, {
153
- _useTimeoutInRenderLoop: true,
154
- estimatedItemHeight: estimatedItemHeight,
155
- bypass: bypass,
156
- // bypassBatchSize,
157
- onItemInitialRender: this.onItemInitialRender,
158
- // `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.
159
- onItemFirstRender: this.onItemFirstRender,
160
- initialScrollPosition: initialScrollPosition,
161
- onScrollPositionChange: onScrollPositionChange,
162
- shouldUpdateLayoutOnScreenResize: this.shouldUpdateLayoutOnScreenResize,
163
- measureItemsBatchSize: measureItemsBatchSize,
164
- scrollableContainer: scrollableContainer,
165
- // `getScrollableContainer` property is deprecated.
166
- // Use `scrollableContainer` instead.
167
- getScrollableContainer: getScrollableContainer,
168
- getColumnsCount: getColumnsCount,
169
- getItemId: getItemId,
170
- tbody: AsComponent === 'tbody',
171
- state: initialState,
172
- customState: initialCustomState,
173
- onStateChange: onStateChange,
174
- getState: function getState() {
175
- return _this2.state;
176
- },
177
- setState: function setState(newState, _ref) {
178
- var willUpdateState = _ref.willUpdateState,
179
- didUpdateState = _ref.didUpdateState;
180
- _this2.willUpdateState = willUpdateState;
181
- _this2.didUpdateState = didUpdateState;
182
-
183
- if (_this2.state) {
184
- // Update existing state.
185
- //
186
- // In case of hypothetically rewriting this in React hooks,
187
- // it wouldn't simply be `setState({ ...prevState, ...newState })`.
188
- // The reason is that `setState()` would be "asynchronous" (not immediate),
189
- // and `...prevState` would be stale in cases when more than a single
190
- // `setState()` call is made before the state actually updates,
191
- // making `prevState` stale, and, as a consequence, losing some
192
- // of the state updates.
193
- // For example, the first `setState()` call updates shown item indexes,
194
- // and the second `setState()` call updates `verticalSpacing`:
195
- // if it was simply `setState({ ...prevState, ...newState })`,
196
- // then the second state update could overwrite the first state update,
197
- // resulting in incorrect items being shown/hidden.
198
- //
199
- // I guess, in hooks, it could be something like:
200
- //
201
- // const [firstShownItemIndex, setFirstShownItemIndex] = useState()
202
- // ...
203
- // const setState = useCallback((newState) => {
204
- // for (const key in newState) {
205
- // switch (key) {
206
- // case 'firstShownItemIndex':
207
- // setFirstShownItemIndex(newState[key])
208
- // break
209
- // ...
210
- // }
211
- // }
212
- // setFirstShownItemIndex
213
- // }, [])
214
- // const virtualScroller = new VirtualScrollerCore({
215
- // setState,
216
- // ...
217
- // })
218
- // // `getState()` function would be updated on every render.
219
- // virtualScroller.getState = () => ({
220
- // firstShownItemIndex,
221
- // ...
222
- // })
223
- //
224
- // But as long as it uses the classic `this.setState()`,
225
- // it's fine and simple.
226
- _this2.setState(newState);
227
- } else {
228
- // Set initial state.
229
- willUpdateState(newState);
230
- _this2.state = newState;
231
- didUpdateState();
232
- }
233
- }
234
- });
235
- } // This is a proxy for `VirtualScroller`'s `.updateLayout` instance method.
236
-
237
- }, {
238
- key: "shouldUseRefs",
239
- value: function shouldUseRefs() {
240
- // There's no way to detect if `ref` can be passed to `component`:
241
- // https://github.com/facebook/react/issues/16309
242
- // So it only uses `ref`s for `React.Component`s.
243
- var itemComponent = this.props.itemComponent;
244
- return isComponentClass(itemComponent);
245
- }
246
- /**
247
- * Returns a `key` for an `item`'s element.
248
- * @param {object} item — The item.
249
- * @param {number} i — Item's index in `items` list.
250
- * @return {any}
251
- */
34
+ var _excluded = ["as", "items", "itemComponent", "itemComponentProps", "estimatedItemHeight", "bypass", "tbody", "preserveScrollPosition", "preserveScrollPositionOnPrependItems", "measureItemsBatchSize", "scrollableContainer", "getScrollableContainer", "getColumnsCount", "getItemId", "className", "onMount", "onItemFirstRender", "onItemInitialRender", "initialScrollPosition", "onScrollPositionChange", "onStateChange", "initialState"];
252
35
 
253
- }, {
254
- key: "getItemKey",
255
- value: function getItemKey(item, i) {
256
- var getItemId = this.props.getItemId;
36
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
257
37
 
258
- if (getItemId) {
259
- return getItemId(item);
260
- }
38
+ 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); }
261
39
 
262
- return "".concat(this.itemKeyPrefix, ":").concat(i);
263
- }
264
- /**
265
- * A proxy to `VirtualScroller.getItemCoordinates(i)`.
266
- * @param {number} i
267
- * @return {object}
268
- */
269
-
270
- /*
271
- getItemCoordinates(i) {
272
- return this.virtualScroller.getItemCoordinates(i)
273
- }
274
- */
275
-
276
- /**
277
- * `updateItem(i)` has been renamed to `renderItem(i)`.
278
- * @param {number} i
279
- */
40
+ 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; }
280
41
 
281
- }, {
282
- key: "updateItem",
283
- value: function updateItem(i) {
284
- return this.renderItem(i);
285
- }
286
- /**
287
- * Re-renders an item.
288
- * @param {number} i
289
- */
42
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
290
43
 
291
- }, {
292
- key: "renderItem",
293
- value: function renderItem(i) {
294
- var _this3 = this;
295
-
296
- i = this.getItemIndex(i);
297
-
298
- if (i === undefined) {
299
- return (0, _debug.reportError)("Item ".concat(JSON.stringify(i), " not found when calling \".renderItem()\""));
300
- }
301
-
302
- if (this.shouldUseRefs()) {
303
- // The item may be non-rendered when `.renderItem(i)` is called on it.
304
- // For example, when there's a "parent comment" having several "replies"
305
- // each of which has an autogenerated quote of the "parent comment"
306
- // and then the "parent comment" is updated (for example, a YouTube video
307
- // link gets parsed into an embedded video player) and all of its "replies"
308
- // should be updated too to show the parsed video title instead of the URL,
309
- // so `.renderItem(i)` is simply called on all of the "parent post"'s replies
310
- // regardless of some of those replies being rendered or not.
311
- if (this.itemRefs[i] && this.itemRefs[i].current) {
312
- var items = this.props.items; // Stores `item` here because the `i` index
313
- // might have changed when the callback is called,
314
- // or the item even may have been removed.
315
-
316
- var item = items[i];
317
- this.itemRefs[i].current.forceUpdate(function () {
318
- if (_this3._isMounted) {
319
- // Recalculates the `i` index here because it
320
- // might have changed when the callback is called,
321
- // or the item even may have been removed.
322
- var _i = items.indexOf(item);
323
-
324
- if (_i >= 0) {
325
- _this3.virtualScroller.onItemHeightChange(_i);
326
- }
327
- }
328
- });
329
- }
330
- }
331
- }
332
- }, {
333
- key: "getItemIndex",
334
- value: function getItemIndex(i) {
335
- if (typeof i === 'number') {
336
- return i;
337
- }
338
-
339
- if (_typeof(i) === 'object' && i !== null) {
340
- var _this$props2 = this.props,
341
- items = _this$props2.items,
342
- getItemId = _this$props2.getItemId;
343
- var item = i;
344
- i = 0;
345
-
346
- while (i < items.length) {
347
- if (getItemId) {
348
- if (getItemId(item) === getItemId(items[i])) {
349
- return i;
350
- }
351
- } else {
352
- if (item === items[i]) {
353
- return i;
354
- }
355
- }
356
-
357
- i++;
358
- }
359
- }
360
- } // Functional components can't have a `ref` assigned to them.
361
- // Item `ref`s are only used for calling `.renderItem(i)` instance method,
362
- // because `.renderItem(i)` calls `.forceUpdate()` on item `i`.
363
- // If a developer is not using the `.renderItem(i)` instance method
364
- // then `ref`s aren't required and will be omitted.
44
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
365
45
 
366
- }, {
367
- key: "getItemRef",
368
- value: function getItemRef(i) {
369
- if (!this.itemRefs[i]) {
370
- this.itemRefs[i] = /*#__PURE__*/_react["default"].createRef();
371
- }
46
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
372
47
 
373
- return this.itemRefs[i];
374
- }
48
+ function VirtualScroller(_ref, ref) {
49
+ var AsComponent = _ref.as,
50
+ items = _ref.items,
51
+ Component = _ref.itemComponent,
52
+ itemComponentProps = _ref.itemComponentProps,
53
+ estimatedItemHeight = _ref.estimatedItemHeight,
54
+ bypass = _ref.bypass,
55
+ tbody = _ref.tbody,
56
+ preserveScrollPosition = _ref.preserveScrollPosition,
57
+ preserveScrollPositionOnPrependItems = _ref.preserveScrollPositionOnPrependItems,
58
+ measureItemsBatchSize = _ref.measureItemsBatchSize,
59
+ scrollableContainer = _ref.scrollableContainer,
60
+ getScrollableContainer = _ref.getScrollableContainer,
61
+ getColumnsCount = _ref.getColumnsCount,
62
+ getItemId = _ref.getItemId,
63
+ className = _ref.className,
64
+ onMount = _ref.onMount,
65
+ onItemFirstRender = _ref.onItemFirstRender,
66
+ onItemInitialRender = _ref.onItemInitialRender,
67
+ initialScrollPosition = _ref.initialScrollPosition,
68
+ onScrollPositionChange = _ref.onScrollPositionChange,
69
+ onStateChange = _ref.onStateChange,
70
+ initialState = _ref.initialState,
71
+ rest = _objectWithoutProperties(_ref, _excluded);
72
+
73
+ // List items "container" DOM Element reference.
74
+ var container = (0, _react.useRef)(); // Create a `VirtualScroller` instance.
75
+
76
+ var virtualScroller = (0, _useVirtualScroller["default"])({
77
+ items: items,
78
+ estimatedItemHeight: estimatedItemHeight,
79
+ bypass: bypass,
80
+ // bypassBatchSize,
81
+ tbody: tbody,
82
+ onItemInitialRender: onItemInitialRender,
83
+ // `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.
84
+ onItemFirstRender: onItemFirstRender,
85
+ initialScrollPosition: initialScrollPosition,
86
+ onScrollPositionChange: onScrollPositionChange,
87
+ measureItemsBatchSize: measureItemsBatchSize,
88
+ // `scrollableContainer` property is deprecated.
89
+ // Use `getScrollableContainer()` property instead.
90
+ scrollableContainer: scrollableContainer,
91
+ getScrollableContainer: getScrollableContainer,
92
+ getColumnsCount: getColumnsCount,
93
+ getItemId: getItemId,
94
+ AsComponent: AsComponent,
95
+ initialState: initialState,
96
+ onStateChange: onStateChange
375
97
  }, {
376
- key: "getOnItemStateChange",
377
- value: function getOnItemStateChange(i) {
378
- var _this4 = this;
379
-
380
- if (!this.onItemStateChange[i]) {
381
- this.onItemStateChange[i] = function (itemState) {
382
- return _this4.virtualScroller.onItemStateChange(i, itemState);
383
- };
384
- }
98
+ container: container
99
+ }); // Only compute the initial state once.
385
100
 
386
- return this.onItemStateChange[i];
387
- }
388
- }, {
389
- key: "getOnItemHeightChange",
390
- value: function getOnItemHeightChange(i) {
391
- var _this5 = this;
101
+ var _initialState = (0, _react.useMemo)(function () {
102
+ return virtualScroller.getInitialState();
103
+ }, []); // Create state management functions.
392
104
 
393
- if (!this.onItemHeightChange[i]) {
394
- this.onItemHeightChange[i] = function () {
395
- return _this5.virtualScroller.onItemHeightChange(i);
396
- };
397
- }
398
105
 
399
- return this.onItemHeightChange[i];
400
- }
401
- }, {
402
- key: "generateItemKeyPrefix",
403
- value: function generateItemKeyPrefix() {
404
- var prefix = String(Math.random()).slice(2);
106
+ var _useState = (0, _useState2["default"])({
107
+ initialState: _initialState,
108
+ onRender: virtualScroller.onRender,
109
+ items: items
110
+ }),
111
+ getState = _useState.getState,
112
+ updateState = _useState.updateState; // Use custom (external) state storage in the `VirtualScroller`.
405
113
 
406
- if (this.itemKeyPrefixes.indexOf(prefix) >= 0) {
407
- return this.generateItemKeyPrefix();
408
- }
409
114
 
410
- this.itemKeyPrefixes.push(prefix);
411
- this.itemKeyPrefix = prefix;
115
+ (0, _react.useMemo)(function () {
116
+ virtualScroller.useState({
117
+ getState: getState,
118
+ updateState: updateState
119
+ });
120
+ }, []); // Start `VirtualScroller` on mount.
121
+ // Stop `VirtualScroller` on unmount.
122
+
123
+ (0, _useVirtualScrollerStartStop["default"])(virtualScroller); // List items are rendered with `key`s so that React doesn't
124
+ // "reuse" `itemComponent`s in cases when `items` are changed.
125
+
126
+ var _useItemKeys = (0, _useItemKeys2["default"])({
127
+ getItemId: getItemId
128
+ }),
129
+ getItemKey = _useItemKeys.getItemKey,
130
+ updateItemKeysForNewItems = _useItemKeys.updateItemKeysForNewItems; // Cache per-item `onItemStateChange` functions' "references"
131
+ // so that item components don't get re-rendered needlessly.
132
+
133
+
134
+ var getOnItemStateChange = (0, _useOnItemStateChange["default"])({
135
+ items: items,
136
+ virtualScroller: virtualScroller
137
+ }); // Cache per-item `onItemHeightChange` functions' "references"
138
+ // so that item components don't get re-rendered needlessly.
139
+
140
+ var getOnItemHeightChange = (0, _useOnItemHeightChange["default"])({
141
+ items: items,
142
+ virtualScroller: virtualScroller
143
+ }); // Detect if `items` have changed.
144
+
145
+ (0, _useHandleItemsChange["default"])(items, {
146
+ virtualScroller: virtualScroller,
147
+ // `preserveScrollPosition` property name is deprecated,
148
+ // use `preserveScrollPositionOnPrependItems` property instead.
149
+ preserveScrollPosition: preserveScrollPosition,
150
+ preserveScrollPositionOnPrependItems: preserveScrollPositionOnPrependItems,
151
+ updateItemKeysForNewItems: updateItemKeysForNewItems
152
+ }); // Add instance methods to the React component.
153
+
154
+ (0, _useInstanceMethods["default"])(ref, {
155
+ virtualScroller: virtualScroller
156
+ });
157
+ (0, _react.useLayoutEffect)(function () {
158
+ // (deprecated)
159
+ // `onMount()` option is deprecated due to no longer being used.
160
+ // If someone thinks there's a valid use case for it, create an issue.
161
+ if (onMount) {
162
+ onMount();
412
163
  }
413
- }, {
414
- key: "componentDidMount",
415
- value: function componentDidMount() {
416
- var onMount = this.props.onMount; // `onMount()` option is deprecated due to no longer being used.
417
- // If someone thinks there's a valid use case for it, create an issue.
418
-
419
- if (onMount) {
420
- onMount();
421
- }
422
-
423
- this._isMounted = true; // Start listening to scroll events.
424
-
425
- this.virtualScroller.listen();
426
- } // `getSnapshotBeforeUpdate()` is called right before `componentDidUpdate()`.
427
-
428
- }, {
429
- key: "getSnapshotBeforeUpdate",
430
- value: function getSnapshotBeforeUpdate(prevProps, prevState) {
431
- if (this.state !== prevState) {
432
- this.willUpdateState(this.state, prevState);
433
- } // Returns `null` to avoid React warning:
434
- // "A snapshot value (or null) must be returned. You have returned undefined".
435
-
436
-
437
- return null;
438
- } // `componentDidUpdate()` is called immediately after React component has re-rendered.
439
- // That would correspond to `useLayoutEffect()` in React Hooks.
164
+ }, []); // `willRender()` function is no longer used.
165
+ //
166
+ // // `getSnapshotBeforeUpdate()` is called right before `componentDidUpdate()`.
167
+ // // A hook equivalent/workaround for `getSnapshotBeforeUpdate()`:
168
+ // // https://github.com/facebook/react/issues/15221#issuecomment-583448887
169
+ // //
170
+ // getSnapshotBeforeUpdate(prevProps, prevState) {
171
+ // if (this.state !== prevState) {
172
+ // this.willRender(this.state, prevState)
173
+ // }
174
+ // // Returns `null` to avoid React warning:
175
+ // // "A snapshot value (or null) must be returned. You have returned undefined".
176
+ // return null
177
+ // }
440
178
 
441
- }, {
442
- key: "componentDidUpdate",
443
- value: function componentDidUpdate(prevProps, prevState) {
444
- // If `state` did change.
445
- if (this.state !== prevState) {
446
- this.didUpdateState(prevState);
447
- } // If `items` property did change then update `virtual-scroller` items.
448
- // This could have been done in `.render()` but `.setItems()` calls
449
- // `.setState()` internally which would result in React throwing an error.
450
-
451
-
452
- var _this$props3 = this.props,
453
- items = _this$props3.items,
454
- preserveScrollPosition = _this$props3.preserveScrollPosition,
455
- preserveScrollPositionOnPrependItems = _this$props3.preserveScrollPositionOnPrependItems;
456
-
457
- if (items !== prevProps.items) {
458
- this.virtualScroller.setItems(items, {
459
- // `preserveScrollPosition` property name is deprecated,
460
- // use `preserveScrollPositionOnPrependItems` instead.
461
- preserveScrollPositionOnPrependItems: preserveScrollPositionOnPrependItems || preserveScrollPosition
462
- });
463
- }
179
+ className = (0, _useClassName["default"])(className, {
180
+ tbody: tbody
181
+ });
182
+ var style = (0, _useStyle["default"])({
183
+ tbody: tbody,
184
+ virtualScroller: virtualScroller
185
+ });
186
+
187
+ var _virtualScroller$getS = virtualScroller.getState(),
188
+ renderedItems = _virtualScroller$getS.items,
189
+ itemStates = _virtualScroller$getS.itemStates,
190
+ firstShownItemIndex = _virtualScroller$getS.firstShownItemIndex,
191
+ lastShownItemIndex = _virtualScroller$getS.lastShownItemIndex;
192
+
193
+ return /*#__PURE__*/_react["default"].createElement(AsComponent, _extends({}, rest, {
194
+ ref: container,
195
+ className: className,
196
+ style: style
197
+ }), renderedItems.map(function (item, i) {
198
+ if (i >= firstShownItemIndex && i <= lastShownItemIndex) {
199
+ return /*#__PURE__*/_react["default"].createElement(Component, _extends({}, itemComponentProps, {
200
+ key: getItemKey(item, i),
201
+ state: itemStates && itemStates[i],
202
+ onStateChange: getOnItemStateChange(i),
203
+ onHeightChange: getOnItemHeightChange(i)
204
+ }), item);
464
205
  }
465
- }, {
466
- key: "componentWillUnmount",
467
- value: function componentWillUnmount() {
468
- this._isMounted = false; // Stop listening to scroll events.
469
206
 
470
- this.virtualScroller.stop();
471
- }
472
- }, {
473
- key: "render",
474
- value: function render() {
475
- var _this6 = this;
476
-
477
- var _this$props4 = this.props,
478
- AsComponent = _this$props4.as,
479
- Component = _this$props4.itemComponent,
480
- itemComponentProps = _this$props4.itemComponentProps,
481
- _items = _this$props4.items,
482
- estimatedItemHeight = _this$props4.estimatedItemHeight,
483
- bypass = _this$props4.bypass,
484
- preserveScrollPositionOnPrependItems = _this$props4.preserveScrollPositionOnPrependItems,
485
- preserveScrollPosition = _this$props4.preserveScrollPosition,
486
- initialScrollPosition = _this$props4.initialScrollPosition,
487
- onScrollPositionChange = _this$props4.onScrollPositionChange,
488
- measureItemsBatchSize = _this$props4.measureItemsBatchSize,
489
- scrollableContainer = _this$props4.scrollableContainer,
490
- getScrollableContainer = _this$props4.getScrollableContainer,
491
- getColumnsCount = _this$props4.getColumnsCount,
492
- initialState = _this$props4.initialState,
493
- initialCustomState = _this$props4.initialCustomState,
494
- onStateChange = _this$props4.onStateChange,
495
- onItemInitialRender = _this$props4.onItemInitialRender,
496
- onItemFirstRender = _this$props4.onItemFirstRender,
497
- getItemId = _this$props4.getItemId,
498
- onMount = _this$props4.onMount,
499
- className = _this$props4.className,
500
- rest = _objectWithoutProperties(_this$props4, _excluded);
501
-
502
- var _this$virtualScroller = this.virtualScroller.getState(),
503
- items = _this$virtualScroller.items,
504
- itemStates = _this$virtualScroller.itemStates,
505
- firstShownItemIndex = _this$virtualScroller.firstShownItemIndex,
506
- lastShownItemIndex = _this$virtualScroller.lastShownItemIndex,
507
- beforeItemsHeight = _this$virtualScroller.beforeItemsHeight,
508
- afterItemsHeight = _this$virtualScroller.afterItemsHeight; // If `items` are about to be changed then
509
- // store the scroll Y position for the first one
510
- // of the current items.
511
- // Previously it was being done in `componentDidUpdate()`
512
- // but it was later found out that it wouldn't work
513
- // for "Show previous" button because it would
514
- // get hidden before `componentDidUpdate()` is called.
515
- //
516
- // Consider this code example:
517
- //
518
- // const { fromIndex, items } = this.state
519
- // const items = allItems.slice(fromIndex)
520
- // return (
521
- // {fromIndex > 0 &&
522
- // <button onClick={this.onShowPrevious}>
523
- // Show previous
524
- // </button>
525
- // }
526
- // <VirtualScroller
527
- // items={items}
528
- // itemComponent={ItemComponent}/>
529
- // )
530
- //
531
- // Consider a user clicks "Show previous" to show the items from the start.
532
- // By the time `componentDidUpdate()` is called on `<VirtualScroller/>`,
533
- // the "Show previous" button has already been hidden
534
- // (because there're no more "previous" items)
535
- // which results in the scroll Y position jumping forward
536
- // by the height of that "Show previous" button.
537
- // This is because `<VirtualScroller/>` captures scroll Y
538
- // position when items are prepended via `.setItems()`
539
- // when the "Show previous" button is still being shown,
540
- // and then restores scroll Y position in `.didUpdateState()`
541
- // when the "Show previous" button has already been hidden:
542
- // that's the reason for the scroll Y "jump".
543
- //
544
- // To prevent that, scroll Y position is captured at `render()`
545
- // time rather than later in `componentDidUpdate()`: this way,
546
- // scroll Y position is captured while the "Show previous" button
547
- // is still being shown.
548
- //
549
-
550
-
551
- var newItems = this.props.items;
552
- var previousItems = items; // this.virtualScroller.getState().items
553
- // There's one case when `newItems !== previousItems` is `true`
554
- // from the start: when `initialState.items` are passed.
555
- // To handle that single case `this.previousItemsProperty`
556
- // is tracked and `this.itemsPropertyHasChanged` flag is set.
557
-
558
- if (!this.itemsPropertyWasChanged) {
559
- this.itemsPropertyWasChanged = this.props.items !== this.previousItemsProperty;
560
- }
561
-
562
- this.previousItemsProperty = this.props.items;
563
-
564
- if (this.itemsPropertyWasChanged && newItems !== previousItems) {
565
- var itemsDiff = this.virtualScroller.getItemsDiff(previousItems, newItems);
566
-
567
- if (itemsDiff && itemsDiff.prependedItemsCount === 0 && itemsDiff.appendedItemsCount > 0) {// If it's just items that have been appended
568
- // then no need to re-generate the prefix
569
- // and to fix scroll position and to clear caches.
570
- } else {
571
- // If the items update was incremental, then it's possible
572
- // that some items were prepended, and so the scroll Y position
573
- // should be restored after rendering those new items
574
- // in order for the currently shown items to stay
575
- // on the same position on screen.
576
- // (only if explicitly opted into using this feature)
577
- //
578
- // If the items update wasn't incremental
579
- // then there's no point in restoring scroll position.
580
- //
581
- // `preserveScrollPosition` property name is deprecated,
582
- // use `preserveScrollPositionOnPrependItems` instead.
583
- //
584
- if (itemsDiff) {
585
- var prependedItemsCount = itemsDiff.prependedItemsCount;
586
-
587
- if (prependedItemsCount > 0) {
588
- if (preserveScrollPositionOnPrependItems || preserveScrollPosition) {
589
- if (firstShownItemIndex === 0) {
590
- this.virtualScroller.listHeightChangeWatcher.snapshot({
591
- previousItems: previousItems,
592
- newItems: newItems,
593
- prependedItemsCount: prependedItemsCount
594
- });
595
- }
596
- }
597
- }
598
- } // Reset the unique `key` prefix for item component keys.
599
-
600
-
601
- if (!getItemId) {
602
- this.generateItemKeyPrefix();
603
- } // Reset item refs.
604
-
605
-
606
- this.itemRefs = new Array(newItems.length);
607
- }
608
- }
609
-
610
- var tbody = this.virtualScroller.tbody;
611
- return /*#__PURE__*/_react["default"].createElement(AsComponent, _extends({}, rest, {
612
- ref: this.container,
613
- className: tbody ? className ? className + ' ' + 'VirtualScroller' : 'VirtualScroller' : className,
614
- style: {
615
- paddingTop: tbody ? undefined : (0, _px["default"])(beforeItemsHeight),
616
- paddingBottom: tbody ? undefined : (0, _px["default"])(afterItemsHeight)
617
- }
618
- }), items.map(function (item, i) {
619
- if (i >= firstShownItemIndex && i <= lastShownItemIndex) {
620
- return /*#__PURE__*/_react["default"].createElement(Component, _extends({}, itemComponentProps, {
621
- key: _this6.getItemKey(item, i),
622
- ref: _this6.shouldUseRefs() ? _this6.getItemRef(i) : undefined,
623
- state: itemStates && itemStates[i],
624
- onStateChange: _this6.getOnItemStateChange(i),
625
- onHeightChange: _this6.getOnItemHeightChange(i)
626
- }), item);
627
- }
628
-
629
- return null;
630
- }));
631
- }
632
- }]);
207
+ return null;
208
+ }));
209
+ }
633
210
 
634
- return VirtualScroller;
635
- }(_react["default"].Component);
636
- /**
637
- * Checks if the argument is a `React.Component` class.
638
- * https://overreacted.io/how-does-react-tell-a-class-from-a-function/
639
- * @param {any} Component
640
- * @return {object} [result] Returns `undefined` if it's not a `React.Component`. Returns an empty object if it's a `React.Component` (`.isReactComponent` is an empty object).
641
- */
211
+ VirtualScroller = /*#__PURE__*/_react["default"].forwardRef(VirtualScroller);
212
+ var _default = VirtualScroller; // `PropTypes.elementType` is available in some version of `prop-types`.
213
+ // https://github.com/facebook/prop-types/issues/200
642
214
 
215
+ exports["default"] = _default;
643
216
 
644
- exports["default"] = VirtualScroller;
217
+ var elementType = _propTypes["default"].elementType || _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].func, _propTypes["default"].object]);
645
218
 
646
- _defineProperty(VirtualScroller, "propTypes", {
219
+ VirtualScroller.propTypes = {
647
220
  as: elementType,
648
221
  items: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired,
649
222
  itemComponent: elementType.isRequired,
@@ -651,14 +224,15 @@ _defineProperty(VirtualScroller, "propTypes", {
651
224
  estimatedItemHeight: _propTypes["default"].number,
652
225
  bypass: _propTypes["default"].bool,
653
226
  // bypassBatchSize: PropTypes.number,
227
+ tbody: _propTypes["default"].bool,
654
228
  preserveScrollPositionOnPrependItems: _propTypes["default"].bool,
655
229
  // `preserveScrollPosition` property name is deprecated,
656
230
  // use `preserveScrollPositionOnPrependItems` instead.
657
231
  preserveScrollPosition: _propTypes["default"].bool,
658
232
  measureItemsBatchSize: _propTypes["default"].number,
233
+ // `scrollableContainer` property is deprecated.
234
+ // Use `getScrollableContainer()` property instead.
659
235
  scrollableContainer: _propTypes["default"].any,
660
- // `getScrollableContainer` property is deprecated.
661
- // Use `scrollableContainer` instead.
662
236
  getScrollableContainer: _propTypes["default"].func,
663
237
  getColumnsCount: _propTypes["default"].func,
664
238
  getItemId: _propTypes["default"].func,
@@ -670,7 +244,6 @@ _defineProperty(VirtualScroller, "propTypes", {
670
244
  initialScrollPosition: _propTypes["default"].number,
671
245
  onScrollPositionChange: _propTypes["default"].func,
672
246
  onStateChange: _propTypes["default"].func,
673
- initialCustomState: _propTypes["default"].object,
674
247
  initialState: _propTypes["default"].shape({
675
248
  items: _propTypes["default"].arrayOf(_propTypes["default"].object).isRequired,
676
249
  itemStates: _propTypes["default"].arrayOf(_propTypes["default"].any),
@@ -682,15 +255,8 @@ _defineProperty(VirtualScroller, "propTypes", {
682
255
  columnsCount: _propTypes["default"].number,
683
256
  verticalSpacing: _propTypes["default"].number
684
257
  })
685
- });
686
-
687
- _defineProperty(VirtualScroller, "defaultProps", {
258
+ };
259
+ VirtualScroller.defaultProps = {
688
260
  as: 'div'
689
- });
690
-
691
- function isComponentClass(Component) {
692
- // return Component.prototype instanceof React.Component
693
- // `React.memo()` returns `.prototype === undefined` for some reason.
694
- return Component.prototype && Component.prototype.isReactComponent;
695
- }
261
+ };
696
262
  //# sourceMappingURL=VirtualScroller.js.map