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.
142 lines
4.7 KiB
142 lines
4.7 KiB
//
|
|
// PadelClubView.swift
|
|
// PadelClub
|
|
//
|
|
// Created by Razmig Sarkissian on 01/03/2024.
|
|
//
|
|
|
|
import SwiftUI
|
|
import SwiftData
|
|
|
|
struct PadelClubView: View {
|
|
@State private var checkingFilesAttempt: Int = 0
|
|
@State private var checkingFiles: Bool = false
|
|
@State private var importingFiles: Bool = false
|
|
|
|
@EnvironmentObject var dataStore: DataStore
|
|
|
|
var lastDataSource: String? {
|
|
dataStore.appSettings.lastDataSource
|
|
}
|
|
|
|
@Environment(\.managedObjectContext) private var viewContext
|
|
|
|
@FetchRequest(
|
|
sortDescriptors: [],
|
|
animation: .default)
|
|
private var players: FetchedResults<ImportedPlayer>
|
|
|
|
|
|
var _mostRecentDateAvailable: Date? {
|
|
SourceFileManager.shared.mostRecentDateAvailable
|
|
}
|
|
|
|
var _lastDataSourceDate: Date? {
|
|
guard let lastDataSource else { return nil }
|
|
return URL.importDateFormatter.date(from: lastDataSource)
|
|
}
|
|
|
|
var body: some View {
|
|
List {
|
|
if let _lastDataSourceDate {
|
|
Section {
|
|
LabeledContent {
|
|
Image(systemName: "checkmark")
|
|
} label: {
|
|
Text(_lastDataSourceDate.monthYearFormatted)
|
|
Text("Classement mensuel utilisé")
|
|
}
|
|
}
|
|
}
|
|
|
|
let monthData = dataStore.monthData.sorted(by: \.creationDate).reversed()
|
|
ForEach(monthData) { monthData in
|
|
Section {
|
|
LabeledContent {
|
|
if let maleUnrankedValue = monthData.maleUnrankedValue {
|
|
Text(maleUnrankedValue.formatted())
|
|
}
|
|
} label: {
|
|
Text("Messieurs")
|
|
Text("Rang d'un non classé")
|
|
}
|
|
LabeledContent {
|
|
if let femaleUnrankedValue = monthData.femaleUnrankedValue {
|
|
Text(femaleUnrankedValue.formatted())
|
|
}
|
|
} label: {
|
|
Text("Dames")
|
|
Text("Rang d'une non classée")
|
|
}
|
|
} header: {
|
|
Text(monthData.monthKey)
|
|
}
|
|
}
|
|
//
|
|
// if players.isEmpty {
|
|
// ContentUnavailableView {
|
|
// Label("Aucun joueur importé", systemImage: "person.slash")
|
|
// } description: {
|
|
// Text("Padel peut importer toutes les données publique de la FFT concernant tous les compétiteurs et compétitrices.")
|
|
// } actions: {
|
|
// RowButtonView("Démarrer l'importation") {
|
|
// _startImporting()
|
|
// }
|
|
// }
|
|
// }
|
|
}
|
|
.task {
|
|
await self._checkSourceFileAvailability()
|
|
}
|
|
.refreshable {
|
|
Task {
|
|
await self._checkSourceFileAvailability()
|
|
}
|
|
}
|
|
.headerProminence(.increased)
|
|
.navigationTitle(TabDestination.padelClub.title)
|
|
}
|
|
|
|
@ViewBuilder
|
|
func _activityStatus() -> some View {
|
|
if checkingFiles || importingFiles {
|
|
ProgressView()
|
|
} else if let _mostRecentDateAvailable {
|
|
if _mostRecentDateAvailable > _lastDataSourceDate ?? .distantPast {
|
|
Text(_mostRecentDateAvailable.monthYearFormatted + " disponible à l'importation")
|
|
} else {
|
|
Label(_mostRecentDateAvailable.monthYearFormatted, systemImage: "checkmark").labelStyle(.titleAndIcon)
|
|
}
|
|
} else {
|
|
Text("Aucune donnée disponible")
|
|
}
|
|
}
|
|
|
|
private func _checkSourceFileAvailability() async {
|
|
|
|
print("check internet")
|
|
print("check files on internet")
|
|
print("check if any files on internet are more recent than here")
|
|
checkingFiles = true
|
|
await SourceFileManager.shared.fetchData()
|
|
checkingFilesAttempt += 1
|
|
checkingFiles = false
|
|
}
|
|
|
|
private func _startImporting() {
|
|
importingFiles = true
|
|
Task {
|
|
let lastDataSource = await FileImportManager.shared.importDataFromFFT()
|
|
dataStore.appSettings.lastDataSource = lastDataSource
|
|
dataStore.updateSettings()
|
|
if let lastDataSource, let mostRecentDate = URL.importDateFormatter.date(from: lastDataSource) {
|
|
await MonthData.calculateCurrentUnrankedValues(mostRecentDateAvailable: mostRecentDate)
|
|
}
|
|
importingFiles = false
|
|
}
|
|
}
|
|
}
|
|
|
|
#Preview {
|
|
PadelClubView()
|
|
}
|
|
|