* step one * progress * minor theme enhancements * update screenshot and icon links in README.md * update site link * swiftformat fixes
73 lines
1.8 KiB
Swift
73 lines
1.8 KiB
Swift
import Foundation
|
|
import Observation
|
|
|
|
@Observable
|
|
@MainActor
|
|
final class TransactionListViewModel {
|
|
var transactions: [TransactionItem] = []
|
|
var isLoading = false
|
|
var balance: UInt64 = 0
|
|
var walletName: String = ""
|
|
var network: BitcoinNetwork = .testnet4
|
|
var multisigDescription: String = ""
|
|
private var expectedProfileId: UUID?
|
|
|
|
private var bitcoinService: BitcoinService {
|
|
BitcoinService.shared
|
|
}
|
|
|
|
var syncState: WalletSyncState {
|
|
bitcoinService.syncState
|
|
}
|
|
|
|
func clearState() {
|
|
transactions = []
|
|
balance = 0
|
|
isLoading = true
|
|
}
|
|
|
|
func loadActiveWallet(from wallets: [WalletProfile]) {
|
|
guard let active = wallets.first(where: { $0.isActive }) else { return }
|
|
expectedProfileId = active.id
|
|
walletName = active.name
|
|
network = active.bitcoinNetwork
|
|
multisigDescription = active.multisigDescription
|
|
|
|
let alreadyLoaded = bitcoinService.currentProfile?.id == active.id && bitcoinService.wallet != nil
|
|
if alreadyLoaded {
|
|
updateFromService()
|
|
} else if !bitcoinService.syncState.isSyncing {
|
|
// Cold start: BitcoinService has no wallet loaded yet
|
|
isLoading = true
|
|
Task {
|
|
do {
|
|
try await bitcoinService.loadWallet(profile: active)
|
|
updateFromService()
|
|
try await bitcoinService.sync()
|
|
updateFromService()
|
|
} catch {
|
|
// syncState is managed by BitcoinService
|
|
}
|
|
isLoading = false
|
|
}
|
|
}
|
|
}
|
|
|
|
func updateFromService() {
|
|
guard bitcoinService.currentProfile?.id == expectedProfileId else { return }
|
|
balance = bitcoinService.balance
|
|
transactions = bitcoinService.transactions
|
|
}
|
|
|
|
func refresh() async {
|
|
isLoading = true
|
|
do {
|
|
try await bitcoinService.sync()
|
|
updateFromService()
|
|
} catch {
|
|
// syncState is managed by BitcoinService
|
|
}
|
|
isLoading = false
|
|
}
|
|
}
|