virtual-scroller 1.9.1 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +6 -4
- package/bundle/virtual-scroller-dom.js.map +1 -1
- package/bundle/virtual-scroller-react.js +1 -1
- package/bundle/virtual-scroller-react.js.map +1 -1
- package/bundle/virtual-scroller.js.map +1 -1
- package/commonjs/VirtualScroller.js +1 -1
- package/commonjs/VirtualScroller.js.map +1 -1
- package/commonjs/react/VirtualScroller.js +8 -1
- package/commonjs/react/VirtualScroller.js.map +1 -1
- package/commonjs/react/useHandleItemsChange.js.map +1 -1
- package/dom/index.d.ts +1 -1
- package/index.d.ts +3 -3
- package/modules/VirtualScroller.js +1 -1
- package/modules/VirtualScroller.js.map +1 -1
- package/modules/react/VirtualScroller.js +8 -1
- package/modules/react/VirtualScroller.js.map +1 -1
- package/modules/react/useHandleItemsChange.js +1 -1
- package/modules/react/useHandleItemsChange.js.map +1 -1
- package/package.json +1 -1
- package/react/index.d.ts +53 -15
- package/source/VirtualScroller.js +1 -1
- package/source/react/VirtualScroller.js +6 -0
- package/source/react/useHandleItemsChange.js +1 -1
- package/website/index-bypass.html +2 -2
- package/website/index-grid.html +2 -2
- package/website/index-scrollableContainer.html +2 -2
- package/website/index.html +2 -2
|
@@ -94,7 +94,7 @@ var VirtualScroller = /*#__PURE__*/function () {
|
|
|
94
94
|
var isRestart = this._isActive === false;
|
|
95
95
|
|
|
96
96
|
if (!isRestart) {
|
|
97
|
-
// If no custom
|
|
97
|
+
// If no custom state storage has been configured, use the default one.
|
|
98
98
|
// Also sets the initial state.
|
|
99
99
|
if (!this._usesCustomStateStorage) {
|
|
100
100
|
this.useDefaultStateStorage();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualScroller.js","names":["VirtualScroller","getItemsContainerElement","items","options","_isActive","Error","log","resize","stop","scroll","listTopOffsetWatcher","isStarted","cancelLayoutTimer","hasToBeStarted","onUpdateShownItemIndexes","reason","LAYOUT_REASON","MANUAL","_onRender","getState","previousState","VirtualScrollerConstructor","call","isRestart","_usesCustomStateStorage","useDefaultStateStorage","_render","listHeightMeasurement","reset","_isResizing","undefined","_isSettingNewItems","tbody","hasTbodyStyles","addTbodyStyles","stateUpdate","_stoppedStateUpdate","verticalSpacing","verticalSpacingStateUpdate","measureItemHeightsAndSpacing","start","scrollableContainerWidth","scrollableContainer","getWidth","newWidth","prevWidth","onResize","columnsCount","getActualColumnsCount","columnsCountFromState","STARTED","i","itemTopOffsetInList","layout","getItemTopOffset","getListTopOffsetInsideScrollableContainer","_onItemHeightChange","newItemState","_onItemStateChange","newItems","_setItems"],"sources":["../source/VirtualScroller.js"],"sourcesContent":["import VirtualScrollerConstructor from './VirtualScroller.constructor.js'\r\nimport { hasTbodyStyles, addTbodyStyles } from './DOM/tbody.js'\r\nimport { LAYOUT_REASON } from './Layout.js'\r\nimport log from './utility/debug.js'\r\n\r\nexport default class VirtualScroller {\r\n\t/**\r\n\t * @param {function} getItemsContainerElement — Returns the container DOM `Element`.\r\n\t * @param {any[]} items — The list of items.\r\n\t * @param {Object} [options] — See README.md.\r\n\t * @return {VirtualScroller}\r\n\t */\r\n\tconstructor(\r\n\t\tgetItemsContainerElement,\r\n\t\titems,\r\n\t\toptions = {}\r\n\t) {\r\n\t\tVirtualScrollerConstructor.call(\r\n\t\t\tthis,\r\n\t\t\tgetItemsContainerElement,\r\n\t\t\titems,\r\n\t\t\toptions\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Should be invoked after a \"container\" DOM Element is mounted (inserted into the DOM tree).\r\n\t */\r\n\tstart() {\r\n\t\tif (this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] `VirtualScroller` has already been started')\r\n\t\t}\r\n\r\n\t\t// If has been stopped previously.\r\n\t\tconst isRestart = this._isActive === false\r\n\r\n\t\tif (!isRestart) {\r\n\t\t\t// If no custom one has been configured, uses the default one.\r\n\t\t\t// Also sets the initial state.\r\n\t\t\tif (!this._usesCustomStateStorage) {\r\n\t\t\t\tthis.useDefaultStateStorage()\r\n\t\t\t}\r\n\t\t\t// If `render()` function parameter was passed,\r\n\t\t\t// perform an initial render.\r\n\t\t\tif (this._render) {\r\n\t\t\t\tthis._render(this.getState())\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlog('~ Start ~')\r\n\r\n\t\t// `this._isActive = true` should be placed somewhere at the start of this function.\r\n\t\tthis._isActive = true\r\n\r\n\t\t// Reset `ListHeightMeasurement` just in case it has some \"leftover\" state.\r\n\t\tthis.listHeightMeasurement.reset()\r\n\r\n\t\t// Reset `_isResizing` flag just in case it has some \"leftover\" value.\r\n\t\tthis._isResizing = undefined\r\n\r\n\t\t// Reset `_isSettingNewItems` flag just in case it has some \"leftover\" value.\r\n\t\tthis._isSettingNewItems = undefined\r\n\r\n\t\t// Work around `<tbody/>` not being able to have `padding`.\r\n\t\t// https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n\t\tif (this.tbody) {\r\n\t\t\tif (!hasTbodyStyles(this.getItemsContainerElement())) {\r\n\t\t\t\taddTbodyStyles(this.getItemsContainerElement())\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If there was a pending state update that didn't get applied\r\n\t\t// because of stopping the `VirtualScroller`, apply that state update now.\r\n\t\t//\r\n\t\t// The pending state update won't get applied if the scrollable container width\r\n\t\t// has changed but that's ok because that state update currently could only contain:\r\n\t\t// * `scrollableContainerWidth`\r\n\t\t// * `verticalSpacing`\r\n\t\t// * `beforeResize`\r\n\t\t// All of those get rewritten in `onResize()` anyway.\r\n\t\t//\r\n\t\tlet stateUpdate = this._stoppedStateUpdate\r\n\t\tthis._stoppedStateUpdate = undefined\r\n\r\n\t\t// Reset `this.verticalSpacing` so that it re-measures it in cases when\r\n\t\t// the `VirtualScroller` was previously stopped and is now being restarted.\r\n\t\t// The rationale is that a previously captured inter-item vertical spacing\r\n\t\t// can't be \"trusted\" in a sense that the user might have resized the window\r\n\t\t// after the previous `state` has been snapshotted.\r\n\t\t// If the user has resized the window, then changing window width might have\r\n\t\t// activated different CSS `@media()` \"queries\" resulting in a potentially different\r\n\t\t// vertical spacing after the restart.\r\n\t\t// If it's not a restart then `this.verticalSpacing` is `undefined` anyway.\r\n\t\tthis.verticalSpacing = undefined\r\n\r\n\t\tconst verticalSpacingStateUpdate = this.measureItemHeightsAndSpacing()\r\n\t\tif (verticalSpacingStateUpdate) {\r\n\t\t\tstateUpdate = {\r\n\t\t\t\t...stateUpdate,\r\n\t\t\t\t...verticalSpacingStateUpdate\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.resize.start()\r\n\t\tthis.scroll.start()\r\n\r\n\t\t// If `scrollableContainerWidth` hasn't been measured yet,\r\n\t\t// measure it and write it to state.\r\n\t\tif (this.getState().scrollableContainerWidth === undefined) {\r\n\t\t\tconst scrollableContainerWidth = this.scrollableContainer.getWidth()\r\n\t\t\tstateUpdate = {\r\n\t\t\t\t...stateUpdate,\r\n\t\t\t\tscrollableContainerWidth\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// Reset layout:\r\n\t\t\t// * If the scrollable container width has changed while stopped.\r\n\t\t\t// * If the restored state was calculated for another scrollable container width.\r\n\t\t\tconst newWidth = this.scrollableContainer.getWidth()\r\n\t\t\tconst prevWidth = this.getState().scrollableContainerWidth\r\n\t\t\tif (newWidth !== prevWidth) {\r\n\t\t\t\tlog('~ Scrollable container width changed from', prevWidth, 'to', newWidth, '~')\r\n\t\t\t\t// `stateUpdate` doesn't get passed to `this.onResize()`, and, therefore,\r\n\t\t\t\t// won't be applied. But that's ok because currently it could only contain:\r\n\t\t\t\t// * `scrollableContainerWidth`\r\n\t\t\t\t// * `verticalSpacing`\r\n\t\t\t\t// * `beforeResize`\r\n\t\t\t\t// All of those get rewritten in `onResize()` anyway.\r\n\t\t\t\treturn this.onResize()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If the `VirtualScroller` uses custom (external) state storage, then\r\n\t\t// check if the columns count has changed between calling `.getInitialState()`\r\n\t\t// and `.start()`. If it has, perform a re-layout \"from scratch\".\r\n\t\tif (this._usesCustomStateStorage) {\r\n\t\t\tconst columnsCount = this.getActualColumnsCount()\r\n\t\t\tconst columnsCountFromState = this.getState().columnsCount || 1\r\n\t\t\tif (columnsCount !== columnsCountFromState) {\r\n\t\t\t\treturn this.onResize()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Re-calculate layout and re-render the list.\r\n\t\t// Do that even if when an initial `state` parameter, containing layout values,\r\n\t\t// has been passed. The reason is that the `state` parameter can't be \"trusted\"\r\n\t\t// in a way that it could have been snapshotted for another window width and\r\n\t\t// the user might have resized their window since then.\r\n\t\tthis.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.STARTED, stateUpdate })\r\n\t}\r\n\r\n\t// Could be passed as a \"callback\" parameter, so bind it to `this`.\r\n\tstop = () => {\r\n\t\tif (!this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] Can\\'t stop a `VirtualScroller` that hasn\\'t been started')\r\n\t\t}\r\n\r\n\t\tthis._isActive = false\r\n\r\n\t\tlog('~ Stop ~')\r\n\r\n\t\tthis.resize.stop()\r\n\t\tthis.scroll.stop()\r\n\r\n\t\t// Stop `ListTopOffsetWatcher` if it has been started.\r\n\t\t// There seems to be no need to restart `ListTopOffsetWatcher`.\r\n\t\t// It's mainly a hacky workaround for development mode anyway.\r\n\t\tif (this.listTopOffsetWatcher && this.listTopOffsetWatcher.isStarted()) {\r\n\t\t\tthis.listTopOffsetWatcher.stop()\r\n\t\t}\r\n\r\n\t\t// Cancel any scheduled layout.\r\n\t\tthis.cancelLayoutTimer({})\r\n\t}\r\n\r\n\thasToBeStarted() {\r\n\t\tif (!this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] `VirtualScroller` hasn\\'t been started')\r\n\t\t}\r\n\t}\r\n\r\n\t// Bind it to `this` because this function could hypothetically be passed\r\n\t// as a \"callback\" parameter.\r\n\tupdateLayout = () => {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.MANUAL })\r\n\t}\r\n\r\n\t// Bind the function to `this` so that it could be passed as a callback\r\n\t// in a random application's code.\r\n\tonRender = () => {\r\n\t\tthis._onRender(this.getState(), this.previousState)\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the items's top offset relative to the scrollable container's top edge.\r\n\t * @param {number} i — Item index\r\n\t * @return {[number]} Returns the item's scroll Y position. Returns `undefined` if any of the previous items haven't been rendered yet.\r\n\t */\r\n\tgetItemScrollPosition(i) {\r\n\t\tconst itemTopOffsetInList = this.layout.getItemTopOffset(i)\r\n\t\tif (itemTopOffsetInList === undefined) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\treturn this.getListTopOffsetInsideScrollableContainer() + itemTopOffsetInList\r\n\t}\r\n\r\n\t/**\r\n\t * Forces a re-measure of an item's height.\r\n\t * @param {number} i — Item index\r\n\t */\r\n\tonItemHeightChange(i) {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis._onItemHeightChange(i)\r\n\t}\r\n\r\n\t/**\r\n\t * Updates an item's state in `state.itemStates[]`.\r\n\t * @param {number} i — Item index\r\n\t * @param {any} i — Item's new state\r\n\t */\r\n\tonItemStateChange(i, newItemState) {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis._onItemStateChange(i, newItemState)\r\n\t}\r\n\r\n\t/**\r\n\t * Updates `items`. For example, can prepend or append new items to the list.\r\n\t * @param {any[]} newItems\r\n\t * @param {boolean} [options.preserveScrollPositionOnPrependItems] — Set to `true` to enable \"restore scroll position after prepending items\" feature (could be useful when implementing \"Show previous items\" button).\r\n\t */\r\n\tsetItems(newItems, options = {}) {\r\n\t\tthis.hasToBeStarted()\r\n\t\treturn this._setItems(newItems, options)\r\n\t}\r\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VirtualScroller.js","names":["VirtualScroller","getItemsContainerElement","items","options","_isActive","Error","log","resize","stop","scroll","listTopOffsetWatcher","isStarted","cancelLayoutTimer","hasToBeStarted","onUpdateShownItemIndexes","reason","LAYOUT_REASON","MANUAL","_onRender","getState","previousState","VirtualScrollerConstructor","call","isRestart","_usesCustomStateStorage","useDefaultStateStorage","_render","listHeightMeasurement","reset","_isResizing","undefined","_isSettingNewItems","tbody","hasTbodyStyles","addTbodyStyles","stateUpdate","_stoppedStateUpdate","verticalSpacing","verticalSpacingStateUpdate","measureItemHeightsAndSpacing","start","scrollableContainerWidth","scrollableContainer","getWidth","newWidth","prevWidth","onResize","columnsCount","getActualColumnsCount","columnsCountFromState","STARTED","i","itemTopOffsetInList","layout","getItemTopOffset","getListTopOffsetInsideScrollableContainer","_onItemHeightChange","newItemState","_onItemStateChange","newItems","_setItems"],"sources":["../source/VirtualScroller.js"],"sourcesContent":["import VirtualScrollerConstructor from './VirtualScroller.constructor.js'\r\nimport { hasTbodyStyles, addTbodyStyles } from './DOM/tbody.js'\r\nimport { LAYOUT_REASON } from './Layout.js'\r\nimport log from './utility/debug.js'\r\n\r\nexport default class VirtualScroller {\r\n\t/**\r\n\t * @param {function} getItemsContainerElement — Returns the container DOM `Element`.\r\n\t * @param {any[]} items — The list of items.\r\n\t * @param {Object} [options] — See README.md.\r\n\t * @return {VirtualScroller}\r\n\t */\r\n\tconstructor(\r\n\t\tgetItemsContainerElement,\r\n\t\titems,\r\n\t\toptions = {}\r\n\t) {\r\n\t\tVirtualScrollerConstructor.call(\r\n\t\t\tthis,\r\n\t\t\tgetItemsContainerElement,\r\n\t\t\titems,\r\n\t\t\toptions\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Should be invoked after a \"container\" DOM Element is mounted (inserted into the DOM tree).\r\n\t */\r\n\tstart() {\r\n\t\tif (this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] `VirtualScroller` has already been started')\r\n\t\t}\r\n\r\n\t\t// If has been stopped previously.\r\n\t\tconst isRestart = this._isActive === false\r\n\r\n\t\tif (!isRestart) {\r\n\t\t\t// If no custom state storage has been configured, use the default one.\r\n\t\t\t// Also sets the initial state.\r\n\t\t\tif (!this._usesCustomStateStorage) {\r\n\t\t\t\tthis.useDefaultStateStorage()\r\n\t\t\t}\r\n\t\t\t// If `render()` function parameter was passed,\r\n\t\t\t// perform an initial render.\r\n\t\t\tif (this._render) {\r\n\t\t\t\tthis._render(this.getState())\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlog('~ Start ~')\r\n\r\n\t\t// `this._isActive = true` should be placed somewhere at the start of this function.\r\n\t\tthis._isActive = true\r\n\r\n\t\t// Reset `ListHeightMeasurement` just in case it has some \"leftover\" state.\r\n\t\tthis.listHeightMeasurement.reset()\r\n\r\n\t\t// Reset `_isResizing` flag just in case it has some \"leftover\" value.\r\n\t\tthis._isResizing = undefined\r\n\r\n\t\t// Reset `_isSettingNewItems` flag just in case it has some \"leftover\" value.\r\n\t\tthis._isSettingNewItems = undefined\r\n\r\n\t\t// Work around `<tbody/>` not being able to have `padding`.\r\n\t\t// https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n\t\tif (this.tbody) {\r\n\t\t\tif (!hasTbodyStyles(this.getItemsContainerElement())) {\r\n\t\t\t\taddTbodyStyles(this.getItemsContainerElement())\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If there was a pending state update that didn't get applied\r\n\t\t// because of stopping the `VirtualScroller`, apply that state update now.\r\n\t\t//\r\n\t\t// The pending state update won't get applied if the scrollable container width\r\n\t\t// has changed but that's ok because that state update currently could only contain:\r\n\t\t// * `scrollableContainerWidth`\r\n\t\t// * `verticalSpacing`\r\n\t\t// * `beforeResize`\r\n\t\t// All of those get rewritten in `onResize()` anyway.\r\n\t\t//\r\n\t\tlet stateUpdate = this._stoppedStateUpdate\r\n\t\tthis._stoppedStateUpdate = undefined\r\n\r\n\t\t// Reset `this.verticalSpacing` so that it re-measures it in cases when\r\n\t\t// the `VirtualScroller` was previously stopped and is now being restarted.\r\n\t\t// The rationale is that a previously captured inter-item vertical spacing\r\n\t\t// can't be \"trusted\" in a sense that the user might have resized the window\r\n\t\t// after the previous `state` has been snapshotted.\r\n\t\t// If the user has resized the window, then changing window width might have\r\n\t\t// activated different CSS `@media()` \"queries\" resulting in a potentially different\r\n\t\t// vertical spacing after the restart.\r\n\t\t// If it's not a restart then `this.verticalSpacing` is `undefined` anyway.\r\n\t\tthis.verticalSpacing = undefined\r\n\r\n\t\tconst verticalSpacingStateUpdate = this.measureItemHeightsAndSpacing()\r\n\t\tif (verticalSpacingStateUpdate) {\r\n\t\t\tstateUpdate = {\r\n\t\t\t\t...stateUpdate,\r\n\t\t\t\t...verticalSpacingStateUpdate\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.resize.start()\r\n\t\tthis.scroll.start()\r\n\r\n\t\t// If `scrollableContainerWidth` hasn't been measured yet,\r\n\t\t// measure it and write it to state.\r\n\t\tif (this.getState().scrollableContainerWidth === undefined) {\r\n\t\t\tconst scrollableContainerWidth = this.scrollableContainer.getWidth()\r\n\t\t\tstateUpdate = {\r\n\t\t\t\t...stateUpdate,\r\n\t\t\t\tscrollableContainerWidth\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// Reset layout:\r\n\t\t\t// * If the scrollable container width has changed while stopped.\r\n\t\t\t// * If the restored state was calculated for another scrollable container width.\r\n\t\t\tconst newWidth = this.scrollableContainer.getWidth()\r\n\t\t\tconst prevWidth = this.getState().scrollableContainerWidth\r\n\t\t\tif (newWidth !== prevWidth) {\r\n\t\t\t\tlog('~ Scrollable container width changed from', prevWidth, 'to', newWidth, '~')\r\n\t\t\t\t// `stateUpdate` doesn't get passed to `this.onResize()`, and, therefore,\r\n\t\t\t\t// won't be applied. But that's ok because currently it could only contain:\r\n\t\t\t\t// * `scrollableContainerWidth`\r\n\t\t\t\t// * `verticalSpacing`\r\n\t\t\t\t// * `beforeResize`\r\n\t\t\t\t// All of those get rewritten in `onResize()` anyway.\r\n\t\t\t\treturn this.onResize()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If the `VirtualScroller` uses custom (external) state storage, then\r\n\t\t// check if the columns count has changed between calling `.getInitialState()`\r\n\t\t// and `.start()`. If it has, perform a re-layout \"from scratch\".\r\n\t\tif (this._usesCustomStateStorage) {\r\n\t\t\tconst columnsCount = this.getActualColumnsCount()\r\n\t\t\tconst columnsCountFromState = this.getState().columnsCount || 1\r\n\t\t\tif (columnsCount !== columnsCountFromState) {\r\n\t\t\t\treturn this.onResize()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Re-calculate layout and re-render the list.\r\n\t\t// Do that even if when an initial `state` parameter, containing layout values,\r\n\t\t// has been passed. The reason is that the `state` parameter can't be \"trusted\"\r\n\t\t// in a way that it could have been snapshotted for another window width and\r\n\t\t// the user might have resized their window since then.\r\n\t\tthis.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.STARTED, stateUpdate })\r\n\t}\r\n\r\n\t// Could be passed as a \"callback\" parameter, so bind it to `this`.\r\n\tstop = () => {\r\n\t\tif (!this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] Can\\'t stop a `VirtualScroller` that hasn\\'t been started')\r\n\t\t}\r\n\r\n\t\tthis._isActive = false\r\n\r\n\t\tlog('~ Stop ~')\r\n\r\n\t\tthis.resize.stop()\r\n\t\tthis.scroll.stop()\r\n\r\n\t\t// Stop `ListTopOffsetWatcher` if it has been started.\r\n\t\t// There seems to be no need to restart `ListTopOffsetWatcher`.\r\n\t\t// It's mainly a hacky workaround for development mode anyway.\r\n\t\tif (this.listTopOffsetWatcher && this.listTopOffsetWatcher.isStarted()) {\r\n\t\t\tthis.listTopOffsetWatcher.stop()\r\n\t\t}\r\n\r\n\t\t// Cancel any scheduled layout.\r\n\t\tthis.cancelLayoutTimer({})\r\n\t}\r\n\r\n\thasToBeStarted() {\r\n\t\tif (!this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] `VirtualScroller` hasn\\'t been started')\r\n\t\t}\r\n\t}\r\n\r\n\t// Bind it to `this` because this function could hypothetically be passed\r\n\t// as a \"callback\" parameter.\r\n\tupdateLayout = () => {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.MANUAL })\r\n\t}\r\n\r\n\t// Bind the function to `this` so that it could be passed as a callback\r\n\t// in a random application's code.\r\n\tonRender = () => {\r\n\t\tthis._onRender(this.getState(), this.previousState)\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the items's top offset relative to the scrollable container's top edge.\r\n\t * @param {number} i — Item index\r\n\t * @return {[number]} Returns the item's scroll Y position. Returns `undefined` if any of the previous items haven't been rendered yet.\r\n\t */\r\n\tgetItemScrollPosition(i) {\r\n\t\tconst itemTopOffsetInList = this.layout.getItemTopOffset(i)\r\n\t\tif (itemTopOffsetInList === undefined) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\treturn this.getListTopOffsetInsideScrollableContainer() + itemTopOffsetInList\r\n\t}\r\n\r\n\t/**\r\n\t * Forces a re-measure of an item's height.\r\n\t * @param {number} i — Item index\r\n\t */\r\n\tonItemHeightChange(i) {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis._onItemHeightChange(i)\r\n\t}\r\n\r\n\t/**\r\n\t * Updates an item's state in `state.itemStates[]`.\r\n\t * @param {number} i — Item index\r\n\t * @param {any} i — Item's new state\r\n\t */\r\n\tonItemStateChange(i, newItemState) {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis._onItemStateChange(i, newItemState)\r\n\t}\r\n\r\n\t/**\r\n\t * Updates `items`. For example, can prepend or append new items to the list.\r\n\t * @param {any[]} newItems\r\n\t * @param {boolean} [options.preserveScrollPositionOnPrependItems] — Set to `true` to enable \"restore scroll position after prepending items\" feature (could be useful when implementing \"Show previous items\" button).\r\n\t */\r\n\tsetItems(newItems, options = {}) {\r\n\t\tthis.hasToBeStarted()\r\n\t\treturn this._setItems(newItems, options)\r\n\t}\r\n}"],"mappings":"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"}
|
|
@@ -196,7 +196,14 @@ function VirtualScroller(_ref, ref) {
|
|
|
196
196
|
style: style
|
|
197
197
|
}), renderedItems.map(function (item, i) {
|
|
198
198
|
if (i >= firstShownItemIndex && i <= lastShownItemIndex) {
|
|
199
|
-
|
|
199
|
+
// Passing `item` as `children` property is legacy and is deprecated.
|
|
200
|
+
// If version `2.x` is published in some hypothetical future,
|
|
201
|
+
// the `item` and `itemIndex` properties should be moved below
|
|
202
|
+
// `{...itemComponentProps}`.
|
|
203
|
+
return /*#__PURE__*/_react["default"].createElement(Component, _extends({
|
|
204
|
+
item: item,
|
|
205
|
+
itemIndex: i
|
|
206
|
+
}, itemComponentProps, {
|
|
200
207
|
key: getItemKey(item, i),
|
|
201
208
|
state: itemStates && itemStates[i],
|
|
202
209
|
onStateChange: getOnItemStateChange(i),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualScroller.js","names":["VirtualScroller","ref","AsComponent","as","items","Component","itemComponent","itemComponentProps","estimatedItemHeight","bypass","tbody","preserveScrollPosition","preserveScrollPositionOnPrependItems","measureItemsBatchSize","scrollableContainer","getScrollableContainer","getColumnsCount","getItemId","className","onMount","onItemFirstRender","onItemInitialRender","initialScrollPosition","onScrollPositionChange","onStateChange","initialState","rest","container","useRef","virtualScroller","useVirtualScroller","_initialState","useMemo","getInitialState","useState","onRender","getState","updateState","useVirtualScrollerStartStop","useItemKeys","getItemKey","updateItemKeysForNewItems","getOnItemStateChange","useOnItemStateChange","getOnItemHeightChange","useOnItemHeightChange","useHandleItemsChange","useInstanceMethods","useLayoutEffect","useClassName","style","useStyle","renderedItems","itemStates","firstShownItemIndex","lastShownItemIndex","map","item","i","React","forwardRef","elementType","PropTypes","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 useOnItemStateChange from './useOnItemStateChange.js'\r\nimport useOnItemHeightChange from './useOnItemHeightChange.js'\r\nimport useHandleItemsChange from './useHandleItemsChange.js'\r\nimport useClassName from './useClassName.js'\r\nimport useStyle from './useStyle.js'\r\n\r\nfunction VirtualScroller({\r\n\tas: AsComponent,\r\n\titems,\r\n\titemComponent: Component,\r\n\titemComponentProps,\r\n\testimatedItemHeight,\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\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,\r\n\t\testimatedItemHeight,\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\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// Create state management functions.\r\n\tconst {\r\n\t\tgetState,\r\n\t\tupdateState\r\n\t} = useState({\r\n\t\tinitialState: _initialState,\r\n\t\tonRender: virtualScroller.onRender,\r\n\t\titems\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 `onItemStateChange` functions' \"references\"\r\n\t// so that item components don't get re-rendered needlessly.\r\n\tconst getOnItemStateChange = useOnItemStateChange({\r\n\t\titems,\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\titems,\r\n\t\tvirtualScroller\r\n\t})\r\n\r\n\t// Detect if `items` have changed.\r\n\tuseHandleItemsChange(items, {\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\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\tvirtualScroller\r\n\t})\r\n\r\n\tconst {\r\n\t\titems: renderedItems,\r\n\t\titemStates,\r\n\t\tfirstShownItemIndex,\r\n\t\tlastShownItemIndex\r\n\t} = virtualScroller.getState()\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{renderedItems.map((item, i) => {\r\n\t\t\t\tif (i >= firstShownItemIndex && i <= lastShownItemIndex) {\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t<Component\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\tonStateChange={getOnItemStateChange(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\testimatedItemHeight: PropTypes.number,\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),\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}\r\n\r\nVirtualScroller.defaultProps = {\r\n\tas: 'div'\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VirtualScroller.js","names":["VirtualScroller","ref","AsComponent","as","items","Component","itemComponent","itemComponentProps","estimatedItemHeight","bypass","tbody","preserveScrollPosition","preserveScrollPositionOnPrependItems","measureItemsBatchSize","scrollableContainer","getScrollableContainer","getColumnsCount","getItemId","className","onMount","onItemFirstRender","onItemInitialRender","initialScrollPosition","onScrollPositionChange","onStateChange","initialState","rest","container","useRef","virtualScroller","useVirtualScroller","_initialState","useMemo","getInitialState","useState","onRender","getState","updateState","useVirtualScrollerStartStop","useItemKeys","getItemKey","updateItemKeysForNewItems","getOnItemStateChange","useOnItemStateChange","getOnItemHeightChange","useOnItemHeightChange","useHandleItemsChange","useInstanceMethods","useLayoutEffect","useClassName","style","useStyle","renderedItems","itemStates","firstShownItemIndex","lastShownItemIndex","map","item","i","React","forwardRef","elementType","PropTypes","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 useOnItemStateChange from './useOnItemStateChange.js'\r\nimport useOnItemHeightChange from './useOnItemHeightChange.js'\r\nimport useHandleItemsChange from './useHandleItemsChange.js'\r\nimport useClassName from './useClassName.js'\r\nimport useStyle from './useStyle.js'\r\n\r\nfunction VirtualScroller({\r\n\tas: AsComponent,\r\n\titems,\r\n\titemComponent: Component,\r\n\titemComponentProps,\r\n\testimatedItemHeight,\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\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,\r\n\t\testimatedItemHeight,\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\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// Create state management functions.\r\n\tconst {\r\n\t\tgetState,\r\n\t\tupdateState\r\n\t} = useState({\r\n\t\tinitialState: _initialState,\r\n\t\tonRender: virtualScroller.onRender,\r\n\t\titems\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 `onItemStateChange` functions' \"references\"\r\n\t// so that item components don't get re-rendered needlessly.\r\n\tconst getOnItemStateChange = useOnItemStateChange({\r\n\t\titems,\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\titems,\r\n\t\tvirtualScroller\r\n\t})\r\n\r\n\t// Detect if `items` have changed.\r\n\tuseHandleItemsChange(items, {\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\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\tvirtualScroller\r\n\t})\r\n\r\n\tconst {\r\n\t\titems: renderedItems,\r\n\t\titemStates,\r\n\t\tfirstShownItemIndex,\r\n\t\tlastShownItemIndex\r\n\t} = virtualScroller.getState()\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{renderedItems.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\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\tonStateChange={getOnItemStateChange(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\testimatedItemHeight: PropTypes.number,\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),\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}\r\n\r\nVirtualScroller.defaultProps = {\r\n\tas: 'div'\r\n}\r\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHandleItemsChange.js","names":["useHandleItemsChange","items","virtualScroller","preserveScrollPosition","preserveScrollPositionOnPrependItems","updateItemKeysForNewItems","getState","renderedItems","firstShownItemIndex","previousItems","useRef","hasItemsPropertyChanged","current","itemsHaveChanged","shouldUpdateItemKeys","itemsDiff","getItemsDiff","prependedItemsCount","appendedItemsCount","setItems"],"sources":["../../source/react/useHandleItemsChange.js"],"sourcesContent":["import { useRef
|
|
1
|
+
{"version":3,"file":"useHandleItemsChange.js","names":["useHandleItemsChange","items","virtualScroller","preserveScrollPosition","preserveScrollPositionOnPrependItems","updateItemKeysForNewItems","getState","renderedItems","firstShownItemIndex","previousItems","useRef","hasItemsPropertyChanged","current","itemsHaveChanged","shouldUpdateItemKeys","itemsDiff","getItemsDiff","prependedItemsCount","appendedItemsCount","setItems"],"sources":["../../source/react/useHandleItemsChange.js"],"sourcesContent":["import { useRef } from 'react'\r\n\r\n// If new `items` are 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\n// * Re-generate the React `key` prefix for item elements\r\n// so that all item components are re-rendered for the new `items` list.\r\n// That's because item components may have their own internal state,\r\n// and simply passing another `item` property for an item component\r\n// might result in bugs, which React would do with its \"re-using\" policy\r\n// if the unique `key` workaround hasn't been used.\r\n//\r\nexport default function useHandleItemsChange(items, {\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\tupdateItemKeysForNewItems\r\n}) {\r\n\tconst {\r\n\t\titems: renderedItems,\r\n\t\tfirstShownItemIndex\r\n\t} = virtualScroller.getState()\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\tconst previousItems = useRef(items)\r\n\tconst hasItemsPropertyChanged = items !== previousItems.current\r\n\tpreviousItems.current = items\r\n\tif (hasItemsPropertyChanged) {\r\n\t\tlet itemsHaveChanged = true\r\n\t\tlet shouldUpdateItemKeys = true\r\n\t\tconst itemsDiff = virtualScroller.getItemsDiff(renderedItems, items)\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 haven't changed. No need to re-generate\r\n\t\t\t\t// the `key` prefix or to snapshot the Y scroll position.\r\n\t\t\t\titemsHaveChanged = false\r\n\t\t\t\tshouldUpdateItemKeys = false\r\n\t\t\t}\r\n\t\t\telse if (prependedItemsCount === 0 && appendedItemsCount > 0) {\r\n\t\t\t\t// Just some items got appended. No need to re-generate\r\n\t\t\t\t// the `key` prefix or to snapshot the Y scroll position.\r\n\t\t\t\tshouldUpdateItemKeys = false\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (itemsHaveChanged) {\r\n\t\t\t// Set the new `items`.\r\n\t\t\tvirtualScroller.setItems(items, {\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\r\n\t\t\t// Update React element `key`s for the new set of `items`.\r\n\t\t\tif (shouldUpdateItemKeys) {\r\n\t\t\t\tupdateItemKeysForNewItems()\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}"],"mappings":";;;;;;;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASA,oBAAT,CAA8BC,KAA9B,QAOZ;EAAA,IANFC,eAME,QANFA,eAME;EAAA,IAHFC,sBAGE,QAHFA,sBAGE;EAAA,IAFFC,oCAEE,QAFFA,oCAEE;EAAA,IADFC,yBACE,QADFA,yBACE;;EACF,4BAGIH,eAAe,CAACI,QAAhB,EAHJ;EAAA,IACQC,aADR,yBACCN,KADD;EAAA,IAECO,mBAFD,yBAECA,mBAFD,CADE,CAMF;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;;;EAEA,IAAMC,aAAa,GAAG,IAAAC,aAAA,EAAOT,KAAP,CAAtB;EACA,IAAMU,uBAAuB,GAAGV,KAAK,KAAKQ,aAAa,CAACG,OAAxD;EACAH,aAAa,CAACG,OAAd,GAAwBX,KAAxB;;EACA,IAAIU,uBAAJ,EAA6B;IAC5B,IAAIE,gBAAgB,GAAG,IAAvB;IACA,IAAIC,oBAAoB,GAAG,IAA3B;IACA,IAAMC,SAAS,GAAGb,eAAe,CAACc,YAAhB,CAA6BT,aAA7B,EAA4CN,KAA5C,CAAlB,CAH4B,CAI5B;;IACA,IAAIc,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;QACAL,gBAAgB,GAAG,KAAnB;QACAC,oBAAoB,GAAG,KAAvB;MACA,CALD,MAMK,IAAIG,mBAAmB,KAAK,CAAxB,IAA6BC,kBAAkB,GAAG,CAAtD,EAAyD;QAC7D;QACA;QACAJ,oBAAoB,GAAG,KAAvB;MACA;IACD;;IAED,IAAID,gBAAJ,EAAsB;MACrB;MACAX,eAAe,CAACiB,QAAhB,CAAyBlB,KAAzB,EAAgC;QAC/B;QACA;QACAG,oCAAoC,EAAEA,oCAAoC,IAAID;MAH/C,CAAhC,EAFqB,CAQrB;;MACA,IAAIW,oBAAJ,EAA0B;QACzBT,yBAAyB;MACzB;IACD;EACD;AACD"}
|
package/dom/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export { State, ItemState } from '../index.d.ts';
|
|
|
4
4
|
|
|
5
5
|
import * as React from 'react';
|
|
6
6
|
|
|
7
|
-
interface Options<Item> extends VirtualScrollerCommonOptions<
|
|
7
|
+
interface Options<Item> extends VirtualScrollerCommonOptions<Item> {
|
|
8
8
|
state?: State<Item>;
|
|
9
9
|
scrollableContainer?: HTMLElement;
|
|
10
10
|
onItemUnmount?(): void;
|
package/index.d.ts
CHANGED
|
@@ -49,7 +49,7 @@ interface ScrollableContainerArgument {
|
|
|
49
49
|
getWidth(): number;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
export interface VirtualScrollerCommonOptions<
|
|
52
|
+
export interface VirtualScrollerCommonOptions<Item> {
|
|
53
53
|
bypass?: boolean;
|
|
54
54
|
onStateChange?(newState: State<Item>);
|
|
55
55
|
measureItemsBatchSize?: number;
|
|
@@ -61,7 +61,7 @@ export interface VirtualScrollerCommonOptions<Element, Item> {
|
|
|
61
61
|
getColumnsCount?(scrollableContainer: ScrollableContainerArgument): number;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
interface Options<Element, Item> extends VirtualScrollerCommonOptions<
|
|
64
|
+
interface Options<Element, Item> extends VirtualScrollerCommonOptions<Item> {
|
|
65
65
|
state?: State<Item>;
|
|
66
66
|
render?(state: State<Item>, previousState?: State<Item>): void;
|
|
67
67
|
engine?: Engine<Element>;
|
|
@@ -96,4 +96,4 @@ export default class VirtualScroller<Element, Item> {
|
|
|
96
96
|
getItemScrollPosition(i: number): number | undefined;
|
|
97
97
|
getInitialState(): State<Item>;
|
|
98
98
|
useState(options: UseStateOptions<Item>): void;
|
|
99
|
-
}
|
|
99
|
+
}
|
|
@@ -82,7 +82,7 @@ var VirtualScroller = /*#__PURE__*/function () {
|
|
|
82
82
|
var isRestart = this._isActive === false;
|
|
83
83
|
|
|
84
84
|
if (!isRestart) {
|
|
85
|
-
// If no custom
|
|
85
|
+
// If no custom state storage has been configured, use the default one.
|
|
86
86
|
// Also sets the initial state.
|
|
87
87
|
if (!this._usesCustomStateStorage) {
|
|
88
88
|
this.useDefaultStateStorage();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualScroller.js","names":["VirtualScrollerConstructor","hasTbodyStyles","addTbodyStyles","LAYOUT_REASON","log","VirtualScroller","getItemsContainerElement","items","options","_isActive","Error","resize","stop","scroll","listTopOffsetWatcher","isStarted","cancelLayoutTimer","hasToBeStarted","onUpdateShownItemIndexes","reason","MANUAL","_onRender","getState","previousState","call","isRestart","_usesCustomStateStorage","useDefaultStateStorage","_render","listHeightMeasurement","reset","_isResizing","undefined","_isSettingNewItems","tbody","stateUpdate","_stoppedStateUpdate","verticalSpacing","verticalSpacingStateUpdate","measureItemHeightsAndSpacing","start","scrollableContainerWidth","scrollableContainer","getWidth","newWidth","prevWidth","onResize","columnsCount","getActualColumnsCount","columnsCountFromState","STARTED","i","itemTopOffsetInList","layout","getItemTopOffset","getListTopOffsetInsideScrollableContainer","_onItemHeightChange","newItemState","_onItemStateChange","newItems","_setItems"],"sources":["../source/VirtualScroller.js"],"sourcesContent":["import VirtualScrollerConstructor from './VirtualScroller.constructor.js'\r\nimport { hasTbodyStyles, addTbodyStyles } from './DOM/tbody.js'\r\nimport { LAYOUT_REASON } from './Layout.js'\r\nimport log from './utility/debug.js'\r\n\r\nexport default class VirtualScroller {\r\n\t/**\r\n\t * @param {function} getItemsContainerElement — Returns the container DOM `Element`.\r\n\t * @param {any[]} items — The list of items.\r\n\t * @param {Object} [options] — See README.md.\r\n\t * @return {VirtualScroller}\r\n\t */\r\n\tconstructor(\r\n\t\tgetItemsContainerElement,\r\n\t\titems,\r\n\t\toptions = {}\r\n\t) {\r\n\t\tVirtualScrollerConstructor.call(\r\n\t\t\tthis,\r\n\t\t\tgetItemsContainerElement,\r\n\t\t\titems,\r\n\t\t\toptions\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Should be invoked after a \"container\" DOM Element is mounted (inserted into the DOM tree).\r\n\t */\r\n\tstart() {\r\n\t\tif (this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] `VirtualScroller` has already been started')\r\n\t\t}\r\n\r\n\t\t// If has been stopped previously.\r\n\t\tconst isRestart = this._isActive === false\r\n\r\n\t\tif (!isRestart) {\r\n\t\t\t// If no custom one has been configured, uses the default one.\r\n\t\t\t// Also sets the initial state.\r\n\t\t\tif (!this._usesCustomStateStorage) {\r\n\t\t\t\tthis.useDefaultStateStorage()\r\n\t\t\t}\r\n\t\t\t// If `render()` function parameter was passed,\r\n\t\t\t// perform an initial render.\r\n\t\t\tif (this._render) {\r\n\t\t\t\tthis._render(this.getState())\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlog('~ Start ~')\r\n\r\n\t\t// `this._isActive = true` should be placed somewhere at the start of this function.\r\n\t\tthis._isActive = true\r\n\r\n\t\t// Reset `ListHeightMeasurement` just in case it has some \"leftover\" state.\r\n\t\tthis.listHeightMeasurement.reset()\r\n\r\n\t\t// Reset `_isResizing` flag just in case it has some \"leftover\" value.\r\n\t\tthis._isResizing = undefined\r\n\r\n\t\t// Reset `_isSettingNewItems` flag just in case it has some \"leftover\" value.\r\n\t\tthis._isSettingNewItems = undefined\r\n\r\n\t\t// Work around `<tbody/>` not being able to have `padding`.\r\n\t\t// https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n\t\tif (this.tbody) {\r\n\t\t\tif (!hasTbodyStyles(this.getItemsContainerElement())) {\r\n\t\t\t\taddTbodyStyles(this.getItemsContainerElement())\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If there was a pending state update that didn't get applied\r\n\t\t// because of stopping the `VirtualScroller`, apply that state update now.\r\n\t\t//\r\n\t\t// The pending state update won't get applied if the scrollable container width\r\n\t\t// has changed but that's ok because that state update currently could only contain:\r\n\t\t// * `scrollableContainerWidth`\r\n\t\t// * `verticalSpacing`\r\n\t\t// * `beforeResize`\r\n\t\t// All of those get rewritten in `onResize()` anyway.\r\n\t\t//\r\n\t\tlet stateUpdate = this._stoppedStateUpdate\r\n\t\tthis._stoppedStateUpdate = undefined\r\n\r\n\t\t// Reset `this.verticalSpacing` so that it re-measures it in cases when\r\n\t\t// the `VirtualScroller` was previously stopped and is now being restarted.\r\n\t\t// The rationale is that a previously captured inter-item vertical spacing\r\n\t\t// can't be \"trusted\" in a sense that the user might have resized the window\r\n\t\t// after the previous `state` has been snapshotted.\r\n\t\t// If the user has resized the window, then changing window width might have\r\n\t\t// activated different CSS `@media()` \"queries\" resulting in a potentially different\r\n\t\t// vertical spacing after the restart.\r\n\t\t// If it's not a restart then `this.verticalSpacing` is `undefined` anyway.\r\n\t\tthis.verticalSpacing = undefined\r\n\r\n\t\tconst verticalSpacingStateUpdate = this.measureItemHeightsAndSpacing()\r\n\t\tif (verticalSpacingStateUpdate) {\r\n\t\t\tstateUpdate = {\r\n\t\t\t\t...stateUpdate,\r\n\t\t\t\t...verticalSpacingStateUpdate\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.resize.start()\r\n\t\tthis.scroll.start()\r\n\r\n\t\t// If `scrollableContainerWidth` hasn't been measured yet,\r\n\t\t// measure it and write it to state.\r\n\t\tif (this.getState().scrollableContainerWidth === undefined) {\r\n\t\t\tconst scrollableContainerWidth = this.scrollableContainer.getWidth()\r\n\t\t\tstateUpdate = {\r\n\t\t\t\t...stateUpdate,\r\n\t\t\t\tscrollableContainerWidth\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// Reset layout:\r\n\t\t\t// * If the scrollable container width has changed while stopped.\r\n\t\t\t// * If the restored state was calculated for another scrollable container width.\r\n\t\t\tconst newWidth = this.scrollableContainer.getWidth()\r\n\t\t\tconst prevWidth = this.getState().scrollableContainerWidth\r\n\t\t\tif (newWidth !== prevWidth) {\r\n\t\t\t\tlog('~ Scrollable container width changed from', prevWidth, 'to', newWidth, '~')\r\n\t\t\t\t// `stateUpdate` doesn't get passed to `this.onResize()`, and, therefore,\r\n\t\t\t\t// won't be applied. But that's ok because currently it could only contain:\r\n\t\t\t\t// * `scrollableContainerWidth`\r\n\t\t\t\t// * `verticalSpacing`\r\n\t\t\t\t// * `beforeResize`\r\n\t\t\t\t// All of those get rewritten in `onResize()` anyway.\r\n\t\t\t\treturn this.onResize()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If the `VirtualScroller` uses custom (external) state storage, then\r\n\t\t// check if the columns count has changed between calling `.getInitialState()`\r\n\t\t// and `.start()`. If it has, perform a re-layout \"from scratch\".\r\n\t\tif (this._usesCustomStateStorage) {\r\n\t\t\tconst columnsCount = this.getActualColumnsCount()\r\n\t\t\tconst columnsCountFromState = this.getState().columnsCount || 1\r\n\t\t\tif (columnsCount !== columnsCountFromState) {\r\n\t\t\t\treturn this.onResize()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Re-calculate layout and re-render the list.\r\n\t\t// Do that even if when an initial `state` parameter, containing layout values,\r\n\t\t// has been passed. The reason is that the `state` parameter can't be \"trusted\"\r\n\t\t// in a way that it could have been snapshotted for another window width and\r\n\t\t// the user might have resized their window since then.\r\n\t\tthis.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.STARTED, stateUpdate })\r\n\t}\r\n\r\n\t// Could be passed as a \"callback\" parameter, so bind it to `this`.\r\n\tstop = () => {\r\n\t\tif (!this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] Can\\'t stop a `VirtualScroller` that hasn\\'t been started')\r\n\t\t}\r\n\r\n\t\tthis._isActive = false\r\n\r\n\t\tlog('~ Stop ~')\r\n\r\n\t\tthis.resize.stop()\r\n\t\tthis.scroll.stop()\r\n\r\n\t\t// Stop `ListTopOffsetWatcher` if it has been started.\r\n\t\t// There seems to be no need to restart `ListTopOffsetWatcher`.\r\n\t\t// It's mainly a hacky workaround for development mode anyway.\r\n\t\tif (this.listTopOffsetWatcher && this.listTopOffsetWatcher.isStarted()) {\r\n\t\t\tthis.listTopOffsetWatcher.stop()\r\n\t\t}\r\n\r\n\t\t// Cancel any scheduled layout.\r\n\t\tthis.cancelLayoutTimer({})\r\n\t}\r\n\r\n\thasToBeStarted() {\r\n\t\tif (!this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] `VirtualScroller` hasn\\'t been started')\r\n\t\t}\r\n\t}\r\n\r\n\t// Bind it to `this` because this function could hypothetically be passed\r\n\t// as a \"callback\" parameter.\r\n\tupdateLayout = () => {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.MANUAL })\r\n\t}\r\n\r\n\t// Bind the function to `this` so that it could be passed as a callback\r\n\t// in a random application's code.\r\n\tonRender = () => {\r\n\t\tthis._onRender(this.getState(), this.previousState)\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the items's top offset relative to the scrollable container's top edge.\r\n\t * @param {number} i — Item index\r\n\t * @return {[number]} Returns the item's scroll Y position. Returns `undefined` if any of the previous items haven't been rendered yet.\r\n\t */\r\n\tgetItemScrollPosition(i) {\r\n\t\tconst itemTopOffsetInList = this.layout.getItemTopOffset(i)\r\n\t\tif (itemTopOffsetInList === undefined) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\treturn this.getListTopOffsetInsideScrollableContainer() + itemTopOffsetInList\r\n\t}\r\n\r\n\t/**\r\n\t * Forces a re-measure of an item's height.\r\n\t * @param {number} i — Item index\r\n\t */\r\n\tonItemHeightChange(i) {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis._onItemHeightChange(i)\r\n\t}\r\n\r\n\t/**\r\n\t * Updates an item's state in `state.itemStates[]`.\r\n\t * @param {number} i — Item index\r\n\t * @param {any} i — Item's new state\r\n\t */\r\n\tonItemStateChange(i, newItemState) {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis._onItemStateChange(i, newItemState)\r\n\t}\r\n\r\n\t/**\r\n\t * Updates `items`. For example, can prepend or append new items to the list.\r\n\t * @param {any[]} newItems\r\n\t * @param {boolean} [options.preserveScrollPositionOnPrependItems] — Set to `true` to enable \"restore scroll position after prepending items\" feature (could be useful when implementing \"Show previous items\" button).\r\n\t */\r\n\tsetItems(newItems, options = {}) {\r\n\t\tthis.hasToBeStarted()\r\n\t\treturn this._setItems(newItems, options)\r\n\t}\r\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VirtualScroller.js","names":["VirtualScrollerConstructor","hasTbodyStyles","addTbodyStyles","LAYOUT_REASON","log","VirtualScroller","getItemsContainerElement","items","options","_isActive","Error","resize","stop","scroll","listTopOffsetWatcher","isStarted","cancelLayoutTimer","hasToBeStarted","onUpdateShownItemIndexes","reason","MANUAL","_onRender","getState","previousState","call","isRestart","_usesCustomStateStorage","useDefaultStateStorage","_render","listHeightMeasurement","reset","_isResizing","undefined","_isSettingNewItems","tbody","stateUpdate","_stoppedStateUpdate","verticalSpacing","verticalSpacingStateUpdate","measureItemHeightsAndSpacing","start","scrollableContainerWidth","scrollableContainer","getWidth","newWidth","prevWidth","onResize","columnsCount","getActualColumnsCount","columnsCountFromState","STARTED","i","itemTopOffsetInList","layout","getItemTopOffset","getListTopOffsetInsideScrollableContainer","_onItemHeightChange","newItemState","_onItemStateChange","newItems","_setItems"],"sources":["../source/VirtualScroller.js"],"sourcesContent":["import VirtualScrollerConstructor from './VirtualScroller.constructor.js'\r\nimport { hasTbodyStyles, addTbodyStyles } from './DOM/tbody.js'\r\nimport { LAYOUT_REASON } from './Layout.js'\r\nimport log from './utility/debug.js'\r\n\r\nexport default class VirtualScroller {\r\n\t/**\r\n\t * @param {function} getItemsContainerElement — Returns the container DOM `Element`.\r\n\t * @param {any[]} items — The list of items.\r\n\t * @param {Object} [options] — See README.md.\r\n\t * @return {VirtualScroller}\r\n\t */\r\n\tconstructor(\r\n\t\tgetItemsContainerElement,\r\n\t\titems,\r\n\t\toptions = {}\r\n\t) {\r\n\t\tVirtualScrollerConstructor.call(\r\n\t\t\tthis,\r\n\t\t\tgetItemsContainerElement,\r\n\t\t\titems,\r\n\t\t\toptions\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Should be invoked after a \"container\" DOM Element is mounted (inserted into the DOM tree).\r\n\t */\r\n\tstart() {\r\n\t\tif (this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] `VirtualScroller` has already been started')\r\n\t\t}\r\n\r\n\t\t// If has been stopped previously.\r\n\t\tconst isRestart = this._isActive === false\r\n\r\n\t\tif (!isRestart) {\r\n\t\t\t// If no custom state storage has been configured, use the default one.\r\n\t\t\t// Also sets the initial state.\r\n\t\t\tif (!this._usesCustomStateStorage) {\r\n\t\t\t\tthis.useDefaultStateStorage()\r\n\t\t\t}\r\n\t\t\t// If `render()` function parameter was passed,\r\n\t\t\t// perform an initial render.\r\n\t\t\tif (this._render) {\r\n\t\t\t\tthis._render(this.getState())\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlog('~ Start ~')\r\n\r\n\t\t// `this._isActive = true` should be placed somewhere at the start of this function.\r\n\t\tthis._isActive = true\r\n\r\n\t\t// Reset `ListHeightMeasurement` just in case it has some \"leftover\" state.\r\n\t\tthis.listHeightMeasurement.reset()\r\n\r\n\t\t// Reset `_isResizing` flag just in case it has some \"leftover\" value.\r\n\t\tthis._isResizing = undefined\r\n\r\n\t\t// Reset `_isSettingNewItems` flag just in case it has some \"leftover\" value.\r\n\t\tthis._isSettingNewItems = undefined\r\n\r\n\t\t// Work around `<tbody/>` not being able to have `padding`.\r\n\t\t// https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n\t\tif (this.tbody) {\r\n\t\t\tif (!hasTbodyStyles(this.getItemsContainerElement())) {\r\n\t\t\t\taddTbodyStyles(this.getItemsContainerElement())\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If there was a pending state update that didn't get applied\r\n\t\t// because of stopping the `VirtualScroller`, apply that state update now.\r\n\t\t//\r\n\t\t// The pending state update won't get applied if the scrollable container width\r\n\t\t// has changed but that's ok because that state update currently could only contain:\r\n\t\t// * `scrollableContainerWidth`\r\n\t\t// * `verticalSpacing`\r\n\t\t// * `beforeResize`\r\n\t\t// All of those get rewritten in `onResize()` anyway.\r\n\t\t//\r\n\t\tlet stateUpdate = this._stoppedStateUpdate\r\n\t\tthis._stoppedStateUpdate = undefined\r\n\r\n\t\t// Reset `this.verticalSpacing` so that it re-measures it in cases when\r\n\t\t// the `VirtualScroller` was previously stopped and is now being restarted.\r\n\t\t// The rationale is that a previously captured inter-item vertical spacing\r\n\t\t// can't be \"trusted\" in a sense that the user might have resized the window\r\n\t\t// after the previous `state` has been snapshotted.\r\n\t\t// If the user has resized the window, then changing window width might have\r\n\t\t// activated different CSS `@media()` \"queries\" resulting in a potentially different\r\n\t\t// vertical spacing after the restart.\r\n\t\t// If it's not a restart then `this.verticalSpacing` is `undefined` anyway.\r\n\t\tthis.verticalSpacing = undefined\r\n\r\n\t\tconst verticalSpacingStateUpdate = this.measureItemHeightsAndSpacing()\r\n\t\tif (verticalSpacingStateUpdate) {\r\n\t\t\tstateUpdate = {\r\n\t\t\t\t...stateUpdate,\r\n\t\t\t\t...verticalSpacingStateUpdate\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.resize.start()\r\n\t\tthis.scroll.start()\r\n\r\n\t\t// If `scrollableContainerWidth` hasn't been measured yet,\r\n\t\t// measure it and write it to state.\r\n\t\tif (this.getState().scrollableContainerWidth === undefined) {\r\n\t\t\tconst scrollableContainerWidth = this.scrollableContainer.getWidth()\r\n\t\t\tstateUpdate = {\r\n\t\t\t\t...stateUpdate,\r\n\t\t\t\tscrollableContainerWidth\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// Reset layout:\r\n\t\t\t// * If the scrollable container width has changed while stopped.\r\n\t\t\t// * If the restored state was calculated for another scrollable container width.\r\n\t\t\tconst newWidth = this.scrollableContainer.getWidth()\r\n\t\t\tconst prevWidth = this.getState().scrollableContainerWidth\r\n\t\t\tif (newWidth !== prevWidth) {\r\n\t\t\t\tlog('~ Scrollable container width changed from', prevWidth, 'to', newWidth, '~')\r\n\t\t\t\t// `stateUpdate` doesn't get passed to `this.onResize()`, and, therefore,\r\n\t\t\t\t// won't be applied. But that's ok because currently it could only contain:\r\n\t\t\t\t// * `scrollableContainerWidth`\r\n\t\t\t\t// * `verticalSpacing`\r\n\t\t\t\t// * `beforeResize`\r\n\t\t\t\t// All of those get rewritten in `onResize()` anyway.\r\n\t\t\t\treturn this.onResize()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If the `VirtualScroller` uses custom (external) state storage, then\r\n\t\t// check if the columns count has changed between calling `.getInitialState()`\r\n\t\t// and `.start()`. If it has, perform a re-layout \"from scratch\".\r\n\t\tif (this._usesCustomStateStorage) {\r\n\t\t\tconst columnsCount = this.getActualColumnsCount()\r\n\t\t\tconst columnsCountFromState = this.getState().columnsCount || 1\r\n\t\t\tif (columnsCount !== columnsCountFromState) {\r\n\t\t\t\treturn this.onResize()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Re-calculate layout and re-render the list.\r\n\t\t// Do that even if when an initial `state` parameter, containing layout values,\r\n\t\t// has been passed. The reason is that the `state` parameter can't be \"trusted\"\r\n\t\t// in a way that it could have been snapshotted for another window width and\r\n\t\t// the user might have resized their window since then.\r\n\t\tthis.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.STARTED, stateUpdate })\r\n\t}\r\n\r\n\t// Could be passed as a \"callback\" parameter, so bind it to `this`.\r\n\tstop = () => {\r\n\t\tif (!this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] Can\\'t stop a `VirtualScroller` that hasn\\'t been started')\r\n\t\t}\r\n\r\n\t\tthis._isActive = false\r\n\r\n\t\tlog('~ Stop ~')\r\n\r\n\t\tthis.resize.stop()\r\n\t\tthis.scroll.stop()\r\n\r\n\t\t// Stop `ListTopOffsetWatcher` if it has been started.\r\n\t\t// There seems to be no need to restart `ListTopOffsetWatcher`.\r\n\t\t// It's mainly a hacky workaround for development mode anyway.\r\n\t\tif (this.listTopOffsetWatcher && this.listTopOffsetWatcher.isStarted()) {\r\n\t\t\tthis.listTopOffsetWatcher.stop()\r\n\t\t}\r\n\r\n\t\t// Cancel any scheduled layout.\r\n\t\tthis.cancelLayoutTimer({})\r\n\t}\r\n\r\n\thasToBeStarted() {\r\n\t\tif (!this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] `VirtualScroller` hasn\\'t been started')\r\n\t\t}\r\n\t}\r\n\r\n\t// Bind it to `this` because this function could hypothetically be passed\r\n\t// as a \"callback\" parameter.\r\n\tupdateLayout = () => {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.MANUAL })\r\n\t}\r\n\r\n\t// Bind the function to `this` so that it could be passed as a callback\r\n\t// in a random application's code.\r\n\tonRender = () => {\r\n\t\tthis._onRender(this.getState(), this.previousState)\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the items's top offset relative to the scrollable container's top edge.\r\n\t * @param {number} i — Item index\r\n\t * @return {[number]} Returns the item's scroll Y position. Returns `undefined` if any of the previous items haven't been rendered yet.\r\n\t */\r\n\tgetItemScrollPosition(i) {\r\n\t\tconst itemTopOffsetInList = this.layout.getItemTopOffset(i)\r\n\t\tif (itemTopOffsetInList === undefined) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\treturn this.getListTopOffsetInsideScrollableContainer() + itemTopOffsetInList\r\n\t}\r\n\r\n\t/**\r\n\t * Forces a re-measure of an item's height.\r\n\t * @param {number} i — Item index\r\n\t */\r\n\tonItemHeightChange(i) {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis._onItemHeightChange(i)\r\n\t}\r\n\r\n\t/**\r\n\t * Updates an item's state in `state.itemStates[]`.\r\n\t * @param {number} i — Item index\r\n\t * @param {any} i — Item's new state\r\n\t */\r\n\tonItemStateChange(i, newItemState) {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis._onItemStateChange(i, newItemState)\r\n\t}\r\n\r\n\t/**\r\n\t * Updates `items`. For example, can prepend or append new items to the list.\r\n\t * @param {any[]} newItems\r\n\t * @param {boolean} [options.preserveScrollPositionOnPrependItems] — Set to `true` to enable \"restore scroll position after prepending items\" feature (could be useful when implementing \"Show previous items\" button).\r\n\t */\r\n\tsetItems(newItems, options = {}) {\r\n\t\tthis.hasToBeStarted()\r\n\t\treturn this._setItems(newItems, options)\r\n\t}\r\n}"],"mappings":"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"}
|
|
@@ -170,7 +170,14 @@ function VirtualScroller(_ref, ref) {
|
|
|
170
170
|
style: style
|
|
171
171
|
}), renderedItems.map(function (item, i) {
|
|
172
172
|
if (i >= firstShownItemIndex && i <= lastShownItemIndex) {
|
|
173
|
-
|
|
173
|
+
// Passing `item` as `children` property is legacy and is deprecated.
|
|
174
|
+
// If version `2.x` is published in some hypothetical future,
|
|
175
|
+
// the `item` and `itemIndex` properties should be moved below
|
|
176
|
+
// `{...itemComponentProps}`.
|
|
177
|
+
return /*#__PURE__*/React.createElement(Component, _extends({
|
|
178
|
+
item: item,
|
|
179
|
+
itemIndex: i
|
|
180
|
+
}, itemComponentProps, {
|
|
174
181
|
key: getItemKey(item, i),
|
|
175
182
|
state: itemStates && itemStates[i],
|
|
176
183
|
onStateChange: getOnItemStateChange(i),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualScroller.js","names":["React","useRef","useMemo","useLayoutEffect","PropTypes","useState","useVirtualScroller","useVirtualScrollerStartStop","useInstanceMethods","useItemKeys","useOnItemStateChange","useOnItemHeightChange","useHandleItemsChange","useClassName","useStyle","VirtualScroller","ref","AsComponent","as","items","Component","itemComponent","itemComponentProps","estimatedItemHeight","bypass","tbody","preserveScrollPosition","preserveScrollPositionOnPrependItems","measureItemsBatchSize","scrollableContainer","getScrollableContainer","getColumnsCount","getItemId","className","onMount","onItemFirstRender","onItemInitialRender","initialScrollPosition","onScrollPositionChange","onStateChange","initialState","rest","container","virtualScroller","_initialState","getInitialState","onRender","getState","updateState","getItemKey","updateItemKeysForNewItems","getOnItemStateChange","getOnItemHeightChange","style","renderedItems","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 useOnItemStateChange from './useOnItemStateChange.js'\r\nimport useOnItemHeightChange from './useOnItemHeightChange.js'\r\nimport useHandleItemsChange from './useHandleItemsChange.js'\r\nimport useClassName from './useClassName.js'\r\nimport useStyle from './useStyle.js'\r\n\r\nfunction VirtualScroller({\r\n\tas: AsComponent,\r\n\titems,\r\n\titemComponent: Component,\r\n\titemComponentProps,\r\n\testimatedItemHeight,\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\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,\r\n\t\testimatedItemHeight,\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\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// Create state management functions.\r\n\tconst {\r\n\t\tgetState,\r\n\t\tupdateState\r\n\t} = useState({\r\n\t\tinitialState: _initialState,\r\n\t\tonRender: virtualScroller.onRender,\r\n\t\titems\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 `onItemStateChange` functions' \"references\"\r\n\t// so that item components don't get re-rendered needlessly.\r\n\tconst getOnItemStateChange = useOnItemStateChange({\r\n\t\titems,\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\titems,\r\n\t\tvirtualScroller\r\n\t})\r\n\r\n\t// Detect if `items` have changed.\r\n\tuseHandleItemsChange(items, {\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\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\tvirtualScroller\r\n\t})\r\n\r\n\tconst {\r\n\t\titems: renderedItems,\r\n\t\titemStates,\r\n\t\tfirstShownItemIndex,\r\n\t\tlastShownItemIndex\r\n\t} = virtualScroller.getState()\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{renderedItems.map((item, i) => {\r\n\t\t\t\tif (i >= firstShownItemIndex && i <= lastShownItemIndex) {\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t<Component\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\tonStateChange={getOnItemStateChange(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\testimatedItemHeight: PropTypes.number,\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),\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}\r\n\r\nVirtualScroller.defaultProps = {\r\n\tas: 'div'\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VirtualScroller.js","names":["React","useRef","useMemo","useLayoutEffect","PropTypes","useState","useVirtualScroller","useVirtualScrollerStartStop","useInstanceMethods","useItemKeys","useOnItemStateChange","useOnItemHeightChange","useHandleItemsChange","useClassName","useStyle","VirtualScroller","ref","AsComponent","as","items","Component","itemComponent","itemComponentProps","estimatedItemHeight","bypass","tbody","preserveScrollPosition","preserveScrollPositionOnPrependItems","measureItemsBatchSize","scrollableContainer","getScrollableContainer","getColumnsCount","getItemId","className","onMount","onItemFirstRender","onItemInitialRender","initialScrollPosition","onScrollPositionChange","onStateChange","initialState","rest","container","virtualScroller","_initialState","getInitialState","onRender","getState","updateState","getItemKey","updateItemKeysForNewItems","getOnItemStateChange","getOnItemHeightChange","style","renderedItems","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 useOnItemStateChange from './useOnItemStateChange.js'\r\nimport useOnItemHeightChange from './useOnItemHeightChange.js'\r\nimport useHandleItemsChange from './useHandleItemsChange.js'\r\nimport useClassName from './useClassName.js'\r\nimport useStyle from './useStyle.js'\r\n\r\nfunction VirtualScroller({\r\n\tas: AsComponent,\r\n\titems,\r\n\titemComponent: Component,\r\n\titemComponentProps,\r\n\testimatedItemHeight,\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\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,\r\n\t\testimatedItemHeight,\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\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// Create state management functions.\r\n\tconst {\r\n\t\tgetState,\r\n\t\tupdateState\r\n\t} = useState({\r\n\t\tinitialState: _initialState,\r\n\t\tonRender: virtualScroller.onRender,\r\n\t\titems\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 `onItemStateChange` functions' \"references\"\r\n\t// so that item components don't get re-rendered needlessly.\r\n\tconst getOnItemStateChange = useOnItemStateChange({\r\n\t\titems,\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\titems,\r\n\t\tvirtualScroller\r\n\t})\r\n\r\n\t// Detect if `items` have changed.\r\n\tuseHandleItemsChange(items, {\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\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\tvirtualScroller\r\n\t})\r\n\r\n\tconst {\r\n\t\titems: renderedItems,\r\n\t\titemStates,\r\n\t\tfirstShownItemIndex,\r\n\t\tlastShownItemIndex\r\n\t} = virtualScroller.getState()\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{renderedItems.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\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\tonStateChange={getOnItemStateChange(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\testimatedItemHeight: PropTypes.number,\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),\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}\r\n\r\nVirtualScroller.defaultProps = {\r\n\tas: 'div'\r\n}\r\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useRef
|
|
1
|
+
import { useRef } from 'react'; // If new `items` are passed:
|
|
2
2
|
//
|
|
3
3
|
// * Store the scroll Y position for the first one of the current items
|
|
4
4
|
// so that it could potentially (in some cases) be restored after the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHandleItemsChange.js","names":["useRef","
|
|
1
|
+
{"version":3,"file":"useHandleItemsChange.js","names":["useRef","useHandleItemsChange","items","virtualScroller","preserveScrollPosition","preserveScrollPositionOnPrependItems","updateItemKeysForNewItems","getState","renderedItems","firstShownItemIndex","previousItems","hasItemsPropertyChanged","current","itemsHaveChanged","shouldUpdateItemKeys","itemsDiff","getItemsDiff","prependedItemsCount","appendedItemsCount","setItems"],"sources":["../../source/react/useHandleItemsChange.js"],"sourcesContent":["import { useRef } from 'react'\r\n\r\n// If new `items` are 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\n// * Re-generate the React `key` prefix for item elements\r\n// so that all item components are re-rendered for the new `items` list.\r\n// That's because item components may have their own internal state,\r\n// and simply passing another `item` property for an item component\r\n// might result in bugs, which React would do with its \"re-using\" policy\r\n// if the unique `key` workaround hasn't been used.\r\n//\r\nexport default function useHandleItemsChange(items, {\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\tupdateItemKeysForNewItems\r\n}) {\r\n\tconst {\r\n\t\titems: renderedItems,\r\n\t\tfirstShownItemIndex\r\n\t} = virtualScroller.getState()\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\tconst previousItems = useRef(items)\r\n\tconst hasItemsPropertyChanged = items !== previousItems.current\r\n\tpreviousItems.current = items\r\n\tif (hasItemsPropertyChanged) {\r\n\t\tlet itemsHaveChanged = true\r\n\t\tlet shouldUpdateItemKeys = true\r\n\t\tconst itemsDiff = virtualScroller.getItemsDiff(renderedItems, items)\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 haven't changed. No need to re-generate\r\n\t\t\t\t// the `key` prefix or to snapshot the Y scroll position.\r\n\t\t\t\titemsHaveChanged = false\r\n\t\t\t\tshouldUpdateItemKeys = false\r\n\t\t\t}\r\n\t\t\telse if (prependedItemsCount === 0 && appendedItemsCount > 0) {\r\n\t\t\t\t// Just some items got appended. No need to re-generate\r\n\t\t\t\t// the `key` prefix or to snapshot the Y scroll position.\r\n\t\t\t\tshouldUpdateItemKeys = false\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (itemsHaveChanged) {\r\n\t\t\t// Set the new `items`.\r\n\t\t\tvirtualScroller.setItems(items, {\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\r\n\t\t\t// Update React element `key`s for the new set of `items`.\r\n\t\t\tif (shouldUpdateItemKeys) {\r\n\t\t\t\tupdateItemKeysForNewItems()\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}"],"mappings":"AAAA,SAASA,MAAT,QAAuB,OAAvB,C,CAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,oBAAT,CAA8BC,KAA9B,QAOZ;EAAA,IANFC,eAME,QANFA,eAME;EAAA,IAHFC,sBAGE,QAHFA,sBAGE;EAAA,IAFFC,oCAEE,QAFFA,oCAEE;EAAA,IADFC,yBACE,QADFA,yBACE;;EACF,4BAGIH,eAAe,CAACI,QAAhB,EAHJ;EAAA,IACQC,aADR,yBACCN,KADD;EAAA,IAECO,mBAFD,yBAECA,mBAFD,CADE,CAMF;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;;;EAEA,IAAMC,aAAa,GAAGV,MAAM,CAACE,KAAD,CAA5B;EACA,IAAMS,uBAAuB,GAAGT,KAAK,KAAKQ,aAAa,CAACE,OAAxD;EACAF,aAAa,CAACE,OAAd,GAAwBV,KAAxB;;EACA,IAAIS,uBAAJ,EAA6B;IAC5B,IAAIE,gBAAgB,GAAG,IAAvB;IACA,IAAIC,oBAAoB,GAAG,IAA3B;IACA,IAAMC,SAAS,GAAGZ,eAAe,CAACa,YAAhB,CAA6BR,aAA7B,EAA4CN,KAA5C,CAAlB,CAH4B,CAI5B;;IACA,IAAIa,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;QACAL,gBAAgB,GAAG,KAAnB;QACAC,oBAAoB,GAAG,KAAvB;MACA,CALD,MAMK,IAAIG,mBAAmB,KAAK,CAAxB,IAA6BC,kBAAkB,GAAG,CAAtD,EAAyD;QAC7D;QACA;QACAJ,oBAAoB,GAAG,KAAvB;MACA;IACD;;IAED,IAAID,gBAAJ,EAAsB;MACrB;MACAV,eAAe,CAACgB,QAAhB,CAAyBjB,KAAzB,EAAgC;QAC/B;QACA;QACAG,oCAAoC,EAAEA,oCAAoC,IAAID;MAH/C,CAAhC,EAFqB,CAQrB;;MACA,IAAIU,oBAAJ,EAA0B;QACzBR,yBAAyB;MACzB;IACD;EACD;AACD"}
|
package/package.json
CHANGED
package/react/index.d.ts
CHANGED
|
@@ -4,25 +4,63 @@ export { State, ItemState } from '../index.d.ts';
|
|
|
4
4
|
|
|
5
5
|
import * as React from 'react';
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
// Taken from https://www.benmvp.com/blog/polymorphic-react-components-typescript/
|
|
8
|
+
|
|
9
|
+
// A more precise version of just React.ComponentPropsWithoutRef on its own
|
|
10
|
+
export type PropsOf<
|
|
11
|
+
C extends keyof JSX.IntrinsicElements | React.JSXElementConstructor<any>
|
|
12
|
+
> = JSX.LibraryManagedAttributes<C, React.ComponentPropsWithoutRef<C>>
|
|
13
|
+
|
|
14
|
+
type AsProp<C extends React.ElementType> = {
|
|
15
|
+
/**
|
|
16
|
+
* An override of the default HTML tag.
|
|
17
|
+
* Can also be another React component.
|
|
18
|
+
*/
|
|
19
|
+
as?: C
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Allows for extending a set of props (`ExtendedProps`) by an overriding set of props
|
|
24
|
+
* (`OverrideProps`), ensuring that any duplicates are overridden by the overriding
|
|
25
|
+
* set of props.
|
|
26
|
+
*/
|
|
27
|
+
export type ExtendableProps<
|
|
28
|
+
ExtendedProps = {},
|
|
29
|
+
OverrideProps = {}
|
|
30
|
+
> = OverrideProps & Omit<ExtendedProps, keyof OverrideProps>
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Allows for inheriting the props from the specified element type so that
|
|
34
|
+
* props like children, className & style work, as well as element-specific
|
|
35
|
+
* attributes like aria roles. The component (`C`) must be passed in.
|
|
36
|
+
*/
|
|
37
|
+
export type InheritableElementProps<
|
|
38
|
+
C extends React.ElementType,
|
|
39
|
+
Props = {}
|
|
40
|
+
> = ExtendableProps<PropsOf<C>, Props>
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* A more sophisticated version of `InheritableElementProps` where
|
|
44
|
+
* the passed in `as` prop will determine which props can be included
|
|
45
|
+
*/
|
|
46
|
+
export type PolymorphicComponentProps<
|
|
47
|
+
C extends React.ElementType,
|
|
48
|
+
Props = {}
|
|
49
|
+
> = InheritableElementProps<C, Props & AsProp<C>>
|
|
50
|
+
|
|
51
|
+
interface Props<Item, ItemComponentProps extends object>
|
|
52
|
+
extends VirtualScrollerCommonOptions<Item>{
|
|
9
53
|
items: Item[];
|
|
10
|
-
itemComponent: React.ElementType
|
|
11
|
-
itemComponentProps?:
|
|
54
|
+
itemComponent: React.ElementType<ItemComponentProps & { item: Item, itemIndex: number }>;
|
|
55
|
+
itemComponentProps?: ItemComponentProps;
|
|
12
56
|
initialState?: State<Item>;
|
|
13
57
|
preserveScrollPositionOnPrependItems?: boolean;
|
|
58
|
+
|
|
14
59
|
getScrollableContainer?(): HTMLElement;
|
|
15
60
|
}
|
|
16
61
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
// declare const VirtualScroller<Item>: ReactVirtualScroller<Item>;
|
|
21
|
-
//
|
|
22
|
-
// Uses `<any>` instead.
|
|
23
|
-
//
|
|
24
|
-
// If someone finds a fix for this, create an issue.
|
|
25
|
-
//
|
|
26
|
-
declare const VirtualScroller: ReactVirtualScroller<any>;
|
|
62
|
+
declare function VirtualScroller<Item = any, ItemComponentProps extends object={}, AsElement extends React.ElementType = 'div'>(
|
|
63
|
+
props: PolymorphicComponentProps<AsElement, Props<Item, ItemComponentProps>>
|
|
64
|
+
): JSX.Element;
|
|
27
65
|
|
|
28
|
-
export default VirtualScroller;
|
|
66
|
+
export default VirtualScroller;
|
|
@@ -35,7 +35,7 @@ export default class VirtualScroller {
|
|
|
35
35
|
const isRestart = this._isActive === false
|
|
36
36
|
|
|
37
37
|
if (!isRestart) {
|
|
38
|
-
// If no custom
|
|
38
|
+
// If no custom state storage has been configured, use the default one.
|
|
39
39
|
// Also sets the initial state.
|
|
40
40
|
if (!this._usesCustomStateStorage) {
|
|
41
41
|
this.useDefaultStateStorage()
|
|
@@ -184,8 +184,14 @@ function VirtualScroller({
|
|
|
184
184
|
style={style}>
|
|
185
185
|
{renderedItems.map((item, i) => {
|
|
186
186
|
if (i >= firstShownItemIndex && i <= lastShownItemIndex) {
|
|
187
|
+
// Passing `item` as `children` property is legacy and is deprecated.
|
|
188
|
+
// If version `2.x` is published in some hypothetical future,
|
|
189
|
+
// the `item` and `itemIndex` properties should be moved below
|
|
190
|
+
// `{...itemComponentProps}`.
|
|
187
191
|
return (
|
|
188
192
|
<Component
|
|
193
|
+
item={item}
|
|
194
|
+
itemIndex={i}
|
|
189
195
|
{...itemComponentProps}
|
|
190
196
|
key={getItemKey(item, i)}
|
|
191
197
|
state={itemStates && itemStates[i]}
|