13
13
import { Collection , Key } from '@react-types/shared' ;
14
14
import { Layout , Rect , ReusableView , useVirtualizerState , VirtualizerState } from '@react-stately/virtualizer' ;
15
15
import { 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' ;
17
17
import { ScrollView } from './ScrollView' ;
18
18
import { VirtualizerItem } from './VirtualizerItem' ;
19
19
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
+
20
27
interface VirtualizerProps < T extends object , V , O > extends Omit < HTMLAttributes < HTMLElement > , 'children' > {
21
28
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 > ,
28
30
layout : Layout < T , O > ,
29
31
collection : Collection < T > ,
30
32
focusedKey ?: Key ,
@@ -35,8 +37,6 @@ interface VirtualizerProps<T extends object, V, O> extends Omit<HTMLAttributes<H
35
37
layoutOptions ?: O
36
38
}
37
39
38
- export const VirtualizerContext = createContext < VirtualizerState < any , any , any > | null > ( null ) ;
39
-
40
40
function Virtualizer < T extends object , V extends ReactNode , O > ( props : VirtualizerProps < T , V , O > , ref : RefObject < HTMLDivElement | null > ) {
41
41
let {
42
42
children : renderView ,
@@ -61,7 +61,6 @@ function Virtualizer<T extends object, V extends ReactNode, O>(props: Virtualize
61
61
layout,
62
62
collection,
63
63
renderView,
64
- renderWrapper : renderWrapper || defaultRenderWrapper ,
65
64
onVisibleRectChange ( rect ) {
66
65
ref . current . scrollLeft = rect . x ;
67
66
ref . current . scrollTop = rect . y ;
@@ -81,9 +80,7 @@ function Virtualizer<T extends object, V extends ReactNode, O>(props: Virtualize
81
80
onScrollEnd = { state . endScrolling }
82
81
sizeToFit = { sizeToFit }
83
82
scrollDirection = { scrollDirection } >
84
- < VirtualizerContext . Provider value = { state } >
85
- { state . visibleViews }
86
- </ VirtualizerContext . Provider >
83
+ { renderChildren ( null , state . visibleViews , renderWrapper || defaultRenderWrapper ) }
87
84
</ ScrollView >
88
85
) ;
89
86
}
@@ -96,7 +93,7 @@ interface VirtualizerOptions {
96
93
}
97
94
98
95
// 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 > ) {
100
97
let { isLoading, onLoadMore} = props ;
101
98
let { setVisibleRect, virtualizer} = state ;
102
99
@@ -153,6 +150,17 @@ export function useVirtualizer<T extends object, V extends ReactNode, W>(props:
153
150
const _Virtualizer = React . forwardRef ( Virtualizer ) as < T extends object , V , O > ( props : VirtualizerProps < T , V , O > & { ref ?: RefObject < HTMLDivElement | null > } ) => ReactElement ;
154
151
export { _Virtualizer as Virtualizer } ;
155
152
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
+
156
164
function defaultRenderWrapper < T extends object , V extends ReactNode > (
157
165
parent : ReusableView < T , V > | null ,
158
166
reusableView : ReusableView < T , V >
0 commit comments