diff --git a/PadelClub/Utils/ContactManager.swift b/PadelClub/Utils/ContactManager.swift index 88898bf..3c6b01b 100644 --- a/PadelClub/Utils/ContactManager.swift +++ b/PadelClub/Utils/ContactManager.swift @@ -18,6 +18,43 @@ 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 ? "peut" : "peuvent" + 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" + default: + break + } + } + + 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/Views/Calling/CallView.swift b/PadelClub/Views/Calling/CallView.swift index 0423958..d29510a 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) } @@ -138,10 +138,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 +166,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 +280,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/SendToAllView.swift b/PadelClub/Views/Calling/SendToAllView.swift index e54392e..e1f2504 100644 --- a/PadelClub/Views/Calling/SendToAllView.swift +++ b/PadelClub/Views/Calling/SendToAllView.swift @@ -135,9 +135,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 +163,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 +276,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/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/TournamentSubscriptionView.swift b/PadelClub/Views/Navigation/Agenda/TournamentSubscriptionView.swift index 9fc0961..7542a43 100644 --- a/PadelClub/Views/Navigation/Agenda/TournamentSubscriptionView.swift +++ b/PadelClub/Views/Navigation/Agenda/TournamentSubscriptionView.swift @@ -226,7 +226,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() } @@ -322,35 +327,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/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/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 {