[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-taler-ios] 16/32: Source of Truth for balances
From: |
gnunet |
Subject: |
[taler-taler-ios] 16/32: Source of Truth for balances |
Date: |
Mon, 16 Oct 2023 00:03:14 +0200 |
This is an automated email from the git hooks/post-receive script.
marc-stibane pushed a commit to branch master
in repository taler-ios.
commit b1db8f7fce77b9175448168e24e4314a7a609752
Author: Marc Stibane <marc@taler.net>
AuthorDate: Fri Oct 13 16:53:07 2023 +0200
Source of Truth for balances
---
TalerWallet1/Views/Balances/BalancesListView.swift | 91 ++++++++--------------
TalerWallet1/Views/Main/MainView.swift | 15 +++-
2 files changed, 44 insertions(+), 62 deletions(-)
diff --git a/TalerWallet1/Views/Balances/BalancesListView.swift
b/TalerWallet1/Views/Balances/BalancesListView.swift
index 1f6fe3a..7efd0d3 100644
--- a/TalerWallet1/Views/Balances/BalancesListView.swift
+++ b/TalerWallet1/Views/Balances/BalancesListView.swift
@@ -12,13 +12,15 @@ struct BalancesListView: View {
private let symLog = SymLogV()
let stack: CallStack
let navTitle: String
+ @Binding var balances: [Balance]
+ @Binding var shouldReloadBalances: Int
+ @State private var lastReloadedBalances = 0
#if TABBAR // Taler Wallet
#else // GNU Taler
let hamburgerAction: () -> Void
#endif
@EnvironmentObject private var model: WalletModel
- @State private var balances: [Balance] = []
@State private var centsToTransfer: UInt64 = 0
@State private var summary: String = ""
@State private var showQRScanner: Bool = false
@@ -75,7 +77,10 @@ struct BalancesListView: View {
/// runs on MainActor if called in some Task {}
@discardableResult
- private func reloadAction(_ stack: CallStack) async -> Int {
+ private func reloadAction(_ stack: CallStack, _ invalidateCache: Bool)
async -> Int {
+ if invalidateCache {
+ model.cachedBalances = nil
+ }
let reloaded = await model.balancesM(stack.push())
let count = reloaded.count
balances = reloaded // redraw
@@ -98,34 +103,20 @@ struct BalancesListView: View {
.navigationTitle(navTitle)
.navigationBarItems(leading: hamburger,
trailing: QRButton(action:
checkCameraAvailable))
- .overlay {
- if balances.isEmpty {
- WalletEmptyView(stack: stack.push())
- .refreshable { // already async
- symLog.log("empty refreshing")
- let count = await reloadAction(stack.push("empty
refreshing"))
- if count > 0 {
-// postNotificationM(.BalanceReloaded)
- NotificationCenter.default.post(name:
.BalanceReloaded, object: nil)
- }
- }
- }
- }
.alert("Scanning QR-codes requires access to the camera",
isPresented: $showCameraAlert,
actions: { openSettingsButton
dismissAlertButton },
message: { Text("Please allow camera access in
settings.") })
- .onAppear() {
- DebugViewC.shared.setViewID(VIEW_BALANCES, stack:
stack.push("onAppear"))
- }
.sheet(isPresented: $showQRScanner) {
let sheet = AnyView(QRSheet(stack: stack.push()))
Sheet(sheetView: sheet)
} // sheet
- .task {
- symLog.log(".task getBalances")
- await reloadAction(stack.push(".task"))
+ .task(id: shouldReloadBalances) {
+ symLog.log(".task shouldReloadBalances
\(shouldReloadBalances)")
+ let invalidateCache = (lastReloadedBalances !=
shouldReloadBalances)
+ lastReloadedBalances = shouldReloadBalances
+ await reloadAction(stack.push(".task"), invalidateCache)
} // task
}
}
@@ -138,11 +129,7 @@ extension BalancesListView {
@Binding var balances: [Balance]
@Binding var centsToTransfer: UInt64
@Binding var summary: String
-// @discardableResult
- var reloadAction: (_ stack: CallStack) async -> Int
-
- @State private var isActive = true
- @State private var shouldReload = false
+ var reloadAction: (_ stack: CallStack, _ invalidateCache: Bool) async
-> Int
var body: some View {
#if DEBUG
@@ -151,43 +138,27 @@ extension BalancesListView {
#endif
Group { // necessary for .backslide transition (bug in SwiftUI)
let count = balances.count
- List(balances, id: \.self) { balance in
- BalancesSectionView(stack: stack.push(),
- balance: balance,
- sectionCount: count,
- centsToTransfer: $centsToTransfer,
- summary: $summary)
- }
- .refreshable { // already async
- symLog?.log("refreshing")
- let count = await reloadAction(stack.push("refreshing"))
- if count > 0 {
-// postNotificationM(.BalanceReloaded)
- NotificationCenter.default.post(name:
.BalanceReloaded, object: nil)
+ if balances.isEmpty {
+ WalletEmptyView(stack: stack.push("isEmpty"))
+ } else {
+ List(balances, id: \.self) { balance in
+ BalancesSectionView(stack:
stack.push("\(balance.available.currencyStr)"),
+ balance: balance,
+ sectionCount: count,
+ centsToTransfer: $centsToTransfer,
+ summary: $summary)
}
+ .onAppear() {
+ DebugViewC.shared.setViewID(VIEW_BALANCES, stack:
stack.push("onAppear"))
+ }
+ .listStyle(myListStyle.style).anyView
}
- .listStyle(myListStyle.style).anyView
- }
- .onAppear() {
- isActive = true
- if shouldReload {
- shouldReload = false
- symLog?.log(".onAppear ==> shouldReload was true,
reloading now")
- Task { await reloadAction(stack.push("shouldReload")) } //
runs on MainActor
- }
- }
- .onDisappear() {
- isActive = false
}
- .onNotification(.BalanceChange) { notification in
- // reload balances on receiving BalanceChange notification ...
- // doesn't need to be received on main thread because we just
reload in a background task anyway
- if isActive {
- symLog?.log(".onNotification(.BalanceChange) ==> reload")
- Task { await reloadAction(stack.push(".BalanceChange")) }
- } else {
- symLog?.log(".onNotification(.BalanceChange) ==> reload
postponed, shouldReload = true")
- shouldReload = true
+ .refreshable { // already async
+ symLog?.log("refreshing balances")
+ let count = await reloadAction(stack.push("refreshing
balances"), true)
+ if count > 0 {
+ NotificationCenter.default.post(name: .BalanceReloaded,
object: nil)
}
}
} // body
diff --git a/TalerWallet1/Views/Main/MainView.swift
b/TalerWallet1/Views/Main/MainView.swift
index 9fcc912..32d7ef0 100644
--- a/TalerWallet1/Views/Main/MainView.swift
+++ b/TalerWallet1/Views/Main/MainView.swift
@@ -75,6 +75,8 @@ extension MainView {
struct Content: View {
let symLog: SymLogV?
let stack: CallStack
+ @State private var shouldReloadBalances = 0
+ @State private var balances: [Balance] = []
@Binding var talerFont: Int
@AppStorage("iconOnly") var iconOnly: Bool = false
let balancesTitle = String(localized: "Balances")
@@ -112,6 +114,8 @@ extension MainView {
sysImage: "creditcard.fill", // TODO: Wallet Icon
view: AnyView(BalancesListView(stack:
stack.push(balancesTitle),
navTitle: balancesTitle,
+ balances: $balances,
+ shouldReloadBalances:
$shouldReloadBalances,
hamburgerAction: hamburgerAction)
)),
SidebarItem(name: exchangesTitle,
@@ -141,7 +145,9 @@ extension MainView {
TabView(selection: tabSelection()) {
NavigationView {
BalancesListView(stack: stack.push(balancesTitle),
- navTitle: balancesTitle)
+ navTitle: balancesTitle,
+ balances: $balances,
+ shouldReloadBalances: $shouldReloadBalances)
}
.tabItem {
Image(systemName: "creditcard") // system will
automatically use filled variant
@@ -199,6 +205,11 @@ extension MainView {
}
#endif
}
- }
+ .onNotification(.BalanceChange) { notification in
+ // reload balances on receiving BalanceChange notification ...
+ symLog?.log(".onNotification(.BalanceChange) ==> reload")
+ shouldReloadBalances += 1
+ }
+ } // body
} // Content
}
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [taler-taler-ios] 14/32: fix bars, (continued)
- [taler-taler-ios] 14/32: fix bars, gnunet, 2023/10/15
- [taler-taler-ios] 03/32: Debugging, gnunet, 2023/10/15
- [taler-taler-ios] 17/32: getCurrencySpecification, gnunet, 2023/10/15
- [taler-taler-ios] 02/32: Layout for QR-View and ThreeAmounts, gnunet, 2023/10/15
- [taler-taler-ios] 08/32: cleanup, gnunet, 2023/10/15
- [taler-taler-ios] 13/32: width of rendered string, gnunet, 2023/10/15
- [taler-taler-ios] 10/32: secret token, gnunet, 2023/10/15
- [taler-taler-ios] 15/32: TwoRowButtons, gnunet, 2023/10/15
- [taler-taler-ios] 05/32: No spellout, gnunet, 2023/10/15
- [taler-taler-ios] 09/32: TabBar for Taler Wallet - GNU Taler stays on SideView, gnunet, 2023/10/15
- [taler-taler-ios] 16/32: Source of Truth for balances,
gnunet <=
- [taler-taler-ios] 30/32: font, gnunet, 2023/10/15
- [taler-taler-ios] 27/32: SingleAxisGeometryReader, gnunet, 2023/10/15
- [taler-taler-ios] 06/32: More CallStack for Debugging, gnunet, 2023/10/15
- [taler-taler-ios] 07/32: AsyncSemaphore, gnunet, 2023/10/15
- [taler-taler-ios] 23/32: fix for broken scalable font (not finished), gnunet, 2023/10/15
- [taler-taler-ios] 11/32: bankAccessApiBaseUrl -> corebankApiBaseUrl, gnunet, 2023/10/15
- [taler-taler-ios] 12/32: AsyncSemaphore to serialize Getbalances, gnunet, 2023/10/15
- [taler-taler-ios] 31/32: comment, gnunet, 2023/10/15
- [taler-taler-ios] 25/32: Bargraph after Currency, gnunet, 2023/10/15
- [taler-taler-ios] 32/32: Bump version to 0.9.3 (20), gnunet, 2023/10/15