commit f6393725982d29898a539b8c12a6cab95a1957b5
parent 12c22a6d530641e19efb67ea719fd9b49170b6d5
Author: Marc Stibane <marc@taler.net>
Date: Sat, 20 Jul 2024 19:15:29 +0200
BalanceCellV
Diffstat:
2 files changed, 94 insertions(+), 0 deletions(-)
diff --git a/TalerWallet.xcodeproj/project.pbxproj b/TalerWallet.xcodeproj/project.pbxproj
@@ -167,6 +167,8 @@
4E6EF56F2B669C7000AF252A /* TransactionDetailV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E6EF56D2B669C7000AF252A /* TransactionDetailV.swift */; };
4E753A062A0952F8002D9328 /* DebugViewC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E753A052A0952F7002D9328 /* DebugViewC.swift */; };
4E753A082A0B6A5F002D9328 /* ShareSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E753A072A0B6A5F002D9328 /* ShareSheet.swift */; };
+ 4E77976F2C4BEA4E005D6ECB /* BalanceCellV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E77976E2C4BEA4E005D6ECB /* BalanceCellV.swift */; };
+ 4E7797702C4BEA4E005D6ECB /* BalanceCellV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E77976E2C4BEA4E005D6ECB /* BalanceCellV.swift */; };
4E7940DE29FC307C00A9AEA1 /* P2PSubjectV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E7940DD29FC307C00A9AEA1 /* P2PSubjectV.swift */; };
4E87C8732A31CB7F001C6406 /* TransactionsEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E87C8722A31CB7F001C6406 /* TransactionsEmptyView.swift */; };
4E8C17202A6509BB005B2392 /* Atkinson-Hyperlegible-Regular-102.otf in Resources */ = {isa = PBXBuildFile; fileRef = 4E8C171C2A6509BB005B2392 /* Atkinson-Hyperlegible-Regular-102.otf */; };
@@ -387,6 +389,7 @@
4E753A042A08E720002D9328 /* transactions.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = transactions.json; sourceTree = "<group>"; };
4E753A052A0952F7002D9328 /* DebugViewC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DebugViewC.swift; sourceTree = "<group>"; };
4E753A072A0B6A5F002D9328 /* ShareSheet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareSheet.swift; sourceTree = "<group>"; };
+ 4E77976E2C4BEA4E005D6ECB /* BalanceCellV.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BalanceCellV.swift; sourceTree = "<group>"; };
4E7940DD29FC307C00A9AEA1 /* P2PSubjectV.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = P2PSubjectV.swift; sourceTree = "<group>"; };
4E7CFD372A532CE100CBAFF3 /* WhatToTest.en-US.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = "WhatToTest.en-US.txt"; sourceTree = "<group>"; };
4E87C8722A31CB7F001C6406 /* TransactionsEmptyView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionsEmptyView.swift; sourceTree = "<group>"; };
@@ -795,6 +798,7 @@
children = (
4EB095372989CBFE0043A8A1 /* BalancesListView.swift */,
4EB0953A2989CBFE0043A8A1 /* BalancesSectionView.swift */,
+ 4E77976E2C4BEA4E005D6ECB /* BalanceCellV.swift */,
4E448AB62C4A4109007D5C92 /* BalancesPendingRowV.swift */,
4EB095362989CBFE0043A8A1 /* BalanceRowView.swift */,
4EB065432A4CD1A80039B91D /* TwoRowButtons.swift */,
@@ -1169,6 +1173,7 @@
4E3EAE212A990778009F1BE8 /* Buttons.swift in Sources */,
4E3EAE222A990778009F1BE8 /* TransactionButton.swift in Sources */,
4EEC118D2B83DE4800146CFF /* AmountInputV.swift in Sources */,
+ 4E77976F2C4BEA4E005D6ECB /* BalanceCellV.swift in Sources */,
4E3EAE232A990778009F1BE8 /* BalancesSectionView.swift in Sources */,
4E3EAE242A990778009F1BE8 /* QRGeneratorView.swift in Sources */,
4EE77E852C101493007C9064 /* OverviewListV.swift in Sources */,
@@ -1296,6 +1301,7 @@
4EB0956A2989CBFE0043A8A1 /* Buttons.swift in Sources */,
4EBA82AB2A3EB2CA00E5F39A /* TransactionButton.swift in Sources */,
4EEC118E2B83DE4800146CFF /* AmountInputV.swift in Sources */,
+ 4E7797702C4BEA4E005D6ECB /* BalanceCellV.swift in Sources */,
4EB095602989CBFE0043A8A1 /* BalancesSectionView.swift in Sources */,
4EEC157329F8242800D46A03 /* QRGeneratorView.swift in Sources */,
4EE77E862C101493007C9064 /* OverviewListV.swift in Sources */,
diff --git a/TalerWallet1/Views/Balances/BalanceCellV.swift b/TalerWallet1/Views/Balances/BalanceCellV.swift
@@ -0,0 +1,88 @@
+/*
+ * This file is part of GNU Taler, ©2022-24 Taler Systems S.A.
+ * See LICENSE.md
+ */
+/**
+ * @author Marc Stibane
+ */
+import SwiftUI
+import taler_swift
+import SymLog
+
+struct BalanceCellV: View {
+ let stack: CallStack?
+ let currencyInfo: CurrencyInfo
+ let amount: Amount
+// let sizeCategory: ContentSizeCategory
+// let rowAction: () -> Void
+ let balanceDest: LazyView<TransactionsListView>?
+
+ @Environment(\.colorScheme) private var colorScheme
+ @Environment(\.colorSchemeContrast) private var colorSchemeContrast
+ @AppStorage("minimalistic") var minimalistic: 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 amountV = AmountV(stack: stack?.push("AmountV"), amount: amount, isNegative: false, large: true)
+ .foregroundColor(.primary)
+ let hLayout = amountV
+ .frame(maxWidth: .infinity, alignment: .trailing)
+ let balanceCell = Group {
+ if minimalistic {
+ hLayout
+ } else {
+ let balanceText = Text("Balance:", comment: "Main view")
+ .talerFont(.title2)
+ .foregroundColor(WalletColors().secondary(colorScheme, colorSchemeContrast))
+ 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
+ }
+ }
+ NavigationLink { balanceDest } label: {
+ balanceCell
+ .accessibilityElement(children: .combine)
+ .accessibilityHint(String(localized: "Will go to main transactions list."))
+// .accessibilityLabel(balanceTitleStr + " " + amountStr) // TODO: CurrencyFormatter!
+ }
+ }
+}
+
+// MARK: -
+#if false
+struct BalanceCellV_Previews: PreviewProvider {
+ @MainActor
+ struct StateContainer: View {
+ var body: some View {
+ let test = Amount(currency: TESTCURRENCY, cent: 123)
+ let demo = Amount(currency: DEMOCURRENCY, cent: 123456)
+
+ List {
+ Section {
+ BalanceCellV(stack: CallStack("Preview"), currencyName: DEMOCURRENCY, amount: demo,
+ sendAction: {}, recvAction: {}, rowAction: {}, balanceDest: nil)
+ }
+ BalanceCellV(stack: CallStack("Preview"), currencyName: TESTCURRENCY, amount: test,
+ sendAction: {}, recvAction: {}, rowAction: {}, balanceDest: nil)
+ }
+ }
+ }
+
+ static var previews: some View {
+ StateContainer()
+// .environment(\.sizeCategory, .extraExtraLarge) Canvas Device Settings
+ }
+}
+#endif