import SwiftUI /// 金币明细(流水)。从福利页金币卡进入。 struct CoinHistoryView: View { @State private var vm = CoinHistoryViewModel() var body: some View { Group { if vm.isLoading && vm.items.isEmpty { ProgressView().frame(maxWidth: .infinity, maxHeight: .infinity) } else if vm.loaded && vm.items.isEmpty { ContentUnavailableView("还没有金币记录", systemImage: "circle.hexagongrid") } else { List { ForEach(vm.items) { tx in coinRow(tx) } if vm.hasMore { HStack { Spacer(); ProgressView(); Spacer() } .onAppear { Task { await vm.loadMore() } } } } .listStyle(.plain) .refreshable { await vm.loadFirst() } } } .navigationTitle("金币明细") .navigationBarTitleDisplayMode(.inline) .task { if !vm.loaded { await vm.loadFirst() } } } private func coinRow(_ tx: CoinTransactionDTO) -> some View { HStack { VStack(alignment: .leading, spacing: 2) { Text(WelfareCatalog.coinBizText(tx)).font(.subheadline) Text(AppDate.friendly(tx.createdAt)) .font(.caption2).foregroundStyle(.secondary) } Spacer() Text("\(tx.amount > 0 ? "+" : "")\(tx.amount)") .font(.subheadline.bold()) .foregroundStyle(tx.amount > 0 ? AppColors.coin : AppColors.gray600) } .padding(.vertical, 2) } }