ShowDirectoryViewModel: Fix searched room not refreshed after joined.

This commit is contained in:
SBiOSoftWhare 2021-06-15 17:28:45 +02:00
parent f60638ccb3
commit 01f27b6a7f
2 changed files with 42 additions and 6 deletions

View file

@ -58,10 +58,12 @@ class PublicRoomsDirectoryViewModel {
private func roomCellViewModel(with publicRoom: MXPublicRoom) -> DirectoryRoomTableViewCellVM {
let summary = session.roomSummary(withRoomId: publicRoom.roomId)
let isJoined = summary?.membership == .join || summary?.membershipTransitionState == .joined
return DirectoryRoomTableViewCellVM(title: publicRoom.displayname(),
numberOfUsers: publicRoom.numJoinedMembers,
subtitle: MXTools.stripNewlineCharacters(publicRoom.topic),
isJoined: summary?.membership == .join,
isJoined: isJoined,
roomId: publicRoom.roomId,
avatarUrl: publicRoom.avatarUrl,
mediaManager: session.mediaManager)

View file

@ -45,6 +45,9 @@ final class ShowDirectoryViewModel: NSObject, ShowDirectoryViewModelType {
return .publicRoomsDirectory(self.publicRoomsDirectoryViewModel)
}
// Last room id or room alias search
private var lastSearchInputViewData: DirectoryRoomTableViewCellVM?
// MARK: Public
weak var viewDelegate: ShowDirectoryViewModelViewDelegate?
@ -151,7 +154,8 @@ final class ShowDirectoryViewModel: NSObject, ShowDirectoryViewModelType {
}
private func resetSections() {
self.sections = [self.publicRoomsDirectorySection]
self.lastSearchInputViewData = nil
self.updateSectionsIfNeeded()
}
private func switchServer() {
@ -163,6 +167,7 @@ final class ShowDirectoryViewModel: NSObject, ShowDirectoryViewModelType {
guard let self = self else { return }
switch response {
case .success:
self.updateSectionsIfNeeded()
self.update(viewState: .loaded(self.sections))
case .failure(let error):
self.update(viewState: .error(error))
@ -185,7 +190,10 @@ final class ShowDirectoryViewModel: NSObject, ShowDirectoryViewModelType {
if let searchText = pattern, let searchInputViewData = self.searchInputViewData(from: searchText) {
sections.append(.searchInput(searchInputViewData))
self.lastSearchInputViewData = searchInputViewData
shouldUpdate = true
} else {
self.lastSearchInputViewData = nil
}
sections.append(self.publicRoomsDirectorySection)
@ -199,6 +207,21 @@ final class ShowDirectoryViewModel: NSObject, ShowDirectoryViewModelType {
self.paginatePublicRoomsDirectory(force: true)
}
private func updateSectionsIfNeeded() {
var sections: [ShowDirectorySection] = []
// Refresh search input view data if needed
// Useful when a room has been joined
if let lastSearchInputViewData = self.lastSearchInputViewData, let newSearchInputViewData = self.searchInputViewData(from: lastSearchInputViewData.roomId) {
sections.append(.searchInput(newSearchInputViewData))
}
sections.append(self.publicRoomsDirectorySection)
self.sections = sections
}
private func searchInputViewData(from searchText: String) -> DirectoryRoomTableViewCellVM? {
guard MXTools.isMatrixRoomAlias(searchText) || MXTools.isMatrixRoomIdentifier(searchText) else {
return nil
@ -221,7 +244,7 @@ final class ShowDirectoryViewModel: NSObject, ShowDirectoryViewModelType {
let displayName = room.summary.displayname
let joinedMembersCount = Int(room.summary.membersCount.joined)
let topic = MXTools.stripNewlineCharacters(room.summary.topic)
let isJoined = room.summary.membership == .join
let isJoined = room.summary.membership == .join || room.summary.membershipTransitionState == .joined
let avatarStringUrl = room.summary.avatar
let mediaManager: MXMediaManager = self.session.mediaManager
@ -229,10 +252,20 @@ final class ShowDirectoryViewModel: NSObject, ShowDirectoryViewModelType {
}
private func roomCellViewModel(with roomIdOrAlias: String) -> DirectoryRoomTableViewCellVM {
let displayName = roomIdOrAlias
let mediaManager: MXMediaManager = self.session.mediaManager
return DirectoryRoomTableViewCellVM(title: displayName, numberOfUsers: 0, subtitle: nil, isJoined: false, roomId: roomIdOrAlias, avatarUrl: nil, mediaManager: mediaManager)
let directoryRoomTableViewCellVM: DirectoryRoomTableViewCellVM
if let room = self.session.vc_room(withIdOrAlias: roomIdOrAlias) {
directoryRoomTableViewCellVM = self.roomCellViewModel(with: room)
} else {
let displayName = roomIdOrAlias
let mediaManager: MXMediaManager = self.session.mediaManager
directoryRoomTableViewCellVM = DirectoryRoomTableViewCellVM(title: displayName, numberOfUsers: 0, subtitle: nil, isJoined: false, roomId: roomIdOrAlias, avatarUrl: nil, mediaManager: mediaManager)
}
return directoryRoomTableViewCellVM
}
private func update(viewState: ShowDirectoryViewState) {
@ -261,6 +294,7 @@ extension ShowDirectoryViewModel: MXKDataSourceDelegate {
}
func dataSource(_ dataSource: MXKDataSource!, didStateChange state: MXKDataSourceState) {
self.updateSectionsIfNeeded()
self.update(viewState: .loaded(self.sections))
}