1313import { Collection , Key } from '@react-types/shared' ;
1414import { Layout , Rect , ReusableView , useVirtualizerState , VirtualizerState } from '@react-stately/virtualizer' ;
1515import { mergeProps , useLayoutEffect } from '@react-aria/utils' ;
16- import React , { createContext , HTMLAttributes , ReactElement , ReactNode , RefObject , useCallback , useMemo , useRef } from 'react' ;
16+ import React , { HTMLAttributes , ReactElement , ReactNode , RefObject , useCallback , useMemo , useRef } from 'react' ;
1717import { ScrollView } from './ScrollView' ;
1818import { VirtualizerItem } from './VirtualizerItem' ;
1919
20+ type RenderWrapper < T extends object , V > = (
21+ parent : ReusableView < T , V > | null ,
22+ reusableView : ReusableView < T , V > ,
23+ children : ReusableView < T , V > [ ] ,
24+ renderChildren : ( views : ReusableView < T , V > [ ] ) => ReactElement [ ]
25+ ) => ReactElement ;
26+
2027interface VirtualizerProps < T extends object , V , O > extends Omit < HTMLAttributes < HTMLElement > , 'children' > {
2128 children : ( type : string , content : T ) => V ,
22- renderWrapper ?: (
23- parent : ReusableView < T , V > | null ,
24- reusableView : ReusableView < T , V > ,
25- children : ReusableView < T , V > [ ] ,
26- renderChildren : ( views : ReusableView < T , V > [ ] ) => ReactElement [ ]
27- ) => ReactElement ,
29+ renderWrapper ?: RenderWrapper < T , V > ,
2830 layout : Layout < T , O > ,
2931 collection : Collection < T > ,
3032 focusedKey ?: Key ,
@@ -35,8 +37,6 @@ interface VirtualizerProps<T extends object, V, O> extends Omit<HTMLAttributes<H
3537 layoutOptions ?: O
3638}
3739
38- export const VirtualizerContext = createContext < VirtualizerState < any , any , any > | null > ( null ) ;
39-
4040function Virtualizer < T extends object , V extends ReactNode , O > ( props : VirtualizerProps < T , V , O > , ref : RefObject < HTMLDivElement | null > ) {
4141 let {
4242 children : renderView ,
@@ -61,7 +61,6 @@ function Virtualizer<T extends object, V extends ReactNode, O>(props: Virtualize
6161 layout,
6262 collection,
6363 renderView,
64- renderWrapper : renderWrapper || defaultRenderWrapper ,
6564 onVisibleRectChange ( rect ) {
6665 ref . current . scrollLeft = rect . x ;
6766 ref . current . scrollTop = rect . y ;
@@ -81,9 +80,7 @@ function Virtualizer<T extends object, V extends ReactNode, O>(props: Virtualize
8180 onScrollEnd = { state . endScrolling }
8281 sizeToFit = { sizeToFit }
8382 scrollDirection = { scrollDirection } >
84- < VirtualizerContext . Provider value = { state } >
85- { state . visibleViews }
86- </ VirtualizerContext . Provider >
83+ { renderChildren ( null , state . visibleViews , renderWrapper || defaultRenderWrapper ) }
8784 </ ScrollView >
8885 ) ;
8986}
@@ -96,7 +93,7 @@ interface VirtualizerOptions {
9693}
9794
9895// eslint-disable-next-line @typescript-eslint/no-unused-vars
99- export function useVirtualizer < T extends object , V extends ReactNode , W > ( props : VirtualizerOptions , state : VirtualizerState < T , V , W > , ref : RefObject < HTMLElement | null > ) {
96+ export function useVirtualizer < T extends object , V extends ReactNode , W > ( props : VirtualizerOptions , state : VirtualizerState < T , V > , ref : RefObject < HTMLElement | null > ) {
10097 let { isLoading, onLoadMore} = props ;
10198 let { setVisibleRect, virtualizer} = state ;
10299
@@ -153,6 +150,17 @@ export function useVirtualizer<T extends object, V extends ReactNode, W>(props:
153150const _Virtualizer = React . forwardRef ( Virtualizer ) as < T extends object , V , O > ( props : VirtualizerProps < T , V , O > & { ref ?: RefObject < HTMLDivElement | null > } ) => ReactElement ;
154151export { _Virtualizer as Virtualizer } ;
155152
153+ function renderChildren < T extends object , V > ( parent : ReusableView < T , V > | null , views : ReusableView < T , V > [ ] , renderWrapper : RenderWrapper < T , V > ) {
154+ return views . map ( view => {
155+ return renderWrapper (
156+ parent ,
157+ view ,
158+ view . children ? Array . from ( view . children ) : [ ] ,
159+ childViews => renderChildren ( view , childViews , renderWrapper )
160+ ) ;
161+ } ) ;
162+ }
163+
156164function defaultRenderWrapper < T extends object , V extends ReactNode > (
157165 parent : ReusableView < T , V > | null ,
158166 reusableView : ReusableView < T , V >
0 commit comments