Extract RecordHelpers

Closes #123
This commit is contained in:
Claudio Ortolina
2026-03-22 09:21:00 +00:00
parent 72a189c58a
commit ca228db598
5 changed files with 161 additions and 208 deletions
@@ -0,0 +1,122 @@
defmodule MusicLibraryWeb.LiveHelpers.RecordActions do
@moduledoc """
Shared record action handlers for CollectionLive.Show and WishlistLive.Show.
Each function takes a socket (with a `:record` assign), performs the
operation, and returns `{:noreply, socket}` — ready to be returned
directly from a `handle_event/3` callback.
"""
import LiveToast, only: [put_toast: 3]
import Phoenix.Component, only: [assign: 3]
use Gettext, backend: MusicLibraryWeb.Gettext
alias MusicLibrary.Chats
alias MusicLibrary.Records
alias MusicLibrary.Records.Similarity
alias MusicLibraryWeb.ErrorMessages
def refresh_musicbrainz_data(socket) do
record = socket.assigns.record
case Records.refresh_musicbrainz_data(record) do
{:ok, updated_record} ->
{:noreply,
socket
|> put_toast(:info, gettext("MusicBrainz data refreshed successfully"))
|> assign(:record, updated_record)}
{:error, reason} ->
{:noreply,
socket
|> put_toast(
:error,
gettext("Error refreshing MusicBrainz data") <>
": " <> ErrorMessages.friendly_message(reason)
)}
end
end
def refresh_cover(socket) do
record = socket.assigns.record
case Records.refresh_cover(record) do
{:ok, updated_record} ->
{:noreply,
socket
|> put_toast(:info, gettext("Cover refreshed successfully"))
|> assign(:record, updated_record)}
{:error, reason} ->
{:noreply,
socket
|> put_toast(
:error,
gettext("Error refreshing cover") <> ": " <> ErrorMessages.friendly_message(reason)
)}
end
end
def populate_genres(socket) do
record = socket.assigns.record
case Records.populate_genres_async(record) do
{:ok, _worker} ->
{:noreply,
socket
|> put_toast(:info, gettext("In progress - record will update automatically"))}
{:error, reason} ->
{:noreply,
socket
|> put_toast(
:error,
gettext("Error") <> ": " <> ErrorMessages.friendly_message(reason)
)}
end
end
def extract_colors(socket) do
record = socket.assigns.record
case Records.extract_colors(record) do
{:ok, updated_record} ->
{:noreply,
socket
|> assign(:record, updated_record)
|> put_toast(:info, gettext("Colors extracted"))}
{:error, reason} ->
{:noreply,
socket
|> put_toast(
:error,
gettext("Error extracting colors") <> ": " <> ErrorMessages.friendly_message(reason)
)}
end
end
def handle_chats_changed(socket) do
{:noreply,
assign(socket, :chat_count, Chats.count_chats(:record, socket.assigns.record.musicbrainz_id))}
end
@doc """
Handles a background record update. Returns the updated socket (not wrapped
in `{:noreply, ...}`) so the caller can pipe additional assigns.
"""
def handle_record_updated(socket, record) do
socket
|> put_toast(:info, gettext("Record updated in the background"))
|> assign(:record, record)
|> assign_embedding_text()
end
def assign_embedding_text(socket) do
case Similarity.get_embedding_text(socket.assigns.record.id) do
{:ok, text} -> assign(socket, :embedding_text, text)
{:error, _reason} -> assign(socket, :embedding_text, gettext("Not available"))
end
end
end