fix sharelink lag
online_reg
Raz 11 months ago
parent 3c0fa45153
commit 15b5ba97f9
  1. 4
      PadelClub.xcodeproj/project.pbxproj
  2. 2
      PadelClub/Data/Federal/FederalTournament.swift
  3. 4
      PadelClub/Data/Tournament.swift
  4. 2
      PadelClub/Info.plist
  5. 10
      PadelClub/Utils/PadelRule.swift
  6. 3
      PadelClub/Utils/URLs.swift
  7. 2
      PadelClub/ViewModel/FederalDataViewModel.swift
  8. 2
      PadelClub/Views/Cashier/Event/TournamentConfiguratorView.swift
  9. 6
      PadelClub/Views/GroupStage/GroupStagesSettingsView.swift
  10. 4
      PadelClub/Views/Navigation/Agenda/TournamentLookUpView.swift
  11. 35
      PadelClub/Views/Navigation/Toolbox/ToolboxView.swift
  12. 7
      PadelClub/Views/Round/RoundSettingsView.swift
  13. 4
      PadelClub/Views/Shared/SelectablePlayerListView.swift
  14. 2
      PadelClub/Views/Shared/TournamentFilterView.swift
  15. 2
      PadelClub/Views/Tournament/Screen/Components/TournamentLevelPickerView.swift
  16. 68
      PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift
  17. 9
      PadelClub/Views/Tournament/Screen/RegisrationSetupView.swift
  18. 4
      PadelClub/Views/Tournament/Shared/TournamentCellView.swift

@ -3450,6 +3450,7 @@
INFOPLIST_KEY_CFBundleDisplayName = "Padel Club (ProdTest)"; INFOPLIST_KEY_CFBundleDisplayName = "Padel Club (ProdTest)";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.sports"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.sports";
INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES; INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES;
INFOPLIST_KEY_NSCalendarsUsageDescription = "Padel Club a besoin d'avoir accès à votre calendrier pour pouvoir y inscrire ce tournoi";
INFOPLIST_KEY_NSCameraUsageDescription = "En autorisant l'application à utiliser la caméra, vous pourrez prendre des photos des rencontres"; INFOPLIST_KEY_NSCameraUsageDescription = "En autorisant l'application à utiliser la caméra, vous pourrez prendre des photos des rencontres";
INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Padel Club a besoin de votre position pour rechercher les clubs autour de vous."; INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Padel Club a besoin de votre position pour rechercher les clubs autour de vous.";
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
@ -3493,6 +3494,7 @@
INFOPLIST_KEY_CFBundleDisplayName = "Padel Club (ProdTest)"; INFOPLIST_KEY_CFBundleDisplayName = "Padel Club (ProdTest)";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.sports"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.sports";
INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES; INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES;
INFOPLIST_KEY_NSCalendarsUsageDescription = "Padel Club a besoin d'avoir accès à votre calendrier pour pouvoir y inscrire ce tournoi";
INFOPLIST_KEY_NSCameraUsageDescription = "En autorisant l'application à utiliser la caméra, vous pourrez prendre des photos des rencontres"; INFOPLIST_KEY_NSCameraUsageDescription = "En autorisant l'application à utiliser la caméra, vous pourrez prendre des photos des rencontres";
INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Padel Club a besoin de votre position pour rechercher les clubs autour de vous."; INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Padel Club a besoin de votre position pour rechercher les clubs autour de vous.";
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
@ -3537,6 +3539,7 @@
INFOPLIST_KEY_CFBundleDisplayName = "Padel Club (Beta)"; INFOPLIST_KEY_CFBundleDisplayName = "Padel Club (Beta)";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.sports"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.sports";
INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES; INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES;
INFOPLIST_KEY_NSCalendarsUsageDescription = "Padel Club a besoin d'avoir accès à votre calendrier pour pouvoir y inscrire ce tournoi";
INFOPLIST_KEY_NSCameraUsageDescription = "En autorisant l'application à utiliser la caméra, vous pourrez prendre des photos des rencontres"; INFOPLIST_KEY_NSCameraUsageDescription = "En autorisant l'application à utiliser la caméra, vous pourrez prendre des photos des rencontres";
INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Padel Club a besoin de votre position pour rechercher les clubs autour de vous."; INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Padel Club a besoin de votre position pour rechercher les clubs autour de vous.";
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
@ -3578,6 +3581,7 @@
INFOPLIST_KEY_CFBundleDisplayName = "Padel Club (Beta)"; INFOPLIST_KEY_CFBundleDisplayName = "Padel Club (Beta)";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.sports"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.sports";
INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES; INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES;
INFOPLIST_KEY_NSCalendarsUsageDescription = "Padel Club a besoin d'avoir accès à votre calendrier pour pouvoir y inscrire ce tournoi";
INFOPLIST_KEY_NSCameraUsageDescription = "En autorisant l'application à utiliser la caméra, vous pourrez prendre des photos des rencontres"; INFOPLIST_KEY_NSCameraUsageDescription = "En autorisant l'application à utiliser la caméra, vous pourrez prendre des photos des rencontres";
INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Padel Club a besoin de votre position pour rechercher les clubs autour de vous."; INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Padel Club a besoin de votre position pour rechercher les clubs autour de vous.";
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;

@ -239,7 +239,7 @@ struct CategorieAge: Codable {
return FederalTournamentAge(rawValue: id) return FederalTournamentAge(rawValue: id)
} }
if let libelle { if let libelle {
return FederalTournamentAge.allCases.first(where: { $0.localizedLabel().localizedCaseInsensitiveContains(libelle) }) return FederalTournamentAge.allCases.first(where: { $0.localizedFederalAgeLabel().localizedCaseInsensitiveContains(libelle) })
} }
return nil return nil
} }

@ -1546,7 +1546,7 @@ defer {
return tournamentLevel.localizedLevelLabel(.title) return tournamentLevel.localizedLevelLabel(.title)
} }
} }
let title: String = [tournamentLevel.localizedLevelLabel(displayStyle), tournamentCategory.localizedLabel(displayStyle), federalTournamentAge.localizedLabel(displayStyle)].filter({ $0.isEmpty == false }).joined(separator: " ") let title: String = [tournamentLevel.localizedLevelLabel(displayStyle), tournamentCategory.localizedLabel(displayStyle), federalTournamentAge.localizedFederalAgeLabel(displayStyle)].filter({ $0.isEmpty == false }).joined(separator: " ")
if displayStyle == .wide, let name { if displayStyle == .wide, let name {
return [title, name].joined(separator: " - ") return [title, name].joined(separator: " - ")
} else { } else {
@ -2633,7 +2633,7 @@ extension Tournament: FederalTournamentHolder {
func subtitleLabel(forBuild build: any TournamentBuildHolder) -> String { func subtitleLabel(forBuild build: any TournamentBuildHolder) -> String {
if isAnimation() { if isAnimation() {
if displayAgeAndCategory(forBuild: build) == false { if displayAgeAndCategory(forBuild: build) == false {
return [build.category.localizedLabel(), build.age.localizedLabel()].filter({ $0.isEmpty == false }).joined(separator: " ") return [build.category.localizedLabel(), build.age.localizedFederalAgeLabel()].filter({ $0.isEmpty == false }).joined(separator: " ")
} else if name != nil { } else if name != nil {
return build.level.localizedLevelLabel(.title) return build.level.localizedLevelLabel(.title)
} else { } else {

@ -33,7 +33,5 @@
</array> </array>
<key>ITSAppUsesNonExemptEncryption</key> <key>ITSAppUsesNonExemptEncryption</key>
<false/> <false/>
<key>UIFileSharingEnabled</key>
<true/>
</dict> </dict>
</plist> </plist>

@ -48,7 +48,7 @@ struct TournamentBuild: TournamentBuildHolder, Hashable, Codable, Identifiable {
} }
var identifier: String { var identifier: String {
level.localizedLevelLabel()+":"+category.localizedLabel()+":"+age.localizedLabel() level.localizedLevelLabel()+":"+category.localizedLabel()+":"+age.localizedFederalAgeLabel()
} }
func computedLabel(_ displayStyle: DisplayStyle = .wide) -> String { func computedLabel(_ displayStyle: DisplayStyle = .wide) -> String {
@ -65,7 +65,7 @@ struct TournamentBuild: TournamentBuildHolder, Hashable, Codable, Identifiable {
} }
func localizedAge(_ displayStyle: DisplayStyle = .wide) -> String { func localizedAge(_ displayStyle: DisplayStyle = .wide) -> String {
age.localizedLabel(displayStyle) age.localizedFederalAgeLabel(displayStyle)
} }
} }
@ -252,7 +252,7 @@ enum FederalTournamentAge: Int, Hashable, Codable, CaseIterable, Identifiable {
} }
} }
func localizedLabel(_ displayStyle: DisplayStyle = .wide) -> String { func localizedFederalAgeLabel(_ displayStyle: DisplayStyle = .wide) -> String {
switch self { switch self {
case .unlisted: case .unlisted:
return displayStyle == .title ? "Aucune" : "" return displayStyle == .title ? "Aucune" : ""
@ -265,7 +265,7 @@ enum FederalTournamentAge: Int, Hashable, Codable, CaseIterable, Identifiable {
case .a17_18: case .a17_18:
return "17/18 ans" return "17/18 ans"
case .senior: case .senior:
return "Senior" return displayStyle == .short ? "" : "Senior"
case .a45: case .a45:
return "+45 ans" return "+45 ans"
case .a55: case .a55:
@ -274,7 +274,7 @@ enum FederalTournamentAge: Int, Hashable, Codable, CaseIterable, Identifiable {
} }
var tournamentDescriptionLabel: String { var tournamentDescriptionLabel: String {
return localizedLabel() return localizedFederalAgeLabel()
} }
func isAgeValid(age: Int?) -> Bool { func isAgeValid(age: Int?) -> Bool {

@ -50,6 +50,7 @@ enum URLs: String, Identifiable {
} }
enum PageLink: String, Identifiable, CaseIterable { enum PageLink: String, Identifiable, CaseIterable {
case info = "Informations"
case teams = "Équipes" case teams = "Équipes"
case summons = "Convocations" case summons = "Convocations"
case groupStages = "Poules" case groupStages = "Poules"
@ -68,6 +69,8 @@ enum PageLink: String, Identifiable, CaseIterable {
switch self { switch self {
case .matches: case .matches:
return "" return ""
case .info:
return "info"
case .teams: case .teams:
return "teams" return "teams"
case .summons: case .summons:

@ -28,7 +28,7 @@ class FederalDataViewModel {
var labels: [String] = [] var labels: [String] = []
labels.append(contentsOf: levels.map { $0.localizedLevelLabel() }.formatList()) labels.append(contentsOf: levels.map { $0.localizedLevelLabel() }.formatList())
labels.append(contentsOf: categories.map { $0.localizedLabel() }.formatList()) labels.append(contentsOf: categories.map { $0.localizedLabel() }.formatList())
labels.append(contentsOf: ageCategories.map { $0.localizedLabel() }.formatList()) labels.append(contentsOf: ageCategories.map { $0.localizedFederalAgeLabel() }.formatList())
let clubNames = selectedClubs.compactMap { codeClub in let clubNames = selectedClubs.compactMap { codeClub in
let club: Club? = DataStore.shared.clubs.first(where: { $0.code == codeClub }) let club: Club? = DataStore.shared.clubs.first(where: { $0.code == codeClub })
return club?.clubTitle(.short) return club?.clubTitle(.short)

@ -46,7 +46,7 @@ struct TournamentConfigurationView: View {
} }
Picker(selection: $tournament.federalAgeCategory, label: Text("Limite d'âge")) { Picker(selection: $tournament.federalAgeCategory, label: Text("Limite d'âge")) {
ForEach(FederalTournamentAge.allCases) { type in ForEach(FederalTournamentAge.allCases) { type in
Text(type.localizedLabel(.title)).tag(type) Text(type.localizedFederalAgeLabel(.title)).tag(type)
} }
} }
LabeledContent { LabeledContent {

@ -262,11 +262,15 @@ struct GroupStagesSettingsView: View {
} }
.toolbar { .toolbar {
ToolbarItem(placement: .topBarTrailing) { ToolbarItem(placement: .topBarTrailing) {
ShareLink(item: tournament.groupStages().compactMap { $0.pasteData() }.joined(separator: "\n\n")) ShareLink(item: groupStagesPaste(), preview: .init("Données des poules"))
} }
} }
} }
func groupStagesPaste() -> TournamentGroupStageShareContent {
TournamentGroupStageShareContent(tournament: tournament)
}
var menuBuildAllGroupStages: some View { var menuBuildAllGroupStages: some View {
RowButtonView("Refaire les poules", role: .destructive) { RowButtonView("Refaire les poules", role: .destructive) {

@ -369,7 +369,7 @@ struct TournamentLookUpView: View {
NavigationLink { NavigationLink {
List([FederalTournamentAge.senior, FederalTournamentAge.a45, FederalTournamentAge.a55, FederalTournamentAge.a17_18, FederalTournamentAge.a15_16, FederalTournamentAge.a13_14, FederalTournamentAge.a11_12], selection: $appSettings.tournamentAges) { type in List([FederalTournamentAge.senior, FederalTournamentAge.a45, FederalTournamentAge.a55, FederalTournamentAge.a17_18, FederalTournamentAge.a15_16, FederalTournamentAge.a13_14, FederalTournamentAge.a11_12], selection: $appSettings.tournamentAges) { type in
Text(type.localizedLabel()) Text(type.localizedFederalAgeLabel())
} }
.navigationTitle("Limites d'âge") .navigationTitle("Limites d'âge")
.environment(\.editMode, Binding.constant(EditMode.active)) .environment(\.editMode, Binding.constant(EditMode.active))
@ -381,7 +381,7 @@ struct TournamentLookUpView: View {
Text("Tous les âges") Text("Tous les âges")
.foregroundStyle(.secondary) .foregroundStyle(.secondary)
} else { } else {
Text(ages.map({ $0.localizedLabel()}).joined(separator: ", ")) Text(ages.map({ $0.localizedFederalAgeLabel()}).joined(separator: ", "))
.foregroundStyle(.secondary) .foregroundStyle(.secondary)
} }
} }

@ -228,10 +228,9 @@ struct ToolboxView: View {
ShareLink(item: URLs.appStore.url) { ShareLink(item: URLs.appStore.url) {
Label("Lien AppStore", systemImage: "link") Label("Lien AppStore", systemImage: "link")
} }
if let zip = _getZip() {
ShareLink(item: zip) { ShareLink(item: ZipLog(), preview: .init("Mon archive")) {
Label("Mes données", systemImage: "server.rack") Label("Mes données", systemImage: "server.rack")
}
} }
} label: { } label: {
Label("Partagez", systemImage: "square.and.arrow.up").labelStyle(.iconOnly) Label("Partagez", systemImage: "square.and.arrow.up").labelStyle(.iconOnly)
@ -240,7 +239,14 @@ struct ToolboxView: View {
} }
} }
} }
}
//#Preview {
// ToolboxView()
//}
struct ZipLog: Transferable {
private func _getZip() -> URL? { private func _getZip() -> URL? {
do { do {
let filePath = try Club.storageDirectoryPath() let filePath = try Club.storageDirectoryPath()
@ -250,8 +256,19 @@ struct ToolboxView: View {
return nil return nil
} }
} }
}
//#Preview { func shareFile() -> URL? {
// ToolboxView() print("Generating URL...")
//} return _getZip()
}
static var transferRepresentation: some TransferRepresentation {
FileRepresentation(exportedContentType: .zip) { transferable in
return SentTransferredFile(transferable.shareFile()!)
}.exportingCondition { $0.shareFile() != nil }
ProxyRepresentation { transferable in
return transferable.shareFile()!
}.exportingCondition { $0.shareFile() != nil }
}
}

@ -147,11 +147,16 @@ struct RoundSettingsView: View {
} }
.toolbar { .toolbar {
ToolbarItem(placement: .topBarTrailing) { ToolbarItem(placement: .topBarTrailing) {
ShareLink(item: tournament.rounds().compactMap { $0.pasteData() }.joined(separator: "\n\n")) ShareLink(item: roundsPaste(), preview: .init("Données du tableau"))
} }
} }
} }
func roundsPaste() -> TournamentRoundShareContent {
TournamentRoundShareContent(tournament: tournament)
}
private func _removeAllSeeds() async { private func _removeAllSeeds() async {
await tournament.removeAllSeeds() await tournament.removeAllSeeds()
self.isEditingTournamentSeed.wrappedValue = true self.isEditingTournamentSeed.wrappedValue = true

@ -109,7 +109,7 @@ struct SelectablePlayerListView: View {
Section { Section {
Picker(selection: $searchViewModel.selectedAgeCategory) { Picker(selection: $searchViewModel.selectedAgeCategory) {
ForEach(FederalTournamentAge.allCases) { ageCategory in ForEach(FederalTournamentAge.allCases) { ageCategory in
Text(ageCategory.localizedLabel(.title)).tag(ageCategory) Text(ageCategory.localizedFederalAgeLabel(.title)).tag(ageCategory)
} }
} label: { } label: {
Text("Catégorie d'âge") Text("Catégorie d'âge")
@ -142,7 +142,7 @@ struct SelectablePlayerListView: View {
VStack(alignment: .trailing) { VStack(alignment: .trailing) {
Label(searchViewModel.sortOption.localizedLabel(), systemImage: searchViewModel.ascending ? "chevron.up" : "chevron.down") Label(searchViewModel.sortOption.localizedLabel(), systemImage: searchViewModel.ascending ? "chevron.up" : "chevron.down")
if searchViewModel.selectedAgeCategory != .unlisted { if searchViewModel.selectedAgeCategory != .unlisted {
Text(searchViewModel.selectedAgeCategory.localizedLabel()).font(.caption) Text(searchViewModel.selectedAgeCategory.localizedFederalAgeLabel()).font(.caption)
} }
} }
} }

@ -107,7 +107,7 @@ struct TournamentFilterView: View {
} }
} }
} label: { } label: {
Text(category.localizedLabel(.title)) Text(category.localizedFederalAgeLabel(.title))
} }
} }
} header: { } header: {

@ -42,7 +42,7 @@ struct TournamentLevelPickerView: View {
Picker(selection: $tournament.federalTournamentAge, label: Text("Limite d'âge")) { Picker(selection: $tournament.federalTournamentAge, label: Text("Limite d'âge")) {
ForEach(FederalTournamentAge.allCases) { type in ForEach(FederalTournamentAge.allCases) { type in
Text(type.localizedLabel(.title)).tag(type) Text(type.localizedFederalAgeLabel(.title)).tag(type)
} }
} }
Picker(selection: $tournament.groupStageOrderingMode, label: Text("Répartition en poule")) { Picker(selection: $tournament.groupStageOrderingMode, label: Text("Répartition en poule")) {

@ -461,15 +461,11 @@ struct InscriptionManagerView: View {
private func _sharingTeamsMenuView() -> some View { private func _sharingTeamsMenuView() -> some View {
Menu { Menu {
if let teamPaste = teamPaste() { ShareLink(item: teamPaste(), preview: .init("Inscriptions")) {
ShareLink(item: teamPaste) { Text("En texte")
Text("En texte")
}
} }
if let teamPaste = teamPaste(.csv) { ShareLink(item: teamPaste(.csv), preview: .init("Inscriptions")) {
ShareLink(item: teamPaste) { Text("En csv")
Text("En csv")
}
} }
} label: { } label: {
Label("Exporter les paires", systemImage: "square.and.arrow.up") Label("Exporter les paires", systemImage: "square.and.arrow.up")
@ -484,8 +480,8 @@ struct InscriptionManagerView: View {
tournament.unsortedTeamsWithoutWO() tournament.unsortedTeamsWithoutWO()
} }
func teamPaste(_ exportFormat: ExportFormat = .rawText) -> URL? { func teamPaste(_ exportFormat: ExportFormat = .rawText) -> TournamentShareFile {
tournament.pasteDataForImporting(exportFormat).createFile(self.tournament.tournamentTitle(.short), exportFormat) TournamentShareFile(tournament: tournament, exportFormat: exportFormat)
} }
var unsortedPlayers: [PlayerRegistration] { var unsortedPlayers: [PlayerRegistration] {
@ -1124,3 +1120,55 @@ struct InscriptionManagerView: View {
// .environment(Tournament.mock()) // .environment(Tournament.mock())
// } // }
//} //}
struct TournamentRoundShareContent: Transferable {
let tournament: Tournament
func shareContent() -> String {
print("Generating URL...")
let content = tournament.rounds().compactMap { $0.pasteData() }.joined(separator: "\n\n")
return content
}
static var transferRepresentation: some TransferRepresentation {
ProxyRepresentation { transferable in
return transferable.shareContent()
}
}
}
struct TournamentGroupStageShareContent: Transferable {
let tournament: Tournament
func shareContent() -> String {
print("Generating URL...")
let content = tournament.groupStages().compactMap { $0.pasteData() }.joined(separator: "\n\n")
return content
}
static var transferRepresentation: some TransferRepresentation {
ProxyRepresentation { transferable in
return transferable.shareContent()
}
}
}
struct TournamentShareFile: Transferable {
let tournament: Tournament
let exportFormat: ExportFormat
func shareFile() -> URL {
print("Generating URL...")
return tournament.pasteDataForImporting(exportFormat).createFile(self.tournament.tournamentTitle()+"-inscriptions", exportFormat)
}
static var transferRepresentation: some TransferRepresentation {
FileRepresentation(exportedContentType: .utf8PlainText) { transferable in
return SentTransferredFile(transferable.shareFile())
}
ProxyRepresentation { transferable in
return transferable.shareFile()
}
}
}

@ -87,6 +87,15 @@ struct RegisrationSetupView: View {
} }
if enableOnlineRegistration { if enableOnlineRegistration {
if let shareURL = tournament.shareURL(.info) {
Section {
ShareLink(item: shareURL)
} header: {
Text("Page d'inscription")
} footer: {
CopyPasteButtonView(pasteValue: shareURL.absoluteString)
}
}
Section { Section {
Toggle(isOn: $openingRegistrationDateEnabled) { Toggle(isOn: $openingRegistrationDateEnabled) {

@ -107,7 +107,7 @@ struct TournamentCellView: View {
if displayStyle == .wide, tournament.displayAgeAndCategory(forBuild: build) { if displayStyle == .wide, tournament.displayAgeAndCategory(forBuild: build) {
VStack(alignment: .leading, spacing: 0) { VStack(alignment: .leading, spacing: 0) {
Text(build.category.localizedLabel()) Text(build.category.localizedLabel())
Text(build.age.localizedLabel()) Text(build.age.localizedFederalAgeLabel())
} }
.font(.caption) .font(.caption)
} }
@ -155,7 +155,7 @@ struct TournamentCellView: View {
} }
} else { } else {
Text(build.category.localizedLabel()) Text(build.category.localizedLabel())
Text(build.age.localizedLabel()) Text(build.age.localizedFederalAgeLabel())
} }
} }
} }

Loading…
Cancel
Save