diff --git a/PadelClub.xcodeproj/project.pbxproj b/PadelClub.xcodeproj/project.pbxproj index 4002fab..329d149 100644 --- a/PadelClub.xcodeproj/project.pbxproj +++ b/PadelClub.xcodeproj/project.pbxproj @@ -3155,7 +3155,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.10; + MARKETING_VERSION = 1.0.12; PRODUCT_BUNDLE_IDENTIFIER = app.padelclub; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -3198,7 +3198,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.10; + MARKETING_VERSION = 1.0.12; PRODUCT_BUNDLE_IDENTIFIER = app.padelclub; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/PadelClub/Utils/ContactManager.swift b/PadelClub/Utils/ContactManager.swift index 88898bf..5c9d793 100644 --- a/PadelClub/Utils/ContactManager.swift +++ b/PadelClub/Utils/ContactManager.swift @@ -18,6 +18,41 @@ enum ContactManagerError: LocalizedError { case calendarAccessDenied case calendarEventSaveFailed case noCalendarAvailable + case uncalledTeams([TeamRegistration]) + + var localizedDescription: String { + switch self { + case .mailFailed: + return "Le mail n'a pas été envoyé" + case .mailNotSent: + return "Le mail est dans la boîte d'envoi de l'app Mail. Vérifiez son état dans l'app Mail avant d'essayer de le renvoyer." + case .messageFailed: + return "Le SMS n'a pas été envoyé" + case .messageNotSent: + return "Le SMS n'a pas été envoyé" + case .uncalledTeams(let array): + let verb = array.count > 1 ? "peuvent" : "peut" + return "Attention, \(array.count) équipe\(array.count.pluralSuffix) ne \(verb) pas être contacté par la méthode choisie" + case .calendarAccessDenied: + return "Padel Club n'a pas accès à votre calendrier" + case .calendarEventSaveFailed: + return "Padel Club n'a pas réussi à sauver ce tournoi dans votre calendrier" + case .noCalendarAvailable: + return "Padel Club n'a pas réussi à trouver un calendrier pour y inscrire ce tournoi" + } + } + + static func getNetworkErrorMessage(sentError: ContactManagerError?, networkMonitorConnected: Bool) -> String { + var errors: [String] = [] + + if networkMonitorConnected == false { + errors.append("L'appareil n'est pas connecté à internet.") + } + if let sentError { + errors.append(sentError.localizedDescription) + } + return errors.joined(separator: "\n") + } } enum ContactType: Identifiable { diff --git a/PadelClub/Utils/Network/NetworkFederalService.swift b/PadelClub/Utils/Network/NetworkFederalService.swift index 7933f55..846427b 100644 --- a/PadelClub/Utils/Network/NetworkFederalService.swift +++ b/PadelClub/Utils/Network/NetworkFederalService.swift @@ -206,7 +206,7 @@ recherche_type=club&club[autocomplete][value_container][value_field]=\(codeClub. var levelsParameter = "" if levels.isEmpty == false { - levelsParameter = levels.map { "categorie_tournoi[\($0.localizedLabel)]=\($0.localizedLabel)" }.joined(separator: "&") + "&" + levelsParameter = levels.map { "categorie_tournoi[\($0.searchRawValue())]=\($0.searchRawValue())" }.joined(separator: "&") + "&" } var categoriesParameter = "" diff --git a/PadelClub/Utils/PadelRule.swift b/PadelClub/Utils/PadelRule.swift index a30fd68..7e6f922 100644 --- a/PadelClub/Utils/PadelRule.swift +++ b/PadelClub/Utils/PadelRule.swift @@ -293,6 +293,9 @@ enum TournamentLevel: Int, Hashable, Codable, CaseIterable, Identifiable { self.init(rawValue: value) } + func searchRawValue() -> String { + String(describing: self) + } func pointsRange(first: Int, last: Int, teamsCount: Int) -> String { let range = [points(for: first - 1, count: teamsCount), diff --git a/PadelClub/Utils/SourceFileManager.swift b/PadelClub/Utils/SourceFileManager.swift index 917c1b4..ac06446 100644 --- a/PadelClub/Utils/SourceFileManager.swift +++ b/PadelClub/Utils/SourceFileManager.swift @@ -227,23 +227,8 @@ class SourceFileManager { } static func getSortOption() -> [SortOption] { - if canFilterByAge() { - return SortOption.allCases - } else { - return [.name, .rank, .tournamentCount, .points] - } - } - - static func canFilterByAge() -> Bool { - let currentMonthData = DataStore.shared.monthData.first(where: { data in - data.monthKey == DataStore.shared.appSettings.lastDataSource - }) - let currentModelVersion = PersistenceController.getModelVersion() - if let currentMonthData, currentMonthData.fileModelIdentifier == currentModelVersion, currentModelVersion != nil { - return true - } - return false - } + return SortOption.allCases + } } enum SourceFile: String, CaseIterable { diff --git a/PadelClub/ViewModel/SearchViewModel.swift b/PadelClub/ViewModel/SearchViewModel.swift index c5e7d87..8d8e9e7 100644 --- a/PadelClub/ViewModel/SearchViewModel.swift +++ b/PadelClub/ViewModel/SearchViewModel.swift @@ -525,10 +525,7 @@ enum DataSet: Int, Identifiable { _tokens = [.rankMoreThan, .rankLessThan, .rankBetween] } - if SourceFileManager.canFilterByAge() { - _tokens.append(.age) - } - + _tokens.append(.age) return _tokens } } diff --git a/PadelClub/Views/Calling/CallView.swift b/PadelClub/Views/Calling/CallView.swift index 0423958..58f953c 100644 --- a/PadelClub/Views/Calling/CallView.swift +++ b/PadelClub/Views/Calling/CallView.swift @@ -81,13 +81,13 @@ struct CallView: View { } } - private func _called(_ success: Bool) { + private func _called(_ calledTeams: [TeamRegistration], _ success: Bool) { if success { - self.teams.forEach { team in + calledTeams.forEach { team in team.callDate = callDate } do { - try self.tournamentStore.teamRegistrations.addOrUpdate(contentOfs: teams) + try self.tournamentStore.teamRegistrations.addOrUpdate(contentOfs: calledTeams) } catch { Logger.error(error) } @@ -124,6 +124,14 @@ struct CallView: View { .alert("Un problème est survenu", isPresented: messageSentFailed) { Button("OK") { } + + if case .uncalledTeams(let uncalledTeams) = sentError { + NavigationLink("Voir les équipes non contactées") { + TeamsCallingView(teams: uncalledTeams) + .environment(tournament) + } + } + } message: { Text(_networkErrorMessage) } @@ -138,10 +146,20 @@ struct CallView: View { case .failed: self.sentError = .messageFailed case .sent: + let calledTeams = teams.filter { $0.getPhoneNumbers().isEmpty == false } + let uncalledTeams = teams.filter { $0.getPhoneNumbers().isEmpty } + if networkMonitor.connected == false { - self.sentError = .messageNotSent + if uncalledTeams.isEmpty == false { + self.sentError = .uncalledTeams(uncalledTeams) + } else { + self.sentError = .messageNotSent + } } else { - self._called(true) + if uncalledTeams.isEmpty == false { + self.sentError = .uncalledTeams(uncalledTeams) + } + self._called(calledTeams, true) } @unknown default: break @@ -156,11 +174,21 @@ struct CallView: View { self.contactType = nil self.sentError = .mailFailed case .sent: + let calledTeams = teams.filter { $0.getMail().isEmpty == false } + let uncalledTeams = teams.filter { $0.getMail().isEmpty } + if networkMonitor.connected == false { self.contactType = nil - self.sentError = .mailNotSent + if uncalledTeams.isEmpty == false { + self.sentError = .uncalledTeams(uncalledTeams) + } else { + self.sentError = .mailNotSent + } } else { - self._called(true) + if uncalledTeams.isEmpty == false { + self.sentError = .uncalledTeams(uncalledTeams) + } + self._called(calledTeams, true) } @unknown default: break @@ -260,21 +288,7 @@ struct CallView: View { } private var _networkErrorMessage: String { - var errors: [String] = [] - - if networkMonitor.connected == false { - errors.append("L'appareil n'est pas connecté à internet.") - } - if sentError == .mailNotSent { - errors.append("Le mail est dans la boîte d'envoi de l'app Mail. Vérifiez son état dans l'app Mail avant d'essayer de le renvoyer.") - } - if (sentError == .messageFailed || sentError == .messageNotSent) { - errors.append("Le SMS n'a pas été envoyé") - } - if sentError == .mailFailed { - errors.append("Le mail n'a pas été envoyé") - } - return errors.joined(separator: "\n") + ContactManagerError.getNetworkErrorMessage(sentError: sentError, networkMonitorConnected: networkMonitor.connected) } } diff --git a/PadelClub/Views/Calling/Components/PlayersWithoutContactView.swift b/PadelClub/Views/Calling/Components/PlayersWithoutContactView.swift index 6b75e8c..4e8d78e 100644 --- a/PadelClub/Views/Calling/Components/PlayersWithoutContactView.swift +++ b/PadelClub/Views/Calling/Components/PlayersWithoutContactView.swift @@ -13,7 +13,7 @@ struct PlayersWithoutContactView: View { var body: some View { Section { - let withoutEmails = players.filter({ $0.email?.isEmpty == true }) + let withoutEmails = players.filter({ $0.email?.isEmpty == true || $0.email == nil }) DisclosureGroup { ForEach(withoutEmails) { player in NavigationLink { @@ -31,7 +31,7 @@ struct PlayersWithoutContactView: View { } } - let withoutPhones = players.filter({ $0.phoneNumber?.isEmpty == true }) + let withoutPhones = players.filter({ $0.phoneNumber?.isEmpty == true || $0.phoneNumber == nil }) DisclosureGroup { ForEach(withoutPhones) { player in NavigationLink { diff --git a/PadelClub/Views/Calling/GroupStageCallingView.swift b/PadelClub/Views/Calling/GroupStageCallingView.swift index 0b95b62..357df0f 100644 --- a/PadelClub/Views/Calling/GroupStageCallingView.swift +++ b/PadelClub/Views/Calling/GroupStageCallingView.swift @@ -14,6 +14,14 @@ struct GroupStageCallingView: View { var body: some View { let groupStages = tournament.groupStages() List { + + NavigationLink { + TeamsCallingView(teams: groupStages.flatMap({ $0.unsortedTeams() }).filter({ $0.callDate == nil })) + .environment(tournament) + } label: { + LabeledContent("Équipes non contactées", value: groupStages.flatMap({ $0.unsortedTeams() }).filter({ $0.callDate == nil }).count.formatted()) + } + PlayersWithoutContactView(players: groupStages.flatMap({ $0.unsortedTeams() }).flatMap({ $0.unsortedPlayers() }).sorted(by: \.computedRank)) _sameTimeGroupStageView(groupStages: groupStages) diff --git a/PadelClub/Views/Calling/SeedsCallingView.swift b/PadelClub/Views/Calling/SeedsCallingView.swift index d4716dd..abfcec7 100644 --- a/PadelClub/Views/Calling/SeedsCallingView.swift +++ b/PadelClub/Views/Calling/SeedsCallingView.swift @@ -14,6 +14,14 @@ struct SeedsCallingView: View { var body: some View { List { let tournamentRounds = tournament.rounds() + + NavigationLink { + TeamsCallingView(teams: tournament.seededTeams().filter({ $0.callDate == nil })) + .environment(tournament) + } label: { + LabeledContent("Équipes non contactées", value: tournament.seededTeams().filter({ $0.callDate == nil }).count.formatted()) + } + PlayersWithoutContactView(players: tournament.seededTeams().flatMap({ $0.unsortedPlayers() }).sorted(by: \.computedRank)) ForEach(tournamentRounds) { round in @@ -55,6 +63,10 @@ struct SeedsCallingView: View { } } + NavigationLink("Équipes non contactées") { + TeamsCallingView(teams: round.teams().filter({ $0.callDate == nil })) + } + if displayByMatch == false { ForEach(keys, id: \.self) { time in diff --git a/PadelClub/Views/Calling/SendToAllView.swift b/PadelClub/Views/Calling/SendToAllView.swift index e54392e..2dfa04f 100644 --- a/PadelClub/Views/Calling/SendToAllView.swift +++ b/PadelClub/Views/Calling/SendToAllView.swift @@ -121,6 +121,13 @@ struct SendToAllView: View { .alert("Un problème est survenu", isPresented: messageSentFailed) { Button("OK") { } + + if case .uncalledTeams(let uncalledTeams) = sentError { + NavigationLink("Voir les équipes non contactées") { + TeamsCallingView(teams: uncalledTeams) + .environment(tournament) + } + } } message: { Text(_networkErrorMessage) } @@ -135,9 +142,21 @@ struct SendToAllView: View { case .failed: self.sentError = .messageFailed case .sent: + let uncalledTeams = _teams().filter { $0.getPhoneNumbers().isEmpty } + if networkMonitor.connected == false { - self.sentError = .messageNotSent + self.contactType = nil + if uncalledTeams.isEmpty == false { + self.sentError = .uncalledTeams(uncalledTeams) + } else { + self.sentError = .messageNotSent + } + } else { + if uncalledTeams.isEmpty == false { + self.sentError = .uncalledTeams(uncalledTeams) + } } + @unknown default: break } @@ -151,9 +170,19 @@ struct SendToAllView: View { self.contactType = nil self.sentError = .mailFailed case .sent: + let uncalledTeams = _teams().filter { $0.getMail().isEmpty } + if networkMonitor.connected == false { self.contactType = nil - self.sentError = .mailNotSent + if uncalledTeams.isEmpty == false { + self.sentError = .uncalledTeams(uncalledTeams) + } else { + self.sentError = .mailNotSent + } + } else { + if uncalledTeams.isEmpty == false { + self.sentError = .uncalledTeams(uncalledTeams) + } } @unknown default: break @@ -254,23 +283,8 @@ struct SendToAllView: View { } private var _networkErrorMessage: String { - var errors: [String] = [] - - if networkMonitor.connected == false { - errors.append("L'appareil n'est pas connecté à internet.") - } - if sentError == .mailNotSent { - errors.append("Le mail est dans la boîte d'envoi de l'app Mail. Vérifiez son état dans l'app Mail avant d'essayer de le renvoyer.") - } - if (sentError == .messageFailed || sentError == .messageNotSent) { - errors.append("Le SMS n'a pas été envoyé") - } - if sentError == .mailFailed { - errors.append("Le mail n'a pas été envoyé") - } - return errors.joined(separator: "\n") + ContactManagerError.getNetworkErrorMessage(sentError: sentError, networkMonitorConnected: networkMonitor.connected) } - } //#Preview { diff --git a/PadelClub/Views/Calling/TeamsCallingView.swift b/PadelClub/Views/Calling/TeamsCallingView.swift index 86e4d23..986322d 100644 --- a/PadelClub/Views/Calling/TeamsCallingView.swift +++ b/PadelClub/Views/Calling/TeamsCallingView.swift @@ -10,10 +10,10 @@ import LeStorage struct TeamsCallingView: View { @Environment(Tournament.self) var tournament: Tournament - + let teams : [TeamRegistration] + var body: some View { List { - let teams = tournament.selectedSortedTeams() Section { ForEach(teams) { team in Menu { @@ -21,13 +21,11 @@ struct TeamsCallingView: View { } label: { HStack { TeamRowView(team: team, displayCallDate: true) - if team.called() { - Spacer() - Menu { - _menuOptions(team: team) - } label: { - LabelOptions().labelStyle(.iconOnly) - } + Spacer() + Menu { + _menuOptions(team: team) + } label: { + LabelOptions().labelStyle(.iconOnly) } } } @@ -70,6 +68,21 @@ struct TeamsCallingView: View { } label: { Text("Effacer la date de convocation") } + + + Divider() + + Button(role: .destructive) { + team.callDate = team.initialMatch()?.startDate ?? tournament.startDate + do { + try self.tournament.tournamentStore.teamRegistrations.addOrUpdate(instance: team) + } catch { + Logger.error(error) + } + } label: { + Text("Indiquer comme convoquée") + } + } } diff --git a/PadelClub/Views/GroupStage/Components/GroupStageTeamView.swift b/PadelClub/Views/GroupStage/Components/GroupStageTeamView.swift index a7b9a8f..0d87d01 100644 --- a/PadelClub/Views/GroupStage/Components/GroupStageTeamView.swift +++ b/PadelClub/Views/GroupStage/Components/GroupStageTeamView.swift @@ -110,7 +110,16 @@ struct GroupStageTeamView: View { self.sentError = .messageFailed case .sent: if networkMonitor.connected == false { - self.sentError = .messageNotSent + self.contactType = nil + if team.getPhoneNumbers().isEmpty == false { + self.sentError = .uncalledTeams([team]) + } else { + self.sentError = .messageNotSent + } + } else { + if team.getPhoneNumbers().isEmpty == false { + self.sentError = .uncalledTeams([team]) + } } @unknown default: break @@ -132,7 +141,15 @@ struct GroupStageTeamView: View { case .sent: if networkMonitor.connected == false { self.contactType = nil - self.sentError = .mailNotSent + if team.getMail().isEmpty == false { + self.sentError = .uncalledTeams([team]) + } else { + self.sentError = .mailNotSent + } + } else { + if team.getMail().isEmpty == false { + self.sentError = .uncalledTeams([team]) + } } @unknown default: break @@ -153,21 +170,7 @@ struct GroupStageTeamView: View { } private var _networkErrorMessage: String { - var errors: [String] = [] - - if networkMonitor.connected == false { - errors.append("L'appareil n'est pas connecté à internet.") - } - if sentError == .mailNotSent { - errors.append("Le mail est dans la boîte d'envoi de l'app Mail. Vérifiez son état dans l'app Mail avant d'essayer de le renvoyer.") - } - if (sentError == .messageFailed || sentError == .messageNotSent) { - errors.append("Le SMS n'a pas été envoyé") - } - if sentError == .mailFailed { - errors.append("Le mail n'a pas été envoyé") - } - return errors.joined(separator: "\n") + ContactManagerError.getNetworkErrorMessage(sentError: sentError, networkMonitorConnected: networkMonitor.connected) } private func _save() { diff --git a/PadelClub/Views/Match/MatchDetailView.swift b/PadelClub/Views/Match/MatchDetailView.swift index 0944147..bf7c291 100644 --- a/PadelClub/Views/Match/MatchDetailView.swift +++ b/PadelClub/Views/Match/MatchDetailView.swift @@ -210,8 +210,19 @@ struct MatchDetailView: View { case .failed: self.sentError = .messageFailed case .sent: + let uncalledTeams = match.teams().filter { $0.getPhoneNumbers().isEmpty } + if networkMonitor.connected == false { - self.sentError = .messageNotSent + self.contactType = nil + if uncalledTeams.isEmpty == false { + self.sentError = .uncalledTeams(uncalledTeams) + } else { + self.sentError = .messageNotSent + } + } else { + if uncalledTeams.isEmpty == false { + self.sentError = .uncalledTeams(uncalledTeams) + } } @unknown default: break @@ -226,9 +237,19 @@ struct MatchDetailView: View { self.contactType = nil self.sentError = .mailFailed case .sent: + let uncalledTeams = match.teams().filter { $0.getMail().isEmpty } + if networkMonitor.connected == false { self.contactType = nil - self.sentError = .mailNotSent + if uncalledTeams.isEmpty == false { + self.sentError = .uncalledTeams(uncalledTeams) + } else { + self.sentError = .mailNotSent + } + } else { + if uncalledTeams.isEmpty == false { + self.sentError = .uncalledTeams(uncalledTeams) + } } @unknown default: break @@ -529,23 +550,8 @@ struct MatchDetailView: View { } private var _networkErrorMessage: String { - var errors: [String] = [] - - if networkMonitor.connected == false { - errors.append("L'appareil n'est pas connecté à internet.") - } - if sentError == .mailNotSent { - errors.append("Le mail est dans la boîte d'envoi de l'app Mail. Vérifiez son état dans l'app Mail avant d'essayer de le renvoyer.") - } - if (sentError == .messageFailed || sentError == .messageNotSent) { - errors.append("Le SMS n'a pas été envoyé") - } - if sentError == .mailFailed { - errors.append("Le mail n'a pas été envoyé") - } - return errors.joined(separator: "\n") + ContactManagerError.getNetworkErrorMessage(sentError: sentError, networkMonitorConnected: networkMonitor.connected) } - } //#Preview { diff --git a/PadelClub/Views/Navigation/Agenda/TournamentLookUpView.swift b/PadelClub/Views/Navigation/Agenda/TournamentLookUpView.swift index 2f64f44..000ba3f 100644 --- a/PadelClub/Views/Navigation/Agenda/TournamentLookUpView.swift +++ b/PadelClub/Views/Navigation/Agenda/TournamentLookUpView.swift @@ -267,7 +267,7 @@ struct TournamentLookUpView: View { Text(2.formatted()).tag(2 as Int?) Text(3.formatted()).tag(3 as Int?) } label: { - Text("Durée max (en jours)") + Text("Durée souhaitée (en jours)") } Picker(selection: $appSettings.dayPeriod) { diff --git a/PadelClub/Views/Navigation/Agenda/TournamentSubscriptionView.swift b/PadelClub/Views/Navigation/Agenda/TournamentSubscriptionView.swift index 9fc0961..fcf20e0 100644 --- a/PadelClub/Views/Navigation/Agenda/TournamentSubscriptionView.swift +++ b/PadelClub/Views/Navigation/Agenda/TournamentSubscriptionView.swift @@ -204,13 +204,10 @@ struct TournamentSubscriptionView: View { Label("Prévenir votre partenaire", systemImage: "person.2") } - Button("Ajouter à votre agenda") { + Button("Ajouter à votre agenda", systemImage: "calendar") { addEvent() } - ShareLink(item: federalTournament.shareMessage) { - Label("Partager les infos", systemImage: "info") - } Link(destination: URL(string:"https://tenup.fft.fr/tournoi/\(federalTournament.id)")!) { Label("Voir sur Tenup", systemImage: "tennisball") } @@ -226,7 +223,12 @@ struct TournamentSubscriptionView: View { Button("OK") { } - if sentError == .calendarAccessDenied || sentError == .noCalendarAvailable { + if case .calendarAccessDenied = sentError { + Button("Voir vos réglages") { + openAppSettings() + } + } + if case .noCalendarAvailable = sentError{ Button("Voir vos réglages") { openAppSettings() } @@ -290,14 +292,14 @@ struct TournamentSubscriptionView: View { var messageBody: String { let bonjourOuBonsoir = Date().timeOfDay.hello let bonneSoireeOuBonneJournee = Date().timeOfDay.goodbye - let body = [["\(bonjourOuBonsoir),\n\nJe souhaiterais inscrire mon équipe au tournoi : ", build.buildHolderTitle(), "du", federalTournament.computedStartDate, "au", federalTournament.clubLabel() + ".\n"].compacted().joined(separator: " "), teamsString, "\nCordialement,\n", user.fullName() ?? bonneSoireeOuBonneJournee, "----------------------------------\nCe message a été préparé grâce à l'application Padel Club !"].compactMap { $0 }.joined(separator: "\n") + "\n" + let body = [["\(bonjourOuBonsoir),\n\nJe souhaiterais inscrire mon équipe au tournoi : ", build.buildHolderTitle(), "du", federalTournament.computedStartDate, "au", federalTournament.clubLabel() + ".\n"].compacted().joined(separator: " "), teamsString, "\nCordialement,\n", user.fullName() ?? bonneSoireeOuBonneJournee, "----------------------------------\nCe message a été préparé grâce à l'application Padel Club !\n\(URLs.appStore.rawValue)"].compactMap { $0 }.joined(separator: "\n") + "\n" return body } var messageBodyShort: String { let bonjourOuBonsoir = Date().timeOfDay.hello let bonneSoireeOuBonneJournee = Date().timeOfDay.goodbye - let body = [["\(bonjourOuBonsoir),\n\nJe souhaiterais inscrire mon équipe au tournoi : ", build.buildHolderTitle(), "du", federalTournament.computedStartDate, "au", federalTournament.clubLabel() + ".\n"].compacted().joined(separator: " "), teamsString, "\nCordialement,\n", user.fullName() ?? bonneSoireeOuBonneJournee].compactMap { $0 }.joined(separator: "\n") + "\n" + let body = [["\(bonjourOuBonsoir),\n\nJe souhaiterais inscrire mon équipe au tournoi : ", build.buildHolderTitle(), "du", federalTournament.computedStartDate, "au", federalTournament.clubLabel() + ".\n"].compacted().joined(separator: " "), teamsString, "\nCordialement,\n", user.fullName() ?? bonneSoireeOuBonneJournee, "----------------------------------\nCe message a été préparé grâce à l'application Padel Club !\n\(URLs.appStore.rawValue)"].compactMap { $0 }.joined(separator: "\n") + "\n" return body } @@ -322,35 +324,7 @@ struct TournamentSubscriptionView: View { } private var _networkErrorMessage: String { - var errors: [String] = [] - - if networkMonitor.connected == false { - errors.append("L'appareil n'est pas connecté à internet.") - } - if sentError == .mailNotSent { - errors.append("Le mail est dans la boîte d'envoi de l'app Mail. Vérifiez son état dans l'app Mail avant d'essayer de le renvoyer.") - } - if (sentError == .messageFailed || sentError == .messageNotSent) { - errors.append("Le SMS n'a pas été envoyé") - } - if sentError == .mailFailed { - errors.append("Le mail n'a pas été envoyé") - } - - if sentError == .calendarAccessDenied { - errors.append("Padel Club n'a pas accès à votre calendrier") - } - - if sentError == .calendarEventSaveFailed { - errors.append("Padel Club n'a pas réussi à sauver ce tournoi dans votre calendrier") - } - - if sentError == .noCalendarAvailable { - errors.append("Padel Club n'a pas réussi à trouver un calendrier pour y inscrire ce tournoi") - } - - - return errors.joined(separator: "\n") + ContactManagerError.getNetworkErrorMessage(sentError: sentError, networkMonitorConnected: networkMonitor.connected) } func openAppSettings() { diff --git a/PadelClub/Views/Shared/SelectablePlayerListView.swift b/PadelClub/Views/Shared/SelectablePlayerListView.swift index 7ba50a3..8ecd8cc 100644 --- a/PadelClub/Views/Shared/SelectablePlayerListView.swift +++ b/PadelClub/Views/Shared/SelectablePlayerListView.swift @@ -91,21 +91,20 @@ struct SelectablePlayerListView: View { } Divider() - if SourceFileManager.canFilterByAge() { - Section { - Picker(selection: $searchViewModel.selectedAgeCategory) { - ForEach(FederalTournamentAge.allCases) { ageCategory in - Text(ageCategory.localizedLabel(.title)).tag(ageCategory) - } - } label: { - Text("Catégorie d'âge") + Section { + Picker(selection: $searchViewModel.selectedAgeCategory) { + ForEach(FederalTournamentAge.allCases) { ageCategory in + Text(ageCategory.localizedLabel(.title)).tag(ageCategory) } - - } header: { + } label: { Text("Catégorie d'âge") } - Divider() + + } header: { + Text("Catégorie d'âge") } + Divider() + Section { Toggle(isOn: .init(get: { return searchViewModel.hideAssimilation == false diff --git a/PadelClub/Views/Shared/SupportButtonView.swift b/PadelClub/Views/Shared/SupportButtonView.swift index 5117abb..0586c88 100644 --- a/PadelClub/Views/Shared/SupportButtonView.swift +++ b/PadelClub/Views/Shared/SupportButtonView.swift @@ -103,21 +103,6 @@ struct SupportButtonView: View { } private var _networkErrorMessage: String { - var errors: [String] = [] - - if networkMonitor.connected == false { - errors.append("L'appareil n'est pas connecté à internet.") - } - if sentError == .mailNotSent { - errors.append("Le mail est dans la boîte d'envoi de l'app Mail. Vérifiez son état dans l'app Mail avant d'essayer de le renvoyer.") - } - if (sentError == .messageFailed || sentError == .messageNotSent) { - errors.append("Le SMS n'a pas été envoyé") - } - if sentError == .mailFailed { - errors.append("Le mail n'a pas été envoyé") - } - return errors.joined(separator: "\n") + ContactManagerError.getNetworkErrorMessage(sentError: sentError, networkMonitorConnected: networkMonitor.connected) } - } diff --git a/PadelClub/Views/Shared/TournamentFilterView.swift b/PadelClub/Views/Shared/TournamentFilterView.swift index 9d0a2c3..8e84a0b 100644 --- a/PadelClub/Views/Shared/TournamentFilterView.swift +++ b/PadelClub/Views/Shared/TournamentFilterView.swift @@ -36,7 +36,7 @@ struct TournamentFilterView: View { Text(2.formatted()).tag(2 as Int?) Text(3.formatted()).tag(3 as Int?) } label: { - Text("Durée max (en jours)") + Text("Durée souhaitée (en jours)") } Picker(selection: $federalDataViewModel.dayPeriod) { diff --git a/PadelClub/Views/Team/EditingTeamView.swift b/PadelClub/Views/Team/EditingTeamView.swift index f40c291..7e5f4be 100644 --- a/PadelClub/Views/Team/EditingTeamView.swift +++ b/PadelClub/Views/Team/EditingTeamView.swift @@ -200,8 +200,19 @@ struct EditingTeamView: View { case .failed: self.sentError = .messageFailed case .sent: + let uncalledTeams = team.getPhoneNumbers().isEmpty + if networkMonitor.connected == false { - self.sentError = .messageNotSent + self.contactType = nil + if team.getPhoneNumbers().isEmpty == false { + self.sentError = .uncalledTeams([team]) + } else { + self.sentError = .messageNotSent + } + } else { + if team.getPhoneNumbers().isEmpty == false { + self.sentError = .uncalledTeams([team]) + } } @unknown default: break @@ -221,9 +232,19 @@ struct EditingTeamView: View { self.contactType = nil self.sentError = .mailFailed case .sent: + let uncalledTeams = team.getMail().isEmpty + if networkMonitor.connected == false { self.contactType = nil - self.sentError = .mailNotSent + if team.getMail().isEmpty == false { + self.sentError = .uncalledTeams([team]) + } else { + self.sentError = .mailNotSent + } + } else { + if team.getMail().isEmpty == false { + self.sentError = .uncalledTeams([team]) + } } @unknown default: break @@ -294,23 +315,8 @@ struct EditingTeamView: View { } private var _networkErrorMessage: String { - var errors: [String] = [] - - if networkMonitor.connected == false { - errors.append("L'appareil n'est pas connecté à internet.") - } - if sentError == .mailNotSent { - errors.append("Le mail est dans la boîte d'envoi de l'app Mail. Vérifiez son état dans l'app Mail avant d'essayer de le renvoyer.") - } - if (sentError == .messageFailed || sentError == .messageNotSent) { - errors.append("Le SMS n'a pas été envoyé") - } - if sentError == .mailFailed { - errors.append("Le mail n'a pas été envoyé") - } - return errors.joined(separator: "\n") + ContactManagerError.getNetworkErrorMessage(sentError: sentError, networkMonitorConnected: networkMonitor.connected) } - } //#Preview { diff --git a/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift b/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift index 58f26f4..353fd7e 100644 --- a/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift +++ b/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift @@ -24,7 +24,6 @@ struct InscriptionManagerView: View { @EnvironmentObject var dataStore: DataStore - @EnvironmentObject var networkMonitor: NetworkMonitor @Environment(\.dismiss) var dismiss var tournament: Tournament @@ -45,9 +44,6 @@ struct InscriptionManagerView: View { @State private var filterMode: FilterMode = .all @State private var sortingMode: SortingMode = .teamWeight @State private var byDecreasingOrdering: Bool = false - @State private var contactType: ContactType? = nil - @State private var sentError: ContactManagerError? = nil - @State private var showSubscriptionView: Bool = false @State private var confirmDuplicate: Bool = false @State private var presentAddTeamView: Bool = false @State private var compactMode: Bool = true @@ -56,17 +52,6 @@ struct InscriptionManagerView: View { var tournamentStore: TournamentStore { return self.tournament.tournamentStore } - - var messageSentFailed: Binding { - Binding { - sentError != nil - } set: { newValue in - if newValue == false { - sentError = nil - } - } - } - enum SortingMode: Int, Identifiable, CaseIterable { var id: Int { self.rawValue } @@ -238,61 +223,6 @@ struct InscriptionManagerView: View { .onDisappear { _handleHashDiff() } - .alert("Un problème est survenu", isPresented: messageSentFailed) { - Button("OK") { - } - } message: { - Text(_networkErrorMessage) - } - .sheet(item: $contactType) { contactType in - Group { - switch contactType { - case .message(_, let recipients, let body, _): - if Guard.main.paymentForNewTournament() != nil { - MessageComposeView(recipients: recipients, body: body) { result in - switch result { - case .cancelled: - break - case .failed: - self.sentError = .messageFailed - case .sent: - if networkMonitor.connected == false { - self.sentError = .messageNotSent - } - @unknown default: - break - } - } - } else { - SubscriptionView(isPresented: self.$showSubscriptionView, showLackOfPlanMessage: true) - .environment(\.colorScheme, .light) - } - case .mail(_, let recipients, let bccRecipients, let body, let subject, _): - if Guard.main.paymentForNewTournament() != nil { - MailComposeView(recipients: recipients, bccRecipients: bccRecipients, body: body, subject: subject) { result in - switch result { - case .cancelled, .saved: - self.contactType = nil - case .failed: - self.contactType = nil - self.sentError = .mailFailed - case .sent: - if networkMonitor.connected == false { - self.contactType = nil - self.sentError = .mailNotSent - } - @unknown default: - break - } - } - } else { - SubscriptionView(isPresented: self.$showSubscriptionView, showLackOfPlanMessage: true) - .environment(\.colorScheme, .light) - } - } - } - .tint(.master) - } .sheet(isPresented: $isLearningMore) { LearnMoreSheetView(tournament: tournament) .tint(.master) @@ -997,25 +927,6 @@ struct InscriptionManagerView: View { Logger.error(error) } } - - private var _networkErrorMessage: String { - var errors: [String] = [] - - if networkMonitor.connected == false { - errors.append("L'appareil n'est pas connecté à internet.") - } - if sentError == .mailNotSent { - errors.append("Le mail est dans la boîte d'envoi de l'app Mail. Vérifiez son état dans l'app Mail avant d'essayer de le renvoyer.") - } - if (sentError == .messageFailed || sentError == .messageNotSent) { - errors.append("Le SMS n'a pas été envoyé") - } - if sentError == .mailFailed { - errors.append("Le mail n'a pas été envoyé") - } - return errors.joined(separator: "\n") - } - } //#Preview { diff --git a/PadelClub/Views/Tournament/Screen/TournamentCallView.swift b/PadelClub/Views/Tournament/Screen/TournamentCallView.swift index 94cc2dd..8b93bda 100644 --- a/PadelClub/Views/Tournament/Screen/TournamentCallView.swift +++ b/PadelClub/Views/Tournament/Screen/TournamentCallView.swift @@ -106,7 +106,7 @@ struct TournamentCallView: View { case .some(let selectedCall): switch selectedCall { case .teams: - TeamsCallingView() + TeamsCallingView(teams: tournament.selectedSortedTeams()) case .groupStages: GroupStageCallingView() case .seeds: