@@ -31,6 +31,7 @@ const getName = (userId: string, data: UsersIdentitiesMap): string => {
31
31
32
32
export const useDirectoryContent = ( ) => {
33
33
const currentChildren = useSelector ( ( state : AppState ) => state . currentChildren ) ;
34
+ const knownUsersIdentitiesRef = useRef < UsersIdentitiesMap > ( { } ) ;
34
35
const [ childrenMetadata , setChildrenMetadata ] = useState < Record < UUID , ElementAttributes > > ( { } ) ;
35
36
const { snackError } = useSnackMessage ( ) ;
36
37
const previousData = useRef < ElementAttributes [ ] > ( ) ;
@@ -58,8 +59,14 @@ export const useDirectoryContent = () => {
58
59
59
60
const metadata : Record < UUID , ElementAttributes > = { } ;
60
61
const childrenToFetchElementsInfos = Object . values ( currentChildren ) . map ( ( e ) => e . elementUuid ) ;
61
-
62
- const fetchUsersIdentitiesPromise = fetchUsersIdentities ( childrenToFetchElementsInfos ) . catch ( ( ) => {
62
+ const childrenToFetchUsersIdentitiesInfos = Object . values ( currentChildren )
63
+ . filter (
64
+ ( e ) =>
65
+ knownUsersIdentitiesRef . current ?. [ e . owner ] === undefined ||
66
+ knownUsersIdentitiesRef . current ?. [ e . lastModifiedBy ] === undefined
67
+ )
68
+ . map ( ( e ) => e . elementUuid ) ;
69
+ const fetchUsersIdentitiesPromise = fetchUsersIdentities ( childrenToFetchUsersIdentitiesInfos ) . catch ( ( ) => {
63
70
// Last resort, server down, error 500, fallback to subs as users Identities
64
71
// We write this code to have the same behavior as when there are partial results,
65
72
// (missing users identities), see getName()
@@ -77,16 +84,19 @@ export const useDirectoryContent = () => {
77
84
} ) ;
78
85
79
86
if ( childrenToFetchElementsInfos . length > 0 ) {
80
- Promise . all ( [
81
- fetchUsersIdentitiesPromise , // TODO cache user identities across elements
82
- fetchElementsInfos ( childrenToFetchElementsInfos ) ,
83
- ] )
87
+ Promise . all ( [ fetchUsersIdentitiesPromise , fetchElementsInfos ( childrenToFetchElementsInfos ) ] )
84
88
. then ( ( res ) => {
89
+ if ( res [ 0 ] && res [ 0 ] . data ) {
90
+ Object . entries ( res [ 0 ] . data ) . forEach ( ( [ k , v ] ) => {
91
+ knownUsersIdentitiesRef . current [ k ] = v ;
92
+ } ) ;
93
+ }
94
+
85
95
// discarding request for older directory
86
96
if ( previousData . current === currentChildren ) {
87
97
res [ 1 ] . forEach ( ( e ) => {
88
- e . ownerLabel = getName ( e . owner , res [ 0 ] . data ) ;
89
- e . lastModifiedByLabel = getName ( e . lastModifiedBy , res [ 0 ] . data ) ;
98
+ e . ownerLabel = getName ( e . owner , knownUsersIdentitiesRef . current ) ;
99
+ e . lastModifiedByLabel = getName ( e . lastModifiedBy , knownUsersIdentitiesRef . current ) ;
90
100
metadata [ e . elementUuid ] = e ;
91
101
} ) ;
92
102
setChildrenMetadata ( metadata ) ;
@@ -100,7 +110,7 @@ export const useDirectoryContent = () => {
100
110
}
101
111
} , [ handleError , currentChildren ] ) ;
102
112
103
- // TODO remove this when global user identity caching is implemented
113
+ // TODO remove this when currentChildren and metadata are fetched at once
104
114
const currentChildrenWithOwnerNames = useMemo ( ( ) => {
105
115
if ( ! currentChildren ) {
106
116
return currentChildren ;
0 commit comments