@@ -23,6 +23,7 @@ use matrix_sdk::{
23
23
RoomAliasId ,
24
24
RoomId ,
25
25
} ,
26
+ RoomState as MatrixRoomState ,
26
27
} ;
27
28
28
29
use ratatui:: {
@@ -195,6 +196,10 @@ fn room_cmp<T: RoomLikeItem>(a: &T, b: &T, field: &SortFieldRoom) -> Ordering {
195
196
// sort larger timestamps towards the top.
196
197
some_cmp ( a. recent_ts ( ) , b. recent_ts ( ) , |a, b| b. cmp ( a) )
197
198
} ,
199
+ SortFieldRoom :: Invite => {
200
+ // sort invites before other rooms.
201
+ b. is_invite ( ) . cmp ( & a. is_invite ( ) )
202
+ } ,
198
203
}
199
204
}
200
205
@@ -273,6 +278,7 @@ trait RoomLikeItem {
273
278
fn recent_ts ( & self ) -> Option < & MessageTimeStamp > ;
274
279
fn alias ( & self ) -> Option < & RoomAliasId > ;
275
280
fn name ( & self ) -> & str ;
281
+ fn is_invite ( & self ) -> bool ;
276
282
}
277
283
278
284
#[ inline]
@@ -914,6 +920,10 @@ impl RoomLikeItem for GenericChatItem {
914
920
fn is_unread ( & self ) -> bool {
915
921
self . unread . is_unread ( )
916
922
}
923
+
924
+ fn is_invite ( & self ) -> bool {
925
+ self . room ( ) . state ( ) == MatrixRoomState :: Invited
926
+ }
917
927
}
918
928
919
929
impl Display for GenericChatItem {
@@ -1024,6 +1034,10 @@ impl RoomLikeItem for RoomItem {
1024
1034
fn is_unread ( & self ) -> bool {
1025
1035
self . unread . is_unread ( )
1026
1036
}
1037
+
1038
+ fn is_invite ( & self ) -> bool {
1039
+ self . room ( ) . state ( ) == MatrixRoomState :: Invited
1040
+ }
1027
1041
}
1028
1042
1029
1043
impl Display for RoomItem {
@@ -1124,6 +1138,10 @@ impl RoomLikeItem for DirectItem {
1124
1138
fn is_unread ( & self ) -> bool {
1125
1139
self . unread . is_unread ( )
1126
1140
}
1141
+
1142
+ fn is_invite ( & self ) -> bool {
1143
+ self . room ( ) . state ( ) == MatrixRoomState :: Invited
1144
+ }
1127
1145
}
1128
1146
1129
1147
impl Display for DirectItem {
@@ -1223,6 +1241,10 @@ impl RoomLikeItem for SpaceItem {
1223
1241
// XXX: this needs to check whether the space contains rooms with unread messages
1224
1242
false
1225
1243
}
1244
+
1245
+ fn is_invite ( & self ) -> bool {
1246
+ self . room ( ) . state ( ) == MatrixRoomState :: Invited
1247
+ }
1226
1248
}
1227
1249
1228
1250
impl Display for SpaceItem {
@@ -1556,6 +1578,7 @@ mod tests {
1556
1578
alias : Option < OwnedRoomAliasId > ,
1557
1579
name : & ' static str ,
1558
1580
unread : UnreadInfo ,
1581
+ invite : bool
1559
1582
}
1560
1583
1561
1584
impl RoomLikeItem for & TestRoomItem {
@@ -1582,6 +1605,10 @@ mod tests {
1582
1605
fn is_unread ( & self ) -> bool {
1583
1606
self . unread . is_unread ( )
1584
1607
}
1608
+
1609
+ fn is_invite ( & self ) -> bool {
1610
+ self . invite
1611
+ }
1585
1612
}
1586
1613
1587
1614
#[ test]
@@ -1594,6 +1621,7 @@ mod tests {
1594
1621
alias : Some ( room_alias_id ! ( "#room1:example.com" ) . to_owned ( ) ) ,
1595
1622
name : "Z" ,
1596
1623
unread : UnreadInfo :: default ( ) ,
1624
+ invite : false ,
1597
1625
} ;
1598
1626
1599
1627
let room2 = TestRoomItem {
@@ -1602,6 +1630,7 @@ mod tests {
1602
1630
alias : Some ( room_alias_id ! ( "#a:example.com" ) . to_owned ( ) ) ,
1603
1631
name : "Unnamed Room" ,
1604
1632
unread : UnreadInfo :: default ( ) ,
1633
+ invite : false ,
1605
1634
} ;
1606
1635
1607
1636
let room3 = TestRoomItem {
@@ -1610,6 +1639,7 @@ mod tests {
1610
1639
alias : None ,
1611
1640
name : "Cool Room" ,
1612
1641
unread : UnreadInfo :: default ( ) ,
1642
+ invite : false ,
1613
1643
} ;
1614
1644
1615
1645
// Sort by Name ascending.
@@ -1655,6 +1685,7 @@ mod tests {
1655
1685
alias : None ,
1656
1686
name : "Room 1" ,
1657
1687
unread : UnreadInfo { unread : false , latest : None } ,
1688
+ invite : false ,
1658
1689
} ;
1659
1690
1660
1691
let room2 = TestRoomItem {
@@ -1666,6 +1697,7 @@ mod tests {
1666
1697
unread : false ,
1667
1698
latest : Some ( MessageTimeStamp :: OriginServer ( 40u32 . into ( ) ) ) ,
1668
1699
} ,
1700
+ invite : false ,
1669
1701
} ;
1670
1702
1671
1703
let room3 = TestRoomItem {
@@ -1677,6 +1709,7 @@ mod tests {
1677
1709
unread : false ,
1678
1710
latest : Some ( MessageTimeStamp :: OriginServer ( 20u32 . into ( ) ) ) ,
1679
1711
} ,
1712
+ invite : false ,
1680
1713
} ;
1681
1714
1682
1715
// Sort by Recent ascending.
@@ -1691,4 +1724,48 @@ mod tests {
1691
1724
rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields) ) ;
1692
1725
assert_eq ! ( rooms, vec![ & room1, & room3, & room2] ) ;
1693
1726
}
1727
+
1728
+ #[ test]
1729
+ fn test_sort_room_invites ( ) {
1730
+ let server = server_name ! ( "example.com" ) ;
1731
+
1732
+ let room1 = TestRoomItem {
1733
+ room_id : RoomId :: new ( server) . to_owned ( ) ,
1734
+ tags : vec ! [ ] ,
1735
+ alias : None ,
1736
+ name : "Old room 1" ,
1737
+ unread : UnreadInfo :: default ( ) ,
1738
+ invite : false ,
1739
+ } ;
1740
+
1741
+ let room2 = TestRoomItem {
1742
+ room_id : RoomId :: new ( server) . to_owned ( ) ,
1743
+ tags : vec ! [ ] ,
1744
+ alias : None ,
1745
+ name : "Old room 2" ,
1746
+ unread : UnreadInfo :: default ( ) ,
1747
+ invite : false ,
1748
+ } ;
1749
+
1750
+ let room3 = TestRoomItem {
1751
+ room_id : RoomId :: new ( server) . to_owned ( ) ,
1752
+ tags : vec ! [ ] ,
1753
+ alias : None ,
1754
+ name : "New Fancy Room" ,
1755
+ unread : UnreadInfo :: default ( ) ,
1756
+ invite : true ,
1757
+ } ;
1758
+
1759
+ // Sort invites first
1760
+ let mut rooms = vec ! [ & room1, & room2, & room3] ;
1761
+ let fields = & [ SortColumn ( SortFieldRoom :: Invite , SortOrder :: Ascending ) ] ;
1762
+ rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields) ) ;
1763
+ assert_eq ! ( rooms, vec![ & room3, & room1, & room2] ) ;
1764
+
1765
+ // Sort invites after
1766
+ let mut rooms = vec ! [ & room1, & room2, & room3] ;
1767
+ let fields = & [ SortColumn ( SortFieldRoom :: Invite , SortOrder :: Descending ) ] ;
1768
+ rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields) ) ;
1769
+ assert_eq ! ( rooms, vec![ & room1, & room2, & room3] ) ;
1770
+ }
1694
1771
}
0 commit comments