taler-ios

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

commit 7db2a0846a8a7797c450f4df38d4d9099c01e9cd
parent 2d5a14f1277d3dea78a838b2f2c7eb64a82426a8
Author: Marc Stibane <marc@taler.net>
Date:   Wed, 26 Jun 2024 15:13:43 +0200

new withdrawal procedure (amountIsEditable)

Diffstat:
MTalerWallet1/Model/Model+Withdraw.swift | 9++++++---
MTalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptDone.swift | 9++++++---
MTalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptView.swift | 5+++--
MTalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawURIView.swift | 59++++++++++++++++++++++++++++++++++++++++++++++++-----------
4 files changed, 63 insertions(+), 19 deletions(-)

diff --git a/TalerWallet1/Model/Model+Withdraw.swift b/TalerWallet1/Model/Model+Withdraw.swift @@ -171,15 +171,17 @@ struct AcceptWithdrawalResponse: Decodable { fileprivate struct AcceptBankIntegratedWithdrawal: WalletBackendFormattedRequest { typealias Response = AcceptWithdrawalResponse func operation() -> String { "acceptBankIntegratedWithdrawal" } - func args() -> Args { Args(talerWithdrawUri: talerWithdrawUri, exchangeBaseUrl: exchangeBaseUrl, restrictAge: restrictAge) } + func args() -> Args { Args(talerWithdrawUri: talerWithdrawUri, exchangeBaseUrl: exchangeBaseUrl, amount: amount, restrictAge: restrictAge) } var talerWithdrawUri: String var exchangeBaseUrl: String + var amount: Amount? var restrictAge: Int? struct Args: Encodable { var talerWithdrawUri: String var exchangeBaseUrl: String + var amount: Amount? var restrictAge: Int? } } @@ -251,9 +253,10 @@ extension WalletModel { return response } @MainActor // M for MainActor - func sendAcceptIntWithdrawalM(_ exchangeBaseUrl: String, withdrawURL: String, restrictAge: Int?, viewHandles: Bool = false) + func sendAcceptIntWithdrawalM(_ exchangeBaseUrl: String, withdrawURL: String, amount: Amount?, restrictAge: Int?, viewHandles: Bool = false) async throws -> AcceptWithdrawalResponse? { - let request = AcceptBankIntegratedWithdrawal(talerWithdrawUri: withdrawURL, exchangeBaseUrl: exchangeBaseUrl, restrictAge: restrictAge) + let request = AcceptBankIntegratedWithdrawal(talerWithdrawUri: withdrawURL, exchangeBaseUrl: exchangeBaseUrl, + amount: amount, restrictAge: restrictAge) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response } diff --git a/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptDone.swift b/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptDone.swift @@ -9,10 +9,11 @@ import SymLog struct WithdrawAcceptDone: View { private let symLog = SymLogV(0) let stack: CallStack - let navTitle = String(localized: "Confirm with Bank") + let navTitle = String(localized: "Confirm with Bank", comment: "Nav title") let exchangeBaseUrl: String? let url: URL + let amountToTransfer: Amount? @EnvironmentObject private var controller: Controller @EnvironmentObject private var model: WalletModel @@ -57,7 +58,8 @@ struct WithdrawAcceptDone: View { }.task { if let exchangeBaseUrl { // TODO: restrictAge - if let result = try? await model.sendAcceptIntWithdrawalM(exchangeBaseUrl, withdrawURL: url.absoluteString, restrictAge: nil) { + if let result = try? await model.sendAcceptIntWithdrawalM(exchangeBaseUrl, withdrawURL: url.absoluteString, + amount: amountToTransfer, restrictAge: nil) { let confirmTransferUrl = result.confirmTransferUrl symLog.log(confirmTransferUrl) transactionId = result.transactionId @@ -71,6 +73,7 @@ struct WithdrawAcceptDone_Previews: PreviewProvider { static var previews: some View { WithdrawAcceptDone(stack: CallStack("Preview"), exchangeBaseUrl: DEMOEXCHANGE, - url: URL(string: DEMOSHOP)!) + url: URL(string: DEMOSHOP)!, + amountToTransfer: nil) } } diff --git a/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptView.swift b/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptView.swift @@ -79,8 +79,9 @@ struct WithdrawAcceptView: View { if tosAccepted { NavigationLink(destination: LazyView { WithdrawAcceptDone(stack: stack.push(), - exchangeBaseUrl: exchange.exchangeBaseUrl, - url: url) + exchangeBaseUrl: exchange.exchangeBaseUrl, + url: url, + amountToTransfer: amountToTransfer) }) { Text("Confirm Withdrawal") // SHEET_WITHDRAW_ACCEPT } diff --git a/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawURIView.swift b/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawURIView.swift @@ -22,6 +22,7 @@ struct WithdrawURIView: View { @EnvironmentObject private var controller: Controller @EnvironmentObject private var model: WalletModel + @AppStorage("minimalistic") var minimalistic: Bool = false @AppStorage("myListStyle") var myListStyle: MyListStyle = .automatic @State private var withdrawUriInfo: WithdrawUriInfoResponse? = nil @@ -29,8 +30,11 @@ struct WithdrawURIView: View { @State private var amountIsEditable = false @State private var amountToTransfer = Amount.zero(currency: EMPTYSTRING) // Update currency when used @State private var amountShortcut = Amount.zero(currency: EMPTYSTRING) // Update currency when used + @State private var buttonSelected = false @State private var shortcutSelected = false + @State private var amountAvailable: Amount? = nil @State private var wireFee: Amount? = nil + @State private var summary = EMPTYSTRING @State private var selectedExchange = EMPTYSTRING @State private var exchange: Exchange? = nil @@ -43,10 +47,18 @@ struct WithdrawURIView: View { } } + private func shortcutAction(_ shortcut: Amount) { + amountShortcut = shortcut + shortcutSelected = true + } + private func buttonAction() { + buttonSelected = true + } + var body: some View { if possibleExchanges.count > 0 { if let defaultBaseUrl = defaultExchangeBaseUrl ?? possibleExchanges.first?.exchangeBaseUrl { - VStack { + ScrollView { VStack { let title = String(localized: "Exchange") if possibleExchanges.count > 1 { Picker(title, selection: $selectedExchange) { @@ -71,18 +83,40 @@ struct WithdrawURIView: View { await loadExchange(defaultBaseUrl) } } - if amountToTransfer.isZero { - // TODO: input amount, then - WithdrawAcceptView(stack: stack.push(), url: url, - amountToTransfer: $amountToTransfer, - exchange: $exchange) + let acceptDestination = WithdrawAcceptView(stack: stack.push(), url: url, + amountToTransfer: $amountToTransfer, + exchange: $exchange) + if amountIsEditable { // amountToTransfer.isZero { + let shortcutDestination = LazyView { + WithdrawAcceptView(stack: stack.push(), url: url, + amountToTransfer: $amountShortcut, + exchange: $exchange) + } + // TODO: input amount, then + let amountLabel = minimalistic ? String(localized: "Amount:") + : String(localized: "Amount to withdraw:") + + AmountInputV(stack: stack.push(), url: nil, + amountAvailable: amountAvailable, + amountToTransfer: $amountToTransfer, wireFee: wireFee, + amountLabel: amountLabel, + summaryIsEditable: false, + summary: $summary, +// insufficient: $insufficient, +// feeAmount: $feeAmount, + shortcutAction: shortcutAction, + buttonAction: buttonAction) + .background(NavigationLink(destination: shortcutDestination, isActive: $shortcutSelected) + { EmptyView() }.frame(width: 0).opacity(0).hidden() + ) + .background(NavigationLink(destination: acceptDestination, isActive: $buttonSelected) + { EmptyView() }.frame(width: 0).opacity(0).hidden() + ) } else { - WithdrawAcceptView(stack: stack.push(), url: url, - amountToTransfer: $amountToTransfer, - exchange: $exchange) + acceptDestination } - } + } } // ScrollVStack .navigationTitle(navTitle) .onAppear() { symLog.log("onAppear") @@ -104,9 +138,12 @@ struct WithdrawURIView: View { .task { symLog.log(".task") if let someInfo = try? await model.getWithdrawalDetailsForUriM(url.absoluteString) { + let currency = someInfo.currency defaultExchangeBaseUrl = someInfo.defaultExchangeBaseUrl possibleExchanges = someInfo.possibleExchanges - amountToTransfer = someInfo.amount ?? Amount.zero(currency: someInfo.currency) + amountToTransfer = someInfo.amount ?? Amount.zero(currency: currency) + amountAvailable = someInfo.maxAmount + amountIsEditable = someInfo.editableAmount wireFee = someInfo.wireFee }