defmodule LiveBeatsWeb.PlayerLive do use LiveBeatsWeb, :live_view alias LiveBeats.MediaLibrary alias LiveBeats.MediaLibrary.Song on_mount {LiveBeatsWeb.UserAuth, :current_user} def render(assigns) do ~H"""

<%= if @song, do: @song.title, else: raw(" ") %>

<%= if @song, do: @song.artist, else: raw(" ") %>

<.progress_bar id="player-progress" />
<%= if @error do %> <.modal show id="enable-audio" on_confirm={js_play_pause() |> hide_modal("enable-audio")}> <:title>Start Listening now Your browser needs a click event to enable playback <:confirm>Listen Now <% end %>
""" end def mount(_parmas, _session, socket) do if connected?(socket) and socket.assigns.current_user do MediaLibrary.subscribe(socket.assigns.current_user) end {:ok, assign(socket, song: nil, playing: false, error: false), layout: false} end def handle_event("play_pause", _, socket) do %{song: song, playing: playing} = socket.assigns IO.inspect({:play_pause, playing}) cond do song && playing -> MediaLibrary.pause_song(song) {:noreply, assign(socket, playing: false)} song -> MediaLibrary.play_song(song) {:noreply, assign(socket, playing: true)} true -> {:noreply, assign(socket, playing: false)} end end def handle_event("audio-rejected", _, socket) do {:noreply, assign(socket, error: true)} end def handle_event("audio-accepted", _, socket) do {:noreply, assign(socket, error: false)} end def handle_info({:pause, _}, socket) do {:noreply, socket |> push_event("pause", %{}) |> assign(playing: false)} end def handle_info({:play, %Song{} = song, %{began_at: at}}, socket) do {:noreply, socket |> push_event("play", %{began_at: at, url: Path.join(LiveBeatsWeb.Endpoint.url(), song.mp3_path)}) |> assign(song: song, playing: true)} end defp js_play_pause(js \\ %JS{}) do JS.dispatch(js, "js:play_pause", to: "#audio-player") end end