// // 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() 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) } } } } }