[Spaces] M10.4.1 Home space data filtering #4570

- update after review
This commit is contained in:
Gil Eluard
2021-10-18 15:01:11 +02:00
parent 8cbc0dbada
commit b7e4e67f3b
8 changed files with 31 additions and 44 deletions
@@ -17,5 +17,5 @@
import Foundation
protocol SpaceMenuCell: Themable {
func fill(with viewData: SpaceMenuListItemViewData)
func update(with viewData: SpaceMenuListItemViewData)
}
@@ -16,6 +16,14 @@
import Foundation
/// Possible action ID related to a `SpaceMenuListViewCell` view data
enum SpaceMenuListItemActionId {
case showAllRoomsInHomeSpace
case exploreSpaceMembers
case exploreSpaceRooms
case leaveSpace
}
/// Style of the `SpaceMenuListViewCell`
enum SpaceMenuListItemStyle {
case normal
@@ -30,11 +38,11 @@ protocol SpaceMenuListItemViewDataDelegate: AnyObject {
/// `SpaceMenuListViewCell` view data
class SpaceMenuListItemViewData {
let actionId: String
let actionId: SpaceMenuListItemActionId
let style: SpaceMenuListItemStyle
let title: String?
let icon: UIImage?
/// Any value related to the type of data (e.g. `Bool` for `boolean` style, `nil` for `normal` and `destructive` style)
var value: Any? {
didSet {
delegate?.spaceMenuItemValueDidChange(self)
@@ -42,7 +50,7 @@ class SpaceMenuListItemViewData {
}
weak var delegate: SpaceMenuListItemViewDataDelegate?
init(actionId: String, style: SpaceMenuListItemStyle, title: String?, icon: UIImage?, value: Any?) {
init(actionId: SpaceMenuListItemActionId, style: SpaceMenuListItemStyle, title: String?, icon: UIImage?, value: Any?) {
self.actionId = actionId
self.style = style
self.title = title
@@ -49,7 +49,7 @@ class SpaceMenuListViewCell: UITableViewCell, SpaceMenuCell, NibReusable {
// MARK: - Public
func fill(with viewData: SpaceMenuListItemViewData) {
func update(with viewData: SpaceMenuListItemViewData) {
self.iconView.image = viewData.icon
self.titleLabel.text = viewData.title
@@ -101,13 +101,12 @@ extension SpaceMenuPresenter: SpaceMenuModelViewModelCoordinatorDelegate {
self.dismiss(animated: true, completion: nil)
}
func spaceMenuViewModel(_ viewModel: SpaceMenuViewModelType, didSelectItemWithId itemId: String) {
let actionId = SpaceMenuViewModel.ActionId(rawValue: itemId)
switch actionId {
case .leave: break
case .members:
func spaceMenuViewModel(_ viewModel: SpaceMenuViewModelType, didSelectItemWithId itemId: SpaceMenuListItemActionId) {
switch itemId {
case .leaveSpace: break
case .exploreSpaceMembers:
self.delegate?.spaceMenuPresenter(self, didCompleteWith: .exploreMembers, forSpaceWithId: self.spaceId, with: self.session)
case .rooms:
case .exploreSpaceRooms:
self.delegate?.spaceMenuPresenter(self, didCompleteWith: .exploreRooms, forSpaceWithId: self.spaceId, with: self.session)
default:
MXLog.error("[SpaceMenuPresenter] spaceListViewModel didSelectItemWithId: invalid itemId \(itemId)")
@@ -49,20 +49,10 @@ class SpaceMenuSwitchViewCell: UITableViewCell, SpaceMenuCell, NibReusable {
// MARK: - Public
func fill(with viewData: SpaceMenuListItemViewData) {
func update(with viewData: SpaceMenuListItemViewData) {
self.titleLabel.text = viewData.title
self.switchView.isOn = (viewData.value as? Bool) ?? false
guard let theme = self.theme else {
return
}
if viewData.style == .destructive {
self.titleLabel.textColor = theme.colors.alert
} else {
self.titleLabel.textColor = theme.colors.primaryContent
}
viewData.delegate = self
}
@@ -253,7 +253,7 @@ extension SpaceMenuViewController: UITableViewDataSource {
if let cell = cell as? SpaceMenuCell {
cell.update(theme: self.theme)
cell.fill(with: viewData)
cell.update(with: viewData)
}
return cell
@@ -19,24 +19,15 @@ import Foundation
/// View model used by `SpaceMenuViewController`
class SpaceMenuViewModel: SpaceMenuViewModelType {
// MARK: - Enum
enum ActionId: String {
case showAllRoomsInHome = "showAllRoomsInHome"
case members = "members"
case rooms = "rooms"
case leave = "leave"
}
// MARK: - Properties
weak var coordinatorDelegate: SpaceMenuModelViewModelCoordinatorDelegate?
weak var viewDelegate: SpaceMenuViewModelViewDelegate?
private let spaceMenuItems: [SpaceMenuListItemViewData] = [
SpaceMenuListItemViewData(actionId: ActionId.members.rawValue, style: .normal, title: VectorL10n.roomDetailsPeople, icon: Asset.Images.spaceMenuMembers.image, value: nil),
SpaceMenuListItemViewData(actionId: ActionId.rooms.rawValue, style: .normal, title: VectorL10n.spacesExploreRooms, icon: Asset.Images.spaceMenuRooms.image, value: nil),
SpaceMenuListItemViewData(actionId: ActionId.leave.rawValue, style: .destructive, title: VectorL10n.leave, icon: Asset.Images.spaceMenuLeave.image, value: nil)
SpaceMenuListItemViewData(actionId: .exploreSpaceMembers, style: .normal, title: VectorL10n.roomDetailsPeople, icon: Asset.Images.spaceMenuMembers.image, value: nil),
SpaceMenuListItemViewData(actionId: .exploreSpaceRooms, style: .normal, title: VectorL10n.spacesExploreRooms, icon: Asset.Images.spaceMenuRooms.image, value: nil),
SpaceMenuListItemViewData(actionId: .leaveSpace, style: .destructive, title: VectorL10n.leave, icon: Asset.Images.spaceMenuLeave.image, value: nil)
]
var menuItems: [SpaceMenuListItemViewData] = []
@@ -54,7 +45,7 @@ class SpaceMenuViewModel: SpaceMenuViewModelType {
self.menuItems = spaceMenuItems
} else {
self.menuItems = [
SpaceMenuListItemViewData(actionId: ActionId.showAllRoomsInHome.rawValue, style: .boolean, title: VectorL10n.spaceHomeShowAllRooms, icon: nil, value: MXKAppSettings.standard().isShowAllRoomsInHomeEnabled)
SpaceMenuListItemViewData(actionId: .showAllRoomsInHomeSpace, style: .boolean, title: VectorL10n.spaceHomeShowAllRooms, icon: nil, value: MXKAppSettings.standard().showAllRoomsInHomeSpace)
]
}
}
@@ -76,17 +67,16 @@ class SpaceMenuViewModel: SpaceMenuViewModelType {
// MARK: - Private
private func processAction(with actionStringId: String, at indexPath: IndexPath) {
let actionId = ActionId(rawValue: actionStringId)
private func processAction(with actionId: SpaceMenuListItemActionId, at indexPath: IndexPath) {
switch actionId {
case .showAllRoomsInHome:
MXKAppSettings.standard().isShowAllRoomsInHomeEnabled = !MXKAppSettings.standard().isShowAllRoomsInHomeEnabled
self.menuItems[indexPath.row].value = MXKAppSettings.standard().isShowAllRoomsInHomeEnabled
case .showAllRoomsInHomeSpace:
MXKAppSettings.standard().showAllRoomsInHomeSpace = !MXKAppSettings.standard().showAllRoomsInHomeSpace
self.menuItems[indexPath.row].value = MXKAppSettings.standard().showAllRoomsInHomeSpace
self.viewDelegate?.spaceMenuViewModel(self, didUpdateViewState: .deselect)
case .leave:
case .leaveSpace:
self.leaveSpace()
default:
self.coordinatorDelegate?.spaceMenuViewModel(self, didSelectItemWithId: actionStringId)
self.coordinatorDelegate?.spaceMenuViewModel(self, didSelectItemWithId: actionId)
}
}
@@ -22,7 +22,7 @@ protocol SpaceMenuViewModelViewDelegate: AnyObject {
protocol SpaceMenuModelViewModelCoordinatorDelegate: AnyObject {
func spaceMenuViewModelDidDismiss(_ viewModel: SpaceMenuViewModelType)
func spaceMenuViewModel(_ viewModel: SpaceMenuViewModelType, didSelectItemWithId itemId: String)
func spaceMenuViewModel(_ viewModel: SpaceMenuViewModelType, didSelectItemWithId itemId: SpaceMenuListItemActionId)
}
/// Protocol describing the view model used by `SpaceMenuViewController`