mirror of
https://github.com/luxfi/safe-ios.git
synced 2026-10-30 15:19:20 +00:00
209 lines
6.6 KiB
Swift
209 lines
6.6 KiB
Swift
//
|
|
// AddOwnerKeyViewController.swift
|
|
// Multisig
|
|
//
|
|
// Created by Andrey Scherbovich on 26.05.21.
|
|
// Copyright © 2021 Gnosis Ltd. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
|
|
class AddOwnerKeyViewController: UITableViewController {
|
|
private typealias SectionItems = (section: String, items: [Row])
|
|
|
|
private var sections = [SectionItems]()
|
|
|
|
var importKeyFlow: ImportKeyFlow!
|
|
var generateKeyFlow: GenerateKeyFlow!
|
|
var walletConnectKeyFlow: WalletConnectKeyFlow!
|
|
var socialKeyFlow: AddSocialKeyFlow!
|
|
|
|
enum Row {
|
|
case social
|
|
case generate
|
|
case importKey
|
|
case hardware
|
|
case walletConnect
|
|
|
|
var title: String {
|
|
switch self {
|
|
case .social:
|
|
return "Create or import with Google or Apple ID"
|
|
case .generate:
|
|
return "Create new owner key"
|
|
case .importKey:
|
|
return "Import existing key"
|
|
case .hardware:
|
|
return "Pair hardware device"
|
|
case .walletConnect:
|
|
return "Connect a key"
|
|
}
|
|
}
|
|
|
|
var image: UIImage {
|
|
switch self {
|
|
case .generate:
|
|
return UIImage(named: KeyType.deviceGenerated.imageName)!
|
|
case .importKey:
|
|
return UIImage(named: KeyType.deviceImported.imageName)!
|
|
case .walletConnect:
|
|
return UIImage(named: KeyType.walletConnect.imageName)!
|
|
case .hardware:
|
|
return UIImage(named: "ico-hardware-wallet")!
|
|
case .social:
|
|
return UIImage(named: "ico-add")!
|
|
}
|
|
}
|
|
|
|
var style: AddOwnerKeyCell.Style {
|
|
switch self {
|
|
case .social:
|
|
return .highlighted
|
|
default:
|
|
return .normal
|
|
}
|
|
}
|
|
|
|
var detailsImage: UIImage? {
|
|
switch self {
|
|
case .walletConnect:
|
|
return UIImage(named: "ico-wallet-logos")
|
|
default:
|
|
return nil
|
|
}
|
|
}
|
|
}
|
|
|
|
private(set) var completion: () -> Void = {}
|
|
private var showsCloseButton: Bool = true
|
|
|
|
convenience init(showsCloseButton: Bool = true, completion: @escaping () -> Void) {
|
|
self.init()
|
|
self.completion = completion
|
|
self.showsCloseButton = showsCloseButton
|
|
}
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
|
|
title = "Add Owner Key"
|
|
navigationItem.largeTitleDisplayMode = .always
|
|
navigationController?.navigationBar.prefersLargeTitles = true
|
|
navigationItem.backBarButtonItem = UIBarButtonItem(title: "Back")
|
|
|
|
ViewControllerFactory.removeNavigationBarBorder(self)
|
|
|
|
if showsCloseButton {
|
|
navigationItem.leftBarButtonItem = UIBarButtonItem(
|
|
barButtonSystemItem: .close,
|
|
target: self,
|
|
action: #selector(CloseModal.closeModal))
|
|
}
|
|
|
|
tableView.registerCell(AddOwnerKeyCell.self)
|
|
tableView.registerHeaderFooterView(BasicHeaderView.self)
|
|
tableView.separatorStyle = .none
|
|
tableView.estimatedRowHeight = 90
|
|
tableView.rowHeight = UITableView.automaticDimension
|
|
tableView.backgroundColor = .backgroundSecondary
|
|
if #available(iOS 15.0, *) {
|
|
tableView.sectionHeaderTopPadding = 0
|
|
}
|
|
|
|
sections = [
|
|
(section: "Start from scratch",
|
|
items: AppConfiguration.FeatureToggles.socialLogin ? [.social, .generate] : [.generate]),
|
|
|
|
(section: "Already have a key?", items: [.walletConnect, .importKey, .hardware])
|
|
]
|
|
|
|
let header = TableHeaderView(frame: CGRect(x: 0, y: 0, width: 0, height: 80))
|
|
header.set("Use owner keys independently or as Safe owners to login, confirm and transact.", backgroundColor: .clear)
|
|
|
|
tableView.tableHeaderView = header
|
|
}
|
|
|
|
override func viewDidAppear(_ animated: Bool) {
|
|
super.viewDidAppear(animated)
|
|
Tracker.trackEvent(.ownerKeysOptions)
|
|
}
|
|
|
|
// MARK: - Table view data source
|
|
|
|
override func numberOfSections(in tableView: UITableView) -> Int {
|
|
sections.count
|
|
}
|
|
|
|
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
|
sections[section].items.count
|
|
}
|
|
|
|
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
|
|
let view = tableView.dequeueHeaderFooterView(BasicHeaderView.self)
|
|
view.setName(sections[section].section, backgroundColor: .clear)
|
|
|
|
return view
|
|
}
|
|
|
|
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
|
let cell = tableView.dequeueCell(AddOwnerKeyCell.self)
|
|
let option = sections[indexPath.section].items[indexPath.row]
|
|
|
|
cell.set(title: option.title)
|
|
cell.set(image: option.image)
|
|
cell.set(style: option.style)
|
|
cell.set(detailsImage: option.detailsImage)
|
|
|
|
return cell
|
|
}
|
|
|
|
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
|
switch sections[indexPath.section].items[indexPath.row] {
|
|
case .importKey:
|
|
importKeyFlow = ImportKeyFlow { [weak self] _ in
|
|
self?.importKeyFlow = nil
|
|
self?.completion()
|
|
}
|
|
push(flow: importKeyFlow)
|
|
return
|
|
|
|
case .generate:
|
|
generateKeyFlow = GenerateKeyFlow { [weak self] _ in
|
|
self?.generateKeyFlow = nil
|
|
self?.completion()
|
|
}
|
|
push(flow: generateKeyFlow)
|
|
return
|
|
|
|
case .walletConnect:
|
|
walletConnectKeyFlow = WalletConnectKeyFlow { [weak self] _ in
|
|
self?.walletConnectKeyFlow = nil
|
|
self?.completion()
|
|
}
|
|
push(flow: walletConnectKeyFlow)
|
|
return
|
|
|
|
case .hardware:
|
|
let vc = ChooseHardwareWalletTableViewController()
|
|
ViewControllerFactory.makeMultiLinesNavigationBar(vc)
|
|
ViewControllerFactory.removeNavigationBarBorder(vc)
|
|
|
|
vc.completion = completion
|
|
|
|
show(vc, sender: self)
|
|
case .social:
|
|
socialKeyFlow = AddSocialKeyFlow { [weak self] _ in
|
|
self?.socialKeyFlow = nil
|
|
self?.completion()
|
|
}
|
|
push(flow: socialKeyFlow)
|
|
return
|
|
}
|
|
}
|
|
|
|
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
|
|
BasicHeaderView.headerHeight
|
|
}
|
|
}
|