@ -24,7 +24,7 @@ struct CallView: View {
Text ( " Aucun horaire " ) . font ( . body )
Text ( " Aucun horaire " ) . font ( . body )
}
}
Spacer ( )
Spacer ( )
Text ( count . formatted ( ) + " / " + total . formatted ( ) )
Text ( " \( count . formatted ( ) ) / \( total . formatted ( ) ) " )
}
}
. font ( . largeTitle )
. font ( . largeTitle )
HStack {
HStack {
@ -61,6 +61,10 @@ struct CallView: View {
@ State private var sentError : ContactManagerError ? = nil
@ State private var sentError : ContactManagerError ? = nil
@ State var showSubscriptionView : Bool = false
@ State var showSubscriptionView : Bool = false
@ State var showUserCreationView : Bool = false
@ State var summonParamByMessage : Bool = false
@ State var summonParamReSummon : Bool = false
var messageSentFailed : Binding < Bool > {
var messageSentFailed : Binding < Bool > {
Binding {
Binding {
@ -74,7 +78,7 @@ struct CallView: View {
private func _called ( _ success : Bool ) {
private func _called ( _ success : Bool ) {
if success {
if success {
teams . forEach { team in
self . teams . forEach { team in
team . callDate = callDate
team . callDate = callDate
}
}
do {
do {
@ -90,25 +94,25 @@ struct CallView: View {
}
}
var reSummon : Bool {
var reSummon : Bool {
teams . allSatisfy ( { $0 . called ( ) } )
return self . teams . allSatisfy ( { $0 . called ( ) } )
}
}
var body : some View {
var body : some View {
let callWord : String = ( reSummon ? " Reconvoquer " : " Convoquer " )
let callWord : String = ( reSummon ? " Reconvoquer " : " Convoquer " )
HStack {
HStack {
if teams . count = = 1 {
if self . teams . count = = 1 {
if let previousCallDate = teams . first ? . callDate , Calendar . current . compare ( previousCallDate , to : callDate , toGranularity : . minute ) != . orderedSame {
if let previousCallDate = teams . first ? . callDate , Calendar . current . compare ( previousCallDate , to : callDate , toGranularity : . minute ) != . orderedSame {
Text ( " Reconvoquer " + callDate . localizedDate ( ) + " par " )
Text ( " Reconvoquer \( self . callDate . localizedDate ( ) ) par " )
} else {
} else {
Text ( callWord + " cette paire par " )
Text ( " \( callWord ) cette paire par " )
}
}
} else {
} else {
Text ( callWord + " ces \( teams . count ) paires par " )
Text ( " \( callWord ) ces \( self . teams . count ) paires par " )
}
}
_summonMenu ( byMessage : true )
self . _summonMenu ( byMessage : true )
Text ( " ou " )
Text ( " ou " )
_summonMenu ( byMessage : false )
self . _summonMenu ( byMessage : false )
}
}
. font ( . subheadline )
. font ( . subheadline )
. buttonStyle ( . borderless )
. buttonStyle ( . borderless )
@ -116,29 +120,28 @@ struct CallView: View {
Button ( " OK " ) {
Button ( " OK " ) {
}
}
} message : {
} message : {
let message = [ networkMonitor . connected = = false ? " L'appareil n'est pas connecté à internet. " as String ? : nil , sentError = = . mailNotSent ? " 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. " as String ? : nil , ( sentError = = . messageFailed || sentError = = . messageNotSent ) ? " Le SMS n'a pas été envoyé " as String ? : nil , sentError = = . mailFailed ? " Le mail n'a pas été envoyé " as String ? : nil ] . compacted ( ) . joined ( separator : " \n " )
Text ( self . _failureMessage ( ) )
Text ( message )
}
}
. sheet ( item : $ contactType ) { contactType in
. sheet ( item : $ contactType ) { contactType in
Group {
Group {
switch contactType {
switch contactType {
case . message ( _ , let recipients , let body , _ ) :
case . message ( _ , let recipients , let body , _ ) :
MessageComposeView ( recipients : recipients , body : body ) { result in
MessageComposeView ( recipients : recipients , body : body ) { result in
switch result {
switch result {
case . cancelled :
case . cancelled :
break
break
case . failed :
case . failed :
self . sentError = . messageFailed
self . sentError = . messageFailed
case . sent :
case . sent :
if networkMonitor . connected = = false {
if networkMonitor . connected = = false {
self . sentError = . messageNotSent
self . sentError = . messageNotSent
} else {
} else {
_called ( true )
self . _called ( true )
}
@ unknown default :
break
}
}
}
@ unknown default :
break
}
}
case . mail ( _ , let recipients , let bccRecipients , let body , let subject , _ ) :
case . mail ( _ , let recipients , let bccRecipients , let body , let subject , _ ) :
MailComposeView ( recipients : recipients , bccRecipients : bccRecipients , body : body , subject : subject ) { result in
MailComposeView ( recipients : recipients , bccRecipients : bccRecipients , body : body , subject : subject ) { result in
switch result {
switch result {
@ -152,7 +155,7 @@ struct CallView: View {
self . contactType = nil
self . contactType = nil
self . sentError = . mailNotSent
self . sentError = . mailNotSent
} else {
} else {
_called ( true )
self . _called ( true )
}
}
@ unknown default :
@ unknown default :
break
break
@ -167,18 +170,35 @@ struct CallView: View {
SubscriptionView ( isPresented : self . $ showSubscriptionView , showLackOfPlanMessage : true )
SubscriptionView ( isPresented : self . $ showSubscriptionView , showLackOfPlanMessage : true )
}
}
} )
} )
. sheet ( isPresented : self . $ showUserCreationView , content : {
NavigationStack {
LoginView { _ in
self . showUserCreationView = false
self . _summon ( byMessage : self . summonParamByMessage ,
reSummon : self . summonParamByMessage )
}
}
} )
}
fileprivate func _failureMessage ( ) -> String {
return [ networkMonitor . connected = = false ? " L'appareil n'est pas connecté à internet. " as String ? : nil ,
sentError = = . mailNotSent ? " 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. " as String ? : nil ,
( sentError = = . messageFailed || sentError = = . messageNotSent ) ? " Le SMS n'a pas été envoyé " as String ? : nil ,
sentError = = . mailFailed ? " Le mail n'a pas été envoyé " as String ? : nil ]
. compacted ( ) . joined ( separator : " \n " )
}
}
@ ViewBuilder
@ ViewBuilder
private func _summonMenu ( byMessage : Bool ) -> some View {
private func _summonMenu ( byMessage : Bool ) -> some View {
if reSummon {
if self . reSummon {
Menu {
Menu {
Button ( " Convoquer " ) {
Button ( " Convoquer " ) {
_summon ( byMessage : byMessage , reSummon : false )
self . _summon ( byMessage : byMessage , reSummon : false )
}
}
Button ( " Re-convoquer " ) {
Button ( " Re-convoquer " ) {
_summon ( byMessage : byMessage , reSummon : true )
self . _summon ( byMessage : byMessage , reSummon : true )
}
}
} label : {
} label : {
@ -187,24 +207,36 @@ struct CallView: View {
}
}
} else {
} else {
Button ( byMessage ? " sms " : " mail " ) {
Button ( byMessage ? " sms " : " mail " ) {
_summon ( byMessage : byMessage , reSummon : false )
self . _summon ( byMessage : byMessage , reSummon : false )
}
}
}
}
}
}
private func _summon ( byMessage : Bool , reSummon : Bool ) {
private func _summon ( byMessage : Bool , reSummon : Bool ) {
self . _payTournamentAndExecute {
self . summonParamByMessage = byMessage
if byMessage {
self . summonParamReSummon = reSummon
self . _contactByMessage ( reSummon : reSummon )
self . _verifyUser {
} else {
self . _payTournamentAndExecute {
self . _contactByMail ( reSummon : reSummon )
if byMessage {
self . _contactByMessage ( reSummon : reSummon )
} else {
self . _contactByMail ( reSummon : reSummon )
}
}
}
}
}
}
}
fileprivate func _verifyUser ( _ handler : ( ) -> ( ) ) {
if Store . main . userId != nil {
handler ( )
} else {
self . showUserCreationView = true
}
}
fileprivate func _payTournamentAndExecute ( _ handler : ( ) -> ( ) ) {
fileprivate func _payTournamentAndExecute ( _ handler : ( ) -> ( ) ) {
do {
do {
try tournament . payIfNecessary ( )
try self . tournament . payIfNecessary ( )
handler ( )
handler ( )
} catch {
} catch {
self . showSubscriptionView = true
self . showSubscriptionView = true
@ -212,11 +244,19 @@ struct CallView: View {
}
}
fileprivate func _contactByMessage ( reSummon : Bool ) {
fileprivate func _contactByMessage ( reSummon : Bool ) {
contactType = . message ( date : callDate , recipients : teams . flatMap { $0 . getPhoneNumbers ( ) } , body : finalMessage ( reSummon : reSummon ) , tournamentBuild : nil )
self . contactType = . message ( date : callDate ,
recipients : teams . flatMap { $0 . getPhoneNumbers ( ) } ,
body : finalMessage ( reSummon : reSummon ) ,
tournamentBuild : nil )
}
}
fileprivate func _contactByMail ( reSummon : Bool ) {
fileprivate func _contactByMail ( reSummon : Bool ) {
contactType = . mail ( date : callDate , recipients : tournament . umpireMail ( ) , bccRecipients : teams . flatMap { $0 . getMail ( ) } , body : finalMessage ( reSummon : reSummon ) , subject : tournament . tournamentTitle ( ) , tournamentBuild : nil )
self . contactType = . mail ( date : callDate ,
recipients : tournament . umpireMail ( ) ,
bccRecipients : teams . flatMap { $0 . getMail ( ) } ,
body : finalMessage ( reSummon : reSummon ) ,
subject : tournament . tournamentTitle ( ) ,
tournamentBuild : nil )
}
}
}
}