From 201e91a3cc04e0458b62174a9e5022176d044588 Mon Sep 17 00:00:00 2001 From: Arkadiusz Fal Date: Fri, 17 Dec 2021 20:53:05 +0100 Subject: [PATCH] Show errors when handling playlists --- Model/PlaylistsModel.swift | 18 +++++--- Shared/Playlists/AddToPlaylistView.swift | 24 +++++++++-- Shared/Playlists/PlaylistFormView.swift | 53 +++++++++++++++++------- 3 files changed, 71 insertions(+), 24 deletions(-) diff --git a/Model/PlaylistsModel.swift b/Model/PlaylistsModel.swift index 84c0bfd6..be184339 100644 --- a/Model/PlaylistsModel.swift +++ b/Model/PlaylistsModel.swift @@ -52,14 +52,22 @@ final class PlaylistsModel: ObservableObject { } } - func addVideo(playlistID: Playlist.ID, videoID: Video.ID, onSuccess: @escaping () -> Void = {}) { + func addVideo( + playlistID: Playlist.ID, + videoID: Video.ID, + onSuccess: @escaping () -> Void = {}, + onFailure: @escaping (RequestError) -> Void = { _ in } + ) { let resource = accounts.api.playlistVideos(playlistID) let body = ["videoId": videoID] - resource?.request(.post, json: body).onSuccess { _ in - self.load(force: true) - onSuccess() - } + resource? + .request(.post, json: body) + .onSuccess { _ in + self.load(force: true) + onSuccess() + } + .onFailure(onFailure) } func removeVideo(videoIndexID: String, playlistID: Playlist.ID, onSuccess: @escaping () -> Void = {}) { diff --git a/Shared/Playlists/AddToPlaylistView.swift b/Shared/Playlists/AddToPlaylistView.swift index 60bee678..22ab57c9 100644 --- a/Shared/Playlists/AddToPlaylistView.swift +++ b/Shared/Playlists/AddToPlaylistView.swift @@ -7,8 +7,12 @@ struct AddToPlaylistView: View { @State private var selectedPlaylistID: Playlist.ID = "" + @State private var error = "" + @State private var presentingErrorAlert = false + @Environment(\.colorScheme) private var colorScheme @Environment(\.presentationMode) private var presentationMode + @EnvironmentObject private var model var body: some View { @@ -120,6 +124,12 @@ struct AddToPlaylistView: View { Button("Add to Playlist", action: addToPlaylist) .disabled(selectedPlaylist.isNil) .padding(.top, 30) + .alert(isPresented: $presentingErrorAlert) { + Alert( + title: Text("Error when accessing playlist"), + message: Text(error) + ) + } #if !os(tvOS) .keyboardShortcut(.defaultAction) #endif @@ -155,9 +165,17 @@ struct AddToPlaylistView: View { Defaults[.lastUsedPlaylistID] = id - model.addVideo(playlistID: id, videoID: video.videoID) { - presentationMode.wrappedValue.dismiss() - } + model.addVideo( + playlistID: id, + videoID: video.videoID, + onSuccess: { + presentationMode.wrappedValue.dismiss() + }, + onFailure: { requestError in + error = "(\(requestError.httpStatusCode ?? -1)) \(requestError.userMessage)" + presentingErrorAlert = true + } + ) } private var selectedPlaylist: Playlist? { diff --git a/Shared/Playlists/PlaylistFormView.swift b/Shared/Playlists/PlaylistFormView.swift index 4e196667..48b33756 100644 --- a/Shared/Playlists/PlaylistFormView.swift +++ b/Shared/Playlists/PlaylistFormView.swift @@ -8,7 +8,10 @@ struct PlaylistFormView: View { @State private var visibility = Playlist.Visibility.public @State private var valid = false - @State private var showingDeleteConfirmation = false + @State private var presentingDeleteConfirmation = false + + @State private var formError = "" + @State private var presentingErrorAlert = false @Environment(\.colorScheme) private var colorScheme @Environment(\.presentationMode) private var presentationMode @@ -57,6 +60,12 @@ struct PlaylistFormView: View { Button("Save", action: submitForm) .disabled(!valid) + .alert(isPresented: $presentingErrorAlert) { + Alert( + title: Text("Error when accessing playlist"), + message: Text(formError) + ) + } .keyboardShortcut(.defaultAction) } .frame(minHeight: 35) @@ -165,15 +174,21 @@ struct PlaylistFormView: View { let body = ["title": name, "privacy": visibility.rawValue] - resource?.request(editing ? .patch : .post, json: body).onSuccess { response in - if let modifiedPlaylist: Playlist = response.typedContent() { - playlist = modifiedPlaylist + resource? + .request(editing ? .patch : .post, json: body) + .onSuccess { response in + if let modifiedPlaylist: Playlist = response.typedContent() { + playlist = modifiedPlaylist + } + + playlists.load(force: true) + + presentationMode.wrappedValue.dismiss() + } + .onFailure { error in + formError = "(\(error.httpStatusCode ?? -1)) \(error.userMessage)" + presentingErrorAlert = true } - - playlists.load(force: true) - - presentationMode.wrappedValue.dismiss() - } } var resource: Resource? { @@ -207,9 +222,9 @@ struct PlaylistFormView: View { var deletePlaylistButton: some View { Button("Delete") { - showingDeleteConfirmation = true + presentingDeleteConfirmation = true } - .alert(isPresented: $showingDeleteConfirmation) { + .alert(isPresented: $presentingDeleteConfirmation) { Alert( title: Text("Are you sure you want to delete playlist?"), message: Text("Playlist \"\(playlist.title)\" will be deleted.\nIt cannot be undone."), @@ -221,11 +236,17 @@ struct PlaylistFormView: View { } func deletePlaylistAndDismiss() { - accounts.api.playlist(playlist.id)?.request(.delete).onSuccess { _ in - playlist = nil - playlists.load(force: true) - presentationMode.wrappedValue.dismiss() - } + accounts.api.playlist(playlist.id)? + .request(.delete) + .onSuccess { _ in + playlist = nil + playlists.load(force: true) + presentationMode.wrappedValue.dismiss() + } + .onFailure { error in + formError = "(\(error.httpStatusCode ?? -1)) \(error.localizedDescription)" + presentingErrorAlert = true + } } }