forked from planetdecred/dcrios
/
AccountSelectorDialog.swift
157 lines (128 loc) · 6.26 KB
/
AccountSelectorDialog.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
//
// AccountSelectorDialog.swift
// Decred Wallet
//
// Copyright (c) 2020 The Decred developers
// Use of this source code is governed by an ISC
// license that can be found in the LICENSE file.
import UIKit
import Dcrlibwallet
typealias AccountSelectorDialogCallback = (_ selectedWalletId: Int, _ selectedAccount: DcrlibwalletAccount) -> Void
class AccountSelectorDialog: UIViewController {
@IBOutlet weak var headerContainerView: UIView!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var walletsTableView: SelfSizedTableView!
private var dialogTitle: String!
private var callback: AccountSelectorDialogCallback!
var wallets = [Wallet]()
var selectedWallet: DcrlibwalletWallet?
var selectedAccount: DcrlibwalletAccount?
var showWatchOnly = true
var showUnMixedAccount = true
var showMixedAccount = true
var showMixedOnly = true
let accountCellRowHeight: CGFloat = 74
let walletHeaderSectionHeight: CGFloat = 36
static func show(sender vc: UIViewController,
title: String,
selectedWallet: DcrlibwalletWallet?,
selectedAccount: DcrlibwalletAccount?,
showWatchOnlyWallet: Bool,
showUnMixedAccount: Bool,
showMixedAccount: Bool,
showMixedOnly: Bool,
callback: @escaping AccountSelectorDialogCallback) {
let dialog = AccountSelectorDialog.instantiate(from: .CustomDialogs)
dialog.dialogTitle = title
dialog.callback = callback
dialog.selectedWallet = selectedWallet
dialog.selectedAccount = selectedAccount
dialog.showWatchOnly = showWatchOnlyWallet
dialog.showUnMixedAccount = showUnMixedAccount
dialog.showMixedOnly = showMixedOnly
dialog.showMixedAccount = showMixedAccount
dialog.modalPresentationStyle = .pageSheet
vc.present(dialog, animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
self.titleLabel.text = self.dialogTitle
self.walletsTableView.dataSource = self
self.walletsTableView.delegate = self
self.walletsTableView.registerCellNib(AccountSelectorTableViewCell.self)
self.dismissViewOnTapAround()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// calculate maximum height of walletsTableView to take up
self.walletsTableView.maxHeight = self.view.frame.size.height
- self.headerContainerView.frame.size.height
- (UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0)
var accountsFilterFn: (DcrlibwalletAccount) -> Bool = { $0.totalBalance > 0 || $0.name != "imported" }
if !showUnMixedAccount {
accountsFilterFn = { $0.totalBalance > 0 || $0.name != "imported" && $0.number != self.selectedWallet?.readInt32ConfigValue(forKey: DcrlibwalletAccountMixerUnmixedAccount, defaultValue: -1)}
}
if !showMixedOnly {
accountsFilterFn = {$0.number == self.selectedWallet?.readInt32ConfigValue(forKey: DcrlibwalletAccountMixerMixedAccount, defaultValue: -1)}
}
if !showMixedAccount {
accountsFilterFn = { $0.name != "imported" && $0.number != self.selectedWallet?.readInt32ConfigValue(forKey: DcrlibwalletAccountMixerMixedAccount, defaultValue: -1)}
}
let fullCoinWallet = WalletLoader.shared.wallets.filter { !$0.isWatchingOnlyWallet()}
if showWatchOnly {
self.wallets = WalletLoader.shared.wallets.map({ Wallet.init($0, accountsFilterFn: accountsFilterFn) })
} else {
self.wallets = fullCoinWallet.map({ Wallet.init($0, accountsFilterFn: accountsFilterFn) })
}
self.walletsTableView.reloadData()
self.walletsTableView.reloadData()
}
@IBAction func closeButtonTapped(_ sender: Any) {
self.dismissView()
}
}
extension AccountSelectorDialog: UITableViewDataSource, UITableViewDelegate {
func numberOfSections(in tableView: UITableView) -> Int {
return self.wallets.count
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return self.walletHeaderSectionHeight
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let label = Label(frame: CGRect.init(x: 0, y: 0, width: tableView.frame.size.width, height: self.walletHeaderSectionHeight))
label.leftPadding = 17
label.topPadding = 16
label.borderWidth = 0
label.text = self.wallets[section].name
label.textColor = UIColor.appColors.darkBluishGray
label.backgroundColor = UIColor.white
label.adjustsFontSizeToFitWidth = false
label.lineBreakMode = .byTruncatingTail
label.numberOfLines = 1
label.font = UIFont(name: "SourceSansPro-Regular", size: 14)
return label
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.wallets[section].accounts.count
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return self.accountCellRowHeight
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let accountViewCell = tableView.dequeueReusableCell(withIdentifier: "AccountSelectorTableViewCell") as! AccountSelectorTableViewCell
let wallet = self.wallets[indexPath.section]
let account = wallet.accounts[indexPath.row]
accountViewCell.account = account
accountViewCell.checkmarkImageView.isHidden = wallet.name != self.selectedWallet?.name || account.name != self.selectedAccount?.name
return accountViewCell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let selectedWallet = self.wallets[indexPath.section]
let selectedAccount = selectedWallet.accounts[indexPath.row]
// invoke callback asynchronously to avoid delaying modal view dismissal.
DispatchQueue.main.async {
self.callback(selectedWallet.id, selectedAccount)
}
self.dismissView()
}
}