defmodule LiveBookWeb.SessionsLive do
use LiveBookWeb, :live_view
@impl true
def mount(_params, _session, socket) do
if connected?(socket) do
Phoenix.PubSub.subscribe(LiveBook.PubSub, "sessions")
end
session_ids = LiveBook.SessionSupervisor.get_session_ids()
{:ok, assign(socket, session_ids: session_ids)}
end
@impl true
def render(assigns) do
~L"""
Sessions
<%= for session_id <- Enum.sort(@session_ids) do %>
<%= live_redirect session_id, to: Routes.live_path(@socket, LiveBookWeb.SessionLive, session_id) %>
<% end %>
"""
end
@impl true
def handle_event("create_session", _params, socket) do
case LiveBook.SessionSupervisor.create_session() do
{:ok, id} ->
{:noreply,
push_redirect(socket, to: Routes.live_path(socket, LiveBookWeb.SessionLive, id))}
{:error, reason} ->
{:noreply, put_flash(socket, :error, "Failed to create a notebook: #{reason}")}
end
end
def handle_event("delete_session", %{"id" => session_id}, socket) do
LiveBook.SessionSupervisor.delete_session(session_id)
{:noreply, socket}
end
@impl true
def handle_info({:session_created, id}, socket) do
session_ids = [id | socket.assigns.session_ids]
{:noreply, assign(socket, :session_ids, session_ids)}
end
def handle_info({:session_deleted, id}, socket) do
session_ids = List.delete(socket.assigns.session_ids, id)
{:noreply, assign(socket, :session_ids, session_ids)}
end
end