Files
raspberry/iOS/Wallet/Sources/Inheritance/Controller/InheritanceController.swift
T
2022-08-31 14:20:08 +03:00

180 lines
6.9 KiB
Swift

//
// InheritanceController.swift
// Wallet
//
// Created by Igor on 11.03.2021.
// Copyright © 2021 AM. All rights reserved.
//
import UIKit
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 }
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Inheritance.title
navigationItem.leftBarButtonItem = .pop(self)
segCtrl.removeAllSegments()
service.menus.enumerated().forEach({ segCtrl.insertSegment(withTitle: $0.element.inheritanceMenu, at: $0.offset, animated: false) })
segCtrl.selectedSegmentIndex = service.menus.lastIndex(of: service.menu) ?? 0
segCtrl
.subviews
.compactMap { ($0.subviews as? [UILabel]) }
.flatMap { $0 }
.forEach {
$0.adjustsFontSizeToFitWidth = true
$0.minimumScaleFactor = 0.4
}
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)
Notification.subscribe(bag: bag, name: .didChangeAccount) { _ in self.service.fetch() }
service.fetch()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
bag.flush()
}
private func reload(animated: Bool, isLoading: Bool) {
if service.information.object != nil {
myInheritanceEmptyView.isHidden = true
myInheritanceContainer.isHidden = false
} else {
myInheritanceEmptyView.isHidden = false
myInheritanceContainer.isHidden = true
}
loadingView.isLoading = isLoading
self.updateInheritanceDateLabel.isHidden = true
guard !isLoading else { return }
editButton.isHidden = editButtonAppearance()
dateField.text = service.information.object?.startDate.string(date: .medium)
dateField.isHidden = dateField.text?.isEmpty ?? true
self.updateInheritanceDateLabel.isHidden = dateField.text?.isEmpty ?? true
if let value = service.information.object?.inactive_period {
periodField.text = "\(Int(value/(24*3600))) \(L10n.Inheritance.periodUnit)"
periodField.isHidden = false
} else {
periodField.text = nil
periodField.isHidden = true
}
inheritorsStackView.arrangedSubviews.forEach({ $0.removeFromSuperview() })
service.information.object?.inheritors.forEach({ inheritorsStackView.addArrangedSubview(InheritanceViewHeir(model: $0)) })
inheritorsStackView.superview?.isHidden = service.information.object?.inheritors.isEmpty ?? true
readyStackView.subviews.forEach({ $0.removeFromSuperview() })
service.records.ready.forEach { record in
readyStackView.addArrangedSubview(InheritanceViewReady(record: record) {
AccountViewAuthorize.showGetPrivateKey(in: self) {
Loader.show()
self.service.records.execute(username: record.ownerUsername, privateKey: $0) {
Loader.hide()
Alert.notify($0)
condition($0 == nil, true: { self.service.fetch() })
}
}
})
}
readyStackView.superview?.isHidden = service.records.ready.isEmpty
waitingStackView.subviews.forEach({ $0.removeFromSuperview() })
service.records.waiting.forEach({ waitingStackView.addArrangedSubview(InheritanceViewWaiting(record: $0)) })
waitingEmptyView.isHidden = !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: [Network.Model.Contract] = []
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)
}
}
}
}
}