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