Files
bundesmessenger-ios/bwi/RollsAndRights/RoomRollsAndRightsPickerViewController.swift
T
2022-09-19 11:53:45 +02:00

172 lines
5.6 KiB
Swift

import UIKit
protocol RoomRollsAndRightsPickerViewControllerDelegate: AnyObject {
func powerLevelsDidChange(controller: RoomRollsAndRightsPickerViewController, viewState: RoomRollsAndRightsViewState)
}
final class RoomRollsAndRightsPickerViewController: UITableViewController {
enum SelectedViewStateProperty {
case general
case send
case invite
case redact
case ban
}
var viewState: RoomRollsAndRightsViewState?
var selectedViewStateProperty: SelectedViewStateProperty?
var theme: Theme!
weak var delegate: RoomRollsAndRightsPickerViewControllerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
registerThemeServiceDidChangeThemeNotification()
update(theme: theme)
self.tableView.dataSource = self
self.tableView.delegate = self
}
private func powerLevel(for viewStateProperty: SelectedViewStateProperty?) -> RoomPowerLevel? {
guard let viewStateProperty = viewStateProperty, let viewState = viewState else {
return nil
}
switch viewStateProperty {
case .general:
return powerLevel(for: viewState.powerLevelGeneral)
case .send:
return powerLevel(for: viewState.powerLevelSend)
case .redact:
return powerLevel(for: viewState.powerLevelRedact)
case .invite:
return powerLevel(for: viewState.powerLevelInvite)
case .ban:
return powerLevel(for: viewState.powerLevelBan)
}
}
func powerLevel(for value: Int) -> RoomPowerLevel {
if value >= RoomPowerLevel.admin.rawValue {
return RoomPowerLevel.admin
}
else if value >= RoomPowerLevel.moderator.rawValue {
return RoomPowerLevel.moderator
}
else {
return RoomPowerLevel.user
}
}
// MARK: - Theme
private func update(theme: Theme) {
self.theme = theme
view.backgroundColor = theme.headerBackgroundColor
self.tableView.backgroundColor = theme.headerBackgroundColor
if let navigationBar = navigationController?.navigationBar {
theme.applyStyle(onNavigationBar: navigationBar)
}
self.tableView.reloadData()
}
private func registerThemeServiceDidChangeThemeNotification() {
NotificationCenter.default.addObserver(self, selector: #selector(themeDidChange), name: .themeServiceDidChangeTheme, object: nil)
}
@objc private func themeDidChange() {
update(theme: ThemeService.shared().theme)
}
}
// MARK: - UITableViewDataSource
extension RoomRollsAndRightsPickerViewController {
override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let footerView = UIView()
footerView.backgroundColor = theme.headerBackgroundColor
return footerView
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .default, reuseIdentifier: "rolls_and_rights_picker_cells")
cell.tintColor = theme.tintColor // only for the accessory view
cell.backgroundColor = theme.backgroundColor
cell.textLabel?.textColor = theme.textPrimaryColor
let powerLevel = self.powerLevel(for: selectedViewStateProperty)
switch indexPath.row {
case 0:
cell.textLabel?.text = BWIL10n.bwiRollsAndRightsAdmin
cell.accessoryType = powerLevel == .admin ? .checkmark : .none
case 1:
cell.textLabel?.text = BWIL10n.bwiRollsAndRightsModerator
cell.accessoryType = powerLevel == .moderator ? .checkmark : .none
case 2:
cell.textLabel?.text = BWIL10n.bwiRollsAndRightsUser
cell.accessoryType = powerLevel == .user ? .checkmark : .none
default:
assertionFailure("invalid indexPath in RollsAndRightsPickerViewController tableview")
}
return cell
}
}
// MARK: - UITableViewDelegate
extension RoomRollsAndRightsPickerViewController {
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
var newPowerLevel: Int?
switch indexPath.row {
case 0:
newPowerLevel = RoomPowerLevel.admin.rawValue
case 1:
newPowerLevel = RoomPowerLevel.moderator.rawValue
case 2:
newPowerLevel = RoomPowerLevel.user.rawValue
default:
break
}
if let newPowerLevel = newPowerLevel, let selectedViewStateProperty = selectedViewStateProperty {
switch selectedViewStateProperty {
case .general:
viewState?.powerLevelGeneral = newPowerLevel
case .send:
viewState?.powerLevelSend = newPowerLevel
case .redact:
viewState?.powerLevelRedact = newPowerLevel
case .invite:
viewState?.powerLevelInvite = newPowerLevel
case .ban:
viewState?.powerLevelBan = newPowerLevel
}
if let viewState = viewState {
self.delegate?.powerLevelsDidChange(controller: self, viewState: viewState)
}
}
self.navigationController?.popViewController(animated: true)
}
}