virtual-scroller 1.15.0 → 1.15.2

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 (92) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +98 -8
  3. package/bundle/index-dom-bypass.html +3 -4
  4. package/bundle/index-dom-grid.html +3 -4
  5. package/bundle/index-dom-scrollableContainer.html +3 -4
  6. package/bundle/index-dom.html +3 -4
  7. package/bundle/index-react-bypass.html +56 -62
  8. package/bundle/index-react-grid.html +55 -61
  9. package/bundle/index-react-hook.html +209 -0
  10. package/bundle/index-react-scrollableContainer.html +56 -62
  11. package/bundle/index-react-strictMode.html +55 -61
  12. package/bundle/index-react-tbody-scrollableContainer.html +13 -15
  13. package/bundle/index-react-tbody.html +10 -12
  14. package/bundle/virtual-scroller-dom.js +1 -1
  15. package/bundle/virtual-scroller-dom.js.map +1 -1
  16. package/bundle/virtual-scroller-react.js +1 -1
  17. package/bundle/virtual-scroller-react.js.map +1 -1
  18. package/bundle/virtual-scroller.js +1 -1
  19. package/bundle/virtual-scroller.js.map +1 -1
  20. package/commonjs/VirtualScroller.constructor.js +3 -1
  21. package/commonjs/VirtualScroller.constructor.js.map +1 -1
  22. package/commonjs/VirtualScroller.items.js +19 -0
  23. package/commonjs/VirtualScroller.items.js.map +1 -1
  24. package/commonjs/react/VirtualScroller.js +69 -127
  25. package/commonjs/react/VirtualScroller.js.map +1 -1
  26. package/commonjs/react/useCreateVirtualScroller.js +64 -0
  27. package/commonjs/react/useCreateVirtualScroller.js.map +1 -0
  28. package/commonjs/react/useInstanceMethods.js +2 -2
  29. package/commonjs/react/useInstanceMethods.js.map +1 -1
  30. package/commonjs/react/useMergeRefs.js +52 -0
  31. package/commonjs/react/useMergeRefs.js.map +1 -0
  32. package/commonjs/react/{useVirtualScrollerStartStop.js → useStartStopVirtualScroller.js} +1 -1
  33. package/commonjs/react/{useVirtualScrollerStartStop.js.map → useStartStopVirtualScroller.js.map} +1 -1
  34. package/commonjs/react/useStyle.js +18 -0
  35. package/commonjs/react/useStyle.js.map +1 -1
  36. package/commonjs/react/useVirtualScroller.js +142 -43
  37. package/commonjs/react/useVirtualScroller.js.map +1 -1
  38. package/commonjs/test/VirtualScroller.js +17 -1
  39. package/commonjs/test/VirtualScroller.js.map +1 -1
  40. package/modules/VirtualScroller.constructor.js +3 -1
  41. package/modules/VirtualScroller.constructor.js.map +1 -1
  42. package/modules/VirtualScroller.items.js +19 -0
  43. package/modules/VirtualScroller.items.js.map +1 -1
  44. package/modules/react/VirtualScroller.js +68 -119
  45. package/modules/react/VirtualScroller.js.map +1 -1
  46. package/modules/react/useCreateVirtualScroller.js +53 -0
  47. package/modules/react/useCreateVirtualScroller.js.map +1 -0
  48. package/modules/react/useInstanceMethods.js +2 -2
  49. package/modules/react/useInstanceMethods.js.map +1 -1
  50. package/modules/react/useMergeRefs.js +44 -0
  51. package/modules/react/useMergeRefs.js.map +1 -0
  52. package/modules/react/{useVirtualScrollerStartStop.js → useStartStopVirtualScroller.js} +1 -1
  53. package/modules/react/{useVirtualScrollerStartStop.js.map → useStartStopVirtualScroller.js.map} +1 -1
  54. package/modules/react/useStyle.js +17 -0
  55. package/modules/react/useStyle.js.map +1 -1
  56. package/modules/react/useVirtualScroller.js +136 -43
  57. package/modules/react/useVirtualScroller.js.map +1 -1
  58. package/modules/test/VirtualScroller.js +17 -1
  59. package/modules/test/VirtualScroller.js.map +1 -1
  60. package/package.json +4 -1
  61. package/react/index.cjs +2 -1
  62. package/react/index.d.ts +51 -7
  63. package/react/index.js +1 -0
  64. package/rollup.config.mjs +15 -1
  65. package/source/VirtualScroller.constructor.js +3 -0
  66. package/source/VirtualScroller.items.js +14 -0
  67. package/source/react/VirtualScroller.js +66 -127
  68. package/source/react/useCreateVirtualScroller.js +65 -0
  69. package/source/react/useInstanceMethods.js +2 -2
  70. package/source/react/useMergeRefs.js +45 -0
  71. package/source/react/useStyle.js +15 -0
  72. package/source/react/useVirtualScroller.js +155 -48
  73. package/source/test/VirtualScroller.js +11 -1
  74. package/website/index-dom-bypass.html +3 -4
  75. package/website/index-dom-grid.html +3 -4
  76. package/website/index-dom-scrollableContainer.html +3 -4
  77. package/website/index-dom.html +3 -4
  78. package/website/index-react-bypass.html +56 -62
  79. package/website/index-react-grid.html +55 -61
  80. package/website/index-react-hook.html +209 -0
  81. package/website/index-react-scrollableContainer.html +56 -62
  82. package/website/index-react-strictMode.html +55 -61
  83. package/website/index-react-tbody-scrollableContainer.html +13 -15
  84. package/website/index-react-tbody.html +10 -12
  85. package/website/index-react.html +55 -61
  86. package/website/index.html +55 -61
  87. package/commonjs/react/useForwardedRef.js +0 -50
  88. package/commonjs/react/useForwardedRef.js.map +0 -1
  89. package/modules/react/useForwardedRef.js +0 -42
  90. package/modules/react/useForwardedRef.js.map +0 -1
  91. package/source/react/useForwardedRef.js +0 -39
  92. /package/source/react/{useVirtualScrollerStartStop.js → useStartStopVirtualScroller.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"useStyle.js","names":["px","useStyle","style","tbody","state","beforeItemsHeight","afterItemsHeight","paddingTop","paddingBottom"],"sources":["../../source/react/useStyle.js"],"sourcesContent":["import px from '../utility/px.js'\r\n\r\nexport default function useStyle(style, {\r\n\ttbody,\r\n\tstate\r\n}) {\r\n\tif (tbody) {\r\n\t\treturn style\r\n\t}\r\n\r\n\tconst {\r\n\t\tbeforeItemsHeight,\r\n\t\tafterItemsHeight\r\n\t} = state\r\n\r\n\treturn {\r\n\t\t...style,\r\n\t\tpaddingTop: px(beforeItemsHeight),\r\n\t\tpaddingBottom: px(afterItemsHeight)\r\n\t}\r\n}"],"mappings":";;;;;;AAAA,OAAOA,EAAP,MAAe,kBAAf;AAEA,eAAe,SAASC,QAAT,CAAkBC,KAAlB,QAGZ;EAAA,IAFFC,KAEE,QAFFA,KAEE;EAAA,IADFC,KACE,QADFA,KACE;;EACF,IAAID,KAAJ,EAAW;IACV,OAAOD,KAAP;EACA;;EAED,IACCG,iBADD,GAGID,KAHJ,CACCC,iBADD;EAAA,IAECC,gBAFD,GAGIF,KAHJ,CAECE,gBAFD;EAKA,uCACIJ,KADJ;IAECK,UAAU,EAAEP,EAAE,CAACK,iBAAD,CAFf;IAGCG,aAAa,EAAER,EAAE,CAACM,gBAAD;EAHlB;AAKA"}
1
+ {"version":3,"file":"useStyle.js","names":["px","reportError","useStyle","style","tbody","state","padding","paddingTop","paddingBottom","beforeItemsHeight","afterItemsHeight"],"sources":["../../source/react/useStyle.js"],"sourcesContent":["import px from '../utility/px.js'\r\nimport { reportError } from '../utility/debug.js'\r\n\r\nexport default function useStyle(style, {\r\n\ttbody,\r\n\tstate\r\n}) {\r\n\tif (tbody) {\r\n\t\treturn style\r\n\t}\r\n\r\n\t// Validate that the passed `style` property doesn't include\r\n\t// `padding-top` or `padding-bottom` or `padding`.\r\n\tif (style) {\r\n\t\tif (typeof style.padding === 'number') {\r\n\t\t\treportError('`style` property can\\'t include any `padding`')\r\n\t\t}\r\n\t\tif (typeof style.paddingTop === 'number') {\r\n\t\t\treportError('`style` property can\\'t include any `paddingTop`')\r\n\t\t}\r\n\t\tif (typeof style.paddingBottom === 'number') {\r\n\t\t\treportError('`style` property can\\'t include any `paddingBottom`')\r\n\t\t}\r\n\t}\r\n\r\n\tconst {\r\n\t\tbeforeItemsHeight,\r\n\t\tafterItemsHeight\r\n\t} = state\r\n\r\n\treturn {\r\n\t\t...style,\r\n\t\tpaddingTop: px(beforeItemsHeight),\r\n\t\tpaddingBottom: px(afterItemsHeight)\r\n\t}\r\n}"],"mappings":";;;;;;AAAA,OAAOA,EAAP,MAAe,kBAAf;AACA,SAASC,WAAT,QAA4B,qBAA5B;AAEA,eAAe,SAASC,QAAT,CAAkBC,KAAlB,QAGZ;EAAA,IAFFC,KAEE,QAFFA,KAEE;EAAA,IADFC,KACE,QADFA,KACE;;EACF,IAAID,KAAJ,EAAW;IACV,OAAOD,KAAP;EACA,CAHC,CAKF;EACA;;;EACA,IAAIA,KAAJ,EAAW;IACV,IAAI,OAAOA,KAAK,CAACG,OAAb,KAAyB,QAA7B,EAAuC;MACtCL,WAAW,CAAC,+CAAD,CAAX;IACA;;IACD,IAAI,OAAOE,KAAK,CAACI,UAAb,KAA4B,QAAhC,EAA0C;MACzCN,WAAW,CAAC,kDAAD,CAAX;IACA;;IACD,IAAI,OAAOE,KAAK,CAACK,aAAb,KAA+B,QAAnC,EAA6C;MAC5CP,WAAW,CAAC,qDAAD,CAAX;IACA;EACD;;EAED,IACCQ,iBADD,GAGIJ,KAHJ,CACCI,iBADD;EAAA,IAECC,gBAFD,GAGIL,KAHJ,CAECK,gBAFD;EAKA,uCACIP,KADJ;IAECI,UAAU,EAAEP,EAAE,CAACS,iBAAD,CAFf;IAGCD,aAAa,EAAER,EAAE,CAACU,gBAAD;EAHlB;AAKA"}
@@ -1,55 +1,148 @@
1
- import { useMemo } from 'react';
2
- import VirtualScroller from '../VirtualScroller.js'; // Creates a `VirtualScroller` instance.
1
+ import { useLayoutEffect, useMemo, useRef } from 'react';
2
+ import useState from './useState.js';
3
+ import useCreateVirtualScroller from './useCreateVirtualScroller.js';
4
+ import useStartStopVirtualScroller from './useStartStopVirtualScroller.js';
5
+ import useSetNewItemsOnItemsPropertyChange from './useSetNewItemsOnItemsPropertyChange.js';
6
+ import useValidateTableBodyItemsContainer from './useValidateTableBodyItemsContainer.js';
7
+ import useClassName from './useClassName.js';
8
+ import useStyle from './useStyle.js'; // When `items` property changes:
9
+ // * A new `items` property is supplied to the React component.
10
+ // * The React component re-renders itself.
11
+ // * `useSetNewItemsOnItemsPropertyChange()` hook is run.
12
+ // * `useSetNewItemsOnItemsPropertyChange()` hook detects that the `items` property
13
+ // has changed and calls `VirtualScroller.setItems(items)`.
14
+ // * `VirtualScroller.setItems(items)` calls `VirtualScroller.setState()`.
15
+ // * `VirtualScroller.setState()` calls the `setState()` function.
16
+ // * The `setState()` function calls a setter from a `useState()` hook.
17
+ // * The React component re-renders itself the second time.
3
18
 
4
- export default function useVirtualScroller(_ref, _ref2) {
5
- var items = _ref.items,
6
- estimatedItemHeight = _ref.estimatedItemHeight,
7
- getEstimatedItemHeight = _ref.getEstimatedItemHeight,
8
- getEstimatedVisibleItemRowsCount = _ref.getEstimatedVisibleItemRowsCount,
9
- getEstimatedInterItemVerticalSpacing = _ref.getEstimatedInterItemVerticalSpacing,
19
+ export default function useVirtualScroller(_ref) {
20
+ var itemsProperty = _ref.items,
21
+ tbody = _ref.tbody,
22
+ readyToStart = _ref.readyToStart,
23
+ styleProperty = _ref.style,
24
+ classNameProperty = _ref.className,
10
25
  bypass = _ref.bypass,
11
- onItemInitialRender = _ref.onItemInitialRender,
12
- onItemFirstRender = _ref.onItemFirstRender,
13
- initialScrollPosition = _ref.initialScrollPosition,
14
- onScrollPositionChange = _ref.onScrollPositionChange,
26
+ preserveScrollPosition = _ref.preserveScrollPosition,
27
+ preserveScrollPositionOnPrependItems = _ref.preserveScrollPositionOnPrependItems,
15
28
  measureItemsBatchSize = _ref.measureItemsBatchSize,
16
29
  scrollableContainer = _ref.scrollableContainer,
17
30
  getScrollableContainer = _ref.getScrollableContainer,
18
31
  getColumnsCount = _ref.getColumnsCount,
19
32
  getItemId = _ref.getItemId,
33
+ onItemFirstRender = _ref.onItemFirstRender,
34
+ onItemInitialRender = _ref.onItemInitialRender,
35
+ initialScrollPosition = _ref.initialScrollPosition,
36
+ onScrollPositionChange = _ref.onScrollPositionChange,
20
37
  initialState = _ref.initialState,
21
38
  getInitialItemState = _ref.getInitialItemState,
22
- onStateChange = _ref.onStateChange;
23
- var itemsContainer = _ref2.itemsContainer;
24
- return useMemo(function () {
25
- // Create `virtual-scroller` instance.
26
- return new VirtualScroller(function () {
27
- return itemsContainer.current;
28
- }, items, {
29
- _useTimeoutInRenderLoop: true,
30
- // `estimatedItemHeight` is deprecated, use `getEstimatedItemHeight()` instead.
31
- estimatedItemHeight: estimatedItemHeight,
32
- getEstimatedItemHeight: getEstimatedItemHeight,
33
- getEstimatedVisibleItemRowsCount: getEstimatedVisibleItemRowsCount,
34
- getEstimatedInterItemVerticalSpacing: getEstimatedInterItemVerticalSpacing,
35
- bypass: bypass,
36
- // bypassBatchSize,
37
- onItemInitialRender: onItemInitialRender,
38
- // `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.
39
- onItemFirstRender: onItemFirstRender,
40
- initialScrollPosition: initialScrollPosition,
41
- onScrollPositionChange: onScrollPositionChange,
42
- measureItemsBatchSize: measureItemsBatchSize,
43
- // `scrollableContainer` property is deprecated.
44
- // Use `getScrollableContainer()` property instead.
45
- scrollableContainer: scrollableContainer,
46
- getScrollableContainer: getScrollableContainer,
47
- getColumnsCount: getColumnsCount,
48
- getItemId: getItemId,
49
- state: initialState,
50
- getInitialItemState: getInitialItemState,
51
- onStateChange: onStateChange
39
+ onStateChange = _ref.onStateChange,
40
+ getEstimatedItemHeight = _ref.getEstimatedItemHeight,
41
+ getEstimatedVisibleItemRowsCount = _ref.getEstimatedVisibleItemRowsCount,
42
+ getEstimatedInterItemVerticalSpacing = _ref.getEstimatedInterItemVerticalSpacing;
43
+ // A `ref` to the items container element.
44
+ var itemsContainerRef = useRef(); // Use `hasMounted` flag to decide if `itemsContainerRef` value should be validated.
45
+
46
+ var hasMounted = useRef(false);
47
+ useLayoutEffect(function () {
48
+ hasMounted.current = true;
49
+ }, []); // Create a `VirtualScroller` instance.
50
+
51
+ var virtualScroller = useCreateVirtualScroller({
52
+ items: itemsProperty,
53
+ getEstimatedItemHeight: getEstimatedItemHeight,
54
+ getEstimatedVisibleItemRowsCount: getEstimatedVisibleItemRowsCount,
55
+ getEstimatedInterItemVerticalSpacing: getEstimatedInterItemVerticalSpacing,
56
+ bypass: bypass,
57
+ // bypassBatchSize,
58
+ onItemInitialRender: onItemInitialRender,
59
+ // `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.
60
+ onItemFirstRender: onItemFirstRender,
61
+ initialScrollPosition: initialScrollPosition,
62
+ onScrollPositionChange: onScrollPositionChange,
63
+ measureItemsBatchSize: measureItemsBatchSize,
64
+ // `scrollableContainer` property is deprecated.
65
+ // Use `getScrollableContainer()` property instead.
66
+ scrollableContainer: scrollableContainer,
67
+ getScrollableContainer: getScrollableContainer,
68
+ getColumnsCount: getColumnsCount,
69
+ getItemId: getItemId,
70
+ initialState: initialState,
71
+ getInitialItemState: getInitialItemState,
72
+ onStateChange: onStateChange
73
+ }, {
74
+ getItemsContainerElement: function getItemsContainerElement() {
75
+ // Validate that the developer has correctly passed the returned `itemsContainerRef` property
76
+ // as the items container component's `ref`.
77
+ //
78
+ // `getItemsContainerElement()` function is called both before it has mounted
79
+ // and after it has mounted. Only validate the ref's value after it has mounted.
80
+ //
81
+ if (hasMounted.current) {
82
+ if (!itemsContainerRef.current) {
83
+ throw new Error('[virtual-scroller] Did you forget to pass the returned `itemsContainerRef` property as the items container component\'s `ref`?');
84
+ }
85
+ } // Return the items container element.
86
+
87
+
88
+ return itemsContainerRef.current;
89
+ }
90
+ }); // Only compute the initial state once.
91
+
92
+ var _initialState = useMemo(function () {
93
+ return virtualScroller.getInitialState();
94
+ }, []); // Use React's `useState()` hook for managing `VirtualScroller`'s state lifecycle.
95
+ // This way, React will re-render the component on every state update.
96
+
97
+
98
+ var _useState = useState({
99
+ initialState: _initialState,
100
+ onRender: virtualScroller.onRender
101
+ }),
102
+ getState = _useState.getState,
103
+ setState = _useState.setState,
104
+ stateToRender = _useState.stateToRender; // Use custom (external) state storage in the `VirtualScroller`.
105
+
106
+
107
+ useMemo(function () {
108
+ virtualScroller.useState({
109
+ getState: getState,
110
+ setState: setState
52
111
  });
53
- }, []);
112
+ }, []); // Start `VirtualScroller` on mount.
113
+ // Stop `VirtualScroller` on unmount.
114
+
115
+ useStartStopVirtualScroller(virtualScroller, {
116
+ readyToStart: readyToStart
117
+ }); // Calls `.setItems()` if `items` property has changed.
118
+
119
+ useSetNewItemsOnItemsPropertyChange(itemsProperty, {
120
+ virtualScroller: virtualScroller,
121
+ // `preserveScrollPosition` property name is deprecated,
122
+ // use `preserveScrollPositionOnPrependItems` property instead.
123
+ preserveScrollPosition: preserveScrollPosition,
124
+ preserveScrollPositionOnPrependItems: preserveScrollPositionOnPrependItems
125
+ }); // A developer might "forget" to pass `itemsContainerComponent="tbody"` property
126
+ // when using a `<tbody/>` as a container for list items.
127
+ // This hook validates that the developer didn't "forget" to do that in such case.
128
+
129
+ useValidateTableBodyItemsContainer({
130
+ virtualScroller: virtualScroller,
131
+ tbody: tbody
132
+ });
133
+ var className = useClassName(classNameProperty, {
134
+ tbody: tbody
135
+ });
136
+ var style = useStyle(styleProperty, {
137
+ tbody: tbody,
138
+ state: stateToRender
139
+ });
140
+ return {
141
+ state: stateToRender,
142
+ style: style,
143
+ className: className,
144
+ itemsContainerRef: itemsContainerRef,
145
+ virtualScroller: virtualScroller
146
+ };
54
147
  }
55
148
  //# sourceMappingURL=useVirtualScroller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useVirtualScroller.js","names":["useMemo","VirtualScroller","useVirtualScroller","items","estimatedItemHeight","getEstimatedItemHeight","getEstimatedVisibleItemRowsCount","getEstimatedInterItemVerticalSpacing","bypass","onItemInitialRender","onItemFirstRender","initialScrollPosition","onScrollPositionChange","measureItemsBatchSize","scrollableContainer","getScrollableContainer","getColumnsCount","getItemId","initialState","getInitialItemState","onStateChange","itemsContainer","current","_useTimeoutInRenderLoop","state"],"sources":["../../source/react/useVirtualScroller.js"],"sourcesContent":["import { useMemo } from 'react'\r\n\r\nimport VirtualScroller from '../VirtualScroller.js'\r\n\r\n// Creates a `VirtualScroller` instance.\r\nexport default function useVirtualScroller({\r\n\titems,\r\n\t// `estimatedItemHeight` is deprecated, use `getEstimatedItemHeight()` instead.\r\n\testimatedItemHeight,\r\n\tgetEstimatedItemHeight,\r\n\tgetEstimatedVisibleItemRowsCount,\r\n\tgetEstimatedInterItemVerticalSpacing,\r\n\tbypass,\r\n\t// bypassBatchSize,\r\n\tonItemInitialRender,\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\tonItemFirstRender,\r\n\tinitialScrollPosition,\r\n\tonScrollPositionChange,\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\tinitialState,\r\n\tgetInitialItemState,\r\n\tonStateChange\r\n}, {\r\n\titemsContainer\r\n}) {\r\n\treturn useMemo(() => {\r\n\t\t// Create `virtual-scroller` instance.\r\n\t\treturn new VirtualScroller(\r\n\t\t\t() => itemsContainer.current,\r\n\t\t\titems,\r\n\t\t\t{\r\n\t\t\t\t_useTimeoutInRenderLoop: true,\r\n\t\t\t\t// `estimatedItemHeight` is deprecated, use `getEstimatedItemHeight()` instead.\r\n\t\t\t\testimatedItemHeight,\r\n\t\t\t\tgetEstimatedItemHeight,\r\n\t\t\t\tgetEstimatedVisibleItemRowsCount,\r\n\t\t\t\tgetEstimatedInterItemVerticalSpacing,\r\n\t\t\t\tbypass,\r\n\t\t\t\t// bypassBatchSize,\r\n\t\t\t\tonItemInitialRender,\r\n\t\t\t\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\t\t\t\tonItemFirstRender,\r\n\t\t\t\tinitialScrollPosition,\r\n\t\t\t\tonScrollPositionChange,\r\n\t\t\t\tmeasureItemsBatchSize,\r\n\t\t\t\t// `scrollableContainer` property is deprecated.\r\n\t\t\t\t// Use `getScrollableContainer()` property instead.\r\n\t\t\t\tscrollableContainer,\r\n\t\t\t\tgetScrollableContainer,\r\n\t\t\t\tgetColumnsCount,\r\n\t\t\t\tgetItemId,\r\n\t\t\t\tstate: initialState,\r\n\t\t\t\tgetInitialItemState,\r\n\t\t\t\tonStateChange\r\n\t\t\t}\r\n\t\t)\r\n\t}, [])\r\n}"],"mappings":"AAAA,SAASA,OAAT,QAAwB,OAAxB;AAEA,OAAOC,eAAP,MAA4B,uBAA5B,C,CAEA;;AACA,eAAe,SAASC,kBAAT,cA0BZ;EAAA,IAzBFC,KAyBE,QAzBFA,KAyBE;EAAA,IAvBFC,mBAuBE,QAvBFA,mBAuBE;EAAA,IAtBFC,sBAsBE,QAtBFA,sBAsBE;EAAA,IArBFC,gCAqBE,QArBFA,gCAqBE;EAAA,IApBFC,oCAoBE,QApBFA,oCAoBE;EAAA,IAnBFC,MAmBE,QAnBFA,MAmBE;EAAA,IAjBFC,mBAiBE,QAjBFA,mBAiBE;EAAA,IAfFC,iBAeE,QAfFA,iBAeE;EAAA,IAdFC,qBAcE,QAdFA,qBAcE;EAAA,IAbFC,sBAaE,QAbFA,sBAaE;EAAA,IAZFC,qBAYE,QAZFA,qBAYE;EAAA,IATFC,mBASE,QATFA,mBASE;EAAA,IARFC,sBAQE,QARFA,sBAQE;EAAA,IAPFC,eAOE,QAPFA,eAOE;EAAA,IANFC,SAME,QANFA,SAME;EAAA,IALFC,YAKE,QALFA,YAKE;EAAA,IAJFC,mBAIE,QAJFA,mBAIE;EAAA,IAHFC,aAGE,QAHFA,aAGE;EAAA,IADFC,cACE,SADFA,cACE;EACF,OAAOrB,OAAO,CAAC,YAAM;IACpB;IACA,OAAO,IAAIC,eAAJ,CACN;MAAA,OAAMoB,cAAc,CAACC,OAArB;IAAA,CADM,EAENnB,KAFM,EAGN;MACCoB,uBAAuB,EAAE,IAD1B;MAEC;MACAnB,mBAAmB,EAAnBA,mBAHD;MAICC,sBAAsB,EAAtBA,sBAJD;MAKCC,gCAAgC,EAAhCA,gCALD;MAMCC,oCAAoC,EAApCA,oCAND;MAOCC,MAAM,EAANA,MAPD;MAQC;MACAC,mBAAmB,EAAnBA,mBATD;MAUC;MACAC,iBAAiB,EAAjBA,iBAXD;MAYCC,qBAAqB,EAArBA,qBAZD;MAaCC,sBAAsB,EAAtBA,sBAbD;MAcCC,qBAAqB,EAArBA,qBAdD;MAeC;MACA;MACAC,mBAAmB,EAAnBA,mBAjBD;MAkBCC,sBAAsB,EAAtBA,sBAlBD;MAmBCC,eAAe,EAAfA,eAnBD;MAoBCC,SAAS,EAATA,SApBD;MAqBCO,KAAK,EAAEN,YArBR;MAsBCC,mBAAmB,EAAnBA,mBAtBD;MAuBCC,aAAa,EAAbA;IAvBD,CAHM,CAAP;EA6BA,CA/Ba,EA+BX,EA/BW,CAAd;AAgCA"}
1
+ {"version":3,"file":"useVirtualScroller.js","names":["useLayoutEffect","useMemo","useRef","useState","useCreateVirtualScroller","useStartStopVirtualScroller","useSetNewItemsOnItemsPropertyChange","useValidateTableBodyItemsContainer","useClassName","useStyle","useVirtualScroller","itemsProperty","items","tbody","readyToStart","styleProperty","style","classNameProperty","className","bypass","preserveScrollPosition","preserveScrollPositionOnPrependItems","measureItemsBatchSize","scrollableContainer","getScrollableContainer","getColumnsCount","getItemId","onItemFirstRender","onItemInitialRender","initialScrollPosition","onScrollPositionChange","initialState","getInitialItemState","onStateChange","getEstimatedItemHeight","getEstimatedVisibleItemRowsCount","getEstimatedInterItemVerticalSpacing","itemsContainerRef","hasMounted","current","virtualScroller","getItemsContainerElement","Error","_initialState","getInitialState","onRender","getState","setState","stateToRender","state"],"sources":["../../source/react/useVirtualScroller.js"],"sourcesContent":["import { useLayoutEffect, useMemo, useRef } from 'react'\r\n\r\nimport useState from './useState.js'\r\nimport useCreateVirtualScroller from './useCreateVirtualScroller.js'\r\nimport useStartStopVirtualScroller from './useStartStopVirtualScroller.js'\r\nimport useSetNewItemsOnItemsPropertyChange from './useSetNewItemsOnItemsPropertyChange.js'\r\nimport useValidateTableBodyItemsContainer from './useValidateTableBodyItemsContainer.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\nexport default function useVirtualScroller({\r\n\t// The following are `<VirtualScroller/>` properties.\r\n\t//\r\n\titems: itemsProperty,\r\n\t// Because the use of a `<tbody/>` tag as an items container component can't always be auto-detected,\r\n\t// a developer could manually pass a `tbody: boolean` property.\r\n\t// Futhermore, when using `useVirtualScroller()` hook instead of `<VirtualScroller/>` component,\r\n\t// `itemsContainerComponent` property is not accessible for tag name detection.\r\n\ttbody,\r\n\treadyToStart,\r\n\tstyle: styleProperty,\r\n\tclassName: classNameProperty,\r\n\r\n\t// The following are the \"core\" component options.\r\n\t//\r\n\tbypass,\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\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\tonItemFirstRender,\r\n\tonItemInitialRender,\r\n\tinitialScrollPosition,\r\n\tonScrollPositionChange,\r\n\tinitialState,\r\n\tgetInitialItemState,\r\n\tonStateChange,\r\n\tgetEstimatedItemHeight,\r\n\tgetEstimatedVisibleItemRowsCount,\r\n\tgetEstimatedInterItemVerticalSpacing\r\n}) {\r\n\t// A `ref` to the items container element.\r\n\tconst itemsContainerRef = useRef()\r\n\r\n\t// Use `hasMounted` flag to decide if `itemsContainerRef` value should be validated.\r\n\tconst hasMounted = useRef(false)\r\n\tuseLayoutEffect(() => {\r\n\t\thasMounted.current = true\r\n\t}, [])\r\n\r\n\t// Create a `VirtualScroller` instance.\r\n\tconst virtualScroller = useCreateVirtualScroller({\r\n\t\titems: itemsProperty,\r\n\t\tgetEstimatedItemHeight,\r\n\t\tgetEstimatedVisibleItemRowsCount,\r\n\t\tgetEstimatedInterItemVerticalSpacing,\r\n\t\tbypass,\r\n\t\t// bypassBatchSize,\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\tinitialState,\r\n\t\tgetInitialItemState,\r\n\t\tonStateChange\r\n\t}, {\r\n\t\tgetItemsContainerElement: () => {\r\n\t\t\t// Validate that the developer has correctly passed the returned `itemsContainerRef` property\r\n\t\t\t// as the items container component's `ref`.\r\n\t\t\t//\r\n\t\t\t// `getItemsContainerElement()` function is called both before it has mounted\r\n\t\t\t// and after it has mounted. Only validate the ref's value after it has mounted.\r\n\t\t\t//\r\n\t\t\tif (hasMounted.current) {\r\n\t\t\t\tif (!itemsContainerRef.current) {\r\n\t\t\t\t\tthrow new Error('[virtual-scroller] Did you forget to pass the returned `itemsContainerRef` property as the items container component\\'s `ref`?')\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// Return the items container element.\r\n\t\t\treturn itemsContainerRef.current\r\n\t\t}\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})\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\tuseStartStopVirtualScroller(virtualScroller, { readyToStart })\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// A developer might \"forget\" to pass `itemsContainerComponent=\"tbody\"` property\r\n\t// when using a `<tbody/>` as a container for list items.\r\n\t// This hook validates that the developer didn't \"forget\" to do that in such case.\r\n\tuseValidateTableBodyItemsContainer({\r\n\t\tvirtualScroller,\r\n\t\ttbody\r\n\t})\r\n\r\n\tconst className = useClassName(classNameProperty, {\r\n\t\ttbody\r\n\t})\r\n\r\n\tconst style = useStyle(styleProperty, {\r\n\t\ttbody,\r\n\t\tstate: stateToRender\r\n\t})\r\n\r\n\treturn {\r\n\t\tstate: stateToRender,\r\n\t\tstyle,\r\n\t\tclassName,\r\n\t\titemsContainerRef,\r\n\t\tvirtualScroller\r\n\t}\r\n}"],"mappings":"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"}
@@ -1,9 +1,15 @@
1
+ var _excluded = ["screenWidth", "screenHeight", "columnsCount", "verticalSpacing", "items", "getItemId", "state"];
2
+
1
3
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
4
 
3
5
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
6
 
5
7
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
8
 
9
+ 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; }
10
+
11
+ 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; }
12
+
7
13
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
8
14
 
9
15
  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); } }
@@ -23,10 +29,19 @@ var TestVirtualScroller = /*#__PURE__*/function () {
23
29
  columnsCount = _ref.columnsCount,
24
30
  verticalSpacing = _ref.verticalSpacing,
25
31
  items = _ref.items,
26
- initialState = _ref.state;
32
+ getItemId = _ref.getItemId,
33
+ initialState = _ref.state,
34
+ rest = _objectWithoutProperties(_ref, _excluded);
27
35
 
28
36
  _classCallCheck(this, TestVirtualScroller);
29
37
 
38
+ // Validate that no unknown properties are passed.
39
+ // This prevents the cases when a developer confuses
40
+ // `TestVirtualScroller` options for `VirtualScroller` options.
41
+ if (Object.keys(rest).length > 0) {
42
+ throw new Error("Unknown options: ".concat(Object.keys(rest).join(', ')));
43
+ }
44
+
30
45
  this.expectedStateUpdates = [];
31
46
  var scrollableContainerElement = {
32
47
  width: scrollableContainerWidth,
@@ -107,6 +122,7 @@ var TestVirtualScroller = /*#__PURE__*/function () {
107
122
  scrollableContainer: scrollableContainerElement,
108
123
  engine: Engine,
109
124
  _waitForScrollingToStop: false,
125
+ getItemId: getItemId,
110
126
  getColumnsCount: getColumnsCount,
111
127
  state: initialState,
112
128
  onStateChange: function onStateChange(state) {
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualScroller.js","names":["VirtualScroller","Engine","DEBUG","TestVirtualScroller","scrollableContainerWidth","screenWidth","scrollableContainerHeight","screenHeight","columnsCount","verticalSpacing","items","initialState","state","expectedStateUpdates","scrollableContainerElement","width","height","containerElement","paddingTop","paddingBottom","children","setScrollableContainerWidth","setScrollableContainerHeight","getItemsContainerElement","__columnsCount","getColumnsCount","getItemWidth","hasPausedStateUpdates","undefined","pausedStateUpdate","pausedStateUpdateAction","onBeforeUpdateState","stateUpdate","length","expectedStateUpdate","shift","expect","to","deep","equal","callback","render","virtualScroller","getState","beforeItemsHeight","afterItemsHeight","firstShownItemIndex","lastShownItemIndex","slice","map","item","getWidth","getHeight","getArea","area","getMarginTop","scrollableContainer","engine","_waitForScrollingToStop","onStateChange","console","log","getInitialState","useState","updateState","stateUpdateAction","onRender","Error","expectedState","should","include","push","firstNonMeasuredItemIndex","getScrollY","scrollPosition","scrollToY","updateScreenDimensions","_triggerResizeListener","JSON","stringify","stop","start","updateLayout","itemOrIndex","getItemScrollPosition","onItemHeightDidChange","newState","setItemState","getAverageItemHeight","newItems","options","setItems"],"sources":["../../source/test/VirtualScroller.js"],"sourcesContent":["import VirtualScroller from '../VirtualScroller.js'\r\nimport Engine from './Engine.js'\r\n\r\nconst DEBUG = false\r\n\r\nexport default class TestVirtualScroller {\r\n\tconstructor({\r\n\t\tscreenWidth: scrollableContainerWidth,\r\n\t\tscreenHeight: scrollableContainerHeight,\r\n\t\tcolumnsCount,\r\n\t\tverticalSpacing,\r\n\t\titems,\r\n\t\tstate: initialState\r\n\t}) {\r\n\t\tthis.expectedStateUpdates = []\r\n\r\n\t\tconst scrollableContainerElement = {\r\n\t\t\twidth: scrollableContainerWidth,\r\n\t\t\theight: scrollableContainerHeight\r\n\t\t}\r\n\r\n\t\tconst containerElement = {\r\n\t\t\tpaddingTop: 0,\r\n\t\t\tpaddingBottom: 0,\r\n\t\t\twidth: scrollableContainerElement.width,\r\n\t\t\tchildren: []\r\n\t\t}\r\n\r\n\t\tthis.setScrollableContainerWidth = (width) => {\r\n\t\t\tscrollableContainerElement.width = width\r\n\t\t\tcontainerElement.width = width\r\n\t\t}\r\n\r\n\t\tthis.setScrollableContainerHeight = (height) => {\r\n\t\t\tscrollableContainerElement.height = height\r\n\t\t}\r\n\r\n\t\tconst getItemsContainerElement = () => containerElement\r\n\r\n\t\tthis.__columnsCount = columnsCount\r\n\r\n\t\tconst getColumnsCount = () => this.__columnsCount\r\n\t\tconst getItemWidth = () => scrollableContainerElement.width / getColumnsCount()\r\n\r\n\t\tthis.hasPausedStateUpdates = undefined\r\n\t\tthis.pausedStateUpdate = undefined\r\n\t\tthis.pausedStateUpdateAction = undefined\r\n\r\n\t\tconst onBeforeUpdateState = (stateUpdate) => {\r\n\t\t\tif (this.expectedStateUpdates.length > 0) {\r\n\t\t\t\tconst expectedStateUpdate = this.expectedStateUpdates.shift()\r\n\t\t\t\texpect(stateUpdate).to.deep.equal(expectedStateUpdate.stateUpdate)\r\n\t\t\t\tif (expectedStateUpdate.callback) {\r\n\t\t\t\t\texpectedStateUpdate.callback()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst render = () => {\r\n\t\t\tconst {\r\n\t\t\t\titems,\r\n\t\t\t\tbeforeItemsHeight,\r\n\t\t\t\tafterItemsHeight,\r\n\t\t\t\tfirstShownItemIndex,\r\n\t\t\t\tlastShownItemIndex\r\n\t\t\t} = this.virtualScroller.getState()\r\n\r\n\t\t\tcontainerElement.paddingTop = beforeItemsHeight\r\n\t\t\tcontainerElement.paddingBottom = afterItemsHeight\r\n\r\n\t\t\tcontainerElement.children = items\r\n\t\t\t\t.slice(firstShownItemIndex, lastShownItemIndex + 1)\r\n\t\t\t\t.map((item) => ({\r\n\t\t\t\t\tgetWidth: () => getItemWidth(),\r\n\t\t\t\t\tgetHeight: () => (item.getArea ? item.getArea() : item.area) / getItemWidth(),\r\n\t\t\t\t\tgetMarginTop: () => verticalSpacing\r\n\t\t\t\t}))\r\n\t\t}\r\n\r\n\t\tthis.virtualScroller = new VirtualScroller(getItemsContainerElement, items, {\r\n\t\t\tscrollableContainer: scrollableContainerElement,\r\n\t\t\tengine: Engine,\r\n\t\t\t_waitForScrollingToStop: false,\r\n\t\t\tgetColumnsCount,\r\n\t\t\tstate: initialState,\r\n\t\t\tonStateChange(state) {\r\n\t\t\t\tif (DEBUG) {\r\n\t\t\t\t\tconsole.log('~ Updated State ~')\r\n\t\t\t\t\tconsole.log(state)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\tlet state = this.virtualScroller.getInitialState()\r\n\r\n\t\tthis.virtualScroller.useState({\r\n\t\t\tgetState: () => state,\r\n\t\t\tupdateState: (stateUpdate) => {\r\n\t\t\t\tconst stateUpdateAction = (stateUpdate) => {\r\n\t\t\t\t\t// Is only used in tests.\r\n\t\t\t\t\tif (onBeforeUpdateState) {\r\n\t\t\t\t\t\tonBeforeUpdateState(stateUpdate)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tstate = {\r\n\t\t\t\t\t\t...state,\r\n\t\t\t\t\t\t...stateUpdate\r\n\t\t\t\t\t}\r\n\t\t\t\t\trender()\r\n\t\t\t\t\tthis.virtualScroller.onRender()\r\n\t\t\t\t}\r\n\t\t\t\tif (this.hasPausedStateUpdates) {\r\n\t\t\t\t\tthis.pausedStateUpdate = {\r\n\t\t\t\t\t\t...this.pausedStateUpdate,\r\n\t\t\t\t\t\t...stateUpdate\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.pausedStateUpdateAction = stateUpdateAction\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstateUpdateAction(stateUpdate)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\trender()\r\n\t}\r\n\r\n\tpauseStateUpdates() {\r\n\t\tif (this.hasPausedStateUpdates) {\r\n\t\t\tthrow new Error('[virtual-scroller] State updates have already been paused')\r\n\t\t}\r\n\t\tthis.hasPausedStateUpdates = true\r\n\t}\r\n\r\n\tresumeStateUpdates() {\r\n\t\tif (this.pausedStateUpdate) {\r\n\t\t\tthis.pausedStateUpdateAction(this.pausedStateUpdate)\r\n\t\t\tthis.pausedStateUpdate = undefined\r\n\t\t\tthis.pausedStateUpdateAction = undefined\r\n\t\t}\r\n\t\tthis.hasPausedStateUpdates = false\r\n\t}\r\n\r\n\tverifyState(expectedState) {\r\n\t\t// `mocha`/`chai`.\r\n\t\tthis.virtualScroller.getState().should.deep.include(expectedState)\r\n\t}\r\n\r\n\texpectStateUpdate(stateUpdate, callback) {\r\n\t\tthis.expectedStateUpdates.push({\r\n\t\t\tstateUpdate,\r\n\t\t\tcallback\r\n\t\t})\r\n\t}\r\n\r\n\tgetFirstNonMeasuredItemIndex() {\r\n\t\treturn this.virtualScroller.firstNonMeasuredItemIndex\r\n\t}\r\n\r\n\tgetScrollY() {\r\n\t\treturn this.virtualScroller.scrollableContainer.getScrollY()\r\n\t}\r\n\r\n\tscrollTo(scrollPosition) {\r\n\t\tthis.virtualScroller.scrollableContainer.scrollToY(scrollPosition)\r\n\t}\r\n\r\n\tupdateScreenDimensions({\r\n\t\tscreenWidth: scrollableContainerWidth,\r\n\t\tscreenHeight: scrollableContainerHeight,\r\n\t\tcolumnsCount\r\n\t}) {\r\n\t\t// Resize scrollable container.\r\n\t\tthis.setScrollableContainerWidth(scrollableContainerWidth)\r\n\t\tthis.setScrollableContainerHeight(scrollableContainerHeight)\r\n\r\n\t\t// Update columns count.\r\n\t\tthis.__columnsCount = columnsCount\r\n\t}\r\n\r\n\t// Returns a `Promise`.\r\n\ttriggerResize({\r\n\t\tscreenWidth,\r\n\t\tscreenHeight,\r\n\t\tcolumnsCount,\r\n\t\tverticalSpacing\r\n\t}) {\r\n\t\tthis.updateScreenDimensions({\r\n\t\t\tscreenWidth,\r\n\t\t\tscreenHeight,\r\n\t\t\tcolumnsCount,\r\n\t\t\tverticalSpacing\r\n\t\t})\r\n\r\n\t\t// Call \"on resize\" listener.\r\n\t\treturn this.virtualScroller.scrollableContainer._triggerResizeListener()\r\n\t}\r\n\r\n\tstop() {\r\n\t\tif (this.expectedStateUpdates.length > 0) {\r\n\t\t\tthrow new Error(`[virtual-scroller] Expected ${this.expectedStateUpdates.length} state updates which didn't happen:\\n${JSON.stringify(this.expectedStateUpdates, null, 2)}`)\r\n\t\t}\r\n\t\tif (this.pausedStateUpdate) {\r\n\t\t\tthrow new Error('[virtual-scroller] State updates were paused and haven\\'t been resumed afterwards')\r\n\t\t}\r\n\t\tthis.virtualScroller.stop()\r\n\t}\r\n\r\n\tstart() {\r\n\t\tthis.virtualScroller.start()\r\n\t}\r\n\r\n\tgetState() {\r\n\t\treturn this.virtualScroller.getState()\r\n\t}\r\n\r\n\tupdateLayout() {\r\n\t\tthis.virtualScroller.updateLayout()\r\n\t}\r\n\r\n\tgetItemScrollPosition(itemOrIndex) {\r\n\t\treturn this.virtualScroller.getItemScrollPosition(itemOrIndex)\r\n\t}\r\n\r\n\tonItemHeightDidChange(itemOrIndex) {\r\n\t\tthis.virtualScroller.onItemHeightDidChange(itemOrIndex)\r\n\t}\r\n\r\n\tsetItemState(itemOrIndex, newState) {\r\n\t\tthis.virtualScroller.setItemState(itemOrIndex, newState)\r\n\t}\r\n\r\n\tgetAverageItemHeight() {\r\n\t\treturn this.virtualScroller.getAverageItemHeight()\r\n\t}\r\n\r\n\tsetItems(newItems, options) {\r\n\t\tthis.virtualScroller.setItems(newItems, options)\r\n\t}\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"VirtualScroller.js","names":["VirtualScroller","Engine","DEBUG","TestVirtualScroller","scrollableContainerWidth","screenWidth","scrollableContainerHeight","screenHeight","columnsCount","verticalSpacing","items","getItemId","initialState","state","rest","Object","keys","length","Error","join","expectedStateUpdates","scrollableContainerElement","width","height","containerElement","paddingTop","paddingBottom","children","setScrollableContainerWidth","setScrollableContainerHeight","getItemsContainerElement","__columnsCount","getColumnsCount","getItemWidth","hasPausedStateUpdates","undefined","pausedStateUpdate","pausedStateUpdateAction","onBeforeUpdateState","stateUpdate","expectedStateUpdate","shift","expect","to","deep","equal","callback","render","virtualScroller","getState","beforeItemsHeight","afterItemsHeight","firstShownItemIndex","lastShownItemIndex","slice","map","item","getWidth","getHeight","getArea","area","getMarginTop","scrollableContainer","engine","_waitForScrollingToStop","onStateChange","console","log","getInitialState","useState","updateState","stateUpdateAction","onRender","expectedState","should","include","push","firstNonMeasuredItemIndex","getScrollY","scrollPosition","scrollToY","updateScreenDimensions","_triggerResizeListener","JSON","stringify","stop","start","updateLayout","itemOrIndex","getItemScrollPosition","onItemHeightDidChange","newState","setItemState","getAverageItemHeight","newItems","options","setItems"],"sources":["../../source/test/VirtualScroller.js"],"sourcesContent":["import VirtualScroller from '../VirtualScroller.js'\r\nimport Engine from './Engine.js'\r\n\r\nconst DEBUG = false\r\n\r\nexport default class TestVirtualScroller {\r\n\tconstructor({\r\n\t\tscreenWidth: scrollableContainerWidth,\r\n\t\tscreenHeight: scrollableContainerHeight,\r\n\t\tcolumnsCount,\r\n\t\tverticalSpacing,\r\n\t\titems,\r\n\t\tgetItemId,\r\n\t\tstate: initialState,\r\n\t\t...rest\r\n\t}) {\r\n\t\t// Validate that no unknown properties are passed.\r\n\t\t// This prevents the cases when a developer confuses\r\n\t\t// `TestVirtualScroller` options for `VirtualScroller` options.\r\n\t\tif (Object.keys(rest).length > 0) {\r\n\t\t\tthrow new Error(`Unknown options: ${Object.keys(rest).join(', ')}`)\r\n\t\t}\r\n\r\n\t\tthis.expectedStateUpdates = []\r\n\r\n\t\tconst scrollableContainerElement = {\r\n\t\t\twidth: scrollableContainerWidth,\r\n\t\t\theight: scrollableContainerHeight\r\n\t\t}\r\n\r\n\t\tconst containerElement = {\r\n\t\t\tpaddingTop: 0,\r\n\t\t\tpaddingBottom: 0,\r\n\t\t\twidth: scrollableContainerElement.width,\r\n\t\t\tchildren: []\r\n\t\t}\r\n\r\n\t\tthis.setScrollableContainerWidth = (width) => {\r\n\t\t\tscrollableContainerElement.width = width\r\n\t\t\tcontainerElement.width = width\r\n\t\t}\r\n\r\n\t\tthis.setScrollableContainerHeight = (height) => {\r\n\t\t\tscrollableContainerElement.height = height\r\n\t\t}\r\n\r\n\t\tconst getItemsContainerElement = () => containerElement\r\n\r\n\t\tthis.__columnsCount = columnsCount\r\n\r\n\t\tconst getColumnsCount = () => this.__columnsCount\r\n\t\tconst getItemWidth = () => scrollableContainerElement.width / getColumnsCount()\r\n\r\n\t\tthis.hasPausedStateUpdates = undefined\r\n\t\tthis.pausedStateUpdate = undefined\r\n\t\tthis.pausedStateUpdateAction = undefined\r\n\r\n\t\tconst onBeforeUpdateState = (stateUpdate) => {\r\n\t\t\tif (this.expectedStateUpdates.length > 0) {\r\n\t\t\t\tconst expectedStateUpdate = this.expectedStateUpdates.shift()\r\n\t\t\t\texpect(stateUpdate).to.deep.equal(expectedStateUpdate.stateUpdate)\r\n\t\t\t\tif (expectedStateUpdate.callback) {\r\n\t\t\t\t\texpectedStateUpdate.callback()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst render = () => {\r\n\t\t\tconst {\r\n\t\t\t\titems,\r\n\t\t\t\tbeforeItemsHeight,\r\n\t\t\t\tafterItemsHeight,\r\n\t\t\t\tfirstShownItemIndex,\r\n\t\t\t\tlastShownItemIndex\r\n\t\t\t} = this.virtualScroller.getState()\r\n\r\n\t\t\tcontainerElement.paddingTop = beforeItemsHeight\r\n\t\t\tcontainerElement.paddingBottom = afterItemsHeight\r\n\r\n\t\t\tcontainerElement.children = items\r\n\t\t\t\t.slice(firstShownItemIndex, lastShownItemIndex + 1)\r\n\t\t\t\t.map((item) => ({\r\n\t\t\t\t\tgetWidth: () => getItemWidth(),\r\n\t\t\t\t\tgetHeight: () => (item.getArea ? item.getArea() : item.area) / getItemWidth(),\r\n\t\t\t\t\tgetMarginTop: () => verticalSpacing\r\n\t\t\t\t}))\r\n\t\t}\r\n\r\n\t\tthis.virtualScroller = new VirtualScroller(getItemsContainerElement, items, {\r\n\t\t\tscrollableContainer: scrollableContainerElement,\r\n\t\t\tengine: Engine,\r\n\t\t\t_waitForScrollingToStop: false,\r\n\t\t\tgetItemId,\r\n\t\t\tgetColumnsCount,\r\n\t\t\tstate: initialState,\r\n\t\t\tonStateChange(state) {\r\n\t\t\t\tif (DEBUG) {\r\n\t\t\t\t\tconsole.log('~ Updated State ~')\r\n\t\t\t\t\tconsole.log(state)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\tlet state = this.virtualScroller.getInitialState()\r\n\r\n\t\tthis.virtualScroller.useState({\r\n\t\t\tgetState: () => state,\r\n\t\t\tupdateState: (stateUpdate) => {\r\n\t\t\t\tconst stateUpdateAction = (stateUpdate) => {\r\n\t\t\t\t\t// Is only used in tests.\r\n\t\t\t\t\tif (onBeforeUpdateState) {\r\n\t\t\t\t\t\tonBeforeUpdateState(stateUpdate)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tstate = {\r\n\t\t\t\t\t\t...state,\r\n\t\t\t\t\t\t...stateUpdate\r\n\t\t\t\t\t}\r\n\t\t\t\t\trender()\r\n\t\t\t\t\tthis.virtualScroller.onRender()\r\n\t\t\t\t}\r\n\t\t\t\tif (this.hasPausedStateUpdates) {\r\n\t\t\t\t\tthis.pausedStateUpdate = {\r\n\t\t\t\t\t\t...this.pausedStateUpdate,\r\n\t\t\t\t\t\t...stateUpdate\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.pausedStateUpdateAction = stateUpdateAction\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstateUpdateAction(stateUpdate)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\trender()\r\n\t}\r\n\r\n\tpauseStateUpdates() {\r\n\t\tif (this.hasPausedStateUpdates) {\r\n\t\t\tthrow new Error('[virtual-scroller] State updates have already been paused')\r\n\t\t}\r\n\t\tthis.hasPausedStateUpdates = true\r\n\t}\r\n\r\n\tresumeStateUpdates() {\r\n\t\tif (this.pausedStateUpdate) {\r\n\t\t\tthis.pausedStateUpdateAction(this.pausedStateUpdate)\r\n\t\t\tthis.pausedStateUpdate = undefined\r\n\t\t\tthis.pausedStateUpdateAction = undefined\r\n\t\t}\r\n\t\tthis.hasPausedStateUpdates = false\r\n\t}\r\n\r\n\tverifyState(expectedState) {\r\n\t\t// `mocha`/`chai`.\r\n\t\tthis.virtualScroller.getState().should.deep.include(expectedState)\r\n\t}\r\n\r\n\texpectStateUpdate(stateUpdate, callback) {\r\n\t\tthis.expectedStateUpdates.push({\r\n\t\t\tstateUpdate,\r\n\t\t\tcallback\r\n\t\t})\r\n\t}\r\n\r\n\tgetFirstNonMeasuredItemIndex() {\r\n\t\treturn this.virtualScroller.firstNonMeasuredItemIndex\r\n\t}\r\n\r\n\tgetScrollY() {\r\n\t\treturn this.virtualScroller.scrollableContainer.getScrollY()\r\n\t}\r\n\r\n\tscrollTo(scrollPosition) {\r\n\t\tthis.virtualScroller.scrollableContainer.scrollToY(scrollPosition)\r\n\t}\r\n\r\n\tupdateScreenDimensions({\r\n\t\tscreenWidth: scrollableContainerWidth,\r\n\t\tscreenHeight: scrollableContainerHeight,\r\n\t\tcolumnsCount\r\n\t}) {\r\n\t\t// Resize scrollable container.\r\n\t\tthis.setScrollableContainerWidth(scrollableContainerWidth)\r\n\t\tthis.setScrollableContainerHeight(scrollableContainerHeight)\r\n\r\n\t\t// Update columns count.\r\n\t\tthis.__columnsCount = columnsCount\r\n\t}\r\n\r\n\t// Returns a `Promise`.\r\n\ttriggerResize({\r\n\t\tscreenWidth,\r\n\t\tscreenHeight,\r\n\t\tcolumnsCount,\r\n\t\tverticalSpacing\r\n\t}) {\r\n\t\tthis.updateScreenDimensions({\r\n\t\t\tscreenWidth,\r\n\t\t\tscreenHeight,\r\n\t\t\tcolumnsCount,\r\n\t\t\tverticalSpacing\r\n\t\t})\r\n\r\n\t\t// Call \"on resize\" listener.\r\n\t\treturn this.virtualScroller.scrollableContainer._triggerResizeListener()\r\n\t}\r\n\r\n\tstop() {\r\n\t\tif (this.expectedStateUpdates.length > 0) {\r\n\t\t\tthrow new Error(`[virtual-scroller] Expected ${this.expectedStateUpdates.length} state updates which didn't happen:\\n${JSON.stringify(this.expectedStateUpdates, null, 2)}`)\r\n\t\t}\r\n\t\tif (this.pausedStateUpdate) {\r\n\t\t\tthrow new Error('[virtual-scroller] State updates were paused and haven\\'t been resumed afterwards')\r\n\t\t}\r\n\t\tthis.virtualScroller.stop()\r\n\t}\r\n\r\n\tstart() {\r\n\t\tthis.virtualScroller.start()\r\n\t}\r\n\r\n\tgetState() {\r\n\t\treturn this.virtualScroller.getState()\r\n\t}\r\n\r\n\tupdateLayout() {\r\n\t\tthis.virtualScroller.updateLayout()\r\n\t}\r\n\r\n\tgetItemScrollPosition(itemOrIndex) {\r\n\t\treturn this.virtualScroller.getItemScrollPosition(itemOrIndex)\r\n\t}\r\n\r\n\tonItemHeightDidChange(itemOrIndex) {\r\n\t\tthis.virtualScroller.onItemHeightDidChange(itemOrIndex)\r\n\t}\r\n\r\n\tsetItemState(itemOrIndex, newState) {\r\n\t\tthis.virtualScroller.setItemState(itemOrIndex, newState)\r\n\t}\r\n\r\n\tgetAverageItemHeight() {\r\n\t\treturn this.virtualScroller.getAverageItemHeight()\r\n\t}\r\n\r\n\tsetItems(newItems, options) {\r\n\t\tthis.virtualScroller.setItems(newItems, options)\r\n\t}\r\n}\r\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "virtual-scroller",
3
- "version": "1.15.0",
3
+ "version": "1.15.2",
4
4
  "description": "A component for efficiently rendering large lists of variable height items",
5
5
  "main": "index.cjs",
6
6
  "module": "index.js",
@@ -46,6 +46,9 @@
46
46
  "mocha": "^10.0.0",
47
47
  "npm-run-all": "^4.1.5",
48
48
  "nyc": "^15.1.0",
49
+ "prop-types": "^15.8.1",
50
+ "react": "^19.2.0",
51
+ "react-dom": "^19.2.0",
49
52
  "regenerator-runtime": "^0.13.9",
50
53
  "rimraf": "^3.0.2",
51
54
  "rollup": "^2.73.0",
package/react/index.cjs CHANGED
@@ -1,4 +1,5 @@
1
1
  'use strict'
2
2
 
3
3
  exports = module.exports = require('../commonjs/react/VirtualScroller.js').default
4
- exports['default'] = require('../commonjs/react/VirtualScroller.js').default
4
+ exports['default'] = require('../commonjs/react/VirtualScroller.js').default
5
+ exports.useVirtualScroller = require('../commonjs/react/useVirtualScroller.js').default
package/react/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { State, VirtualScrollerCommonOptions } from '../index.d.js';
1
+ import { default as VirtualScrollerCore, State, VirtualScrollerCommonOptions } from '../index.d.js';
2
2
 
3
3
  // `as` property is now deprecated, so `WithAsProperty` type is a legacy one.
4
4
  // Use `itemsContainerComponent` property instead.
@@ -39,6 +39,29 @@ export interface VirtualScrollerRefValue {
39
39
  // // This is a type of a `ref` that will be passed to a given `Component`.
40
40
  // type ComponentRef<Component extends React.ElementType> = React.ComponentPropsWithRef<Component>['ref']
41
41
 
42
+ // These props are shared between `useVirtualScroller()` hook and `<VirtualScroller/>` component.
43
+ interface PropsBase<
44
+ // `Item` is the type of an element of the `items` array.
45
+ Item,
46
+
47
+ // `ItemComponentState` is the type of an item component state.
48
+ // Example: `interface ItemComponentState { expanded?: boolean }`.
49
+ //
50
+ // In most cases, a developer won't even have to bother about item component state
51
+ // because `ItemComponent` won't have any state.
52
+ // In such cases, type `unknown` is used as a "dummy" placeholder
53
+ // just so that TypeScript doesn't complain about this "generic" being unspecified.
54
+ //
55
+ ItemComponentState = unknown
56
+ > extends VirtualScrollerCommonOptions<Item, ItemComponentState> {
57
+ items: Item[];
58
+ initialState?: State<Item, ItemComponentState>;
59
+ preserveScrollPositionOnPrependItems?: boolean;
60
+ readyToStart?: boolean;
61
+ tbody?: boolean;
62
+ getScrollableContainer?(): HTMLElement;
63
+ }
64
+
42
65
  // These are `<VirtualScroller/>` props except the deprecated `as` property.
43
66
  // When `as` property is removed in some future, `PropsWithoutAs` could be renamed to just `export Props`.
44
67
  interface PropsWithoutAs<
@@ -65,11 +88,10 @@ interface PropsWithoutAs<
65
88
  // New applications should always specify `itemsContainerComponent` property value.
66
89
  //
67
90
  ItemsContainerComponent extends React.ElementType = 'div'
68
- > extends VirtualScrollerCommonOptions<Item, ItemComponentState> {
91
+ > extends PropsBase<Item, ItemComponentState> {
69
92
  ref: React.Ref<VirtualScrollerRefValue>;
70
93
  // If `ref` was just "forwarded" to the `ItemsContainerComponent`, its type would have been this:
71
94
  // ref: ComponentRef<ItemsContainerComponent>;
72
- items: Item[];
73
95
  itemComponent: ItemComponent;
74
96
  itemComponentProps?: Partial<
75
97
  Omit<
@@ -84,10 +106,6 @@ interface PropsWithoutAs<
84
106
  React.ComponentPropsWithoutRef<ItemsContainerComponent>
85
107
  >;
86
108
  itemsContainerRef?: React.ComponentPropsWithRef<ItemsContainerComponent>['ref'];
87
- initialState?: State<Item, ItemComponentState>;
88
- preserveScrollPositionOnPrependItems?: boolean;
89
- readyToStart?: boolean;
90
- getScrollableContainer?(): HTMLElement;
91
109
  }
92
110
 
93
111
  // These are `<VirtualScroller/>` props including the deprecated `as` property.
@@ -175,6 +193,32 @@ declare function VirtualScroller<
175
193
 
176
194
  export default VirtualScroller;
177
195
 
196
+ export function useVirtualScroller<
197
+ // `Item` is the type of an element of the `items` array.
198
+ Item,
199
+
200
+ // `ItemComponentState` is the type of an item component state.
201
+ // Example: `interface ItemComponentState { expanded?: boolean }`.
202
+ //
203
+ // In most cases, a developer won't even have to bother about item component state
204
+ // because `ItemComponent` won't have any state.
205
+ // In such cases, type `unknown` is used as a "dummy" placeholder
206
+ // just so that TypeScript doesn't complain about this "generic" being unspecified.
207
+ //
208
+ ItemComponentState = unknown
209
+ >(
210
+ props: PropsBase<Item, ItemComponentState>
211
+ ): UseVirtualScrollerResult<Item, ItemComponentState>;
212
+
213
+ interface UseVirtualScrollerResult<Item, ItemComponentState> {
214
+ // Use this `state` instead of `virtualScroller.getState()`.
215
+ state: State<Item, ItemComponentState>;
216
+ style?: React.CSSProperties;
217
+ className?: string;
218
+ itemsContainerRef: React.Ref<HTMLElement>;
219
+ virtualScroller: VirtualScrollerCore<HTMLElement, Item, ItemComponentState>;
220
+ }
221
+
178
222
  // The props that're passed by `<VirtualScroller/>` to `ItemComponent`.
179
223
  export interface VirtualScrollerItemComponentProps<Item, ItemComponentState> {
180
224
  item: Item;
package/react/index.js CHANGED
@@ -1 +1,2 @@
1
1
  export { default } from '../modules/react/VirtualScroller.js'
2
+ export { default as useVirtualScroller } from '../modules/react/useVirtualScroller.js'
package/rollup.config.mjs CHANGED
@@ -37,7 +37,21 @@ export default [
37
37
  }
38
38
  },
39
39
  {
40
- input: 'react/index.js',
40
+ // Legacy compatibility:
41
+ //
42
+ // Originally, the default export of the `virtual-scroller/react` subpackage
43
+ // was only the `VirtualScroller` component, and there were no other exports.
44
+ //
45
+ // Later, `useVirtualScroller()` hook export was added.
46
+ // In order to maintain legacy compatibility, the new exports shouldn't "break"
47
+ // the existing environments that were using the old versions of the package.
48
+ // This means that in non-ES6-import environments, any additional exports
49
+ // should be added directly to the default `VirtualScroller` export.
50
+ //
51
+ // That's the reason why it uses "modules/react/VirtualScroller.js" file
52
+ // as `input` here instead of "react/index.js".
53
+ //
54
+ input: 'modules/react/VirtualScroller.js',
41
55
  plugins: [
42
56
  resolveModules,
43
57
  commonjs(),
@@ -125,6 +125,9 @@ export default function VirtualScrollerConstructor(
125
125
  // React limits the number of nested updates to prevent infinite loops."
126
126
  this._useTimeoutInRenderLoop = _useTimeoutInRenderLoop
127
127
 
128
+ // `_getItemId()` function is used in `_getItemIndexByItemOrIndex()` function.
129
+ this._getItemId = getItemId
130
+
128
131
  if (getItemId) {
129
132
  this.isItemEqual = (a, b) => getItemId(a) === getItemId(b)
130
133
  } else {
@@ -45,6 +45,20 @@ export default function() {
45
45
  if (i >= 0 && i < items.length) {
46
46
  return i
47
47
  }
48
+ } else {
49
+ // It is also possible that the `item` is stale and that items have already been updated
50
+ // via `.setItems()`. In that case, a developer could supply a `getItemId(item)` function
51
+ // in order for this library to be able to detect the items that have stayed even when
52
+ // their "reference" has changed. To support such case, here it has to also attempt a search
53
+ // for the `item` by its `id` rather than just its "reference".
54
+ const getItemId = this._getItemId
55
+ if (getItemId) {
56
+ const itemId = getItemId(item)
57
+ const i = items.findIndex((item) => getItemId(item) === itemId)
58
+ if (i >= 0) {
59
+ return i
60
+ }
61
+ }
48
62
  }
49
63
 
50
64
  reportError(`Item not found: ${JSON.stringify(item)}`)