gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-taler-ios] branch master updated (9f7de5c -> 101ccb8)


From: gnunet
Subject: [taler-taler-ios] branch master updated (9f7de5c -> 101ccb8)
Date: Tue, 31 Oct 2023 08:52:57 +0100

This is an automated email from the git hooks/post-receive script.

marc-stibane pushed a change to branch master
in repository taler-ios.

    from 9f7de5c  Bump version to 0.9.3 (22)
     new 5d0072f  AmountRowV
     new a49f1c3  Use AmountRowV
     new 262d4d1  string(_ currencyInfo: CurrencyInfo?)
     new babe75a  Self._logChanges()
     new 2eef469  Minimalistic
     new b21a078  Pending color, sizes, alignment
     new d63adac  Use AmountRowV for transactions
     new ca17aeb  Layout: View+fitsSideBySide
     new 9a02105  Pending: circle -> diamond
     new 897fe88  cleanup, debugging
     new c136c6a  use sizeCategory
     new 101ccb8  Bump version to 0.9.3 (23)

The 12 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 TalerWallet.xcodeproj/project.pbxproj              |  26 ++--
 TalerWallet1/Backend/WalletCore.swift              |   2 +-
 TalerWallet1/Helper/CurrencySpecification.swift    |  10 ++
 TalerWallet1/Helper/TalerStrings.swift             |  47 ++++++-
 TalerWallet1/Model/WalletModel.swift               |   4 +-
 TalerWallet1/Views/Balances/BalanceRowView.swift   | 109 +++++----------
 .../Views/Balances/BalancesSectionView.swift       |  18 ++-
 TalerWallet1/Views/Balances/PendingRowView.swift   | 155 ++++++++-------------
 TalerWallet1/Views/Balances/TwoRowButtons.swift    |  39 ++++--
 TalerWallet1/Views/Exchange/ExchangeRowView.swift  |  55 ++++++--
 TalerWallet1/Views/HelperViews/AmountRowV.swift    |  91 ++++++++++++
 .../Views/HelperViews/View+fitsSideBySide.swift    |  63 +++++++++
 .../Views/HelperViews/View+needVStack.swift        |  70 ----------
 TalerWallet1/Views/Main/MainView.swift             |  12 +-
 TalerWallet1/Views/Peer2peer/PaymentPurpose.swift  |  13 +-
 TalerWallet1/Views/Peer2peer/SendPurpose.swift     |  12 +-
 .../Views/Transactions/TransactionRowView.swift    | 100 +++++++++----
 .../Views/Transactions/TransactionsListView.swift  |  11 +-
 TestFlight/WhatToTest.en-US.txt                    |   5 +
 19 files changed, 502 insertions(+), 340 deletions(-)
 create mode 100644 TalerWallet1/Views/HelperViews/AmountRowV.swift
 create mode 100644 TalerWallet1/Views/HelperViews/View+fitsSideBySide.swift
 delete mode 100644 TalerWallet1/Views/HelperViews/View+needVStack.swift

diff --git a/TalerWallet.xcodeproj/project.pbxproj 
b/TalerWallet.xcodeproj/project.pbxproj
index 16114b3..485a9a7 100644
--- a/TalerWallet.xcodeproj/project.pbxproj
+++ b/TalerWallet.xcodeproj/project.pbxproj
@@ -10,6 +10,8 @@
                4E16E12329F3BB99008B9C86 /* CurrencySpecification.swift in 
Sources */ = {isa = PBXBuildFile; fileRef = 4E16E12229F3BB99008B9C86 /* 
CurrencySpecification.swift */; };
                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 */; 
};
+               4E2E5F7F2AEE30DA0027FA8A /* AmountRowV.swift in Sources */ = 
{isa = PBXBuildFile; fileRef = 4E2E5F7E2AEE30DA0027FA8A /* AmountRowV.swift */; 
};
+               4E2E5F802AEE30DA0027FA8A /* AmountRowV.swift in Sources */ = 
{isa = PBXBuildFile; fileRef = 4E2E5F7E2AEE30DA0027FA8A /* AmountRowV.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 
*/; };
@@ -169,8 +171,8 @@
                4E9796902A3765ED006F73BC /* AgePicker.swift in Sources */ = 
{isa = PBXBuildFile; fileRef = 4E97968F2A3765ED006F73BC /* AgePicker.swift */; 
};
                4E983C292ADBDD3500FA9CC5 /* SingleAxisGeometryReader.swift in 
Sources */ = {isa = PBXBuildFile; fileRef = 4E983C282ADBDD3500FA9CC5 /* 
SingleAxisGeometryReader.swift */; };
                4E983C2A2ADBDD3500FA9CC5 /* SingleAxisGeometryReader.swift in 
Sources */ = {isa = PBXBuildFile; fileRef = 4E983C282ADBDD3500FA9CC5 /* 
SingleAxisGeometryReader.swift */; };
-               4E983C2C2ADC416800FA9CC5 /* View+needVStack.swift in Sources */ 
= {isa = PBXBuildFile; fileRef = 4E983C2B2ADC416800FA9CC5 /* 
View+needVStack.swift */; };
-               4E983C2D2ADC416800FA9CC5 /* View+needVStack.swift in Sources */ 
= {isa = PBXBuildFile; fileRef = 4E983C2B2ADC416800FA9CC5 /* 
View+needVStack.swift */; };
+               4E983C2C2ADC416800FA9CC5 /* View+fitsSideBySide.swift in 
Sources */ = {isa = PBXBuildFile; fileRef = 4E983C2B2ADC416800FA9CC5 /* 
View+fitsSideBySide.swift */; };
+               4E983C2D2ADC416800FA9CC5 /* View+fitsSideBySide.swift in 
Sources */ = {isa = PBXBuildFile; fileRef = 4E983C2B2ADC416800FA9CC5 /* 
View+fitsSideBySide.swift */; };
                4EA1ABBE29A3833A008821EA /* PublicConstants.swift in Sources */ 
= {isa = PBXBuildFile; fileRef = 4EA1ABBD29A3833A008821EA /* 
PublicConstants.swift */; };
                4EA551252A2C923600FEC9A8 /* CurrencyInputView.swift in Sources 
*/ = {isa = PBXBuildFile; fileRef = 4EA551242A2C923600FEC9A8 /* 
CurrencyInputView.swift */; };
                4EAD117629F672FA008EDD0B /* KeyboardResponder.swift in Sources 
*/ = {isa = PBXBuildFile; fileRef = 4EAD117529F672FA008EDD0B /* 
KeyboardResponder.swift */; };
@@ -296,6 +298,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>"; };
+               4E2E5F7E2AEE30DA0027FA8A /* AmountRowV.swift */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.swift; path = 
AmountRowV.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>"; };
@@ -344,7 +347,7 @@
                4E9320462A164BC700A87B0E /* PaymentPurpose.swift */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path 
= PaymentPurpose.swift; sourceTree = "<group>"; };
                4E97968F2A3765ED006F73BC /* AgePicker.swift */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path 
= AgePicker.swift; sourceTree = "<group>"; };
                4E983C282ADBDD3500FA9CC5 /* SingleAxisGeometryReader.swift */ = 
{isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = 
sourcecode.swift; path = SingleAxisGeometryReader.swift; sourceTree = 
"<group>"; };
-               4E983C2B2ADC416800FA9CC5 /* View+needVStack.swift */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path 
= "View+needVStack.swift"; sourceTree = "<group>"; };
+               4E983C2B2ADC416800FA9CC5 /* View+fitsSideBySide.swift */ = {isa 
= PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; 
path = "View+fitsSideBySide.swift"; sourceTree = "<group>"; };
                4EA1ABBD29A3833A008821EA /* PublicConstants.swift */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.swift; path = 
PublicConstants.swift; sourceTree = "<group>"; };
                4EA551242A2C923600FEC9A8 /* CurrencyInputView.swift */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.swift; path = 
CurrencyInputView.swift; sourceTree = "<group>"; };
                4EAD117529F672FA008EDD0B /* KeyboardResponder.swift */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path 
= KeyboardResponder.swift; sourceTree = "<group>"; };
@@ -734,6 +737,7 @@
                        isa = PBXGroup;
                        children = (
                                4E97968F2A3765ED006F73BC /* AgePicker.swift */,
+                               4E2E5F7E2AEE30DA0027FA8A /* AmountRowV.swift */,
                                4E605DB92AB05FB6002FB9A7 /* BarGraph.swift */,
                                4EB095472989CBFE0043A8A1 /* Buttons.swift */,
                                4EF840A62A0B85F400EE0D47 /* CopyShare.swift */,
@@ -744,7 +748,7 @@
                                4E5A88F42A38A4FD00072618 /* 
QRCodeDetailView.swift */,
                                4E6EDD862A363D8D0031D520 /* ListStyle.swift */,
                                4E983C282ADBDD3500FA9CC5 /* 
SingleAxisGeometryReader.swift */,
-                               4E983C2B2ADC416800FA9CC5 /* 
View+needVStack.swift */,
+                               4E983C2B2ADC416800FA9CC5 /* 
View+fitsSideBySide.swift */,
                                4EB095482989CBFE0043A8A1 /* 
TextFieldAlert.swift */,
                                4EBA82AA2A3EB2CA00E5F39A /* 
TransactionButton.swift */,
                                4EB095492989CBFE0043A8A1 /* AmountView.swift */,
@@ -1047,7 +1051,7 @@
                                4E3EAE252A990778009F1BE8 /* 
WithdrawAcceptDone.swift in Sources */,
                                4E3EAE262A990778009F1BE8 /* Transaction.swift 
in Sources */,
                                4E605DB72AB05E48002FB9A7 /* 
View+flippedDirection.swift in Sources */,
-                               4E983C2C2ADC416800FA9CC5 /* 
View+needVStack.swift in Sources */,
+                               4E983C2C2ADC416800FA9CC5 /* 
View+fitsSideBySide.swift in Sources */,
                                4E3EAE272A990778009F1BE8 /* WalletColors.swift 
in Sources */,
                                4EC400892AE3E7E800DF72C7 /* AboutView.swift in 
Sources */,
                                4E3EAE282A990778009F1BE8 /* 
BalancesListView.swift in Sources */,
@@ -1108,6 +1112,7 @@
                                4E3EAE592A990778009F1BE8 /* 
Model+Settings.swift in Sources */,
                                4EC4008C2AE5664100DF72C7 /* 
CharacterSet+contains.swift in Sources */,
                                4E3EAE5A2A990778009F1BE8 /* ErrorView.swift in 
Sources */,
+                               4E2E5F7F2AEE30DA0027FA8A /* AmountRowV.swift in 
Sources */,
                                4E3EAE5B2A990778009F1BE8 /* 
View+Notification.swift in Sources */,
                                4E3EAE5C2A990778009F1BE8 /* Model+Pending.swift 
in Sources */,
                                4E3EAE5D2A990778009F1BE8 /* 
ExchangeListView.swift in Sources */,
@@ -1155,7 +1160,7 @@
                                4E5A88F72A3B9E5B00072618 /* 
WithdrawAcceptDone.swift in Sources */,
                                4EB095222989CBCB0043A8A1 /* Transaction.swift 
in Sources */,
                                4E605DB82AB05E48002FB9A7 /* 
View+flippedDirection.swift in Sources */,
-                               4E983C2D2ADC416800FA9CC5 /* 
View+needVStack.swift in Sources */,
+                               4E983C2D2ADC416800FA9CC5 /* 
View+fitsSideBySide.swift in Sources */,
                                4E9320432A14F6EA00A87B0E /* WalletColors.swift 
in Sources */,
                                4EC4008A2AE3E7E800DF72C7 /* AboutView.swift in 
Sources */,
                                4EB0955D2989CBFE0043A8A1 /* 
BalancesListView.swift in Sources */,
@@ -1216,6 +1221,7 @@
                                4EB095152989CBB00043A8A1 /* 
Model+Settings.swift in Sources */,
                                4EC4008D2AE5664100DF72C7 /* 
CharacterSet+contains.swift in Sources */,
                                4EB095692989CBFE0043A8A1 /* ErrorView.swift in 
Sources */,
+                               4E2E5F802AEE30DA0027FA8A /* AmountRowV.swift in 
Sources */,
                                4E3B4BC72A429F2A00CC88B8 /* 
View+Notification.swift in Sources */,
                                4EB0956E2989CBFE0043A8A1 /* Model+Pending.swift 
in Sources */,
                                4EB095522989CBFE0043A8A1 /* 
ExchangeListView.swift in Sources */,
@@ -1291,7 +1297,7 @@
                                CODE_SIGN_ENTITLEMENTS = 
"$(TARGET_NAME).entitlements";
                                CODE_SIGN_IDENTITY = "Apple Development";
                                CODE_SIGN_STYLE = Automatic;
-                               CURRENT_PROJECT_VERSION = 22;
+                               CURRENT_PROJECT_VERSION = 23;
                                DEVELOPMENT_TEAM = GUDDQ9428Y;
                                ENABLE_PREVIEWS = YES;
                                GENERATE_INFOPLIST_FILE = YES;
@@ -1332,7 +1338,7 @@
                                CODE_SIGN_ENTITLEMENTS = 
"$(TARGET_NAME).entitlements";
                                CODE_SIGN_IDENTITY = "Apple Development";
                                CODE_SIGN_STYLE = Automatic;
-                               CURRENT_PROJECT_VERSION = 22;
+                               CURRENT_PROJECT_VERSION = 23;
                                DEVELOPMENT_TEAM = GUDDQ9428Y;
                                ENABLE_PREVIEWS = YES;
                                GENERATE_INFOPLIST_FILE = YES;
@@ -1490,7 +1496,7 @@
                                CODE_SIGN_ENTITLEMENTS = 
"$(TARGET_NAME).entitlements";
                                CODE_SIGN_IDENTITY = "Apple Development";
                                CODE_SIGN_STYLE = Automatic;
-                               CURRENT_PROJECT_VERSION = 22;
+                               CURRENT_PROJECT_VERSION = 23;
                                DEVELOPMENT_TEAM = GUDDQ9428Y;
                                ENABLE_PREVIEWS = YES;
                                GENERATE_INFOPLIST_FILE = YES;
@@ -1532,7 +1538,7 @@
                                CODE_SIGN_ENTITLEMENTS = 
"$(TARGET_NAME).entitlements";
                                CODE_SIGN_IDENTITY = "Apple Development";
                                CODE_SIGN_STYLE = Automatic;
-                               CURRENT_PROJECT_VERSION = 22;
+                               CURRENT_PROJECT_VERSION = 23;
                                DEVELOPMENT_TEAM = GUDDQ9428Y;
                                ENABLE_PREVIEWS = YES;
                                GENERATE_INFOPLIST_FILE = YES;
diff --git a/TalerWallet1/Backend/WalletCore.swift 
b/TalerWallet1/Backend/WalletCore.swift
index 9886363..8fd3c18 100644
--- a/TalerWallet1/Backend/WalletCore.swift
+++ b/TalerWallet1/Backend/WalletCore.swift
@@ -248,7 +248,7 @@ extension WalletCore {
                      "refresh-revealed", "refresh-unwarranted":
                     break
                 default:
-print("\n❗️ WalletCore.swift:226 Notification: ", anyPayload, "\n")        // 
this is a new notification I haven't seen before
+print("\n❗️ WalletCore.swift:251 Notification: ", anyPayload, "\n")        // 
this is a new notification I haven't seen before
                     break
             }
         } catch let error {
diff --git a/TalerWallet1/Helper/CurrencySpecification.swift 
b/TalerWallet1/Helper/CurrencySpecification.swift
index 9adff4b..63988e3 100644
--- a/TalerWallet1/Helper/CurrencySpecification.swift
+++ b/TalerWallet1/Helper/CurrencySpecification.swift
@@ -5,6 +5,16 @@
 import Foundation
 import taler_swift
 
+extension Amount {
+    func string(_ currencyInfo: CurrencyInfo?) -> String {
+        if let currencyInfo {
+            return currencyInfo.string(for: valueAsTuple)
+        } else {
+            return valueStr
+        }
+    }
+}
+
 public struct CurrencyInfo {
     let scope: ScopeInfo
     let specs: CurrencySpecification
diff --git a/TalerWallet1/Helper/TalerStrings.swift 
b/TalerWallet1/Helper/TalerStrings.swift
index 70b7330..117b5ee 100644
--- a/TalerWallet1/Helper/TalerStrings.swift
+++ b/TalerWallet1/Helper/TalerStrings.swift
@@ -2,6 +2,7 @@
  * This file is part of GNU Taler, ©2022-23 Taler Systems S.A.
  * See LICENSE.md
  */
+import SwiftUI
 import Foundation
 import UIKit
 
@@ -44,7 +45,47 @@ extension String {
         let size = self.size(withAttributes: fontAttributes)
         return size.width
     }
+
+    func widthOfString(usingUIFont font: UIFont, _ sizeCategory: 
ContentSizeCategory) -> CGFloat {
+        let width = widthOfString(usingUIFont: font)
+        let correctForSize = correctForSize(sizeCategory)
+        return width * correctForSize
+    }
+
+    public func width(largeAmountFont: Bool, _ sizeCategory: 
ContentSizeCategory) -> CGFloat {
+        let uiFont = TalerFont.uiFont(largeAmountFont ? .title : .title2)
+        return widthOfString(usingUIFont: uiFont, sizeCategory)
+    }
+
+    // This would be used like so:
+    // let uiFont = UIFont.systemFont(ofSize: 17, weight: .bold)
+    // let width = "SomeString".widthOfString(usingUIFont: uiFont)
+
+    ///
+    fileprivate func correctForSize(_ sizeCategory: ContentSizeCategory) -> 
CGFloat {
+        // empirical values
+        let corrValue = switch sizeCategory {
+            case .extraSmall: 0.7
+            case .small: 0.8
+            case .medium: 0.9
+//            case .large: 1.0
+            case .extraLarge: 1.15
+            case .extraExtraLarge: 1.25
+            case .extraExtraExtraLarge: 1.33
+            case .accessibilityMedium: 1.52
+            case .accessibilityLarge: 1.8
+            case .accessibilityExtraLarge: 2.0
+            case .accessibilityExtraExtraLarge: 2.2
+            case .accessibilityExtraExtraExtraLarge: 2.5
+            default: 1.0
+        }
+        if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] 
== "1" {
+            // directly return the empirical value
+            return corrValue
+        } else {
+            // preview doesn't use ContentSizeCategory for 
widthOfString(usingUIFont)
+            // thus the empirical values are the square of what's really needed
+            return sqrt(corrValue)
+        }
+    }
 }
-// This would be used like so:
-// let uiFont = UIFont.systemFont(ofSize: 17, weight: .bold)
-// let width = "SomeString".widthOfString(usingUIFont: uiFont)
diff --git a/TalerWallet1/Model/WalletModel.swift 
b/TalerWallet1/Model/WalletModel.swift
index 1133ef7..1c6e884 100644
--- a/TalerWallet1/Model/WalletModel.swift
+++ b/TalerWallet1/Model/WalletModel.swift
@@ -144,9 +144,9 @@ extension WalletModel {
             if !fileManager.fileExists(atPath: cachePath) {
                 let contents = Data()       /// Initialize an empty `Data`.
                 fileManager.createFile(atPath: cachePath, contents: contents)
-                print("File \(cachePath) created")
+                print("❗️ File \(cachePath) created")
             } else {
-                print("File \(cachePath) already exists")
+                print("❗️ File \(cachePath) already exists")
             }
 
             return cachePath
diff --git a/TalerWallet1/Views/Balances/BalanceRowView.swift 
b/TalerWallet1/Views/Balances/BalanceRowView.swift
index fabbe63..4af0a15 100644
--- a/TalerWallet1/Views/Balances/BalanceRowView.swift
+++ b/TalerWallet1/Views/Balances/BalanceRowView.swift
@@ -5,37 +5,9 @@
 import SwiftUI
 import taler_swift
 
-struct BalanceLabel: View {
-    let balanceTitle: String
-    let horizontal: Bool
-    let amountStr: String
-    let iconOnly: Bool
-
-    var body: some View {
-        Group {         // can either be horizontal (preferred) or vertical 
(if doesn't fit horizontally)
-            if !iconOnly {
-                Text(balanceTitle)
-                    .accessibilityFont(.title2)
-                    .foregroundColor(.secondary)
-            }
-            if horizontal {
-                Spacer(minLength: 0)
-                Text(amountStr)
-                    .accessibilityFont(.title)
-                    .monospacedDigit()
-            } else { HStack {
-                Spacer(minLength: 0)
-                Text(amountStr)
-                    .accessibilityFont(.title)
-                    .monospacedDigit()
-            } }
-        }
-    }
-}
-
 struct BalanceButton: View {
     let amountStr: String
-    let correctForSize: CGFloat
+    let sizeCategory: ContentSizeCategory
     let rowAction: () -> Void
 
     @AppStorage("iconOnly") var iconOnly: Bool = false
@@ -43,21 +15,18 @@ struct BalanceButton: View {
     var body: some View {
         let balanceTitle = String(localized: "Balance:", comment: "Main view")
         Button(action: rowAction) {
-            SingleAxisGeometryReader { width in
+            SingleAxisGeometryReader { width in         // e.g. 301 instead of 
313 => padding = 6
                 Group {
                     let titles = [(balanceTitle, TalerFont.uiFont(.title2)),
                                   (amountStr,    TalerFont.uiFont(.title))]
-                    let needVStack = !iconOnly && Self.needVStack(titles, 
width: width,
-                                                                  
correctForSize: correctForSize,
-                                                                  spacing: 
HSPACING, sameSize: false)
-                    if needVStack {
-                        VStack(alignment: .leading, spacing: 0) {
-                            BalanceLabel(balanceTitle: balanceTitle, 
horizontal: false, amountStr: amountStr, iconOnly: iconOnly)
-                        }
-                    } else {
-                        HStack(alignment: .lastTextBaseline, spacing: 0) {
-                            BalanceLabel(balanceTitle: balanceTitle, 
horizontal: true, amountStr: amountStr, iconOnly: iconOnly)
-                        }
+                    let fitsSideBySide = iconOnly || 
Self.fitsSideBySide(titles, availableWidth: width,
+                                                                  
sizeCategory: sizeCategory,
+                                                                  padding: 20, 
sameSize: false)
+                    AmountRowV(amountStr: amountStr, amountColor: .primary, 
largeAmountFont: true,
+                               fitsHorizontal: fitsSideBySide, vertAlignment: 
.lastTextBaseline) {
+                        Text(iconOnly ? "" : balanceTitle)
+                            .accessibilityFont(.title2)
+                            .foregroundColor(.secondary)
                     }
                 }
             }
@@ -69,8 +38,9 @@ struct BalanceButton: View {
 }
 
 
-/// This view shows the currency row in a currency section
-/// [Send Coins]  [Receive Coins]     Balance
+/// This view shows the currency row in a currency section, and two action 
buttons below
+///  Balance:               amount
+/// [Send Money]  [Request Payment]
 struct BalanceRowView: View {
     let amount: Amount
     let currencyInfo: CurrencyInfo?
@@ -78,36 +48,40 @@ struct BalanceRowView: View {
     let recvAction: () -> Void
     let rowAction: () -> Void
     @Environment(\.sizeCategory) var sizeCategory
+    @AppStorage("iconOnly") var iconOnly: Bool = false
     @AppStorage("myListStyle") var myListStyle: MyListStyle = .automatic
 
+    let sendTitle0 = String(localized: "Send", comment: "Abbreviation <Send 
Money>")
     let sendTitle1 = String(localized: "Send", comment: "Top of button <Send 
Money>")
     let sendTitle2 = String(localized: "Money", comment: "Bottom of button 
<Send Money>")
+    let requestTitle0 = String(localized: "Request", comment: "Abbreviation 
<Request Payment>")
     let requestTitle1 = String(localized: "Request", comment: "Top of button 
<Request Payment>")
     let requestTitle2 = String(localized: "Payment", comment: "Bottom of 
button <Request Payment>")
 
     var body: some View {
-        let correctForSize = Self.correctForSize(sizeCategory)
         SingleAxisGeometryReader { width in
             VStack (alignment: .trailing) {
-                let amountStr = currencyInfo?.string(for: amount.valueAsTuple)
-                BalanceButton(amountStr: amountStr ?? amount.valueStr,
-                         correctForSize: correctForSize,
+                let amountStr = amount.string(currencyInfo)
+                BalanceButton(amountStr: amountStr,
+                           sizeCategory: sizeCategory,
                               rowAction: rowAction)
                 let uiFont = TalerFont.uiFont(.title3)
-                let titles = [(requestTitle1, uiFont), (requestTitle2, 
uiFont), (sendTitle1, uiFont), (sendTitle2, uiFont)]
-                let sendTitle = sendTitle1 + "\n" + sendTitle2
-                let requestTitle = requestTitle1 + "\n" + requestTitle2
-                let twoRowButtons = TwoRowButtons(sendTitle: sendTitle, 
recvTitle: requestTitle,
-                                                  lineLimit: 5, sendDisabled: 
amount.isZero,
-                                                  sendAction: sendAction, 
recvAction: recvAction)
-//  let _ = print("Screenwidth: \(UIScreen.screenWidth)  Geometry: \(width)  
\(sizeCategory): \(sizeCategory)")
-                if Self.needVStack(titles, width: width, correctForSize: 
correctForSize, spacing: HSPACING) {
-                    VStack { twoRowButtons }
-                } else {
+                let titles = iconOnly ? [(sendTitle0, uiFont), (requestTitle0, 
uiFont)]
+                           : [(sendTitle1, uiFont), (sendTitle2, uiFont), 
(requestTitle1, uiFont), (requestTitle2, uiFont)]
+                let fitsSideBySide = Self.fitsSideBySide(titles, 
availableWidth: width, sizeCategory: sizeCategory, padding: 10)
+                let twoRowButtons = TwoRowButtons(sendTitles: iconOnly ? 
(sendTitle0, nil) : (sendTitle1, sendTitle2),
+                                                  recvTitles: iconOnly ? 
(requestTitle0, nil) : (requestTitle1, requestTitle2),
+                                              fitsSideBySide: fitsSideBySide,
+                                                   lineLimit: 5,
+                                                sendDisabled: amount.isZero,
+                                                  sendAction: sendAction,
+                                                  recvAction: recvAction)
+                if fitsSideBySide {
                     HStack(spacing: HSPACING) { twoRowButtons }
+                } else {
+                    VStack { twoRowButtons }
                 }
             }
-//            .accessibilityElement(children: .combine)
         }
     }
 }
@@ -115,27 +89,15 @@ struct BalanceRowView: View {
 #if  DEBUG
 
 struct SomeBalanceRows: View {
-    @Environment(\.sizeCategory) var sizeCategory
-
     var body: some View {
         let testInfo = PreviewCurrencyInfo(TESTCURRENCY, digits: 0)
         let demoInfo = PreviewCurrencyInfo(TESTCURRENCY, digits: 2)
         let test = try! Amount(fromString: TESTCURRENCY + ":1.23")
-        let demo = try! Amount(fromString: DEMOCURRENCY + ":1234.12")
-        let testStr = testInfo.string(for: test.valueAsTuple)
-        let demoStr = demoInfo.string(for: demo.valueAsTuple)
-
-        let correctForSize = Self.correctForSize(sizeCategory)
+        let demo = try! Amount(fromString: DEMOCURRENCY + ":123.12")
+//        let testStr = test.string(testInfo)
+//        let demoStr = demo.string(demoInfo)
 
         List {
-            Section {
-                BalanceLabel(balanceTitle: "Balance:", horizontal: false, 
amountStr: demoStr, iconOnly: false)
-                    .listRowSeparator(.hidden)
-            }
-            Section {
-                BalanceButton(amountStr: testStr, correctForSize: 
correctForSize, rowAction: {})
-                    .listRowSeparator(.hidden)
-            }
             Section {
                 BalanceRowView(amount: demo, currencyInfo: demoInfo, 
sendAction: {}, recvAction: {}, rowAction: {})
             }
@@ -148,6 +110,7 @@ struct SomeBalanceRows: View {
 struct BalanceRowView_Previews: PreviewProvider {
     static var previews: some View {
         SomeBalanceRows()
+//            .environment(\.sizeCategory, .extraExtraLarge)    Canvas Device 
Settings
     }
 }
 #endif
diff --git a/TalerWallet1/Views/Balances/BalancesSectionView.swift 
b/TalerWallet1/Views/Balances/BalancesSectionView.swift
index 91872a8..a588698 100644
--- a/TalerWallet1/Views/Balances/BalancesSectionView.swift
+++ b/TalerWallet1/Views/Balances/BalancesSectionView.swift
@@ -22,6 +22,7 @@ struct BalancesSectionView {
     @Binding var centsToTransfer: UInt64
     @Binding var summary: String
 
+    @AppStorage("iconOnly") var iconOnly: Bool = false
     @EnvironmentObject private var model: WalletModel
     @EnvironmentObject private var controller: Controller
 
@@ -72,7 +73,8 @@ extension BalancesSectionView: View {
 
         Section {
             if "KUDOS" == currency && !balance.available.isZero {
-                Text("You can spend these KUDOS in the [Demo 
Shop](https://shop.demo.taler.net), or send them to another wallet.")
+                Text(iconOnly ? "Visit the [Demo 
Shop](https://shop.demo.taler.net)" :
+                        "You can spend these KUDOS in the [Demo 
Shop](https://shop.demo.taler.net), or send them to another wallet.")
                     .accessibilityFont(.body)
                     .multilineTextAlignment(.leading)
             }
@@ -101,7 +103,7 @@ extension BalancesSectionView: View {
                     LazyView {
                         TransactionsListView(stack: stack.push(),
                                           navTitle: String(localized: 
"Uncompleted"),
-                                          currency: currency,
+                                      currencyInfo: currencyInfo,
                                       transactions: uncompletedTransactions,
                                         showUpDown: false,
                                    reloadAllAction: reloadUncompleted,
@@ -146,12 +148,14 @@ extension BalancesSectionView: View {
                 let threeTransactions = Array(slice)
                 TransactionsRowsView(symLog: symLog,
                                       stack: stack.push(),
-                                   currency: currency,
+                               currencyInfo: currencyInfo,
                                transactions: threeTransactions,
                             reloadOneAction: reloadOneAction)
             } header: {
-                Text("Recent transactions")
-                    .accessibilityFont(.callout)
+                if !iconOnly {
+                    Text("Recent transactions")
+                        .accessibilityFont(.callout)
+                }
             }
         }
     } // body
@@ -196,7 +200,7 @@ fileprivate struct BalancesPendingRowView: View {
             LazyView {
                 TransactionsListView(stack: stack.push(),
                                   navTitle: String(localized: "Pending"),
-                                  currency: currency,
+                              currencyInfo: currencyInfo,
                               transactions: pendingTransactions,
                                 showUpDown: false,
                            reloadAllAction: reloadPending,
@@ -271,7 +275,7 @@ fileprivate struct BalancesNavigationLinksView: View {
             NavigationLink(destination: LazyView {
                 TransactionsListView(stack: stack.push(),
                                   navTitle: String(localized: "Transactions"),
-                                  currency: currency,
+                              currencyInfo: currencyInfo,
                               transactions: completedTransactions,
                                 showUpDown: true,
                            reloadAllAction: reloadAllAction,
diff --git a/TalerWallet1/Views/Balances/PendingRowView.swift 
b/TalerWallet1/Views/Balances/PendingRowView.swift
index f999c3f..f45d1fa 100644
--- a/TalerWallet1/Views/Balances/PendingRowView.swift
+++ b/TalerWallet1/Views/Balances/PendingRowView.swift
@@ -5,135 +5,98 @@
 import SwiftUI
 import taler_swift
 
-struct InOrOutView: View {
-    let title: (String, String)
-    let horizontal: Bool
+struct PendingRowContentV: View {
+    let titles: (String, String?)
+    let isHorizontal: Bool
     let incoming: Bool
-    let imageName: String
 
-    public static func width(image1: String, title1: String, title2: String) 
-> CGFloat {
+    public static func width(titles: (String, String?), isHorizontal: Bool,
+                             sizeCategory: ContentSizeCategory) -> CGFloat {
         let imageFont = TalerFont.uiFont(.largeTitle)
         let uiFont = TalerFont.uiFont(.body)
 
-        let image2 = "++"
-        let imageWidth = image2.widthOfString(usingUIFont: imageFont) + 8.0    
 //.padding(.trailing)
-        let title1Width = title1.widthOfString(usingUIFont: uiFont)
-        let title2Width = title2.widthOfString(usingUIFont: uiFont)
-//    print("image: ", imageWidth, " title: ", max(title1Width, title2Width))
-        return imageWidth + max(title1Width, title2Width)
+        let image = "++"
+        let imageWidth = image.widthOfString(usingUIFont: imageFont, 
sizeCategory) + 8.0     // spacing: 8
+        let (title1, title2) = titles
+        let title1Width = title1.widthOfString(usingUIFont: uiFont, 
sizeCategory)
+        var title2Width = 0.0
+        var totalWidth = title1Width
+        if let title2 {
+            title2Width = title2.widthOfString(usingUIFont: uiFont, 
sizeCategory)
+            let totalStr = title1 + " " + title2
+            totalWidth = totalStr.widthOfString(usingUIFont: uiFont, 
sizeCategory)
+        }
+
+    let logStr = String(format: "image: %.2f   title: %.2f   total: %.2f", 
imageWidth, max(title1Width, title2Width), totalWidth)
+    print(logStr)
+        return imageWidth + (isHorizontal ? totalWidth
+                                          : max(title1Width, title2Width))
     }
 
     var body: some View {
-        let (title1, title2) = title
-        HStack(spacing: 0) {
-            let pendingColor = WalletColors().pendingColor(incoming)
+        let pendingColor = WalletColors().pendingColor(incoming)
+        let imageName = incoming ? "plus.diamond"       //  goforward.plus   
circle
+                                 : "minus.diamond"      //
+        HStack(spacing: 8) {
             Image(systemName: imageName)
                 .foregroundColor(pendingColor)
                 .accessibilityFont(.largeTitle)
                 .accessibility(hidden: true)
-//                .padding(.trailing)
-            Text(horizontal ? (title1 + "\n" + title2)
-                            : (title1 + " " + title2))
-                .lineLimit(2)
+
+            Text(title(titles, isHorizontal))
+                .lineLimit(4)
                 .accessibilityFont(.body)
         }
     }
 }
 
-struct PendingAmountView: View {
-    let amount: Amount
-    let currencyInfo: CurrencyInfo?
-    let incoming: Bool
-
-    public static func amountStr(amount: Amount, currencyInfo: CurrencyInfo?, 
incoming: Bool) -> String {
-        let sign = incoming ? "+ " : "- "
-        let amountStr = currencyInfo?.string(for: amount.valueAsTuple)
-        return sign + (amountStr ?? amount.valueStr)
-    }
-    
-    public static func width(amount: Amount, currencyInfo: CurrencyInfo?, 
incoming: Bool) -> CGFloat {
-        let valueStr = Self.amountStr(amount: amount, currencyInfo: 
currencyInfo, incoming: incoming)
-        let uiFont = TalerFont.uiFont(.title)
-        let width = valueStr.widthOfString(usingUIFont: uiFont)
-//    print("Amount width: ", width)
-        return width
-    }
-
-    var body: some View {
-        let pendingColor = WalletColors().pendingColor(incoming)
-        let valueStr = Self.amountStr(amount: amount, currencyInfo: 
currencyInfo, incoming: incoming)
-        Text(valueStr)
-            .foregroundColor(pendingColor)
-            .accessibilityFont(.title)
-            .monospacedDigit()
-    }
-}
-
-struct PendingLabel: View {
-    let amount: Amount
-    let currencyInfo: CurrencyInfo?
-    let incoming: Bool
-    let horizontal: Bool        // true: HStack{ image + pending Xcoming + 
amount }
-    let title: (String, String)
-    let imageName: String
-
-    var body: some View {
-        Group {         // can either be horizontal (preferred) or vertical 
(if doesn't fit horizontally)
-            InOrOutView(title: title, horizontal: horizontal, incoming: 
incoming, imageName: imageName)
-            if horizontal {     // Group is an HStack already => just add 
Spacer + Amount
-                Spacer(minLength: 0)
-                PendingAmountView(amount: amount, currencyInfo: currencyInfo, 
incoming: incoming)
-            } else {            // Group is a VStack => need HStack + Spacer 
to shift Amount to the trailing edge
-                HStack(spacing: 0) {
-                    Spacer(minLength: 0)
-                    PendingAmountView(amount: amount, currencyInfo: 
currencyInfo, incoming: incoming)
-}   }   }   }   }
-
 /// This view shows a pending transaction row in a currency section
 struct PendingRowView: View {
     let amount: Amount
     let currencyInfo: CurrencyInfo?
     let incoming: Bool
 
-    let inTitle1 = String(localized: "pending", comment: "Top of line <pending 
incoming>")
+    @Environment(\.sizeCategory) var sizeCategory
+    @AppStorage("iconOnly") var iconOnly: Bool = false
+
+    let inTitle0 = String(localized: "Incoming", comment: "Abbreviation 
<pending incoming>")
+    let inTitle1 = String(localized: "Pending", comment: "Top of line <Pending 
incoming>")
     let inTitle2 = String(localized: "incoming", comment: "Bottom of line 
<pending incoming>")
-    let outTitle1 = String(localized: "pending", comment: "Top of line 
<pending outgoing>")
+    let outTitle0 = String(localized: "Outgoing", comment: "Abbreviation 
<pending outgoing>")
+    let outTitle1 = String(localized: "Pending", comment: "Top of line 
<Pending outgoing>")
     let outTitle2 = String(localized: "outgoing", comment: "Bottom of line 
<pending outgoing>")
 
-    func needVStack(available: CGFloat, inOrOutWidth: CGFloat, valueWidth: 
CGFloat) -> Bool {
-        available < (inOrOutWidth + valueWidth + 40)
+    func needVStack(available: CGFloat, contentWidth: CGFloat, valueWidth: 
CGFloat) -> Bool {
+        if available > 20 {
+            let logStr = String(format: "available: %.2f   sum: %.2f = 
content: %.2f  + value: %.2f",
+                                available, contentWidth + valueWidth, 
contentWidth, valueWidth)
+            print(logStr)
+        }
+        return available < (contentWidth + valueWidth + 20)
     }
 
     var body: some View {
-        let imageName = incoming ? "text.badge.plus"
-                                 : "text.badge.minus"
-        let imageStr = String("\(Image(systemName: imageName))")
+        let pendingColor = WalletColors().pendingColor(incoming)
         SingleAxisGeometryReader { width in
             Group {
-                let title = incoming ? (inTitle1, inTitle2)
-                                     : (outTitle1, outTitle2)
-                let inOrOutWidth = InOrOutView.width(image1: imageStr,
-                                                     title1: incoming ? 
inTitle1 : outTitle1,
-                                                     title2: incoming ? 
inTitle2 : outTitle2)
-                let valueWidth = PendingAmountView.width(amount: amount,
-                                                   currencyInfo: currencyInfo,
-                                                       incoming: incoming)
-//    let _ = print(width, " - ", inOrOutWidth + valueWidth, " = ", width - 
(inOrOutWidth + valueWidth))
-                if needVStack(available: width, inOrOutWidth: inOrOutWidth, 
valueWidth: valueWidth) {
-                    VStack(alignment: .leading, spacing: 0) {
-                        PendingLabel(amount: amount, currencyInfo: 
currencyInfo,
-                                   incoming: incoming, horizontal: false,
-                                      title: title,     imageName: imageName)
-                    }
-                } else {
-                    HStack(spacing: 0) {
-                        PendingLabel(amount: amount, currencyInfo: 
currencyInfo,
-                                   incoming: incoming, horizontal: true,
-                                      title: title,     imageName: imageName)
-                    }
+                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 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)
                 }
             }
-            .accessibilityElement(children: .combine)
         }
     }
 }
diff --git a/TalerWallet1/Views/Balances/TwoRowButtons.swift 
b/TalerWallet1/Views/Balances/TwoRowButtons.swift
index 163b703..423f4fd 100644
--- a/TalerWallet1/Views/Balances/TwoRowButtons.swift
+++ b/TalerWallet1/Views/Balances/TwoRowButtons.swift
@@ -5,24 +5,37 @@
 import SwiftUI
 import taler_swift
 
+extension View {
+    func title(_ titles: (String, String?), _ fitsSideBySide: Bool) -> String {
+        let delimiter = fitsSideBySide ? "\n" : " "
+        let (title1, title2) = titles
+        if let title2 {
+            return title1 + delimiter + title2
+        } else {
+            return title1
+        }
+    }
+}
 struct TwoRowButtons: View {
-    let sendTitle: String
-    let recvTitle: String
+    let sendTitles: (String, String?)
+    let recvTitles: (String, String?)
+    let fitsSideBySide: Bool
     let lineLimit: Int
     let sendDisabled: Bool
     let sendAction: () -> Void
     let recvAction: () -> Void
     @Environment(\.sizeCategory) var sizeCategory
+    
 
     var body: some View {
         Group {
-            Button(sendTitle, action: sendAction)
+            Button(title(sendTitles, fitsSideBySide), action: sendAction)
                 .lineLimit(lineLimit)
                 .disabled(sendDisabled)
                 .buttonStyle(TalerButtonStyle(type: .bordered,
                                             dimmed: false,
                                            aligned: .center))
-            Button(recvTitle, action: recvAction)
+            Button(title(recvTitles, fitsSideBySide), action: recvAction)
                 .lineLimit(lineLimit)
                 .disabled(false)
                 .buttonStyle(TalerButtonStyle(type: .bordered,
@@ -35,15 +48,17 @@ struct TwoRowButtons: View {
 struct TwoRowButtons_Previews: PreviewProvider {
     static var previews: some View {
         List {
-                TwoRowButtons(sendTitle: "Send\n" + TESTCURRENCY,
-                              recvTitle: "Receive\n" + LONGCURRENCY,
-                              lineLimit: 2, sendDisabled: true,
-                             sendAction: {}, recvAction: {})
+                TwoRowButtons(sendTitles: ("Send", TESTCURRENCY),
+                              recvTitles: ("Receive", LONGCURRENCY),
+                          fitsSideBySide: false,
+                               lineLimit: 2, sendDisabled: true,
+                              sendAction: {}, recvAction: {})
                 .listRowSeparator(.hidden)
-                TwoRowButtons(sendTitle: "Send\n" + DEMOCURRENCY,
-                              recvTitle: "Receive\n" + DEMOCURRENCY,
-                              lineLimit: 2, sendDisabled: true,
-                             sendAction: {}, recvAction: {})
+                TwoRowButtons(sendTitles: ("Send", DEMOCURRENCY),
+                              recvTitles: ("Receive", DEMOCURRENCY),
+                          fitsSideBySide: true,
+                               lineLimit: 2, sendDisabled: true,
+                              sendAction: {}, recvAction: {})
                 .listRowSeparator(.hidden)
         }
     }
diff --git a/TalerWallet1/Views/Exchange/ExchangeRowView.swift 
b/TalerWallet1/Views/Exchange/ExchangeRowView.swift
index f1cf984..7674c20 100644
--- a/TalerWallet1/Views/Exchange/ExchangeRowView.swift
+++ b/TalerWallet1/Views/Exchange/ExchangeRowView.swift
@@ -11,6 +11,7 @@ struct ExchangeRowView: View {
 //    let amount: Amount
     let currency: String
     @Binding var centsToTransfer: UInt64
+    @AppStorage("iconOnly") var iconOnly: Bool = false
 
     @Environment(\.sizeCategory) var sizeCategory
     @State private var buttonSelected: Int? = nil
@@ -27,10 +28,32 @@ struct ExchangeRowView: View {
 //        }
     }
 
-    let depositTitle = String(localized: "Deposit", comment: "Top of button 
<Deposit (currency)>")
-    let withdrawTitle = String(localized: "Withdraw", comment: "Top of button 
<Withdraw (currency)>")
+
+//    func
+    func titles(_ title: String) -> (String, String?) {
+        if let separatorIndex = title.firstIndex(of: "\n") {
+            let title1 = String(title[..<separatorIndex])
+            let title2 = String(title[title.index(separatorIndex, offsetBy: 
1)...])
+            return (title1, title2)
+        }
+        return (title, nil)
+    }
+
+    func titles(_ titles: (String, String?), uiFont: UIFont) -> [(String, 
UIFont)] {
+        let (title1, title2) = titles
+        if let title2 {
+            return [(title1, uiFont), (title2, uiFont)]
+        }
+        return [(title1, uiFont)]
+    }
 
     var body: some View {
+        let depositTitle0 = String(localized: "Deposit", comment: 
"Abbreviation <Deposit (currency)>")
+        let depositTitle1 = String(localized: "Deposit\n\(currency)",
+                                   comment: "Button <Deposit (currency)>, must 
have ONE \n and ONE %s")
+        let withdrawTitle0 = String(localized: "Withdraw", comment: 
"Abbreviation <Withdraw (currency)>")
+        let withdrawTitle1 = String(localized: "Withdraw\n\(currency)",
+                                    comment: "Button <Withdraw (currency)>, 
must have ONE \n and ONE %s")
         let baseURL = exchange.exchangeBaseUrl
 
         HStack(spacing: 0) {    // can't use the built in Label because it 
adds the accessory arrow
@@ -52,17 +75,25 @@ struct ExchangeRowView: View {
         SingleAxisGeometryReader { width in
             Group {
                 let uiFont = TalerFont.uiFont(.title3)
-                let titles = [(depositTitle, uiFont), (withdrawTitle, uiFont), 
(currency, uiFont)]
-                let sendTitle = depositTitle + "\n" + currency                 
         // TODO:  amount.currencyStr
-                let recvTitle = withdrawTitle + "\n" + currency                
         // TODO:  amount.currencyStr
-                let twoRowButtons = TwoRowButtons(sendTitle: sendTitle, 
recvTitle: recvTitle,
-                                                  lineLimit: 5, sendDisabled: 
true,     // TODO: amount.isZero
-                                                 sendAction: { 
selectAndUpdate(1) },
-                                                 recvAction: { 
selectAndUpdate(2) })
-                if Self.needVStack(titles, width: width, correctForSize: 1.0, 
spacing: HSPACING + 4) {
-                    VStack { twoRowButtons }
-                } else {
+                let (deposit1, deposit2) = titles(depositTitle1)
+                let (withdraw1, withdraw2) = titles(withdrawTitle1)
+                let titles = iconOnly ? [(depositTitle0, uiFont), 
(withdrawTitle0, uiFont)]
+                                      : titles((deposit1, deposit2), uiFont: 
uiFont) +
+                                        titles((withdraw1, withdraw2), uiFont: 
uiFont)
+                let fitsSideBySide = Self.fitsSideBySide(titles, 
availableWidth: width,
+                                                         sizeCategory: 
sizeCategory, padding: 10)
+                                                                               
     // TODO:  amount.currencyStr
+                let twoRowButtons = TwoRowButtons(sendTitles: iconOnly ? 
(depositTitle0, nil)  : (deposit1, deposit2),
+                                                  recvTitles: iconOnly ? 
(withdrawTitle0, nil) : (withdraw1, withdraw2),
+                                              fitsSideBySide: fitsSideBySide,
+                                                   lineLimit: 5,
+                                                sendDisabled: true,            
 // TODO: availableAmount.isZero
+                                                  sendAction: { 
selectAndUpdate(1) },
+                                                  recvAction: { 
selectAndUpdate(2) })
+                if fitsSideBySide {
                     HStack(spacing: HSPACING) { twoRowButtons }
+                } else {
+                    VStack { twoRowButtons }
                 }
             }
         }
diff --git a/TalerWallet1/Views/HelperViews/AmountRowV.swift 
b/TalerWallet1/Views/HelperViews/AmountRowV.swift
new file mode 100644
index 0000000..b3140e7
--- /dev/null
+++ b/TalerWallet1/Views/HelperViews/AmountRowV.swift
@@ -0,0 +1,91 @@
+/*
+ * This file is part of GNU Taler, ©2022-23 Taler Systems S.A.
+ * See LICENSE.md
+ */
+import SwiftUI
+import taler_swift
+
+// calculate the width of the amountStr (with Font)
+// calculate the width of 'content' in compact form
+// if it fits side by side, then render HStack(content(compact), Spacer(), 
amountStr)
+// else render VStack(content(wide), HStack(Spacer(), amountStr))
+
+struct AmountRowV<Content: View>: View {
+    let amountStr: String
+    let amountColor: Color
+    let largeAmountFont: Bool
+    let fitsHorizontal: Bool
+    let vertAlignment: VerticalAlignment
+
+    var content: () -> Content
+
+
+    var body: some View {
+        if fitsHorizontal {
+            HStack(alignment: vertAlignment, spacing: 0) {
+                content()
+                Spacer(minLength: 0)
+                Text(amountStr)
+                    .foregroundColor(amountColor)
+                    .accessibilityFont(largeAmountFont ? .title : .title2)
+                    .monospacedDigit()
+            }
+        } else {
+            VStack(alignment: .leading, spacing: 0) {
+                content()
+                HStack {
+                    Spacer(minLength: 0)
+                    Text(amountStr)
+                        .foregroundColor(amountColor)
+                        .accessibilityFont(largeAmountFont ? .title : .title2)
+                        .monospacedDigit()
+                }
+            }
+        }
+    }
+}
+// MARK: -
+#if  DEBUG
+
+struct SectionWithAmountRow: View {
+    @Environment(\.sizeCategory) var sizeCategory
+    var body: some View {
+        let testInfo = PreviewCurrencyInfo(TESTCURRENCY, digits: 0)
+        let demoInfo = PreviewCurrencyInfo(DEMOCURRENCY, digits: 2)
+        let test = try! Amount(fromString: TESTCURRENCY + ":1.23")
+        let demo = try! Amount(fromString: DEMOCURRENCY + ":1234.12")
+        let testStr = test.string(testInfo)
+        let demoStr = demo.string(demoInfo)
+        List {
+            Section {
+                AmountRowV(amountStr: demoStr, amountColor: .primary, 
largeAmountFont: true,
+                           fitsHorizontal: true, vertAlignment: 
.lastTextBaseline) {
+                    Text("Balance")
+                        .accessibilityFont(.title2)
+                }
+                AmountRowV(amountStr: demoStr, amountColor: .primary, 
largeAmountFont: true,
+                           fitsHorizontal: false, vertAlignment: 
.lastTextBaseline) {
+                    Text("Balance")
+                        .accessibilityFont(.title2)
+                }
+            }
+            Section {
+                AmountRowV(amountStr: testStr, amountColor: .secondary, 
largeAmountFont: false,
+                           fitsHorizontal: true, vertAlignment: 
.lastTextBaseline) {
+                    Text("Balance")
+                        .accessibilityFont(.title2)
+                }
+                AmountRowV(amountStr: testStr, amountColor: .secondary, 
largeAmountFont: false,
+                           fitsHorizontal: false, vertAlignment: 
.lastTextBaseline) {
+                    Text("Balance")
+                        .accessibilityFont(.title2)
+                }
+            }
+        }
+    }
+}
+
+#Preview {
+    SectionWithAmountRow()
+}
+#endif
diff --git a/TalerWallet1/Views/HelperViews/View+fitsSideBySide.swift 
b/TalerWallet1/Views/HelperViews/View+fitsSideBySide.swift
new file mode 100644
index 0000000..a76011c
--- /dev/null
+++ b/TalerWallet1/Views/HelperViews/View+fitsSideBySide.swift
@@ -0,0 +1,63 @@
+/*
+ * This file is part of GNU Taler, ©2022-23 Taler Systems S.A.
+ * See LICENSE.md
+ */
+import SwiftUI
+import UIKit
+
+extension View {
+    /// if sameSize then this searches for the longest title
+    /// returns true if any of the strings in 'titles' wouldn't fit in a view 
1/'numViews' of the size of 'width', with 'spacing'
+    /// if !sameSize then all titles are added with spacing
+    static func fitsSideBySide(_ titles: [(String, UIFont)],
+                         availableWidth: CGFloat,                       // 
total width available
+                           sizeCategory: ContentSizeCategory,
+                                spacing: CGFloat = HSPACING,            // 
between titles
+                                padding: CGFloat = 20,
+                               sameSize: Bool = true,
+                               numViews: Int = 2)
+    -> Bool {
+//        let padding = 20.0        // TODO: depend on myListStyle
+        let totalSpacing = spacing * CGFloat(numViews - 1)
+        var totalWidth = padding + totalSpacing
+
+        var maxTitleWidth = 0.0
+        var minTitleWidth = 1000.0
+        for (title, uiFont) in titles {
+            let titleWidth = title.widthOfString(usingUIFont: uiFont, 
sizeCategory)
+            if titleWidth > maxTitleWidth {
+                maxTitleWidth = titleWidth
+            }
+            if titleWidth < minTitleWidth {
+                minTitleWidth = titleWidth
+            }
+//            if availableWidth > 20 {
+//                let widthStr = String(format: "%.2f + %.2f = %.2f", 
totalWidth, titleWidth, totalWidth + titleWidth)
+//                print("❗️  \(title)  \(widthStr)")
+//            }
+            totalWidth += titleWidth
+        }
+
+        if sameSize {
+            let nettoWidth = availableWidth - totalSpacing
+            let singleWidth = nettoWidth / CGFloat(numViews)
+            let neededWidth = padding + maxTitleWidth
+//            if availableWidth > 20 {
+//                let width1Str = String(format: "%.2f -spacing %.2f = %.2f / 
%d = %.2f", availableWidth, totalSpacing,
+//                                       nettoWidth, numViews, singleWidth)
+//                let width2Str = String(format: "%.2f +padding %.2f = %.2f", 
maxTitleWidth, padding, maxTitleWidth + padding)
+//                print("❗️ available: \(width1Str)   needed: \(width2Str)")
+//            }
+            return neededWidth < singleWidth
+        } else {
+//            if availableWidth > 20 {
+//                let totalStr = String(format: "%.2f -spacing %.2f = %.2f 
-padding %.2f = %.2f", totalWidth, totalSpacing,
+//                                      totalWidth - totalSpacing, padding, 
totalWidth - totalSpacing - padding)
+//                print("❗️ view width: \(availableWidth)   total: 
\(totalStr)")
+//                let (amount, font) = titles[1]
+//                print("❗️ view width: \(width)   total: \(totalStr)  min: 
\(minTitleWidth)  max: \(maxTitleWidth)  \(amount)")
+//            }
+            return totalWidth < availableWidth
+        }
+    }
+}
diff --git a/TalerWallet1/Views/HelperViews/View+needVStack.swift 
b/TalerWallet1/Views/HelperViews/View+needVStack.swift
deleted file mode 100644
index 689a81d..0000000
--- a/TalerWallet1/Views/HelperViews/View+needVStack.swift
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * This file is part of GNU Taler, ©2022-23 Taler Systems S.A.
- * See LICENSE.md
- */
-import SwiftUI
-import UIKit
-
-extension View {
-    /// if sameSize then this searches for the longest title
-    /// returns true if any of the strings in 'titles' wouldn't fit in a view 
1/'numViews' of the size of 'width', with 'spacing'
-    /// if !sameSize then all titles are added with spacing
-    static func needVStack(_ titles: [(String, UIFont)],
-                              width: CGFloat,           // total width 
available
-                     correctForSize: CGFloat,
-                            spacing: CGFloat,           // between titles
-                           sameSize: Bool = true,
-                           numViews: Int = 2)
-    -> Bool {
-        let padding: CGFloat = 20        // TODO: depend on myListStyle
-        let totalSpacing = spacing * CGFloat(numViews - 1)
-        var totalWidth = padding + totalSpacing
-
-        var maxTitleWidth: CGFloat = 0
-        var minTitleWidth: CGFloat = 1000
-        for (title, uiFont) in titles {
-            let titleWidth = title.widthOfString(usingUIFont: uiFont)
-            let fixWidth = round(CGFloat(Int(20 * titleWidth * 
correctForSize))) / 20
-            if fixWidth > maxTitleWidth {
-                maxTitleWidth = fixWidth
-            }
-            if fixWidth < minTitleWidth {
-                minTitleWidth = fixWidth
-            }
-            totalWidth += fixWidth
-        }
-
-        if sameSize {
-            let availableWidth = (width / CGFloat(numViews)) - totalSpacing
-            let neededWidth = padding + maxTitleWidth
-//            if width > 20 {
-//                print("❗️ available: \(availableWidth)   needed: 
\(neededWidth)")
-//            }
-            return neededWidth > availableWidth
-        } else {
-//            if width > 20 {
-//                let (amount, font) = titles[1]
-//                print("❗️ view width: \(width)   total: \(totalWidth)  min: 
\(minTitleWidth)  max: \(maxTitleWidth)  \(amount)")
-//            }
-            return totalWidth > width
-        }
-    }
-
-    static func correctForSize(_ sizeCategory: ContentSizeCategory) -> CGFloat 
{
-        return switch sizeCategory {
-            case .extraSmall: 0.7
-            case .small: 0.8
-            case .medium: 0.9
-            case .large: 1.0
-            case .extraLarge: 1.15
-            case .extraExtraLarge: 1.25
-            case .extraExtraExtraLarge: 1.33
-            case .accessibilityMedium: 1.52
-            case .accessibilityLarge: 1.8
-            case .accessibilityExtraLarge: 2.0
-            case .accessibilityExtraExtraLarge: 2.2
-            case .accessibilityExtraExtraExtraLarge: 2.5
-            default: 1.0
-        }
-    }
-}
diff --git a/TalerWallet1/Views/Main/MainView.swift 
b/TalerWallet1/Views/Main/MainView.swift
index a53dfb7..301ad27 100644
--- a/TalerWallet1/Views/Main/MainView.swift
+++ b/TalerWallet1/Views/Main/MainView.swift
@@ -139,8 +139,16 @@ extension MainView {
 
         var body: some View {
 #if DEBUG
-            let _ = Self._printChanges()
-            let _ = symLog?.vlog()       // just to get the # to compare it 
with .onAppear & onDisappear
+            // "@self" marks that the view value itself has changed, and 
"@identity" marks that the
+            // identity of the view has changed (that is, that the persistent 
data associated with
+            // the view has been recycled for a new instance of the same type)
+            if #available(iOS 17.1, *) {
+                // logs at INFO level, “com.apple.SwiftUI” subsystem, category 
“Changed Body Properties”
+                let _ = Self._logChanges()
+            } else {
+                let _ = Self._printChanges()
+            }
+            let _ = symLog?.vlog()       // just to get the identity # to 
compare with .onAppear & .onDisappear
 #endif
           Group {
 #if TABBAR  // Taler Wallet
diff --git a/TalerWallet1/Views/Peer2peer/PaymentPurpose.swift 
b/TalerWallet1/Views/Peer2peer/PaymentPurpose.swift
index a203c4f..42e919c 100644
--- a/TalerWallet1/Views/Peer2peer/PaymentPurpose.swift
+++ b/TalerWallet1/Views/Peer2peer/PaymentPurpose.swift
@@ -15,18 +15,13 @@ struct PaymentPurpose: View {
     let fee: String
     @Binding var summary: String
     @Binding var expireDays: UInt
-//    var deactivateAction: () -> Void
 
     @FocusState private var isFocused: Bool
 
-//    let formatter = CurrencyFormatter.shared    // TODO: based on currency
-//    let buttonFont: Font = .talerTitle2
-
     private var label: String {
 //        let mag = pow(10, formatter.maximumFractionDigits)
 //        return formatter.string(for: Decimal(centsToTransfer) / mag) ?? ""
-
-        return String(centsToTransfer / 100)
+        return String(centsToTransfer / 100)   // TODO: based on currency
     }
 
     var body: some View {
@@ -89,11 +84,10 @@ struct PaymentPurpose: View {
         .background(WalletColors().backgroundColor.edgesIgnoringSafeArea(.all))
         .onAppear {
             DebugViewC.shared.setViewID(VIEW_RECEIVE_PURPOSE, stack: 
stack.push())
-            print("❗️ PaymentPurpose onAppear")
+//            print("❗️ PaymentPurpose onAppear")
         }
         .onDisappear {
-            print("❗️ PaymentPurpose onDisappear")
-//            deactivateAction()
+//            print("❗️ PaymentPurpose onDisappear")
         }
     }
 
@@ -110,7 +104,6 @@ struct PaymentPurpose: View {
 //                             fee: "fee",
 //                         summary: $summary,
 //                      expireDays: $expireDays)
-//        { print("deactivateAction") }
 //    }
 //}
 #endif
diff --git a/TalerWallet1/Views/Peer2peer/SendPurpose.swift 
b/TalerWallet1/Views/Peer2peer/SendPurpose.swift
index 3bbb947..bbe11af 100644
--- a/TalerWallet1/Views/Peer2peer/SendPurpose.swift
+++ b/TalerWallet1/Views/Peer2peer/SendPurpose.swift
@@ -16,15 +16,11 @@ struct SendPurpose: View {
     let fee: String
     @Binding var summary: String
     @Binding var expireDays: UInt
-//    var deactivateAction: () -> Void
-
-//    let formatter = CurrencyFormatter.shared    // TODO: based on currency
 
     private var value: String {
 //        let mag = pow(10, formatter.maximumFractionDigits)
 //        return formatter.string(for: Decimal(centsToTransfer) / mag) ?? ""
-
-        return String(centsToTransfer / 100)
+        return String(centsToTransfer / 100)    // TODO: based on currency
     }
 
     var body: some View {
@@ -106,11 +102,10 @@ struct SendPurpose: View {
         .background(WalletColors().backgroundColor.edgesIgnoringSafeArea(.all))
         .onAppear {
             DebugViewC.shared.setViewID(VIEW_SEND_PURPOSE, stack: stack.push())
-            print("❗️ SendPurpose onAppear")
+//            print("❗️ SendPurpose onAppear")
         }
         .onDisappear {
-            print("❗️ SendPurpose onDisappear")
-//            deactivateAction()
+//            print("❗️ SendPurpose onDisappear")
         }
         .task {
             symLog.log(".task")
@@ -135,7 +130,6 @@ struct SendPurpose: View {
 //                                fee: "0,43",
 //                            summary: $summary,
 //                         expireDays: $expireDays)
-//        { print("deactivateAction") }
 //    }
 //}
 #endif
diff --git a/TalerWallet1/Views/Transactions/TransactionRowView.swift 
b/TalerWallet1/Views/Transactions/TransactionRowView.swift
index 3eaaa76..fc28f09 100644
--- a/TalerWallet1/Views/Transactions/TransactionRowView.swift
+++ b/TalerWallet1/Views/Transactions/TransactionRowView.swift
@@ -5,24 +5,67 @@
 import SwiftUI
 import taler_swift
 
-struct TransactionRowCenter: View {
+struct TransactionRowContentV: View {
     var centerTop: String
     var centerBottom: String
+    let isHorizontal: Bool
+    let incoming: Bool
+    let foreColor:Color
+
+    public static func width(titles: (String, String?), isHorizontal: Bool,
+                             sizeCategory: ContentSizeCategory) -> CGFloat {
+        let imageFont = TalerFont.uiFont(.largeTitle)
+        let uiFont1 = TalerFont.uiFont(.headline)
+        let uiFont2 = TalerFont.uiFont(.callout)
+
+        let image = "++"
+        let imageWidth = image.widthOfString(usingUIFont: imageFont, 
sizeCategory) + 8.0     // spacing: 8
+        let (title1, title2) = titles
+        let title1Width = title1.widthOfString(usingUIFont: uiFont1, 
sizeCategory)
+        var title2Width = 0.0
+        var totalWidth = title1Width
+        if let title2 {
+            title2Width = title2.widthOfString(usingUIFont: uiFont2, 
sizeCategory)
+            let blankStr = " "
+            totalWidth += blankStr.widthOfString(usingUIFont: uiFont1, 
sizeCategory) + title2Width
+        }
+
+//    let logStr = String(format: "image: %.2f   title: %.2f   total: %.2f", 
imageWidth, max(title1Width, title2Width), totalWidth)
+//    print(logStr)
+        return imageWidth + (isHorizontal ? totalWidth
+                                          : max(title1Width, title2Width))
+    }
 
     var body: some View {
-        VStack(alignment: .leading) {
-            Text(centerTop)
-                .accessibilityFont(.headline)
-//                .fontWeight(.medium)      iOS 16
-                .padding(.bottom, -2.0)
-            Text(centerBottom)
-                .accessibilityFont(.callout)
+        let imageName = incoming ? "plus.circle.fill"
+                                 : "minus.circle.fill"
+        HStack(spacing: 8) {
+            Image(systemName: imageName)
+                .foregroundColor(foreColor)
+                .accessibilityFont(.largeTitle)
+                .accessibility(hidden: true)
+
+            VStack(alignment: .leading) {
+                Text(centerTop)
+                    .accessibilityFont(.headline)
+//                  .fontWeight(.medium)      iOS 16
+                    .padding(.bottom, -2.0)
+                Text(centerBottom)
+                    .accessibilityFont(.callout)
+            }
         }
     }
 }
 
 struct TransactionRowView: View {
-    var transaction : Transaction
+    let transaction : Transaction
+    let currencyInfo: CurrencyInfo?
+
+    @Environment(\.sizeCategory) var sizeCategory
+
+    func needVStack(available: CGFloat, contentWidth: CGFloat, valueWidth: 
CGFloat) -> Bool {
+        available < (contentWidth + valueWidth + 40)
+    }
 
     var body: some View {
         let common = transaction.common
@@ -38,26 +81,23 @@ struct TransactionRowView: View {
                       : done ? WalletColors().transactionColor(incoming)
                              : WalletColors().uncompletedColor
 
-        HStack(spacing: 6) {
-            Image(systemName: incoming ? "text.badge.plus" : 
"text.badge.minus")
-                .foregroundColor(foreColor)
-                .accessibilityFont(.largeTitle)
-                .accessibility(hidden: true)
+        SingleAxisGeometryReader { width in
+            Group {
+                let amountStr = amount.string(currencyInfo)
+                let amountWidth = amountStr.width(largeAmountFont: false, 
sizeCategory)
+
+                let contentWidth = TransactionRowContentV.width(titles: 
(transaction.localizedType, dateString),
+                                                          isHorizontal: false, 
sizeCategory: sizeCategory)
+                let needVStack = needVStack(available: width, contentWidth: 
contentWidth, valueWidth: amountWidth)
+
+                AmountRowV(amountStr: amountStr, amountColor: foreColor, 
largeAmountFont: false,
+                           fitsHorizontal: !needVStack, vertAlignment: 
.center) {
 
-            TransactionRowCenter(centerTop: transaction.localizedType,
-                                 centerBottom: dateString)
-            Spacer()
-            VStack(alignment: .trailing) {
-                let sign = incoming ? "+" : "-"
-                let valueStr = sign + amount.valueStr
-                Text(valueStr)
-                    .foregroundColor(foreColor)
-                    .accessibilityFont(.title)
-                    .monospacedDigit()
+                    TransactionRowContentV(centerTop: 
transaction.localizedType,
+                                           centerBottom: dateString, 
isHorizontal: true, incoming: incoming, foreColor: foreColor)
+                }
             }
         }
-        .accessibilityElement(children: .combine)
-        .padding(.top)
     }
 }
 // MARK: -
@@ -72,9 +112,13 @@ struct TransactionRow_Previews: PreviewProvider {
                                            id: "some payment ID",
                                          time: Timestamp(from: 
1_666_666_000_000))
     static var previews: some View {
+        let testInfo = PreviewCurrencyInfo(TESTCURRENCY, digits: 0)
+        let demoInfo = PreviewCurrencyInfo(TESTCURRENCY, digits: 2)
+        let test = try! Amount(fromString: TESTCURRENCY + ":1.23")
+        let demo = try! Amount(fromString: DEMOCURRENCY + ":1234.56")
         List {
-            TransactionRowView(transaction: withdrawal)
-            TransactionRowView(transaction: payment)
+            TransactionRowView(transaction: withdrawal, currencyInfo: testInfo)
+            TransactionRowView(transaction: payment, currencyInfo: demoInfo)
         }
     }
 }
diff --git a/TalerWallet1/Views/Transactions/TransactionsListView.swift 
b/TalerWallet1/Views/Transactions/TransactionsListView.swift
index 8322ba5..6dc1a4b 100644
--- a/TalerWallet1/Views/Transactions/TransactionsListView.swift
+++ b/TalerWallet1/Views/Transactions/TransactionsListView.swift
@@ -11,7 +11,7 @@ struct TransactionsListView: View {
     @AppStorage("myListStyle") var myListStyle: MyListStyle = .automatic
     let navTitle: String
 
-    let currency: String
+    let currencyInfo: CurrencyInfo?
     let transactions: [Transaction]
     let showUpDown: Bool
     let reloadAllAction: (_ stack: CallStack) async -> ()
@@ -30,7 +30,7 @@ struct TransactionsListView: View {
             List {
                 TransactionsRowsView(symLog: symLog,
                                       stack: stack.push(),
-                                   currency: currency,
+                               currencyInfo: currencyInfo,
                                transactions: transactions,
 //                          reloadAllAction: reloadAllAction,
                             reloadOneAction: reloadOneAction)
@@ -68,7 +68,8 @@ struct TransactionsListView: View {
         }
         .overlay {
             if transactions.isEmpty {
-                TransactionsEmptyView(stack: stack.push(), currency: currency)
+                let unknown = String(localized: "Unknown currency")
+                TransactionsEmptyView(stack: stack.push(), currency: 
currencyInfo?.scope.currency ?? unknown)
             }
         }
         .onAppear {
@@ -81,7 +82,7 @@ struct TransactionsListView: View {
 struct TransactionsRowsView: View {
     let symLog: SymLogV?
     let stack: CallStack
-    let currency: String
+    let currencyInfo: CurrencyInfo?
     let transactions: [Transaction]
 //  let reloadAllAction: (_ stack: CallStack) async -> ()
     let reloadOneAction: ((_ transactionId: String) async throws -> 
Transaction)
@@ -112,7 +113,7 @@ struct TransactionsRowsView: View {
                                    resumeAction: resumeAction)
                 }
             } label: {
-                TransactionRowView(transaction: transaction)
+                TransactionRowView(transaction: transaction, currencyInfo: 
currencyInfo)
             }
             .id(Int(index))
         }
diff --git a/TestFlight/WhatToTest.en-US.txt b/TestFlight/WhatToTest.en-US.txt
index ba7456a..f19988a 100644
--- a/TestFlight/WhatToTest.en-US.txt
+++ b/TestFlight/WhatToTest.en-US.txt
@@ -1,4 +1,9 @@
 
+Version 0.9.3 (23)
+
+- Fixed layout for Pending + Transactions for dynamic font sizes
+
+
 Version 0.9.3 (22)
 
 - Fixed layout for Balances for dynamic font sizes

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]