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