Use local room list sorting from Rust. (#2978)

* Switch to the new local room list sorting API

* Get rid of the RoomSummary enum, replace it by the inner RoomSummaryDetails

* And finally, rename RoomSummaryDetails to RoomSummary

* Fix a bunch of warnings

* Small tidy up post rebase/review.

- Remove unused invalidated property.
- Rename some RoomSummary instances to summary instead of details.
- Fix tests with missing roomListItem's.

* Update snapshots

---------

Co-authored-by: Doug <douglase@element.io>
This commit is contained in:
Stefan Ceriu
2024-07-05 12:10:53 +03:00
committed by GitHub
parent c024702d50
commit d71c8c4e83
26 changed files with 556 additions and 608 deletions
@@ -138,21 +138,15 @@ class NotificationSettingsEditScreenViewModel: NotificationSettingsEditScreenVie
var roomsWithUserDefinedMode: [NotificationSettingsEditScreenRoom] = []
for roomSummary in filteredRoomsSummary {
switch roomSummary {
case .empty, .invalidated:
guard let roomProxy = await userSession.clientProxy.roomForIdentifier(roomSummary.id) else { continue }
// `isOneToOneRoom` here is not the same as `isDirect` on the room. From the point of view of the push rule, a one-to-one room is a room with exactly two active members.
let isOneToOneRoom = roomProxy.activeMembersCount == 2
// display only the rooms we're interested in
switch chatType {
case .oneToOneChat where isOneToOneRoom, .groupChat where !isOneToOneRoom:
await roomsWithUserDefinedMode.append(buildRoom(with: roomSummary))
default:
break
case .filled(let details):
guard let roomProxy = await userSession.clientProxy.roomForIdentifier(details.id) else { continue }
// `isOneToOneRoom` here is not the same as `isDirect` on the room. From the point of view of the push rule, a one-to-one room is a room with exactly two active members.
let isOneToOneRoom = roomProxy.activeMembersCount == 2
// display only the rooms we're interested in
switch chatType {
case .oneToOneChat where isOneToOneRoom,
.groupChat where !isOneToOneRoom:
await roomsWithUserDefinedMode.append(buildRoom(with: details))
default:
break
}
}
}
@@ -163,12 +157,12 @@ class NotificationSettingsEditScreenViewModel: NotificationSettingsEditScreenVie
}
}
private func buildRoom(with details: RoomSummaryDetails) async -> NotificationSettingsEditScreenRoom {
let notificationMode = try? await notificationSettingsProxy.getUserDefinedRoomNotificationMode(roomId: details.id)
return NotificationSettingsEditScreenRoom(id: details.id,
roomId: details.id,
name: details.name,
avatar: details.avatar,
private func buildRoom(with summary: RoomSummary) async -> NotificationSettingsEditScreenRoom {
let notificationMode = try? await notificationSettingsProxy.getUserDefinedRoomNotificationMode(roomId: summary.id)
return NotificationSettingsEditScreenRoom(id: summary.id,
roomId: summary.id,
name: summary.name,
avatar: summary.avatar,
notificationMode: notificationMode)
}
@@ -72,7 +72,7 @@ struct NotificationSettingsEditScreen_Previews: PreviewProvider, TestablePreview
let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init())
notificationSettingsProxy.getDefaultRoomNotificationModeIsEncryptedIsOneToOneReturnValue = .allMessages
notificationSettingsProxy.getRoomsWithUserDefinedRulesReturnValue = [RoomSummary].mockRooms.compactMap(\.id)
notificationSettingsProxy.getRoomsWithUserDefinedRulesReturnValue = [RoomSummary].mockRooms.map(\.id)
let userSession = UserSessionMock(.init(clientProxy: ClientProxyMock(.init(userID: "@alice:example.com",
roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))))))
var viewModel = NotificationSettingsEditScreenViewModel(chatType: .groupChat,
@@ -113,7 +113,7 @@ struct NotificationSettingsEditScreen_Previews: PreviewProvider, TestablePreview
let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init(canPushEncryptedEvents: true))
notificationSettingsProxy.getDefaultRoomNotificationModeIsEncryptedIsOneToOneReturnValue = .allMessages
notificationSettingsProxy.getRoomsWithUserDefinedRulesReturnValue = [RoomSummary].mockRooms.compactMap(\.id)
notificationSettingsProxy.getRoomsWithUserDefinedRulesReturnValue = [RoomSummary].mockRooms.map(\.id)
let userSession = UserSessionMock(.init(clientProxy: ClientProxyMock(.init(userID: "@alice:example.com",
roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))))))
var viewModel = NotificationSettingsEditScreenViewModel(chatType: .groupChat,
@@ -68,17 +68,12 @@ struct NotificationSettingsEditScreenRoomCell_Previews: PreviewProvider, Testabl
notificationSettingsProxy: notificationSettingsProxy)
let rooms: [NotificationSettingsEditScreenRoom] = summaryProvider.roomListPublisher.value.compactMap { summary -> NotificationSettingsEditScreenRoom? in
switch summary {
case .empty, .invalidated:
return nil
case .filled(let details):
return NotificationSettingsEditScreenRoom(id: UUID().uuidString,
roomId: details.id,
name: details.name,
avatar: details.avatar)
}
NotificationSettingsEditScreenRoom(id: UUID().uuidString,
roomId: summary.id,
name: summary.name,
avatar: summary.avatar)
}
return VStack(spacing: 0) {
ForEach(rooms) { room in
NotificationSettingsEditScreenRoomCell(room: room, context: viewModel.context)