You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
PadelClub/PadelClub/Views/Calling/Components/MenuWarningView.swift

166 lines
5.1 KiB

//
// MenuWarningView.swift
// PadelClub
//
// Created by razmig on 28/04/2024.
//
import SwiftUI
import LeStorage
struct MenuWarningView: View {
let tournament: Tournament
let teams: [TeamRegistration]
var date: Date?
var message: String?
var umpireMail: String?
var subject: String?
@Binding var contactType: ContactType?
@State var showSubscriptionView: Bool = false
@State var showUserCreationView: Bool = false
@State var savedContactType: ContactType? = nil
private func _getUmpireMail() -> [String]? {
if let umpireMail {
return [umpireMail]
}
return nil
}
var body: some View {
Menu {
if let team = teams.first, teams.count == 1 {
_teamActionView(team)
} else {
Menu("Tout le monde") {
let players = teams.flatMap({ $0.players() })
_actionView(players: players, privateMode: true)
}
Divider()
ForEach(teams) { team in
_teamView(team)
}
}
} label: {
Text("Prévenir")
.underline()
}
.sheet(isPresented: self.$showSubscriptionView, content: {
NavigationStack {
SubscriptionView(isPresented: self.$showSubscriptionView, showLackOfPlanMessage: true)
.environment(\.colorScheme, .light)
}
})
.sheet(isPresented: self.$showUserCreationView, content: {
NavigationStack {
LoginView(reason: LoginReason.loginRequiredForFeature) { _ in
self.showUserCreationView = false
self._tryToContact()
}
}
})
}
@ViewBuilder
private func _actionView(players: [PlayerRegistration], privateMode: Bool = false) -> some View {
if players.count == 1, let player = players.first, let number = player.phoneNumber?.replacingOccurrences(of: " ", with: ""), let url = URL(string: "tel:\(number)") {
Link(destination: url) {
Label("Appeler", systemImage: "phone")
Text(number)
}
} else {
Menu {
ForEach(players) { player in
if let number = player.phoneNumber?.replacingOccurrences(of: " ", with: ""), let url = URL(string: "tel:\(number)") {
Link(destination: url) {
Label(player.playerLabel(.short), systemImage: "phone")
Text(number)
}
}
}
} label: {
Text("Appeler un joueur")
}
}
Button("Message") {
self._contactByMessage(players: players, privateMode: privateMode)
}
Button("Mail") {
self._contactByMail(players: players, privateMode: privateMode)
}
}
fileprivate func _contactByMessage(players: [PlayerRegistration], privateMode: Bool) {
self.savedContactType = .message(date: date, recipients: players.compactMap({ $0.phoneNumber }), body: message, tournamentBuild: nil)
self._tryToContact()
}
fileprivate func _contactByMail(players: [PlayerRegistration], privateMode: Bool) {
self.savedContactType = .mail(date: date, recipients: privateMode ? _getUmpireMail() : players.compactMap({ $0.email }), bccRecipients: privateMode ? players.compactMap({ $0.email }) : nil, body: message, subject: subject, tournamentBuild: nil)
self._tryToContact()
}
func _playerView(_ player: PlayerRegistration) -> some View {
Menu {
let players = [player]
_actionView(players: players)
} label: {
Text(player.playerLabel())
}
}
func _teamView(_ team: TeamRegistration) -> some View {
Menu {
_teamActionView(team)
} label: {
Text(team.teamLabel(.short, twoLines: true))
}
}
@ViewBuilder
func _teamActionView(_ team: TeamRegistration) -> some View {
Menu("Toute l'équipe") {
let players = team.players()
_actionView(players: players)
}
Divider()
ForEach(team.players()) { player in
_playerView(player)
}
}
fileprivate func _tryToContact() {
self._verifyUser {
self._payTournamentAndExecute {
self.contactType = self.savedContactType
}
}
}
fileprivate func _verifyUser(_ handler: () -> ()) {
if StoreCenter.main.userId != nil {
handler()
} else {
self.showUserCreationView = true
}
}
fileprivate func _payTournamentAndExecute(_ handler: () -> ()) {
do {
try tournament.payIfNecessary()
handler()
} catch {
self.showSubscriptionView = true
}
}
}
//#Preview {
// MenuWarningView(teams: [], contactType: .constant(nil))
//}