ML-169.10: async delete actions with initial implementation

This commit is contained in:
Claudio Ortolina
2026-05-22 16:19:54 +01:00
parent 9f02e12414
commit b10be7ba3c
10 changed files with 380 additions and 16 deletions
@@ -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