[spaces] several fixes for pre release

- [Space home view inherits title from previously viewed tab](https://github.com/vector-im/element-ios/issues/4851)
- [Home view doesn't refresh when new rooms are created](https://github.com/vector-im/element-ios/issues/4849)
- [Odd error message in Space member list](https://github.com/vector-im/element-ios/issues/4845)
- [Bring leaving space experience in line with Web](https://github.com/vector-im/element-ios/issues/4850)
- [No notification for space invitation](https://github.com/vector-im/element-ios/issues/4840)
- [Remove filter when space is switched](https://github.com/vector-im/element-ios/issues/4852)
- [M10.11 Remove community tab](https://github.com/vector-im/element-ios/issues/4493)
This commit is contained in:
Gil Eluard
2021-09-20 10:10:27 +02:00
parent 2e822f8784
commit d879928a96
15 changed files with 266 additions and 64 deletions
@@ -75,29 +75,52 @@ class SpaceMenuViewModel: SpaceMenuViewModelType {
guard let space = self.session.spaceService.getSpace(withId: self.spaceId), let displayName = space.summary?.displayname else {
return
}
let alert = UIAlertController(title: nil, message: VectorL10n.leaveSpaceMessage(displayName), preferredStyle: .alert)
alert.addAction(UIAlertAction(title: VectorL10n.leave, style: .destructive, handler: { [weak self] action in
var message = VectorL10n.leaveSpaceMessage(displayName)
if let roomState = space.room.dangerousSyncState, let powerLevels = roomState.powerLevels {
let powerLevel = powerLevels.powerLevelOfUser(withUserID: self.session.myUserId)
let roomPowerLevel = RoomPowerLevelHelper.roomPowerLevel(from: powerLevel)
if roomPowerLevel == .admin {
message += "\n\n" + VectorL10n.leaveSpaceMessageAdminWarning
}
}
let alert = UIAlertController(title: VectorL10n.leaveSpaceTitle(displayName), message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: VectorL10n.leaveSpaceOnlyAction, style: .default, handler: { [weak self] action in
guard let self = self else {
return
}
self.viewDelegate?.spaceMenuViewModel(self, didUpdateViewState: .loading)
space.room.leave(completion: { [weak self] response in
self.leaveSpace(space)
}))
alert.addAction(UIAlertAction(title: VectorL10n.leaveSpaceAndAllRoomsAction, style: .destructive, handler: { [weak self] action in
guard let self = self, let space = self.session.spaceService.getSpace(withId: self.spaceId) else {
return
}
self.viewDelegate?.spaceMenuViewModel(self, didUpdateViewState: .loading)
let allRoomsAndSpaces = space.childRoomIds + space.childSpaces.map({ space in
space.spaceId
})
self.leaveAllRooms(from: allRoomsAndSpaces, at: 0) { [weak self] error in
guard let self = self else {
return
}
self.viewDelegate?.spaceMenuViewModel(self, didUpdateViewState: .loaded)
if let error = response.error {
if let error = error {
self.viewDelegate?.spaceMenuViewModel(self, didUpdateViewState: .loaded)
self.viewDelegate?.spaceMenuViewModel(self, didUpdateViewState: .error(error))
} else {
self.process(viewAction: .dismiss)
return
}
})
self.leaveSpace(space)
}
}))
alert.addAction(UIAlertAction(title: VectorL10n.cancel, style: .cancel, handler: { [weak self] action in
guard let self = self else {
@@ -109,4 +132,50 @@ class SpaceMenuViewModel: SpaceMenuViewModelType {
self.viewDelegate?.spaceMenuViewModel(self, didUpdateViewState: .alert(alert))
}
private func leaveAllRooms(from roomIds: [String], at index: Int, completion: @escaping (_ error: Error?) -> Void) {
guard index < roomIds.count, let room = self.session.room(withRoomId: roomIds[index]), !room.isDirect else {
let nextIndex = index+1
if nextIndex < roomIds.count {
self.leaveAllRooms(from: roomIds, at: nextIndex, completion: completion)
} else {
completion(nil)
}
return
}
room.leave { [weak self] response in
guard let self = self else {
return
}
guard response.isSuccess else {
completion(response.error)
return
}
let nextIndex = index+1
if nextIndex < roomIds.count {
self.leaveAllRooms(from: roomIds, at: nextIndex, completion: completion)
} else {
completion(nil)
}
}
}
private func leaveSpace(_ space: MXSpace) {
space.room.leave(completion: { [weak self] response in
guard let self = self else {
return
}
self.viewDelegate?.spaceMenuViewModel(self, didUpdateViewState: .loaded)
if let error = response.error {
self.viewDelegate?.spaceMenuViewModel(self, didUpdateViewState: .error(error))
} else {
self.process(viewAction: .dismiss)
}
})
}
}