metatext-app-ios-iphone-ipad/View Controllers/IdentitiesViewController.swift

85 lines
3.0 KiB
Swift

// Copyright © 2021 Metabolist. All rights reserved.
import SwiftUI
import ViewModels
final class IdentitiesViewController: UITableViewController {
private let viewModel: IdentitiesViewModel
private let rootViewModel: RootViewModel
private lazy var dataSource: IdentitiesDataSource = {
.init(tableView: tableView,
publisher: viewModel.$identities.eraseToAnyPublisher(),
viewModelProvider: viewModel.viewModel(identity:))
}()
init(viewModel: IdentitiesViewModel, rootViewModel: RootViewModel) {
self.viewModel = viewModel
self.rootViewModel = rootViewModel
super.init(style: .insetGrouped)
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = dataSource
}
override func didMove(toParent parent: UIViewController?) {
parent?.navigationItem.title = NSLocalizedString("secondary-navigation.accounts", comment: "")
parent?.navigationItem.rightBarButtonItem = editButtonItem
}
override func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
if case let .identitiy(identityViewModel) = dataSource.itemIdentifier(for: indexPath) {
return identityViewModel.id != viewModel.identityContext.identity.id
}
return true
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let item = dataSource.itemIdentifier(for: indexPath) else { return }
switch item {
case .add:
let addIdentityViewModel = rootViewModel.addIdentityViewModel()
let addIdentityView = AddIdentityView(viewModelClosure: { addIdentityViewModel }, displayWelcome: false)
.environmentObject(rootViewModel)
let addIdentityViewController = UIHostingController(rootView: addIdentityView)
show(addIdentityViewController, sender: self)
case let .identitiy(identityViewModel):
rootViewModel.identitySelected(id: identityViewModel.id)
}
}
override func tableView(
_ tableView: UITableView,
trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
guard dataSource.itemIdentifier(for: indexPath) != .add else { return nil }
let logOutAction = UIContextualAction(
style: .destructive,
title: NSLocalizedString("identities.log-out", comment: "")) { [weak self] _, _, completionHandler in
guard let self = self, case let .identitiy(identity) = self.dataSource.itemIdentifier(for: indexPath) else {
completionHandler(false)
return
}
self.rootViewModel.deleteIdentity(id: identity.id)
completionHandler(true)
}
return UISwipeActionsConfiguration(actions: [logOutAction])
}
}