@@ -2,59 +2,49 @@ import * as React from 'react';
2
2
import type { DefaultOptionType , InternalFieldName , TreeSelectProps } from '../TreeSelect' ;
3
3
import { fillLegacyProps } from '../utils/legacyUtil' ;
4
4
5
- type GetFuncType < T > = T extends boolean ? never : T ;
6
- type FilterFn = GetFuncType < TreeSelectProps [ 'filterTreeNode' ] > ;
5
+ type FilterFn = NonNullable < TreeSelectProps [ 'filterTreeNode' ] > ;
7
6
8
- export default (
7
+ const useFilterTreeData = (
9
8
treeData : DefaultOptionType [ ] ,
10
9
searchValue : string ,
11
- {
12
- treeNodeFilterProp,
13
- filterTreeNode,
14
- fieldNames,
15
- } : {
10
+ options : {
16
11
fieldNames : InternalFieldName ;
17
12
treeNodeFilterProp : string ;
18
13
filterTreeNode : TreeSelectProps [ 'filterTreeNode' ] ;
19
14
} ,
20
15
) => {
16
+ const { fieldNames, treeNodeFilterProp, filterTreeNode } = options ;
21
17
const { children : fieldChildren } = fieldNames ;
22
18
23
19
return React . useMemo ( ( ) => {
24
20
if ( ! searchValue || filterTreeNode === false ) {
25
21
return treeData ;
26
22
}
27
23
28
- let filterOptionFunc : FilterFn ;
29
- if ( typeof filterTreeNode === 'function' ) {
30
- filterOptionFunc = filterTreeNode ;
31
- } else {
32
- const upperStr = searchValue . toUpperCase ( ) ;
33
- filterOptionFunc = ( _ , dataNode ) => {
34
- const value = dataNode [ treeNodeFilterProp ] ;
35
-
36
- return String ( value ) . toUpperCase ( ) . includes ( upperStr ) ;
37
- } ;
38
- }
39
-
40
- function dig ( list : DefaultOptionType [ ] , keepAll : boolean = false ) {
41
- return list . reduce < DefaultOptionType [ ] > ( ( total , dataNode ) => {
42
- const children = dataNode [ fieldChildren ] ;
43
-
44
- const match = keepAll || filterOptionFunc ( searchValue , fillLegacyProps ( dataNode ) ) ;
45
- const childList = dig ( children || [ ] , match ) ;
46
-
47
- if ( match || childList . length ) {
48
- total . push ( {
49
- ...dataNode ,
24
+ const filterOptionFunc : FilterFn =
25
+ typeof filterTreeNode === 'function'
26
+ ? filterTreeNode
27
+ : ( _ , dataNode ) =>
28
+ String ( dataNode [ treeNodeFilterProp ] ) . toUpperCase ( ) . includes ( searchValue . toUpperCase ( ) ) ;
29
+
30
+ const filterTreeNodes = ( nodes : DefaultOptionType [ ] , keepAll = false ) : DefaultOptionType [ ] =>
31
+ nodes . reduce < DefaultOptionType [ ] > ( ( filtered , node ) => {
32
+ const children = node [ fieldChildren ] ;
33
+ const isMatch = keepAll || filterOptionFunc ( searchValue , fillLegacyProps ( node ) ) ;
34
+ const filteredChildren = filterTreeNodes ( children || [ ] , isMatch ) ;
35
+
36
+ if ( isMatch || filteredChildren . length ) {
37
+ filtered . push ( {
38
+ ...node ,
50
39
isLeaf : undefined ,
51
- [ fieldChildren ] : childList ,
40
+ [ fieldChildren ] : filteredChildren ,
52
41
} ) ;
53
42
}
54
- return total ;
43
+ return filtered ;
55
44
} , [ ] ) ;
56
- }
57
45
58
- return dig ( treeData ) ;
46
+ return filterTreeNodes ( treeData ) ;
59
47
} , [ treeData , searchValue , fieldChildren , treeNodeFilterProp , filterTreeNode ] ) ;
60
48
} ;
49
+
50
+ export default useFilterTreeData ;
0 commit comments