summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Stibane <marc@taler.net>2024-04-12 17:47:33 +0200
committerMarc Stibane <marc@taler.net>2024-04-12 17:47:33 +0200
commitf964712d7f285c8af7ee10b278829c279088a0ec (patch)
tree0a368f73f22b47ecad3c8d0d18d0a86b36ab8e07
parented8806cd39981a044e5813ec067f18c9afa66041 (diff)
downloadtaler-ios-f964712d7f285c8af7ee10b278829c279088a0ec.tar.gz
taler-ios-f964712d7f285c8af7ee10b278829c279088a0ec.tar.bz2
taler-ios-f964712d7f285c8af7ee10b278829c279088a0ec.zip
SegmentControl for manual details
-rw-r--r--TalerWallet1/Views/Transactions/ManualDetailsV.swift77
1 files changed, 73 insertions, 4 deletions
diff --git a/TalerWallet1/Views/Transactions/ManualDetailsV.swift b/TalerWallet1/Views/Transactions/ManualDetailsV.swift
index e3049b4..5adcb9c 100644
--- a/TalerWallet1/Views/Transactions/ManualDetailsV.swift
+++ b/TalerWallet1/Views/Transactions/ManualDetailsV.swift
@@ -6,6 +6,65 @@ import SwiftUI
import OrderedCollections
import taler_swift
+struct SegmentControl: View {
+ let value: Int
+ let accountDetails: [WithdrawalExchangeAccountDetails]
+ let action: (Int) -> Void
+
+ @Environment(\.colorScheme) private var colorScheme
+ @Environment(\.colorSchemeContrast) private var colorSchemeContrast
+
+ @State private var selectedAccount = 0
+ @ScaledMetric var frameHeight = 80 // relative to fontSize
+
+ public var body: some View {
+ let count = accountDetails.count
+ ZStack(alignment: .center) {
+ GeometryReader { geo in
+ RoundedRectangle(cornerRadius: 6.0)
+ .foregroundColor(WalletColors().pickerSelected(colorScheme, colorSchemeContrast))
+ .cornerRadius(6.0)
+ .padding(4)
+ .frame(width: geo.size.width / CGFloat(count))
+ .shadow(color: .black.opacity(0.1), radius: 2, x: 1, y: 1)
+ .offset(x: geo.size.width / CGFloat(count) * CGFloat(selectedAccount), y: 0)
+ }
+ .frame(height: frameHeight)
+
+ HStack(spacing: 0) {
+ ForEach((0..<count), id: \.self) { index in
+ let detail = accountDetails[index]
+ let amount = detail.transferAmount
+ VStack(spacing: 6) {
+ let amountStr = amount?.readableDescription ?? ""
+ Text(amountStr)
+ .talerFont(.title3)
+ let bankName = detail.bankLabel ?? ("BankName " + String(index))
+ Text(bankName)
+ .talerFont(.subheadline)
+ }
+ .frame(maxWidth: .infinity)
+ .background(.gray.opacity(0.00001))
+ .onTapGesture {
+ withAnimation(.easeInOut(duration: 0.150)) {
+ selectedAccount = index
+ }
+ }
+ }
+ }
+ }
+ .onAppear() {
+ withAnimation { selectedAccount = value }
+ }
+ .onChange(of: selectedAccount) { selected in
+ action(selected)
+ }
+ .background(
+ RoundedRectangle(cornerRadius: 6.0)
+ .fill(WalletColors().fieldBackground)
+ )
+ }
+}
struct AccountPicker: View {
let title: String
let value: Int
@@ -18,14 +77,12 @@ struct AccountPicker: View {
Picker(title, selection: $selectedAccount, content: {
ForEach(0..<accountDetails.count, id: \.self, content: { index in
let detail = accountDetails[index]
- if detail.status.lowercased() == "ok" {
if let amount = detail.transferAmount {
let amountStr = amount.readableDescription
let bankName = detail.bankLabel ?? ("BankName " + String(index))
Text(bankName + ": " + amountStr)
.tag(index)
}
- }
})
})
.talerFont(.title3)
@@ -107,8 +164,20 @@ struct ManualDetailsV: View {
.multilineTextAlignment(.leading)
.listRowSeparator(.hidden)
}
- AccountPicker(title: String(localized: "Bank"), value: accountID,
- accountDetails: validDetails, action: redraw)
+ if validDetails.count > 1 {
+ if validDetails.count > 3 {
+ AccountPicker(title: String(localized: "Bank"), value: accountID,
+ accountDetails: validDetails, action: redraw)
+ .listRowSeparator(.hidden)
+ } else {
+ SegmentControl(value: accountID, accountDetails: validDetails, action: redraw)
+ .listRowSeparator(.hidden)
+ }
+ } else if let amount = account.transferAmount {
+ let amountStr = amount.readableDescription
+ let bankName = account.bankLabel ?? "Unknown bank"
+ Text(bankName + ": " + amountStr)
+ }
let payto = account.paytoUri
let payURL = URL(string: payto)
if let queryParameters = payURL?.queryParameters {