multistore
Razmig Sarkissian 1 year ago
parent 6f4398ee8c
commit df16033027
  1. 2
      PadelClub/Data/Coredata/Persistence.swift
  2. 11
      PadelClub/Data/Tournament.swift
  3. 99
      PadelClub/Views/GroupStage/GroupStageView.swift
  4. 3
      PadelClub/Views/Navigation/Umpire/UmpireView.swift
  5. 6
      PadelClub/Views/Tournament/Screen/BroadcastView.swift
  6. 80
      PadelClub/Views/User/UserCreationView.swift

@ -122,7 +122,7 @@ class PersistenceController: NSObject {
// 1
var index = 0
let total = imported.count
let replacements: [(Character, Character)] = [("Á", "ç"), ("", "à"), ("Ù", "ô"), ("Ë", "è"), ("Ó", "î"), ("Î", "ë"), ("", "É"), ("Ô", "ï"), ("È", "é"), ("«", "Ç"), ("»", "È")]
let replacements: [(Character, Character)] = [("Á", "ç"), ("", "à"), ("Ù", "ô"), ("Ë", "è"), ("Ó", "î"), ("Î", "ë"), ("", "É"), ("Ô", "ï"), ("È", "é"), ("«", "Ç"), ("»", "È"), ("ù", "ô")]
let replacementsCharacters = replacements

@ -391,8 +391,17 @@ class Tournament : ModelObject, Storable {
startDate
}
func canBePublished() -> Bool {
switch state() {
case .build, .finished, .running:
return unsortedTeams().count > 3
default:
return false
}
}
func isTournamentPublished() -> Bool {
Date() >= publishedTournamentDate() || publishTournament
(Date() >= publishedTournamentDate() && canBePublished()) || publishTournament
}
func areTeamsPublished() -> Bool {

@ -10,6 +10,7 @@ import LeStorage
struct GroupStageView: View {
@EnvironmentObject var dataStore: DataStore
@Environment(Tournament.self) private var tournament
@Bindable var groupStage: GroupStage
@State private var confirmGroupStageStart: Bool = false
@State private var sortingMode: GroupStageSortingMode = .auto
@ -190,8 +191,9 @@ struct GroupStageView: View {
Menu {
NavigationLink {
GroupStageNameEditionView(groupStage: groupStage)
.environment(tournament)
} label: {
Label("Renommer", systemImage: "pencil")
Label("Modifier le nom et la taille", systemImage: "pencil")
}
Button("Retirer tout le monde", role: .destructive) {
confirmRemoveAll = true
@ -236,9 +238,18 @@ struct GroupStageView: View {
struct GroupStageNameEditionView: View {
@Environment(\.dismiss) private var dismiss
@Environment(Tournament.self) private var tournament
@EnvironmentObject var dataStore: DataStore
let groupStage: GroupStage
@State private var groupStageName: String = ""
@Bindable var groupStage: GroupStage
@State private var groupStageName: String
@State private var presentConfirmationButton: Bool = false
@State private var size: Int
init(groupStage: GroupStage) {
_groupStage = Bindable(groupStage)
_groupStageName = .init(wrappedValue: groupStage.name ?? "")
_size = .init(wrappedValue: groupStage.size)
}
var body: some View {
Form {
@ -246,30 +257,90 @@ struct GroupStageNameEditionView: View {
TextField("Nom de la poule", text: $groupStageName)
.keyboardType(.alphabet)
.frame(maxWidth: .infinity)
.onAppear(perform: {
groupStageName = groupStage.name ?? ""
})
.onSubmit {
groupStageName = groupStageName.trimmed
groupStage.name = groupStageName
_save()
dismiss()
if groupStageName.isEmpty == false {
groupStage.name = groupStageName
_save()
dismiss()
}
}
} footer: {
HStack {
Spacer()
FooterButtonView("retirer le nom") {
groupStage.name = nil
groupStageName = groupStage.groupStageTitle()
if groupStage.name != nil {
HStack {
Spacer()
FooterButtonView("retirer le nom") {
groupStage.name = nil
groupStageName = ""
_save()
}
}
}
}
Section {
LabeledContent {
StepperView(count: $size, minimum: minimumSize(), maximum: maximumSize())
} label: {
Text("Taille de la poule")
}
if presentConfirmationButton {
RowButtonView("Confirmer", role: .destructive, confirmationMessage: "Tous les matchs et les équipes de cette poule seront ré-initialisés") {
let teams = groupStage.teams()
teams.forEach { team in
team.groupStagePosition = nil
team.groupStage = nil
groupStage._matches().forEach({ $0.updateTeamScores() })
}
do {
try dataStore.teamRegistrations.addOrUpdate(contentOfs: teams)
} catch {
Logger.error(error)
}
groupStage.size = size
groupStage.buildMatches()
tournament.shouldVerifyGroupStage = true
_save()
presentConfirmationButton = false
}
}
} footer: {
Text("Vous ne pouvez réduire la taille qu'à partir de la dernière poule et augmentez la taille qu'à partir de la première poule. Une poule ne peut pas avoir moins de 3 équipes et plus d'une équipe de différence par rapport aux autres poules.")
}
}
.onChange(of: size) {
presentConfirmationButton = true
}
.navigationTitle(groupStage.groupStageTitle())
.toolbarBackground(.visible, for: .navigationBar)
}
private func maximumSize() -> Int {
if groupStage.index == 0 {
return tournament.teamsPerGroupStage + 1
}
if let previousGroupStage = tournament.groupStages().first(where: { $0.index == groupStage.index - 1 }), previousGroupStage.size > groupStage.size {
return tournament.teamsPerGroupStage + 1
}
return tournament.teamsPerGroupStage
}
private func minimumSize() -> Int {
if groupStage.index == tournament.groupStageCount - 1 {
return max(3, tournament.teamsPerGroupStage - 1)
}
if let nextGroupStage = tournament.groupStages().first(where: { $0.index == groupStage.index + 1 }), nextGroupStage.size < groupStage.size {
return max(3, tournament.teamsPerGroupStage - 1)
}
return tournament.teamsPerGroupStage
}
private func _save() {
do {
try dataStore.groupStages.addOrUpdate(instance: groupStage)

@ -59,6 +59,9 @@ struct UmpireView: View {
}
} label: {
Label("Mon compte", systemImage: "person.fill")
if dataStore.user.email.isEmpty == false {
Text(dataStore.user.email)
}
}
}

@ -96,10 +96,14 @@ struct BroadcastView: View {
Text("Publication prévue")
}
}
if tournament.canBePublished() == false {
Text("Pour être visible automatiquement, le tournoi doit avoir été créé il y a 24h, avoir une structure et au moins 4 inscriptions.")
}
} header: {
Text("Information sur le tournoi")
} footer: {
if Date() < tournament.publishedTournamentDate() {
if Date() < tournament.publishedTournamentDate() || tournament.canBePublished() == false {
HStack {
Spacer()
FooterButtonView(tournament.publishTournament ? "masquer sur le site" : "publier maintenant") {

@ -9,6 +9,7 @@ import SwiftUI
import LeStorage
struct UserCreationFormView: View {
@EnvironmentObject var networkMonitor: NetworkMonitor
@Binding var showLoginScreen: Bool
@ -62,13 +63,18 @@ struct UserCreationFormView: View {
.autocorrectionDisabled()
TextField("Téléphone", text: self.$phone)
.autocorrectionDisabled()
Picker("Pays", selection: $selectedCountryIndex) {
ForEach(0..<self.countries.count, id: \.self) { index in
Text(self.countries[index]).tag(index)
LabeledContent {
Picker(selection: $selectedCountryIndex) {
ForEach(0..<self.countries.count, id: \.self) { index in
Text(self.countries[index]).tag(index)
}
} label: {
}
} label: {
Text("Pays")
}
.pickerStyle(DefaultPickerStyle())
.padding()
}
Section {
@ -78,16 +84,10 @@ struct UserCreationFormView: View {
}
Section {
Button(action: {
self._create()
}, label: {
if self.isLoading {
ProgressView()
} else {
Text("Créer")
}
}).disabled(!self.dataCollectAuthorized)
.frame(maxWidth: .infinity)
RowButtonView("Créer votre compte") {
await self._create()
}
.disabled(!self.dataCollectAuthorized)
}
}
.onAppear {
@ -106,7 +106,11 @@ struct UserCreationFormView: View {
self.selectedCountryIndex = self.countries.firstIndex(of: country) ?? 0
}
fileprivate func _create() {
fileprivate func _create() async {
guard networkMonitor.connected == true else {
self.alertMessage = "L'appareil n'est pas connecté à internet."
return
}
self.isLoading = true
self.username = self.username.trimmed
@ -139,31 +143,29 @@ struct UserCreationFormView: View {
return
}
Task {
do {
let userCreationForm = UserCreationForm(
user: DataStore.shared.user, // local user
username: self.username,
password: self.password1,
firstName: self.firstName,
lastName: self.lastName,
email: self.email,
phone: self.phone,
country: self.countries[self.selectedCountryIndex])
let service = try Store.main.service()
let user: User = try await service.createAccount(user: userCreationForm)
DispatchQueue.main.async {
DataStore.shared.user = user
self.isLoading = false
self.showLoginScreen = true
}
} catch {
do {
let userCreationForm = UserCreationForm(
user: DataStore.shared.user, // local user
username: self.username,
password: self.password1,
firstName: self.firstName,
lastName: self.lastName,
email: self.email,
phone: self.phone,
country: self.countries[self.selectedCountryIndex])
let service = try Store.main.service()
let user: User = try await service.createAccount(user: userCreationForm)
DispatchQueue.main.async {
DataStore.shared.user = user
self.isLoading = false
Logger.error(error)
self.showLoginScreen = true
}
} catch {
self.isLoading = false
Logger.error(error)
}
}

Loading…
Cancel
Save