@@ -3,7 +3,7 @@ import { motion } from "framer-motion";
3
3
import { MutableRefObject , RefObject , useCallback , useEffect , useReducer , useRef } from "react" ;
4
4
import { cn } from "~/utils/cn" ;
5
5
import { NodeState , NodesState , reducer } from "./reducer" ;
6
- import { applyFilterToState , concreteStateFromInput , selectedIdFromState } from "./utils" ;
6
+ import { concreteStateFromInput , selectedIdFromState } from "./utils" ;
7
7
8
8
export type TreeViewProps < TData > = {
9
9
tree : FlatTree < TData > ;
@@ -128,6 +128,11 @@ export function TreeView<TData>({
128
128
) ;
129
129
}
130
130
131
+ export type Filter < TData > = {
132
+ text ?: string ;
133
+ fn : ( text : string , node : FlatTreeItem < TData > ) => boolean ;
134
+ } ;
135
+
131
136
type TreeStateHookProps < TData > = {
132
137
tree : FlatTree < TData > ;
133
138
selectedId ?: string ;
@@ -139,7 +144,7 @@ type TreeStateHookProps<TData> = {
139
144
index : number ;
140
145
} ) => number ;
141
146
parentRef : RefObject < any > ;
142
- filter ?: ( node : FlatTreeItem < TData > ) => boolean ;
147
+ filter ?: Filter < TData > ;
143
148
} ;
144
149
145
150
//this is so Framer Motion can be used to render the components
@@ -189,7 +194,7 @@ export function useTree<TData>({
189
194
190
195
const [ state , dispatch ] = useReducer (
191
196
reducer ,
192
- concreteStateFromInput ( { tree, selectedId, collapsedIds } )
197
+ concreteStateFromInput ( { tree, selectedId, collapsedIds, filter } )
193
198
) ;
194
199
195
200
useEffect ( ( ) => {
@@ -208,8 +213,8 @@ export function useTree<TData>({
208
213
} , [ previousNodeCount . current , tree . length ] ) ;
209
214
210
215
const virtualizer = useVirtualizer ( {
211
- count : tree . length ,
212
- getItemKey : ( index ) => tree [ index ] . id ,
216
+ count : state . visibleNodeIds . length ,
217
+ getItemKey : ( index ) => state . visibleNodeIds [ index ] ,
213
218
getScrollElement : ( ) => parentRef . current ,
214
219
estimateSize : ( index : number ) => {
215
220
return estimatedRowHeight ( {
@@ -259,21 +264,21 @@ export function useTree<TData>({
259
264
260
265
const expandNode = useCallback (
261
266
( id : string , scrollToNode = true ) => {
262
- dispatch ( { type : "EXPAND_NODE" , payload : { id, tree , scrollToNode, scrollToNodeFn } } ) ;
267
+ dispatch ( { type : "EXPAND_NODE" , payload : { id, scrollToNode, scrollToNodeFn } } ) ;
263
268
} ,
264
269
[ state ]
265
270
) ;
266
271
267
272
const collapseNode = useCallback (
268
273
( id : string ) => {
269
- dispatch ( { type : "COLLAPSE_NODE" , payload : { id, tree } } ) ;
274
+ dispatch ( { type : "COLLAPSE_NODE" , payload : { id } } ) ;
270
275
} ,
271
276
[ state ]
272
277
) ;
273
278
274
279
const toggleExpandNode = useCallback (
275
280
( id : string , scrollToNode = true ) => {
276
- dispatch ( { type : "TOGGLE_EXPAND_NODE" , payload : { id, tree , scrollToNode, scrollToNodeFn } } ) ;
281
+ dispatch ( { type : "TOGGLE_EXPAND_NODE" , payload : { id, scrollToNode, scrollToNodeFn } } ) ;
277
282
} ,
278
283
[ state ]
279
284
) ;
@@ -282,7 +287,7 @@ export function useTree<TData>({
282
287
( scrollToNode = true ) => {
283
288
dispatch ( {
284
289
type : "SELECT_FIRST_VISIBLE_NODE" ,
285
- payload : { tree , scrollToNode, scrollToNodeFn } ,
290
+ payload : { scrollToNode, scrollToNodeFn } ,
286
291
} ) ;
287
292
} ,
288
293
[ tree , state ]
@@ -292,7 +297,7 @@ export function useTree<TData>({
292
297
( scrollToNode = true ) => {
293
298
dispatch ( {
294
299
type : "SELECT_LAST_VISIBLE_NODE" ,
295
- payload : { tree , scrollToNode, scrollToNodeFn } ,
300
+ payload : { scrollToNode, scrollToNodeFn } ,
296
301
} ) ;
297
302
} ,
298
303
[ tree , state ]
@@ -302,7 +307,7 @@ export function useTree<TData>({
302
307
( scrollToNode = true ) => {
303
308
dispatch ( {
304
309
type : "SELECT_NEXT_VISIBLE_NODE" ,
305
- payload : { tree , scrollToNode, scrollToNodeFn } ,
310
+ payload : { scrollToNode, scrollToNodeFn } ,
306
311
} ) ;
307
312
} ,
308
313
[ state ]
@@ -312,7 +317,7 @@ export function useTree<TData>({
312
317
( scrollToNode = true ) => {
313
318
dispatch ( {
314
319
type : "SELECT_PREVIOUS_VISIBLE_NODE" ,
315
- payload : { tree , scrollToNode, scrollToNodeFn } ,
320
+ payload : { scrollToNode, scrollToNodeFn } ,
316
321
} ) ;
317
322
} ,
318
323
[ state ]
@@ -322,43 +327,43 @@ export function useTree<TData>({
322
327
( scrollToNode = true ) => {
323
328
dispatch ( {
324
329
type : "SELECT_PARENT_NODE" ,
325
- payload : { tree , scrollToNode, scrollToNodeFn } ,
330
+ payload : { scrollToNode, scrollToNodeFn } ,
326
331
} ) ;
327
332
} ,
328
333
[ state ]
329
334
) ;
330
335
331
336
const expandAllBelowDepth = useCallback (
332
337
( depth : number ) => {
333
- dispatch ( { type : "EXPAND_ALL_BELOW_DEPTH" , payload : { tree , depth } } ) ;
338
+ dispatch ( { type : "EXPAND_ALL_BELOW_DEPTH" , payload : { depth } } ) ;
334
339
} ,
335
340
[ state ]
336
341
) ;
337
342
338
343
const collapseAllBelowDepth = useCallback (
339
344
( depth : number ) => {
340
- dispatch ( { type : "COLLAPSE_ALL_BELOW_DEPTH" , payload : { tree , depth } } ) ;
345
+ dispatch ( { type : "COLLAPSE_ALL_BELOW_DEPTH" , payload : { depth } } ) ;
341
346
} ,
342
347
[ state ]
343
348
) ;
344
349
345
350
const expandLevel = useCallback (
346
351
( level : number ) => {
347
- dispatch ( { type : "EXPAND_LEVEL" , payload : { tree , level } } ) ;
352
+ dispatch ( { type : "EXPAND_LEVEL" , payload : { level } } ) ;
348
353
} ,
349
354
[ state ]
350
355
) ;
351
356
352
357
const collapseLevel = useCallback (
353
358
( level : number ) => {
354
- dispatch ( { type : "COLLAPSE_LEVEL" , payload : { tree , level } } ) ;
359
+ dispatch ( { type : "COLLAPSE_LEVEL" , payload : { level } } ) ;
355
360
} ,
356
361
[ state ]
357
362
) ;
358
363
359
364
const toggleExpandLevel = useCallback (
360
365
( level : number ) => {
361
- dispatch ( { type : "TOGGLE_EXPAND_LEVEL" , payload : { tree , level } } ) ;
366
+ dispatch ( { type : "TOGGLE_EXPAND_LEVEL" , payload : { level } } ) ;
362
367
} ,
363
368
[ state ]
364
369
) ;
@@ -470,7 +475,7 @@ export function useTree<TData>({
470
475
471
476
return {
472
477
selected : selectedIdFromState ( state . nodes ) ,
473
- nodes : filter ? applyFilterToState ( tree , state . nodes , filter ) : state . nodes ,
478
+ nodes : state . nodes ,
474
479
getTreeProps,
475
480
getNodeProps,
476
481
selectNode,
0 commit comments