You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
PadelClub/PadelClub/Views/Components/GenericDestinationPickerVie...

116 lines
5.3 KiB

//
// GenericDestinationPickerView.swift
// PadelClub
//
// Created by Razmig Sarkissian on 31/03/2024.
//
import SwiftUI
struct GenericDestinationPickerView<T: Identifiable & Selectable & Equatable >: View {
@EnvironmentObject var dataStore: DataStore
@Binding var selectedDestination: T?
let destinations: [T]
let nilDestinationIsValid: Bool
var body: some View {
ScrollViewReader { proxy in
ScrollView(.horizontal) {
HStack {
if nilDestinationIsValid {
Button {
selectedDestination = nil
} label: {
Image(systemName: "wrench.and.screwdriver")
.foregroundColor(selectedDestination == nil ? .white : .black)
}
.padding()
.background {
Circle()
.fill(selectedDestination == nil ? .master : .beige)
}
.buttonStyle(.plain)
.id("settings")
}
ForEach(destinations) { destination in
Button {
selectedDestination = destination
} label: {
Text(destination.selectionLabel())
.foregroundStyle(selectedDestination?.id == destination.id ? .white : .black)
}
.padding()
.background {
Capsule()
.fill(selectedDestination?.id == destination.id ? .master : .beige)
}
.id(destination.id)
.buttonStyle(.plain)
.overlay(alignment: .bottomTrailing) {
if destination.displayImageIfValueZero() {
let count : Int? = destination.badgeValue()
if let count, count == 0, let badge = destination.badgeImage() {
Image(systemName: badge.systemName())
.foregroundColor(badge.color())
.imageScale(.medium)
.background (
Color(.systemBackground)
.clipShape(.circle)
)
.offset(x: 3, y: 3)
} else if let count, count > 0 {
Image(systemName: count <= 50 ? "\(String(count)).circle.fill" : "plus.circle.fill")
.foregroundColor(destination.badgeValueColor() ?? .red)
.imageScale(.medium)
.background (
Color(.systemBackground)
.clipShape(.circle)
)
.offset(x: 3, y: 3)
}
} else {
if let badge = destination.badgeImage() {
Image(systemName: badge.systemName())
.foregroundColor(badge.color())
.imageScale(.medium)
.background (
Color(.systemBackground)
.clipShape(.circle)
)
.offset(x: 3, y: 3)
} else if let count = destination.badgeValue(), count > 0 {
Image(systemName: count <= 50 ? "\(String(count)).circle.fill" : "plus.circle.fill")
.foregroundColor(destination.badgeValueColor() ?? .red)
.imageScale(.medium)
.background (
Color(.systemBackground)
.clipShape(.circle)
)
.offset(x: 3, y: 3)
}
}
}
}
}
.fixedSize()
.padding(8)
}
.listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
.background(Material.ultraThinMaterial)
.overlay {
VStack(spacing: 0) {
Spacer()
Divider()
}
}
.onAppear {
if let selectedDestination {
proxy.scrollTo(selectedDestination.id)
} else {
proxy.scrollTo("settings")
}
}
}
}
}