Files
safe-ios/Multisig/UI/Settings/OwnerKeyManagement/RequestToAddOwner/ValidateRequestToAddOwnerViewController.swift
2022-10-12 22:37:46 +02:00

176 lines
5.7 KiB
Swift

//
// ValidateRequestToAddOwnerViewController.swift
// Multisig
//
// Created by Dmitry Bespalov on 14.06.22.
// Copyright © 2022 Gnosis Ltd. All rights reserved.
//
import UIKit
class ValidateRequestToAddOwnerViewController: UIViewController {
@IBOutlet weak var activityIndicator: UIActivityIndicatorView!
@IBOutlet weak var descriptionLabel: UILabel!
@IBOutlet weak var cancelButton: UIButton!
var parameters: AddOwnerRequestParameters!
var onAddOwner: ((Safe, Address) -> ())!
var onReplaceOwner: ((Safe, Address) -> ())!
var onCancel: () -> Void = { }
private var safeLoader = SafeInfoLoader()
override func viewDidLoad() {
super.viewDidLoad()
ViewControllerFactory.addCloseButton(self)
ViewControllerFactory.makeTransparentNavigationBar(self)
descriptionLabel.setStyle(.headline)
cancelButton.setText("Cancel", .plain)
validate()
}
override func closeModal() {
cancel()
}
@IBAction func didTapCancelButton(_ sender: Any) {
cancel()
}
func validate() {
safeLoader = SafeInfoLoader()
safeLoader.load(chain: parameters.chain, safe: parameters.safeAddress) { [weak self] result in
self?.handle(result: result)
}
}
func revalidate() {
// come back to the verification screen
// verify again with the same parameters
navigationController?.popToRootViewController(animated: true)
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(500)) { [unowned self] in
validate()
}
}
func handle(result: Result<SCGModels.SafeInfoExtended, Error>) {
do {
let info = try result.get()
let isAlreadyAnOwner = info.owners.contains(where: { $0.addressInfo.address == parameters.ownerAddress })
if isAlreadyAnOwner {
handleOwnerAlreadyInOwnerList()
return
}
// do we have such a safe?
guard let safe = Safe.by(address: parameters.safeAddress.checksummed, chainId: parameters.chain.id!) else {
handleSafeNotAdded(info: info)
return
}
// update database
safe.update(from: info)
if safe.isReadOnly {
handleSafeReadOnly()
return
}
// all requirements passed
handleValidationSuccess(safe: safe, owner: parameters.ownerAddress)
} catch {
// show error screen
let errorVC = InactiveLinkViewController.broken(error, completion: onCancel)
show(errorVC, sender: self)
}
}
func handleOwnerAlreadyInOwnerList() {
let inactiveLinkVC = InactiveLinkViewController.inactiveLink(completion: onCancel)
show(inactiveLinkVC, sender: self)
}
func handleSafeNotAdded(info: SCGModels.SafeInfoExtended) {
// safe must be added to the app to continue
Tracker.trackEvent(.screenOwnerFromLinkNoSafe)
let noSafeVC = AddOwnerExceptionViewController.safeNotFound(
address: parameters.safeAddress,
chain: parameters.chain,
onAdd: { [unowned self] in
Tracker.trackEvent(.userOwnerFromLinkSafeNameAdded,
parameters: ["add_owner_chain_id" : parameters.chain.id!])
Safe.create(
address: parameters.safeAddress.checksummed,
version: info.version,
name: "Safe",
chain: parameters.chain
)
App.shared.notificationHandler.safeAdded(address: parameters.safeAddress)
// re-trigger validation
revalidate()
},
onClose: { [unowned self] in
Tracker.trackEvent(.userOwnerFromLinkNoSafeSkip,
parameters: ["add_owner_chain_id" : parameters.chain.id!])
onCancel()
})
show(noSafeVC, sender: self)
}
func handleSafeReadOnly() {
// if safe is read-only then can't add new owner.
Tracker.trackEvent(.screenOwnerFromLinkNoKey)
let readOnlyVC = AddOwnerExceptionViewController.safeReadOnly(
address: parameters.safeAddress,
chain: parameters.chain,
onAdd: { [unowned self] in
Tracker.trackEvent(.userOwnerFromLinkNoKeyAddIt,
parameters: ["add_owner_chain_id" : parameters.chain.id!])
// add new owner
let addOwnerVC = ViewControllerFactory.addOwnerViewController { [weak self] in
// owner added, close opened screen.
self?.dismiss(animated: true) {
// re-trigger validation
self?.revalidate()
}
}
// start adding owner
present(addOwnerVC, animated: true)
},
onClose: { [unowned self] in
Tracker.trackEvent(.userOwnerFromLinkNoKeySkip,
parameters: ["add_owner_chain_id" : parameters.chain.id!])
onCancel()
}
)
show(readOnlyVC, sender: self)
}
func handleValidationSuccess(safe: Safe, owner: Address) {
// show the 'receive' screen
let requestVC = ReceiveAddOwnerLinkViewController()
requestVC.safe = safe
requestVC.owner = owner
requestVC.onAddOwner = onAddOwner
requestVC.onReplaceOwner = onReplaceOwner
requestVC.onReject = onCancel
show(requestVC, sender: self)
}
func cancel() {
safeLoader.cancel()
onCancel()
}
}