tokenary/Encrypted Ink/Screens/AccountsListViewController.swift

125 lines
4.0 KiB
Swift
Raw Normal View History

// Copyright © 2021 Encrypted Ink. All rights reserved.
import Cocoa
class AccountsListViewController: NSViewController {
2021-06-16 21:22:50 +03:00
private let agent = Agent.shared
2021-06-13 05:45:54 +03:00
private var accounts = [Account]()
2021-06-13 06:30:20 +03:00
var onSelectedAccount: ((Account) -> Void)?
2021-06-13 05:45:54 +03:00
static func with(preloadedAccounts: [Account]) -> AccountsListViewController {
let new = instantiate(AccountsListViewController.self)
new.accounts = preloadedAccounts
return new
}
@IBOutlet weak var titleLabel: NSTextField!
@IBOutlet weak var tableView: NSTableView! {
didSet {
tableView.delegate = self
tableView.dataSource = self
}
}
override func viewDidLoad() {
super.viewDidLoad()
let menu = NSMenu()
menu.addItem(NSMenuItem(title: "Copy address", action: #selector(didClickCopyAddress(_:)), keyEquivalent: ""))
menu.addItem(NSMenuItem(title: "Remove account", action: #selector(didClickRemoveAccount(_:)), keyEquivalent: ""))
tableView.menu = menu
2021-06-13 05:45:54 +03:00
if accounts.isEmpty {
accounts = AccountsService.getAccounts()
}
2021-06-13 06:30:20 +03:00
if onSelectedAccount != nil {
titleLabel.stringValue = "Select\nAccount"
}
}
@IBAction func addButtonTapped(_ sender: NSButton) {
2021-06-13 05:45:54 +03:00
let importViewController = instantiate(ImportViewController.self)
2021-06-13 06:30:20 +03:00
importViewController.onSelectedAccount = onSelectedAccount
2021-06-13 05:45:54 +03:00
view.window?.contentViewController = importViewController
}
@objc private func didClickCopyAddress(_ sender: AnyObject) {
let row = tableView.clickedRow
guard row >= 0 else { return }
let pasteboard = NSPasteboard.general
pasteboard.clearContents()
pasteboard.setString(accounts[row].address, forType: .string)
}
@objc private func didClickRemoveAccount(_ sender: AnyObject) {
let row = tableView.clickedRow
2021-06-16 21:13:47 +03:00
let alert = NSAlert()
alert.messageText = "Removed accounts can't be recovered."
alert.alertStyle = .critical
alert.addButton(withTitle: "Cancel")
alert.addButton(withTitle: "Remove anyway")
if alert.runModal() != .alertFirstButtonReturn {
guard row >= 0 else { return }
2021-06-16 21:22:50 +03:00
agent.proceedAfterAuthentication(reason: "Remove account") { [weak self] allowed in
Window.activateApp()
2021-06-16 21:22:50 +03:00
if allowed {
self?.removeAccountAtIndex(row)
}
}
2021-06-16 21:13:47 +03:00
}
}
2021-06-17 22:47:39 +03:00
private func showInstructionsAlert() {
let alert = NSAlert()
alert.messageText = "How to start?"
alert.informativeText = "Press “Copy” under\nWalletConnect QR code\nand get back."
alert.alertStyle = .informational
alert.addButton(withTitle: "OK")
alert.runModal()
}
2021-06-16 21:22:50 +03:00
private func removeAccountAtIndex(_ index: Int) {
AccountsService.removeAccount(accounts[index])
accounts.remove(at: index)
tableView.reloadData()
}
}
extension AccountsListViewController: NSTableViewDelegate {
func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool {
2021-06-13 06:30:20 +03:00
if let onSelectedAccount = onSelectedAccount {
let account = accounts[row]
onSelectedAccount(account)
return true
} else {
2021-06-17 22:47:39 +03:00
showInstructionsAlert()
2021-06-13 06:30:20 +03:00
return false
}
}
}
extension AccountsListViewController: NSTableViewDataSource {
func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
let rowView = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier("AccountCellView"), owner: self) as? AccountCellView
rowView?.setup(address: accounts[row].address)
return rowView
}
func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
return 50
}
func numberOfRows(in tableView: NSTableView) -> Int {
return accounts.count
}
}