167 lines
6.5 KiB
Swift
167 lines
6.5 KiB
Swift
//
|
|
// HomeVC.swift
|
|
// wallet
|
|
//
|
|
// Created by Adriana Epure on 19.08.2022.
|
|
// Copyright © 2022 Jason. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
class HomeVC: CustomViewController<HomeViewModel> {
|
|
private let password = "sshhhhhh"
|
|
|
|
/// LND Status
|
|
@IBOutlet weak var debugStatus: UILabel!
|
|
@IBOutlet weak var lndStatus: UIImageView!
|
|
@IBOutlet weak var syncToChainStatus: UIImageView!
|
|
@IBOutlet weak var walletStatus: UIImageView!
|
|
|
|
|
|
/// INFO
|
|
|
|
@IBOutlet weak var infoStack: UIStackView!
|
|
@IBOutlet weak var peersCount: UILabel!
|
|
@IBOutlet weak var blockHeightCount: UILabel!
|
|
@IBOutlet weak var activeChannelsCount: UILabel!
|
|
@IBOutlet weak var inactiveChannelsCount: UILabel!
|
|
@IBOutlet weak var pendingChannelsCount: UILabel!
|
|
|
|
/// Wallet
|
|
@IBOutlet weak var walletStack: UIStackView!
|
|
@IBOutlet weak var walletBalanceStack: UIStackView!
|
|
@IBOutlet weak var createWalletBtn: UIButton!
|
|
@IBOutlet weak var unlockWalletBtn: UIButton!
|
|
@IBOutlet weak var getBalanceBtn: UIButton!
|
|
@IBOutlet weak var walletInfo: UIButton!
|
|
|
|
@IBOutlet weak var totalAmountLbl: UILabel!
|
|
@IBOutlet weak var unconfirmedLbl: UILabel!
|
|
@IBOutlet weak var confirmedAmountLbl: UILabel!
|
|
|
|
|
|
@IBOutlet weak var showChannelsBtn: UIButton!
|
|
@IBOutlet weak var showPaymentsBtn: UIButton!
|
|
//MARK: View LifeCycle
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
title = "Home"
|
|
updateStatus()
|
|
}
|
|
override func viewDidAppear(_ animated: Bool) {
|
|
super.viewDidAppear(animated)
|
|
subscribe()
|
|
}
|
|
|
|
//MARK: ViewModel
|
|
// This will get called when the ViewModel for this ViewController is ready to use
|
|
// This gives us a simple place to observe all changes to the datasources
|
|
// and can update the views accordingly as they change in real time
|
|
override func viewModelDidLoad() {
|
|
|
|
viewModel.isLoading.observe = { [weak self] isLoading in
|
|
if (isLoading) {
|
|
self?.showLoadingView()
|
|
}else{
|
|
self?.showContentView()
|
|
}
|
|
}
|
|
viewModel.walletBalance.observe = { [weak self] balance in
|
|
self?.updateBalance(balance)
|
|
}
|
|
|
|
viewModel.newAddress.observe = { [weak self] address in
|
|
UIPasteboard.general.string = address
|
|
self?.showContentView()
|
|
}
|
|
|
|
viewModel.walletWipe.observe = { _ in
|
|
UIControl().sendAction(#selector(NSXPCConnection.suspend), to: UIApplication.shared, for: nil)
|
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
|
exit(0)
|
|
}
|
|
}
|
|
viewModel.load()
|
|
|
|
}
|
|
//MARK: Button Actions
|
|
|
|
@IBAction func didPressUnlockBtn(_ sender: Any) {
|
|
self.viewModel.unlockWallet(password: self.password)
|
|
}
|
|
@IBAction func didPressPaymentsBtn(_ sender: Any) {
|
|
self.navigationController?.pushViewController(PaymentsVC(), animated: true)
|
|
}
|
|
@IBAction func didPressChannelsBtn(_ sender: Any) {
|
|
self.navigationController?.pushViewController(ChannelsVC(), animated: true)
|
|
}
|
|
|
|
@IBAction func didPressWalletInfo(_ sender: Any) {
|
|
let walletAddress = LightningStateMonitor.shared.state.walletInfo.identityPubkey
|
|
self.showAlert(title: "My Wallet", address: walletAddress)
|
|
}
|
|
|
|
}
|
|
//MARK: Subscribe
|
|
extension HomeVC{
|
|
private func subscribe() {
|
|
EventBus.onMainThread(self, eventType: .lndStateChange) { [weak self] (_) in
|
|
self?.updateStatus()
|
|
}
|
|
EventBus.onMainThread(self, eventType: .lndStopped) { [weak self] (_) in
|
|
self?.updateStatus()
|
|
}
|
|
EventBus.onMainThread(self, eventType: .lndStarted) { [weak self] (_) in
|
|
self?.updateStatus()
|
|
}
|
|
EventBus.onMainThread(self, eventType: .lndRpcReady) { [weak self] (_) in
|
|
self?.updateStatus()
|
|
}
|
|
EventBus.onMainThread(self, eventType: .lndWalletUnlocked) { [weak self] (_) in
|
|
self?.updateStatus()
|
|
}
|
|
}
|
|
private func updateStatus() {
|
|
debugStatus.text = LightningStateMonitor.shared.state.debuggingStatus.joined(separator: "\n\n")
|
|
updateLND(isOn: LightningStateMonitor.shared.state.lndRunning)
|
|
updateRPC(isReady: LightningStateMonitor.shared.state.walletInfo.syncedToChain)
|
|
updateWallet(isUnlocked: LightningStateMonitor.shared.state.walletUnlocked)
|
|
updateInfo()
|
|
}
|
|
private func updateRPC(isReady: Bool){
|
|
self.syncToChainStatus.tintColor = isReady ? .green : .red
|
|
self.syncToChainStatus.image = isReady ? UIImage(systemName: "point.3.filled.connected.trianglepath.dotted") : UIImage(systemName: "point.3.connected.trianglepath.dotted")
|
|
}
|
|
private func updateLND(isOn: Bool){
|
|
self.unlockWalletBtn.isHidden = !isOn
|
|
self.unlockWalletBtn.isEnabled = isOn
|
|
self.lndStatus.tintColor = isOn ? .green : .red
|
|
self.lndStatus.image = isOn ? UIImage(systemName: "checkmark.circle.fill") : UIImage(systemName: "checkmark.circle.trianglebadge.exclamationmark")
|
|
}
|
|
private func updateInfo(){
|
|
self.peersCount.text = String(LightningStateMonitor.shared.state.walletInfo.numPeers)
|
|
self.blockHeightCount.text = String(LightningStateMonitor.shared.state.walletInfo.blockHeight)
|
|
self.activeChannelsCount.text = String(LightningStateMonitor.shared.state.walletInfo.numActiveChannels)
|
|
self.inactiveChannelsCount.text = String(LightningStateMonitor.shared.state.walletInfo.numInactiveChannels)
|
|
self.pendingChannelsCount.text = String(LightningStateMonitor.shared.state.walletInfo.numPendingChannels)
|
|
self.viewModel.getWalletBalance()
|
|
}
|
|
private func updateBalance(_ balance: WalletBalance){
|
|
self.totalAmountLbl.text = String(balance.total)
|
|
self.confirmedAmountLbl.text = String(balance.confirmed)
|
|
self.unconfirmedLbl.text = String(balance.unconfirmed)
|
|
}
|
|
private func updateWallet(isUnlocked: Bool){
|
|
self.unlockWalletBtn.isHidden = isUnlocked
|
|
self.walletStatus.tintColor = isUnlocked ? .green : .red
|
|
self.walletStatus.image = isUnlocked ? UIImage(systemName: "lock.open") : UIImage(systemName: "lock")
|
|
self.infoStack.isHidden = !isUnlocked
|
|
self.walletBalanceStack.isHidden = !isUnlocked
|
|
self.walletInfo.isEnabled = isUnlocked
|
|
// self.getBalanceBtn.isHidden = !isUnlocked
|
|
self.showChannelsBtn.isHidden = !isUnlocked
|
|
self.showPaymentsBtn.isEnabled = isUnlocked
|
|
}
|
|
}
|
|
|