struct TransactionHistoryView: View {
@State private var transactions: [Transaction] = []
@State private var isLoading = true
@State private var selectedFilter = "all"
let filters = ["all", "deposit", "withdraw", "transfer"]
var body: some View {
VStack {
// Filter picker
Picker("Filter", selection: $selectedFilter) {
ForEach(filters, id: \.self) { filter in
Text(filter.capitalized).tag(filter)
}
}
.pickerStyle(.segmented)
.padding(.horizontal)
// Transaction list
List {
if isLoading {
ProgressView("Loading transactions...")
} else if transactions.isEmpty {
Text("No transactions found")
.foregroundColor(.secondary)
} else {
ForEach(transactions, id: \.txHash) { tx in
TransactionRow(transaction: tx)
}
}
}
}
.task { await loadTransactions() }
.onChange(of: selectedFilter) { _ in
Task { await loadTransactions() }
}
.refreshable {
await loadTransactions()
}
}
private func loadTransactions() async {
isLoading = true
do {
let typeFilter = selectedFilter == "all" ? nil : selectedFilter
transactions = try await sdk.getTransactionHistory(
txType: typeFilter,
tokenAddress: nil,
limit: 50
)
} catch {
print("Failed to load transactions: \(error)")
}
isLoading = false
}
}
struct TransactionRow: View {
let transaction: Transaction
var icon: String {
switch transaction.txType {
case "deposit": return "arrow.down.circle.fill"
case "withdraw": return "arrow.up.circle.fill"
case "transfer": return "arrow.left.arrow.right.circle.fill"
default: return "circle.fill"
}
}
var formattedDate: String {
let date = Date(timeIntervalSince1970: TimeInterval(transaction.createdAt))
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
return formatter.string(from: date)
}
var body: some View {
HStack {
Image(systemName: icon)
.foregroundColor(transaction.txType == "deposit" ? .green : .blue)
VStack(alignment: .leading) {
Text(transaction.txType.capitalized)
.font(.headline)
Text(formattedDate)
.font(.caption)
.foregroundColor(.secondary)
}
Spacer()
Text(transaction.amount)
.font(.subheadline)
.monospacedDigit()
}
}
}