mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-22 01:22:46 +02:00
Create RoomInfoListViewData
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user