virtual-scroller 1.10.2 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +48 -24
  3. package/bundle/virtual-scroller-dom.js +1 -1
  4. package/bundle/virtual-scroller-dom.js.map +1 -1
  5. package/bundle/virtual-scroller-react.js +1 -1
  6. package/bundle/virtual-scroller-react.js.map +1 -1
  7. package/bundle/virtual-scroller.js +1 -1
  8. package/bundle/virtual-scroller.js.map +1 -1
  9. package/commonjs/DOM/VirtualScroller.js +5 -0
  10. package/commonjs/DOM/VirtualScroller.js.map +1 -1
  11. package/commonjs/ItemHeights.js +1 -1
  12. package/commonjs/ItemHeights.js.map +1 -1
  13. package/commonjs/VirtualScroller.constructor.js +3 -0
  14. package/commonjs/VirtualScroller.constructor.js.map +1 -1
  15. package/commonjs/VirtualScroller.items.js +11 -10
  16. package/commonjs/VirtualScroller.items.js.map +1 -1
  17. package/commonjs/VirtualScroller.js +10 -3
  18. package/commonjs/VirtualScroller.js.map +1 -1
  19. package/commonjs/VirtualScroller.layout.js +2 -2
  20. package/commonjs/VirtualScroller.layout.js.map +1 -1
  21. package/commonjs/VirtualScroller.state.js +23 -13
  22. package/commonjs/VirtualScroller.state.js.map +1 -1
  23. package/commonjs/react/VirtualScroller.js +26 -11
  24. package/commonjs/react/VirtualScroller.js.map +1 -1
  25. package/commonjs/react/{useOnItemStateChange.js → useSetItemState.js} +7 -7
  26. package/commonjs/react/useSetItemState.js.map +1 -0
  27. package/commonjs/react/useVirtualScroller.js +2 -1
  28. package/commonjs/react/useVirtualScroller.js.map +1 -1
  29. package/commonjs/utility/fillArray.js +18 -0
  30. package/commonjs/utility/fillArray.js.map +1 -0
  31. package/dom/index.d.ts +7 -6
  32. package/index.d.ts +16 -15
  33. package/modules/DOM/VirtualScroller.js +5 -0
  34. package/modules/DOM/VirtualScroller.js.map +1 -1
  35. package/modules/ItemHeights.js +1 -1
  36. package/modules/ItemHeights.js.map +1 -1
  37. package/modules/VirtualScroller.constructor.js +3 -0
  38. package/modules/VirtualScroller.constructor.js.map +1 -1
  39. package/modules/VirtualScroller.items.js +10 -10
  40. package/modules/VirtualScroller.items.js.map +1 -1
  41. package/modules/VirtualScroller.js +10 -3
  42. package/modules/VirtualScroller.js.map +1 -1
  43. package/modules/VirtualScroller.layout.js +2 -2
  44. package/modules/VirtualScroller.layout.js.map +1 -1
  45. package/modules/VirtualScroller.state.js +20 -11
  46. package/modules/VirtualScroller.state.js.map +1 -1
  47. package/modules/react/VirtualScroller.js +26 -11
  48. package/modules/react/VirtualScroller.js.map +1 -1
  49. package/modules/react/{useOnItemStateChange.js → useSetItemState.js} +6 -6
  50. package/modules/react/useSetItemState.js.map +1 -0
  51. package/modules/react/useVirtualScroller.js +2 -1
  52. package/modules/react/useVirtualScroller.js.map +1 -1
  53. package/modules/utility/fillArray.js +11 -0
  54. package/modules/utility/fillArray.js.map +1 -0
  55. package/package.json +1 -1
  56. package/react/index.d.ts +14 -8
  57. package/source/DOM/VirtualScroller.js +4 -0
  58. package/source/ItemHeights.js +1 -1
  59. package/source/VirtualScroller.constructor.js +2 -1
  60. package/source/VirtualScroller.items.js +16 -8
  61. package/source/VirtualScroller.js +8 -2
  62. package/source/VirtualScroller.layout.js +2 -2
  63. package/source/VirtualScroller.state.js +15 -7
  64. package/source/react/VirtualScroller.js +25 -10
  65. package/source/react/{useOnItemStateChange.js → useSetItemState.js} +5 -5
  66. package/source/react/useVirtualScroller.js +2 -0
  67. package/source/utility/fillArray.js +8 -0
  68. package/commonjs/react/useOnItemStateChange.js.map +0 -1
  69. package/modules/react/useOnItemStateChange.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualScroller.state.js","names":["log","warn","isDebug","reportError","cleanUpBeforeResizeState","getStateSnapshot","createStateHelpers","state","onStateChange","render","initialItems","items","_render","_onItemStateChange","i","newItemState","JSON","stringify","getState","itemStates","newItemsWillBeRendered","itemStatesThatChangedWhileNewItemsWereBeingRendered","String","_getState","updateState","stateUpdate","_isSettingNewItems","undefined","previousState","_updateState","getInitialState","getRestoredState","call","getInitialStateFromScratch","useState","_isActive","Error","_usesCustomStateStorage","useDefaultStateStorage","defaultGetState","bind","defaultUpdateState","setInitialState","defaultSetInitialState","newState","onRender","getInitialLayoutState","beforeStart","Array","length","firstShownItemIndex","lastShownItemIndex","verticalSpacing","isStateColumnsCountMismatch","columnsCount","getActualColumnsCount","itemsCount","getColumnsCount","layout","getInitialLayoutValueWithFallback","getInitialLayoutValues","beforeItemsHeight","afterItemsHeight","itemHeights","onBeforeShowItems","getActualColumnsCountForState","stateColumnsCount","Math","floor"],"sources":["../source/VirtualScroller.state.js"],"sourcesContent":["import log, { warn, isDebug, reportError } from './utility/debug.js'\r\nimport { cleanUpBeforeResizeState } from './BeforeResize.js'\r\nimport getStateSnapshot from './utility/getStateSnapshot.js'\r\n\r\n// There're three main places where state is updated:\r\n//\r\n// * On scroll.\r\n// * On window resize.\r\n// * On set new items.\r\n//\r\n// State updates may be \"asynchronous\" (like in React), in which case the\r\n// corresponding operation is \"pending\" until the state update is applied.\r\n//\r\n// If there's a \"pending\" window resize or a \"pending\" update of the set of items,\r\n// then \"on scroll\" updates aren't dispatched.\r\n//\r\n// If there's a \"pending\" on scroll update and the window is resize or a new set\r\n// of items is set, then that \"pending\" on scroll update gets overwritten.\r\n//\r\n// If there's a \"pending\" update of the set of items, then window resize handler\r\n// sees that \"pending\" update and dispatches its own state update so that the\r\n// \"pending\" state update originating from `setItems()` is not lost.\r\n//\r\n// If there's a \"pending\" window resize, and a new set of items is set,\r\n// then the state update of the window resize handler gets overwritten.\r\n\r\nexport default function createStateHelpers({\r\n\tstate,\r\n\tonStateChange,\r\n\trender,\r\n\titems: initialItems\r\n}) {\r\n\tthis.onStateChange = onStateChange\r\n\tthis._render = render\r\n\r\n\tthis._onItemStateChange = (i, newItemState) => {\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('~ Item state changed ~')\r\n\t\t\tlog('Item', i)\r\n\t\t\t// Uses `JSON.stringify()` here instead of just outputting the JSON objects as is\r\n\t\t\t// because outputting JSON objects as is would show different results later when\r\n\t\t\t// the developer inspects those in the web browser console if those state objects\r\n\t\t\t// get modified in between they've been output to the console and the developer\r\n\t\t\t// decided to inspect them.\r\n\t\t\tlog('Previous state' + '\\n' + JSON.stringify(this.getState().itemStates[i], null, 2))\r\n\t\t\tlog('New state' + '\\n' + JSON.stringify(newItemState, null, 2))\r\n\t\t}\r\n\r\n\t\tthis.getState().itemStates[i] = newItemState\r\n\r\n\t\t// Schedule the item state update for after the new items have been rendered.\r\n\t\tif (this.newItemsWillBeRendered) {\r\n\t\t\tif (!this.itemStatesThatChangedWhileNewItemsWereBeingRendered) {\r\n\t\t\t\tthis.itemStatesThatChangedWhileNewItemsWereBeingRendered = {}\r\n\t\t\t}\r\n\t\t\tthis.itemStatesThatChangedWhileNewItemsWereBeingRendered[String(i)] = newItemState\r\n\t\t}\r\n\t}\r\n\r\n\tthis.getState = () => this._getState()\r\n\r\n\tthis.updateState = (stateUpdate) => {\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('~ Set state ~')\r\n\t\t\tlog(getStateSnapshot(stateUpdate))\r\n\t\t}\r\n\r\n\t\t// Ensure that a non-initial `stateUpdate` can only contain an `items`\r\n\t\t// property when it comes from a `setItems()` call.\r\n\t\tif (stateUpdate.items) {\r\n\t\t\tif (!this._isSettingNewItems) {\r\n\t\t\t\treportError('A `stateUpdate` can only contain `items` property as a result of calling `.setItems()`')\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis._isSettingNewItems = undefined\r\n\r\n\t\t// Update `state`.\r\n\t\tthis.previousState = this.getState()\r\n\t\tthis._updateState(stateUpdate)\r\n\t}\r\n\r\n\tthis.getInitialState = () => {\r\n\t\tif (state) {\r\n\t\t\treturn getRestoredState.call(this, state)\r\n\t\t}\r\n\t\treturn getInitialStateFromScratch.call(this)\r\n\t}\r\n\r\n\tthis.useState = ({\r\n\t\tgetState,\r\n\t\tupdateState\r\n\t}) => {\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\tif (this._getState) {\r\n\t\t\tthrow new Error('[virtual-scroller] Custom state storage has already been configured')\r\n\t\t}\r\n\r\n\t\tif (render) {\r\n\t\t\tthrow new Error('[virtual-scroller] Creating a `VirtualScroller` class instance with a `render()` parameter means using the default (internal) state storage')\r\n\t\t}\r\n\r\n\t\tif (!getState || !updateState) {\r\n\t\t\tthrow new Error('[virtual-scroller] When using a custom state storage, one must supply both `getState()` and `updateState()` functions')\r\n\t\t}\r\n\r\n\t\tthis._usesCustomStateStorage = true\r\n\r\n\t\tthis._getState = getState\r\n\t\tthis._updateState = updateState\r\n\t}\r\n\r\n\tthis.useDefaultStateStorage = () => {\r\n\t\tif (!render) {\r\n\t\t\tthrow new Error('[virtual-scroller] When using the default (internal) state management, one must supply a `render(state, prevState)` function parameter')\r\n\t\t}\r\n\r\n\t\t// Create default `getState()`/`updateState()` functions.\r\n\t\tthis._getState = defaultGetState.bind(this)\r\n\t\tthis._updateState = defaultUpdateState.bind(this)\r\n\r\n\t\t// When `state` is stored externally, a developer is responsible for\r\n\t\t// initializing it with the initial value.\r\n\t\t// Otherwise, if default state management is used, set the initial state now.\r\n\t\tconst setInitialState = defaultSetInitialState.bind(this)\r\n\t\tsetInitialState(this.getInitialState())\r\n\t}\r\n\r\n\tfunction defaultGetState() {\r\n\t\treturn this.state\r\n\t}\r\n\r\n\tfunction defaultSetInitialState(newState) {\r\n\t\tthis.state = newState\r\n\t}\r\n\r\n\tfunction defaultUpdateState(stateUpdate) {\r\n\t\t// Because this variant of `.updateState()` is \"synchronous\" (immediate),\r\n\t\t// it can be written like `...prevState`, and no state updates would be lost.\r\n\t\t// But if it was \"asynchronous\" (not immediate), then `...prevState`\r\n\t\t// wouldn't work in all cases, because it could be stale in cases\r\n\t\t// when more than a single `updateState()` call is made before\r\n\t\t// the state actually updates, making `prevState` stale.\r\n\t\tthis.state = {\r\n\t\t\t...this.state,\r\n\t\t\t...stateUpdate\r\n\t\t}\r\n\r\n\t\trender(this.state, this.previousState)\r\n\r\n\t\tthis.onRender()\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the initial state of the `VirtualScroller` \"from scratch\".\r\n\t * (i.e. not from a previously saved one).\r\n\t * @return {object}\r\n\t */\r\n\tfunction getInitialStateFromScratch() {\r\n\t\tconst items = initialItems\r\n\t\tconst state = {\r\n\t\t\t...getInitialLayoutState.call(this, items, { beforeStart: true }),\r\n\t\t\titems,\r\n\t\t\titemStates: new Array(items.length)\r\n\t\t}\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('Initial state (autogenerated)', getStateSnapshot(state))\r\n\t\t}\r\n\t\tlog('First shown item index', state.firstShownItemIndex)\r\n\t\tlog('Last shown item index', state.lastShownItemIndex)\r\n\t\treturn state\r\n\t}\r\n\r\n\tfunction getRestoredState(state) {\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('Restore state', getStateSnapshot(state))\r\n\t\t}\r\n\r\n\t\t// Possibly clean up \"before resize\" property in state.\r\n\t\t// \"Before resize\" state property is cleaned up when all \"before resize\" item heights\r\n\t\t// have been re-measured in an asynchronous `this.updateState({ beforeResize: undefined })` call.\r\n\t\t// If `VirtualScroller` state was snapshotted externally before that `this.updateState()` call\r\n\t\t// has been applied, then \"before resize\" property might have not been cleaned up properly.\r\n\t\tstate = cleanUpBeforeResizeState(state)\r\n\r\n\t\t// Reset `verticalSpacing` so that it re-measures it after the list\r\n\t\t// has been rendered initially. The rationale is that a previously captured\r\n\t\t// inter-item vertical spacing can't be \"trusted\" in a sense that the user\r\n\t\t// might have resized the window 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 when the `VirtualScroller` is re-created with such previously\r\n\t\t// snapshotted state.\r\n\t\tstate = {\r\n\t\t\t...state,\r\n\t\t\tverticalSpacing: undefined\r\n\t\t}\r\n\r\n\t\t// `this.verticalSpacing` acts as a \"true\" source for vertical spacing value.\r\n\t\t// Vertical spacing is also stored in `state` but `state` updates could be\r\n\t\t// \"asynchronous\" (not applied immediately) and `this.onUpdateShownItemIndexes()`\r\n\t\t// requires vertical spacing to be correct at any time, without any delays.\r\n\t\t// So, vertical spacing is also duplicated in `state`, but the \"true\" source\r\n\t\t// is still `this.verticalSpacing`.\r\n\t\t//\r\n\t\t// `this.verticalSpacing` must be initialized before calling `this.getInitialStateFromScratch()`\r\n\t\t// because `this.getInitialStateFromScratch()` uses `this.verticalSpacing` in its calculations.\r\n\t\t//\r\n\t\t// With the code above, `state.verticalSpacing` is always gonna be `undefined`,\r\n\t\t// so commented out this code. It's safer to just re-measure vertical spacing\r\n\t\t// from scratch when `VirtualScroller` is mounted.\r\n\t\t//\r\n\t\t// this.verticalSpacing = state ? state.verticalSpacing : undefined\r\n\r\n\t\t// Check if the actual `columnsCount` on the screen matches the one from state.\r\n\t\tif (isStateColumnsCountMismatch(state, {\r\n\t\t\tcolumnsCount: this.getActualColumnsCount()\r\n\t\t})) {\r\n\t\t\twarn('Reset Layout')\r\n\t\t\tstate = {\r\n\t\t\t\t...state,\r\n\t\t\t\t...getInitialLayoutState.call(this, state.items, { beforeStart: false })\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn state\r\n\t}\r\n\r\n\tfunction getInitialLayoutState(items, { beforeStart }) {\r\n\t\tconst itemsCount = items.length\r\n\r\n\t\tconst getColumnsCount = () => this.getActualColumnsCount()\r\n\r\n\t\tconst columnsCount = beforeStart\r\n\t\t\t? this.layout.getInitialLayoutValueWithFallback(\r\n\t\t\t\t'columnsCount',\r\n\t\t\t\tgetColumnsCount,\r\n\t\t\t\t1\r\n\t\t\t)\r\n\t\t\t: getColumnsCount()\r\n\r\n\t\tconst {\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex,\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tafterItemsHeight\r\n\t\t} = this.layout.getInitialLayoutValues({\r\n\t\t\titemsCount,\r\n\t\t\tcolumnsCount: this.getActualColumnsCount(),\r\n\t\t\tbeforeStart\r\n\t\t})\r\n\r\n\t\tconst itemHeights = new Array(itemsCount)\r\n\r\n\t\t// Optionally preload items to be rendered.\r\n\t\tthis.onBeforeShowItems(\r\n\t\t\titems,\r\n\t\t\titemHeights,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t)\r\n\r\n\t\treturn {\r\n\t\t\titemHeights,\r\n\t\t\tcolumnsCount: this.getActualColumnsCountForState(),\r\n\t\t\tverticalSpacing: this.verticalSpacing,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex,\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tafterItemsHeight\r\n\t\t}\r\n\t}\r\n\r\n\t// Checks if the actual `columnsCount` on the screen matches the one from state.\r\n\t//\r\n\t// For example, a developer might snapshot `VirtualScroller` state\r\n\t// when the user navigates from the page containing the list\r\n\t// in order to later restore the list's state when the user goes \"Back\".\r\n\t// But, the user might have also resized the window while being on that\r\n\t// \"other\" page, and when they come \"Back\", their snapshotted state\r\n\t// no longer qualifies. Well, it does qualify, but only partially.\r\n\t// For example, `itemStates` are still valid, but first and last shown\r\n\t// item indexes aren't.\r\n\t//\r\n\tfunction isStateColumnsCountMismatch(state, { columnsCount }) {\r\n\t\tconst stateColumnsCount = state.columnsCount || 1\r\n\t\tif (stateColumnsCount !== columnsCount) {\r\n\t\t\twarn('~ Columns Count changed from', stateColumnsCount, 'to', columnsCount, '~')\r\n\t\t\treturn true\r\n\t\t}\r\n\t\tconst firstShownItemIndex = Math.floor(state.firstShownItemIndex / columnsCount) * columnsCount\r\n\t\tif (firstShownItemIndex !== state.firstShownItemIndex) {\r\n\t\t\twarn('~ First Shown Item Index', state.firstShownItemIndex, 'is not divisible by Columns Count', columnsCount, '~')\r\n\t\t\treturn true\r\n\t\t}\r\n\t}\r\n}"],"mappings":"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"}
1
+ {"version":3,"file":"VirtualScroller.state.js","names":["fillArray","log","warn","isDebug","reportError","cleanUpBeforeResizeState","getStateSnapshot","createStateHelpers","initialState","state","getInitialItemState","onStateChange","render","initialItems","items","_render","_setItemState","i","newItemState","JSON","stringify","getState","itemStates","newItemsWillBeRendered","itemStatesThatChangedWhileNewItemsWereBeingRendered","String","_getState","updateState","stateUpdate","_isSettingNewItems","undefined","previousState","_updateState","getInitialState","getRestoredState","call","getInitialStateFromScratch","useState","_isActive","Error","_usesCustomStateStorage","useDefaultStateStorage","defaultGetState","bind","defaultUpdateState","setInitialState","defaultSetInitialState","newState","onRender","getInitialLayoutState","beforeStart","Array","length","firstShownItemIndex","lastShownItemIndex","verticalSpacing","isStateColumnsCountMismatch","columnsCount","getActualColumnsCount","itemsCount","getColumnsCount","layout","getInitialLayoutValueWithFallback","getInitialLayoutValues","beforeItemsHeight","afterItemsHeight","itemHeights","onBeforeShowItems","getActualColumnsCountForState","stateColumnsCount","Math","floor"],"sources":["../source/VirtualScroller.state.js"],"sourcesContent":["import fillArray from './utility/fillArray.js'\r\nimport log, { warn, isDebug, reportError } from './utility/debug.js'\r\nimport { cleanUpBeforeResizeState } from './BeforeResize.js'\r\nimport getStateSnapshot from './utility/getStateSnapshot.js'\r\n\r\n// There're three main places where state is updated:\r\n//\r\n// * On scroll.\r\n// * On window resize.\r\n// * On set new items.\r\n//\r\n// State updates may be \"asynchronous\" (like in React), in which case the\r\n// corresponding operation is \"pending\" until the state update is applied.\r\n//\r\n// If there's a \"pending\" window resize or a \"pending\" update of the set of items,\r\n// then \"on scroll\" updates aren't dispatched.\r\n//\r\n// If there's a \"pending\" on scroll update and the window is resize or a new set\r\n// of items is set, then that \"pending\" on scroll update gets overwritten.\r\n//\r\n// If there's a \"pending\" update of the set of items, then window resize handler\r\n// sees that \"pending\" update and dispatches its own state update so that the\r\n// \"pending\" state update originating from `setItems()` is not lost.\r\n//\r\n// If there's a \"pending\" window resize, and a new set of items is set,\r\n// then the state update of the window resize handler gets overwritten.\r\n\r\nexport default function createStateHelpers({\r\n\tstate: initialState,\r\n\tgetInitialItemState,\r\n\tonStateChange,\r\n\trender,\r\n\titems: initialItems\r\n}) {\r\n\tthis.onStateChange = onStateChange\r\n\tthis._render = render\r\n\r\n\tthis.getInitialItemState = getInitialItemState\r\n\r\n\tthis._setItemState = (i, newItemState) => {\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('~ Item state changed ~')\r\n\t\t\tlog('Item', i)\r\n\t\t\t// Uses `JSON.stringify()` here instead of just outputting the JSON objects as is\r\n\t\t\t// because outputting JSON objects as is would show different results later when\r\n\t\t\t// the developer inspects those in the web browser console if those state objects\r\n\t\t\t// get modified in between they've been output to the console and the developer\r\n\t\t\t// decided to inspect them.\r\n\t\t\tlog('Previous state' + '\\n' + JSON.stringify(this.getState().itemStates[i], null, 2))\r\n\t\t\tlog('New state' + '\\n' + JSON.stringify(newItemState, null, 2))\r\n\t\t}\r\n\r\n\t\tthis.getState().itemStates[i] = newItemState\r\n\r\n\t\t// Schedule the item state update for after the new items have been rendered.\r\n\t\tif (this.newItemsWillBeRendered) {\r\n\t\t\tif (!this.itemStatesThatChangedWhileNewItemsWereBeingRendered) {\r\n\t\t\t\tthis.itemStatesThatChangedWhileNewItemsWereBeingRendered = {}\r\n\t\t\t}\r\n\t\t\tthis.itemStatesThatChangedWhileNewItemsWereBeingRendered[String(i)] = newItemState\r\n\t\t}\r\n\t}\r\n\r\n\tthis.getState = () => this._getState()\r\n\r\n\tthis.updateState = (stateUpdate) => {\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('~ Set state ~')\r\n\t\t\tlog(getStateSnapshot(stateUpdate))\r\n\t\t}\r\n\r\n\t\t// Ensure that a non-initial `stateUpdate` can only contain an `items`\r\n\t\t// property when it comes from a `setItems()` call.\r\n\t\tif (stateUpdate.items) {\r\n\t\t\tif (!this._isSettingNewItems) {\r\n\t\t\t\treportError('A `stateUpdate` can only contain `items` property as a result of calling `.setItems()`')\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis._isSettingNewItems = undefined\r\n\r\n\t\t// Update `state`.\r\n\t\tthis.previousState = this.getState()\r\n\t\tthis._updateState(stateUpdate)\r\n\t}\r\n\r\n\tthis.getInitialState = () => {\r\n\t\tif (initialState) {\r\n\t\t\treturn getRestoredState.call(this, initialState)\r\n\t\t}\r\n\t\treturn getInitialStateFromScratch.call(this, { getInitialItemState })\r\n\t}\r\n\r\n\tthis.useState = ({\r\n\t\tgetState,\r\n\t\tupdateState\r\n\t}) => {\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\tif (this._getState) {\r\n\t\t\tthrow new Error('[virtual-scroller] Custom state storage has already been configured')\r\n\t\t}\r\n\r\n\t\tif (render) {\r\n\t\t\tthrow new Error('[virtual-scroller] Creating a `VirtualScroller` class instance with a `render()` parameter means using the default (internal) state storage')\r\n\t\t}\r\n\r\n\t\tif (!getState || !updateState) {\r\n\t\t\tthrow new Error('[virtual-scroller] When using a custom state storage, one must supply both `getState()` and `updateState()` functions')\r\n\t\t}\r\n\r\n\t\tthis._usesCustomStateStorage = true\r\n\r\n\t\tthis._getState = getState\r\n\t\tthis._updateState = updateState\r\n\t}\r\n\r\n\tthis.useDefaultStateStorage = () => {\r\n\t\tif (!render) {\r\n\t\t\tthrow new Error('[virtual-scroller] When using the default (internal) state management, one must supply a `render(state, prevState)` function parameter')\r\n\t\t}\r\n\r\n\t\t// Create default `getState()`/`updateState()` functions.\r\n\t\tthis._getState = defaultGetState.bind(this)\r\n\t\tthis._updateState = defaultUpdateState.bind(this)\r\n\r\n\t\t// When `state` is stored externally, a developer is responsible for\r\n\t\t// initializing it with the initial value.\r\n\t\t// Otherwise, if default state management is used, set the initial state now.\r\n\t\tconst setInitialState = defaultSetInitialState.bind(this)\r\n\t\tsetInitialState(this.getInitialState())\r\n\t}\r\n\r\n\tfunction defaultGetState() {\r\n\t\treturn this.state\r\n\t}\r\n\r\n\tfunction defaultSetInitialState(newState) {\r\n\t\tthis.state = newState\r\n\t}\r\n\r\n\tfunction defaultUpdateState(stateUpdate) {\r\n\t\t// Because this variant of `.updateState()` is \"synchronous\" (immediate),\r\n\t\t// it can be written like `...prevState`, and no state updates would be lost.\r\n\t\t// But if it was \"asynchronous\" (not immediate), then `...prevState`\r\n\t\t// wouldn't work in all cases, because it could be stale in cases\r\n\t\t// when more than a single `updateState()` call is made before\r\n\t\t// the state actually updates, making `prevState` stale.\r\n\t\tthis.state = {\r\n\t\t\t...this.state,\r\n\t\t\t...stateUpdate\r\n\t\t}\r\n\r\n\t\trender(this.state, this.previousState)\r\n\r\n\t\tthis.onRender()\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the initial state of the `VirtualScroller` \"from scratch\".\r\n\t * (i.e. not from a previously saved one).\r\n\t * @param {function} [options.getInitialItemState] — Gets initial item state.\r\n\t * @return {object}\r\n\t */\r\n\tfunction getInitialStateFromScratch({ getInitialItemState }) {\r\n\t\tconst items = initialItems\r\n\r\n\t\tconst state = {\r\n\t\t\t...getInitialLayoutState.call(this, items, { beforeStart: true }),\r\n\t\t\titems,\r\n\t\t\titemStates: fillArray(new Array(items.length), (i) => getInitialItemState(items[i]))\r\n\t\t}\r\n\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('Initial state (autogenerated)', getStateSnapshot(state))\r\n\t\t}\r\n\t\tlog('First shown item index', state.firstShownItemIndex)\r\n\t\tlog('Last shown item index', state.lastShownItemIndex)\r\n\r\n\t\treturn state\r\n\t}\r\n\r\n\tfunction getRestoredState(state) {\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('Restore state', getStateSnapshot(state))\r\n\t\t}\r\n\r\n\t\t// Possibly clean up \"before resize\" property in state.\r\n\t\t// \"Before resize\" state property is cleaned up when all \"before resize\" item heights\r\n\t\t// have been re-measured in an asynchronous `this.updateState({ beforeResize: undefined })` call.\r\n\t\t// If `VirtualScroller` state was snapshotted externally before that `this.updateState()` call\r\n\t\t// has been applied, then \"before resize\" property might have not been cleaned up properly.\r\n\t\tstate = cleanUpBeforeResizeState(state)\r\n\r\n\t\t// Reset `verticalSpacing` so that it re-measures it after the list\r\n\t\t// has been rendered initially. The rationale is that a previously captured\r\n\t\t// inter-item vertical spacing can't be \"trusted\" in a sense that the user\r\n\t\t// might have resized the window 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 when the `VirtualScroller` is re-created with such previously\r\n\t\t// snapshotted state.\r\n\t\tstate = {\r\n\t\t\t...state,\r\n\t\t\tverticalSpacing: undefined\r\n\t\t}\r\n\r\n\t\t// `this.verticalSpacing` acts as a \"true\" source for vertical spacing value.\r\n\t\t// Vertical spacing is also stored in `state` but `state` updates could be\r\n\t\t// \"asynchronous\" (not applied immediately) and `this.onUpdateShownItemIndexes()`\r\n\t\t// requires vertical spacing to be correct at any time, without any delays.\r\n\t\t// So, vertical spacing is also duplicated in `state`, but the \"true\" source\r\n\t\t// is still `this.verticalSpacing`.\r\n\t\t//\r\n\t\t// `this.verticalSpacing` must be initialized before calling `this.getInitialStateFromScratch()`\r\n\t\t// because `this.getInitialStateFromScratch()` uses `this.verticalSpacing` in its calculations.\r\n\t\t//\r\n\t\t// With the code above, `state.verticalSpacing` is always gonna be `undefined`,\r\n\t\t// so commented out this code. It's safer to just re-measure vertical spacing\r\n\t\t// from scratch when `VirtualScroller` is mounted.\r\n\t\t//\r\n\t\t// this.verticalSpacing = state ? state.verticalSpacing : undefined\r\n\r\n\t\t// Check if the actual `columnsCount` on the screen matches the one from state.\r\n\t\tif (isStateColumnsCountMismatch(state, {\r\n\t\t\tcolumnsCount: this.getActualColumnsCount()\r\n\t\t})) {\r\n\t\t\twarn('Reset Layout')\r\n\t\t\tstate = {\r\n\t\t\t\t...state,\r\n\t\t\t\t...getInitialLayoutState.call(this, state.items, { beforeStart: false })\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn state\r\n\t}\r\n\r\n\tfunction getInitialLayoutState(items, { beforeStart }) {\r\n\t\tconst itemsCount = items.length\r\n\r\n\t\tconst getColumnsCount = () => this.getActualColumnsCount()\r\n\r\n\t\tconst columnsCount = beforeStart\r\n\t\t\t? this.layout.getInitialLayoutValueWithFallback(\r\n\t\t\t\t'columnsCount',\r\n\t\t\t\tgetColumnsCount,\r\n\t\t\t\t1\r\n\t\t\t)\r\n\t\t\t: getColumnsCount()\r\n\r\n\t\tconst {\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex,\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tafterItemsHeight\r\n\t\t} = this.layout.getInitialLayoutValues({\r\n\t\t\titemsCount,\r\n\t\t\tcolumnsCount: this.getActualColumnsCount(),\r\n\t\t\tbeforeStart\r\n\t\t})\r\n\r\n\t\tconst itemHeights = new Array(itemsCount)\r\n\r\n\t\t// Optionally preload items to be rendered.\r\n\t\tthis.onBeforeShowItems(\r\n\t\t\titems,\r\n\t\t\titemHeights,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t)\r\n\r\n\t\treturn {\r\n\t\t\titemHeights,\r\n\t\t\tcolumnsCount: this.getActualColumnsCountForState(),\r\n\t\t\tverticalSpacing: this.verticalSpacing,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex,\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tafterItemsHeight\r\n\t\t}\r\n\t}\r\n\r\n\t// Checks if the actual `columnsCount` on the screen matches the one from state.\r\n\t//\r\n\t// For example, a developer might snapshot `VirtualScroller` state\r\n\t// when the user navigates from the page containing the list\r\n\t// in order to later restore the list's state when the user goes \"Back\".\r\n\t// But, the user might have also resized the window while being on that\r\n\t// \"other\" page, and when they come \"Back\", their snapshotted state\r\n\t// no longer qualifies. Well, it does qualify, but only partially.\r\n\t// For example, `itemStates` are still valid, but first and last shown\r\n\t// item indexes aren't.\r\n\t//\r\n\tfunction isStateColumnsCountMismatch(state, { columnsCount }) {\r\n\t\tconst stateColumnsCount = state.columnsCount || 1\r\n\t\tif (stateColumnsCount !== columnsCount) {\r\n\t\t\twarn('~ Columns Count changed from', stateColumnsCount, 'to', columnsCount, '~')\r\n\t\t\treturn true\r\n\t\t}\r\n\t\tconst firstShownItemIndex = Math.floor(state.firstShownItemIndex / columnsCount) * columnsCount\r\n\t\tif (firstShownItemIndex !== state.firstShownItemIndex) {\r\n\t\t\twarn('~ First Shown Item Index', state.firstShownItemIndex, 'is not divisible by Columns Count', columnsCount, '~')\r\n\t\t\treturn true\r\n\t\t}\r\n\t}\r\n}"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- var _excluded = ["as", "items", "itemComponent", "itemComponentProps", "estimatedItemHeight", "getEstimatedItemHeight", "getEstimatedVisibleItemRowsCount", "bypass", "tbody", "preserveScrollPosition", "preserveScrollPositionOnPrependItems", "measureItemsBatchSize", "scrollableContainer", "getScrollableContainer", "getColumnsCount", "getItemId", "className", "onMount", "onItemFirstRender", "onItemInitialRender", "initialScrollPosition", "onScrollPositionChange", "onStateChange", "initialState"];
1
+ var _excluded = ["as", "items", "itemComponent", "itemComponentProps", "estimatedItemHeight", "getEstimatedItemHeight", "getEstimatedVisibleItemRowsCount", "bypass", "tbody", "preserveScrollPosition", "preserveScrollPositionOnPrependItems", "measureItemsBatchSize", "scrollableContainer", "getScrollableContainer", "getColumnsCount", "getItemId", "className", "onMount", "onItemFirstRender", "onItemInitialRender", "initialScrollPosition", "onScrollPositionChange", "onStateChange", "initialState", "getInitialItemState"];
2
2
 
3
3
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
4
4
 
@@ -13,7 +13,7 @@ import useVirtualScroller from './useVirtualScroller.js';
13
13
  import useVirtualScrollerStartStop from './useVirtualScrollerStartStop.js';
14
14
  import useInstanceMethods from './useInstanceMethods.js';
15
15
  import useItemKeys from './useItemKeys.js';
16
- import useOnItemStateChange from './useOnItemStateChange.js';
16
+ import useSetItemState from './useSetItemState.js';
17
17
  import useOnItemHeightChange from './useOnItemHeightChange.js';
18
18
  import useHandleItemsChange from './useHandleItemsChange.js';
19
19
  import useClassName from './useClassName.js';
@@ -44,6 +44,7 @@ function VirtualScroller(_ref, ref) {
44
44
  onScrollPositionChange = _ref.onScrollPositionChange,
45
45
  onStateChange = _ref.onStateChange,
46
46
  initialState = _ref.initialState,
47
+ getInitialItemState = _ref.getInitialItemState,
47
48
  rest = _objectWithoutProperties(_ref, _excluded);
48
49
 
49
50
  // List items "container" DOM Element reference.
@@ -73,6 +74,7 @@ function VirtualScroller(_ref, ref) {
73
74
  getItemId: getItemId,
74
75
  AsComponent: AsComponent,
75
76
  initialState: initialState,
77
+ getInitialItemState: getInitialItemState,
76
78
  onStateChange: onStateChange
77
79
  }, {
78
80
  container: container
@@ -108,11 +110,11 @@ function VirtualScroller(_ref, ref) {
108
110
  getItemId: getItemId
109
111
  }),
110
112
  getItemKey = _useItemKeys.getItemKey,
111
- updateItemKeysForNewItems = _useItemKeys.updateItemKeysForNewItems; // Cache per-item `onItemStateChange` functions' "references"
113
+ updateItemKeysForNewItems = _useItemKeys.updateItemKeysForNewItems; // Cache per-item `setItemState` functions' "references"
112
114
  // so that item components don't get re-rendered needlessly.
113
115
 
114
116
 
115
- var getOnItemStateChange = useOnItemStateChange({
117
+ var getSetItemState = useSetItemState({
116
118
  items: items,
117
119
  virtualScroller: virtualScroller
118
120
  }); // Cache per-item `onItemHeightChange` functions' "references"
@@ -177,17 +179,29 @@ function VirtualScroller(_ref, ref) {
177
179
  style: style
178
180
  }), renderedItems.map(function (item, i) {
179
181
  if (i >= firstShownItemIndex && i <= lastShownItemIndex) {
180
- // Passing `item` as `children` property is legacy and is deprecated.
181
- // If version `2.x` is published in some hypothetical future,
182
- // the `item` and `itemIndex` properties should be moved below
183
- // `{...itemComponentProps}`.
182
+ // * Passing `item` as `children` property is legacy and is deprecated.
183
+ // If version `2.x` is published in some hypothetical future,
184
+ // the `item` and `itemIndex` properties should be moved below
185
+ // `{...itemComponentProps}`.
186
+ //
187
+ // * Passing `itemIndex` property is legacy and is deprecated.
188
+ // The rationale is that setting new `items` on a React component
189
+ // is an asynchronous operation, so when a user obtains `itemIndex`,
190
+ // they don't know which `items` list does that index correspond to,
191
+ // therefore making it useless, or even buggy if used incorreclty.
192
+ //
193
+ // * Passing `onStateChange` property for legacy reasons.
194
+ // The new property name is `setState`.
195
+ // The old property name `onStateChange` is deprecated.
196
+ //
184
197
  return /*#__PURE__*/React.createElement(Component, _extends({
185
198
  item: item,
186
199
  itemIndex: i
187
200
  }, itemComponentProps, {
188
201
  key: getItemKey(item, i),
189
202
  state: itemStates && itemStates[i],
190
- onStateChange: getOnItemStateChange(i),
203
+ setState: getSetItemState(i),
204
+ onStateChange: getSetItemState(i),
191
205
  onHeightChange: getOnItemHeightChange(i)
192
206
  }), item);
193
207
  }
@@ -235,7 +249,7 @@ VirtualScroller.propTypes = {
235
249
  onStateChange: PropTypes.func,
236
250
  initialState: PropTypes.shape({
237
251
  items: PropTypes.arrayOf(PropTypes.object).isRequired,
238
- itemStates: PropTypes.arrayOf(PropTypes.any),
252
+ itemStates: PropTypes.arrayOf(PropTypes.any).isRequired,
239
253
  firstShownItemIndex: PropTypes.number.isRequired,
240
254
  lastShownItemIndex: PropTypes.number.isRequired,
241
255
  beforeItemsHeight: PropTypes.number.isRequired,
@@ -243,7 +257,8 @@ VirtualScroller.propTypes = {
243
257
  itemHeights: PropTypes.arrayOf(PropTypes.number).isRequired,
244
258
  columnsCount: PropTypes.number,
245
259
  verticalSpacing: PropTypes.number
246
- })
260
+ }),
261
+ getInitialItemState: PropTypes.func
247
262
  };
248
263
  VirtualScroller.defaultProps = {
249
264
  as: 'div'
@@ -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","getEstimatedItemHeight","getEstimatedVisibleItemRowsCount","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\t// `estimatedItemHeight` property name is deprecated,\r\n\t// use `getEstimatedItemHeight` property instead.\r\n\testimatedItemHeight,\r\n\tgetEstimatedItemHeight,\r\n\tgetEstimatedVisibleItemRowsCount,\r\n\tbypass,\r\n\ttbody,\r\n\t// `preserveScrollPosition` property name is deprecated,\r\n\t// use `preserveScrollPositionOnPrependItems` property instead.\r\n\tpreserveScrollPosition,\r\n\tpreserveScrollPositionOnPrependItems,\r\n\tmeasureItemsBatchSize,\r\n\t// `scrollableContainer` property is deprecated.\r\n\t// Use `getScrollableContainer()` property instead.\r\n\tscrollableContainer,\r\n\tgetScrollableContainer,\r\n\tgetColumnsCount,\r\n\tgetItemId,\r\n\tclassName,\r\n\tonMount,\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\tonItemFirstRender,\r\n\tonItemInitialRender,\r\n\tinitialScrollPosition,\r\n\tonScrollPositionChange,\r\n\tonStateChange,\r\n\tinitialState,\r\n\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\t// `estimatedItemHeight` property name is deprecated,\r\n\t\t// use `getEstimatedItemHeight` property instead.\r\n\t\testimatedItemHeight,\r\n\t\tgetEstimatedItemHeight,\r\n\t\tgetEstimatedVisibleItemRowsCount,\r\n\t\tbypass,\r\n\t\t// bypassBatchSize,\r\n\t\ttbody,\r\n\t\tonItemInitialRender,\r\n\t\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\t\tonItemFirstRender,\r\n\t\tinitialScrollPosition,\r\n\t\tonScrollPositionChange,\r\n\t\tmeasureItemsBatchSize,\r\n\t\t// `scrollableContainer` property is deprecated.\r\n\t\t// Use `getScrollableContainer()` property instead.\r\n\t\tscrollableContainer,\r\n\t\tgetScrollableContainer,\r\n\t\tgetColumnsCount,\r\n\t\tgetItemId,\r\n\t\tAsComponent,\r\n\t\tinitialState,\r\n\t\tonStateChange\r\n\t}, {\r\n\t\tcontainer\r\n\t})\r\n\r\n\t// Only compute the initial state once.\r\n\tconst _initialState = useMemo(() => {\r\n\t\treturn virtualScroller.getInitialState()\r\n\t}, [])\r\n\r\n\t// Use React's `useState()` hook for managing `VirtualScroller`'s state lifecycle.\r\n\t// This way, React will re-render the component on every state update.\r\n\tconst {\r\n\t\tgetState,\r\n\t\tupdateState\r\n\t} = 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\t// `estimatedItemHeight` property name is deprecated,\r\n\t// use `getEstimatedItemHeight` property instead.\r\n\testimatedItemHeight: PropTypes.number,\r\n\tgetEstimatedItemHeight: PropTypes.func,\r\n\tgetEstimatedVisibleItemRowsCount: PropTypes.func,\r\n\tbypass: PropTypes.bool,\r\n\t// bypassBatchSize: PropTypes.number,\r\n\ttbody: PropTypes.bool,\r\n\tpreserveScrollPositionOnPrependItems: PropTypes.bool,\r\n\t// `preserveScrollPosition` property name is deprecated,\r\n\t// use `preserveScrollPositionOnPrependItems` instead.\r\n\tpreserveScrollPosition: PropTypes.bool,\r\n\tmeasureItemsBatchSize: PropTypes.number,\r\n\t// `scrollableContainer` property is deprecated.\r\n\t// Use `getScrollableContainer()` property instead.\r\n\tscrollableContainer: PropTypes.any,\r\n\tgetScrollableContainer: PropTypes.func,\r\n\tgetColumnsCount: PropTypes.func,\r\n\tgetItemId: PropTypes.func,\r\n\tclassName: PropTypes.string,\r\n\tonMount: PropTypes.func,\r\n\tonItemInitialRender: PropTypes.func,\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\tonItemFirstRender: PropTypes.func,\r\n\tinitialScrollPosition: PropTypes.number,\r\n\tonScrollPositionChange: PropTypes.func,\r\n\tonStateChange: PropTypes.func,\r\n\tinitialState: PropTypes.shape({\r\n\t\titems: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n\t\titemStates: PropTypes.arrayOf(PropTypes.any),\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","useSetItemState","useOnItemHeightChange","useHandleItemsChange","useClassName","useStyle","VirtualScroller","ref","AsComponent","as","items","Component","itemComponent","itemComponentProps","estimatedItemHeight","getEstimatedItemHeight","getEstimatedVisibleItemRowsCount","bypass","tbody","preserveScrollPosition","preserveScrollPositionOnPrependItems","measureItemsBatchSize","scrollableContainer","getScrollableContainer","getColumnsCount","getItemId","className","onMount","onItemFirstRender","onItemInitialRender","initialScrollPosition","onScrollPositionChange","onStateChange","initialState","getInitialItemState","rest","container","virtualScroller","_initialState","getInitialState","onRender","getState","updateState","getItemKey","updateItemKeysForNewItems","getSetItemState","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 useSetItemState from './useSetItemState.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\t// `estimatedItemHeight` property name is deprecated,\r\n\t// use `getEstimatedItemHeight` property instead.\r\n\testimatedItemHeight,\r\n\tgetEstimatedItemHeight,\r\n\tgetEstimatedVisibleItemRowsCount,\r\n\tbypass,\r\n\ttbody,\r\n\t// `preserveScrollPosition` property name is deprecated,\r\n\t// use `preserveScrollPositionOnPrependItems` property instead.\r\n\tpreserveScrollPosition,\r\n\tpreserveScrollPositionOnPrependItems,\r\n\tmeasureItemsBatchSize,\r\n\t// `scrollableContainer` property is deprecated.\r\n\t// Use `getScrollableContainer()` property instead.\r\n\tscrollableContainer,\r\n\tgetScrollableContainer,\r\n\tgetColumnsCount,\r\n\tgetItemId,\r\n\tclassName,\r\n\tonMount,\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\tonItemFirstRender,\r\n\tonItemInitialRender,\r\n\tinitialScrollPosition,\r\n\tonScrollPositionChange,\r\n\tonStateChange,\r\n\tinitialState,\r\n\tgetInitialItemState,\r\n\t...rest\r\n}, ref) {\r\n\t// List items \"container\" DOM Element reference.\r\n\tconst container = useRef()\r\n\r\n\t// Create a `VirtualScroller` instance.\r\n\tconst virtualScroller = useVirtualScroller({\r\n\t\titems,\r\n\t\t// `estimatedItemHeight` property name is deprecated,\r\n\t\t// use `getEstimatedItemHeight` property instead.\r\n\t\testimatedItemHeight,\r\n\t\tgetEstimatedItemHeight,\r\n\t\tgetEstimatedVisibleItemRowsCount,\r\n\t\tbypass,\r\n\t\t// bypassBatchSize,\r\n\t\ttbody,\r\n\t\tonItemInitialRender,\r\n\t\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\t\tonItemFirstRender,\r\n\t\tinitialScrollPosition,\r\n\t\tonScrollPositionChange,\r\n\t\tmeasureItemsBatchSize,\r\n\t\t// `scrollableContainer` property is deprecated.\r\n\t\t// Use `getScrollableContainer()` property instead.\r\n\t\tscrollableContainer,\r\n\t\tgetScrollableContainer,\r\n\t\tgetColumnsCount,\r\n\t\tgetItemId,\r\n\t\tAsComponent,\r\n\t\tinitialState,\r\n\t\tgetInitialItemState,\r\n\t\tonStateChange\r\n\t}, {\r\n\t\tcontainer\r\n\t})\r\n\r\n\t// Only compute the initial state once.\r\n\tconst _initialState = useMemo(() => {\r\n\t\treturn virtualScroller.getInitialState()\r\n\t}, [])\r\n\r\n\t// Use React's `useState()` hook for managing `VirtualScroller`'s state lifecycle.\r\n\t// This way, React will re-render the component on every state update.\r\n\tconst {\r\n\t\tgetState,\r\n\t\tupdateState\r\n\t} = 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 `setItemState` functions' \"references\"\r\n\t// so that item components don't get re-rendered needlessly.\r\n\tconst getSetItemState = useSetItemState({\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\t//\r\n\t\t\t\t\t// * Passing `itemIndex` property is legacy and is deprecated.\r\n\t\t\t\t\t// The rationale is that setting new `items` on a React component\r\n\t\t\t\t\t// is an asynchronous operation, so when a user obtains `itemIndex`,\r\n\t\t\t\t\t// they don't know which `items` list does that index correspond to,\r\n\t\t\t\t\t// therefore making it useless, or even buggy if used incorreclty.\r\n\t\t\t\t\t//\r\n\t\t\t\t\t// * Passing `onStateChange` property for legacy reasons.\r\n\t\t\t\t\t// The new property name is `setState`.\r\n\t\t\t\t\t// The old property name `onStateChange` is deprecated.\r\n\t\t\t\t\t//\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t<Component\r\n\t\t\t\t\t\t\titem={item}\r\n\t\t\t\t\t\t\titemIndex={i}\r\n\t\t\t\t\t\t\t{...itemComponentProps}\r\n\t\t\t\t\t\t\tkey={getItemKey(item, i)}\r\n\t\t\t\t\t\t\tstate={itemStates && itemStates[i]}\r\n\t\t\t\t\t\t\tsetState={getSetItemState(i)}\r\n\t\t\t\t\t\t\tonStateChange={getSetItemState(i)}\r\n\t\t\t\t\t\t\tonHeightChange={getOnItemHeightChange(i)}>\r\n\t\t\t\t\t\t\t{item}\r\n\t\t\t\t\t\t</Component>\r\n\t\t\t\t\t)\r\n\t\t\t\t}\r\n\t\t\t\treturn null\r\n\t\t\t})}\r\n\t\t</AsComponent>\r\n\t)\r\n}\r\n\r\nVirtualScroller = React.forwardRef(VirtualScroller)\r\n\r\nexport default VirtualScroller\r\n\r\n// `PropTypes.elementType` is available in some version of `prop-types`.\r\n// https://github.com/facebook/prop-types/issues/200\r\nconst elementType = PropTypes.elementType || PropTypes.oneOfType([\r\n\tPropTypes.string,\r\n\tPropTypes.func,\r\n\tPropTypes.object\r\n])\r\n\r\nVirtualScroller.propTypes = {\r\n\tas: elementType,\r\n\titems: PropTypes.arrayOf(PropTypes.any).isRequired,\r\n\titemComponent: elementType.isRequired,\r\n\titemComponentProps: PropTypes.object,\r\n\t// `estimatedItemHeight` property name is deprecated,\r\n\t// use `getEstimatedItemHeight` property instead.\r\n\testimatedItemHeight: PropTypes.number,\r\n\tgetEstimatedItemHeight: PropTypes.func,\r\n\tgetEstimatedVisibleItemRowsCount: PropTypes.func,\r\n\tbypass: PropTypes.bool,\r\n\t// bypassBatchSize: PropTypes.number,\r\n\ttbody: PropTypes.bool,\r\n\tpreserveScrollPositionOnPrependItems: PropTypes.bool,\r\n\t// `preserveScrollPosition` property name is deprecated,\r\n\t// use `preserveScrollPositionOnPrependItems` instead.\r\n\tpreserveScrollPosition: PropTypes.bool,\r\n\tmeasureItemsBatchSize: PropTypes.number,\r\n\t// `scrollableContainer` property is deprecated.\r\n\t// Use `getScrollableContainer()` property instead.\r\n\tscrollableContainer: PropTypes.any,\r\n\tgetScrollableContainer: PropTypes.func,\r\n\tgetColumnsCount: PropTypes.func,\r\n\tgetItemId: PropTypes.func,\r\n\tclassName: PropTypes.string,\r\n\tonMount: PropTypes.func,\r\n\tonItemInitialRender: PropTypes.func,\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\tonItemFirstRender: PropTypes.func,\r\n\tinitialScrollPosition: PropTypes.number,\r\n\tonScrollPositionChange: PropTypes.func,\r\n\tonStateChange: PropTypes.func,\r\n\tinitialState: PropTypes.shape({\r\n\t\titems: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n\t\titemStates: PropTypes.arrayOf(PropTypes.any).isRequired,\r\n\t\tfirstShownItemIndex: PropTypes.number.isRequired,\r\n\t\tlastShownItemIndex: PropTypes.number.isRequired,\r\n\t\tbeforeItemsHeight: PropTypes.number.isRequired,\r\n\t\tafterItemsHeight: PropTypes.number.isRequired,\r\n\t\titemHeights: PropTypes.arrayOf(PropTypes.number).isRequired,\r\n\t\tcolumnsCount: PropTypes.number,\r\n\t\tverticalSpacing: PropTypes.number\r\n\t}),\r\n\tgetInitialItemState: PropTypes.func\r\n}\r\n\r\nVirtualScroller.defaultProps = {\r\n\tas: 'div'\r\n}\r\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { useMemo, useRef, useCallback } from 'react';
2
- export default function useOnItemStateChange(_ref) {
2
+ export default function useSetItemState(_ref) {
3
3
  var items = _ref.items,
4
4
  virtualScroller = _ref.virtualScroller;
5
5
  // Only compute the initial cache value once.
@@ -7,18 +7,18 @@ export default function useOnItemStateChange(_ref) {
7
7
  return new Array(items.length);
8
8
  }, []); // Handler functions cache.
9
9
 
10
- var cache = useRef(initialCacheValue); // Caches per-item `onItemStateChange` functions' "references"
10
+ var cache = useRef(initialCacheValue); // Caches per-item `setItemState` functions' "references"
11
11
  // so that item components don't get re-rendered needlessly.
12
12
 
13
- var getOnItemStateChange = useCallback(function (i) {
13
+ var getSetItemState = useCallback(function (i) {
14
14
  if (!cache.current[i]) {
15
15
  cache.current[i] = function (itemState) {
16
- return virtualScroller.onItemStateChange(i, itemState);
16
+ return virtualScroller.setItemState(i, itemState);
17
17
  };
18
18
  }
19
19
 
20
20
  return cache.current[i];
21
21
  }, [virtualScroller, cache]);
22
- return getOnItemStateChange;
22
+ return getSetItemState;
23
23
  }
24
- //# sourceMappingURL=useOnItemStateChange.js.map
24
+ //# sourceMappingURL=useSetItemState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSetItemState.js","names":["useMemo","useRef","useCallback","useSetItemState","items","virtualScroller","initialCacheValue","Array","length","cache","getSetItemState","i","current","itemState","setItemState"],"sources":["../../source/react/useSetItemState.js"],"sourcesContent":["import { useMemo, useRef, useCallback } from 'react'\r\n\r\nexport default function useSetItemState({\r\n\titems,\r\n\tvirtualScroller\r\n}) {\r\n\t// Only compute the initial cache value once.\r\n\tconst initialCacheValue = useMemo(() => {\r\n\t\treturn new Array(items.length)\r\n\t}, [])\r\n\r\n\t// Handler functions cache.\r\n\tconst cache = useRef(initialCacheValue)\r\n\r\n\t// Caches per-item `setItemState` functions' \"references\"\r\n\t// so that item components don't get re-rendered needlessly.\r\n\tconst getSetItemState = useCallback((i) => {\r\n\t\tif (!cache.current[i]) {\r\n\t\t\tcache.current[i] = (itemState) => virtualScroller.setItemState(i, itemState)\r\n\t\t}\r\n\t\treturn cache.current[i]\r\n\t}, [\r\n\t\tvirtualScroller,\r\n\t\tcache\r\n\t])\r\n\r\n\treturn getSetItemState\r\n}"],"mappings":"AAAA,SAASA,OAAT,EAAkBC,MAAlB,EAA0BC,WAA1B,QAA6C,OAA7C;AAEA,eAAe,SAASC,eAAT,OAGZ;EAAA,IAFFC,KAEE,QAFFA,KAEE;EAAA,IADFC,eACE,QADFA,eACE;EACF;EACA,IAAMC,iBAAiB,GAAGN,OAAO,CAAC,YAAM;IACvC,OAAO,IAAIO,KAAJ,CAAUH,KAAK,CAACI,MAAhB,CAAP;EACA,CAFgC,EAE9B,EAF8B,CAAjC,CAFE,CAMF;;EACA,IAAMC,KAAK,GAAGR,MAAM,CAACK,iBAAD,CAApB,CAPE,CASF;EACA;;EACA,IAAMI,eAAe,GAAGR,WAAW,CAAC,UAACS,CAAD,EAAO;IAC1C,IAAI,CAACF,KAAK,CAACG,OAAN,CAAcD,CAAd,CAAL,EAAuB;MACtBF,KAAK,CAACG,OAAN,CAAcD,CAAd,IAAmB,UAACE,SAAD;QAAA,OAAeR,eAAe,CAACS,YAAhB,CAA6BH,CAA7B,EAAgCE,SAAhC,CAAf;MAAA,CAAnB;IACA;;IACD,OAAOJ,KAAK,CAACG,OAAN,CAAcD,CAAd,CAAP;EACA,CALkC,EAKhC,CACFN,eADE,EAEFI,KAFE,CALgC,CAAnC;EAUA,OAAOC,eAAP;AACA"}
@@ -21,6 +21,7 @@ export default function useVirtualScroller(_ref, _ref2) {
21
21
  getItemId = _ref.getItemId,
22
22
  AsComponent = _ref.AsComponent,
23
23
  initialState = _ref.initialState,
24
+ getInitialItemState = _ref.getInitialItemState,
24
25
  onStateChange = _ref.onStateChange;
25
26
  var container = _ref2.container;
26
27
  return useMemo(function () {
@@ -50,7 +51,7 @@ export default function useVirtualScroller(_ref, _ref2) {
50
51
  getScrollableContainer: getScrollableContainer,
51
52
  getColumnsCount: getColumnsCount,
52
53
  getItemId: getItemId
53
- }, _defineProperty(_VirtualScroller, "tbody", AsComponent === 'tbody'), _defineProperty(_VirtualScroller, "state", initialState), _defineProperty(_VirtualScroller, "onStateChange", onStateChange), _VirtualScroller));
54
+ }, _defineProperty(_VirtualScroller, "tbody", AsComponent === 'tbody'), _defineProperty(_VirtualScroller, "state", initialState), _defineProperty(_VirtualScroller, "getInitialItemState", getInitialItemState), _defineProperty(_VirtualScroller, "onStateChange", onStateChange), _VirtualScroller));
54
55
  }, []);
55
56
  }
56
57
  //# sourceMappingURL=useVirtualScroller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useVirtualScroller.js","names":["useMemo","VirtualScroller","useVirtualScroller","items","estimatedItemHeight","getEstimatedItemHeight","getEstimatedVisibleItemRowsCount","bypass","tbody","onItemInitialRender","onItemFirstRender","initialScrollPosition","onScrollPositionChange","measureItemsBatchSize","scrollableContainer","getScrollableContainer","getColumnsCount","getItemId","AsComponent","initialState","onStateChange","container","current","_useTimeoutInRenderLoop"],"sources":["../../source/react/useVirtualScroller.js"],"sourcesContent":["import { useMemo } from 'react'\r\n\r\nimport VirtualScroller from '../VirtualScroller.js'\r\n\r\n// Creates a `VirtualScroller` instance.\r\nexport default function useVirtualScroller({\r\n\titems,\r\n\t// `estimatedItemHeight` is deprecated, use `getEstimatedItemHeight()` instead.\r\n\testimatedItemHeight,\r\n\tgetEstimatedItemHeight,\r\n\tgetEstimatedVisibleItemRowsCount,\r\n\tbypass,\r\n\t// bypassBatchSize,\r\n\ttbody,\r\n\tonItemInitialRender,\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\tonItemFirstRender,\r\n\tinitialScrollPosition,\r\n\tonScrollPositionChange,\r\n\tmeasureItemsBatchSize,\r\n\t// `scrollableContainer` property is deprecated.\r\n\t// Use `getScrollableContainer()` property instead.\r\n\tscrollableContainer,\r\n\tgetScrollableContainer,\r\n\tgetColumnsCount,\r\n\tgetItemId,\r\n\tAsComponent,\r\n\tinitialState,\r\n\tonStateChange\r\n}, {\r\n\tcontainer\r\n}) {\r\n\treturn useMemo(() => {\r\n\t\t// Create `virtual-scroller` instance.\r\n\t\treturn new VirtualScroller(\r\n\t\t\t() => container.current,\r\n\t\t\titems,\r\n\t\t\t{\r\n\t\t\t\t_useTimeoutInRenderLoop: true,\r\n\t\t\t\t// `estimatedItemHeight` is deprecated, use `getEstimatedItemHeight()` instead.\r\n\t\t\t\testimatedItemHeight,\r\n\t\t\t\tgetEstimatedItemHeight,\r\n\t\t\t\tgetEstimatedVisibleItemRowsCount,\r\n\t\t\t\tbypass,\r\n\t\t\t\t// bypassBatchSize,\r\n\t\t\t\ttbody,\r\n\t\t\t\tonItemInitialRender,\r\n\t\t\t\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\t\t\t\tonItemFirstRender,\r\n\t\t\t\tinitialScrollPosition,\r\n\t\t\t\tonScrollPositionChange,\r\n\t\t\t\tmeasureItemsBatchSize,\r\n\t\t\t\t// `scrollableContainer` property is deprecated.\r\n\t\t\t\t// Use `getScrollableContainer()` property instead.\r\n\t\t\t\tscrollableContainer,\r\n\t\t\t\tgetScrollableContainer,\r\n\t\t\t\tgetColumnsCount,\r\n\t\t\t\tgetItemId,\r\n\t\t\t\ttbody: AsComponent === 'tbody',\r\n\t\t\t\tstate: initialState,\r\n\t\t\t\tonStateChange\r\n\t\t\t}\r\n\t\t)\r\n\t}, [])\r\n}"],"mappings":";;AAAA,SAASA,OAAT,QAAwB,OAAxB;AAEA,OAAOC,eAAP,MAA4B,uBAA5B,C,CAEA;;AACA,eAAe,SAASC,kBAAT,cA0BZ;EAAA,IAzBFC,KAyBE,QAzBFA,KAyBE;EAAA,IAvBFC,mBAuBE,QAvBFA,mBAuBE;EAAA,IAtBFC,sBAsBE,QAtBFA,sBAsBE;EAAA,IArBFC,gCAqBE,QArBFA,gCAqBE;EAAA,IApBFC,MAoBE,QApBFA,MAoBE;EAAA,IAlBFC,KAkBE,QAlBFA,KAkBE;EAAA,IAjBFC,mBAiBE,QAjBFA,mBAiBE;EAAA,IAfFC,iBAeE,QAfFA,iBAeE;EAAA,IAdFC,qBAcE,QAdFA,qBAcE;EAAA,IAbFC,sBAaE,QAbFA,sBAaE;EAAA,IAZFC,qBAYE,QAZFA,qBAYE;EAAA,IATFC,mBASE,QATFA,mBASE;EAAA,IARFC,sBAQE,QARFA,sBAQE;EAAA,IAPFC,eAOE,QAPFA,eAOE;EAAA,IANFC,SAME,QANFA,SAME;EAAA,IALFC,WAKE,QALFA,WAKE;EAAA,IAJFC,YAIE,QAJFA,YAIE;EAAA,IAHFC,aAGE,QAHFA,aAGE;EAAA,IADFC,SACE,SADFA,SACE;EACF,OAAOrB,OAAO,CAAC,YAAM;IAAA;;IACpB;IACA,OAAO,IAAIC,eAAJ,CACN;MAAA,OAAMoB,SAAS,CAACC,OAAhB;IAAA,CADM,EAENnB,KAFM;MAILoB,uBAAuB,EAAE,IAJpB;MAKL;MACAnB,mBAAmB,EAAnBA,mBANK;MAOLC,sBAAsB,EAAtBA,sBAPK;MAQLC,gCAAgC,EAAhCA,gCARK;MASLC,MAAM,EAANA,MATK;MAUL;MACAC,KAAK,EAALA,KAXK;MAYLC,mBAAmB,EAAnBA,mBAZK;MAaL;MACAC,iBAAiB,EAAjBA,iBAdK;MAeLC,qBAAqB,EAArBA,qBAfK;MAgBLC,sBAAsB,EAAtBA,sBAhBK;MAiBLC,qBAAqB,EAArBA,qBAjBK;MAkBL;MACA;MACAC,mBAAmB,EAAnBA,mBApBK;MAqBLC,sBAAsB,EAAtBA,sBArBK;MAsBLC,eAAe,EAAfA,eAtBK;MAuBLC,SAAS,EAATA;IAvBK,8CAwBEC,WAAW,KAAK,OAxBlB,8CAyBEC,YAzBF,sDA0BLC,aA1BK,qBAAP;EA6BA,CA/Ba,EA+BX,EA/BW,CAAd;AAgCA"}
1
+ {"version":3,"file":"useVirtualScroller.js","names":["useMemo","VirtualScroller","useVirtualScroller","items","estimatedItemHeight","getEstimatedItemHeight","getEstimatedVisibleItemRowsCount","bypass","tbody","onItemInitialRender","onItemFirstRender","initialScrollPosition","onScrollPositionChange","measureItemsBatchSize","scrollableContainer","getScrollableContainer","getColumnsCount","getItemId","AsComponent","initialState","getInitialItemState","onStateChange","container","current","_useTimeoutInRenderLoop"],"sources":["../../source/react/useVirtualScroller.js"],"sourcesContent":["import { useMemo } from 'react'\r\n\r\nimport VirtualScroller from '../VirtualScroller.js'\r\n\r\n// Creates a `VirtualScroller` instance.\r\nexport default function useVirtualScroller({\r\n\titems,\r\n\t// `estimatedItemHeight` is deprecated, use `getEstimatedItemHeight()` instead.\r\n\testimatedItemHeight,\r\n\tgetEstimatedItemHeight,\r\n\tgetEstimatedVisibleItemRowsCount,\r\n\tbypass,\r\n\t// bypassBatchSize,\r\n\ttbody,\r\n\tonItemInitialRender,\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\tonItemFirstRender,\r\n\tinitialScrollPosition,\r\n\tonScrollPositionChange,\r\n\tmeasureItemsBatchSize,\r\n\t// `scrollableContainer` property is deprecated.\r\n\t// Use `getScrollableContainer()` property instead.\r\n\tscrollableContainer,\r\n\tgetScrollableContainer,\r\n\tgetColumnsCount,\r\n\tgetItemId,\r\n\tAsComponent,\r\n\tinitialState,\r\n\tgetInitialItemState,\r\n\tonStateChange\r\n}, {\r\n\tcontainer\r\n}) {\r\n\treturn useMemo(() => {\r\n\t\t// Create `virtual-scroller` instance.\r\n\t\treturn new VirtualScroller(\r\n\t\t\t() => container.current,\r\n\t\t\titems,\r\n\t\t\t{\r\n\t\t\t\t_useTimeoutInRenderLoop: true,\r\n\t\t\t\t// `estimatedItemHeight` is deprecated, use `getEstimatedItemHeight()` instead.\r\n\t\t\t\testimatedItemHeight,\r\n\t\t\t\tgetEstimatedItemHeight,\r\n\t\t\t\tgetEstimatedVisibleItemRowsCount,\r\n\t\t\t\tbypass,\r\n\t\t\t\t// bypassBatchSize,\r\n\t\t\t\ttbody,\r\n\t\t\t\tonItemInitialRender,\r\n\t\t\t\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\t\t\t\tonItemFirstRender,\r\n\t\t\t\tinitialScrollPosition,\r\n\t\t\t\tonScrollPositionChange,\r\n\t\t\t\tmeasureItemsBatchSize,\r\n\t\t\t\t// `scrollableContainer` property is deprecated.\r\n\t\t\t\t// Use `getScrollableContainer()` property instead.\r\n\t\t\t\tscrollableContainer,\r\n\t\t\t\tgetScrollableContainer,\r\n\t\t\t\tgetColumnsCount,\r\n\t\t\t\tgetItemId,\r\n\t\t\t\ttbody: AsComponent === 'tbody',\r\n\t\t\t\tstate: initialState,\r\n\t\t\t\tgetInitialItemState,\r\n\t\t\t\tonStateChange\r\n\t\t\t}\r\n\t\t)\r\n\t}, [])\r\n}"],"mappings":";;AAAA,SAASA,OAAT,QAAwB,OAAxB;AAEA,OAAOC,eAAP,MAA4B,uBAA5B,C,CAEA;;AACA,eAAe,SAASC,kBAAT,cA2BZ;EAAA,IA1BFC,KA0BE,QA1BFA,KA0BE;EAAA,IAxBFC,mBAwBE,QAxBFA,mBAwBE;EAAA,IAvBFC,sBAuBE,QAvBFA,sBAuBE;EAAA,IAtBFC,gCAsBE,QAtBFA,gCAsBE;EAAA,IArBFC,MAqBE,QArBFA,MAqBE;EAAA,IAnBFC,KAmBE,QAnBFA,KAmBE;EAAA,IAlBFC,mBAkBE,QAlBFA,mBAkBE;EAAA,IAhBFC,iBAgBE,QAhBFA,iBAgBE;EAAA,IAfFC,qBAeE,QAfFA,qBAeE;EAAA,IAdFC,sBAcE,QAdFA,sBAcE;EAAA,IAbFC,qBAaE,QAbFA,qBAaE;EAAA,IAVFC,mBAUE,QAVFA,mBAUE;EAAA,IATFC,sBASE,QATFA,sBASE;EAAA,IARFC,eAQE,QARFA,eAQE;EAAA,IAPFC,SAOE,QAPFA,SAOE;EAAA,IANFC,WAME,QANFA,WAME;EAAA,IALFC,YAKE,QALFA,YAKE;EAAA,IAJFC,mBAIE,QAJFA,mBAIE;EAAA,IAHFC,aAGE,QAHFA,aAGE;EAAA,IADFC,SACE,SADFA,SACE;EACF,OAAOtB,OAAO,CAAC,YAAM;IAAA;;IACpB;IACA,OAAO,IAAIC,eAAJ,CACN;MAAA,OAAMqB,SAAS,CAACC,OAAhB;IAAA,CADM,EAENpB,KAFM;MAILqB,uBAAuB,EAAE,IAJpB;MAKL;MACApB,mBAAmB,EAAnBA,mBANK;MAOLC,sBAAsB,EAAtBA,sBAPK;MAQLC,gCAAgC,EAAhCA,gCARK;MASLC,MAAM,EAANA,MATK;MAUL;MACAC,KAAK,EAALA,KAXK;MAYLC,mBAAmB,EAAnBA,mBAZK;MAaL;MACAC,iBAAiB,EAAjBA,iBAdK;MAeLC,qBAAqB,EAArBA,qBAfK;MAgBLC,sBAAsB,EAAtBA,sBAhBK;MAiBLC,qBAAqB,EAArBA,qBAjBK;MAkBL;MACA;MACAC,mBAAmB,EAAnBA,mBApBK;MAqBLC,sBAAsB,EAAtBA,sBArBK;MAsBLC,eAAe,EAAfA,eAtBK;MAuBLC,SAAS,EAATA;IAvBK,8CAwBEC,WAAW,KAAK,OAxBlB,8CAyBEC,YAzBF,4DA0BLC,mBA1BK,sDA2BLC,aA3BK,qBAAP;EA8BA,CAhCa,EAgCX,EAhCW,CAAd;AAiCA"}
@@ -0,0 +1,11 @@
1
+ export default function fillArray(array, getItem) {
2
+ var i = 0;
3
+
4
+ while (i < array.length) {
5
+ array[i] = getItem(i);
6
+ i++;
7
+ }
8
+
9
+ return array;
10
+ }
11
+ //# sourceMappingURL=fillArray.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fillArray.js","names":["fillArray","array","getItem","i","length"],"sources":["../../source/utility/fillArray.js"],"sourcesContent":["export default function fillArray(array, getItem) {\r\n\tlet i = 0\r\n\twhile (i < array.length) {\r\n\t\tarray[i] = getItem(i)\r\n\t\ti++\r\n\t}\r\n\treturn array\r\n}"],"mappings":"AAAA,eAAe,SAASA,SAAT,CAAmBC,KAAnB,EAA0BC,OAA1B,EAAmC;EACjD,IAAIC,CAAC,GAAG,CAAR;;EACA,OAAOA,CAAC,GAAGF,KAAK,CAACG,MAAjB,EAAyB;IACxBH,KAAK,CAACE,CAAD,CAAL,GAAWD,OAAO,CAACC,CAAD,CAAlB;IACAA,CAAC;EACD;;EACD,OAAOF,KAAP;AACA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "virtual-scroller",
3
- "version": "1.10.2",
3
+ "version": "1.11.0",
4
4
  "description": "A component for efficiently rendering large lists of variable height items",
5
5
  "main": "index.cjs",
6
6
  "module": "index.js",
package/react/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { State, VirtualScrollerCommonOptions } from '../index.d.ts';
1
+ import { State, NoItemState, VirtualScrollerCommonOptions } from '../index.d.ts';
2
2
 
3
- export { State, ItemState } from '../index.d.ts';
3
+ export { State } from '../index.d.ts';
4
4
 
5
5
  import * as React from 'react';
6
6
 
@@ -48,19 +48,25 @@ export type PolymorphicComponentProps<
48
48
  Props = {}
49
49
  > = InheritableElementProps<C, Props & AsProp<C>>
50
50
 
51
- interface Props<Item, ItemComponentProps extends object>
52
- extends VirtualScrollerCommonOptions<Item>{
51
+ interface ItemComponentPassedProps<Item, ItemState> {
52
+ item: Item;
53
+ state: ItemState;
54
+ setState: (newState: ItemState) => void;
55
+ onHeightChange: () => void;
56
+ }
57
+
58
+ interface Props<ItemComponentProps extends object, Item, ItemState> extends VirtualScrollerCommonOptions<Item, ItemState> {
53
59
  items: Item[];
54
- itemComponent: React.ElementType<ItemComponentProps & { item: Item, itemIndex: number }>;
60
+ itemComponent: React.ElementType<ItemComponentProps & ItemComponentPassedProps<Item, ItemState>>;
55
61
  itemComponentProps?: ItemComponentProps;
56
- initialState?: State<Item>;
62
+ initialState?: State<Item, ItemState>;
57
63
  preserveScrollPositionOnPrependItems?: boolean;
58
64
 
59
65
  getScrollableContainer?(): HTMLElement;
60
66
  }
61
67
 
62
- declare function VirtualScroller<Item = any, ItemComponentProps extends object={}, AsElement extends React.ElementType = 'div'>(
63
- props: PolymorphicComponentProps<AsElement, Props<Item, ItemComponentProps>>
68
+ declare function VirtualScroller<ItemComponentProps extends object = {}, Item = any, ItemState = NoItemState, AsElement extends React.ElementType = 'div'>(
69
+ props: PolymorphicComponentProps<AsElement, Props<ItemComponentProps, Item, ItemState>>
64
70
  ): JSX.Element;
65
71
 
66
72
  export default VirtualScroller;
@@ -145,6 +145,10 @@ export default class VirtualScroller {
145
145
  this.virtualScroller.onItemHeightChange(i)
146
146
  }
147
147
 
148
+ setItemState(i, newState) {
149
+ this.virtualScroller.setItemState(i, newState)
150
+ }
151
+
148
152
  /**
149
153
  * @deprecated
150
154
  * `.updateItems()` has been renamed to `.setItems()`.
@@ -169,7 +169,7 @@ export default class ItemHeights {
169
169
  const previousHeight = this._get(i)
170
170
  const height = this._measureItemHeight(i, firstShownItemIndex)
171
171
  if (previousHeight !== height) {
172
- warn('Item index', i, 'height changed unexpectedly: it was', previousHeight, 'before, but now it is', height, '. An item\'s height is allowed to change only in two cases: when the item\'s "state" changes and the developer calls `onItemStateChange(i, newState)`, or when the item\'s height changes for some other reason and the developer calls `onItemHeightChange(i)`. Perhaps you forgot to persist the item\'s "state" by calling `onItemStateChange(i, newState)` when it changed, and that "state" got lost when the item element was unmounted, which resulted in a different height when the item was shown again having its "state" reset.')
172
+ warn('Item index', i, 'height changed unexpectedly: it was', previousHeight, 'before, but now it is', height, '. An item\'s height is allowed to change only in two cases: when the item\'s "state" changes and the developer calls `setItemState(i, newState)`, or when the item\'s height changes for some other reason and the developer calls `onItemHeightChange(i)`. Perhaps you forgot to persist the item\'s "state" by calling `setItemState(i, newState)` when it changed, and that "state" got lost when the item element was unmounted, which resulted in a different height when the item was shown again having its "state" reset.')
173
173
  // Update the item's height as an attempt to fix things.
174
174
  this._set(i, height)
175
175
  }
@@ -36,6 +36,7 @@ export default function VirtualScrollerConstructor(
36
36
  const {
37
37
  render,
38
38
  state,
39
+ getInitialItemState = () => {},
39
40
  onStateChange,
40
41
  initialScrollPosition,
41
42
  onScrollPositionChange,
@@ -185,7 +186,7 @@ export default function VirtualScrollerConstructor(
185
186
  log('Estimated item height', getEstimatedItemHeight())
186
187
  }
187
188
 
188
- createStateHelpers.call(this, { state, onStateChange, render, items })
189
+ createStateHelpers.call(this, { state, getInitialItemState, onStateChange, render, items })
189
190
 
190
191
  createVerticalSpacingHelpers.call(this)
191
192
  createColumnsHelpers.call(this, { getColumnsCount })
@@ -1,5 +1,6 @@
1
1
  import log, { isDebug } from './utility/debug.js'
2
2
  import getItemsDiff from './getItemsDiff.js'
3
+ import fillArray from './utility/fillArray.js'
3
4
 
4
5
  export default function() {
5
6
  this.getItemsCount = () => {
@@ -81,10 +82,11 @@ export default function() {
81
82
  log('Prepend', prependedItemsCount, 'items')
82
83
 
83
84
  itemHeights = new Array(prependedItemsCount).concat(itemHeights)
84
-
85
- if (itemStates) {
86
- itemStates = new Array(prependedItemsCount).concat(itemStates)
87
- }
85
+ itemStates = fillArray(
86
+ new Array(prependedItemsCount),
87
+ (i) => this.getInitialItemState(newItems[i])
88
+ )
89
+ .concat(itemStates)
88
90
 
89
91
  // Restore scroll position after prepending items (if requested).
90
92
  if (shouldRestoreScrollPosition) {
@@ -126,9 +128,12 @@ export default function() {
126
128
  if (appendedItemsCount > 0) {
127
129
  log('Append', appendedItemsCount, 'items')
128
130
  itemHeights = itemHeights.concat(new Array(appendedItemsCount))
129
- if (itemStates) {
130
- itemStates = itemStates.concat(new Array(appendedItemsCount))
131
- }
131
+ itemStates = itemStates.concat(
132
+ fillArray(
133
+ new Array(appendedItemsCount),
134
+ (i) => this.getInitialItemState(newItems[prependedItemsCount + previousItems.length + i])
135
+ )
136
+ )
132
137
  }
133
138
 
134
139
  itemsUpdateInfo = {
@@ -142,7 +147,10 @@ export default function() {
142
147
 
143
148
  // Reset item heights and item states.
144
149
  itemHeights = new Array(newItems.length)
145
- itemStates = new Array(newItems.length)
150
+ itemStates = fillArray(
151
+ new Array(newItems.length),
152
+ (i) => this.getInitialItemState(newItems[i])
153
+ )
146
154
 
147
155
  layoutUpdate = this.layout.getInitialLayoutValues({
148
156
  itemsCount: newItems.length,
@@ -219,9 +219,15 @@ export default class VirtualScroller {
219
219
  * @param {number} i — Item index
220
220
  * @param {any} i — Item's new state
221
221
  */
222
- onItemStateChange(i, newItemState) {
222
+ setItemState(i, newItemState) {
223
223
  this.hasToBeStarted()
224
- this._onItemStateChange(i, newItemState)
224
+ this._setItemState(i, newItemState)
225
+ }
226
+
227
+ // (deprecated)
228
+ // Use `.setItemState()` method name instead.
229
+ onItemStateChange(i, newItemState) {
230
+ this.setItemState(i, newItemState)
225
231
  }
226
232
 
227
233
  /**
@@ -99,7 +99,7 @@ export default function() {
99
99
  // or an "Expand YouTube video" button, which would result
100
100
  // in the actual height of the list item being different
101
101
  // from what has been initially measured in `this.itemHeights[i]`,
102
- // if the developer didn't call `.onItemStateChange()` and `.onItemHeightChange(i)`.
102
+ // if the developer didn't call `.setItemState(i, newState)` and `.onItemHeightChange(i)`.
103
103
  if (!validateWillBeHiddenItemHeightsAreAccurate.call(this, firstShownItemIndex, lastShownItemIndex)) {
104
104
  log('~ Because some of the will-be-hidden item heights (listed above) have changed since they\'ve last been measured, redo layout. ~')
105
105
  // Redo layout, now with the correct item heights.
@@ -269,7 +269,7 @@ export default function() {
269
269
  * or an "Expand YouTube video" button, which would result
270
270
  * in the actual height of the list item being different
271
271
  * from what has been initially measured in `this.itemHeights[i]`,
272
- * if the developer didn't call `.onItemStateChange()` and `.onItemHeightChange(i)`.
272
+ * if the developer didn't call `.setItemState(i, newState)` and `.onItemHeightChange(i)`.
273
273
  */
274
274
  function validateWillBeHiddenItemHeightsAreAccurate(firstShownItemIndex, lastShownItemIndex) {
275
275
  let isValid = true