taler-ios

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

commit bd89805251278c1fa306f411eba6d3f00b86f846
parent 5ed30b8bc5ce953b891769c17be36496766d7fad
Author: Marc Stibane <marc@taler.net>
Date:   Wed, 17 Jan 2024 23:37:42 +0100

single routine for rendering amounts

Diffstat:
MTalerWallet.xcodeproj/project.pbxproj | 18++++++++++++------
MTalerWallet1/Controllers/Controller.swift | 25++++++++++++++++++++-----
MTalerWallet1/Views/Balances/BalanceRowView.swift | 22++++++++--------------
MTalerWallet1/Views/Balances/PendingRowView.swift | 21++-------------------
ATalerWallet1/Views/HelperViews/AmountRowV.swift | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ATalerWallet1/Views/HelperViews/AmountV.swift | 38++++++++++++++++++++++++++++++++++++++
DTalerWallet1/Views/HelperViews/AmountView.swift | 44--------------------------------------------
MTalerWallet1/Views/Transactions/ThreeAmountsV.swift | 12++++++------
MTalerWallet1/Views/Transactions/TransactionRowView.swift | 20++++++--------------
9 files changed, 172 insertions(+), 108 deletions(-)

diff --git a/TalerWallet.xcodeproj/project.pbxproj b/TalerWallet.xcodeproj/project.pbxproj @@ -11,6 +11,8 @@ 4E2254972A822B8100E41D29 /* payment_received.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 4E2254952A822B8100E41D29 /* payment_received.m4a */; }; 4E2254982A822B8100E41D29 /* payment_sent.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 4E2254962A822B8100E41D29 /* payment_sent.m4a */; }; 4E2D8DD32B3F513800234039 /* MarkdownUI in Frameworks */ = {isa = PBXBuildFile; productRef = 4E2D8DD22B3F513800234039 /* MarkdownUI */; }; + 4E2D8DD52B45822A00234039 /* AmountV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2D8DD42B45822A00234039 /* AmountV.swift */; }; + 4E2D8DD62B45822A00234039 /* AmountV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2D8DD42B45822A00234039 /* AmountV.swift */; }; 4E3327BA2AD1635100BF5AD6 /* AsyncSemaphore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E3327B92AD1635100BF5AD6 /* AsyncSemaphore.swift */; }; 4E3327BB2AD1635100BF5AD6 /* AsyncSemaphore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E3327B92AD1635100BF5AD6 /* AsyncSemaphore.swift */; }; 4E363CBC2A237E0900D7E98C /* URL+id+iban.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E363CBB2A237E0900D7E98C /* URL+id+iban.swift */; }; @@ -66,7 +68,7 @@ 4E3EAE482A990778009F1BE8 /* PayTemplateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EBA56402A7FF5200084948B /* PayTemplateView.swift */; }; 4E3EAE492A990778009F1BE8 /* ManualWithdrawDone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB431662A1E55C700C5690E /* ManualWithdrawDone.swift */; }; 4E3EAE4B2A990778009F1BE8 /* ShareSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E753A072A0B6A5F002D9328 /* ShareSheet.swift */; }; - 4E3EAE4C2A990778009F1BE8 /* AmountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB095492989CBFE0043A8A1 /* AmountView.swift */; }; + 4E3EAE4C2A990778009F1BE8 /* AmountRowV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB095492989CBFE0043A8A1 /* AmountRowV.swift */; }; 4E3EAE4D2A990778009F1BE8 /* P2pAcceptDone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E3B4BC22A42252300CC88B8 /* P2pAcceptDone.swift */; }; 4E3EAE4E2A990778009F1BE8 /* AnyTransition+backslide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E363CBD2A23CB2100D7E98C /* AnyTransition+backslide.swift */; }; 4E3EAE4F2A990778009F1BE8 /* TwoRowButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB065432A4CD1A80039B91D /* TwoRowButtons.swift */; }; @@ -211,7 +213,7 @@ 4EB095692989CBFE0043A8A1 /* ErrorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB095452989CBFE0043A8A1 /* ErrorView.swift */; }; 4EB0956A2989CBFE0043A8A1 /* Buttons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB095472989CBFE0043A8A1 /* Buttons.swift */; }; 4EB0956B2989CBFE0043A8A1 /* TextFieldAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB095482989CBFE0043A8A1 /* TextFieldAlert.swift */; }; - 4EB0956C2989CBFE0043A8A1 /* AmountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB095492989CBFE0043A8A1 /* AmountView.swift */; }; + 4EB0956C2989CBFE0043A8A1 /* AmountRowV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB095492989CBFE0043A8A1 /* AmountRowV.swift */; }; 4EB0956D2989CBFE0043A8A1 /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB0954A2989CBFE0043A8A1 /* LoadingView.swift */; }; 4EB0956E2989CBFE0043A8A1 /* Model+Pending.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB0954C2989CBFE0043A8A1 /* Model+Pending.swift */; }; 4EB3136129FEE79B007D68BC /* P2PReadyV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB3136029FEE79B007D68BC /* P2PReadyV.swift */; }; @@ -291,6 +293,7 @@ 4E16E12229F3BB99008B9C86 /* CurrencySpecification.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CurrencySpecification.swift; sourceTree = "<group>"; }; 4E2254952A822B8100E41D29 /* payment_received.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = payment_received.m4a; sourceTree = "<group>"; }; 4E2254962A822B8100E41D29 /* payment_sent.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = payment_sent.m4a; sourceTree = "<group>"; }; + 4E2D8DD42B45822A00234039 /* AmountV.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AmountV.swift; sourceTree = "<group>"; }; 4E3327B92AD1635100BF5AD6 /* AsyncSemaphore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsyncSemaphore.swift; sourceTree = "<group>"; }; 4E363CBB2A237E0900D7E98C /* URL+id+iban.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "URL+id+iban.swift"; sourceTree = "<group>"; }; 4E363CBD2A23CB2100D7E98C /* AnyTransition+backslide.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "AnyTransition+backslide.swift"; sourceTree = "<group>"; }; @@ -385,7 +388,7 @@ 4EB095452989CBFE0043A8A1 /* ErrorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ErrorView.swift; sourceTree = "<group>"; }; 4EB095472989CBFE0043A8A1 /* Buttons.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Buttons.swift; sourceTree = "<group>"; }; 4EB095482989CBFE0043A8A1 /* TextFieldAlert.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFieldAlert.swift; sourceTree = "<group>"; }; - 4EB095492989CBFE0043A8A1 /* AmountView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AmountView.swift; sourceTree = "<group>"; }; + 4EB095492989CBFE0043A8A1 /* AmountRowV.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AmountRowV.swift; sourceTree = "<group>"; }; 4EB0954A2989CBFE0043A8A1 /* LoadingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadingView.swift; sourceTree = "<group>"; }; 4EB0954C2989CBFE0043A8A1 /* Model+Pending.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Model+Pending.swift"; sourceTree = "<group>"; }; 4EB3136029FEE79B007D68BC /* P2PReadyV.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = P2PReadyV.swift; sourceTree = "<group>"; }; @@ -729,6 +732,7 @@ 4EF840A62A0B85F400EE0D47 /* CopyShare.swift */, 4ECB62812A0BB01D004ABBB7 /* SelectDays.swift */, 4EA551242A2C923600FEC9A8 /* CurrencyInputView.swift */, + 4E2D8DD42B45822A00234039 /* AmountV.swift */, 4E53A33629F50B7B00830EC2 /* CurrencyField.swift */, 4EEC157229F8242800D46A03 /* QRGeneratorView.swift */, 4E5A88F42A38A4FD00072618 /* QRCodeDetailView.swift */, @@ -737,7 +741,7 @@ 4E983C2B2ADC416800FA9CC5 /* View+fitsSideBySide.swift */, 4EB095482989CBFE0043A8A1 /* TextFieldAlert.swift */, 4EBA82AA2A3EB2CA00E5F39A /* TransactionButton.swift */, - 4EB095492989CBFE0043A8A1 /* AmountView.swift */, + 4EB095492989CBFE0043A8A1 /* AmountRowV.swift */, 4EB0954A2989CBFE0043A8A1 /* LoadingView.swift */, 4EB095432989CBFE0043A8A1 /* LaunchAnimationView.swift */, 4EFA395F2AA7946B00742548 /* ToSButtonView.swift */, @@ -1075,11 +1079,12 @@ 4E3EAE452A990778009F1BE8 /* P2PReadyV.swift in Sources */, 4E3EAE462A990778009F1BE8 /* TextFieldAlert.swift in Sources */, 4E3EAE472A990778009F1BE8 /* QuiteSomeCoins.swift in Sources */, + 4E2D8DD52B45822A00234039 /* AmountV.swift in Sources */, 4E3EAE482A990778009F1BE8 /* PayTemplateView.swift in Sources */, 4E3EAE492A990778009F1BE8 /* ManualWithdrawDone.swift in Sources */, 4E3EAE4B2A990778009F1BE8 /* ShareSheet.swift in Sources */, 4EC4008F2AE8019700DF72C7 /* ExchangeRowView.swift in Sources */, - 4E3EAE4C2A990778009F1BE8 /* AmountView.swift in Sources */, + 4E3EAE4C2A990778009F1BE8 /* AmountRowV.swift in Sources */, 4E605DBA2AB05FB6002FB9A7 /* BarGraph.swift in Sources */, 4E3EAE4D2A990778009F1BE8 /* P2pAcceptDone.swift in Sources */, 4E3EAE4E2A990778009F1BE8 /* AnyTransition+backslide.swift in Sources */, @@ -1180,11 +1185,12 @@ 4EB3136129FEE79B007D68BC /* P2PReadyV.swift in Sources */, 4EB0956B2989CBFE0043A8A1 /* TextFieldAlert.swift in Sources */, 4EBA82AD2A3F580500E5F39A /* QuiteSomeCoins.swift in Sources */, + 4E2D8DD62B45822A00234039 /* AmountV.swift in Sources */, 4EBA56412A7FF5200084948B /* PayTemplateView.swift in Sources */, 4EB431672A1E55C700C5690E /* ManualWithdrawDone.swift in Sources */, 4E753A082A0B6A5F002D9328 /* ShareSheet.swift in Sources */, 4EC400902AE8019700DF72C7 /* ExchangeRowView.swift in Sources */, - 4EB0956C2989CBFE0043A8A1 /* AmountView.swift in Sources */, + 4EB0956C2989CBFE0043A8A1 /* AmountRowV.swift in Sources */, 4E605DBB2AB05FB6002FB9A7 /* BarGraph.swift in Sources */, 4E3B4BC32A42252300CC88B8 /* P2pAcceptDone.swift in Sources */, 4E363CBE2A23CB2100D7E98C /* AnyTransition+backslide.swift in Sources */, diff --git a/TalerWallet1/Controllers/Controller.swift b/TalerWallet1/Controllers/Controller.swift @@ -69,21 +69,36 @@ class Controller: ObservableObject { return nil } - func info(for currency: String, _ ticker: Int) -> CurrencyInfo { - if ticker != currencyTicker { - print("❗️Yikes") - } + func info(for currency: String) -> CurrencyInfo? { for info in currencyInfos { if info.scope.currency == currency { return info } } - return CurrencyInfo.zero(currency) + return nil + } + func info(for currency: String, _ ticker: Int) -> CurrencyInfo { + if ticker != currencyTicker { + print("❗️Yikes") + } + return info(for: currency) ?? CurrencyInfo.zero(currency) } @MainActor func getInfo(from exchangeBaseUrl: String, model: WalletModel) async -> CurrencyInfo? { if let exchange = await model.getExchangeByUrl(url: exchangeBaseUrl) { +// let scopeInfo = exchange.scopeInfo +// if let info = hasInfo(for: scopeInfo.currency) { +// return info +// } +// do { +// let info = try await model.getCurrencyInfoM(scope: scopeInfo, delay: 0) +// await setInfo(info) +// return info +// } catch { +// return nil +// } + if let scopeInfo = exchange.scopeInfo { if let info = hasInfo(for: scopeInfo.currency) { return info diff --git a/TalerWallet1/Views/Balances/BalanceRowView.swift b/TalerWallet1/Views/Balances/BalanceRowView.swift @@ -5,8 +5,8 @@ import SwiftUI import taler_swift -struct BalanceButton: View { - let amountStr: String +struct BalanceCell: View { + let amount: Amount let sizeCategory: ContentSizeCategory let rowAction: () -> Void let balanceDest: LazyView<TransactionsListView>? @@ -17,13 +17,11 @@ struct BalanceButton: View { /// Renders the Balance button. "Balance" leading, amountStr trailing. If it doesn't fit in one row then /// amount (trailing) goes underneath "Balance" (leading). var body: some View { - let amountText = Text(amountStr) - .accessibilityFont(.title) + let amountV = AmountV(amount: amount, large: true) .foregroundColor(.primary) - .monospacedDigit() let hLayout = HStack(spacing: 0) { Spacer(minLength: 0) - amountText + amountV } let balanceCell = Group { if iconOnly { @@ -85,12 +83,10 @@ struct BalanceRowView: View { comment: "`Request Payment´ in Balances - set exactly 1 \\t for line break") var body: some View { VStack (alignment: .trailing, spacing: 6) { - let currencyInfo = controller.info(for: amount.currencyStr, controller.currencyTicker) - let amountStr = amount.string(currencyInfo) - BalanceButton(amountStr: amountStr, - sizeCategory: sizeCategory, - rowAction: rowAction, - balanceDest: balanceDest) + BalanceCell(amount: amount, + sizeCategory: sizeCategory, + rowAction: rowAction, + balanceDest: balanceDest) // .border(.red) let sendTitle = iconOnly ? sendTitle0 : sendTitle1 @@ -125,8 +121,6 @@ struct BalanceRowView_Previews: PreviewProvider { var body: some View { let test = Amount(currency: TESTCURRENCY, cent: 123) let demo = Amount(currency: DEMOCURRENCY, cent: 123456) -// let testStr = test.string(testInfo) -// let demoStr = demo.string(demoInfo) List { Section { diff --git a/TalerWallet1/Views/Balances/PendingRowView.swift b/TalerWallet1/Views/Balances/PendingRowView.swift @@ -12,8 +12,7 @@ struct PendingRowView: View { let shouldConfirm: Bool let needsKYC: Bool - @Environment(\.sizeCategory) var sizeCategory - @EnvironmentObject private var controller: Controller +// @Environment(\.sizeCategory) var sizeCategory @AppStorage("iconOnly") var iconOnly: Bool = false let inTitle0 = String(localized: "TitleIncoming_Short", defaultValue: "Incoming", @@ -34,11 +33,8 @@ struct PendingRowView: View { let outTitle = iconOnly ? outTitle0 : outTitle1 let pendingTitle = incoming ? inTitle : outTitle - let currencyInfo = controller.info(for: amount.currencyStr, controller.currencyTicker) - let amountText = Text(amount.string(currencyInfo)) + let amountText = AmountV(amount) .foregroundColor(pendingColor) - .accessibilityFont(.title2) - .monospacedDigit() // this is the default view for iOS 15 let vStack = VStack { @@ -72,19 +68,6 @@ struct PendingRowView: View { } // MARK: - #if DEBUG -func PreviewCurrencyInfo(_ currency: String, digits: Int) -> CurrencyInfo { - let unitName = digits == 0 ? "テ" : "ク" // do not use real currency symbols like "¥" : "€" - let scope = ScopeInfo(type: .global, currency: currency) - let specs = CurrencySpecification(name: currency, - code: currency, - fractionalInputDigits: digits, - fractionalNormalDigits: digits, - fractionalTrailingZeroDigits: digits, - altUnitNames: [0 : unitName]) - let previewFormatter = CurrencyFormatter.formatter(scope: scope, specs: specs) - return CurrencyInfo(scope: scope, specs: specs, formatter: previewFormatter) -} - @MainActor fileprivate struct Preview_Content: View { var body: some View { diff --git a/TalerWallet1/Views/HelperViews/AmountRowV.swift b/TalerWallet1/Views/HelperViews/AmountRowV.swift @@ -0,0 +1,80 @@ +/* + * This file is part of GNU Taler, ©2022-23 Taler Systems S.A. + * See LICENSE.md + */ +import SwiftUI +import taler_swift + +// Title and Amount +struct AmountRowV: View { + let title: String + let amount: Amount + let color: Color + let large: Bool // set to false for QR or IBAN + + var body: some View { + let titleV = Text(title) + .multilineTextAlignment(.leading) + .accessibilityFont(.body) + let amountV = AmountV(amount: amount, large: large) + .foregroundColor(color) + let verticalV = VStack(alignment: .leading) { + titleV + HStack(alignment: .lastTextBaseline) { + Spacer(minLength: 2) + amountV + } + } + Group { + if #available(iOS 16.0, *) { + ViewThatFits(in: .horizontal) { + HStack(alignment: .lastTextBaseline) { + titleV//.border(.orange) + Spacer(minLength: 2) + amountV//.border(.gray) + } + HStack(alignment: .lastTextBaseline) { + titleV//.border(.blue) + .lineLimit(2, reservesSpace: true) + .fixedSize(horizontal: false, vertical: true) + Spacer(minLength: 2) + amountV//.border(.gray) + } + verticalV + } + } else { // view for iOS 15 + verticalV + } + } + .frame(maxWidth: .infinity, alignment: .leading) + .listRowSeparator(.hidden) + } +} +extension AmountRowV { + init(title: String, amount: Amount, color: Color) { + self.title = title + self.amount = amount + self.color = color + self.large = true + } +} + +// MARK: - +fileprivate func talerFromStr(_ from: String) -> Amount { + do { + let amount = try Amount(fromString: from) + return amount + } catch { + return Amount(currency: "Taler", cent: 480) + } +} +#Preview { + List { + let fee = Amount(currency: "Taler", cent: 20) + AmountRowV(title: "Fee", amount: fee, color: Color("Outgoing"), large: false) + let cents = Amount(currency: "Taler", cent: 480) + AmountRowV(title: "Cents", amount: cents, color: Color("Incoming")) + let amount = talerFromStr("Taler:4.80") + AmountRowV(title: "Chosen amount to withdraw", amount: amount, color: Color("Incoming")) + } +} diff --git a/TalerWallet1/Views/HelperViews/AmountV.swift b/TalerWallet1/Views/HelperViews/AmountV.swift @@ -0,0 +1,38 @@ +/* + * This file is part of GNU Taler, ©2022-23 Taler Systems S.A. + * See LICENSE.md + */ +import SwiftUI +import taler_swift + +struct AmountV: View { + let amount: Amount + let large: Bool // set to false for QR or IBAN + + @EnvironmentObject private var controller: Controller + + var amountStr: String { + if let currencyInfo = controller.info(for: amount.currencyStr) { + return amount.string(currencyInfo) + } + return amount.readableDescription + } + + var body: some View { + Text(amountStr) + .multilineTextAlignment(.center) + .accessibilityFont(large ? .title : .title2) +// .fontWeight(large ? .medium : .regular) // @available(iOS 16.0, *) + .monospacedDigit() + } +} +extension AmountV { + init(_ amount: Amount) { + self.amount = amount + self.large = false + } +} +// MARK: - +//#Preview { +// AmountV() +//} diff --git a/TalerWallet1/Views/HelperViews/AmountView.swift b/TalerWallet1/Views/HelperViews/AmountView.swift @@ -1,44 +0,0 @@ -/* - * This file is part of GNU Taler, ©2022-23 Taler Systems S.A. - * See LICENSE.md - */ -import SwiftUI - -struct AmountView: View { - let title: String - let value: String - let color: Color - let large: Bool // set to false for QR or IBAN - - var body: some View { - VStack(alignment: .leading) { - Text(title) - .fixedSize(horizontal: false, vertical: true) // wrap in scrollview - .multilineTextAlignment(.leading) - .accessibilityFont(.body) - HStack { - Spacer() - Text(value) - .fixedSize(horizontal: false, vertical: true) // wrap in scrollview - .multilineTextAlignment(.center) - .foregroundColor(color) - .accessibilityFont(large ? .title : .title2) -// .fontWeight(large ? .medium : .regular) // @available(iOS 16.0, *) - .monospacedDigit() - } - } - .frame(maxWidth: .infinity, alignment: .leading) - .listRowSeparator(.hidden) - } -} - -struct AmountView_Previews: PreviewProvider { - static var previews: some View { - List { - AmountView(title: "Fee", value: "- 0,2 Taler", - color: Color("Outgoing"), large: true) - AmountView(title: "Coins", value: "4,8 Taler", - color: Color("Incoming"), large: false) - } - } -} diff --git a/TalerWallet1/Views/Transactions/ThreeAmountsV.swift b/TalerWallet1/Views/Transactions/ThreeAmountsV.swift @@ -69,24 +69,24 @@ struct ThreeAmountsV: View { .lineLimit(4) .padding(.bottom) } - AmountView(title: iconOnly ? topAbbrev : topTitle, - value: topAmount.readableDescription, + AmountRowV(title: iconOnly ? topAbbrev : topTitle, + amount: topAmount, color: labelColor, large: large) .padding(.bottom, 4) .accessibilityElement(children: .combine) if let fee { - AmountView(title: iconOnly ? String(localized: "Fee:") + AmountRowV(title: iconOnly ? String(localized: "Fee:") : String(localized: "Exchange fee:"), - value: fee.readableDescription, + amount: fee, color: labelColor, large: false) .padding(.bottom, 4) .accessibilityElement(children: .combine) } if let bottomAmount { - AmountView(title: iconOnly ? bottomAbbrev : bottomTitle, - value: bottomAmount.readableDescription, + AmountRowV(title: iconOnly ? bottomAbbrev : bottomTitle, + amount: bottomAmount, color: foreColor, large: large) .accessibilityElement(children: .combine) diff --git a/TalerWallet1/Views/Transactions/TransactionRowView.swift b/TalerWallet1/Views/Transactions/TransactionRowView.swift @@ -42,7 +42,6 @@ struct TransactionRowView: View { @Environment(\.sizeCategory) var sizeCategory @Environment(\.colorSchemeContrast) private var colorSchemeContrast - @EnvironmentObject private var controller: Controller func needVStack(available: CGFloat, contentWidth: CGFloat, valueWidth: CGFloat) -> Bool { available < (contentWidth + valueWidth + 40) @@ -66,19 +65,12 @@ struct TransactionRowView: View { : WalletColors().uncompletedColor let textColor = doneOrPending ? .primary : increasedContrast ? .secondary : Color(.tertiaryLabel) - let currencyInfo = controller.info(for: currency, controller.currencyTicker) let iconBadge = IconBadge(foreColor: foreColor, done: done, incoming: incoming, shouldConfirm: shouldConfirm, needsKYC: needsKYC) - let amountStr = common.amountEffective.string(currencyInfo) - let amountText = Text(amountStr) - .accessibilityFont(.title2) + let amountV = AmountV(common.amountEffective) .foregroundColor(foreColor) - .monospacedDigit() - let amount = HStack(spacing: 0) { - Spacer(minLength: 0) - amountText - } + let topString = transaction.localizedType let centerTop = Text(topString) .foregroundColor(textColor) @@ -101,7 +93,7 @@ struct TransactionRowView: View { } Spacer(minLength: 2) } - amountText + amountV } let layout2 = VStack(spacing: 0) { @@ -113,7 +105,7 @@ struct TransactionRowView: View { centerBottom Spacer(minLength: 2) }//.border(.green) - amountText//.border(.red) + amountV//.border(.red) }//.border(.orange) } @@ -125,7 +117,7 @@ struct TransactionRowView: View { centerTop Spacer(minLength: 2) } - amountText + amountV } centerBottom } @@ -136,7 +128,7 @@ struct TransactionRowView: View { iconBadge//.border(.green) Spacer(minLength: 2 ) - amountText//.border(.green) + amountV//.border(.green) }//.border(.orange) centerBottom }