@ -6,6 +6,7 @@
//
import SwiftUI
import EventKit
struct TournamentSubscriptionView : View {
@ EnvironmentObject var networkMonitor : NetworkMonitor
@ -17,6 +18,8 @@ struct TournamentSubscriptionView: View {
@ State private var selectedPlayers : [ ImportedPlayer ]
@ State private var contactType : ContactType ? = nil
@ State private var sentError : ContactManagerError ? = nil
@ State private var didSendMessage : Bool = false
@ State private var didSaveInCalendar : Bool = false
init ( federalTournament : FederalTournament , build : any TournamentBuildHolder , user : User ) {
self . federalTournament = federalTournament
@ -25,8 +28,79 @@ struct TournamentSubscriptionView: View {
_selectedPlayers = . init ( wrappedValue : [ user . currentPlayerData ( ) ] . compactMap ( { $0 } ) )
}
func hasPartner ( ) -> Bool {
selectedPlayers . count = = 2
}
func inscriptionSent ( ) -> Bool {
didSendMessage
}
func addEvent ( ) {
let eventStore = EKEventStore ( )
eventStore . requestWriteOnlyAccessToEvents { ( granted , error ) in
if granted && error = = nil {
print ( " Access granted " )
let startDate = federalTournament . startDate
let endDate = federalTournament . dateFin ? ? federalTournament . startDate . endOfDay ( )
addEventToCalendar ( title : messageSubject , startDate : startDate , endDate : endDate )
didSaveInCalendar = true
} else {
print ( " Access denied or error occurred: \( String ( describing : error ? . localizedDescription ) ) " )
sentError = . calendarAccessDenied
}
}
}
func addEventToCalendar ( title : String , startDate : Date , endDate : Date ) {
let eventStore = EKEventStore ( )
if eventStore . defaultCalendarForNewEvents = = nil {
sentError = . noCalendarAvailable
return
}
eventStore . requestWriteOnlyAccessToEvents { ( granted , error ) in
if granted && error = = nil {
let event = EKEvent ( eventStore : eventStore )
event . title = title
event . isAllDay = true
event . startDate = startDate
event . endDate = endDate
event . calendar = eventStore . defaultCalendarForNewEvents
event . notes = noteCalendar
event . location = federalTournament . clubLabel ( )
do {
try eventStore . save ( event , span : . thisEvent )
didSaveInCalendar = true
print ( " Event saved " )
} catch let error {
print ( " Failed to save event: \( error . localizedDescription ) " )
sentError = . calendarEventSaveFailed
}
} else {
print ( " Access denied or error occurred: \( String ( describing : error ? . localizedDescription ) ) " )
sentError = . calendarAccessDenied
}
}
}
var body : some View {
List {
if didSaveInCalendar {
Section {
LabeledContent {
Image ( systemName : " checkmark " ) . foregroundStyle ( . green )
} label : {
Text ( " Le tournoi a bien été ajouté dans votre calendrier par défaut " )
let eventStore = EKEventStore ( )
if let defaultCalendarForNewEvents = eventStore . defaultCalendarForNewEvents {
Text ( defaultCalendarForNewEvents . title )
}
}
}
}
Section {
LabeledContent ( " Tournoi " ) {
Text ( federalTournament . libelle ? ? " Tournoi " )
@ -121,6 +195,17 @@ struct TournamentSubscriptionView: View {
}
. toolbar ( content : {
Menu {
ShareLink ( item : federalTournament . sharePartnerMessage ) {
Label ( " Prévenir votre partenaire " , systemImage : " person.2 " )
}
Button ( " Ajouter à votre agenda " ) {
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 " )
}
@ -134,6 +219,13 @@ struct TournamentSubscriptionView: View {
. alert ( " Un problème est survenu " , isPresented : messageSentFailed ) {
Button ( " OK " ) {
}
if sentError = = . calendarAccessDenied || sentError = = . noCalendarAvailable {
Button ( " Voir vos réglages " ) {
openAppSettings ( )
}
}
} message : {
Text ( _networkErrorMessage )
}
@ -150,6 +242,8 @@ struct TournamentSubscriptionView: View {
case . sent :
if networkMonitor . connected = = false {
self . sentError = . messageNotSent
} else {
self . didSendMessage = true
}
@ unknown default :
break
@ -167,6 +261,8 @@ struct TournamentSubscriptionView: View {
if networkMonitor . connected = = false {
self . contactType = nil
self . sentError = . mailNotSent
} else {
self . didSendMessage = true
}
@ unknown default :
break
@ -188,12 +284,19 @@ struct TournamentSubscriptionView: View {
var messageBody : String {
let bonjourOuBonsoir = Date ( ) . timeOfDay . hello
let bonneSoireeOuBonneJournee = Date ( ) . timeOfDay . goodbye
let body = [ [ " \( bonjourOuBonsoir ) , \n \n Je souhaiterais inscrire mon équipe au tournoi : " , build . buildHolderTitle ( ) , " du " , federalTournament . computedStartDate , " au " , federalTournament . clubLabel ( ) + " . \n " ] . compacted ( ) . joined ( separator : " " ) , teamsString , " \n Cordialement, \n " , user . fullName ( ) ? ? bonneSoireeOuBonneJournee , " ---------------------------------- \n Ce message a été préparé grâce à l'application Padel Club ! \n Votre tournoi n'est pas encore dessus ? \( URLs . main . rawValue ) " , " Téléchargez l'app : \( URLs . appStore . rawValue ) " , " En savoir plus : \( URLs . appDescription . rawValue ) " ] . compactMap { $0 } . joined ( separator : " \n " ) + " \n "
let body = [ [ " \( bonjourOuBonsoir ) , \n \n Je souhaiterais inscrire mon équipe au tournoi : " , build . buildHolderTitle ( ) , " du " , federalTournament . computedStartDate , " au " , federalTournament . clubLabel ( ) + " . \n " ] . compacted ( ) . joined ( separator : " " ) , teamsString , " \n Cordialement, \n " , user . fullName ( ) ? ? bonneSoireeOuBonneJournee , " ---------------------------------- \n Ce message a été préparé grâce à l'application Padel Club ! " ] . compactMap { $0 } . joined ( separator : " \n " ) + " \n "
return body
}
var messageBodyShort : String {
let body = [ [ build . buildHolderTitle ( ) , federalTournament . clubLabel ( ) ] . compacted ( ) . joined ( separator : " " ) , federalTournament . computedStartDate , teamsString ] . compacted ( ) . joined ( separator : " \n " ) + " \n "
let bonjourOuBonsoir = Date ( ) . timeOfDay . hello
let bonneSoireeOuBonneJournee = Date ( ) . timeOfDay . goodbye
let body = [ [ " \( bonjourOuBonsoir ) , \n \n Je souhaiterais inscrire mon équipe au tournoi : " , build . buildHolderTitle ( ) , " du " , federalTournament . computedStartDate , " au " , federalTournament . clubLabel ( ) + " . \n " ] . compacted ( ) . joined ( separator : " " ) , teamsString , " \n Cordialement, \n " , user . fullName ( ) ? ? bonneSoireeOuBonneJournee ] . compactMap { $0 } . joined ( separator : " \n " ) + " \n "
return body
}
var noteCalendar : String {
let body = [ [ build . buildHolderTitle ( ) , " du " , federalTournament . computedStartDate , " au " , federalTournament . clubLabel ( ) + " . \n " ] . compacted ( ) . joined ( separator : " " ) , teamsString , federalTournament . calendarNoteMessage ( ) ] . compactMap { $0 } . joined ( separator : " \n " ) + " \n "
return body
}
@ -227,6 +330,29 @@ struct TournamentSubscriptionView: View {
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 " )
}
func openAppSettings ( ) {
if let appSettings = URL ( string : UIApplication . openSettingsURLString ) {
if UIApplication . shared . canOpenURL ( appSettings ) {
UIApplication . shared . open ( appSettings , options : [ : ] , completionHandler : nil )
}
}
}
}