1
1
import { useCallback , useEffect , useMemo , useRef , useState } from 'react' ;
2
2
import { LoadableArray , RootTree , TreeNode , TreeSource , TreeSourceNode , TreeState } from './types' ;
3
+ import { objectFromEntries } from './util' ;
3
4
4
5
interface StringMap < V > {
5
6
[ k : string ] : V ;
@@ -63,13 +64,15 @@ export function useTreeLoader<T>(
63
64
// Get active trail IDs from active ID.
64
65
const activeTrailIds = useMemo (
65
66
( ) => ( activeId && trails [ activeId ] ) ? trails [ activeId ] . map ( ( node ) => node . id ) : [ ]
66
- , [ activeId , trails ] ) ;
67
+ , [ activeId , trails ] ) ;
67
68
68
69
// Add new trails and their sub trails.
69
70
const addTrails = useCallback ( ( newTrails : Array < Array < TreeSourceNode < T > > > ) => {
70
71
setTrails ( ( currentTrails ) => {
71
- const newEntries = newTrails . map ( ( trail ) => [ trail [ 0 ] . id , trail ] ) ;
72
- return newEntries . length > 0 ? { ...currentTrails , ...Object . fromEntries ( newEntries ) } : currentTrails ;
72
+ const newEntries : Array < [ string , Array < TreeSourceNode < T > > ] > = newTrails . map (
73
+ ( trail ) => [ trail [ 0 ] . id , trail ] ,
74
+ ) ;
75
+ return newEntries . length > 0 ? { ...currentTrails , ...objectFromEntries ( newEntries ) } : currentTrails ;
73
76
} ) ;
74
77
} , [ setTrails ] ) ;
75
78
@@ -110,8 +113,8 @@ export function useTreeLoader<T>(
110
113
}
111
114
112
115
const enableChildrenLoadingState = ( ) => {
113
- setChildren ( ( currentChildren ) => ( {
114
- ...currentChildren , ...Object . fromEntries ( idsToLoad . map ( ( id ) => [ id , { isLoading : true , items : [ ] } ] ) ) ,
116
+ setChildren ( ( currentChildren ) => ( {
117
+ ...currentChildren , ...objectFromEntries ( idsToLoad . map ( ( id ) => [ id , { isLoading : true , items : [ ] } ] ) ) ,
115
118
} ) ) ;
116
119
} ;
117
120
let loadingTransitionTimeout : unknown | null = null ;
@@ -125,8 +128,10 @@ export function useTreeLoader<T>(
125
128
126
129
// Load them from the source.
127
130
Promise . all (
128
- idsToLoad . map ( ( id ) => source . children ( id ) . then ( ( items ) => [ id , { loading : false , items } ] ) ) ,
129
- ) . then ( ( results ) => {
131
+ idsToLoad . map (
132
+ ( id ) => source . children ( id ) . then ( ( items ) => [ id , { isLoading : false , items } ] ) ,
133
+ ) as Array < Promise < [ string , LoadableArray < TreeSourceNode < T > > ] > > ,
134
+ ) . then ( ( results : Array < [ string , LoadableArray < TreeSourceNode < T > > ] > ) => {
130
135
if ( loadingTransitionTimeout !== null ) {
131
136
clearTimeout ( loadingTransitionTimeout as any ) ;
132
137
}
@@ -137,7 +142,7 @@ export function useTreeLoader<T>(
137
142
}
138
143
139
144
// Add the children to state.
140
- const loadedChildren : StringMap < LoadableArray < TreeSourceNode < T > > > = Object . fromEntries ( results ) ;
145
+ const loadedChildren : StringMap < LoadableArray < TreeSourceNode < T > > > = objectFromEntries ( results ) ;
141
146
setChildren ( ( currentChildren ) => ( { ...currentChildren , ...loadedChildren } ) ) ;
142
147
143
148
// Add trails for the new children so we can make them active.
@@ -148,7 +153,7 @@ export function useTreeLoader<T>(
148
153
} , [ expandedIds , children , trails , activeTrailIds , source , addTrails , setChildren , loadingTransitionMs ] ) ;
149
154
150
155
return useMemo ( ( ) => {
151
- const activeTrailIdsIndex = Object . fromEntries ( activeTrailIds . map ( ( id ) => [ id , true ] ) ) ;
156
+ const activeTrailIdsIndex = objectFromEntries ( activeTrailIds . map ( ( id ) => [ id , true ] ) ) ;
152
157
const expandedIdsIndex = expandedIds || { } ;
153
158
154
159
function buildOutputNode ( node : TreeSourceNode < T > , depth : number ) : TreeNode < T > {
0 commit comments