Files

196 lines
7.5 KiB
Swift

//
// InheritanceController.swift
// Wallet
//
// Created by Igor on 11.03.2021.
// Copyright © 2021 AM. All rights reserved.
//
import UIKit
import Combine
final class InheritanceController: UIViewController {
@IBOutlet private weak var myInheritanceEmptyView: UIView!
@IBOutlet private weak var myInheritanceContainer: UIView!
@IBOutlet private weak var segCtrl: UISegmentedControl!
@IBOutlet private weak var dateField: CommonViewField!
@IBOutlet private weak var periodField: CommonViewField!
@IBOutlet private weak var inheritorsStackView: UIStackView!
@IBOutlet private weak var waitingStackView: UIStackView!
@IBOutlet private weak var readyStackView: UIStackView!
@IBOutlet private weak var waitingEmptyView: UIView!
@IBOutlet private weak var loadingView: CommonViewEmptyContainer!
@IBOutlet weak var updateInheritanceDateLabel: CommonButtonAction!
@IBOutlet weak var editButton: CommonButtonAction!
private let service = Inheritance.Service()
private var balances: [Network.Model.Token] { Wallet.Service.Tokens.shared.balances.collection }
private var cancellables = Set<AnyCancellable>()
override func viewDidLoad() {
super.viewDidLoad()
self.title = L10n.Inheritance.title
self.navigationItem.leftBarButtonItem = .pop(self)
self.segCtrl.removeAllSegments()
self.service.menus
.enumerated()
.forEach {
self.segCtrl.insertSegment(withTitle: $0.element.inheritanceMenu,
at: $0.offset,
animated: false)
}
self.segCtrl.selectedSegmentIndex = self.service.menus.lastIndex(of: self.service.menu) ?? 0
self.segCtrl
.subviews
.compactMap { ($0.subviews as? [UILabel]) }
.flatMap { $0 }
.forEach {
$0.adjustsFontSizeToFitWidth = true
$0.minimumScaleFactor = 0.4
}
self.service.didUpdate = { [weak self] err, bool in
Alert.error(err)
self?.reload(animated: true, isLoading: bool)
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(false, animated: true)
self.service.activeWalletPublisher
.sink { [weak self] in
self?.service.fetch(username: $0?.name)
}
.store(in: &self.cancellables)
self.service.fetch()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.cancellables.removeAll()
}
private func reload(animated: Bool, isLoading: Bool) {
if self.service.information.object.isExist {
self.myInheritanceEmptyView.isHidden = true
self.myInheritanceContainer.isHidden = false
} else {
self.myInheritanceEmptyView.isHidden = false
self.myInheritanceContainer.isHidden = true
}
self.loadingView.isLoading = isLoading
self.updateInheritanceDateLabel.isHidden = true
guard !isLoading else { return }
self.editButton.isHidden = self.editButtonAppearance()
self.dateField.text = self.service.information.object?.startDate.string(date: .medium)
self.dateField.isHidden = self.dateField.text?.isEmpty ?? true
self.updateInheritanceDateLabel.isHidden = self.dateField.text?.isEmpty ?? true
if let value = self.service.information.object?.inactive_period {
self.periodField.text = "\(Int(value/(24*3600))) \(L10n.Inheritance.periodUnit)"
self.periodField.isHidden = false
} else {
self.periodField.text = nil
self.periodField.isHidden = true
}
self.inheritorsStackView.arrangedSubviews.forEach { $0.removeFromSuperview() }
self.service.information.object?.inheritors
.forEach { self.inheritorsStackView.addArrangedSubview(InheritanceViewHeir(model: $0)) }
self.inheritorsStackView.superview?.isHidden = self.service.information.object?.inheritors.isEmpty ?? true
self.readyStackView.subviews.forEach { $0.removeFromSuperview() }
self.service.records.ready.forEach { record in
self.readyStackView.addArrangedSubview(InheritanceViewReady(record: record) {
AccountViewAuthorize.showGetPrivateKey(in: self) { [weak self] in
Loader.show()
self?.service.records.execute(username: record.ownerUsername, privateKey: $0) {
Loader.hide()
Alert.notify($0)
condition($0 == nil, true: { self?.service.fetch() })
}
}
})
}
self.readyStackView.superview?.isHidden = service.records.ready.isEmpty
self.waitingStackView.subviews.forEach { $0.removeFromSuperview() }
self.service.records.waiting.forEach { self.waitingStackView.addArrangedSubview(InheritanceViewWaiting(record: $0)) }
self.waitingEmptyView.isHidden = !self.service.records.waiting.isEmpty
}
@IBAction func onChanged(_: AnyObject?) {
service.menu = service.menus[segCtrl.selectedSegmentIndex]
}
@IBAction func changeDate(_ sender: UIButton) {
guard let inactivePeriod = self.service.information.object?.inactive_period,
let date = Date().addDays(days: inactivePeriod/(24*3600))?.string(date: .medium)
else {
return
}
self.openChangeDatePopup(currentDate: date)
}
@IBAction func onEdit(_: AnyObject?) {
let ctrl = StoryboardScene.Inheritance.setup.instantiate()
ctrl.service = .init(object: service.information.object,
contract: service.menu)
navigationController?.pushViewController(ctrl, animated: true)
}
private func editButtonAppearance() -> Bool {
var avaliableMenus: [EOSContract] = []
balances.forEach { token in
if token.isSwapContract {
avaliableMenus.append(.swap)
}
if token.isCashContract {
avaliableMenus.append(.cash)
}
if token.isListContract {
avaliableMenus.append(.list)
}
}
return !avaliableMenus.contains(service.menus[segCtrl.selectedSegmentIndex])
}
}
extension InheritanceController {
fileprivate func openChangeDatePopup(currentDate: String) {
let views: [UIView] =
[
.field(
title: L10n.Inheritance.Update.Popup.New.Date.title,
text: currentDate,
textColor: Asset.textCoal.color
)
]
Popup.show(title: L10n.Inheritance.Update.Popup.title,
views: views,
submit: L10n.Common.Button.confirm,
cancel: L10n.Common.Button.cancel,
cancelStyle: .tertiary,
cancelSize: .small,
in: self) { ctrl in
AccountViewAuthorize.showGetPrivateKey(in: self) { [weak self] in
Loader.show()
self?.service.refresh(privateKey: $0) {
ctrl.dismiss(animated: true, completion: nil)
Loader.hide()
Alert.notify($0)
}
}
}
}
}