defmodule AiDebugWeb.SessionDetailsLive do use AiDebugWeb, :live_view alias AiDebug.SessionManager alias Phoenix.PubSub @impl true def render(assigns) do ~H"""

Session Details

<.link navigate="/" class="text-blue-600 hover:text-blue-500"> ← Back to Dashboard
<%= if @session do %>
Session ID
<%= @session.id %>
URL
<%= @session.url %>
Started At
<%= format_datetime(@session.started_at) %>
Event Count
<%= @session.event_count %>

Events

<%= for event <- @events do %>
<%= event.type %> <%= if event[:level] do %> <%= event.level %> <% end %>
<%= format_time(event[:timestamp] || DateTime.utc_now()) %>
<%= if event[:message] do %>

<%= event.message %>

<% end %> <%= if event[:data] do %>
<%= inspect(event.data, pretty: true) %>
<% end %>
<% end %>
<%= if @events == [] do %>

No events recorded yet

<% end %>
<% else %>

Session not found

<% end %>
""" end @impl true def mount(%{"id" => session_id}, _session, socket) do if connected?(socket) do # Subscribe to session updates PubSub.subscribe(AiDebug.PubSub, "session:#{session_id}") end case SessionManager.get_session(session_id) do {:ok, session} -> {:ok, socket |> assign(:session, session) |> assign(:events, get_session_events(session_id))} {:error, :not_found} -> {:ok, socket |> assign(:session, nil) |> assign(:events, [])} end end @impl true def handle_info({:event_added, event}, socket) do {:noreply, assign(socket, :events, [event | socket.assigns.events])} end defp get_session_events(_session_id) do # For now, return empty list. In real implementation, would fetch from Session [] end defp format_datetime(datetime) do Calendar.strftime(datetime, "%Y-%m-%d %H:%M:%S UTC") end defp format_time(datetime) do Calendar.strftime(datetime, "%H:%M:%S") end defp event_class("console"), do: "bg-blue-100 text-blue-800" defp event_class("network"), do: "bg-green-100 text-green-800" defp event_class("error"), do: "bg-red-100 text-red-800" defp event_class("navigation"), do: "bg-purple-100 text-purple-800" defp event_class(_), do: "bg-gray-100 text-gray-800" end