taler-ios

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

commit 2f2f820ed0dded72a110c4f9c315ad554801a2c3
parent eb07572d543644af5c17d59deefe7658ddbf2adb
Author: Marc Stibane <marc@taler.net>
Date:   Wed, 20 Nov 2024 07:26:50 +0100

cleanup

Diffstat:
MTalerWallet1/Backend/WalletBackendRequest.swift | 2+-
MTalerWallet1/Controllers/Controller.swift | 4++--
MTalerWallet1/Model/Model+Deposit.swift | 34+++++++++++++++++-----------------
MTalerWallet1/Model/Model+P2P.swift | 16++++++----------
MTalerWallet1/Model/Model+Withdraw.swift | 59++++++++++++++++++++++++++++++-----------------------------
MTalerWallet1/Model/WalletModel.swift | 4++--
MTalerWallet1/Views/Actions/Banking/DepositAmountV.swift | 9+++++----
MTalerWallet1/Views/Actions/Peer2peer/RequestPayment.swift | 2++
MTalerWallet1/Views/Actions/Peer2peer/SendAmountV.swift | 17++++++-----------
MTalerWallet1/Views/Balances/BalancesPendingRowV.swift | 2+-
MTalerWallet1/Views/Transactions/TransactionRowView.swift | 3---
11 files changed, 72 insertions(+), 80 deletions(-)

diff --git a/TalerWallet1/Backend/WalletBackendRequest.swift b/TalerWallet1/Backend/WalletBackendRequest.swift @@ -32,9 +32,9 @@ struct ScopeInfo: Codable, Hashable { case madeUp // => type unknown, currency name taken from amount } var type: ScopeInfoType + var currency: String // 3-char ISO 4217 code for global currency. Regional MUST be >= 4 letters var noFees: Bool? // only for "global". Regional have this field per Exchange var url: String? // only for "exchange" and "auditor" - var currency: String // 3-char ISO 4217 code for global currency. Regional MUST be >= 4 letters public static func zero() -> ScopeInfo { ScopeInfo(type: .madeUp, currency: UNKNOWN) diff --git a/TalerWallet1/Controllers/Controller.swift b/TalerWallet1/Controllers/Controller.swift @@ -228,8 +228,8 @@ class Controller: ObservableObject { } @MainActor - func getInfo(from exchangeBaseUrl: String, model: WalletModel) async throws -> CurrencyInfo? { - let exchange = try await model.getExchangeByUrl(url: exchangeBaseUrl) + func getInfo(from baseUrl: String, model: WalletModel) async throws -> CurrencyInfo? { + let exchange = try await model.getExchangeByUrl(url: baseUrl) let scope = exchange.scopeInfo if let info = info(for: scope) { return info diff --git a/TalerWallet1/Model/Model+Deposit.swift b/TalerWallet1/Model/Model+Deposit.swift @@ -102,10 +102,10 @@ struct CheckDepositResponse: Codable { /// A request to get an exchange's deposit contract terms. fileprivate struct CheckDeposit: WalletBackendFormattedRequest { typealias Response = CheckDepositResponse - func operation() -> String { "prepareDeposit" } // checkDeposit - func args() -> Args { Args(depositPaytoUri: depositPaytoUri, amount: amount, + func operation() -> String { "checkDeposit" } + func args() -> Args { Args(depositPaytoUri: depositPaytoUri, + amount: amount, clientCancellationId: "cancel") } - var depositPaytoUri: String var amount: Amount struct Args: Encodable { @@ -114,6 +114,15 @@ fileprivate struct CheckDeposit: WalletBackendFormattedRequest { var clientCancellationId: String? } } +extension WalletModel { + /// check fees for deposit. No Networking + nonisolated func checkDeposit4711(_ 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) + return response + } +} // MARK: - struct DepositGroupResult: Decodable { var depositGroupId: String @@ -123,8 +132,8 @@ struct DepositGroupResult: Decodable { fileprivate struct CreateDepositGroup: WalletBackendFormattedRequest { typealias Response = DepositGroupResult func operation() -> String { "createDepositGroup" } - func args() -> Args { Args(depositPaytoUri: depositPaytoUri, amount: amount) } - + func args() -> Args { Args(depositPaytoUri: depositPaytoUri, + amount: amount) } var depositPaytoUri: String var amount: Amount struct Args: Encodable { @@ -132,21 +141,12 @@ fileprivate struct CreateDepositGroup: WalletBackendFormattedRequest { var amount: Amount } } -// MARK: - extension WalletModel { - /// check fees for deposit. No Networking - 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) - return response - } - /// deposit coins. Networking involved 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) - return response + let request = CreateDepositGroup(depositPaytoUri: depositPaytoUri, amount: amount) + let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) + return response } } diff --git a/TalerWallet1/Model/Model+P2P.swift b/TalerWallet1/Model/Model+P2P.swift @@ -87,14 +87,11 @@ struct InitiatePeerPushDebitResponse: Codable { fileprivate struct InitiatePeerPushDebit: WalletBackendFormattedRequest { typealias Response = InitiatePeerPushDebitResponse func operation() -> String { "initiatePeerPushDebit" } - func args() -> Args { Args(//exchangeBaseUrl: baseURL, - restrictScope: scope, - partialContractTerms: terms) } + func args() -> Args { Args(restrictScope: scope, + partialContractTerms: terms) } var scope: ScopeInfo -// var baseURL: String? var terms: PeerContractTerms struct Args: Encodable { -// var exchangeBaseUrl: String? var restrictScope: ScopeInfo var partialContractTerms: PeerContractTerms } @@ -121,10 +118,10 @@ struct CheckPeerPullCreditResponse: Codable { fileprivate struct CheckPeerPullCredit: WalletBackendFormattedRequest { typealias Response = CheckPeerPullCreditResponse func operation() -> String { "checkPeerPullCredit" } - func args() -> Args { Args(amount: amount, restrictScope: scope, - exchangeBaseUrl: scope?.url, - clientCancellationId: "cancel") } - + func args() -> Args { Args(amount: amount, + restrictScope: scope, + exchangeBaseUrl: scope?.url, + clientCancellationId: "cancel") } var amount: Amount var scope: ScopeInfo? struct Args: Encodable { @@ -155,7 +152,6 @@ fileprivate struct InitiatePeerPullCredit: WalletBackendFormattedRequest { func operation() -> String { "initiatePeerPullCredit" } func args() -> Args { Args(exchangeBaseUrl: exchangeBaseUrl, partialContractTerms: partialContractTerms) } - var exchangeBaseUrl: String? var partialContractTerms: PeerContractTerms struct Args: Encodable { diff --git a/TalerWallet1/Model/Model+Withdraw.swift b/TalerWallet1/Model/Model+Withdraw.swift @@ -68,9 +68,9 @@ struct WithdrawUriInfoResponse: Decodable { fileprivate struct GetWithdrawalDetailsForURI: WalletBackendFormattedRequest { typealias Response = WithdrawUriInfoResponse func operation() -> String { "getWithdrawalDetailsForUri" } - func args() -> Args { Args(talerWithdrawUri: talerWithdrawUri) } + func args() -> Args { Args(talerWithdrawUri: talerUri) } - var talerWithdrawUri: String + var talerUri: String struct Args: Encodable { var talerWithdrawUri: String } @@ -141,9 +141,10 @@ struct ExchangeTermsOfService: Decodable { fileprivate struct GetExchangeTermsOfService: WalletBackendFormattedRequest { typealias Response = ExchangeTermsOfService func operation() -> String { "getExchangeTos" } - func args() -> Args { Args(exchangeBaseUrl: exchangeBaseUrl, acceptedFormat: acceptedFormat, acceptLanguage: acceptLanguage) } - - var exchangeBaseUrl: String + func args() -> Args { Args(exchangeBaseUrl: baseUrl, + acceptedFormat: acceptedFormat, + acceptLanguage: acceptLanguage) } + var baseUrl: String var acceptedFormat: [String]? var acceptLanguage: String? struct Args: Encodable { @@ -156,9 +157,9 @@ fileprivate struct GetExchangeTermsOfService: WalletBackendFormattedRequest { fileprivate struct SetExchangeTOSAccepted: WalletBackendFormattedRequest { struct Response: Decodable {} // no result - getting no error back means success func operation() -> String { "setExchangeTosAccepted" } - func args() -> Args { Args(exchangeBaseUrl: exchangeBaseUrl, etag: etag) } + func args() -> Args { Args(exchangeBaseUrl: baseUrl, etag: etag) } - var exchangeBaseUrl: String + var baseUrl: String var etag: String struct Args: Encodable { @@ -176,10 +177,10 @@ struct AcceptWithdrawalResponse: Decodable { fileprivate struct AcceptBankIntegratedWithdrawal: WalletBackendFormattedRequest { typealias Response = AcceptWithdrawalResponse func operation() -> String { "acceptBankIntegratedWithdrawal" } - func args() -> Args { Args(talerWithdrawUri: talerWithdrawUri, exchangeBaseUrl: exchangeBaseUrl, amount: amount, restrictAge: restrictAge) } + func args() -> Args { Args(talerWithdrawUri: talerUri, exchangeBaseUrl: baseUrl, amount: amount, restrictAge: restrictAge) } - var talerWithdrawUri: String - var exchangeBaseUrl: String + var talerUri: String + var baseUrl: String var amount: Amount? var restrictAge: Int? @@ -248,7 +249,7 @@ extension WalletModel { nonisolated func getWithdrawalDetailsForUri(_ talerUri: String, viewHandles: Bool = false) async throws -> WithdrawUriInfoResponse { - let request = GetWithdrawalDetailsForURI(talerWithdrawUri: talerUri) + let request = GetWithdrawalDetailsForURI(talerUri: talerUri) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response } @@ -263,35 +264,35 @@ extension WalletModel { return response } - nonisolated func loadExchangeTermsOfService(_ exchangeBaseUrl: String, - acceptedFormat: [String], - acceptLanguage: String, - viewHandles: Bool = false) + nonisolated func loadExchangeTermsOfService(_ baseUrl: String, + acceptedFormat: [String], + acceptLanguage: String, + viewHandles: Bool = false) async throws -> ExchangeTermsOfService { - let request = GetExchangeTermsOfService(exchangeBaseUrl: exchangeBaseUrl, - acceptedFormat: acceptedFormat, - acceptLanguage: acceptLanguage) + let request = GetExchangeTermsOfService(baseUrl: baseUrl, + acceptedFormat: acceptedFormat, + acceptLanguage: acceptLanguage) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response } - nonisolated func setExchangeTOSAccepted(_ exchangeBaseUrl: String, - etag: String, - viewHandles: Bool = false) + nonisolated func setExchangeTOSAccepted(_ baseUrl: String, + etag: String, + viewHandles: Bool = false) async throws -> Decodable { - let request = SetExchangeTOSAccepted(exchangeBaseUrl: exchangeBaseUrl, etag: etag) + let request = SetExchangeTOSAccepted(baseUrl: baseUrl, etag: etag) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response } - nonisolated func acceptBankIntWithdrawal(_ exchangeBaseUrl: String, - withdrawURL: String, - amount: Amount?, - restrictAge: Int?, - viewHandles: Bool = false) + nonisolated func acceptBankIntWithdrawal(_ baseUrl: String, + withdrawURL: String, + amount: Amount?, + restrictAge: Int?, + viewHandles: Bool = false) async throws -> AcceptWithdrawalResponse? { - let request = AcceptBankIntegratedWithdrawal(talerWithdrawUri: withdrawURL, exchangeBaseUrl: exchangeBaseUrl, - amount: amount, restrictAge: restrictAge) + let request = AcceptBankIntegratedWithdrawal(talerUri: withdrawURL, baseUrl: baseUrl, + amount: amount, restrictAge: restrictAge) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response } diff --git a/TalerWallet1/Model/WalletModel.swift b/TalerWallet1/Model/WalletModel.swift @@ -215,11 +215,11 @@ fileprivate struct InitRequest: WalletBackendFormattedRequest { } extension WalletModel { - /// initalize Wallet-Core. Will do networking + /// initalize Wallet-Core. Might do networking func initWalletCoreT(setTesting: Bool, viewHandles: Bool = false) async throws -> VersionInfo { // T for any Thread let dbPath = try dbPath() - logger.debug("dbPath: \(dbPath)") +// logger.debug("dbPath: \(dbPath)") let request = InitRequest(persistentStoragePath: dbPath, setTesting: setTesting) let response = try await sendRequest(request, 0, viewHandles: viewHandles) // no Delay return response.versionInfo diff --git a/TalerWallet1/Views/Actions/Banking/DepositAmountV.swift b/TalerWallet1/Views/Actions/Banking/DepositAmountV.swift @@ -48,12 +48,13 @@ struct DepositAmountV: View { @MainActor private func newBalance() async { + // runs whenever the user changes the exchange via ScopePicker, or on new currencyInfo symLog.log("❗️ task \(balanceIndex)") if let balance { - let scopeInfo = balance.scopeInfo - amountToTransfer.setCurrency(scopeInfo.currency) + let scope = balance.scopeInfo + amountToTransfer.setCurrency(scope.currency) do { - amountAvailable = try await model.getMaxDepositAmount(scopeInfo) + amountAvailable = try await model.getMaxDepositAmount(scope) } catch { // TODO: Error amountAvailable = balance.available @@ -73,7 +74,7 @@ struct DepositAmountV: View { let scrollView = ScrollView { if count > 0 { ScopePicker(value: $balanceIndex, - onlyNonZero: true) + onlyNonZero: true) // can only send what exists { index in balanceIndex = index balance = controller.balances[index] diff --git a/TalerWallet1/Views/Actions/Peer2peer/RequestPayment.swift b/TalerWallet1/Views/Actions/Peer2peer/RequestPayment.swift @@ -24,6 +24,7 @@ struct RequestPayment: View { @State private var currencyInfo: CurrencyInfo = CurrencyInfo.zero(UNKNOWN) @State private var amountToTransfer = Amount.zero(currency: EMPTYSTRING) // Update currency when used + @MainActor private func viewDidLoad() async { if let selectedBalance { balance = selectedBalance @@ -33,6 +34,7 @@ struct RequestPayment: View { balance = (controller.balances.count > 0) ? controller.balances[0] : nil } } + private func navTitle(_ currency: String, _ condition: Bool = false) -> String { condition ? String(localized: "NavTitle_Request_Currency)", defaultValue: "Request \(currency)", diff --git a/TalerWallet1/Views/Actions/Peer2peer/SendAmountV.swift b/TalerWallet1/Views/Actions/Peer2peer/SendAmountV.swift @@ -28,6 +28,7 @@ struct SendAmountV: View { @MainActor private func viewDidLoad() async { + let balances = controller.balances if let selectedBalance { if selectedBalance.available.isZero { // find another balance @@ -39,10 +40,10 @@ struct SendAmountV: View { balance = Balance.firstNonZero(controller.balances) } if let balance { - balanceIndex = controller.balances.firstIndex(of: balance) ?? 0 + balanceIndex = balances.firstIndex(of: balance) ?? 0 } else { balanceIndex = 0 - balance = (controller.balances.count > 0) ? controller.balances[0] : nil + balance = (balances.count > 0) ? balances[0] : nil } } @@ -75,7 +76,8 @@ struct SendAmountV: View { let _ = symLog.log("count = \(count)") let scrollView = ScrollView { if count > 0 { - ScopePicker(value: $balanceIndex, onlyNonZero: true) // can only send what exists + ScopePicker(value: $balanceIndex, + onlyNonZero: true) // can only send what exists { index in balanceIndex = index balance = controller.balances[index] @@ -90,20 +92,13 @@ struct SendAmountV: View { amountToTransfer: $amountToTransfer, amountAvailable: $amountAvailable, summary: $summary) - } else { // no balance - Yikes + } else { // TODO: Error no balance - Yikes Text("No balance. There seems to be a problem with the database...") } } // ScrollView .navigationTitle(navTitle) .frame(maxWidth: .infinity, alignment: .leading) .background(WalletColors().backgroundColor.edgesIgnoringSafeArea(.all)) -// .onAppear { -// DebugViewC.shared.setViewID(VIEW_P2P_SEND, stack: stack.push()) -// symLog.log("❗️ \(navTitle) onAppear") -// } -// .onDisappear { -// symLog.log("❗️ \(navTitle) onDisappear") -// } .task { await viewDidLoad() } .task(id: balanceIndex + (1000 * controller.currencyTicker)) { await newBalance() } diff --git a/TalerWallet1/Views/Balances/BalancesPendingRowV.swift b/TalerWallet1/Views/Balances/BalancesPendingRowV.swift @@ -86,7 +86,7 @@ fileprivate struct BalancesPendingRowV_Previews: PreviewProvider { var body: some View { let flags: [BalanceFlag] = [.incomingConfirmation] - let scopeInfo = ScopeInfo(type: ScopeInfo.ScopeInfoType.exchange, url: DEMOEXCHANGE, currency: DEMOCURRENCY) + let scopeInfo = ScopeInfo(type: ScopeInfo.ScopeInfoType.exchange, currency: DEMOCURRENCY, url: DEMOEXCHANGE) let balance = Balance(scopeInfo: scopeInfo, available: Amount(currency: DEMOCURRENCY, cent:1000), pendingIncoming: Amount(currency: DEMOCURRENCY, cent: 555), diff --git a/TalerWallet1/Views/Transactions/TransactionRowView.swift b/TalerWallet1/Views/Transactions/TransactionRowView.swift @@ -149,9 +149,6 @@ struct TransactionRowView: View { if topString != nil { centerTop } HStack(spacing: -4) { Spacer(minLength: 2) -#if DEBUG - .border(green) -#endif amountV #if DEBUG .border(green)