From e1ffa4830a9c0307bffd9ae64875056cb885814d Mon Sep 17 00:00:00 2001 From: Raz Date: Mon, 6 Jan 2025 10:31:00 +0100 Subject: [PATCH 1/4] fix 18.2 bug --- PadelClub.xcodeproj/project.pbxproj | 8 ++-- PadelClub/Data/TeamRegistration.swift | 2 +- PadelClub/Data/Tournament.swift | 2 +- .../PlayersWithoutContactView.swift | 2 +- .../Components/InscriptionInfoView.swift | 38 +++++++++---------- .../Screen/InscriptionManagerView.swift | 13 ++----- 6 files changed, 29 insertions(+), 36 deletions(-) diff --git a/PadelClub.xcodeproj/project.pbxproj b/PadelClub.xcodeproj/project.pbxproj index a97bf44..b6a7ba5 100644 --- a/PadelClub.xcodeproj/project.pbxproj +++ b/PadelClub.xcodeproj/project.pbxproj @@ -3262,7 +3262,7 @@ CODE_SIGN_ENTITLEMENTS = PadelClub/PadelClub.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DEVELOPMENT_ASSET_PATHS = "\"PadelClub/Preview Content\""; @@ -3286,7 +3286,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.41; + MARKETING_VERSION = 1.0.42; PRODUCT_BUNDLE_IDENTIFIER = app.padelclub; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -3307,7 +3307,7 @@ CODE_SIGN_ENTITLEMENTS = PadelClub/PadelClub.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DEVELOPMENT_ASSET_PATHS = "\"PadelClub/Preview Content\""; DEVELOPMENT_TEAM = BQ3Y44M3Q6; @@ -3330,7 +3330,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.41; + MARKETING_VERSION = 1.0.42; PRODUCT_BUNDLE_IDENTIFIER = app.padelclub; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/PadelClub/Data/TeamRegistration.swift b/PadelClub/Data/TeamRegistration.swift index da189ec..84a4d5e 100644 --- a/PadelClub/Data/TeamRegistration.swift +++ b/PadelClub/Data/TeamRegistration.swift @@ -173,7 +173,7 @@ final class TeamRegistration: ModelObject, Storable { } func getPhoneNumbers() -> [String] { - return players().compactMap { $0.phoneNumber }.filter({ $0.isMobileNumber() }) + return players().compactMap { $0.phoneNumber }.filter({ $0.isEmpty == false }) } func getMail() -> [String] { diff --git a/PadelClub/Data/Tournament.swift b/PadelClub/Data/Tournament.swift index ea926b8..189c987 100644 --- a/PadelClub/Data/Tournament.swift +++ b/PadelClub/Data/Tournament.swift @@ -1136,7 +1136,7 @@ defer { } } - func registrationIssues() async -> Int { + func registrationIssues() -> Int { let players : [PlayerRegistration] = unsortedPlayers() let selectedTeams : [TeamRegistration] = selectedSortedTeams() let callDateIssue : [TeamRegistration] = selectedTeams.filter { $0.callDate != nil && isStartDateIsDifferentThanCallDate($0) } diff --git a/PadelClub/Views/Calling/Components/PlayersWithoutContactView.swift b/PadelClub/Views/Calling/Components/PlayersWithoutContactView.swift index cffae6e..92b38be 100644 --- a/PadelClub/Views/Calling/Components/PlayersWithoutContactView.swift +++ b/PadelClub/Views/Calling/Components/PlayersWithoutContactView.swift @@ -45,7 +45,7 @@ struct PlayersWithoutContactView: View { LabeledContent { Text(withoutPhones.count.formatted()) } label: { - Text("Joueurs sans téléphone portable") + Text("Joueurs sans téléphone portable français") } } } header: { diff --git a/PadelClub/Views/Tournament/Screen/Components/InscriptionInfoView.swift b/PadelClub/Views/Tournament/Screen/Components/InscriptionInfoView.swift index 3fb55c6..d39e5e0 100644 --- a/PadelClub/Views/Tournament/Screen/Components/InscriptionInfoView.swift +++ b/PadelClub/Views/Tournament/Screen/Components/InscriptionInfoView.swift @@ -9,7 +9,7 @@ import SwiftUI struct InscriptionInfoView: View { @EnvironmentObject var dataStore: DataStore - @Environment(Tournament.self) var tournament + let tournament: Tournament @State private var players : [PlayerRegistration] = [] @State private var selectedTeams : [TeamRegistration] = [] @@ -244,30 +244,30 @@ struct InscriptionInfoView: View { Text("importé du fichier beach-padel sans licence valide ou créé sans licence") } } - .task { - await _getIssues() + .onAppear { + DispatchQueue.main.async { + _getIssues() + } } .navigationTitle("Synthèse") .navigationBarTitleDisplayMode(.inline) .toolbarBackground(.visible, for: .navigationBar) } - private func _getIssues() async { - Task { - players = tournament.unsortedPlayers() - selectedTeams = tournament.selectedSortedTeams() - callDateIssue = selectedTeams.filter { $0.callDate != nil && tournament.isStartDateIsDifferentThanCallDate($0) } - waitingList = tournament.waitingListTeams(in: selectedTeams, includingWalkOuts: true) - duplicates = tournament.duplicates(in: players) - homonyms = tournament.homonyms(in: players) - problematicPlayers = players.filter({ $0.sex == nil }) - inadequatePlayers = tournament.inadequatePlayers(in: players) - ageInadequatePlayers = tournament.ageInadequatePlayers(in: players) - let isImported = players.anySatisfy({ $0.isImported() }) - playersWithoutValidLicense = tournament.playersWithoutValidLicense(in: players, isImported: isImported) - entriesFromBeachPadel = tournament.unsortedTeams().filter({ $0.isImported() }) - playersMissing = selectedTeams.filter({ $0.unsortedPlayers().count < 2 }) - } + private func _getIssues() { + players = tournament.unsortedPlayers() + selectedTeams = tournament.selectedSortedTeams() + callDateIssue = selectedTeams.filter { $0.callDate != nil && tournament.isStartDateIsDifferentThanCallDate($0) } + waitingList = tournament.waitingListTeams(in: selectedTeams, includingWalkOuts: true) + duplicates = tournament.duplicates(in: players) + homonyms = tournament.homonyms(in: players) + problematicPlayers = players.filter({ $0.sex == nil }) + inadequatePlayers = tournament.inadequatePlayers(in: players) + ageInadequatePlayers = tournament.ageInadequatePlayers(in: players) + let isImported = players.anySatisfy({ $0.isImported() }) + playersWithoutValidLicense = tournament.playersWithoutValidLicense(in: players, isImported: isImported) + entriesFromBeachPadel = tournament.unsortedTeams().filter({ $0.isImported() }) + playersMissing = selectedTeams.filter({ $0.unsortedPlayers().count < 2 }) } } diff --git a/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift b/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift index be075c8..775bdc2 100644 --- a/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift +++ b/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift @@ -173,8 +173,8 @@ struct InscriptionManagerView: View { self.teamsHash = _simpleHash(ids: selectedSortedTeams.map { $0.id }) } self.registrationIssues = nil - Task { - self.registrationIssues = await tournament.registrationIssues() + DispatchQueue.main.async { + self.registrationIssues = tournament.registrationIssues() } } @@ -718,14 +718,7 @@ struct InscriptionManagerView: View { if tournament.isAnimation() == false { NavigationLink { - InscriptionInfoView() - .environment(tournament) - .onDisappear { - self.registrationIssues = nil - Task { - self.registrationIssues = await tournament.registrationIssues() - } - } + InscriptionInfoView(tournament: tournament) } label: { LabeledContent { if let registrationIssues { From 783e66e754173937a373eea2c793dfe6feaf6bba Mon Sep 17 00:00:00 2001 From: Raz Date: Mon, 6 Jan 2025 11:19:48 +0100 Subject: [PATCH 2/4] fix unnecessary save in edit player --- PadelClub/Views/Player/PlayerDetailView.swift | 41 ++++++++----------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/PadelClub/Views/Player/PlayerDetailView.swift b/PadelClub/Views/Player/PlayerDetailView.swift index 69c153a..88fe914 100644 --- a/PadelClub/Views/Player/PlayerDetailView.swift +++ b/PadelClub/Views/Player/PlayerDetailView.swift @@ -152,10 +152,6 @@ struct PlayerDetailView: View { Menu { CopyPasteButtonView(pasteValue: player.phoneNumber) PasteButtonView(text: $phoneNumber) - .onChange(of: phoneNumber) { - player.phoneNumber = phoneNumber.prefixTrimmed(50) - _save() - } } label: { Text("Téléphone") } @@ -177,10 +173,6 @@ struct PlayerDetailView: View { Menu { CopyPasteButtonView(pasteValue: player.email) PasteButtonView(text: $email) - .onChange(of: email) { - player.email = email.prefixTrimmed(50) - _save() - } } label: { Text("Email") } @@ -216,13 +208,6 @@ struct PlayerDetailView: View { } } } - .toolbar { - ToolbarItem(placement: .topBarTrailing) { - ShareLink(item: player.pasteData()) { - Label("Partager", systemImage: "square.and.arrow.up") - } - } - } .onChange(of: player.hasArrived) { _save() } @@ -230,7 +215,17 @@ struct PlayerDetailView: View { _save() } .navigationBarBackButtonHidden(focusedField != nil) - .toolbar(content: { + .headerProminence(.increased) + .navigationTitle("Édition") + .navigationBarTitleDisplayMode(.inline) + .toolbarBackground(.visible, for: .navigationBar) + .toolbar { + ToolbarItem(placement: .topBarTrailing) { + ShareLink(item: player.pasteData()) { + Label("Partager", systemImage: "square.and.arrow.up") + } + } + if focusedField != nil { ToolbarItem(placement: .topBarLeading) { Button("Annuler", role: .cancel) { @@ -238,14 +233,9 @@ struct PlayerDetailView: View { } } } - }) - .headerProminence(.increased) - .navigationTitle("Édition") - .navigationBarTitleDisplayMode(.inline) - .toolbarBackground(.visible, for: .navigationBar) - .toolbar { - if focusedField == ._rank || focusedField == ._computedRank { - ToolbarItem(placement: .keyboard) { + if focusedField == ._rank || focusedField == ._computedRank || focusedField == ._phoneNumber { + ToolbarItemGroup(placement: .keyboard) { + Spacer() Button("Valider") { if focusedField == ._rank { player.setComputedRank(in: tournament) @@ -254,6 +244,9 @@ struct PlayerDetailView: View { } else if focusedField == ._computedRank { player.team()?.updateWeight(inTournamentCategory: tournament.tournamentCategory) _save() + } else if focusedField == ._phoneNumber { + player.phoneNumber = phoneNumber.prefixTrimmed(50) + _save() } focusedField = nil } From 9e2674e210e683eedd15e405a9781569ff608024 Mon Sep 17 00:00:00 2001 From: Raz Date: Wed, 8 Jan 2025 09:53:13 +0100 Subject: [PATCH 3/4] fix issue with locationbutton --- PadelClub.xcodeproj/project.pbxproj | 24 +++++++++--- PadelClub/Data/PlayerRegistration.swift | 25 ++++++++++++- PadelClub/Data/Tournament.swift | 13 ++++++- .../Agenda/TournamentLookUpView.swift | 30 +++++++++++++-- .../Components/UpdateSourceRankDateView.swift | 37 +++++++++---------- 5 files changed, 98 insertions(+), 31 deletions(-) diff --git a/PadelClub.xcodeproj/project.pbxproj b/PadelClub.xcodeproj/project.pbxproj index b6a7ba5..40c031f 100644 --- a/PadelClub.xcodeproj/project.pbxproj +++ b/PadelClub.xcodeproj/project.pbxproj @@ -3262,7 +3262,7 @@ CODE_SIGN_ENTITLEMENTS = PadelClub/PadelClub.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DEVELOPMENT_ASSET_PATHS = "\"PadelClub/Preview Content\""; @@ -3275,7 +3275,10 @@ INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES; INFOPLIST_KEY_NSCalendarsUsageDescription = "Padel Club a besoin d'avoir accès à votre calendrier pour pouvoir y inscrire ce tournoi"; INFOPLIST_KEY_NSCameraUsageDescription = "En autorisant l'application à utiliser la caméra, vous pourrez prendre des photos des rencontres"; - INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "En utilisant votre position, Padel Club peut trouver plus rapidement les clubs et les tournois autour de vous."; + INFOPLIST_KEY_NSLocationAlwaysAndWhenInUseUsageDescription = "Padel Club utilise votre position simplement pour faciliter la recherche de tournois et de clubs autour de vous."; + INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "Padel Club utilise votre position simplement pour faciliter la recherche de tournois et de clubs autour de vous."; + INFOPLIST_KEY_NSLocationUsageDescription = "Padel Club utilise votre position simplement pour faciliter la recherche de tournois et de clubs autour de vous."; + INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Padel Club utilise votre position simplement pour faciliter la recherche de tournois et de clubs autour de vous."; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = "Launch Screen"; @@ -3307,7 +3310,7 @@ CODE_SIGN_ENTITLEMENTS = PadelClub/PadelClub.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEFINES_MODULE = YES; DEVELOPMENT_ASSET_PATHS = "\"PadelClub/Preview Content\""; DEVELOPMENT_TEAM = BQ3Y44M3Q6; @@ -3319,7 +3322,10 @@ INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES; INFOPLIST_KEY_NSCalendarsUsageDescription = "Padel Club a besoin d'avoir accès à votre calendrier pour pouvoir y inscrire ce tournoi"; INFOPLIST_KEY_NSCameraUsageDescription = "En autorisant l'application à utiliser la caméra, vous pourrez prendre des photos des rencontres"; - INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "En utilisant votre position, Padel Club peut trouver plus rapidement les clubs et les tournois autour de vous."; + INFOPLIST_KEY_NSLocationAlwaysAndWhenInUseUsageDescription = "Padel Club utilise votre position simplement pour faciliter la recherche de tournois et de clubs autour de vous."; + INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "Padel Club utilise votre position simplement pour faciliter la recherche de tournois et de clubs autour de vous."; + INFOPLIST_KEY_NSLocationUsageDescription = "Padel Club utilise votre position simplement pour faciliter la recherche de tournois et de clubs autour de vous."; + INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Padel Club utilise votre position simplement pour faciliter la recherche de tournois et de clubs autour de vous."; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = "Launch Screen"; @@ -3436,7 +3442,10 @@ INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES; INFOPLIST_KEY_NSCalendarsUsageDescription = "Padel Club a besoin d'avoir accès à votre calendrier pour pouvoir y inscrire ce tournoi"; INFOPLIST_KEY_NSCameraUsageDescription = "En autorisant l'application à utiliser la caméra, vous pourrez prendre des photos des rencontres"; - INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Padel Club a besoin de votre position pour rechercher les clubs autour de vous."; + INFOPLIST_KEY_NSLocationAlwaysAndWhenInUseUsageDescription = "Padel Club utilise votre position simplement pour faciliter la recherche de tournois et de clubs autour de vous."; + INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "Padel Club utilise votre position simplement pour faciliter la recherche de tournois et de clubs autour de vous."; + INFOPLIST_KEY_NSLocationUsageDescription = "Padel Club utilise votre position simplement pour faciliter la recherche de tournois et de clubs autour de vous."; + INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Padel Club utilise votre position simplement pour faciliter la recherche de tournois et de clubs autour de vous."; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = "Launch Screen"; @@ -3480,7 +3489,10 @@ INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES; INFOPLIST_KEY_NSCalendarsUsageDescription = "Padel Club a besoin d'avoir accès à votre calendrier pour pouvoir y inscrire ce tournoi"; INFOPLIST_KEY_NSCameraUsageDescription = "En autorisant l'application à utiliser la caméra, vous pourrez prendre des photos des rencontres"; - INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Padel Club a besoin de votre position pour rechercher les clubs autour de vous."; + INFOPLIST_KEY_NSLocationAlwaysAndWhenInUseUsageDescription = "Padel Club utilise votre position simplement pour faciliter la recherche de tournois et de clubs autour de vous."; + INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "Padel Club utilise votre position simplement pour faciliter la recherche de tournois et de clubs autour de vous."; + INFOPLIST_KEY_NSLocationUsageDescription = "Padel Club utilise votre position simplement pour faciliter la recherche de tournois et de clubs autour de vous."; + INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Padel Club utilise votre position simplement pour faciliter la recherche de tournois et de clubs autour de vous."; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = "Launch Screen"; diff --git a/PadelClub/Data/PlayerRegistration.swift b/PadelClub/Data/PlayerRegistration.swift index 4dbc043..e3dd433 100644 --- a/PadelClub/Data/PlayerRegistration.swift +++ b/PadelClub/Data/PlayerRegistration.swift @@ -239,8 +239,15 @@ final class PlayerRegistration: ModelObject, Storable { } } - @MainActor func updateRank(from sources: [CSVParser], lastRank: Int) async throws { +#if DEBUG_TIME //DEBUGING TIME +let start = Date() +defer { + let duration = Duration.milliseconds(Date().timeIntervalSince(start) * 1_000) + print("func updateRank()", id, duration.formatted(.units(allowed: [.seconds, .milliseconds]))) +} +#endif + if let dataFound = try await history(from: sources) { rank = dataFound.rankValue?.toInt() points = dataFound.points @@ -251,6 +258,14 @@ final class PlayerRegistration: ModelObject, Storable { } func history(from sources: [CSVParser]) async throws -> Line? { +#if DEBUG_TIME //DEBUGING TIME +let start = Date() +defer { + let duration = Duration.milliseconds(Date().timeIntervalSince(start) * 1_000) + print("func history()", id, duration.formatted(.units(allowed: [.seconds, .milliseconds]))) +} +#endif + guard let license = licenceId?.strippedLicense else { return try await historyFromName(from: sources) } @@ -276,6 +291,14 @@ final class PlayerRegistration: ModelObject, Storable { } func historyFromName(from sources: [CSVParser]) async throws -> Line? { +#if DEBUG_TIME //DEBUGING TIME +let start = Date() +defer { + let duration = Duration.milliseconds(Date().timeIntervalSince(start) * 1_000) + print("func historyFromName()", id, duration.formatted(.units(allowed: [.seconds, .milliseconds]))) +} +#endif + return await withTaskGroup(of: Line?.self) { group in for source in sources.filter({ $0.maleData == isMalePlayer() }) { group.addTask { [lastName, firstName] in diff --git a/PadelClub/Data/Tournament.swift b/PadelClub/Data/Tournament.swift index 189c987..5f6ee07 100644 --- a/PadelClub/Data/Tournament.swift +++ b/PadelClub/Data/Tournament.swift @@ -1449,6 +1449,15 @@ defer { } func updateRank(to newDate: Date?) async throws { + +#if DEBUG_TIME //DEBUGING TIME +let start = Date() +defer { + let duration = Duration.milliseconds(Date().timeIntervalSince(start) * 1_000) + print("func updateRank()", id, duration.formatted(.units(allowed: [.seconds, .milliseconds]))) +} +#endif + guard let newDate else { return } rankSourceDate = newDate @@ -1472,8 +1481,8 @@ defer { let lastRankWoman = currentMonthData()?.femaleUnrankedValue let dataURLs = SourceFileManager.shared.allFiles.filter { $0.dateFromPath == newDate } let sources = dataURLs.map { CSVParser(url: $0) } - - try await unsortedPlayers().concurrentForEach { player in + let players = unsortedPlayers() + try await players.concurrentForEach { player in try await player.updateRank(from: sources, lastRank: (player.sex == .female ? lastRankWoman : lastRankMan) ?? 0) } } diff --git a/PadelClub/Views/Navigation/Agenda/TournamentLookUpView.swift b/PadelClub/Views/Navigation/Agenda/TournamentLookUpView.swift index 783359c..f7228f6 100644 --- a/PadelClub/Views/Navigation/Agenda/TournamentLookUpView.swift +++ b/PadelClub/Views/Navigation/Agenda/TournamentLookUpView.swift @@ -18,7 +18,7 @@ struct TournamentLookUpView: View { @State private var searchField: String = "" @State var page: Int = 0 @State var total: Int = 0 - + @State private var showingSettingsAlert = false @State private var searching: Bool = false @State private var requestedToGetAllPages: Bool = false @State private var revealSearchParameters: Bool = true @@ -57,6 +57,16 @@ struct TournamentLookUpView: View { } message: { Text("Aucune ville n'a été indiqué, il est préférable de se localiser ou d'indiquer une ville pour réduire le nombre de résultat.") } + .alert(isPresented: $showingSettingsAlert) { + Alert( + title: Text("Réglages"), + message: Text("Pour trouver les clubs autour de vous, vous devez l'autorisation à Padel Club de récupérer votre position."), + primaryButton: .default(Text("Ouvrir les réglages"), action: { + _openSettings() + }), + secondaryButton: .cancel() + ) + } .alert("Attention", isPresented: $presentAlert, actions: { Button { presentAlert = false @@ -305,9 +315,15 @@ struct TournamentLookUpView: View { } if locationManager.requestStarted { ProgressView() - } else { + } else if locationManager.manager.authorizationStatus != .restricted { LocationButton { - locationManager.requestLocation() + if locationManager.manager.authorizationStatus == .notDetermined { + locationManager.manager.requestWhenInUseAuthorization() + } else if locationManager.manager.authorizationStatus == .denied { + showingSettingsAlert = true + } else { + locationManager.requestLocation() + } } .symbolVariant(.fill) .foregroundColor (Color.white) @@ -485,4 +501,12 @@ struct TournamentLookUpView: View { return "Distance" } } + + private func _openSettings() { + guard let settingsURL = URL(string: UIApplication.openSettingsURLString) else { + return + } + UIApplication.shared.open(settingsURL) + } + } diff --git a/PadelClub/Views/Tournament/Screen/Components/UpdateSourceRankDateView.swift b/PadelClub/Views/Tournament/Screen/Components/UpdateSourceRankDateView.swift index 07f95d5..ceed51f 100644 --- a/PadelClub/Views/Tournament/Screen/Components/UpdateSourceRankDateView.swift +++ b/PadelClub/Views/Tournament/Screen/Components/UpdateSourceRankDateView.swift @@ -43,30 +43,29 @@ struct UpdateSourceRankDateView: View { Task { do { try await tournament.updateRank(to: currentRankSourceDate) - try await MainActor.run { - tournament.unsortedPlayers().forEach { player in - player.setComputedRank(in: tournament) - } - - try tournamentStore.playerRegistrations.addOrUpdate(contentOfs: tournament.unsortedPlayers()) - - tournament.unsortedTeams().forEach { team in - team.setWeight(from: team.players(), inTournamentCategory: tournament.tournamentCategory) - if forceRefreshLockWeight { - team.lockedWeight = team.weight - } + let unsortedPlayers = tournament.unsortedPlayers() + tournament.unsortedPlayers().forEach { player in + player.setComputedRank(in: tournament) + } + + try tournamentStore.playerRegistrations.addOrUpdate(contentOfs: unsortedPlayers) + + let unsortedTeams = tournament.unsortedTeams() + unsortedTeams.forEach { team in + team.setWeight(from: team.players(), inTournamentCategory: tournament.tournamentCategory) + if forceRefreshLockWeight { + team.lockedWeight = team.weight } - - try tournamentStore.teamRegistrations.addOrUpdate(contentOfs: tournament.unsortedTeams()) - - try dataStore.tournaments.addOrUpdate(instance: tournament) - - updatingRank = false - confirmUpdateRank = false } + + try tournamentStore.teamRegistrations.addOrUpdate(contentOfs: unsortedTeams) + + try dataStore.tournaments.addOrUpdate(instance: tournament) } catch { Logger.error(error) } + updatingRank = false + confirmUpdateRank = false } }.disabled(updatingRank) From 96bbe1fc3231647f412e7550d8c2fb97219b4741 Mon Sep 17 00:00:00 2001 From: Raz Date: Thu, 9 Jan 2025 09:39:02 +0100 Subject: [PATCH 4/4] fix fft jan 2025 --- PadelClub/Data/Tournament.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/PadelClub/Data/Tournament.swift b/PadelClub/Data/Tournament.swift index 5f6ee07..98db9d1 100644 --- a/PadelClub/Data/Tournament.swift +++ b/PadelClub/Data/Tournament.swift @@ -2638,7 +2638,11 @@ extension Tournament { func deadline(for type: TournamentDeadlineType) -> Date? { guard [.p500, .p1000, .p1500, .p2000].contains(tournamentLevel) else { return nil } - if let date = Calendar.current.date(byAdding: .day, value: type.daysOffset, to: startDate) { + var daysOffset = type.daysOffset + if tournamentLevel == .p500 { + daysOffset += 7 + } + if let date = Calendar.current.date(byAdding: .day, value: daysOffset, to: startDate) { let startOfDay = Calendar.current.startOfDay(for: date) return Calendar.current.date(byAdding: type.timeOffset, to: startOfDay) }