[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-taler-ios] 97/204: TransactionCommon, row
From: |
gnunet |
Subject: |
[taler-taler-ios] 97/204: TransactionCommon, row |
Date: |
Thu, 05 Dec 2024 23:51:05 +0100 |
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 baa2344ebbf76c1be1ddfd079ea57451041ee66e
Author: Marc Stibane <marc@taler.net>
AuthorDate: Thu Nov 7 21:35:48 2024 +0100
TransactionCommon, row
---
TalerWallet1/Model/Transaction.swift | 22 ++++++--
TalerWallet1/Model/WalletModel.swift | 6 ++
.../Views/Transactions/ManualDetailsV.swift | 8 +--
.../Views/Transactions/ManualDetailsWireV.swift | 8 +--
.../Views/Transactions/ThreeAmountsSection.swift | 7 +--
.../Views/Transactions/TransactionRowView.swift | 66 +++++++++++++++-------
.../Views/Transactions/TransactionSummaryV.swift | 10 ++--
7 files changed, 85 insertions(+), 42 deletions(-)
diff --git a/TalerWallet1/Model/Transaction.swift
b/TalerWallet1/Model/Transaction.swift
index 60b4a1f..a1e7e38 100644
--- a/TalerWallet1/Model/Transaction.swift
+++ b/TalerWallet1/Model/Transaction.swift
@@ -137,6 +137,9 @@ enum TransactionMajorState: String, Codable {
struct TransactionState: Codable, Hashable {
var major: TransactionMajorState
var minor: TransactionMinorState?
+
+ var isReady: Bool { minor == .ready }
+ var isKYC: Bool { minor == .kyc || minor == .balanceKyc || minor ==
.mergeKycRequired }
}
struct TransactionTransition: Codable { // Notification
@@ -284,20 +287,29 @@ enum TransactionType: String, Codable {
}
}
+struct KycAuthTransferInfo: Decodable, Sendable {
+ /// The KYC auth transfer will *not* work if it originates from a
different account.
+ var debitPaytoUri: String /// Payto URI of the account that must
make the transfer
+ var accountPub: String /// Account public key that must be
included in the subject
+ var creditPaytoUris: [String] /// Possible target payto URIs
+}
+
struct TransactionCommon: Decodable, Sendable {
var type: TransactionType
- var txState: TransactionState
- var amountEffective: Amount
- var amountRaw: Amount
var transactionId: String
var timestamp: Timestamp
var scopes: [ScopeInfo]
+ var txState: TransactionState
var txActions: [TxAction]
+ var amountRaw: Amount
+ var amountEffective: Amount
+ var error: TalerErrorDetail?
var kycUrl: String?
+ var kycAuthTransferInfo: KycAuthTransferInfo?
var isPending : Bool { txState.major == .pending }
- var isPendingReady : Bool { isPending && txState.minor == .ready }
- var isPendingKYC : Bool { isPending && (txState.minor == .kyc ||
txState.minor == .balanceKyc || txState.minor == .mergeKycRequired) }
+ var isPendingReady : Bool { isPending && txState.isReady }
+ var isPendingKYC : Bool { isPending && txState.isKYC }
var isDone : Bool { txState.major == .done }
var isAborting : Bool { txState.major == .aborting }
var isAborted : Bool { txState.major == .aborted }
diff --git a/TalerWallet1/Model/WalletModel.swift
b/TalerWallet1/Model/WalletModel.swift
index 88b0c6c..be2965b 100644
--- a/TalerWallet1/Model/WalletModel.swift
+++ b/TalerWallet1/Model/WalletModel.swift
@@ -10,6 +10,12 @@ import os.log
fileprivate let DATABASE = "talerwalletdb-v30"
fileprivate let ASYNCDELAY: UInt = 0 //set e.g to 6 or 9 seconds for
debugging
+struct TalerErrorDetail: Codable, Hashable {
+ var code: Int
+ var when: Timestamp?
+ var hint: String?
+}
+
struct HTTPError: Codable, Hashable {
var code: Int
var requestUrl: String?
diff --git a/TalerWallet1/Views/Transactions/ManualDetailsV.swift
b/TalerWallet1/Views/Transactions/ManualDetailsV.swift
index 8819441..4a5a1d0 100644
--- a/TalerWallet1/Views/Transactions/ManualDetailsV.swift
+++ b/TalerWallet1/Views/Transactions/ManualDetailsV.swift
@@ -251,13 +251,13 @@ struct ManualDetailsV: View {
struct ManualDetails_Previews: PreviewProvider {
static var previews: some View {
let common = TransactionCommon(type: .withdrawal,
- txState: TransactionState(major: .done),
- amountEffective: Amount(currency: LONGCURRENCY,
cent: 110),
- amountRaw: Amount(currency: LONGCURRENCY,
cent: 220),
transactionId: "someTxID",
timestamp: Timestamp(from:
1_666_666_000_000),
scopes: [],
- txActions: [])
+ txState: TransactionState(major: .done),
+ txActions: [],
+ amountRaw: Amount(currency: LONGCURRENCY,
cent: 220),
+ amountEffective: Amount(currency: LONGCURRENCY,
cent: 110))
let payto =
"payto://iban/SANDBOXX/DE159593?receiver-name=Exchange+Company"
let details = WithdrawalDetails(type: .manual,
reservePub:
"ReSeRvEpUbLiC_KeY_FoR_WiThDrAwAl",
diff --git a/TalerWallet1/Views/Transactions/ManualDetailsWireV.swift
b/TalerWallet1/Views/Transactions/ManualDetailsWireV.swift
index eb586b2..0810361 100644
--- a/TalerWallet1/Views/Transactions/ManualDetailsWireV.swift
+++ b/TalerWallet1/Views/Transactions/ManualDetailsWireV.swift
@@ -173,14 +173,14 @@ struct ManualDetailsWireV: View {
//struct ManualDetailsWire_Previews: PreviewProvider {
// static var previews: some View {
// let common = TransactionCommon(type: .withdrawal,
-// txState: TransactionState(major: .done),
-// amountEffective: Amount(currency: LONGCURRENCY,
cent: 110),
-// amountRaw: Amount(currency: LONGCURRENCY,
cent: 220),
// transactionId: "someTxID",
// timestamp: Timestamp(from:
1_666_666_000_000),
+// txState: TransactionState(major: .done),
// txActions: [])
+// amountEffective: Amount(currency: LONGCURRENCY,
cent: 110),
+// amountRaw: Amount(currency: LONGCURRENCY,
cent: 220),
// let payto =
"payto://iban/SANDBOXX/DE159593?receiver-name=Exchange+Company"
-// let details = WithdrawalDetails(type: .manual,
+// let details = WithdrawalDetails(type: .manual,
// reservePub:
"ReSeRvEpUbLiC_KeY_FoR_WiThDrAwAl",
// reserveIsReady: false,
// confirmed: false)
diff --git a/TalerWallet1/Views/Transactions/ThreeAmountsSection.swift
b/TalerWallet1/Views/Transactions/ThreeAmountsSection.swift
index 50f7616..80ac0d5 100644
--- a/TalerWallet1/Views/Transactions/ThreeAmountsSection.swift
+++ b/TalerWallet1/Views/Transactions/ThreeAmountsSection.swift
@@ -182,14 +182,13 @@ struct ThreeAmounts_Previews: PreviewProvider {
var body: some View {
let scope = ScopeInfo.zero(LONGCURRENCY)
let common = TransactionCommon(type: .withdrawal,
- txState: TransactionState(major:
.done),
- amountEffective: Amount(currency:
LONGCURRENCY, cent: 10),
- amountRaw: Amount(currency:
LONGCURRENCY, cent: 20),
transactionId: "someTxID",
timestamp: Timestamp(from:
1_666_666_000_000),
scopes: [scope],
+ txState: TransactionState(major:
.done),
txActions: [],
- kycUrl: nil)
+ amountRaw: Amount(currency:
LONGCURRENCY, cent: 20),
+ amountEffective: Amount(currency:
LONGCURRENCY, cent: 10))
// let test = Amount(currency: TESTCURRENCY, cent: 123)
// let demo = Amount(currency: DEMOCURRENCY, cent: 123456)
List {
diff --git a/TalerWallet1/Views/Transactions/TransactionRowView.swift
b/TalerWallet1/Views/Transactions/TransactionRowView.swift
index 9643ae4..a7721ce 100644
--- a/TalerWallet1/Views/Transactions/TransactionRowView.swift
+++ b/TalerWallet1/Views/Transactions/TransactionRowView.swift
@@ -15,23 +15,39 @@ struct TransactionRowView: View {
@Environment(\.sizeCategory) var sizeCategory
@Environment(\.colorScheme) private var colorScheme
@Environment(\.colorSchemeContrast) private var colorSchemeContrast
+ @AppStorage("minimalistic") var minimalistic: Bool = false
func needVStack(available: CGFloat, contentWidth: CGFloat, valueWidth:
CGFloat) -> Bool {
available < (contentWidth + valueWidth + 40)
}
- func topString() -> String {
+ func topString(forA11y: Bool = false) -> String? {
switch transaction {
case .payment(let paymentTransaction):
return paymentTransaction.details.info.merchant.name
default:
- return transaction.isDone ? transaction.localizedTypePast
- : transaction.localizedType
+ let result = transaction.isDone ? transaction.localizedTypePast
+ : transaction.localizedType
+ return forA11y ? result
+ : minimalistic ? nil
+ : result
+ }
+ }
+
+ func amount() -> Amount {
+ switch transaction {
+ case .refresh(let refreshTransaction):
+ let details = refreshTransaction.details
+ return details.refreshInputAmount
+ default:
+ let common = transaction.common
+ let eff = common.amountEffective
+ if !eff.isZero { return eff }
+ return common.amountRaw
}
}
var body: some View {
- let common = transaction.common
let pending = transaction.isPending
let needsKYC = transaction.isPendingKYC
let shouldConfirm = transaction.shouldConfirm
@@ -40,13 +56,13 @@ struct TransactionRowView: View {
let increasedContrast = colorSchemeContrast == .increased
let details = transaction.detailsToShow()
let keys = details.keys
-
+ let common = transaction.common
+ let isZero = common.amountEffective.isZero
let incoming = common.incoming()
let textColor = doneOrPending ? .primary
: colorScheme == .dark ? .secondary
: increasedContrast ? Color(.darkGray)
: .secondary // Color(.tertiaryLabel)
- let isZero = common.amountEffective.isZero
let refreshZero = common.type.isRefresh && isZero
let foreColor = refreshZero ? textColor
: pending ? WalletColors().pendingColor(incoming)
@@ -56,18 +72,20 @@ struct TransactionRowView: View {
let iconBadge = TransactionIconBadge(type: common.type, foreColor:
foreColor,
done: done, incoming: incoming,
shouldConfirm: shouldConfirm, needsKYC:
needsKYC)
- let amountV = AmountV(scope, isZero ? common.amountRaw :
common.amountEffective,
- isNegative: isZero ? nil : !incoming,
strikethrough: !doneOrPending)
+ let amountV = AmountV(scope, amount(), isNegative: isZero ? nil :
!incoming,
+ strikethrough: !doneOrPending)
.foregroundColor(foreColor)
+ let topA11y = topString(forA11y: true)
let topString = topString()
- let centerTop = Text(topString)
+ let centerTop = Text(topString ?? EMPTYSTRING)
.foregroundColor(textColor)
.strikethrough(!doneOrPending, color: .red)
.talerFont(.headline)
// .fontWeight(.medium) iOS 16
.padding(.bottom, -2.0)
- .accessibilityLabel(doneOrPending ? topString : topString +
String(localized: ", canceled", comment: "VoiceOver"))
+ .accessibilityLabel(doneOrPending ? topA11y!
+ : topA11y! + String(localized:
", canceled", comment: "VoiceOver"))
let centerBottom = TimelineView(.everyMinute) { context in
let (dateString, date) = TalerDater.dateString(from:
common.timestamp, relative: true)
Text(dateString)
@@ -85,7 +103,7 @@ struct TransactionRowView: View {
let layout1 = HStack(spacing: 4) {
VStack(alignment: .leading, spacing: 2) {
- centerTop
+ if topString != nil { centerTop }
centerBottom
}
#if DEBUG
@@ -96,7 +114,7 @@ struct TransactionRowView: View {
}
let layout2 = VStack(alignment: .leading, spacing: 2) {
- centerTop
+ if topString != nil { centerTop }
HStack(spacing: 6) {
centerBottom
#if DEBUG
@@ -111,16 +129,24 @@ struct TransactionRowView: View {
}
let layout3 = VStack(spacing: 0) {
- HStack(spacing: 8) {
+ if topString != nil {
+ HStack(spacing: 8) {
centerTop
Spacer(minLength: 2)
- amountV
+ amountV
+ }
+ centerBottom
+ } else {
+ HStack(spacing: 8) {
+ centerBottom
+ Spacer(minLength: 2)
+ amountV
+ }
}
- centerBottom
}
let layout4 = VStack(alignment: .leading, spacing: 2) {
- centerTop
+ if topString != nil { centerTop }
HStack(spacing: -4) {
Spacer(minLength: 2)
#if DEBUG
@@ -207,15 +233,13 @@ extension Transaction { // for PreViews
let raw = Amount(currency: LONGCURRENCY, cent: 500)
let eff = Amount(currency: LONGCURRENCY, cent: incoming ? 480 : 520)
let common = TransactionCommon(type: incoming ? .withdrawal : .payment,
- txState: TransactionState(major: pending ?
TransactionMajorState.pending
- :
TransactionMajorState.done),
- amountEffective: eff,
- amountRaw: raw,
transactionId: id,
timestamp: time,
scopes: [],
+ txState: txState,
txActions: [.abort],
- kycUrl: nil)
+ amountRaw: raw,
+ amountEffective: eff)
if incoming {
// if pending then manual else bank-integrated
let payto =
"payto://iban/SANDBOXX/DE159593?receiver-name=Exchange+Company&amount=KUDOS%3A9.99&message=Taler+Withdrawal+J41FQPJGAP1BED1SFSXHC989EN8HRDYAHK688MQ228H6SKBMV0AG"
diff --git a/TalerWallet1/Views/Transactions/TransactionSummaryV.swift
b/TalerWallet1/Views/Transactions/TransactionSummaryV.swift
index a660383..373dfc7 100755
--- a/TalerWallet1/Views/Transactions/TransactionSummaryV.swift
+++ b/TalerWallet1/Views/Transactions/TransactionSummaryV.swift
@@ -14,14 +14,13 @@ extension Transaction { // for Dummys
let amount = Amount.zero(currency: dummyCurrency)
let now = Timestamp.now()
let common = TransactionCommon(type: .dummy,
- txState: TransactionState(major: .pending),
- amountEffective: amount,
- amountRaw: amount,
transactionId: EMPTYSTRING,
timestamp: now,
scopes: [],
+ txState: TransactionState(major: .pending),
txActions: [],
- kycUrl: nil)
+ amountRaw: amount,
+ amountEffective: amount)
self = .dummy(DummyTransaction(common: common))
}
}
@@ -44,6 +43,7 @@ struct TransactionSummaryV: View {
@Environment(\.colorScheme) private var colorScheme
@Environment(\.colorSchemeContrast) private var colorSchemeContrast
@Environment(\.presentationMode) var presentationMode:
Binding<PresentationMode>
+ @AppStorage("minimalistic") var minimalistic: Bool = false
@AppStorage("myListStyle") var myListStyle: MyListStyle = .automatic
#if DEBUG
@AppStorage("developerMode") var developerMode: Bool = true
@@ -118,6 +118,7 @@ struct TransactionSummaryV: View {
let pending = transaction.isPending
let locale = TalerDater.shared.locale
let (dateString, date) = TalerDater.dateString(from: common.timestamp)
+// let (dateString, date) = TalerDater.dateString(common.timestamp,
minimalistic)
let a11yDate = TalerDater.accessibilityDate(date) ?? dateString
let navTitle2 = transaction.isDone ? transaction.localizedTypePast
: transaction.localizedType
@@ -456,6 +457,7 @@ struct TransactionSummaryV: View {
if !transaction.isDone {
let expiration = details.info.expiration
let (dateString, date) =
TalerDater.dateString(from: expiration)
+// let (dateString, date) =
TalerDater.dateString(expiration, minimalistic)
let a11yDate = TalerDater.accessibilityDate(date)
?? dateString
let a11yLabel = String(localized: "Expires:
\(a11yDate)", comment: "VoiceOver")
Text("Expires: \(dateString)")
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [taler-taler-ios] 83/204: Comments, (continued)
- [taler-taler-ios] 83/204: Comments, gnunet, 2024/12/05
- [taler-taler-ios] 89/204: cleanup, gnunet, 2024/12/05
- [taler-taler-ios] 92/204: take out scroll-end-buttons, gnunet, 2024/12/05
- [taler-taler-ios] 96/204: cleanup, gnunet, 2024/12/05
- [taler-taler-ios] 86/204: cleanup, gnunet, 2024/12/05
- [taler-taler-ios] 91/204: scope instead of currencyInfo, gnunet, 2024/12/05
- [taler-taler-ios] 94/204: wording, gnunet, 2024/12/05
- [taler-taler-ios] 98/204: - LazyView, gnunet, 2024/12/05
- [taler-taler-ios] 95/204: - proposalId, gnunet, 2024/12/05
- [taler-taler-ios] 99/204: wording, gnunet, 2024/12/05
- [taler-taler-ios] 97/204: TransactionCommon, row,
gnunet <=
- [taler-taler-ios] 101/204: CheckDepositResponse, gnunet, 2024/12/05
- [taler-taler-ios] 104/204: split, gnunet, 2024/12/05
- [taler-taler-ios] 107/204: debug, fix wrong comparison, gnunet, 2024/12/05
- [taler-taler-ios] 102/204: task viewDidLoad, gnunet, 2024/12/05
- [taler-taler-ios] 105/204: NavLink, gnunet, 2024/12/05
- [taler-taler-ios] 109/204: loadBalances, gnunet, 2024/12/05
- [taler-taler-ios] 106/204: Use NavLink, gnunet, 2024/12/05
- [taler-taler-ios] 113/204: PendingOperations (unused), gnunet, 2024/12/05
- [taler-taler-ios] 114/204: Pay, gnunet, 2024/12/05
- [taler-taler-ios] 110/204: deposit, gnunet, 2024/12/05