taler-ios

iOS apps for GNU Taler (wallet)
Log | Files | Refs | README | LICENSE

commit 92530f46db833463515de091eb804f7172c891da
parent fa4833e4b4735cbf7bd9661cbb66066de32f3c25
Author: Marc Stibane <marc@taler.net>
Date:   Thu, 19 Dec 2024 08:07:46 +0100

fix #9400

Diffstat:
MTalerWallet1/Views/Actions/Banking/ManualWithdraw.swift | 67+++++++++++++++++++++++++++++++++++++++++++------------------------
MTalerWallet1/Views/Main/MainView.swift | 4+++-
MTalerWallet1/Views/Sheets/WithdrawExchangeV.swift | 3+++
3 files changed, 49 insertions(+), 25 deletions(-)

diff --git a/TalerWallet1/Views/Actions/Banking/ManualWithdraw.swift b/TalerWallet1/Views/Actions/Banking/ManualWithdraw.swift @@ -16,6 +16,8 @@ struct ManualWithdraw: View { let stack: CallStack @Binding var selectedBalance: Balance? @Binding var amountLastUsed: Amount + @Binding var amountToTransfer: Amount + @Binding var exchange: Exchange? // only for withdraw-exchange let isSheet: Bool @EnvironmentObject private var controller: Controller @@ -23,10 +25,13 @@ struct ManualWithdraw: View { @State private var balanceIndex = 0 @State private var balance: Balance? = nil // nil only when balances == [] @State private var currencyInfo: CurrencyInfo = CurrencyInfo.zero(UNKNOWN) - @State private var amountToTransfer = Amount.zero(currency: EMPTYSTRING) // Update currency when used +// @State private var amountToTransfer = Amount.zero(currency: EMPTYSTRING) // Update currency when used private func viewDidLoad() async { - if let selectedBalance { + if let exchange { + currencyInfo = controller.info(for: exchange.scopeInfo, controller.currencyTicker) + return + } else if let selectedBalance { balance = selectedBalance balanceIndex = controller.balances.firstIndex(of: selectedBalance) ?? 0 } else { @@ -56,20 +61,29 @@ struct ManualWithdraw: View { let count = controller.balances.count let _ = symLog.log("count = \(count)") let scrollView = ScrollView { - if count > 0 { - ScopePicker(value: $balanceIndex, onlyNonZero: false) - { index in - balanceIndex = index - balance = controller.balances[index] - } - .padding(.horizontal) - .padding(.bottom, 4) - } - if let balance { + if let exchange { ManualWithdrawContent(stack: stack.push(), - scope: balance.scopeInfo, + scope: exchange.scopeInfo, amountLastUsed: $amountLastUsed, - amountToTransfer: $amountToTransfer) + amountToTransfer: $amountToTransfer, + exchange: $exchange) + } else { + if count > 0 { + ScopePicker(value: $balanceIndex, onlyNonZero: false) + { index in + balanceIndex = index + balance = controller.balances[index] + } + .padding(.horizontal) + .padding(.bottom, 4) + } + if let balance { + ManualWithdrawContent(stack: stack.push(), + scope: balance.scopeInfo, + amountLastUsed: $amountLastUsed, + amountToTransfer: $amountToTransfer, + exchange: $exchange) + } } } // ScrollView .navigationTitle(navTitle) @@ -91,7 +105,11 @@ struct ManualWithdraw: View { .task(id: balanceIndex + (1000 * controller.currencyTicker)) { // runs whenever the user changes the exchange via ScopePicker, or on new currencyInfo symLog.log("❗️ task \(balanceIndex)") - if let balance { + if let exchange { + let scopeInfo = exchange.scopeInfo + amountToTransfer.setCurrency(scopeInfo.currency) + currencyInfo = controller.info(for: scopeInfo, controller.currencyTicker) + } else if let balance { let scopeInfo = balance.scopeInfo amountToTransfer.setCurrency(scopeInfo.currency) currencyInfo = controller.info(for: scopeInfo, controller.currencyTicker) @@ -117,6 +135,7 @@ struct ManualWithdrawContent: View { let scope: ScopeInfo @Binding var amountLastUsed: Amount @Binding var amountToTransfer: Amount + @Binding var exchange: Exchange? @EnvironmentObject private var controller: Controller @EnvironmentObject private var model: WalletModel @@ -126,10 +145,6 @@ struct ManualWithdrawContent: View { // @State var ageMenuList: [Int] = [] // @State var selectedAge = 0 - @State private var exchanges: [Exchange] = [] - @State private var exchange: Exchange? = nil - - private func exchangeVia(_ baseURL: String?) -> String? { if let baseURL { return String(localized: "via \(baseURL.trimURL)", comment: "currency/exchange chooser") @@ -162,16 +177,19 @@ struct ManualWithdrawContent: View { } // computeFee @MainActor + private func reloadExchange(_ baseURL: String) async { + if exchange == nil || exchange?.tosStatus != .accepted { + symLog.log("getExchangeByUrl(\(baseURL))") + exchange = try? await model.getExchangeByUrl(url: baseURL) + } + } + @MainActor private func viewDidLoad2() async { // neues scope wenn balance geändert wird? let details = try? await model.getWithdrawalDetailsForAmount(amountToTransfer, baseUrl: nil, scope: scope, viewHandles: true) if let details { detailsForAmount = details - if exchange == nil || exchange?.tosStatus != .accepted { - symLog.log("getExchangeByUrl(\(details.exchangeBaseUrl))") - exchange = try? await model.getExchangeByUrl(url: details.exchangeBaseUrl) - } } } @@ -243,7 +261,8 @@ struct ManualWithdrawContent: View { .padding(.top) } } // Group - .padding(.horizontal) + .padding(.horizontal) + .task { await reloadExchange(detailsForAmount.exchangeBaseUrl) } } else { LoadingView(scopeInfo: scope, message: nil) .task { await viewDidLoad2() } diff --git a/TalerWallet1/Views/Main/MainView.swift b/TalerWallet1/Views/Main/MainView.swift @@ -247,7 +247,7 @@ extension MainView { @State private var amountToTransfer = Amount.zero(currency: EMPTYSTRING) // Update currency when used @State private var amountLastUsed = Amount.zero(currency: EMPTYSTRING) // Update currency when used @State private var summary: String = EMPTYSTRING - @State private var myExchange: Exchange? = nil + @State private var exchange: Exchange? = nil private var openKycButton: some View { Button("KYC") { @@ -328,6 +328,8 @@ extension MainView { let manualWithdrawDest = ManualWithdraw(stack: stack.push(Self.name), selectedBalance: $selectedBalance, amountLastUsed: $amountLastUsed, // currency needs to be updated! + amountToTransfer: $amountToTransfer, + exchange: $exchange, // only for withdraw-exchange isSheet: false) /// each NavigationView needs its own NavLinks let balanceActions = Group { diff --git a/TalerWallet1/Views/Sheets/WithdrawExchangeV.swift b/TalerWallet1/Views/Sheets/WithdrawExchangeV.swift @@ -42,6 +42,7 @@ struct WithdrawExchangeV: View { amountToTransfer.setCurrency(currency) // is already Amount.zero() } + amountLastUsed.setCurrency(amountToTransfer.currencyStr) exchange = exc } else { exchange = nil @@ -61,6 +62,8 @@ struct WithdrawExchangeV: View { ManualWithdraw(stack: stack.push(), selectedBalance: $selectedBalance, amountLastUsed: $amountLastUsed, + amountToTransfer: $amountToTransfer, + exchange: $exchange, // only for withdraw-exchange isSheet: true) } .task(id: controller.currencyTicker) {