ML-169.10: async delete actions with initial implementation
This commit is contained in:
@@ -10,6 +10,7 @@ defmodule MusicLibraryWeb.CollectionLive.Index do
|
||||
alias MusicLibrary.Collection
|
||||
alias MusicLibrary.Records
|
||||
alias MusicLibraryWeb.Components.AddRecord
|
||||
alias MusicLibraryWeb.ErrorMessages
|
||||
alias MusicLibraryWeb.LiveHelpers.IndexActions
|
||||
|
||||
defp index_config do
|
||||
@@ -323,6 +324,28 @@ defmodule MusicLibraryWeb.CollectionLive.Index do
|
||||
{:noreply, socket}
|
||||
end
|
||||
|
||||
def handle_async({:delete_record, _id}, {:ok, {:ok, _record}}, socket) do
|
||||
{:noreply, socket}
|
||||
end
|
||||
|
||||
def handle_async({:delete_record, id}, {:ok, {:error, reason}}, socket) do
|
||||
record = Records.get_record!(id)
|
||||
|
||||
{:noreply,
|
||||
socket
|
||||
|> stream_insert(:records, record)
|
||||
|> put_toast(:error, gettext("Failed to delete: ") <> ErrorMessages.friendly_message(reason))}
|
||||
end
|
||||
|
||||
def handle_async({:delete_record, id}, {:exit, _reason}, socket) do
|
||||
record = Records.get_record!(id)
|
||||
|
||||
{:noreply,
|
||||
socket
|
||||
|> stream_insert(:records, record)
|
||||
|> put_toast(:error, gettext("Delete failed, please try again"))}
|
||||
end
|
||||
|
||||
@impl true
|
||||
def handle_event("delete", %{"id" => id}, socket) do
|
||||
IndexActions.handle_delete(socket, id)
|
||||
|
||||
@@ -8,6 +8,7 @@ defmodule MusicLibraryWeb.ScrobbledTracksLive.Index do
|
||||
alias LastFm.Track
|
||||
alias MusicLibrary.Assets.Transform
|
||||
alias MusicLibrary.ListeningStats
|
||||
alias MusicLibraryWeb.ErrorMessages
|
||||
|
||||
@default_tracks_list_params %{
|
||||
query: "",
|
||||
@@ -298,9 +299,13 @@ defmodule MusicLibraryWeb.ScrobbledTracksLive.Index do
|
||||
|
||||
def handle_event("delete", %{"scrobbled-at-uts" => scrobbled_at_uts}, socket) do
|
||||
track = ListeningStats.get_track!(scrobbled_at_uts)
|
||||
{:ok, _} = ListeningStats.delete_track(track)
|
||||
stream_element = %{track: track}
|
||||
socket = stream_delete(socket, :tracks, stream_element)
|
||||
|
||||
{:noreply, stream_delete(socket, :tracks, %{track: track})}
|
||||
{:noreply,
|
||||
start_async(socket, {:delete_track, scrobbled_at_uts}, fn ->
|
||||
{ListeningStats.delete_track(track), stream_element}
|
||||
end)}
|
||||
end
|
||||
|
||||
def handle_event("search", %{"query" => query}, socket) do
|
||||
@@ -317,6 +322,22 @@ defmodule MusicLibraryWeb.ScrobbledTracksLive.Index do
|
||||
{:noreply, socket}
|
||||
end
|
||||
|
||||
@impl true
|
||||
def handle_async({:delete_track, _uts}, {:ok, {{:ok, _track}, _element}}, socket) do
|
||||
{:noreply, socket}
|
||||
end
|
||||
|
||||
def handle_async({:delete_track, _uts}, {:ok, {{:error, reason}, element}}, socket) do
|
||||
{:noreply,
|
||||
socket
|
||||
|> stream_insert(:tracks, element)
|
||||
|> put_toast(:error, gettext("Failed to delete: ") <> ErrorMessages.friendly_message(reason))}
|
||||
end
|
||||
|
||||
def handle_async({:delete_track, _uts}, {:exit, _reason}, socket) do
|
||||
{:noreply, put_toast(socket, :error, gettext("Delete failed, please try again"))}
|
||||
end
|
||||
|
||||
defp parse_order("scrobbled_at"), do: :scrobbled_at
|
||||
defp parse_order("title"), do: :title
|
||||
defp parse_order("artist"), do: :artist
|
||||
|
||||
@@ -7,6 +7,7 @@ defmodule MusicLibraryWeb.WishlistLive.Index do
|
||||
alias MusicLibrary.Records
|
||||
alias MusicLibrary.Wishlist
|
||||
alias MusicLibraryWeb.Components.AddRecord
|
||||
alias MusicLibraryWeb.ErrorMessages
|
||||
alias MusicLibraryWeb.LiveHelpers.IndexActions
|
||||
|
||||
defp index_config do
|
||||
@@ -230,6 +231,29 @@ defmodule MusicLibraryWeb.WishlistLive.Index do
|
||||
{:noreply, socket}
|
||||
end
|
||||
|
||||
@impl true
|
||||
def handle_async({:delete_record, _id}, {:ok, {:ok, _record}}, socket) do
|
||||
{:noreply, socket}
|
||||
end
|
||||
|
||||
def handle_async({:delete_record, id}, {:ok, {:error, reason}}, socket) do
|
||||
record = Records.get_record!(id)
|
||||
|
||||
{:noreply,
|
||||
socket
|
||||
|> stream_insert(:records, record)
|
||||
|> put_toast(:error, gettext("Failed to delete: ") <> ErrorMessages.friendly_message(reason))}
|
||||
end
|
||||
|
||||
def handle_async({:delete_record, id}, {:exit, _reason}, socket) do
|
||||
record = Records.get_record!(id)
|
||||
|
||||
{:noreply,
|
||||
socket
|
||||
|> stream_insert(:records, record)
|
||||
|> put_toast(:error, gettext("Delete failed, please try again"))}
|
||||
end
|
||||
|
||||
@impl true
|
||||
def handle_event("delete", %{"id" => id}, socket) do
|
||||
IndexActions.handle_delete(socket, id)
|
||||
|
||||
@@ -3,7 +3,16 @@ defmodule MusicLibraryWeb.LiveHelpers.IndexActions do
|
||||
|
||||
import LiveToast, only: [put_toast: 3]
|
||||
import Phoenix.Component, only: [assign: 3]
|
||||
import Phoenix.LiveView, only: [push_patch: 2, push_navigate: 2, stream: 4, stream_delete: 3]
|
||||
|
||||
import Phoenix.LiveView,
|
||||
only: [
|
||||
push_patch: 2,
|
||||
push_navigate: 2,
|
||||
start_async: 3,
|
||||
stream: 4,
|
||||
stream_delete: 3
|
||||
]
|
||||
|
||||
import MusicLibraryWeb.Components.Pagination, only: [page_to_offset: 2]
|
||||
import MusicLibraryWeb.LiveHelpers.Params
|
||||
|
||||
@@ -91,9 +100,12 @@ defmodule MusicLibraryWeb.LiveHelpers.IndexActions do
|
||||
|
||||
def handle_delete(socket, id) do
|
||||
record = Records.get_record!(id)
|
||||
{:ok, _} = Records.delete_record(record)
|
||||
socket = stream_delete(socket, :records, record)
|
||||
|
||||
{:noreply, stream_delete(socket, :records, record)}
|
||||
{:noreply,
|
||||
start_async(socket, {:delete_record, id}, fn ->
|
||||
Records.delete_record(record)
|
||||
end)}
|
||||
end
|
||||
|
||||
def handle_search(socket, query) do
|
||||
|
||||
Reference in New Issue
Block a user