payfrit-beacon-ios/PayfritBeacon/Views/BusinessListView.swift
Schwifty fe2ee59930 fix: resolve ambiguous toolbar(content:) in BusinessListView
Use explicit toolbar(content:) call instead of trailing closure to
disambiguate the SwiftUI toolbar modifier overload.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 19:15:35 +00:00

120 lines
3.8 KiB
Swift

import SwiftUI
/// Business selector screen (matches Android MainActivity)
struct BusinessListView: View {
@EnvironmentObject var appState: AppState
@State private var businesses: [Business] = []
@State private var isLoading = true
@State private var errorMessage: String?
var body: some View {
NavigationStack {
Group {
if isLoading {
ProgressView("Loading businesses…")
} else if let error = errorMessage {
ContentUnavailableView {
Label("Error", systemImage: "exclamationmark.triangle")
} description: {
Text(error)
} actions: {
Button("Retry") { Task { await loadBusinesses() } }
}
} else if businesses.isEmpty {
ContentUnavailableView(
"No Businesses",
systemImage: "building.2",
description: Text("You don't have any businesses yet.")
)
} else {
List(businesses) { business in
Button {
appState.selectBusiness(business)
} label: {
BusinessRow(business: business)
}
}
.listStyle(.insetGrouped)
}
}
.navigationTitle("Select Business")
.toolbar(content: {
ToolbarItem(placement: .topBarTrailing) {
Button("Logout") {
appState.logout()
}
}
})
}
.task {
await loadBusinesses()
}
}
private func loadBusinesses() async {
guard let token = appState.token else { return }
isLoading = true
errorMessage = nil
do {
let list = try await APIClient.shared.listBusinesses(token: token)
businesses = list
// Auto-navigate if only one business (like Android)
if list.count == 1, let only = list.first {
appState.selectBusiness(only)
return
}
// Auto-navigate to last used business
if let lastId = AppPrefs.lastBusinessId,
let last = list.first(where: { $0.id == lastId }) {
appState.selectBusiness(last)
return
}
} catch let e as APIError where e.errorDescription == APIError.unauthorized.errorDescription {
appState.logout()
} catch {
errorMessage = error.localizedDescription
}
isLoading = false
}
}
// MARK: - Business Row
struct BusinessRow: View {
let business: Business
var body: some View {
HStack(spacing: 12) {
// Business header image
AsyncImage(url: business.headerImageURL) { image in
image.resizable().aspectRatio(contentMode: .fill)
} placeholder: {
Image(systemName: "building.2")
.font(.title2)
.foregroundStyle(.secondary)
}
.frame(width: 56, height: 56)
.clipShape(RoundedRectangle(cornerRadius: 8))
VStack(alignment: .leading, spacing: 4) {
Text(business.name)
.font(.headline)
Text("ID: \(business.id)")
.font(.caption)
.foregroundStyle(.secondary)
}
Spacer()
Image(systemName: "chevron.right")
.foregroundStyle(.tertiary)
}
.padding(.vertical, 4)
}
}