Create RoomInfoListViewData

This commit is contained in:
ismailgulek
2020-09-23 12:33:44 +03:00
parent e0dfb6b6b3
commit cfc991236c
6 changed files with 68 additions and 33 deletions
@@ -60,11 +60,26 @@ final class RoomInfoListViewController: UIViewController {
return controller
}()
private enum RowType {
private enum RowType: Equatable {
case `default`
case destructive
case basicInfo
case basicInfo(_ viewModel: RoomInfoBasicTableViewCellVM)
case textView
static func == (lhs: RoomInfoListViewController.RowType, rhs: RoomInfoListViewController.RowType) -> Bool {
switch (lhs, rhs) {
case (.default, .default):
return true
case (.destructive, .destructive):
return true
case (.basicInfo, .basicInfo):
return true
case (.textView, .textView):
return true
default:
return false
}
}
}
private struct Row {
@@ -121,16 +136,16 @@ final class RoomInfoListViewController: UIViewController {
// MARK: - Private
private func updateSections() {
private func updateSections(with viewData: RoomInfoListViewData) {
var tmpSections: [Section] = []
let rowBasicInfo = Row(type: .basicInfo, text: nil, accessoryType: .none, action: nil)
let rowBasicInfo = Row(type: .basicInfo(viewData.basicInfoViewModel), text: nil, accessoryType: .none, action: nil)
var sectionBasicInfo = Section(header: nil,
rows: [rowBasicInfo],
footer: nil)
if let topic = viewModel.roomTopic {
if let topic = viewData.roomTopic {
let rowTopic = Row(type: .textView, text: topic, accessoryType: .none, action: nil)
sectionBasicInfo.rows.append(rowTopic)
@@ -138,7 +153,7 @@ final class RoomInfoListViewController: UIViewController {
tmpSections.append(sectionBasicInfo)
if viewModel.isEncrypted {
if viewData.isEncrypted {
let sectionSecurity = Section(header: VectorL10n.securitySettingsTitle,
rows: [],
footer: VectorL10n.roomInfoListRoomEncrypted)
@@ -149,7 +164,7 @@ final class RoomInfoListViewController: UIViewController {
let rowSettings = Row(type: .default, icon: Asset.Images.settingsIcon.image, text: VectorL10n.roomDetailsSettings, accessoryType: .disclosureIndicator) {
self.viewModel.process(viewAction: .navigate(target: .settings))
}
let text = viewModel.numberOfMembers == 1 ? VectorL10n.roomInfoListOneMember : VectorL10n.roomInfoListSeveralMembers(String(viewModel.numberOfMembers))
let text = viewData.numberOfMembers == 1 ? VectorL10n.roomInfoListOneMember : VectorL10n.roomInfoListSeveralMembers(String(viewData.numberOfMembers))
let rowMembers = Row(type: .default, icon: Asset.Images.userIcon.image, text: text, accessoryType: .disclosureIndicator) {
self.viewModel.process(viewAction: .navigate(target: .members))
}
@@ -218,8 +233,8 @@ final class RoomInfoListViewController: UIViewController {
switch viewState {
case .loading:
self.renderLoading()
case .loaded:
self.renderLoaded()
case .loaded(let viewData):
self.renderLoaded(viewData: viewData)
case .error(let error):
self.render(error: error)
}
@@ -229,9 +244,9 @@ final class RoomInfoListViewController: UIViewController {
self.activityPresenter.presentActivityIndicator(on: self.view, animated: true)
}
private func renderLoaded() {
private func renderLoaded(viewData: RoomInfoListViewData) {
self.activityPresenter.removeCurrentActivityIndicator(animated: true)
self.updateSections()
self.updateSections(with: viewData)
}
private func render(error: Error) {
@@ -296,9 +311,9 @@ extension RoomInfoListViewController: UITableViewDataSource {
cell.contentView.backgroundColor = .clear
cell.tintColor = theme.tintColor
return cell
case .basicInfo:
case .basicInfo(let basicInfoViewModel):
let cell: RoomInfoBasicTableViewCell = tableView.dequeueReusableCell(for: indexPath)
cell.configure(withViewModel: viewModel.basicInfoViewModel)
cell.configure(withViewModel: basicInfoViewModel)
cell.selectionStyle = .none
cell.vc_hideSeparator()
cell.update(theme: theme)
@@ -0,0 +1,27 @@
// File created from ScreenTemplate
// $ createScreen.sh Room2/RoomInfo RoomInfoList
/*
Copyright 2020 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import Foundation
/// View data object to represent view
struct RoomInfoListViewData {
let numberOfMembers: Int
let isEncrypted: Bool
let basicInfoViewModel: RoomInfoBasicTableViewCellVM
let roomTopic: String?
}
@@ -32,17 +32,11 @@ final class RoomInfoListViewModel: NSObject, RoomInfoListViewModelType {
weak var viewDelegate: RoomInfoListViewModelViewDelegate?
weak var coordinatorDelegate: RoomInfoListViewModelCoordinatorDelegate?
var numberOfMembers: Int {
return Int(room.summary.membersCount.joined)
}
var isEncrypted: Bool {
return room.summary.isEncrypted
}
var basicInfoViewModel: RoomInfoBasicTableViewCellVM {
return self
}
var roomTopic: String? {
return room.summary.topic
private var viewData: RoomInfoListViewData {
return RoomInfoListViewData(numberOfMembers: Int(room.summary.membersCount.joined),
isEncrypted: room.summary.isEncrypted,
basicInfoViewModel: self,
roomTopic: room.summary.topic)
}
// MARK: - Setup
@@ -85,11 +79,11 @@ final class RoomInfoListViewModel: NSObject, RoomInfoListViewModelType {
@objc private func roomSummaryUpdated(_ notification: Notification) {
// force update view
self.update(viewState: .loaded)
self.update(viewState: .loaded(viewData: viewData))
}
private func loadData() {
self.update(viewState: .loaded)
self.update(viewState: .loaded(viewData: viewData))
}
private func navigate(to target: RoomInfoListTarget) {
@@ -33,10 +33,5 @@ protocol RoomInfoListViewModelType {
var viewDelegate: RoomInfoListViewModelViewDelegate? { get set }
var coordinatorDelegate: RoomInfoListViewModelCoordinatorDelegate? { get set }
func process(viewAction: RoomInfoListViewAction)
var numberOfMembers: Int { get }
var isEncrypted: Bool { get }
var basicInfoViewModel: RoomInfoBasicTableViewCellVM { get }
var roomTopic: String? { get }
func process(viewAction: RoomInfoListViewAction)
}
@@ -21,6 +21,6 @@ import Foundation
/// RoomInfoListViewController view state
enum RoomInfoListViewState {
case loading
case loaded
case loaded(viewData: RoomInfoListViewData)
case error(Error)
}