diff --git a/lib/live_beats_web/live/song_live/delete_dialog_component.ex b/lib/live_beats_web/live/song_live/delete_dialog_component.ex
new file mode 100644
index 0000000..a94b89e
--- /dev/null
+++ b/lib/live_beats_web/live/song_live/delete_dialog_component.ex
@@ -0,0 +1,47 @@
+defmodule LiveBeatsWeb.SongLive.DeleteDialogComponent do
+ use LiveBeatsWeb, :live_component
+
+ alias LiveBeats.MediaLibrary
+
+ def send_show(%MediaLibrary.Song{} = song) do
+ send_update(__MODULE__, id: "delete-modal", show: song)
+ end
+
+ @impl true
+ def render(assigns) do
+ ~H"""
+
+ <.modal
+ id="delete-modal"
+ loading={is_nil(@song.id)}
+ on_confirm={JS.push("confirm-delete", value: %{id: @song.id}) |> hide("#song-#{@song.id}")}
+ on_cancel={JS.push("cancel", target: @myself)}>
+
+ Are you sure you want to delete "<%= @song.title %>"?
+
+ <:cancel>Cancel
+ <:confirm>Delete
+
+
+ """
+ end
+
+ @impl true
+ def update(%{show: %MediaLibrary.Song{} = song}, socket) do
+ {:ok, assign(socket, song: song)}
+ end
+
+ def update(%{} = _assigns, socket) do
+ {:ok, assign_defaults(socket)}
+ end
+
+ @impl true
+ def handle_event("cancel", _, socket) do
+ IO.inspect({:cancel})
+ {:noreply, assign_defaults(socket)}
+ end
+
+ defp assign_defaults(socket) do
+ assign(socket, song: %MediaLibrary.Song{})
+ end
+end
diff --git a/lib/live_beats_web/live/song_live/index.ex b/lib/live_beats_web/live/song_live/index.ex
index 9e75232..01a3100 100644
--- a/lib/live_beats_web/live/song_live/index.ex
+++ b/lib/live_beats_web/live/song_live/index.ex
@@ -3,6 +3,7 @@ defmodule LiveBeatsWeb.SongLive.Index do
alias LiveBeats.MediaLibrary
alias LiveBeats.MediaLibrary.Song
+ alias LiveBeatsWeb.SongLive.DeleteDialogComponent
def render(assigns) do
~H"""
@@ -10,7 +11,7 @@ defmodule LiveBeatsWeb.SongLive.Index do
Listing Songs
<:actions>
- <.button primary patch_to={Routes.song_index_path(@socket, :new)}>New Song
+ <.button primary patch_to={Routes.song_index_path(@socket, :new)}>Upload Songs
@@ -28,14 +29,16 @@ defmodule LiveBeatsWeb.SongLive.Index do
<% end %>
- <.table rows={@songs}>
+ <.live_component module={DeleteDialogComponent} id="delete-modal"/>
+
+ <.table rows={@songs} row_id={fn song -> "song-#{song.id}" end}>
<:col let={song} label="Title"><%= song.title %>
<:col let={song} label="Artist"><%= song.artist %>
<:col let={song} label="Duration"><%= song.duration %>
<:col let={song} label="">
<.link redirect_to={Routes.song_show_path(@socket, :show, song)}>Show
<.link patch_to={Routes.song_index_path(@socket, :edit, song)}>Edit
- <.link phx-click={JS.push("delete", value: %{id: song.id})} data-confirm="Are you sure?">Delete
+ <.link phx-click={JS.push("delete", value: %{id: song.id}) |> show_modal("delete-modal")}>Delete
"""
@@ -68,9 +71,13 @@ defmodule LiveBeatsWeb.SongLive.Index do
end
def handle_event("delete", %{"id" => id}, socket) do
+ DeleteDialogComponent.send_show(MediaLibrary.get_song!(id))
+ {:noreply, socket}
+ end
+
+ def handle_event("confirm-delete", %{"id" => id}, socket) do
song = MediaLibrary.get_song!(id)
{:ok, _} = MediaLibrary.delete_song(song)
-
{:noreply, assign(socket, :songs, list_songs())}
end
diff --git a/priv/repo/seeds.exs b/priv/repo/seeds.exs
index 1d0e51b..aaec480 100644
--- a/priv/repo/seeds.exs
+++ b/priv/repo/seeds.exs
@@ -10,15 +10,15 @@
# We recommend using the bang functions (`insert!`, `update!`
# and so on) as they will fail if something goes wrong.
-for title <- ~w(Chill Pop Hip-hop Electronic) do
- {:ok, _} = LiveBeats.MediaLibrary.create_genre(%{title: title})
-end
-
-# for i <- 1..20 do
-# {:ok, _} =
-# LiveBeats.MediaLibrary.create_song(%{
-# artist: "Bonobo",
-# title: "Black Sands #{i}",
-# duration: 180_000
-# })
+# for title <- ~w(Chill Pop Hip-hop Electronic) do
+# {:ok, _} = LiveBeats.MediaLibrary.create_genre(%{title: title})
# end
+
+for i <- 1..20 do
+ {:ok, _} =
+ LiveBeats.MediaLibrary.create_song(%{
+ artist: "Bonobo",
+ title: "Black Sands #{i}",
+ duration: 180_000
+ })
+end