virtual-scroller 1.11.2 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +13 -11
  3. package/bundle/virtual-scroller-dom.js +1 -1
  4. package/bundle/virtual-scroller-dom.js.map +1 -1
  5. package/bundle/virtual-scroller-react.js +1 -1
  6. package/bundle/virtual-scroller-react.js.map +1 -1
  7. package/bundle/virtual-scroller.js +1 -1
  8. package/bundle/virtual-scroller.js.map +1 -1
  9. package/commonjs/DOM/ItemsContainer.js +10 -3
  10. package/commonjs/DOM/ItemsContainer.js.map +1 -1
  11. package/commonjs/DOM/VirtualScroller.js +13 -1
  12. package/commonjs/DOM/VirtualScroller.js.map +1 -1
  13. package/commonjs/ItemHeights.js +5 -5
  14. package/commonjs/ItemHeights.js.map +1 -1
  15. package/commonjs/ItemNotRenderedError.js +64 -0
  16. package/commonjs/ItemNotRenderedError.js.map +1 -0
  17. package/commonjs/Layout.test.js +10 -0
  18. package/commonjs/Layout.test.js.map +1 -1
  19. package/commonjs/VirtualScroller.js +23 -5
  20. package/commonjs/VirtualScroller.js.map +1 -1
  21. package/commonjs/VirtualScroller.layout.js +81 -39
  22. package/commonjs/VirtualScroller.layout.js.map +1 -1
  23. package/commonjs/VirtualScroller.onRender.js +97 -45
  24. package/commonjs/VirtualScroller.onRender.js.map +1 -1
  25. package/commonjs/VirtualScroller.state.js +50 -18
  26. package/commonjs/VirtualScroller.state.js.map +1 -1
  27. package/commonjs/react/VirtualScroller.js +31 -46
  28. package/commonjs/react/VirtualScroller.js.map +1 -1
  29. package/commonjs/react/useItemKeys.js +11 -3
  30. package/commonjs/react/useItemKeys.js.map +1 -1
  31. package/commonjs/react/useOnChange.js +19 -0
  32. package/commonjs/react/useOnChange.js.map +1 -0
  33. package/commonjs/react/{useOnItemHeightChange.js → useOnItemHeightDidChange.js} +7 -7
  34. package/commonjs/react/useOnItemHeightDidChange.js.map +1 -0
  35. package/commonjs/react/{useHandleItemsPropertyChange.js → useSetNewItemsOnItemsPropertyChange.js} +15 -14
  36. package/commonjs/react/useSetNewItemsOnItemsPropertyChange.js.map +1 -0
  37. package/commonjs/react/useState.js +162 -69
  38. package/commonjs/react/useState.js.map +1 -1
  39. package/commonjs/react/useStyle.js +3 -5
  40. package/commonjs/react/useStyle.js.map +1 -1
  41. package/commonjs/react/useUpdateItemKeysOnItemsChange.js +61 -0
  42. package/commonjs/react/useUpdateItemKeysOnItemsChange.js.map +1 -0
  43. package/commonjs/test/ItemsContainer.js +22 -1
  44. package/commonjs/test/ItemsContainer.js.map +1 -1
  45. package/commonjs/utility/debug.js +30 -6
  46. package/commonjs/utility/debug.js.map +1 -1
  47. package/dom/index.d.ts +1 -1
  48. package/index.cjs +2 -0
  49. package/index.d.ts +7 -1
  50. package/index.js +1 -0
  51. package/modules/DOM/ItemsContainer.js +8 -3
  52. package/modules/DOM/ItemsContainer.js.map +1 -1
  53. package/modules/DOM/VirtualScroller.js +13 -1
  54. package/modules/DOM/VirtualScroller.js.map +1 -1
  55. package/modules/ItemHeights.js +5 -5
  56. package/modules/ItemHeights.js.map +1 -1
  57. package/modules/ItemNotRenderedError.js +57 -0
  58. package/modules/ItemNotRenderedError.js.map +1 -0
  59. package/modules/Layout.test.js +10 -0
  60. package/modules/Layout.test.js.map +1 -1
  61. package/modules/VirtualScroller.js +17 -5
  62. package/modules/VirtualScroller.js.map +1 -1
  63. package/modules/VirtualScroller.layout.js +78 -39
  64. package/modules/VirtualScroller.layout.js.map +1 -1
  65. package/modules/VirtualScroller.onRender.js +98 -46
  66. package/modules/VirtualScroller.onRender.js.map +1 -1
  67. package/modules/VirtualScroller.state.js +50 -18
  68. package/modules/VirtualScroller.state.js.map +1 -1
  69. package/modules/react/VirtualScroller.js +31 -46
  70. package/modules/react/VirtualScroller.js.map +1 -1
  71. package/modules/react/useItemKeys.js +8 -3
  72. package/modules/react/useItemKeys.js.map +1 -1
  73. package/modules/react/useOnChange.js +11 -0
  74. package/modules/react/useOnChange.js.map +1 -0
  75. package/modules/react/{useOnItemHeightChange.js → useOnItemHeightDidChange.js} +6 -6
  76. package/modules/react/useOnItemHeightDidChange.js.map +1 -0
  77. package/modules/react/{useHandleItemsPropertyChange.js → useSetNewItemsOnItemsPropertyChange.js} +11 -13
  78. package/modules/react/useSetNewItemsOnItemsPropertyChange.js.map +1 -0
  79. package/modules/react/useState.js +156 -73
  80. package/modules/react/useState.js.map +1 -1
  81. package/modules/react/useStyle.js +3 -5
  82. package/modules/react/useStyle.js.map +1 -1
  83. package/{commonjs/react/useHandleItemIndexesChange.js → modules/react/useUpdateItemKeysOnItemsChange.js} +18 -21
  84. package/modules/react/useUpdateItemKeysOnItemsChange.js.map +1 -0
  85. package/modules/test/ItemsContainer.js +20 -1
  86. package/modules/test/ItemsContainer.js.map +1 -1
  87. package/modules/utility/debug.js +31 -6
  88. package/modules/utility/debug.js.map +1 -1
  89. package/package.json +1 -1
  90. package/source/DOM/ItemsContainer.js +8 -3
  91. package/source/DOM/VirtualScroller.js +11 -1
  92. package/source/ItemHeights.js +5 -5
  93. package/source/ItemNotRenderedError.js +16 -0
  94. package/source/Layout.test.js +9 -0
  95. package/source/VirtualScroller.js +14 -3
  96. package/source/VirtualScroller.layout.js +77 -38
  97. package/source/VirtualScroller.onRender.js +95 -42
  98. package/source/VirtualScroller.state.js +57 -20
  99. package/source/react/VirtualScroller.js +28 -39
  100. package/source/react/useItemKeys.js +9 -2
  101. package/source/react/useOnChange.js +11 -0
  102. package/source/react/{useOnItemHeightChange.js → useOnItemHeightDidChange.js} +5 -5
  103. package/source/react/{useHandleItemsPropertyChange.js → useSetNewItemsOnItemsPropertyChange.js} +11 -11
  104. package/source/react/useState.js +159 -71
  105. package/source/react/useStyle.js +2 -2
  106. package/source/react/{useHandleItemIndexesChange.js → useUpdateItemKeysOnItemsChange.js} +17 -9
  107. package/source/test/ItemsContainer.js +22 -1
  108. package/source/utility/debug.js +18 -4
  109. package/commonjs/react/useHandleItemIndexesChange.js.map +0 -1
  110. package/commonjs/react/useHandleItemsPropertyChange.js.map +0 -1
  111. package/commonjs/react/useOnItemHeightChange.js.map +0 -1
  112. package/modules/react/useHandleItemIndexesChange.js +0 -45
  113. package/modules/react/useHandleItemIndexesChange.js.map +0 -1
  114. package/modules/react/useHandleItemsPropertyChange.js.map +0 -1
  115. package/modules/react/useOnItemHeightChange.js.map +0 -1
@@ -14,32 +14,20 @@ import useVirtualScrollerStartStop from './useVirtualScrollerStartStop.js';
14
14
  import useInstanceMethods from './useInstanceMethods.js';
15
15
  import useItemKeys from './useItemKeys.js';
16
16
  import useSetItemState from './useSetItemState.js';
17
- import useOnItemHeightChange from './useOnItemHeightChange.js';
18
- import useHandleItemsPropertyChange from './useHandleItemsPropertyChange.js';
19
- import useHandleItemIndexesChange from './useHandleItemIndexesChange.js';
17
+ import useOnItemHeightDidChange from './useOnItemHeightDidChange.js';
18
+ import useSetNewItemsOnItemsPropertyChange from './useSetNewItemsOnItemsPropertyChange.js';
19
+ import useUpdateItemKeysOnItemsChange from './useUpdateItemKeysOnItemsChange.js';
20
20
  import useClassName from './useClassName.js';
21
- import useStyle from './useStyle.js'; // When `items` property changes, `useHandleItemsPropertyChange()` hook detects that
22
- // and calls `VirtualScroller.setItems()` which in turn calls the `updateState()` function.
23
- // At this point, an insignificant optimization could be applied:
24
- // the component could avoid re-rendering the second time.
25
- // Instead, the state update could be applied "immediately" if it originated
26
- // from `.setItems()` function call, eliminating the unneeded second re-render.
27
- //
28
- // I could see how this minor optimization could get brittle when modifiying the code,
29
- // so I put it under a feature flag so that it could potentially be turned off
30
- // in case of any potential weird issues in some future.
31
- //
32
- // Another reason for using this feature is:
33
- //
34
- // Since `useHandleItemsPropertyChange()` runs at render time
35
- // and not after the render has finished (not in an "effect"),
36
- // if the state update was done "conventionally" (by calling `_setNewState()`),
37
- // React would throw an error about updating state during render.
38
- // No one knows what the original error message was.
39
- // Perhaps it's no longer relevant in newer versions of React.
40
- //
41
-
42
- var USE_ITEMS_UPDATE_NO_SECOND_RENDER_OPTIMIZATION = true;
21
+ import useStyle from './useStyle.js'; // When `items` property changes:
22
+ // * A new `items` property is supplied to the React component.
23
+ // * The React component re-renders itself.
24
+ // * `useSetNewItemsOnItemsPropertyChange()` hook is run.
25
+ // * `useSetNewItemsOnItemsPropertyChange()` hook detects that the `items` property
26
+ // has changed and calls `VirtualScroller.setItems(items)`.
27
+ // * `VirtualScroller.setItems(items)` calls `VirtualScroller.setState()`.
28
+ // * `VirtualScroller.setState()` calls the `setState()` function.
29
+ // * The `setState()` function calls a setter from a `useState()` hook.
30
+ // * The React component re-renders itself the second time.
43
31
 
44
32
  function VirtualScroller(_ref, ref) {
45
33
  var AsComponent = _ref.as,
@@ -111,18 +99,17 @@ function VirtualScroller(_ref, ref) {
111
99
  var _useState = useState({
112
100
  initialState: _initialState,
113
101
  onRender: virtualScroller.onRender,
114
- itemsProperty: itemsProperty,
115
- USE_ITEMS_UPDATE_NO_SECOND_RENDER_OPTIMIZATION: USE_ITEMS_UPDATE_NO_SECOND_RENDER_OPTIMIZATION
102
+ itemsProperty: itemsProperty
116
103
  }),
117
104
  getState = _useState.getState,
118
- updateState = _useState.updateState,
119
- getNextState = _useState.getNextState; // Use custom (external) state storage in the `VirtualScroller`.
105
+ setState = _useState.setState,
106
+ stateToRender = _useState.stateToRender; // Use custom (external) state storage in the `VirtualScroller`.
120
107
 
121
108
 
122
109
  useMemo(function () {
123
110
  virtualScroller.useState({
124
111
  getState: getState,
125
- updateState: updateState
112
+ setState: setState
126
113
  });
127
114
  }, []); // Start `VirtualScroller` on mount.
128
115
  // Stop `VirtualScroller` on unmount.
@@ -134,6 +121,7 @@ function VirtualScroller(_ref, ref) {
134
121
  getItemId: getItemId
135
122
  }),
136
123
  getItemKey = _useItemKeys.getItemKey,
124
+ usesAutogeneratedItemKeys = _useItemKeys.usesAutogeneratedItemKeys,
137
125
  updateItemKeysForNewItems = _useItemKeys.updateItemKeysForNewItems; // Cache per-item `setItemState` functions' "references"
138
126
  // so that item components don't get re-rendered needlessly.
139
127
 
@@ -141,26 +129,25 @@ function VirtualScroller(_ref, ref) {
141
129
  var getSetItemState = useSetItemState({
142
130
  initialItemsCount: itemsProperty.length,
143
131
  virtualScroller: virtualScroller
144
- }); // Cache per-item `onItemHeightChange` functions' "references"
132
+ }); // Cache per-item `onItemHeightDidChange` functions' "references"
145
133
  // so that item components don't get re-rendered needlessly.
146
134
 
147
- var getOnItemHeightChange = useOnItemHeightChange({
135
+ var getOnItemHeightDidChange = useOnItemHeightDidChange({
148
136
  initialItemsCount: itemsProperty.length,
149
137
  virtualScroller: virtualScroller
150
138
  }); // Calls `.setItems()` if `items` property has changed.
151
139
 
152
- useHandleItemsPropertyChange(itemsProperty, {
140
+ useSetNewItemsOnItemsPropertyChange(itemsProperty, {
153
141
  virtualScroller: virtualScroller,
154
142
  // `preserveScrollPosition` property name is deprecated,
155
143
  // use `preserveScrollPositionOnPrependItems` property instead.
156
144
  preserveScrollPosition: preserveScrollPosition,
157
- preserveScrollPositionOnPrependItems: preserveScrollPositionOnPrependItems,
158
- nextItems: getNextState().items
145
+ preserveScrollPositionOnPrependItems: preserveScrollPositionOnPrependItems
159
146
  }); // Updates `key`s if item indexes have changed.
160
147
 
161
- useHandleItemIndexesChange({
148
+ useUpdateItemKeysOnItemsChange(stateToRender.items, {
162
149
  virtualScroller: virtualScroller,
163
- itemsBeingRendered: getNextState().items,
150
+ usesAutogeneratedItemKeys: usesAutogeneratedItemKeys,
164
151
  updateItemKeysForNewItems: updateItemKeysForNewItems
165
152
  }); // Add instance methods to the React component.
166
153
 
@@ -194,15 +181,12 @@ function VirtualScroller(_ref, ref) {
194
181
  });
195
182
  var style = useStyle({
196
183
  tbody: tbody,
197
- getNextState: getNextState
184
+ state: stateToRender
198
185
  });
199
-
200
- var _getNextState = getNextState(),
201
- currentItems = _getNextState.items,
202
- itemStates = _getNextState.itemStates,
203
- firstShownItemIndex = _getNextState.firstShownItemIndex,
204
- lastShownItemIndex = _getNextState.lastShownItemIndex;
205
-
186
+ var currentItems = stateToRender.items,
187
+ itemStates = stateToRender.itemStates,
188
+ firstShownItemIndex = stateToRender.firstShownItemIndex,
189
+ lastShownItemIndex = stateToRender.lastShownItemIndex;
206
190
  return /*#__PURE__*/React.createElement(AsComponent, _extends({}, rest, {
207
191
  ref: container,
208
192
  className: className,
@@ -232,7 +216,8 @@ function VirtualScroller(_ref, ref) {
232
216
  state: itemStates && itemStates[i],
233
217
  setState: getSetItemState(i),
234
218
  onStateChange: getSetItemState(i),
235
- onHeightChange: getOnItemHeightChange(i)
219
+ onHeightChange: getOnItemHeightDidChange(i),
220
+ onHeightDidChange: getOnItemHeightDidChange(i)
236
221
  }), item);
237
222
  }
238
223
 
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualScroller.js","names":["React","useRef","useMemo","useLayoutEffect","PropTypes","useState","useVirtualScroller","useVirtualScrollerStartStop","useInstanceMethods","useItemKeys","useSetItemState","useOnItemHeightChange","useHandleItemsPropertyChange","useHandleItemIndexesChange","useClassName","useStyle","USE_ITEMS_UPDATE_NO_SECOND_RENDER_OPTIMIZATION","VirtualScroller","ref","AsComponent","as","itemsProperty","items","Component","itemComponent","itemComponentProps","estimatedItemHeight","getEstimatedItemHeight","getEstimatedVisibleItemRowsCount","bypass","tbody","preserveScrollPosition","preserveScrollPositionOnPrependItems","measureItemsBatchSize","scrollableContainer","getScrollableContainer","getColumnsCount","getItemId","className","onMount","onItemFirstRender","onItemInitialRender","initialScrollPosition","onScrollPositionChange","onStateChange","initialState","getInitialItemState","rest","container","virtualScroller","_initialState","getInitialState","onRender","getState","updateState","getNextState","getItemKey","updateItemKeysForNewItems","getSetItemState","initialItemsCount","length","getOnItemHeightChange","nextItems","itemsBeingRendered","style","currentItems","itemStates","firstShownItemIndex","lastShownItemIndex","map","item","i","forwardRef","elementType","oneOfType","string","func","object","propTypes","arrayOf","any","isRequired","number","bool","shape","beforeItemsHeight","afterItemsHeight","itemHeights","columnsCount","verticalSpacing","defaultProps"],"sources":["../../source/react/VirtualScroller.js"],"sourcesContent":["import React, { useRef, useMemo, useLayoutEffect } from 'react'\r\nimport PropTypes from 'prop-types'\r\n\r\nimport useState from './useState.js'\r\nimport useVirtualScroller from './useVirtualScroller.js'\r\nimport useVirtualScrollerStartStop from './useVirtualScrollerStartStop.js'\r\nimport useInstanceMethods from './useInstanceMethods.js'\r\nimport useItemKeys from './useItemKeys.js'\r\nimport useSetItemState from './useSetItemState.js'\r\nimport useOnItemHeightChange from './useOnItemHeightChange.js'\r\nimport useHandleItemsPropertyChange from './useHandleItemsPropertyChange.js'\r\nimport useHandleItemIndexesChange from './useHandleItemIndexesChange.js'\r\nimport useClassName from './useClassName.js'\r\nimport useStyle from './useStyle.js'\r\n\r\n// When `items` property changes, `useHandleItemsPropertyChange()` hook detects that\r\n// and calls `VirtualScroller.setItems()` which in turn calls the `updateState()` function.\r\n// At this point, an insignificant optimization could be applied:\r\n// the component could avoid re-rendering the second time.\r\n// Instead, the state update could be applied \"immediately\" if it originated\r\n// from `.setItems()` function call, eliminating the unneeded second re-render.\r\n//\r\n// I could see how this minor optimization could get brittle when modifiying the code,\r\n// so I put it under a feature flag so that it could potentially be turned off\r\n// in case of any potential weird issues in some future.\r\n//\r\n// Another reason for using this feature is:\r\n//\r\n// Since `useHandleItemsPropertyChange()` runs at render time\r\n// and not after the render has finished (not in an \"effect\"),\r\n// if the state update was done \"conventionally\" (by calling `_setNewState()`),\r\n// React would throw an error about updating state during render.\r\n// No one knows what the original error message was.\r\n// Perhaps it's no longer relevant in newer versions of React.\r\n//\r\nconst USE_ITEMS_UPDATE_NO_SECOND_RENDER_OPTIMIZATION = true\r\n\r\nfunction VirtualScroller({\r\n\tas: AsComponent,\r\n\titems: itemsProperty,\r\n\titemComponent: Component,\r\n\titemComponentProps,\r\n\t// `estimatedItemHeight` property name is deprecated,\r\n\t// use `getEstimatedItemHeight` property instead.\r\n\testimatedItemHeight,\r\n\tgetEstimatedItemHeight,\r\n\tgetEstimatedVisibleItemRowsCount,\r\n\tbypass,\r\n\ttbody,\r\n\t// `preserveScrollPosition` property name is deprecated,\r\n\t// use `preserveScrollPositionOnPrependItems` property instead.\r\n\tpreserveScrollPosition,\r\n\tpreserveScrollPositionOnPrependItems,\r\n\tmeasureItemsBatchSize,\r\n\t// `scrollableContainer` property is deprecated.\r\n\t// Use `getScrollableContainer()` property instead.\r\n\tscrollableContainer,\r\n\tgetScrollableContainer,\r\n\tgetColumnsCount,\r\n\tgetItemId,\r\n\tclassName,\r\n\tonMount,\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\tonItemFirstRender,\r\n\tonItemInitialRender,\r\n\tinitialScrollPosition,\r\n\tonScrollPositionChange,\r\n\tonStateChange,\r\n\tinitialState,\r\n\tgetInitialItemState,\r\n\t...rest\r\n}, ref) {\r\n\t// List items \"container\" DOM Element reference.\r\n\tconst container = useRef()\r\n\r\n\t// Create a `VirtualScroller` instance.\r\n\tconst virtualScroller = useVirtualScroller({\r\n\t\titems: itemsProperty,\r\n\t\t// `estimatedItemHeight` property name is deprecated,\r\n\t\t// use `getEstimatedItemHeight` property instead.\r\n\t\testimatedItemHeight,\r\n\t\tgetEstimatedItemHeight,\r\n\t\tgetEstimatedVisibleItemRowsCount,\r\n\t\tbypass,\r\n\t\t// bypassBatchSize,\r\n\t\ttbody,\r\n\t\tonItemInitialRender,\r\n\t\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\t\tonItemFirstRender,\r\n\t\tinitialScrollPosition,\r\n\t\tonScrollPositionChange,\r\n\t\tmeasureItemsBatchSize,\r\n\t\t// `scrollableContainer` property is deprecated.\r\n\t\t// Use `getScrollableContainer()` property instead.\r\n\t\tscrollableContainer,\r\n\t\tgetScrollableContainer,\r\n\t\tgetColumnsCount,\r\n\t\tgetItemId,\r\n\t\tAsComponent,\r\n\t\tinitialState,\r\n\t\tgetInitialItemState,\r\n\t\tonStateChange\r\n\t}, {\r\n\t\tcontainer\r\n\t})\r\n\r\n\t// Only compute the initial state once.\r\n\tconst _initialState = useMemo(() => {\r\n\t\treturn virtualScroller.getInitialState()\r\n\t}, [])\r\n\r\n\t// Use React's `useState()` hook for managing `VirtualScroller`'s state lifecycle.\r\n\t// This way, React will re-render the component on every state update.\r\n\tconst {\r\n\t\tgetState,\r\n\t\tupdateState,\r\n\t\tgetNextState\r\n\t} = useState({\r\n\t\tinitialState: _initialState,\r\n\t\tonRender: virtualScroller.onRender,\r\n\t\titemsProperty,\r\n\t\tUSE_ITEMS_UPDATE_NO_SECOND_RENDER_OPTIMIZATION\r\n\t})\r\n\r\n\t// Use custom (external) state storage in the `VirtualScroller`.\r\n\tuseMemo(() => {\r\n\t\tvirtualScroller.useState({\r\n\t\t\tgetState,\r\n\t\t\tupdateState\r\n\t\t})\r\n\t}, [])\r\n\r\n\t// Start `VirtualScroller` on mount.\r\n\t// Stop `VirtualScroller` on unmount.\r\n\tuseVirtualScrollerStartStop(virtualScroller)\r\n\r\n\t// List items are rendered with `key`s so that React doesn't\r\n\t// \"reuse\" `itemComponent`s in cases when `items` are changed.\r\n\tconst {\r\n\t\tgetItemKey,\r\n\t\tupdateItemKeysForNewItems\r\n\t} = useItemKeys({\r\n\t\tgetItemId\r\n\t})\r\n\r\n\t// Cache per-item `setItemState` functions' \"references\"\r\n\t// so that item components don't get re-rendered needlessly.\r\n\tconst getSetItemState = useSetItemState({\r\n\t\tinitialItemsCount: itemsProperty.length,\r\n\t\tvirtualScroller\r\n\t})\r\n\r\n\t// Cache per-item `onItemHeightChange` functions' \"references\"\r\n\t// so that item components don't get re-rendered needlessly.\r\n\tconst getOnItemHeightChange = useOnItemHeightChange({\r\n\t\tinitialItemsCount: itemsProperty.length,\r\n\t\tvirtualScroller\r\n\t})\r\n\r\n\t// Calls `.setItems()` if `items` property has changed.\r\n\tuseHandleItemsPropertyChange(itemsProperty, {\r\n\t\tvirtualScroller,\r\n\t\t// `preserveScrollPosition` property name is deprecated,\r\n\t\t// use `preserveScrollPositionOnPrependItems` property instead.\r\n\t\tpreserveScrollPosition,\r\n\t\tpreserveScrollPositionOnPrependItems,\r\n\t\tnextItems: getNextState().items\r\n\t})\r\n\r\n\t// Updates `key`s if item indexes have changed.\r\n\tuseHandleItemIndexesChange({\r\n\t\tvirtualScroller,\r\n\t\titemsBeingRendered: getNextState().items,\r\n\t\tupdateItemKeysForNewItems\r\n\t})\r\n\r\n\t// Add instance methods to the React component.\r\n\tuseInstanceMethods(ref, {\r\n\t\tvirtualScroller\r\n\t})\r\n\r\n\tuseLayoutEffect(() => {\r\n\t\t// (deprecated)\r\n\t\t// `onMount()` option is deprecated due to no longer being used.\r\n\t\t// If someone thinks there's a valid use case for it, create an issue.\r\n\t\tif (onMount) {\r\n\t\t\tonMount()\r\n\t\t}\r\n\t}, [])\r\n\r\n\t// `willRender()` function is no longer used.\r\n\t//\r\n\t// // `getSnapshotBeforeUpdate()` is called right before `componentDidUpdate()`.\r\n\t// // A hook equivalent/workaround for `getSnapshotBeforeUpdate()`:\r\n\t// // https://github.com/facebook/react/issues/15221#issuecomment-583448887\r\n\t// //\r\n\t// getSnapshotBeforeUpdate(prevProps, prevState) {\r\n\t// \tif (this.state !== prevState) {\r\n\t// \t\tthis.willRender(this.state, prevState)\r\n\t// \t}\r\n\t// \t// Returns `null` to avoid React warning:\r\n\t// \t// \"A snapshot value (or null) must be returned. You have returned undefined\".\r\n\t// \treturn null\r\n\t// }\r\n\r\n\tclassName = useClassName(className, {\r\n\t\ttbody\r\n\t})\r\n\r\n\tconst style = useStyle({\r\n\t\ttbody,\r\n\t\tgetNextState\r\n\t})\r\n\r\n\tconst {\r\n\t\titems: currentItems,\r\n\t\titemStates,\r\n\t\tfirstShownItemIndex,\r\n\t\tlastShownItemIndex\r\n\t} = getNextState()\r\n\r\n\treturn (\r\n\t\t<AsComponent\r\n\t\t\t{...rest}\r\n\t\t\tref={container}\r\n\t\t\tclassName={className}\r\n\t\t\tstyle={style}>\r\n\t\t\t{currentItems.map((item, i) => {\r\n\t\t\t\tif (i >= firstShownItemIndex && i <= lastShownItemIndex) {\r\n\t\t\t\t\t// * Passing `item` as `children` property is legacy and is deprecated.\r\n\t\t\t\t\t// If version `2.x` is published in some hypothetical future,\r\n\t\t\t\t\t// the `item` and `itemIndex` properties should be moved below\r\n\t\t\t\t\t// `{...itemComponentProps}`.\r\n\t\t\t\t\t//\r\n\t\t\t\t\t// * Passing `itemIndex` property is legacy and is deprecated.\r\n\t\t\t\t\t// The rationale is that setting new `items` on a React component\r\n\t\t\t\t\t// is an asynchronous operation, so when a user obtains `itemIndex`,\r\n\t\t\t\t\t// they don't know which `items` list does that index correspond to,\r\n\t\t\t\t\t// therefore making it useless, or even buggy if used incorreclty.\r\n\t\t\t\t\t//\r\n\t\t\t\t\t// * Passing `onStateChange` property for legacy reasons.\r\n\t\t\t\t\t// The new property name is `setState`.\r\n\t\t\t\t\t// The old property name `onStateChange` is deprecated.\r\n\t\t\t\t\t//\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t<Component\r\n\t\t\t\t\t\t\titem={item}\r\n\t\t\t\t\t\t\titemIndex={i}\r\n\t\t\t\t\t\t\t{...itemComponentProps}\r\n\t\t\t\t\t\t\tkey={getItemKey(item, i)}\r\n\t\t\t\t\t\t\tstate={itemStates && itemStates[i]}\r\n\t\t\t\t\t\t\tsetState={getSetItemState(i)}\r\n\t\t\t\t\t\t\tonStateChange={getSetItemState(i)}\r\n\t\t\t\t\t\t\tonHeightChange={getOnItemHeightChange(i)}>\r\n\t\t\t\t\t\t\t{item}\r\n\t\t\t\t\t\t</Component>\r\n\t\t\t\t\t)\r\n\t\t\t\t}\r\n\t\t\t\treturn null\r\n\t\t\t})}\r\n\t\t</AsComponent>\r\n\t)\r\n}\r\n\r\nVirtualScroller = React.forwardRef(VirtualScroller)\r\n\r\nexport default VirtualScroller\r\n\r\n// `PropTypes.elementType` is available in some version of `prop-types`.\r\n// https://github.com/facebook/prop-types/issues/200\r\nconst elementType = PropTypes.elementType || PropTypes.oneOfType([\r\n\tPropTypes.string,\r\n\tPropTypes.func,\r\n\tPropTypes.object\r\n])\r\n\r\nVirtualScroller.propTypes = {\r\n\tas: elementType,\r\n\titems: PropTypes.arrayOf(PropTypes.any).isRequired,\r\n\titemComponent: elementType.isRequired,\r\n\titemComponentProps: PropTypes.object,\r\n\t// `estimatedItemHeight` property name is deprecated,\r\n\t// use `getEstimatedItemHeight` property instead.\r\n\testimatedItemHeight: PropTypes.number,\r\n\tgetEstimatedItemHeight: PropTypes.func,\r\n\tgetEstimatedVisibleItemRowsCount: PropTypes.func,\r\n\tbypass: PropTypes.bool,\r\n\t// bypassBatchSize: PropTypes.number,\r\n\ttbody: PropTypes.bool,\r\n\tpreserveScrollPositionOnPrependItems: PropTypes.bool,\r\n\t// `preserveScrollPosition` property name is deprecated,\r\n\t// use `preserveScrollPositionOnPrependItems` instead.\r\n\tpreserveScrollPosition: PropTypes.bool,\r\n\tmeasureItemsBatchSize: PropTypes.number,\r\n\t// `scrollableContainer` property is deprecated.\r\n\t// Use `getScrollableContainer()` property instead.\r\n\tscrollableContainer: PropTypes.any,\r\n\tgetScrollableContainer: PropTypes.func,\r\n\tgetColumnsCount: PropTypes.func,\r\n\tgetItemId: PropTypes.func,\r\n\tclassName: PropTypes.string,\r\n\tonMount: PropTypes.func,\r\n\tonItemInitialRender: PropTypes.func,\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\tonItemFirstRender: PropTypes.func,\r\n\tinitialScrollPosition: PropTypes.number,\r\n\tonScrollPositionChange: PropTypes.func,\r\n\tonStateChange: PropTypes.func,\r\n\tinitialState: PropTypes.shape({\r\n\t\titems: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n\t\titemStates: PropTypes.arrayOf(PropTypes.any).isRequired,\r\n\t\tfirstShownItemIndex: PropTypes.number.isRequired,\r\n\t\tlastShownItemIndex: PropTypes.number.isRequired,\r\n\t\tbeforeItemsHeight: PropTypes.number.isRequired,\r\n\t\tafterItemsHeight: PropTypes.number.isRequired,\r\n\t\titemHeights: PropTypes.arrayOf(PropTypes.number).isRequired,\r\n\t\tcolumnsCount: PropTypes.number,\r\n\t\tverticalSpacing: PropTypes.number\r\n\t}),\r\n\tgetInitialItemState: PropTypes.func\r\n}\r\n\r\nVirtualScroller.defaultProps = {\r\n\tas: 'div'\r\n}\r\n"],"mappings":";;;;;;;;AAAA,OAAOA,KAAP,IAAgBC,MAAhB,EAAwBC,OAAxB,EAAiCC,eAAjC,QAAwD,OAAxD;AACA,OAAOC,SAAP,MAAsB,YAAtB;AAEA,OAAOC,QAAP,MAAqB,eAArB;AACA,OAAOC,kBAAP,MAA+B,yBAA/B;AACA,OAAOC,2BAAP,MAAwC,kCAAxC;AACA,OAAOC,kBAAP,MAA+B,yBAA/B;AACA,OAAOC,WAAP,MAAwB,kBAAxB;AACA,OAAOC,eAAP,MAA4B,sBAA5B;AACA,OAAOC,qBAAP,MAAkC,4BAAlC;AACA,OAAOC,4BAAP,MAAyC,mCAAzC;AACA,OAAOC,0BAAP,MAAuC,iCAAvC;AACA,OAAOC,YAAP,MAAyB,mBAAzB;AACA,OAAOC,QAAP,MAAqB,eAArB,C,CAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,IAAMC,8CAA8C,GAAG,IAAvD;;AAEA,SAASC,eAAT,OAkCGC,GAlCH,EAkCQ;EAAA,IAjCHC,WAiCG,QAjCPC,EAiCO;EAAA,IAhCAC,aAgCA,QAhCPC,KAgCO;EAAA,IA/BQC,SA+BR,QA/BPC,aA+BO;EAAA,IA9BPC,kBA8BO,QA9BPA,kBA8BO;EAAA,IA3BPC,mBA2BO,QA3BPA,mBA2BO;EAAA,IA1BPC,sBA0BO,QA1BPA,sBA0BO;EAAA,IAzBPC,gCAyBO,QAzBPA,gCAyBO;EAAA,IAxBPC,MAwBO,QAxBPA,MAwBO;EAAA,IAvBPC,KAuBO,QAvBPA,KAuBO;EAAA,IApBPC,sBAoBO,QApBPA,sBAoBO;EAAA,IAnBPC,oCAmBO,QAnBPA,oCAmBO;EAAA,IAlBPC,qBAkBO,QAlBPA,qBAkBO;EAAA,IAfPC,mBAeO,QAfPA,mBAeO;EAAA,IAdPC,sBAcO,QAdPA,sBAcO;EAAA,IAbPC,eAaO,QAbPA,eAaO;EAAA,IAZPC,SAYO,QAZPA,SAYO;EAAA,IAXPC,SAWO,QAXPA,SAWO;EAAA,IAVPC,OAUO,QAVPA,OAUO;EAAA,IARPC,iBAQO,QARPA,iBAQO;EAAA,IAPPC,mBAOO,QAPPA,mBAOO;EAAA,IANPC,qBAMO,QANPA,qBAMO;EAAA,IALPC,sBAKO,QALPA,sBAKO;EAAA,IAJPC,aAIO,QAJPA,aAIO;EAAA,IAHPC,YAGO,QAHPA,YAGO;EAAA,IAFPC,mBAEO,QAFPA,mBAEO;EAAA,IADJC,IACI;;EACP;EACA,IAAMC,SAAS,GAAG/C,MAAM,EAAxB,CAFO,CAIP;;EACA,IAAMgD,eAAe,GAAG3C,kBAAkB,CAAC;IAC1CgB,KAAK,EAAED,aADmC;IAE1C;IACA;IACAK,mBAAmB,EAAnBA,mBAJ0C;IAK1CC,sBAAsB,EAAtBA,sBAL0C;IAM1CC,gCAAgC,EAAhCA,gCAN0C;IAO1CC,MAAM,EAANA,MAP0C;IAQ1C;IACAC,KAAK,EAALA,KAT0C;IAU1CW,mBAAmB,EAAnBA,mBAV0C;IAW1C;IACAD,iBAAiB,EAAjBA,iBAZ0C;IAa1CE,qBAAqB,EAArBA,qBAb0C;IAc1CC,sBAAsB,EAAtBA,sBAd0C;IAe1CV,qBAAqB,EAArBA,qBAf0C;IAgB1C;IACA;IACAC,mBAAmB,EAAnBA,mBAlB0C;IAmB1CC,sBAAsB,EAAtBA,sBAnB0C;IAoB1CC,eAAe,EAAfA,eApB0C;IAqB1CC,SAAS,EAATA,SArB0C;IAsB1ClB,WAAW,EAAXA,WAtB0C;IAuB1C0B,YAAY,EAAZA,YAvB0C;IAwB1CC,mBAAmB,EAAnBA,mBAxB0C;IAyB1CF,aAAa,EAAbA;EAzB0C,CAAD,EA0BvC;IACFI,SAAS,EAATA;EADE,CA1BuC,CAA1C,CALO,CAmCP;;EACA,IAAME,aAAa,GAAGhD,OAAO,CAAC,YAAM;IACnC,OAAO+C,eAAe,CAACE,eAAhB,EAAP;EACA,CAF4B,EAE1B,EAF0B,CAA7B,CApCO,CAwCP;EACA;;;EACA,gBAII9C,QAAQ,CAAC;IACZwC,YAAY,EAAEK,aADF;IAEZE,QAAQ,EAAEH,eAAe,CAACG,QAFd;IAGZ/B,aAAa,EAAbA,aAHY;IAIZL,8CAA8C,EAA9CA;EAJY,CAAD,CAJZ;EAAA,IACCqC,QADD,aACCA,QADD;EAAA,IAECC,WAFD,aAECA,WAFD;EAAA,IAGCC,YAHD,aAGCA,YAHD,CA1CO,CAqDP;;;EACArD,OAAO,CAAC,YAAM;IACb+C,eAAe,CAAC5C,QAAhB,CAAyB;MACxBgD,QAAQ,EAARA,QADwB;MAExBC,WAAW,EAAXA;IAFwB,CAAzB;EAIA,CALM,EAKJ,EALI,CAAP,CAtDO,CA6DP;EACA;;EACA/C,2BAA2B,CAAC0C,eAAD,CAA3B,CA/DO,CAiEP;EACA;;EACA,mBAGIxC,WAAW,CAAC;IACf4B,SAAS,EAATA;EADe,CAAD,CAHf;EAAA,IACCmB,UADD,gBACCA,UADD;EAAA,IAECC,yBAFD,gBAECA,yBAFD,CAnEO,CA0EP;EACA;;;EACA,IAAMC,eAAe,GAAGhD,eAAe,CAAC;IACvCiD,iBAAiB,EAAEtC,aAAa,CAACuC,MADM;IAEvCX,eAAe,EAAfA;EAFuC,CAAD,CAAvC,CA5EO,CAiFP;EACA;;EACA,IAAMY,qBAAqB,GAAGlD,qBAAqB,CAAC;IACnDgD,iBAAiB,EAAEtC,aAAa,CAACuC,MADkB;IAEnDX,eAAe,EAAfA;EAFmD,CAAD,CAAnD,CAnFO,CAwFP;;EACArC,4BAA4B,CAACS,aAAD,EAAgB;IAC3C4B,eAAe,EAAfA,eAD2C;IAE3C;IACA;IACAlB,sBAAsB,EAAtBA,sBAJ2C;IAK3CC,oCAAoC,EAApCA,oCAL2C;IAM3C8B,SAAS,EAAEP,YAAY,GAAGjC;EANiB,CAAhB,CAA5B,CAzFO,CAkGP;;EACAT,0BAA0B,CAAC;IAC1BoC,eAAe,EAAfA,eAD0B;IAE1Bc,kBAAkB,EAAER,YAAY,GAAGjC,KAFT;IAG1BmC,yBAAyB,EAAzBA;EAH0B,CAAD,CAA1B,CAnGO,CAyGP;;EACAjD,kBAAkB,CAACU,GAAD,EAAM;IACvB+B,eAAe,EAAfA;EADuB,CAAN,CAAlB;EAIA9C,eAAe,CAAC,YAAM;IACrB;IACA;IACA;IACA,IAAIoC,OAAJ,EAAa;MACZA,OAAO;IACP;EACD,CAPc,EAOZ,EAPY,CAAf,CA9GO,CAuHP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEAD,SAAS,GAAGxB,YAAY,CAACwB,SAAD,EAAY;IACnCR,KAAK,EAALA;EADmC,CAAZ,CAAxB;EAIA,IAAMkC,KAAK,GAAGjD,QAAQ,CAAC;IACtBe,KAAK,EAALA,KADsB;IAEtByB,YAAY,EAAZA;EAFsB,CAAD,CAAtB;;EAKA,oBAKIA,YAAY,EALhB;EAAA,IACQU,YADR,iBACC3C,KADD;EAAA,IAEC4C,UAFD,iBAECA,UAFD;EAAA,IAGCC,mBAHD,iBAGCA,mBAHD;EAAA,IAICC,kBAJD,iBAICA,kBAJD;;EAOA,oBACC,oBAAC,WAAD,eACKrB,IADL;IAEC,GAAG,EAAEC,SAFN;IAGC,SAAS,EAAEV,SAHZ;IAIC,KAAK,EAAE0B;EAJR,IAKEC,YAAY,CAACI,GAAb,CAAiB,UAACC,IAAD,EAAOC,CAAP,EAAa;IAC9B,IAAIA,CAAC,IAAIJ,mBAAL,IAA4BI,CAAC,IAAIH,kBAArC,EAAyD;MACxD;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA,oBACC,oBAAC,SAAD;QACC,IAAI,EAAEE,IADP;QAEC,SAAS,EAAEC;MAFZ,GAGK9C,kBAHL;QAIC,GAAG,EAAE+B,UAAU,CAACc,IAAD,EAAOC,CAAP,CAJhB;QAKC,KAAK,EAAEL,UAAU,IAAIA,UAAU,CAACK,CAAD,CALhC;QAMC,QAAQ,EAAEb,eAAe,CAACa,CAAD,CAN1B;QAOC,aAAa,EAAEb,eAAe,CAACa,CAAD,CAP/B;QAQC,cAAc,EAAEV,qBAAqB,CAACU,CAAD;MARtC,IASED,IATF,CADD;IAaA;;IACD,OAAO,IAAP;EACA,CAhCA,CALF,CADD;AAyCA;;AAEDrD,eAAe,gBAAGjB,KAAK,CAACwE,UAAN,CAAiBvD,eAAjB,CAAlB;AAEA,eAAeA,eAAf,C,CAEA;AACA;;AACA,IAAMwD,WAAW,GAAGrE,SAAS,CAACqE,WAAV,IAAyBrE,SAAS,CAACsE,SAAV,CAAoB,CAChEtE,SAAS,CAACuE,MADsD,EAEhEvE,SAAS,CAACwE,IAFsD,EAGhExE,SAAS,CAACyE,MAHsD,CAApB,CAA7C;AAMA5D,eAAe,CAAC6D,SAAhB,GAA4B;EAC3B1D,EAAE,EAAEqD,WADuB;EAE3BnD,KAAK,EAAElB,SAAS,CAAC2E,OAAV,CAAkB3E,SAAS,CAAC4E,GAA5B,EAAiCC,UAFb;EAG3BzD,aAAa,EAAEiD,WAAW,CAACQ,UAHA;EAI3BxD,kBAAkB,EAAErB,SAAS,CAACyE,MAJH;EAK3B;EACA;EACAnD,mBAAmB,EAAEtB,SAAS,CAAC8E,MAPJ;EAQ3BvD,sBAAsB,EAAEvB,SAAS,CAACwE,IARP;EAS3BhD,gCAAgC,EAAExB,SAAS,CAACwE,IATjB;EAU3B/C,MAAM,EAAEzB,SAAS,CAAC+E,IAVS;EAW3B;EACArD,KAAK,EAAE1B,SAAS,CAAC+E,IAZU;EAa3BnD,oCAAoC,EAAE5B,SAAS,CAAC+E,IAbrB;EAc3B;EACA;EACApD,sBAAsB,EAAE3B,SAAS,CAAC+E,IAhBP;EAiB3BlD,qBAAqB,EAAE7B,SAAS,CAAC8E,MAjBN;EAkB3B;EACA;EACAhD,mBAAmB,EAAE9B,SAAS,CAAC4E,GApBJ;EAqB3B7C,sBAAsB,EAAE/B,SAAS,CAACwE,IArBP;EAsB3BxC,eAAe,EAAEhC,SAAS,CAACwE,IAtBA;EAuB3BvC,SAAS,EAAEjC,SAAS,CAACwE,IAvBM;EAwB3BtC,SAAS,EAAElC,SAAS,CAACuE,MAxBM;EAyB3BpC,OAAO,EAAEnC,SAAS,CAACwE,IAzBQ;EA0B3BnC,mBAAmB,EAAErC,SAAS,CAACwE,IA1BJ;EA2B3B;EACApC,iBAAiB,EAAEpC,SAAS,CAACwE,IA5BF;EA6B3BlC,qBAAqB,EAAEtC,SAAS,CAAC8E,MA7BN;EA8B3BvC,sBAAsB,EAAEvC,SAAS,CAACwE,IA9BP;EA+B3BhC,aAAa,EAAExC,SAAS,CAACwE,IA/BE;EAgC3B/B,YAAY,EAAEzC,SAAS,CAACgF,KAAV,CAAgB;IAC7B9D,KAAK,EAAElB,SAAS,CAAC2E,OAAV,CAAkB3E,SAAS,CAACyE,MAA5B,EAAoCI,UADd;IAE7Bf,UAAU,EAAE9D,SAAS,CAAC2E,OAAV,CAAkB3E,SAAS,CAAC4E,GAA5B,EAAiCC,UAFhB;IAG7Bd,mBAAmB,EAAE/D,SAAS,CAAC8E,MAAV,CAAiBD,UAHT;IAI7Bb,kBAAkB,EAAEhE,SAAS,CAAC8E,MAAV,CAAiBD,UAJR;IAK7BI,iBAAiB,EAAEjF,SAAS,CAAC8E,MAAV,CAAiBD,UALP;IAM7BK,gBAAgB,EAAElF,SAAS,CAAC8E,MAAV,CAAiBD,UANN;IAO7BM,WAAW,EAAEnF,SAAS,CAAC2E,OAAV,CAAkB3E,SAAS,CAAC8E,MAA5B,EAAoCD,UAPpB;IAQ7BO,YAAY,EAAEpF,SAAS,CAAC8E,MARK;IAS7BO,eAAe,EAAErF,SAAS,CAAC8E;EATE,CAAhB,CAhCa;EA2C3BpC,mBAAmB,EAAE1C,SAAS,CAACwE;AA3CJ,CAA5B;AA8CA3D,eAAe,CAACyE,YAAhB,GAA+B;EAC9BtE,EAAE,EAAE;AAD0B,CAA/B"}
1
+ {"version":3,"file":"VirtualScroller.js","names":["React","useRef","useMemo","useLayoutEffect","PropTypes","useState","useVirtualScroller","useVirtualScrollerStartStop","useInstanceMethods","useItemKeys","useSetItemState","useOnItemHeightDidChange","useSetNewItemsOnItemsPropertyChange","useUpdateItemKeysOnItemsChange","useClassName","useStyle","VirtualScroller","ref","AsComponent","as","itemsProperty","items","Component","itemComponent","itemComponentProps","estimatedItemHeight","getEstimatedItemHeight","getEstimatedVisibleItemRowsCount","bypass","tbody","preserveScrollPosition","preserveScrollPositionOnPrependItems","measureItemsBatchSize","scrollableContainer","getScrollableContainer","getColumnsCount","getItemId","className","onMount","onItemFirstRender","onItemInitialRender","initialScrollPosition","onScrollPositionChange","onStateChange","initialState","getInitialItemState","rest","container","virtualScroller","_initialState","getInitialState","onRender","getState","setState","stateToRender","getItemKey","usesAutogeneratedItemKeys","updateItemKeysForNewItems","getSetItemState","initialItemsCount","length","getOnItemHeightDidChange","style","state","currentItems","itemStates","firstShownItemIndex","lastShownItemIndex","map","item","i","forwardRef","elementType","oneOfType","string","func","object","propTypes","arrayOf","any","isRequired","number","bool","shape","beforeItemsHeight","afterItemsHeight","itemHeights","columnsCount","verticalSpacing","defaultProps"],"sources":["../../source/react/VirtualScroller.js"],"sourcesContent":["import React, { useRef, useMemo, useLayoutEffect } from 'react'\r\nimport PropTypes from 'prop-types'\r\n\r\nimport useState from './useState.js'\r\nimport useVirtualScroller from './useVirtualScroller.js'\r\nimport useVirtualScrollerStartStop from './useVirtualScrollerStartStop.js'\r\nimport useInstanceMethods from './useInstanceMethods.js'\r\nimport useItemKeys from './useItemKeys.js'\r\nimport useSetItemState from './useSetItemState.js'\r\nimport useOnItemHeightDidChange from './useOnItemHeightDidChange.js'\r\nimport useSetNewItemsOnItemsPropertyChange from './useSetNewItemsOnItemsPropertyChange.js'\r\nimport useUpdateItemKeysOnItemsChange from './useUpdateItemKeysOnItemsChange.js'\r\nimport useClassName from './useClassName.js'\r\nimport useStyle from './useStyle.js'\r\n\r\n// When `items` property changes:\r\n// * A new `items` property is supplied to the React component.\r\n// * The React component re-renders itself.\r\n// * `useSetNewItemsOnItemsPropertyChange()` hook is run.\r\n// * `useSetNewItemsOnItemsPropertyChange()` hook detects that the `items` property\r\n// has changed and calls `VirtualScroller.setItems(items)`.\r\n// * `VirtualScroller.setItems(items)` calls `VirtualScroller.setState()`.\r\n// * `VirtualScroller.setState()` calls the `setState()` function.\r\n// * The `setState()` function calls a setter from a `useState()` hook.\r\n// * The React component re-renders itself the second time.\r\n\r\nfunction VirtualScroller({\r\n\tas: AsComponent,\r\n\titems: itemsProperty,\r\n\titemComponent: Component,\r\n\titemComponentProps,\r\n\t// `estimatedItemHeight` property name is deprecated,\r\n\t// use `getEstimatedItemHeight` property instead.\r\n\testimatedItemHeight,\r\n\tgetEstimatedItemHeight,\r\n\tgetEstimatedVisibleItemRowsCount,\r\n\tbypass,\r\n\ttbody,\r\n\t// `preserveScrollPosition` property name is deprecated,\r\n\t// use `preserveScrollPositionOnPrependItems` property instead.\r\n\tpreserveScrollPosition,\r\n\tpreserveScrollPositionOnPrependItems,\r\n\tmeasureItemsBatchSize,\r\n\t// `scrollableContainer` property is deprecated.\r\n\t// Use `getScrollableContainer()` property instead.\r\n\tscrollableContainer,\r\n\tgetScrollableContainer,\r\n\tgetColumnsCount,\r\n\tgetItemId,\r\n\tclassName,\r\n\tonMount,\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\tonItemFirstRender,\r\n\tonItemInitialRender,\r\n\tinitialScrollPosition,\r\n\tonScrollPositionChange,\r\n\tonStateChange,\r\n\tinitialState,\r\n\tgetInitialItemState,\r\n\t...rest\r\n}, ref) {\r\n\t// List items \"container\" DOM Element reference.\r\n\tconst container = useRef()\r\n\r\n\t// Create a `VirtualScroller` instance.\r\n\tconst virtualScroller = useVirtualScroller({\r\n\t\titems: itemsProperty,\r\n\t\t// `estimatedItemHeight` property name is deprecated,\r\n\t\t// use `getEstimatedItemHeight` property instead.\r\n\t\testimatedItemHeight,\r\n\t\tgetEstimatedItemHeight,\r\n\t\tgetEstimatedVisibleItemRowsCount,\r\n\t\tbypass,\r\n\t\t// bypassBatchSize,\r\n\t\ttbody,\r\n\t\tonItemInitialRender,\r\n\t\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\t\tonItemFirstRender,\r\n\t\tinitialScrollPosition,\r\n\t\tonScrollPositionChange,\r\n\t\tmeasureItemsBatchSize,\r\n\t\t// `scrollableContainer` property is deprecated.\r\n\t\t// Use `getScrollableContainer()` property instead.\r\n\t\tscrollableContainer,\r\n\t\tgetScrollableContainer,\r\n\t\tgetColumnsCount,\r\n\t\tgetItemId,\r\n\t\tAsComponent,\r\n\t\tinitialState,\r\n\t\tgetInitialItemState,\r\n\t\tonStateChange\r\n\t}, {\r\n\t\tcontainer\r\n\t})\r\n\r\n\t// Only compute the initial state once.\r\n\tconst _initialState = useMemo(() => {\r\n\t\treturn virtualScroller.getInitialState()\r\n\t}, [])\r\n\r\n\t// Use React's `useState()` hook for managing `VirtualScroller`'s state lifecycle.\r\n\t// This way, React will re-render the component on every state update.\r\n\tconst {\r\n\t\tgetState,\r\n\t\tsetState,\r\n\t\tstateToRender\r\n\t} = useState({\r\n\t\tinitialState: _initialState,\r\n\t\tonRender: virtualScroller.onRender,\r\n\t\titemsProperty\r\n\t})\r\n\r\n\t// Use custom (external) state storage in the `VirtualScroller`.\r\n\tuseMemo(() => {\r\n\t\tvirtualScroller.useState({\r\n\t\t\tgetState,\r\n\t\t\tsetState\r\n\t\t})\r\n\t}, [])\r\n\r\n\t// Start `VirtualScroller` on mount.\r\n\t// Stop `VirtualScroller` on unmount.\r\n\tuseVirtualScrollerStartStop(virtualScroller)\r\n\r\n\t// List items are rendered with `key`s so that React doesn't\r\n\t// \"reuse\" `itemComponent`s in cases when `items` are changed.\r\n\tconst {\r\n\t\tgetItemKey,\r\n\t\tusesAutogeneratedItemKeys,\r\n\t\tupdateItemKeysForNewItems\r\n\t} = useItemKeys({\r\n\t\tgetItemId\r\n\t})\r\n\r\n\t// Cache per-item `setItemState` functions' \"references\"\r\n\t// so that item components don't get re-rendered needlessly.\r\n\tconst getSetItemState = useSetItemState({\r\n\t\tinitialItemsCount: itemsProperty.length,\r\n\t\tvirtualScroller\r\n\t})\r\n\r\n\t// Cache per-item `onItemHeightDidChange` functions' \"references\"\r\n\t// so that item components don't get re-rendered needlessly.\r\n\tconst getOnItemHeightDidChange = useOnItemHeightDidChange({\r\n\t\tinitialItemsCount: itemsProperty.length,\r\n\t\tvirtualScroller\r\n\t})\r\n\r\n\t// Calls `.setItems()` if `items` property has changed.\r\n\tuseSetNewItemsOnItemsPropertyChange(itemsProperty, {\r\n\t\tvirtualScroller,\r\n\t\t// `preserveScrollPosition` property name is deprecated,\r\n\t\t// use `preserveScrollPositionOnPrependItems` property instead.\r\n\t\tpreserveScrollPosition,\r\n\t\tpreserveScrollPositionOnPrependItems\r\n\t})\r\n\r\n\t// Updates `key`s if item indexes have changed.\r\n\tuseUpdateItemKeysOnItemsChange(stateToRender.items, {\r\n\t\tvirtualScroller,\r\n\t\tusesAutogeneratedItemKeys,\r\n\t\tupdateItemKeysForNewItems\r\n\t})\r\n\r\n\t// Add instance methods to the React component.\r\n\tuseInstanceMethods(ref, {\r\n\t\tvirtualScroller\r\n\t})\r\n\r\n\tuseLayoutEffect(() => {\r\n\t\t// (deprecated)\r\n\t\t// `onMount()` option is deprecated due to no longer being used.\r\n\t\t// If someone thinks there's a valid use case for it, create an issue.\r\n\t\tif (onMount) {\r\n\t\t\tonMount()\r\n\t\t}\r\n\t}, [])\r\n\r\n\t// `willRender()` function is no longer used.\r\n\t//\r\n\t// // `getSnapshotBeforeUpdate()` is called right before `componentDidUpdate()`.\r\n\t// // A hook equivalent/workaround for `getSnapshotBeforeUpdate()`:\r\n\t// // https://github.com/facebook/react/issues/15221#issuecomment-583448887\r\n\t// //\r\n\t// getSnapshotBeforeUpdate(prevProps, prevState) {\r\n\t// \tif (this.state !== prevState) {\r\n\t// \t\tthis.willRender(this.state, prevState)\r\n\t// \t}\r\n\t// \t// Returns `null` to avoid React warning:\r\n\t// \t// \"A snapshot value (or null) must be returned. You have returned undefined\".\r\n\t// \treturn null\r\n\t// }\r\n\r\n\tclassName = useClassName(className, {\r\n\t\ttbody\r\n\t})\r\n\r\n\tconst style = useStyle({\r\n\t\ttbody,\r\n\t\tstate: stateToRender\r\n\t})\r\n\r\n\tconst {\r\n\t\titems: currentItems,\r\n\t\titemStates,\r\n\t\tfirstShownItemIndex,\r\n\t\tlastShownItemIndex\r\n\t} = stateToRender\r\n\r\n\treturn (\r\n\t\t<AsComponent\r\n\t\t\t{...rest}\r\n\t\t\tref={container}\r\n\t\t\tclassName={className}\r\n\t\t\tstyle={style}>\r\n\t\t\t{currentItems.map((item, i) => {\r\n\t\t\t\tif (i >= firstShownItemIndex && i <= lastShownItemIndex) {\r\n\t\t\t\t\t// * Passing `item` as `children` property is legacy and is deprecated.\r\n\t\t\t\t\t// If version `2.x` is published in some hypothetical future,\r\n\t\t\t\t\t// the `item` and `itemIndex` properties should be moved below\r\n\t\t\t\t\t// `{...itemComponentProps}`.\r\n\t\t\t\t\t//\r\n\t\t\t\t\t// * Passing `itemIndex` property is legacy and is deprecated.\r\n\t\t\t\t\t// The rationale is that setting new `items` on a React component\r\n\t\t\t\t\t// is an asynchronous operation, so when a user obtains `itemIndex`,\r\n\t\t\t\t\t// they don't know which `items` list does that index correspond to,\r\n\t\t\t\t\t// therefore making it useless, or even buggy if used incorreclty.\r\n\t\t\t\t\t//\r\n\t\t\t\t\t// * Passing `onStateChange` property for legacy reasons.\r\n\t\t\t\t\t// The new property name is `setState`.\r\n\t\t\t\t\t// The old property name `onStateChange` is deprecated.\r\n\t\t\t\t\t//\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t<Component\r\n\t\t\t\t\t\t\titem={item}\r\n\t\t\t\t\t\t\titemIndex={i}\r\n\t\t\t\t\t\t\t{...itemComponentProps}\r\n\t\t\t\t\t\t\tkey={getItemKey(item, i)}\r\n\t\t\t\t\t\t\tstate={itemStates && itemStates[i]}\r\n\t\t\t\t\t\t\tsetState={getSetItemState(i)}\r\n\t\t\t\t\t\t\tonStateChange={getSetItemState(i)}\r\n\t\t\t\t\t\t\tonHeightChange={getOnItemHeightDidChange(i)}\r\n\t\t\t\t\t\t\tonHeightDidChange={getOnItemHeightDidChange(i)}>\r\n\t\t\t\t\t\t\t{item}\r\n\t\t\t\t\t\t</Component>\r\n\t\t\t\t\t)\r\n\t\t\t\t}\r\n\t\t\t\treturn null\r\n\t\t\t})}\r\n\t\t</AsComponent>\r\n\t)\r\n}\r\n\r\nVirtualScroller = React.forwardRef(VirtualScroller)\r\n\r\nexport default VirtualScroller\r\n\r\n// `PropTypes.elementType` is available in some version of `prop-types`.\r\n// https://github.com/facebook/prop-types/issues/200\r\nconst elementType = PropTypes.elementType || PropTypes.oneOfType([\r\n\tPropTypes.string,\r\n\tPropTypes.func,\r\n\tPropTypes.object\r\n])\r\n\r\nVirtualScroller.propTypes = {\r\n\tas: elementType,\r\n\titems: PropTypes.arrayOf(PropTypes.any).isRequired,\r\n\titemComponent: elementType.isRequired,\r\n\titemComponentProps: PropTypes.object,\r\n\t// `estimatedItemHeight` property name is deprecated,\r\n\t// use `getEstimatedItemHeight` property instead.\r\n\testimatedItemHeight: PropTypes.number,\r\n\tgetEstimatedItemHeight: PropTypes.func,\r\n\tgetEstimatedVisibleItemRowsCount: PropTypes.func,\r\n\tbypass: PropTypes.bool,\r\n\t// bypassBatchSize: PropTypes.number,\r\n\ttbody: PropTypes.bool,\r\n\tpreserveScrollPositionOnPrependItems: PropTypes.bool,\r\n\t// `preserveScrollPosition` property name is deprecated,\r\n\t// use `preserveScrollPositionOnPrependItems` instead.\r\n\tpreserveScrollPosition: PropTypes.bool,\r\n\tmeasureItemsBatchSize: PropTypes.number,\r\n\t// `scrollableContainer` property is deprecated.\r\n\t// Use `getScrollableContainer()` property instead.\r\n\tscrollableContainer: PropTypes.any,\r\n\tgetScrollableContainer: PropTypes.func,\r\n\tgetColumnsCount: PropTypes.func,\r\n\tgetItemId: PropTypes.func,\r\n\tclassName: PropTypes.string,\r\n\tonMount: PropTypes.func,\r\n\tonItemInitialRender: PropTypes.func,\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\tonItemFirstRender: PropTypes.func,\r\n\tinitialScrollPosition: PropTypes.number,\r\n\tonScrollPositionChange: PropTypes.func,\r\n\tonStateChange: PropTypes.func,\r\n\tinitialState: PropTypes.shape({\r\n\t\titems: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n\t\titemStates: PropTypes.arrayOf(PropTypes.any).isRequired,\r\n\t\tfirstShownItemIndex: PropTypes.number.isRequired,\r\n\t\tlastShownItemIndex: PropTypes.number.isRequired,\r\n\t\tbeforeItemsHeight: PropTypes.number.isRequired,\r\n\t\tafterItemsHeight: PropTypes.number.isRequired,\r\n\t\titemHeights: PropTypes.arrayOf(PropTypes.number).isRequired,\r\n\t\tcolumnsCount: PropTypes.number,\r\n\t\tverticalSpacing: PropTypes.number\r\n\t}),\r\n\tgetInitialItemState: PropTypes.func\r\n}\r\n\r\nVirtualScroller.defaultProps = {\r\n\tas: 'div'\r\n}\r\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import log from '../utility/debug.js';
1
2
  import { useRef, useMemo, useCallback } from 'react';
2
3
  export default function useItemKeys(_ref) {
3
4
  var getItemId = _ref.getItemId;
@@ -24,12 +25,15 @@ export default function useItemKeys(_ref) {
24
25
  useMemo(function () {
25
26
  // Generate an initial unique `key` prefix for list item components.
26
27
  generateItemKeyPrefix();
27
- }, []);
28
+ }, []); // If `getItemId()` function is defined, then item `id`s are gonna be the item element `key`s.
29
+
30
+ var usesAutogeneratedItemKeys = !getItemId;
28
31
  var generateItemKeyPrefixIfNotUsingItemIds = useCallback(function () {
29
- if (!getItemId) {
32
+ if (usesAutogeneratedItemKeys) {
30
33
  generateItemKeyPrefix();
34
+ log('React: ~ Item key prefix:', itemKeyPrefix.current);
31
35
  }
32
- }, [getItemId, generateItemKeyPrefix]);
36
+ }, [usesAutogeneratedItemKeys, generateItemKeyPrefix]);
33
37
  /**
34
38
  * Returns a `key` for an `item`'s element.
35
39
  * @param {object} item — The item.
@@ -46,6 +50,7 @@ export default function useItemKeys(_ref) {
46
50
  }, [getItemId, itemKeyPrefix]);
47
51
  return {
48
52
  getItemKey: getItemKey,
53
+ usesAutogeneratedItemKeys: usesAutogeneratedItemKeys,
49
54
  updateItemKeysForNewItems: generateItemKeyPrefixIfNotUsingItemIds
50
55
  };
51
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useItemKeys.js","names":["useRef","useMemo","useCallback","useItemKeys","getItemId","itemKeyPrefix","generateItemKeyPrefix","counter","getNextCounter","Number","MAX_SAFE_INTEGER","current","String","generateItemKeyPrefixIfNotUsingItemIds","getItemKey","item","i","updateItemKeysForNewItems"],"sources":["../../source/react/useItemKeys.js"],"sourcesContent":["import { useRef, useMemo, useCallback } from 'react'\r\n\r\nexport default function useItemKeys({ getItemId }) {\r\n\t// List items are rendered with `key`s so that React doesn't\r\n\t// \"reuse\" `itemComponent`s in cases when `items` are changed.\r\n const itemKeyPrefix = useRef()\r\n\r\n\t// Generates a unique `key` prefix for list item components.\r\n\tconst generateItemKeyPrefix = useMemo(() => {\r\n\t\tlet counter = 0\r\n\t\tfunction getNextCounter() {\r\n\t\t\tif (counter === Number.MAX_SAFE_INTEGER) {\r\n\t\t\t\tcounter = 0\r\n\t\t\t}\r\n\t\t\tcounter++\r\n\t\t\treturn counter\r\n\t\t}\r\n\t\treturn () => {\r\n\t\t\titemKeyPrefix.current = String(getNextCounter())\r\n\t\t}\r\n\t}, [\r\n\t\titemKeyPrefix\r\n\t])\r\n\r\n\tuseMemo(() => {\r\n\t\t// Generate an initial unique `key` prefix for list item components.\r\n\t\tgenerateItemKeyPrefix()\r\n\t}, [])\r\n\r\n\tconst generateItemKeyPrefixIfNotUsingItemIds = useCallback(() => {\r\n\t\tif (!getItemId) {\r\n\t\t\tgenerateItemKeyPrefix()\r\n\t\t}\r\n\t}, [\r\n\t\tgetItemId,\r\n\t\tgenerateItemKeyPrefix\r\n\t])\r\n\r\n\t/**\r\n\t * Returns a `key` for an `item`'s element.\r\n\t * @param {object} item — The item.\r\n\t * @param {number} i — Item's index in `items` list.\r\n\t * @return {any}\r\n\t */\r\n\tconst getItemKey = useCallback((item, i) => {\r\n\t\tif (getItemId) {\r\n\t\t\treturn getItemId(item)\r\n\t\t}\r\n\t\treturn `${itemKeyPrefix.current}:${i}`\r\n\t}, [\r\n\t\tgetItemId,\r\n\t\titemKeyPrefix\r\n\t])\r\n\r\n\treturn {\r\n\t\tgetItemKey,\r\n\t\tupdateItemKeysForNewItems: generateItemKeyPrefixIfNotUsingItemIds\r\n\t}\r\n}"],"mappings":"AAAA,SAASA,MAAT,EAAiBC,OAAjB,EAA0BC,WAA1B,QAA6C,OAA7C;AAEA,eAAe,SAASC,WAAT,OAAoC;EAAA,IAAbC,SAAa,QAAbA,SAAa;EAClD;EACA;EACC,IAAMC,aAAa,GAAGL,MAAM,EAA5B,CAHiD,CAKlD;;EACA,IAAMM,qBAAqB,GAAGL,OAAO,CAAC,YAAM;IAC3C,IAAIM,OAAO,GAAG,CAAd;;IACA,SAASC,cAAT,GAA0B;MACzB,IAAID,OAAO,KAAKE,MAAM,CAACC,gBAAvB,EAAyC;QACxCH,OAAO,GAAG,CAAV;MACA;;MACDA,OAAO;MACP,OAAOA,OAAP;IACA;;IACD,OAAO,YAAM;MACZF,aAAa,CAACM,OAAd,GAAwBC,MAAM,CAACJ,cAAc,EAAf,CAA9B;IACA,CAFD;EAGA,CAZoC,EAYlC,CACFH,aADE,CAZkC,CAArC;EAgBAJ,OAAO,CAAC,YAAM;IACb;IACAK,qBAAqB;EACrB,CAHM,EAGJ,EAHI,CAAP;EAKA,IAAMO,sCAAsC,GAAGX,WAAW,CAAC,YAAM;IAChE,IAAI,CAACE,SAAL,EAAgB;MACfE,qBAAqB;IACrB;EACD,CAJyD,EAIvD,CACFF,SADE,EAEFE,qBAFE,CAJuD,CAA1D;EASA;AACD;AACA;AACA;AACA;AACA;;EACC,IAAMQ,UAAU,GAAGZ,WAAW,CAAC,UAACa,IAAD,EAAOC,CAAP,EAAa;IAC3C,IAAIZ,SAAJ,EAAe;MACd,OAAOA,SAAS,CAACW,IAAD,CAAhB;IACA;;IACD,iBAAUV,aAAa,CAACM,OAAxB,cAAmCK,CAAnC;EACA,CAL6B,EAK3B,CACFZ,SADE,EAEFC,aAFE,CAL2B,CAA9B;EAUA,OAAO;IACNS,UAAU,EAAVA,UADM;IAENG,yBAAyB,EAAEJ;EAFrB,CAAP;AAIA"}
1
+ {"version":3,"file":"useItemKeys.js","names":["log","useRef","useMemo","useCallback","useItemKeys","getItemId","itemKeyPrefix","generateItemKeyPrefix","counter","getNextCounter","Number","MAX_SAFE_INTEGER","current","String","usesAutogeneratedItemKeys","generateItemKeyPrefixIfNotUsingItemIds","getItemKey","item","i","updateItemKeysForNewItems"],"sources":["../../source/react/useItemKeys.js"],"sourcesContent":["import log from '../utility/debug.js'\r\n\r\nimport { useRef, useMemo, useCallback } from 'react'\r\n\r\nexport default function useItemKeys({ getItemId }) {\r\n\t// List items are rendered with `key`s so that React doesn't\r\n\t// \"reuse\" `itemComponent`s in cases when `items` are changed.\r\n const itemKeyPrefix = useRef()\r\n\r\n\t// Generates a unique `key` prefix for list item components.\r\n\tconst generateItemKeyPrefix = useMemo(() => {\r\n\t\tlet counter = 0\r\n\t\tfunction getNextCounter() {\r\n\t\t\tif (counter === Number.MAX_SAFE_INTEGER) {\r\n\t\t\t\tcounter = 0\r\n\t\t\t}\r\n\t\t\tcounter++\r\n\t\t\treturn counter\r\n\t\t}\r\n\t\treturn () => {\r\n\t\t\titemKeyPrefix.current = String(getNextCounter())\r\n\t\t}\r\n\t}, [\r\n\t\titemKeyPrefix\r\n\t])\r\n\r\n\tuseMemo(() => {\r\n\t\t// Generate an initial unique `key` prefix for list item components.\r\n\t\tgenerateItemKeyPrefix()\r\n\t}, [])\r\n\r\n\t// If `getItemId()` function is defined, then item `id`s are gonna be the item element `key`s.\r\n\tconst usesAutogeneratedItemKeys = !getItemId\r\n\r\n\tconst generateItemKeyPrefixIfNotUsingItemIds = useCallback(() => {\r\n\t\tif (usesAutogeneratedItemKeys) {\r\n\t\t\tgenerateItemKeyPrefix()\r\n\t\t\tlog('React: ~ Item key prefix:', itemKeyPrefix.current)\r\n\t\t}\r\n\t}, [\r\n\t\tusesAutogeneratedItemKeys,\r\n\t\tgenerateItemKeyPrefix\r\n\t])\r\n\r\n\t/**\r\n\t * Returns a `key` for an `item`'s element.\r\n\t * @param {object} item — The item.\r\n\t * @param {number} i — Item's index in `items` list.\r\n\t * @return {any}\r\n\t */\r\n\tconst getItemKey = useCallback((item, i) => {\r\n\t\tif (getItemId) {\r\n\t\t\treturn getItemId(item)\r\n\t\t}\r\n\t\treturn `${itemKeyPrefix.current}:${i}`\r\n\t}, [\r\n\t\tgetItemId,\r\n\t\titemKeyPrefix\r\n\t])\r\n\r\n\treturn {\r\n\t\tgetItemKey,\r\n\t\tusesAutogeneratedItemKeys,\r\n\t\tupdateItemKeysForNewItems: generateItemKeyPrefixIfNotUsingItemIds\r\n\t}\r\n}"],"mappings":"AAAA,OAAOA,GAAP,MAAgB,qBAAhB;AAEA,SAASC,MAAT,EAAiBC,OAAjB,EAA0BC,WAA1B,QAA6C,OAA7C;AAEA,eAAe,SAASC,WAAT,OAAoC;EAAA,IAAbC,SAAa,QAAbA,SAAa;EAClD;EACA;EACC,IAAMC,aAAa,GAAGL,MAAM,EAA5B,CAHiD,CAKlD;;EACA,IAAMM,qBAAqB,GAAGL,OAAO,CAAC,YAAM;IAC3C,IAAIM,OAAO,GAAG,CAAd;;IACA,SAASC,cAAT,GAA0B;MACzB,IAAID,OAAO,KAAKE,MAAM,CAACC,gBAAvB,EAAyC;QACxCH,OAAO,GAAG,CAAV;MACA;;MACDA,OAAO;MACP,OAAOA,OAAP;IACA;;IACD,OAAO,YAAM;MACZF,aAAa,CAACM,OAAd,GAAwBC,MAAM,CAACJ,cAAc,EAAf,CAA9B;IACA,CAFD;EAGA,CAZoC,EAYlC,CACFH,aADE,CAZkC,CAArC;EAgBAJ,OAAO,CAAC,YAAM;IACb;IACAK,qBAAqB;EACrB,CAHM,EAGJ,EAHI,CAAP,CAtBkD,CA2BlD;;EACA,IAAMO,yBAAyB,GAAG,CAACT,SAAnC;EAEA,IAAMU,sCAAsC,GAAGZ,WAAW,CAAC,YAAM;IAChE,IAAIW,yBAAJ,EAA+B;MAC9BP,qBAAqB;MACrBP,GAAG,CAAC,2BAAD,EAA8BM,aAAa,CAACM,OAA5C,CAAH;IACA;EACD,CALyD,EAKvD,CACFE,yBADE,EAEFP,qBAFE,CALuD,CAA1D;EAUA;AACD;AACA;AACA;AACA;AACA;;EACC,IAAMS,UAAU,GAAGb,WAAW,CAAC,UAACc,IAAD,EAAOC,CAAP,EAAa;IAC3C,IAAIb,SAAJ,EAAe;MACd,OAAOA,SAAS,CAACY,IAAD,CAAhB;IACA;;IACD,iBAAUX,aAAa,CAACM,OAAxB,cAAmCM,CAAnC;EACA,CAL6B,EAK3B,CACFb,SADE,EAEFC,aAFE,CAL2B,CAA9B;EAUA,OAAO;IACNU,UAAU,EAAVA,UADM;IAENF,yBAAyB,EAAzBA,yBAFM;IAGNK,yBAAyB,EAAEJ;EAHrB,CAAP;AAKA"}
@@ -0,0 +1,11 @@
1
+ import { useRef } from 'react';
2
+ export default function useOnChange(value, onChange) {
3
+ var previousValueRef = useRef(value);
4
+ var previousValue = previousValueRef.current;
5
+ previousValueRef.current = value;
6
+
7
+ if (value !== previousValue) {
8
+ onChange(value, previousValue);
9
+ }
10
+ }
11
+ //# sourceMappingURL=useOnChange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOnChange.js","names":["useRef","useOnChange","value","onChange","previousValueRef","previousValue","current"],"sources":["../../source/react/useOnChange.js"],"sourcesContent":["import { useRef } from 'react'\r\n\r\nexport default function useOnChange(value, onChange) {\r\n\tconst previousValueRef = useRef(value)\r\n\tconst previousValue = previousValueRef.current\r\n\tpreviousValueRef.current = value\r\n\r\n\tif (value !== previousValue) {\r\n\t\tonChange(value, previousValue)\r\n\t}\r\n}"],"mappings":"AAAA,SAASA,MAAT,QAAuB,OAAvB;AAEA,eAAe,SAASC,WAAT,CAAqBC,KAArB,EAA4BC,QAA5B,EAAsC;EACpD,IAAMC,gBAAgB,GAAGJ,MAAM,CAACE,KAAD,CAA/B;EACA,IAAMG,aAAa,GAAGD,gBAAgB,CAACE,OAAvC;EACAF,gBAAgB,CAACE,OAAjB,GAA2BJ,KAA3B;;EAEA,IAAIA,KAAK,KAAKG,aAAd,EAA6B;IAC5BF,QAAQ,CAACD,KAAD,EAAQG,aAAR,CAAR;EACA;AACD"}
@@ -1,5 +1,5 @@
1
1
  import { useMemo, useRef, useCallback } from 'react';
2
- export default function useOnItemHeightChange(_ref) {
2
+ export default function useOnItemHeightDidChange(_ref) {
3
3
  var initialItemsCount = _ref.initialItemsCount,
4
4
  virtualScroller = _ref.virtualScroller;
5
5
  // Only compute the initial cache value once.
@@ -7,18 +7,18 @@ export default function useOnItemHeightChange(_ref) {
7
7
  return new Array(initialItemsCount);
8
8
  }, []); // Handler functions cache.
9
9
 
10
- var cache = useRef(initialCacheValue); // Caches per-item `onItemHeightChange` functions' "references"
10
+ var cache = useRef(initialCacheValue); // Caches per-item `onItemHeightDidChange` functions' "references"
11
11
  // so that item components don't get re-rendered needlessly.
12
12
 
13
- var getOnItemHeightChange = useCallback(function (i) {
13
+ var getOnItemHeightDidChange = useCallback(function (i) {
14
14
  if (!cache.current[i]) {
15
15
  cache.current[i] = function () {
16
- return virtualScroller.onItemHeightChange(i);
16
+ return virtualScroller.onItemHeightDidChange(i);
17
17
  };
18
18
  }
19
19
 
20
20
  return cache.current[i];
21
21
  }, [virtualScroller, cache]);
22
- return getOnItemHeightChange;
22
+ return getOnItemHeightDidChange;
23
23
  }
24
- //# sourceMappingURL=useOnItemHeightChange.js.map
24
+ //# sourceMappingURL=useOnItemHeightDidChange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOnItemHeightDidChange.js","names":["useMemo","useRef","useCallback","useOnItemHeightDidChange","initialItemsCount","virtualScroller","initialCacheValue","Array","cache","getOnItemHeightDidChange","i","current","onItemHeightDidChange"],"sources":["../../source/react/useOnItemHeightDidChange.js"],"sourcesContent":["import { useMemo, useRef, useCallback } from 'react'\r\n\r\nexport default function useOnItemHeightDidChange({\r\n\tinitialItemsCount,\r\n\tvirtualScroller\r\n}) {\r\n\t// Only compute the initial cache value once.\r\n\tconst initialCacheValue = useMemo(() => {\r\n\t\treturn new Array(initialItemsCount)\r\n\t}, [])\r\n\r\n\t// Handler functions cache.\r\n\tconst cache = useRef(initialCacheValue)\r\n\r\n\t// Caches per-item `onItemHeightDidChange` functions' \"references\"\r\n\t// so that item components don't get re-rendered needlessly.\r\n\tconst getOnItemHeightDidChange = useCallback((i) => {\r\n\t\tif (!cache.current[i]) {\r\n\t\t\tcache.current[i] = () => virtualScroller.onItemHeightDidChange(i)\r\n\t\t}\r\n\t\treturn cache.current[i]\r\n\t}, [\r\n\t\tvirtualScroller,\r\n\t\tcache\r\n\t])\r\n\r\n\treturn getOnItemHeightDidChange\r\n}"],"mappings":"AAAA,SAASA,OAAT,EAAkBC,MAAlB,EAA0BC,WAA1B,QAA6C,OAA7C;AAEA,eAAe,SAASC,wBAAT,OAGZ;EAAA,IAFFC,iBAEE,QAFFA,iBAEE;EAAA,IADFC,eACE,QADFA,eACE;EACF;EACA,IAAMC,iBAAiB,GAAGN,OAAO,CAAC,YAAM;IACvC,OAAO,IAAIO,KAAJ,CAAUH,iBAAV,CAAP;EACA,CAFgC,EAE9B,EAF8B,CAAjC,CAFE,CAMF;;EACA,IAAMI,KAAK,GAAGP,MAAM,CAACK,iBAAD,CAApB,CAPE,CASF;EACA;;EACA,IAAMG,wBAAwB,GAAGP,WAAW,CAAC,UAACQ,CAAD,EAAO;IACnD,IAAI,CAACF,KAAK,CAACG,OAAN,CAAcD,CAAd,CAAL,EAAuB;MACtBF,KAAK,CAACG,OAAN,CAAcD,CAAd,IAAmB;QAAA,OAAML,eAAe,CAACO,qBAAhB,CAAsCF,CAAtC,CAAN;MAAA,CAAnB;IACA;;IACD,OAAOF,KAAK,CAACG,OAAN,CAAcD,CAAd,CAAP;EACA,CAL2C,EAKzC,CACFL,eADE,EAEFG,KAFE,CALyC,CAA5C;EAUA,OAAOC,wBAAP;AACA"}
@@ -1,4 +1,5 @@
1
- import { useRef } from 'react'; // If new `items` property is passed:
1
+ import log from '../utility/debug.js';
2
+ import useOnChange from './useOnChange.js'; // If new `items` property is passed:
2
3
  //
3
4
  // * Store the scroll Y position for the first one of the current items
4
5
  // so that it could potentially (in some cases) be restored after the
@@ -7,11 +8,10 @@ import { useRef } from 'react'; // If new `items` property is passed:
7
8
  // * Call `VirtualScroller.setItems()` function.
8
9
  //
9
10
 
10
- export default function useHandleItemsPropertyChange(itemsProperty, _ref) {
11
+ export default function useSetNewItemsOnItemsPropertyChange(itemsProperty, _ref) {
11
12
  var virtualScroller = _ref.virtualScroller,
12
13
  preserveScrollPosition = _ref.preserveScrollPosition,
13
- preserveScrollPositionOnPrependItems = _ref.preserveScrollPositionOnPrependItems,
14
- nextItems = _ref.nextItems;
14
+ preserveScrollPositionOnPrependItems = _ref.preserveScrollPositionOnPrependItems;
15
15
  // During render, check if the `items` list has changed.
16
16
  // If it has, capture the Y scroll position and updated item element `key`s.
17
17
  // A long "advanced" sidenote on why capturing scroll Y position
@@ -54,14 +54,11 @@ export default function useHandleItemsPropertyChange(itemsProperty, _ref) {
54
54
  // time rather than later in `componentDidUpdate()`: this way,
55
55
  // scroll Y position is captured while the "Show previous" button
56
56
  // is still being shown.
57
- var previousItemsProperty = useRef(itemsProperty);
58
- var hasItemsPropertyChanged = itemsProperty !== previousItemsProperty.current;
59
- previousItemsProperty.current = itemsProperty;
60
-
61
- if (hasItemsPropertyChanged) {
57
+ useOnChange(itemsProperty, function (itemsProperty, prevItemsProperty) {
58
+ log('React: ~ Different `items` property has been passed', itemsProperty);
62
59
  var shouldUpdateItems = true; // Analyze the upcoming `items` change.
63
60
 
64
- var itemsDiff = virtualScroller.getItemsDiff(nextItems, itemsProperty); // `itemsDiff` will be `undefined` in case of a non-incremental items list change.
61
+ var itemsDiff = virtualScroller.getItemsDiff(prevItemsProperty, itemsProperty); // `itemsDiff` will be `undefined` in case of a non-incremental items list change.
65
62
 
66
63
  if (itemsDiff) {
67
64
  var prependedItemsCount = itemsDiff.prependedItemsCount,
@@ -70,12 +67,13 @@ export default function useHandleItemsPropertyChange(itemsProperty, _ref) {
70
67
  if (prependedItemsCount === 0 && appendedItemsCount === 0) {
71
68
  // The items order hasn't changed.
72
69
  // No need to update them in `VirtualScroller` or to snapshot the Y scroll position.
70
+ log('React: ~ The `items` elements are identical to the previous ones');
73
71
  shouldUpdateItems = false;
74
72
  }
75
73
  }
76
74
 
77
75
  if (shouldUpdateItems) {
78
- // Request to update the `items` in `VirtualScroller`.
76
+ // Make a request to update the `items` in `VirtualScroller`.
79
77
  // This will result in a `setState()` call.
80
78
  // The new items won't be rendered until that state update is applied.
81
79
  virtualScroller.setItems(itemsProperty, {
@@ -84,6 +82,6 @@ export default function useHandleItemsPropertyChange(itemsProperty, _ref) {
84
82
  preserveScrollPositionOnPrependItems: preserveScrollPositionOnPrependItems || preserveScrollPosition
85
83
  });
86
84
  }
87
- }
85
+ });
88
86
  }
89
- //# sourceMappingURL=useHandleItemsPropertyChange.js.map
87
+ //# sourceMappingURL=useSetNewItemsOnItemsPropertyChange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSetNewItemsOnItemsPropertyChange.js","names":["log","useOnChange","useSetNewItemsOnItemsPropertyChange","itemsProperty","virtualScroller","preserveScrollPosition","preserveScrollPositionOnPrependItems","prevItemsProperty","shouldUpdateItems","itemsDiff","getItemsDiff","prependedItemsCount","appendedItemsCount","setItems"],"sources":["../../source/react/useSetNewItemsOnItemsPropertyChange.js"],"sourcesContent":["import log from '../utility/debug.js'\r\n\r\nimport useOnChange from './useOnChange.js'\r\n\r\n// If new `items` property is passed:\r\n//\r\n// * Store the scroll Y position for the first one of the current items\r\n// so that it could potentially (in some cases) be restored after the\r\n// new `items` are rendered.\r\n//\r\n// * Call `VirtualScroller.setItems()` function.\r\n//\r\nexport default function useSetNewItemsOnItemsPropertyChange(itemsProperty, {\r\n\tvirtualScroller,\r\n\t// `preserveScrollPosition` property name is deprecated,\r\n\t// use `preserveScrollPositionOnPrependItems` property instead.\r\n\tpreserveScrollPosition,\r\n\tpreserveScrollPositionOnPrependItems\r\n}) {\r\n\t// During render, check if the `items` list has changed.\r\n\t// If it has, capture the Y scroll position and updated item element `key`s.\r\n\r\n\t// A long \"advanced\" sidenote on why capturing scroll Y position\r\n\t// is done during render instead of in an \"effect\":\r\n\t//\r\n\t// Previously, capturing scroll Y position was being done in `useLayoutEffect()`\r\n\t// but it was later found out that it wouldn't work for a \"Show previous\" button\r\n\t// scenario because that button would get hidden by the time `useLayoutEffect()`\r\n\t// gets called when there're no more \"previous\" items to show.\r\n\t//\r\n\t// Consider this code example:\r\n\t//\r\n\t// const { fromIndex, items } = this.state\r\n\t// const items = allItems.slice(fromIndex)\r\n\t// return (\r\n\t// \t{fromIndex > 0 &&\r\n\t// \t\t<button onClick={this.onShowPrevious}>\r\n\t// \t\t\tShow previous\r\n\t// \t\t</button>\r\n\t// \t}\r\n\t// \t<VirtualScroller\r\n\t// \t\titems={items}\r\n\t// \t\titemComponent={ItemComponent}/>\r\n\t// )\r\n\t//\r\n\t// Consider a user clicks \"Show previous\" to show the items from the start.\r\n\t// By the time `componentDidUpdate()` is called on `<VirtualScroller/>`,\r\n\t// the \"Show previous\" button has already been hidden\r\n\t// (because there're no more \"previous\" items)\r\n\t// which results in the scroll Y position jumping forward\r\n\t// by the height of that \"Show previous\" button.\r\n\t// This is because `<VirtualScroller/>` captures scroll Y\r\n\t// position when items are prepended via `.setItems()`\r\n\t// when the \"Show previous\" button is still being shown,\r\n\t// and then restores scroll Y position in `.onRender()`\r\n\t// when the \"Show previous\" button has already been hidden:\r\n\t// that's the reason for the scroll Y \"jump\".\r\n\t//\r\n\t// To prevent that, scroll Y position is captured at `render()`\r\n\t// time rather than later in `componentDidUpdate()`: this way,\r\n\t// scroll Y position is captured while the \"Show previous\" button\r\n\t// is still being shown.\r\n\r\n\tuseOnChange(itemsProperty, (itemsProperty, prevItemsProperty) => {\r\n\t\tlog('React: ~ Different `items` property has been passed', itemsProperty)\r\n\r\n\t\tlet shouldUpdateItems = true\r\n\r\n\t\t// Analyze the upcoming `items` change.\r\n\t\tconst itemsDiff = virtualScroller.getItemsDiff(prevItemsProperty, itemsProperty)\r\n\r\n\t\t// `itemsDiff` will be `undefined` in case of a non-incremental items list change.\r\n\t\tif (itemsDiff) {\r\n\t\t\tconst {\r\n\t\t\t\tprependedItemsCount,\r\n\t\t\t\tappendedItemsCount\r\n\t\t\t} = itemsDiff\r\n\t\t\tif (prependedItemsCount === 0 && appendedItemsCount === 0) {\r\n\t\t\t\t// The items order hasn't changed.\r\n\t\t\t\t// No need to update them in `VirtualScroller` or to snapshot the Y scroll position.\r\n\t\t\t\tlog('React: ~ The `items` elements are identical to the previous ones')\r\n\t\t\t\tshouldUpdateItems = false\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (shouldUpdateItems) {\r\n\t\t\t// Make a request to update the `items` in `VirtualScroller`.\r\n\t\t\t// This will result in a `setState()` call.\r\n\t\t\t// The new items won't be rendered until that state update is applied.\r\n\t\t\tvirtualScroller.setItems(itemsProperty, {\r\n\t\t\t\t// `preserveScrollPosition` property name is deprecated,\r\n\t\t\t\t// use `preserveScrollPositionOnPrependItems` property instead.\r\n\t\t\t\tpreserveScrollPositionOnPrependItems: preserveScrollPositionOnPrependItems || preserveScrollPosition\r\n\t\t\t})\r\n\t\t}\r\n\t})\r\n}"],"mappings":"AAAA,OAAOA,GAAP,MAAgB,qBAAhB;AAEA,OAAOC,WAAP,MAAwB,kBAAxB,C,CAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,mCAAT,CAA6CC,aAA7C,QAMZ;EAAA,IALFC,eAKE,QALFA,eAKE;EAAA,IAFFC,sBAEE,QAFFA,sBAEE;EAAA,IADFC,oCACE,QADFA,oCACE;EACF;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEAL,WAAW,CAACE,aAAD,EAAgB,UAACA,aAAD,EAAgBI,iBAAhB,EAAsC;IAChEP,GAAG,CAAC,qDAAD,EAAwDG,aAAxD,CAAH;IAEA,IAAIK,iBAAiB,GAAG,IAAxB,CAHgE,CAKhE;;IACA,IAAMC,SAAS,GAAGL,eAAe,CAACM,YAAhB,CAA6BH,iBAA7B,EAAgDJ,aAAhD,CAAlB,CANgE,CAQhE;;IACA,IAAIM,SAAJ,EAAe;MACd,IACCE,mBADD,GAGIF,SAHJ,CACCE,mBADD;MAAA,IAECC,kBAFD,GAGIH,SAHJ,CAECG,kBAFD;;MAIA,IAAID,mBAAmB,KAAK,CAAxB,IAA6BC,kBAAkB,KAAK,CAAxD,EAA2D;QAC1D;QACA;QACAZ,GAAG,CAAC,kEAAD,CAAH;QACAQ,iBAAiB,GAAG,KAApB;MACA;IACD;;IAED,IAAIA,iBAAJ,EAAuB;MACtB;MACA;MACA;MACAJ,eAAe,CAACS,QAAhB,CAAyBV,aAAzB,EAAwC;QACvC;QACA;QACAG,oCAAoC,EAAEA,oCAAoC,IAAID;MAHvC,CAAxC;IAKA;EACD,CAhCU,CAAX;AAiCA"}