@@ -142,6 +142,10 @@ interface IRoomResult extends IBaseResult {
142
142
143
143
interface IMemberResult extends IBaseResult {
144
144
member : Member | RoomMember ;
145
+ /**
146
+ * If the result is from a filtered server API then we set true here to avoid locally culling it in our own filters
147
+ */
148
+ alreadyFiltered : boolean ;
145
149
}
146
150
147
151
interface IResult extends IBaseResult {
@@ -201,7 +205,8 @@ const toRoomResult = (room: Room): IRoomResult => {
201
205
}
202
206
} ;
203
207
204
- const toMemberResult = ( member : Member | RoomMember ) : IMemberResult => ( {
208
+ const toMemberResult = ( member : Member | RoomMember , alreadyFiltered : boolean ) : IMemberResult => ( {
209
+ alreadyFiltered,
205
210
member,
206
211
section : Section . Suggestions ,
207
212
filter : [ Filter . People ] ,
@@ -240,13 +245,9 @@ const findVisibleRooms = (cli: MatrixClient, msc3946ProcessDynamicPredecessor: b
240
245
} ) ;
241
246
} ;
242
247
243
- const findVisibleRoomMembers = (
244
- cli : MatrixClient ,
245
- msc3946ProcessDynamicPredecessor : boolean ,
246
- filterDMs = true ,
247
- ) : RoomMember [ ] => {
248
+ const findVisibleRoomMembers = ( visibleRooms : Room [ ] , cli : MatrixClient , filterDMs = true ) : RoomMember [ ] => {
248
249
return Object . values (
249
- findVisibleRooms ( cli , msc3946ProcessDynamicPredecessor )
250
+ visibleRooms
250
251
. filter ( ( room ) => ! filterDMs || ! DMRoomMap . shared ( ) . getUserIdForRoomId ( room . roomId ) )
251
252
. reduce ( ( members , room ) => {
252
253
for ( const member of room . getJoinedMembers ( ) ) {
@@ -331,23 +332,40 @@ const SpotlightDialog: React.FC<IProps> = ({ initialText = "", initialFilter = n
331
332
useDebouncedCallback ( filter === Filter . People , searchProfileInfo , searchParams ) ;
332
333
333
334
const possibleResults = useMemo < Result [ ] > ( ( ) => {
335
+ const visibleRooms = findVisibleRooms ( cli , msc3946ProcessDynamicPredecessor ) ;
336
+ const roomResults = visibleRooms . map ( toRoomResult ) ;
334
337
const userResults : IMemberResult [ ] = [ ] ;
335
- const roomResults = findVisibleRooms ( cli , msc3946ProcessDynamicPredecessor ) . map ( toRoomResult ) ;
336
- // If we already have a DM with the user we're looking for, we will
337
- // show that DM instead of the user themselves
338
+
339
+ // If we already have a DM with the user we're looking for, we will show that DM instead of the user themselves
338
340
const alreadyAddedUserIds = roomResults . reduce ( ( userIds , result ) => {
339
341
const userId = DMRoomMap . shared ( ) . getUserIdForRoomId ( result . room . roomId ) ;
340
342
if ( ! userId ) return userIds ;
341
343
if ( result . room . getJoinedMemberCount ( ) > 2 ) return userIds ;
342
- userIds . add ( userId ) ;
344
+ userIds . set ( userId , result ) ;
343
345
return userIds ;
344
- } , new Set < string > ( ) ) ;
345
- for ( const user of [ ...findVisibleRoomMembers ( cli , msc3946ProcessDynamicPredecessor ) , ...users ] ) {
346
- // Make sure we don't have any user more than once
347
- if ( alreadyAddedUserIds . has ( user . userId ) ) continue ;
348
- alreadyAddedUserIds . add ( user . userId ) ;
349
-
350
- userResults . push ( toMemberResult ( user ) ) ;
346
+ } , new Map < string , IMemberResult | IRoomResult > ( ) ) ;
347
+
348
+ function addUserResults ( users : Array < Member | RoomMember > , alreadyFiltered : boolean ) : void {
349
+ for ( const user of users ) {
350
+ // Make sure we don't have any user more than once
351
+ if ( alreadyAddedUserIds . has ( user . userId ) ) {
352
+ const result = alreadyAddedUserIds . get ( user . userId ) ! ;
353
+ if ( alreadyFiltered && isMemberResult ( result ) && ! result . alreadyFiltered ) {
354
+ // But if they were added as not yet filtered then mark them as already filtered to avoid
355
+ // culling this result based on local filtering.
356
+ result . alreadyFiltered = true ;
357
+ }
358
+ continue ;
359
+ }
360
+ const result = toMemberResult ( user , alreadyFiltered ) ;
361
+ alreadyAddedUserIds . set ( user . userId , result ) ;
362
+ userResults . push ( result ) ;
363
+ }
364
+ }
365
+ addUserResults ( findVisibleRoomMembers ( visibleRooms , cli ) , false ) ;
366
+ addUserResults ( users , true ) ;
367
+ if ( profile ) {
368
+ addUserResults ( [ new DirectoryMember ( profile ) ] , true ) ;
351
369
}
352
370
353
371
return [
@@ -369,9 +387,6 @@ const SpotlightDialog: React.FC<IProps> = ({ initialText = "", initialFilter = n
369
387
} ) ) ,
370
388
...roomResults ,
371
389
...userResults ,
372
- ...( profile && ! alreadyAddedUserIds . has ( profile . user_id ) ? [ new DirectoryMember ( profile ) ] : [ ] ) . map (
373
- toMemberResult ,
374
- ) ,
375
390
...publicRooms . map ( toPublicRoomResult ) ,
376
391
] . filter ( ( result ) => filter === null || result . filter . includes ( filter ) ) ;
377
392
} , [ cli , users , profile , publicRooms , filter , msc3946ProcessDynamicPredecessor ] ) ;
@@ -399,7 +414,7 @@ const SpotlightDialog: React.FC<IProps> = ({ initialText = "", initialFilter = n
399
414
)
400
415
return ; // bail, does not match query
401
416
} else if ( isMemberResult ( entry ) ) {
402
- if ( ! entry . query ?. some ( ( q ) => q . includes ( lcQuery ) ) ) return ; // bail, does not match query
417
+ if ( ! entry . alreadyFiltered && ! entry . query ?. some ( ( q ) => q . includes ( lcQuery ) ) ) return ; // bail, does not match query
403
418
} else if ( isPublicRoomResult ( entry ) ) {
404
419
if ( ! entry . query ?. some ( ( q ) => q . includes ( lcQuery ) ) ) return ; // bail, does not match query
405
420
} else {
0 commit comments