11use std:: { cell:: RefCell , collections:: HashMap , rc:: Rc , sync:: Arc } ;
22use crossbeam_queue:: SegQueue ;
33use makepad_widgets:: * ;
4- use matrix_sdk:: { ruma:: { events:: tag:: Tags , MilliSecondsSinceUnixEpoch , OwnedRoomAliasId , OwnedRoomId , OwnedUserId } , RoomState } ;
4+ use matrix_sdk:: { RoomDisplayName , ruma:: { events:: tag:: Tags , MilliSecondsSinceUnixEpoch , OwnedRoomAliasId , OwnedRoomId , OwnedUserId } , RoomState } ;
55use crate :: {
66 app:: { AppState , SelectedRoom } ,
77 room:: { room_display_filter:: { RoomDisplayFilter , RoomDisplayFilterBuilder , RoomFilterCriteria , SortFn } , RoomPreviewAvatar } ,
88 shared:: { collapsible_header:: { CollapsibleHeaderAction , CollapsibleHeaderWidgetRefExt , HeaderCategory } , jump_to_bottom_button:: UnreadMessageCount , popup_list:: { enqueue_popup_notification, PopupItem , PopupKind } , room_filter_input_bar:: RoomFilterAction } ,
9- sliding_sync:: { submit_async_request, MatrixRequest , PaginationDirection } , utils:: room_name_or_id ,
9+ sliding_sync:: { submit_async_request, MatrixRequest , PaginationDirection } , utils:: display_name_with_fallback ,
1010} ;
1111use super :: room_preview:: RoomPreviewAction ;
1212
@@ -132,7 +132,7 @@ pub enum RoomsListUpdate {
132132 /// Update the displayable name for the given room.
133133 UpdateRoomName {
134134 room_id : OwnedRoomId ,
135- new_room_name : Option < String > ,
135+ new_room_name : RoomDisplayName ,
136136 } ,
137137 /// Update the avatar (image) for the given room.
138138 UpdateRoomAvatar {
@@ -201,7 +201,7 @@ pub struct JoinedRoomInfo {
201201 /// The matrix ID of this room.
202202 pub room_id : OwnedRoomId ,
203203 /// The displayable name of this room, if known.
204- pub room_name : Option < String > ,
204+ pub room_name : RoomDisplayName ,
205205 /// The number of unread messages in this room.
206206 pub num_unread_messages : u64 ,
207207 /// The number of unread mentions in this room.
@@ -240,7 +240,7 @@ pub struct InvitedRoomInfo {
240240 /// The matrix ID of this room.
241241 pub room_id : OwnedRoomId ,
242242 /// The displayable name of this room, if known.
243- pub room_name : Option < String > ,
243+ pub room_name : RoomDisplayName ,
244244 /// The canonical alias for this room, if any.
245245 pub canonical_alias : Option < OwnedRoomAliasId > ,
246246 /// The alternative aliases for this room, if any.
@@ -399,7 +399,6 @@ impl RoomsList {
399399 RoomsListUpdate :: AddJoinedRoom ( joined_room) => {
400400 let room_id = joined_room. room_id . clone ( ) ;
401401 let is_direct = joined_room. is_direct ;
402- let room_name = joined_room. room_name . clone ( ) ;
403402 let should_display = ( self . display_filter ) ( & joined_room) ;
404403 let replaced = self . all_joined_rooms . insert ( room_id. clone ( ) , joined_room) ;
405404 if replaced. is_none ( ) {
@@ -425,10 +424,19 @@ impl RoomsList {
425424 self . displayed_invited_rooms . iter ( )
426425 . position ( |r| r == & room_id)
427426 . map ( |index| self . displayed_invited_rooms . remove ( index) ) ;
427+ let new_room_name = self . all_joined_rooms . get ( & room_id) . map ( |room| display_name_with_fallback (
428+ & room. room_name ,
429+ room. canonical_alias . as_ref ( ) ,
430+ & room. alt_aliases ,
431+ & room. room_id ,
432+ ) ) ;
428433 cx. widget_action (
429434 self . widget_uid ( ) ,
430435 & scope. path ,
431- RoomsListAction :: InviteAccepted { room_id, room_name }
436+ RoomsListAction :: InviteAccepted {
437+ room_id : room_id. clone ( ) ,
438+ room_name : new_room_name,
439+ }
432440 ) ;
433441 }
434442 self . update_status_rooms_count ( ) ;
@@ -460,9 +468,11 @@ impl RoomsList {
460468 }
461469 }
462470 RoomsListUpdate :: UpdateRoomName { room_id, new_room_name } => {
471+ // Try to update joined room first
463472 if let Some ( room) = self . all_joined_rooms . get_mut ( & room_id) {
464473 let was_displayed = ( self . display_filter ) ( room) ;
465- room. room_name = new_room_name;
474+ // Keep the full RoomDisplayName to preserve EmptyWas semantics
475+ room. room_name = new_room_name. clone ( ) ;
466476 let should_display = ( self . display_filter ) ( room) ;
467477 match ( was_displayed, should_display) {
468478 // No need to update the displayed rooms list.
@@ -482,24 +492,53 @@ impl RoomsList {
482492 // Room was not displayed but should now be displayed.
483493 ( false , true ) => {
484494 if room. is_direct {
485- self . displayed_direct_rooms . push ( room_id) ;
495+ self . displayed_direct_rooms . push ( room_id. clone ( ) ) ;
486496 } else {
487- self . displayed_regular_rooms . push ( room_id) ;
497+ self . displayed_regular_rooms . push ( room_id. clone ( ) ) ;
488498 }
489499 }
490500 }
491- } else {
492- error ! ( "Error: couldn't find room {room_id} to update room name" ) ;
501+ }
502+ // If not a joined room, try to update invited room
503+ else {
504+ let invited_rooms_ref = get_invited_rooms ( cx) ;
505+ let mut invited_rooms = invited_rooms_ref. borrow_mut ( ) ;
506+ if let Some ( invited_room) = invited_rooms. get_mut ( & room_id) {
507+ let was_displayed = ( self . display_filter ) ( invited_room) ;
508+ invited_room. room_name = new_room_name;
509+ let should_display = ( self . display_filter ) ( invited_room) ;
510+ match ( was_displayed, should_display) {
511+ ( true , true ) | ( false , false ) => { }
512+ ( true , false ) => {
513+ self . displayed_invited_rooms . iter ( )
514+ . position ( |r| r == & room_id)
515+ . map ( |index| self . displayed_invited_rooms . remove ( index) ) ;
516+ }
517+ ( false , true ) => {
518+ if !self . displayed_invited_rooms . contains ( & room_id) {
519+ self . displayed_invited_rooms . push ( room_id. clone ( ) ) ;
520+ }
521+ }
522+ }
523+ } else {
524+ warning ! ( "Warning: couldn't find invited room {} to update room name" , room_id) ;
525+ }
493526 }
494527 }
495528 RoomsListUpdate :: UpdateIsDirect { room_id, is_direct } => {
496529 if let Some ( room) = self . all_joined_rooms . get_mut ( & room_id) {
497530 if room. is_direct == is_direct {
498531 continue ;
499532 }
533+ let room_name_text = display_name_with_fallback (
534+ & room. room_name ,
535+ room. canonical_alias . as_ref ( ) ,
536+ & room. alt_aliases ,
537+ & room. room_id ,
538+ ) ;
500539 enqueue_popup_notification ( PopupItem {
501540 message : format ! ( "{} was changed from {} to {}." ,
502- room_name_or_id ( room . room_name . as_ref ( ) , & room_id ) ,
541+ room_name_text ,
503542 if room. is_direct { "direct" } else { "regular" } ,
504543 if is_direct { "direct" } else { "regular" }
505544 ) ,
@@ -832,10 +871,30 @@ impl RoomsList {
832871 /// Returns a room's avatar and displayable name.
833872 pub fn get_room_avatar_and_name ( & self , room_id : & OwnedRoomId ) -> Option < ( RoomPreviewAvatar , Option < String > ) > {
834873 self . all_joined_rooms . get ( room_id)
835- . map ( |room_info| ( room_info. avatar . clone ( ) , room_info. room_name . clone ( ) ) )
874+ . map ( |room_info| {
875+ (
876+ room_info. avatar . clone ( ) ,
877+ Some ( display_name_with_fallback (
878+ & room_info. room_name ,
879+ room_info. canonical_alias . as_ref ( ) ,
880+ & room_info. alt_aliases ,
881+ & room_info. room_id ,
882+ ) ) ,
883+ )
884+ } )
836885 . or_else ( || {
837886 self . invited_rooms . borrow ( ) . get ( room_id)
838- . map ( |room_info| ( room_info. room_avatar . clone ( ) , room_info. room_name . clone ( ) ) )
887+ . map ( |room_info| {
888+ (
889+ room_info. room_avatar . clone ( ) ,
890+ Some ( display_name_with_fallback (
891+ & room_info. room_name ,
892+ room_info. canonical_alias . as_ref ( ) ,
893+ & room_info. alt_aliases ,
894+ & room_info. room_id ,
895+ ) ) ,
896+ )
897+ } )
839898 } )
840899 }
841900}
@@ -860,12 +919,22 @@ impl Widget for RoomsList {
860919 let new_selected_room = if let Some ( jr) = self . all_joined_rooms . get ( & clicked_room_id) {
861920 SelectedRoom :: JoinedRoom {
862921 room_id : jr. room_id . clone ( ) . into ( ) ,
863- room_name : jr. room_name . clone ( ) ,
922+ room_name : Some ( display_name_with_fallback (
923+ & jr. room_name ,
924+ jr. canonical_alias . as_ref ( ) ,
925+ & jr. alt_aliases ,
926+ & jr. room_id ,
927+ ) ) ,
864928 }
865929 } else if let Some ( ir) = self . invited_rooms . borrow ( ) . get ( & clicked_room_id) {
866930 SelectedRoom :: InvitedRoom {
867931 room_id : ir. room_id . to_owned ( ) . into ( ) ,
868- room_name : ir. room_name . clone ( ) ,
932+ room_name : Some ( display_name_with_fallback (
933+ & ir. room_name ,
934+ ir. canonical_alias . as_ref ( ) ,
935+ & ir. alt_aliases ,
936+ & ir. room_id ,
937+ ) ) ,
869938 }
870939 } else {
871940 error ! ( "BUG: couldn't find clicked room details for room {clicked_room_id}" ) ;
0 commit comments