taler-ios

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

commit f7750a60188e34ddedcae0cf763a926d913afba0
parent 8fbf2b46759656ae4abda0ccb722c95868532f83
Author: Marc Stibane <marc@taler.net>
Date:   Sat, 18 Nov 2023 17:02:26 +0100

needsKYC badge

Diffstat:
MTalerWallet1/Views/Balances/BalancesSectionView.swift | 4++--
MTalerWallet1/Views/Balances/PendingRowView.swift | 58++++++++++++++++++++++++++++++++++++++--------------------
MTalerWallet1/Views/Balances/TwoRowButtons.swift | 17+++++++++++------
MTalerWallet1/Views/Transactions/TransactionRowView.swift | 25++++++++++++++++++++-----
4 files changed, 71 insertions(+), 33 deletions(-)

diff --git a/TalerWallet1/Views/Balances/BalancesSectionView.swift b/TalerWallet1/Views/Balances/BalancesSectionView.swift @@ -193,11 +193,11 @@ fileprivate struct BalancesPendingRowView: View { VStack(spacing: 6) { var rows = 0 if !pendingIncoming.isZero { - PendingRowView(amount: pendingIncoming, incoming: true) + PendingRowView(amount: pendingIncoming, incoming: true, shouldConfirm: false, needsKYC: false) // TODO: !!! let _ = (rows+=1) } if !pendingOutgoing.isZero { - PendingRowView(amount: pendingOutgoing, incoming: false) + PendingRowView(amount: pendingOutgoing, incoming: false, shouldConfirm: false, needsKYC: false) let _ = (rows+=1) } if rows == 0 { diff --git a/TalerWallet1/Views/Balances/PendingRowView.swift b/TalerWallet1/Views/Balances/PendingRowView.swift @@ -9,6 +9,8 @@ struct PendingRowContentV: View { let titles: (String, String?) let isHorizontal: Bool let incoming: Bool + let shouldConfirm: Bool + let needsKYC: Bool public static func width(titles: (String, String?), isHorizontal: Bool, sizeCategory: ContentSizeCategory) -> CGFloat { @@ -37,16 +39,29 @@ struct PendingRowContentV: View { let pendingColor = WalletColors().pendingColor(incoming) let imageName = incoming ? "plus.diamond" // goforward.plus circle : "minus.diamond" // + let badgeName = needsKYC ? "star.fill" + : "circle.fill" HStack(spacing: 8) { - Image(systemName: imageName) - .foregroundColor(pendingColor) - .accessibilityFont(.largeTitle) - .accessibility(hidden: true) - - Text(title(titles, isHorizontal)) + HStack(alignment: .top, spacing: -8) { // TODO: adapt spacing to dynamic fontsize + Image(systemName: imageName) + .foregroundColor(pendingColor) + .accessibilityFont(.largeTitle) + .accessibility(hidden: true) + Image(systemName: badgeName) + .accessibilityFont(.caption) + .foregroundColor((needsKYC || shouldConfirm) ? .red : .clear) + } + let pendingAccTitles = accessTitles(titles, isHorizontal) + Text(pendingAccTitles.0) + .accessibilityLabel(Text(pendingAccTitles.1)) .lineLimit(4) .accessibilityFont(.body) } + .accessibilityElement(children: .combine) + .accessibilityValue(needsKYC ? ". Needs K Y C" : + shouldConfirm ? ". Needs bank confirmation" : EMPTYSTRING) + .accessibilityHint("Will go to pending transaction list.") + } } @@ -54,6 +69,8 @@ struct PendingRowContentV: View { struct PendingRowView: View { let amount: Amount let incoming: Bool + let shouldConfirm: Bool + let needsKYC: Bool @Environment(\.sizeCategory) var sizeCategory @EnvironmentObject private var controller: Controller @@ -88,20 +105,21 @@ struct PendingRowView: View { let currencyInfo = controller.info(for: amount.currencyStr, controller.currencyTicker) let amountStr = amount.string(currencyInfo) let amountWidth = amountStr.width(largeAmountFont: false, sizeCategory) - let inTitle = iconOnly ? (inTitle0, nil) - : (inTitle1, inTitle2) - let outTitle = iconOnly ? (outTitle0, nil) - : (outTitle1, outTitle2) - let title = incoming ? inTitle - : outTitle - let contentWidth = PendingRowContentV.width(titles: incoming ? inTitle : outTitle, - isHorizontal: false, sizeCategory: sizeCategory) - + let inTitles = iconOnly ? (inTitle0, nil) + : (inTitle1, inTitle2) + let outTitles = iconOnly ? (outTitle0, nil) + : (outTitle1, outTitle2) + let titles = incoming ? inTitles + : outTitles + let contentWidth = PendingRowContentV.width(titles: titles, + isHorizontal: false, + sizeCategory: sizeCategory) let needVStack = needVStack(available: width, contentWidth: contentWidth, valueWidth: amountWidth) AmountRowV(amountStr: amountStr, amountColor: pendingColor, largeAmountFont: false, fitsHorizontal: !needVStack, vertAlignment: .center) { // isHorizontal=true to try to fit "- Pending outgoing" + amount in 1 line - PendingRowContentV(titles: title, isHorizontal: true, incoming: incoming) + PendingRowContentV(titles: titles, isHorizontal: true, incoming: incoming, + shouldConfirm: shouldConfirm, needsKYC: needsKYC) } } } @@ -117,8 +135,8 @@ func PreviewCurrencyInfo(_ currency: String, digits: Int) -> CurrencyInfo { fractionalNormalDigits: digits, fractionalTrailingZeroDigits: digits, altUnitNames: [0 : unitName]) - let formatter = CurrencyFormatter.formatter(scope: scope, specs: specs) - return CurrencyInfo(scope: scope, specs: specs, formatter: formatter) + let previewFormatter = CurrencyFormatter.formatter(scope: scope, specs: specs) + return CurrencyInfo(scope: scope, specs: specs, formatter: previewFormatter) } @MainActor @@ -127,8 +145,8 @@ fileprivate struct Preview_Content: View { let test = Amount(currency: TESTCURRENCY, cent: 123) let demo = Amount(currency: DEMOCURRENCY, cent: 123456) List { - PendingRowView(amount: test, incoming: true) - PendingRowView(amount: demo, incoming: false) + PendingRowView(amount: test, incoming: true, shouldConfirm: true, needsKYC: false) + PendingRowView(amount: demo, incoming: false, shouldConfirm: false, needsKYC: true) } } } diff --git a/TalerWallet1/Views/Balances/TwoRowButtons.swift b/TalerWallet1/Views/Balances/TwoRowButtons.swift @@ -6,13 +6,14 @@ import SwiftUI import taler_swift extension View { - func title(_ titles: (String, String?), _ fitsSideBySide: Bool) -> String { - let delimiter = fitsSideBySide ? "\n" : " " + func accessTitles(_ titles: (String, String?), _ fitsSideBySide: Bool) -> (String, String) { + let space = " " + let delimiter = fitsSideBySide ? "\n" : space let (title1, title2) = titles if let title2 { - return title1 + delimiter + title2 + return (title1 + delimiter + title2, title1 + space + title2) } else { - return title1 + return (title1, title1) } } } @@ -29,13 +30,17 @@ struct TwoRowButtons: View { var body: some View { Group { - Button(title(sendTitles, fitsSideBySide), action: sendAction) + let sendAccTitles = accessTitles(sendTitles, fitsSideBySide) + Button(sendAccTitles.0, action: sendAction) + .accessibilityLabel(Text(sendAccTitles.1)) .lineLimit(lineLimit) .disabled(sendDisabled) .buttonStyle(TalerButtonStyle(type: .bordered, dimmed: false, aligned: .center)) - Button(title(recvTitles, fitsSideBySide), action: recvAction) + let recvAccTitles = accessTitles(recvTitles, fitsSideBySide) + Button(recvAccTitles.0, action: recvAction) + .accessibilityLabel(Text(recvAccTitles.1)) .lineLimit(lineLimit) .disabled(false) .buttonStyle(TalerButtonStyle(type: .bordered, diff --git a/TalerWallet1/Views/Transactions/TransactionRowView.swift b/TalerWallet1/Views/Transactions/TransactionRowView.swift @@ -10,6 +10,8 @@ struct TransactionRowContentV: View { var centerBottom: String let isHorizontal: Bool let incoming: Bool + let shouldConfirm: Bool + let needsKYC: Bool let foreColor:Color public static func width(titles: (String, String?), isHorizontal: Bool, @@ -39,11 +41,18 @@ struct TransactionRowContentV: View { var body: some View { let imageName = incoming ? "plus.circle.fill" : "minus.circle.fill" + let badgeName = needsKYC ? "star.fill" + : "circle.fill" HStack(spacing: 8) { - Image(systemName: imageName) - .foregroundColor(foreColor) - .accessibilityFont(.largeTitle) - .accessibility(hidden: true) + HStack(alignment: .top, spacing: -8) { // TODO: adapt spacing to dynamic fontsize + Image(systemName: imageName) + .foregroundColor(foreColor) + .accessibilityFont(.largeTitle) + .accessibility(hidden: true) + Image(systemName: badgeName) + .accessibilityFont(.caption) + .foregroundColor((needsKYC || shouldConfirm) ? .red : .clear) + }.accessibilityHidden(true) VStack(alignment: .leading) { Text(centerTop) @@ -72,6 +81,8 @@ struct TransactionRowView: View { let common = transaction.common let amount = common.amountEffective let pending = transaction.isPending + let needsKYC = transaction.isPendingKYC + let shouldConfirm = transaction.shouldConfirm let done = transaction.isDone let details = transaction.detailsToShow() let keys = details.keys @@ -95,9 +106,13 @@ struct TransactionRowView: View { fitsHorizontal: !needVStack, vertAlignment: .center) { TransactionRowContentV(centerTop: transaction.localizedType, - centerBottom: dateString, isHorizontal: true, incoming: incoming, foreColor: foreColor) + centerBottom: dateString, isHorizontal: true, + incoming: incoming, shouldConfirm: shouldConfirm, + needsKYC: needsKYC, foreColor: foreColor) } .accessibilityElement(children: .combine) + .accessibilityValue(needsKYC ? ". Needs K Y C" : + shouldConfirm ? ". Needs bank confirmation" : EMPTYSTRING) .accessibilityHint("Will go to detail view.") } }