|
|
|
|
@ -64,6 +64,7 @@ enum FileImportCustomField: Int, Identifiable, CaseIterable { |
|
|
|
|
struct FileImportView: View { |
|
|
|
|
|
|
|
|
|
@EnvironmentObject var dataStore: DataStore |
|
|
|
|
@Environment(NavigationViewModel.self) var navigationViewModel: NavigationViewModel |
|
|
|
|
|
|
|
|
|
@Environment(Tournament.self) var tournament: Tournament |
|
|
|
|
@Environment(\.dismiss) private var dismiss |
|
|
|
|
@ -84,7 +85,16 @@ struct FileImportView: View { |
|
|
|
|
@State private var presentFormatHelperView: Bool = false |
|
|
|
|
@State private var validatedTournamentIds: Set<String> = Set() |
|
|
|
|
@State private var chunkMode: ChunkMode = .byParameter |
|
|
|
|
|
|
|
|
|
@State private var apiError: StoreError? |
|
|
|
|
|
|
|
|
|
var presentApiError: Binding<Bool> { |
|
|
|
|
Binding { |
|
|
|
|
apiError != nil |
|
|
|
|
} set: { value in |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
enum ChunkMode: Int, Identifiable, CaseIterable { |
|
|
|
|
var id: Int { self.rawValue } |
|
|
|
|
case byParameter |
|
|
|
|
@ -175,7 +185,11 @@ struct FileImportView: View { |
|
|
|
|
if let fileContent { |
|
|
|
|
do { |
|
|
|
|
try await _startImport(fileContent: fileContent, allTournaments: false) |
|
|
|
|
} catch let error as StoreError { |
|
|
|
|
Logger.error(error) |
|
|
|
|
apiError = error |
|
|
|
|
} catch { |
|
|
|
|
Logger.error(error) |
|
|
|
|
errorMessage = error.localizedDescription |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -199,7 +213,11 @@ struct FileImportView: View { |
|
|
|
|
if let fileContent { |
|
|
|
|
do { |
|
|
|
|
try await _startImport(fileContent: fileContent, allTournaments: true) |
|
|
|
|
} catch let error as StoreError { |
|
|
|
|
Logger.error(error) |
|
|
|
|
apiError = error |
|
|
|
|
} catch { |
|
|
|
|
Logger.error(error) |
|
|
|
|
errorMessage = error.localizedDescription |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -306,7 +324,11 @@ struct FileImportView: View { |
|
|
|
|
if let fileContent { |
|
|
|
|
do { |
|
|
|
|
try await _startImport(fileContent: fileContent, allTournaments: false) |
|
|
|
|
} catch let error as StoreError { |
|
|
|
|
Logger.error(error) |
|
|
|
|
apiError = error |
|
|
|
|
} catch { |
|
|
|
|
Logger.error(error) |
|
|
|
|
errorMessage = error.localizedDescription |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -381,6 +403,26 @@ struct FileImportView: View { |
|
|
|
|
} |
|
|
|
|
.navigationBarTitleDisplayMode(.inline) |
|
|
|
|
.toolbarBackground(.visible, for: .navigationBar) |
|
|
|
|
.alert(isPresented: presentApiError, error: apiError, actions: { storeError in |
|
|
|
|
switch storeError { |
|
|
|
|
case .missingUsername: |
|
|
|
|
Button("Créer un compte ou se connecter") { |
|
|
|
|
dismiss() |
|
|
|
|
navigationViewModel.selectedTab = .umpire |
|
|
|
|
} |
|
|
|
|
default: |
|
|
|
|
Button("D'accord") { |
|
|
|
|
apiError = nil |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}, message: { storeError in |
|
|
|
|
switch storeError { |
|
|
|
|
case .missingUsername: |
|
|
|
|
Text("Un compte est requis pour utiliser ce service de Padel Club, veuillez créer un compte ou vous connecter.") |
|
|
|
|
default: |
|
|
|
|
Text("Une erreur est survenue, veuillez réessayer plus tard.") |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
.sheet(isPresented: $presentFormatHelperView) { |
|
|
|
|
NavigationStack { |
|
|
|
|
List { |
|
|
|
|
@ -434,6 +476,9 @@ struct FileImportView: View { |
|
|
|
|
fileContent = try String(contentsOf: selectedFile) |
|
|
|
|
} |
|
|
|
|
selectedFile.stopAccessingSecurityScopedResource() |
|
|
|
|
} catch let error as StoreError { |
|
|
|
|
Logger.error(error) |
|
|
|
|
apiError = error |
|
|
|
|
} catch { |
|
|
|
|
Logger.error(error) |
|
|
|
|
errorMessage = error.localizedDescription |
|
|
|
|
@ -453,6 +498,7 @@ struct FileImportView: View { |
|
|
|
|
do { |
|
|
|
|
fileContent = try String(contentsOf: url) |
|
|
|
|
} catch { |
|
|
|
|
Logger.error(error) |
|
|
|
|
errorMessage = error.localizedDescription |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|