taler-ios

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

commit 9729eecb9c94b25d25cad4a85c1260ae03be3a75
parent 356f482f84847640b809bfe6ac4812303c601669
Author: Marc Stibane <marc@taler.net>
Date:   Thu,  4 Jan 2024 17:50:30 +0100

Layout Balances

Diffstat:
MTalerWallet1/Views/Balances/BalanceRowView.swift | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
MTalerWallet1/Views/Balances/BalancesSectionView.swift | 42+++++++++++++++++++++++++++++-------------
2 files changed, 83 insertions(+), 33 deletions(-)

diff --git a/TalerWallet1/Views/Balances/BalanceRowView.swift b/TalerWallet1/Views/Balances/BalanceRowView.swift @@ -9,34 +9,60 @@ struct BalanceButton: View { let amountStr: String let sizeCategory: ContentSizeCategory let rowAction: () -> Void + let balanceDest: LazyView<TransactionsListView>? @Environment(\.colorSchemeContrast) private var colorSchemeContrast @AppStorage("iconOnly") var iconOnly: Bool = false + /// 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 balanceTitleStr = String(localized: "Balance:", comment: "Main view") - Button(action: rowAction) { - SingleAxisGeometryReader { width in // e.g. 301 instead of 313 => padding = 6 - Group { - let title = iconOnly ? "" : balanceTitleStr - let titles = [(balanceTitleStr, TalerFont.uiFont(.title2)), - (amountStr, TalerFont.uiFont(.title))] - let fitsSideBySide = iconOnly || Self.fitsSideBySide(titles, availableWidth: width, - sizeCategory: sizeCategory, - padding: 20, sameSize: false) - AmountRowV(amountStr: amountStr, amountColor: .primary, doneOrPending: true, largeAmountFont: true, - fitsHorizontal: fitsSideBySide, vertAlignment: .lastTextBaseline) { - Text(title) - .accessibilityFont(.title2) - .foregroundColor(colorSchemeContrast == .increased ? .primary : .secondary) - } + let amountText = Text(amountStr) + .accessibilityFont(.title) + .foregroundColor(.primary) + .monospacedDigit() + let hLayout = HStack(spacing: 0) { + Spacer(minLength: 0) + amountText + } + let balanceCell = Group { + if iconOnly { + hLayout + } else { + let balanceText = Text("Balance:", comment: "Main view") + .accessibilityFont(.title2) + .foregroundColor(colorSchemeContrast == .increased ? .primary : .secondary) + let vLayout = VStack(alignment: .leading, spacing: 0) { + balanceText + hLayout } + + if #available(iOS 16.0, *) { + ViewThatFits(in: .horizontal) { + HStack(spacing: HSPACING) { + balanceText + hLayout + } + vLayout + } + } else { vLayout } // view for iOS 15 } + } +#if TABBAR // Taler Wallet + NavigationLink { balanceDest } label: { + balanceCell + .accessibilityElement(children: .combine) + .accessibilityHint("Will go to main transactions list.") + } +#else // GNU Taler + Button(action: rowAction) { + balanceCell } .disabled(false) .buttonStyle(TalerButtonStyle(type: iconOnly ? .plain : .balance, aligned: .trailing)) .accessibilityElement(children: .combine) .accessibilityHint("Will go to main transactions list.") // .accessibilityLabel(balanceTitleStr + " " + amountStr) // TODO: CurrencyFormatter! +#endif } } @@ -45,10 +71,12 @@ struct BalanceButton: View { /// Balance: amount /// [Send Money] [Request Payment] struct BalanceRowView: View { + let stack: CallStack let amount: Amount let sendAction: () -> Void let recvAction: () -> Void let rowAction: () -> Void + let balanceDest: LazyView<TransactionsListView>? @Environment(\.sizeCategory) var sizeCategory @EnvironmentObject private var controller: Controller @@ -65,12 +93,14 @@ struct BalanceRowView: View { let requestTitle1 = String(localized: "RequestButton_Full", defaultValue: "Request\tPayment", comment: "`Request Payment´ in Balances - set exactly 1 \\t for line break") var body: some View { - VStack (alignment: .trailing) { + 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) + rowAction: rowAction, + balanceDest: balanceDest) +// .border(.red) let sendTitle = iconOnly ? sendTitle0 : sendTitle1 let requTitle = iconOnly ? requestTitle0 : requestTitle1 @@ -86,7 +116,9 @@ struct BalanceRowView: View { HStack(spacing: HSPACING) { twoRowButtons.makeCopy(fitsSideBySide: true) } +// .border(.red) VStack { twoRowButtons } +// .border(.red) } } else { // view for iOS 15 VStack { twoRowButtons } @@ -107,9 +139,11 @@ struct BalanceRowView_Previews: PreviewProvider { List { Section { - BalanceRowView(amount: demo, sendAction: {}, recvAction: {}, rowAction: {}) + BalanceRowView(stack: CallStack("Preview"), amount: demo, + sendAction: {}, recvAction: {}, rowAction: {}, balanceDest: nil) } - BalanceRowView(amount: test, sendAction: {}, recvAction: {}, rowAction: {}) + BalanceRowView(stack: CallStack("Preview"), amount: test, + sendAction: {}, recvAction: {}, rowAction: {}, balanceDest: nil) } } } diff --git a/TalerWallet1/Views/Balances/BalancesSectionView.swift b/TalerWallet1/Views/Balances/BalancesSectionView.swift @@ -26,6 +26,7 @@ struct BalancesSectionView { @EnvironmentObject private var controller: Controller @AppStorage("iconOnly") var iconOnly: Bool = false + @State private var showSpendingHint = true @State private var isShowingDetailView = false @State private var transactions: [Transaction] = [] @State private var completedTransactions: [Transaction] = [] @@ -61,11 +62,14 @@ extension BalancesSectionView: View { let currencyInfo = controller.info(for: currency, controller.currencyTicker) Section { - if "KUDOS" == currency && !balance.available.isZero { - 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) + let showSpendingButton = "KUDOS" == currency && !balance.available.isZero + if showSpendingButton { + if !iconOnly && showSpendingHint { + Text("You can spend these KUDOS in the Demo Shop, or send them to another wallet.") + .accessibilityFont(.body) + .multilineTextAlignment(.leading) + .listRowSeparator(.hidden) + } } BalancesNavigationLinksView(symLog: symLog, stack: stack.push(), @@ -75,6 +79,16 @@ extension BalancesSectionView: View { completedTransactions: $completedTransactions, reloadAllAction: reloadCompleted, reloadOneAction: reloadOneAction) + if showSpendingButton { + let title = String(localized: "LinkTitle_DEMOSHOP", defaultValue: "Spend test money") + Button(title) { + showSpendingHint = false + UIApplication.shared.open(URL(string:DEMOSHOP)!, options: [:]) + } + .buttonStyle(TalerButtonStyle(type: .bordered, narrow: false, aligned: .center)) + .accessibilityHint("Will go to the demo shop website.") + .listRowSeparator(.hidden) + } if pendingTransactions.count > 0 { BalancesPendingRowView(symLog: symLog, stack: stack.push(), @@ -225,7 +239,7 @@ fileprivate struct BalancesNavigationLinksView: View { }, tag: 2, selection: $buttonSelected ) { EmptyView() }.frame(width: 0).opacity(0).hidden() // RequestPayment - NavigationLink(destination: LazyView { + let balanceDest = LazyView { TransactionsListView(stack: stack.push(), navTitle: String(localized: "Transactions", comment: "ViewTitle of TransactionList"), currency: currency, @@ -233,17 +247,19 @@ fileprivate struct BalancesNavigationLinksView: View { showUpDown: true, reloadAllAction: reloadAllAction, reloadOneAction: reloadOneAction) - }, tag: 3, selection: $buttonSelected - ) { EmptyView() }.frame(width: 0).opacity(0).hidden() // TransactionsListView + } + NavigationLink(destination: balanceDest, tag: 3, selection: $buttonSelected) + { EmptyView() }.frame(width: 0).opacity(0).hidden() // TransactionsListView - BalanceRowView(amount: balance.available, - sendAction: { + BalanceRowView(stack: stack.push(), + amount: balance.available, + sendAction: { selectAndUpdate(1) // trigger SendAmount NavigationLink - }, recvAction: { + }, recvAction: { selectAndUpdate(2) // trigger RequestPayment NavigationLink - }, rowAction: { + }, rowAction: { buttonSelected = 3 // trigger TransactionList NavigationLink - }) + }, balanceDest: balanceDest) } } }