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