taler-ios

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

commit 0fa2a78a863e04b79c2fd24423ea5b6669884b6d
parent 8f593bdffa8585741184b2626d883f66c369af94
Author: Marc Stibane <marc@taler.net>
Date:   Fri,  8 Nov 2024 18:55:48 +0100

deposit

Diffstat:
MTalerWallet1/Model/Model+Deposit.swift | 24+++++++++---------------
MTalerWallet1/Views/Actions/Banking/DepositAmountV.swift | 63+++++++++++++++++++++++++++++++++++----------------------------
MTalerWallet1/Views/Actions/Banking/DepositIbanV.swift | 19+++++++++++--------
3 files changed, 55 insertions(+), 51 deletions(-)

diff --git a/TalerWallet1/Model/Model+Deposit.swift b/TalerWallet1/Model/Model+Deposit.swift @@ -28,9 +28,8 @@ fileprivate struct ValidateIban: WalletBackendFormattedRequest { } extension WalletModel { /// validate IBAN. No Networking - @MainActor // M for MainActor - func validateIbanM(_ iban: String, viewHandles: Bool = false) - async throws -> Bool { + nonisolated func validateIban(_ iban: String, viewHandles: Bool = false) + async throws -> Bool { let request = ValidateIban(iban: iban) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response.valid @@ -56,8 +55,7 @@ fileprivate struct DepositWireTypesForCurrency: WalletBackendFormattedRequest { } extension WalletModel { /// Get wire types that can be used for a deposit operation - @MainActor // M for MainActor - func depositWireTypesForCurrencyM(_ currency: String, scopeInfo: ScopeInfo? = nil, viewHandles: Bool = false) + nonisolated func depositWireTypesForCurrency(_ currency: String, scopeInfo: ScopeInfo? = nil, viewHandles: Bool = false) async throws -> [String] { let request = DepositWireTypesForCurrency(currency: currency, scopeInfo: scopeInfo) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) @@ -73,9 +71,8 @@ fileprivate struct AmountResponse: Codable { fileprivate struct GetMaxDepositAmount: WalletBackendFormattedRequest { typealias Response = AmountResponse func operation() -> String { "getMaxDepositAmount" } - func args() -> Args { Args(currency: currency, restrictScope: scope) } + func args() -> Args { Args(currency: scope.currency, restrictScope: scope) } - var currency: String var scope: ScopeInfo struct Args: Encodable { var currency: String @@ -84,14 +81,13 @@ fileprivate struct GetMaxDepositAmount: WalletBackendFormattedRequest { } } extension WalletModel { - @MainActor // M for MainActor - func getMaxDepositAmountM(_ currency: String, scope: ScopeInfo, viewHandles: Bool = false) + nonisolated func getMaxDepositAmount(_ scope: ScopeInfo, viewHandles: Bool = false) async throws -> Amount { - let request = GetMaxDepositAmount(currency: currency, scope: scope) + let request = GetMaxDepositAmount(scope: scope) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response.rawAmount } -} // getMaxDepositAmountM +} // getMaxDepositAmount // MARK: - Deposit struct DepositFees: Codable { let coin: Amount @@ -139,8 +135,7 @@ fileprivate struct CreateDepositGroup: WalletBackendFormattedRequest { // MARK: - extension WalletModel { /// check fees for deposit. No Networking - @MainActor // M for MainActor - func checkDepositM(_ depositPaytoUri: String, amount: Amount, viewHandles: Bool = false) + nonisolated func checkDeposit(_ depositPaytoUri: String, amount: Amount, viewHandles: Bool = false) async throws -> CheckDepositResponse { let request = CheckDeposit(depositPaytoUri: depositPaytoUri, amount: amount) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) @@ -148,8 +143,7 @@ extension WalletModel { } /// deposit coins. Networking involved - @MainActor // M for MainActor - func createDepositGroupM(_ depositPaytoUri: String, amount: Amount, viewHandles: Bool = false) + nonisolated func createDepositGroup(_ depositPaytoUri: String, amount: Amount, viewHandles: Bool = false) async throws -> DepositGroupResult { let request = CreateDepositGroup(depositPaytoUri: depositPaytoUri, amount: amount) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) diff --git a/TalerWallet1/Views/Actions/Banking/DepositAmountV.swift b/TalerWallet1/Views/Actions/Banking/DepositAmountV.swift @@ -25,6 +25,7 @@ struct DepositAmountV: View { @State private var amountToTransfer = Amount.zero(currency: EMPTYSTRING) // Update currency when used @State private var amountAvailable = Amount.zero(currency: EMPTYSTRING) // GetMaxPeerPushAmount + @MainActor private func viewDidLoad() async { let balances = controller.balances if let selectedBalance { @@ -45,6 +46,21 @@ struct DepositAmountV: View { } } + @MainActor + private func newBalance() async { + symLog.log("❗️ task \(balanceIndex)") + if let balance { + let scopeInfo = balance.scopeInfo + amountToTransfer.setCurrency(scopeInfo.currency) + do { + amountAvailable = try await model.getMaxDepositAmount(scopeInfo) + } catch { + // TODO: Error + amountAvailable = balance.available + } + } + } + var body: some View { #if PRINT_CHANGES let _ = Self._printChanges() @@ -84,19 +100,7 @@ struct DepositAmountV: View { symLog.log("❗️ \(navTitle) onDisappear") } .task { await viewDidLoad() } - .task(id: balanceIndex + (1000 * controller.currencyTicker)) { - symLog.log("❗️ task \(balanceIndex)") - if let balance { - let scopeInfo = balance.scopeInfo - amountToTransfer.setCurrency(scopeInfo.currency) - do { - amountAvailable = try await model.getMaxPeerPushDebitAmountM(scopeInfo) - } catch { - // TODO: Error - amountAvailable = balance.available - } - } - } + .task(id: balanceIndex + (1000 * controller.currencyTicker)) { await newBalance() } if #available(iOS 16.0, *) { if #available(iOS 16.4, *) { @@ -185,6 +189,23 @@ struct DepositAmountContent: View { // defaultValue: "Deposit \(amountStr)", comment: "NavTitle: Deposit 'amountStr'") } + @MainActor + private func startDeposit() { + if let paytoUri { + depositStarted = true // don't run twice + Task { + symLog.log("Deposit") + if let result = try? await model.createDepositGroup(paytoUri, amount: amountToTransfer) { + symLog.log(result.transactionId) + ViewState2.shared.popToRootView(stack.push()) + NotificationCenter.default.post(name: .TransactionDone, object: nil, userInfo: nil) + } else { + depositStarted = false + } + } + } + } + var body: some View { #if PRINT_CHANGES let _ = Self._printChanges() @@ -224,21 +245,7 @@ struct DepositAmountContent: View { : (feeAmount?.isZero ?? true) ? WalletColors().secondary(colorScheme, colorSchemeContrast) : .red) .padding(4) - Button(buttonTitle(amountToTransfer)) { - if let paytoUri { - depositStarted = true // don't run twice - Task { // runs on MainActor - symLog.log("Deposit") - if let result = try? await model.createDepositGroupM(paytoUri, amount: amountToTransfer) { - symLog.log(result.transactionId) - ViewState2.shared.popToRootView(stack.push()) - NotificationCenter.default.post(name: .TransactionDone, object: nil, userInfo: nil) - } else { - depositStarted = false - } - } - } - } + Button(buttonTitle(amountToTransfer)) { startDeposit() } .buttonStyle(TalerButtonStyle(type: .prominent, disabled: disabled || depositStarted)) .disabled(disabled || depositStarted) .accessibilityHint(disabled ? String(localized: "enabled when amount is non-zero, but not higher than your available amount") : EMPTYSTRING) diff --git a/TalerWallet1/Views/Actions/Banking/DepositIbanV.swift b/TalerWallet1/Views/Actions/Banking/DepositIbanV.swift @@ -50,6 +50,16 @@ struct DepositIbanV: View { comment: "NavTitle: Deposit") } + @MainActor + private func validateIban() async { + if (try? await model.validateIban(depositIBAN)) == true { + let payto = "payto://iban/\(depositIBAN)?receiver-name=\(accountHolder)" + paytoUri = payto.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! + } else { + paytoUri = nil + } + } + var body: some View { #if PRINT_CHANGES let _ = Self._printChanges() @@ -116,14 +126,7 @@ struct DepositIbanV: View { .onDisappear { // print("❗️ P2PSubjectV onDisappear") } - .task(id: depositIBAN) { - if (try? await model.validateIbanM(depositIBAN)) == true { - let payto = "payto://iban/\(depositIBAN)?receiver-name=\(accountHolder)" - paytoUri = payto.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! - } else { - paytoUri = nil - } - } + .task(id: depositIBAN) { await validateIban() } } } // MARK: -