Can wishlist a scrobbled record
This commit is contained in:
@@ -41,6 +41,34 @@ defmodule MusicLibraryWeb.StatsLive.Index do
|
||||
)}
|
||||
end
|
||||
|
||||
def handle_event("import", %{"id" => musicbrainz_id, "format" => format}, socket) do
|
||||
case Records.import_from_musicbrainz_release(musicbrainz_id,
|
||||
format: format,
|
||||
purchased_at: nil
|
||||
) do
|
||||
{:ok, record} ->
|
||||
{:noreply,
|
||||
socket
|
||||
|> put_flash(:info, gettext("Record imported successfully"))
|
||||
|> push_navigate(to: ~p"/wishlist/#{record.id}")}
|
||||
|
||||
{:error, %Ecto.Changeset{} = changeset} ->
|
||||
{:noreply,
|
||||
socket
|
||||
|> put_flash(
|
||||
:error,
|
||||
gettext("Error importing record") <> "," <> inspect(changeset.errors)
|
||||
)
|
||||
|> push_patch(to: ~p"/wishlist")}
|
||||
|
||||
{:error, reason} ->
|
||||
{:noreply,
|
||||
socket
|
||||
|> put_flash(:error, gettext("Error importing record") <> "," <> inspect(reason))
|
||||
|> push_patch(to: ~p"/wishlist")}
|
||||
end
|
||||
end
|
||||
|
||||
def handle_info(%{tracks: tracks}, socket) do
|
||||
{:noreply, stream(socket, :recent_tracks, tracks, reset: true)}
|
||||
end
|
||||
@@ -68,4 +96,14 @@ defmodule MusicLibraryWeb.StatsLive.Index do
|
||||
|> DateTime.from_unix!()
|
||||
|> DateTime.to_iso8601()
|
||||
end
|
||||
|
||||
defp toggle_actions_menu(track_id) do
|
||||
JS.toggle(to: "#actions-#{track_id}")
|
||||
|> JS.toggle_class("pointer-events-none", to: "#scrobble-activity > li")
|
||||
end
|
||||
|
||||
def close_actions_menu(track_id) do
|
||||
JS.hide(to: "#actions-#{track_id}")
|
||||
|> JS.remove_class("pointer-events-none", to: "#scrobble-activity > li")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -80,8 +80,8 @@
|
||||
</span>
|
||||
<div class="relative flex space-x-3 items-center">
|
||||
<img class="h-12 w-12 rounded-md shadow" src={track.cover_url} alt={track.title} />
|
||||
<div class="flex min-w-0 flex-1 justify-between space-x-4">
|
||||
<div class="font-semibold">
|
||||
<div class="flex min-w-0 flex-1 justify-between space-x-4 items-center">
|
||||
<div class="font-semibold grow">
|
||||
<p class="text-sm md:text-base block cursor-pointer text-zinc-500 hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-300">
|
||||
<%= track.artist.name %>
|
||||
</p>
|
||||
@@ -95,6 +95,61 @@
|
||||
>
|
||||
<%= track.scrobbled_at_label %>
|
||||
</time>
|
||||
|
||||
<div class="relative flex-none">
|
||||
<button
|
||||
type="button"
|
||||
class="text-zinc-500 hover:text-zinc-900 dark:text-zinc-400 dark:hover:text-zinc-300"
|
||||
aria-expanded="false"
|
||||
aria-haspopup="true"
|
||||
phx-click={toggle_actions_menu(track.scrobbled_at_uts)}
|
||||
phx-click-away={close_actions_menu(track.scrobbled_at_uts)}
|
||||
>
|
||||
<span class="sr-only"><%= gettext("Open options") %></span>
|
||||
<.icon
|
||||
name="hero-ellipsis-vertical"
|
||||
class="-mt-1 h-5 w-5"
|
||||
aria-hidden="true"
|
||||
data-slot="icon"
|
||||
/>
|
||||
</button>
|
||||
<!--
|
||||
Dropdown menu, show/hide based on menu state.
|
||||
|
||||
Entering: "transition ease-out duration-100"
|
||||
From: "transform opacity-0 scale-95"
|
||||
To: "transform opacity-100 scale-100"
|
||||
Leaving: "transition ease-in duration-75"
|
||||
From: "transform opacity-100 scale-100"
|
||||
To: "transform opacity-0 scale-95"
|
||||
-->
|
||||
<.focus_wrap
|
||||
id={"actions-#{track.scrobbled_at_uts}"}
|
||||
class={[
|
||||
"hidden pointer-events-auto absolute right-0 z-10 mt-2 w-48 origin-top-right rounded-md bg-white dark:bg-zinc-800 py-2 shadow-lg ring-1 ring-zinc-900/5 focus:outline-none"
|
||||
]}
|
||||
role="menu"
|
||||
aria-orientation="vertical"
|
||||
aria-labelledby="options-menu-0-button"
|
||||
tabindex="-1"
|
||||
>
|
||||
<.link
|
||||
:for={format <- Records.Record.formats()}
|
||||
class="block px-3 py-1 text-sm leading-6 text-zinc-900 dark:text-zinc-400 hover:bg-zinc-50 dark:hover:text-zinc-300 dark:hover:bg-zinc-700"
|
||||
role="menuitem"
|
||||
tabindex="-1"
|
||||
id={"actions-#{track.scrobbled_at_uts}-#{format}-import"}
|
||||
phx-click={
|
||||
JS.push("import",
|
||||
value: %{id: track.album.musicbrainz_id, format: format},
|
||||
page_loading: true
|
||||
)
|
||||
}
|
||||
>
|
||||
<%= Records.Record.format_long_label(format) %>
|
||||
</.link>
|
||||
</.focus_wrap>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user