Skip to content

Commit e50f025

Browse files
committed
Fetching the room display names in background to avoid blocking the main thread.
1 parent 97cb8ad commit e50f025

File tree

6 files changed

+55
-7
lines changed

6 files changed

+55
-7
lines changed

ElementX/Sources/Modules/HomeScreen/HomeScreenModels.swift

+3-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ enum HomeScreenViewModelResult {
2525
enum HomeScreenViewAction {
2626
case logout
2727
case loadUserAvatar
28-
case loadRoomAvatar(roomId: String)
28+
case loadRoomData(roomId: String)
2929
}
3030

3131
struct HomeScreenViewState: BindableState {
@@ -54,7 +54,8 @@ struct HomeScreenViewState: BindableState {
5454

5555
struct HomeScreenRoom: Identifiable {
5656
let id: String
57-
let displayName: String
57+
58+
var displayName: String?
5859

5960
let topic: String?
6061
let lastMessage: String?

ElementX/Sources/Modules/HomeScreen/HomeScreenViewModel.swift

+28-2
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
5252
switch viewAction {
5353
case .logout:
5454
self.completion?(.logout)
55-
case .loadRoomAvatar(let roomId):
55+
case .loadRoomData(let roomId):
5656
self.loadAvatarForRoomWithIdentifier(roomId)
57+
self.loadRoomDisplayNameForRoomWithIdentifier(roomId)
5758
case .loadUserAvatar:
5859
self.completion?(.loadUserAvatar)
5960
}
@@ -63,7 +64,7 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
6364
self.roomList = roomList
6465
state.rooms = roomList.map { roomModel in
6566
HomeScreenRoom(id: roomModel.identifier,
66-
displayName: roomModel.displayName,
67+
displayName: roomModel.name,
6768
topic: roomModel.topic,
6869
lastMessage: roomModel.lastMessage,
6970
isDirect: roomModel.isDirect,
@@ -114,6 +115,31 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
114115
}
115116
}
116117

118+
private func loadRoomDisplayNameForRoomWithIdentifier(_ roomIdentifier: String) {
119+
guard let room = roomList?.filter({ $0.identifier == roomIdentifier }).first else {
120+
return
121+
}
122+
123+
room.loadDisplayName { [weak self] result in
124+
guard let self = self else { return }
125+
126+
switch result {
127+
case .success(let displayName):
128+
self.updateDisplayName(displayName, forRoomWithIdentifier: roomIdentifier)
129+
default:
130+
break
131+
}
132+
}
133+
}
134+
135+
private func updateDisplayName(_ displayName: String, forRoomWithIdentifier roomIdentifier: String) {
136+
guard let index = self.state.rooms.firstIndex(where: { $0.id == roomIdentifier }) else {
137+
return
138+
}
139+
140+
self.state.rooms[index].displayName = displayName
141+
}
142+
117143
private func updateAvatar(_ avatar: UIImage?, forRoomWithIdentifier roomIdentifier: String) {
118144
guard let index = self.state.rooms.firstIndex(where: { $0.id == roomIdentifier }) else {
119145
return

ElementX/Sources/Modules/HomeScreen/View/HomeScreen.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ struct RoomCell: View {
114114
.frame(width: 40, height: 40)
115115
.mask(Circle())
116116
} else {
117-
let _ = context.send(viewAction: .loadRoomAvatar(roomId: room.id))
117+
let _ = context.send(viewAction: .loadRoomData(roomId: room.id))
118118
Image(systemName: "person.3")
119119
.frame(width: 40, height: 40)
120120
}
@@ -143,7 +143,7 @@ struct RoomCell: View {
143143
}
144144

145145
private func roomName(_ room: HomeScreenRoom) -> String {
146-
room.displayName + (room.isEncrypted ? "🛡": "")
146+
room.displayName ?? room.id + (room.isEncrypted ? "🛡": "")
147147
}
148148
}
149149

ElementX/Sources/Modules/Models/MockRoomModel.swift

+4
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ struct MockRoomModel: RoomModelProtocol {
2323
let isPublic = Bool.random()
2424
let isEncrypted = Bool.random()
2525

26+
func loadDisplayName(_ completion: @escaping (Result<String, Error>) -> Void) {
27+
completion(.success(displayName))
28+
}
29+
2630
func loadAvatar(_ completion: (Result<UIImage?, Error>) -> Void) {
2731
completion(.success(UIImage(systemName: "wand.and.stars")))
2832
}

ElementX/Sources/Modules/Models/RoomModel.swift

+17
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import UIKit
1010
import MatrixRustSDK
1111

1212
enum RoomModelError: Error {
13+
case failedRetrievingDisplayName
1314
case failedRetrievingAvatar
1415
}
1516

@@ -74,6 +75,22 @@ struct RoomModel: RoomModelProtocol {
7475
return URL(string: urlString)
7576
}
7677

78+
func loadDisplayName(_ completion: @escaping (Result<String, Error>) -> Void) {
79+
DispatchQueue.global(qos: .background).async {
80+
do {
81+
let displayName = try room.displayName()
82+
83+
DispatchQueue.main.async {
84+
completion(.success(displayName))
85+
}
86+
} catch {
87+
DispatchQueue.main.async {
88+
completion(.failure(RoomModelError.failedRetrievingDisplayName))
89+
}
90+
}
91+
}
92+
}
93+
7794
func loadAvatar(_ completion: @escaping (Result<UIImage?, Error>) -> Void) {
7895
DispatchQueue.global(qos: .background).async {
7996
do {

ElementX/Sources/Modules/Models/RoomModelProtocol.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ protocol RoomModelProtocol {
1414
var isSpace: Bool { get }
1515
var isEncrypted: Bool { get }
1616

17-
var displayName: String { get }
1817
var name: String? { get }
1918

2019
var topic: String? { get }
2120
var lastMessage: String? { get }
2221

2322
var avatarURL: URL? { get }
2423

24+
func loadDisplayName(_ completion: @escaping (Result<String, Error>) -> Void)
2525
func loadAvatar(_ completion: @escaping (Result<UIImage?, Error>) -> Void)
2626
}

0 commit comments

Comments
 (0)