1- import {
2- initCache ,
3- getItemSize as _getItemSize ,
4- getItemOffset as _getItemOffset ,
5- UNCACHED ,
6- setItemSize ,
7- estimateDefaultItemSize ,
8- updateCacheLength ,
9- computeRange ,
10- takeCacheSnapshot ,
11- findIndex ,
12- } from "./cache.js" ;
131import { isIOSWebKit } from "./environment.js" ;
14- import type {
15- CacheSnapshot ,
16- InternalCacheSnapshot ,
17- ItemResize ,
18- ItemsRange ,
19- } from "./types.js" ;
2+ import { LayoutCache } from "./layout.js" ;
3+ import type { ItemResize , ItemsRange } from "./types.js" ;
204import { abs , max , min , NULL } from "./utils.js" ;
215
226const MAX_INT_32 = 0x7fffffff ;
@@ -95,7 +79,6 @@ export type StateVersion =
9579export type VirtualStore = {
9680 $dispose ( ) : void ;
9781 $getStateVersion ( ) : StateVersion ;
98- $getCacheSnapshot ( ) : CacheSnapshot ;
9982 $getRange ( bufferSize ?: number ) : ItemsRange ;
10083 $findStartIndex ( ) : number ;
10184 $findEndIndex ( ) : number ;
@@ -117,10 +100,19 @@ export type VirtualStore = {
117100 * @internal
118101 */
119102export const createVirtualStore = (
120- elementsCount : number ,
121- itemSize : number = 40 ,
103+ {
104+ $getRange : getRange ,
105+ $findIndex : findIndex ,
106+ $setItemSize : setItemSize ,
107+ $getItemSize : getItemSize ,
108+ $getItemOffset : _getItemOffset ,
109+ $getTotalSize : getTotalSize ,
110+ $setLength : updateCacheLength ,
111+ $getLength : getLength ,
112+ $isSizeEqual : isSizeEqual ,
113+ $calcDefaultSize : updateDefaultSize ,
114+ } : LayoutCache ,
122115 ssrCount : number = 0 ,
123- cacheSnapshot ?: CacheSnapshot | undefined ,
124116 shouldAutoEstimateItemSize : boolean = false
125117) : VirtualStore => {
126118 let isSSR = ! ! ssrCount ;
@@ -137,27 +129,11 @@ export const createVirtualStore = (
137129 let _prevRange : ItemsRange = [ 0 , isSSR ? max ( ssrCount - 1 , 0 ) : - 1 ] ;
138130 let _totalMeasuredSize = 0 ;
139131
140- const cache = initCache (
141- elementsCount ,
142- itemSize ,
143- cacheSnapshot as unknown as InternalCacheSnapshot | undefined
144- ) ;
145132 const subscribers = new Set < [ number , Subscriber ] > ( ) ;
133+
146134 const getRelativeScrollOffset = ( ) => scrollOffset - startSpacerSize ;
147135 const getVisibleOffset = ( ) => getRelativeScrollOffset ( ) + pendingJump + jump ;
148- const getRange = ( startOffset : number , endOffset : number ) => {
149- return computeRange ( cache , startOffset , endOffset , _prevRange [ 0 ] ) ;
150- } ;
151- const getTotalSize = ( ) : number => _getItemOffset ( cache , cache . _length ) ;
152- const getItemOffset = ( index : number ) : number => {
153- return _getItemOffset ( cache , index ) - pendingJump ;
154- } ;
155- const getItemSize = ( index : number ) : number => {
156- return _getItemSize ( cache , index ) ;
157- } ;
158- const isSizeEqual = ( index : number , value : number = UNCACHED ) : boolean => {
159- return cache . _sizes [ index ] === value ;
160- } ;
136+ const getItemOffset = ( index : number ) => _getItemOffset ( index ) - pendingJump ;
161137
162138 const applyJump = ( j : number ) => {
163139 if ( j ) {
@@ -180,9 +156,6 @@ export const createVirtualStore = (
180156 subscribers . clear ( ) ;
181157 } ,
182158 $getStateVersion : ( ) => stateVersion ,
183- $getCacheSnapshot : ( ) => {
184- return takeCacheSnapshot ( cache ) as unknown as CacheSnapshot ;
185- } ,
186159 $getRange : ( bufferSize = 200 ) => {
187160 if ( ! viewportSize || isSSR ) {
188161 // Empty viewportSize means the first render.
@@ -222,14 +195,14 @@ export const createVirtualStore = (
222195 }
223196 }
224197
225- return [ max ( startIndex , 0 ) , min ( endIndex , cache . _length - 1 ) ] ;
198+ return [ max ( startIndex , 0 ) , min ( endIndex , getLength ( ) - 1 ) ] ;
226199 } ,
227- $findStartIndex : ( ) => findIndex ( cache , getVisibleOffset ( ) ) ,
228- $findEndIndex : ( ) => findIndex ( cache , getVisibleOffset ( ) + viewportSize ) ,
200+ $findStartIndex : ( ) => findIndex ( getVisibleOffset ( ) ) ,
201+ $findEndIndex : ( ) => findIndex ( getVisibleOffset ( ) + viewportSize ) ,
229202 $isUnmeasuredItem : isSizeEqual ,
230203 $getItemOffset : getItemOffset ,
231204 $getItemSize : getItemSize ,
232- $getItemsLength : ( ) => cache . _length ,
205+ $getItemsLength : getLength ,
233206 $getScrollOffset : ( ) => scrollOffset ,
234207 $isScrolling : ( ) => _scrollDirection !== SCROLL_IDLE ,
235208 $getViewportSize : ( ) => viewportSize ,
@@ -362,7 +335,7 @@ export const createVirtualStore = (
362335 // Update item sizes
363336 for ( const [ index , size ] of updated ) {
364337 const prevSize = getItemSize ( index ) ;
365- const isInitialMeasurement = setItemSize ( cache , index , size ) ;
338+ const isInitialMeasurement = setItemSize ( index , size ) ;
366339
367340 if ( shouldAutoEstimateItemSize ) {
368341 _totalMeasuredSize += isInitialMeasurement
@@ -378,12 +351,7 @@ export const createVirtualStore = (
378351 // If the total size is lower than the viewport, the item may be a empty state
379352 _totalMeasuredSize > viewportSize
380353 ) {
381- applyJump (
382- estimateDefaultItemSize (
383- cache ,
384- findIndex ( cache , getVisibleOffset ( ) )
385- )
386- ) ;
354+ applyJump ( updateDefaultSize ( getVisibleOffset ( ) ) ) ;
387355 shouldAutoEstimateItemSize = false ;
388356 }
389357
@@ -410,11 +378,11 @@ export const createVirtualStore = (
410378 }
411379 case ACTION_ITEMS_LENGTH_CHANGE : {
412380 if ( payload [ 1 ] ) {
413- applyJump ( updateCacheLength ( cache , payload [ 0 ] , true ) ) ;
381+ applyJump ( updateCacheLength ( payload [ 0 ] , true ) ) ;
414382 _scrollMode = SCROLL_BY_SHIFT ;
415383 mutated = UPDATE_VIRTUAL_STATE ;
416384 } else {
417- updateCacheLength ( cache , payload [ 0 ] ) ;
385+ updateCacheLength ( payload [ 0 ] ) ;
418386 // https://github.com/inokawa/virtua/issues/552
419387 // https://github.com/inokawa/virtua/issues/557
420388 mutated = UPDATE_VIRTUAL_STATE ;
0 commit comments