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/Navigation/Ongoing/OngoingView.swift

118 lines
4.2 KiB

//
// OngoingView.swift
// PadelClub
//
// Created by Razmig Sarkissian on 24/04/2024.
//
import SwiftUI
import LeStorage
import PadelClubData
extension Int: @retroactive Identifiable {
public var id: Int {
return self
}
}
struct OngoingView: View {
@Environment(NavigationViewModel.self) private var navigation: NavigationViewModel
@EnvironmentObject var dataStore: DataStore
@Environment(OngoingViewModel.self) private var ongoingViewModel: OngoingViewModel
var filterMode: OngoingDestination {
ongoingViewModel.destination!
}
var body: some View {
let filteredMatches = filterMode.sortedMatches
List {
ForEach(filteredMatches) { match in
let tournament = match.currentTournament()
Section {
MatchRowView(match: match)
.matchViewStyle(.followUpStyle)
} header: {
if let tournament {
HStack {
Text(tournament.tournamentTitle(.short))
Spacer()
if let club = tournament.club() {
Text("@" + club.clubTitle(.short))
}
}
}
} footer: {
HStack {
if let tournament {
Text(tournament.eventLabel())
}
#if DEBUG
Spacer()
FooterButtonView("copier l'id") {
let pasteboard = UIPasteboard.general
pasteboard.string = match.id
}
#endif
}
}
}
}
.headerProminence(.increased)
.overlay {
if filteredMatches.isEmpty {
filterMode.contentUnavailable()
}
}
}
}
struct OngoingCourtView: View {
@Environment(NavigationViewModel.self) private var navigation: NavigationViewModel
@EnvironmentObject var dataStore: DataStore
@Environment(OngoingViewModel.self) private var ongoingViewModel: OngoingViewModel
var filterMode: OngoingDestination {
ongoingViewModel.destination!
}
@State private var selectedCourtForFollowUp: Int?
var body: some View {
let sortedMatches = filterMode.sortedMatches
let filteredMatches = sortedMatches.filter({ OngoingDestination.running.shouldDisplay($0) })
List {
ForEach(filterMode.sortedCourtIndex, id: \.self) { index in
let courtFilteredMatches = filteredMatches.filter({ $0.courtIndex == index })
let title : String = (index == nil ? "Aucune piste définie" : "Piste #\(index! + 1)")
if (filterMode == .free && courtFilteredMatches.isEmpty) || (filterMode == .court && courtFilteredMatches.isEmpty == false) {
Section {
MatchListView(section: "En cours", matches: courtFilteredMatches, hideWhenEmpty: true, isExpanded: false)
MatchListView(section: "À venir", matches: sortedMatches.filter({ $0.courtIndex == index && $0.hasStarted() == false }), isExpanded: false)
} header: {
Text(title)
} footer: {
FooterButtonView("Ajouter un match à suivre") {
selectedCourtForFollowUp = index
}
}
}
}
}
.sheet(item: $selectedCourtForFollowUp, content: { selectedCourtForFollowUp in
FollowUpMatchView(selectedCourt: selectedCourtForFollowUp, allMatches: filterMode.runningAndNextMatches)
.tint(.master)
})
.headerProminence(.increased)
.overlay {
if (filteredMatches.isEmpty && filterMode != .free) || (filterMode == .free && filterMode.sortedCourtIndex.allSatisfy({ index in filteredMatches.filter({ $0.courtIndex == index }).isEmpty == false })) {
filterMode.contentUnavailable()
}
}
}
}