defmodule Flames.Dashboard.ErrorsLive do @moduledoc false use Flames.Web, :live_view alias Flames.Errors @impl true def mount(_params, %{"csp_nonces" => csp_nonces}, socket) do errors = Errors.list() {:ok, socket |> assign(errors: errors, csp_nonces: csp_nonces)} end @impl true def handle_params(_params, url, socket) do uri = URI.parse(url) Errors.subscribe() { :noreply, socket |> assign(:basepath, uri.path) } end @impl true def render(assigns) do ~H"""
<.level level={error.level} />
<%= if error.module != nil do %> <%= error.module |> display_module() %>
<%= error.file %>:<%= error.line %>
<%= error.function %> <% else %> (No Location Information) <% end %>
<%= error.count %>
<%= last_incident_timestamp(error) %>
<%= error.message |> String.slice(0, 250) |> String.trim_trailing() %> <%= if String.length(error.message) > 250 do %> ... <% end %>
<.button phx-click={JS.push("resolve")} phx-value-id={error.id}>Resolve
""" end @impl true def handle_event("resolve", %{"id" => id}, socket) do Errors.resolve(id) {:noreply, assign(socket, errors: Errors.list())} end @impl true @spec handle_info(Phoenix.Socket.Broadcast.t(), Phoenix.LiveView.Socket.t()) :: {:noreply, Phoenix.LiveView.Socket.t()} def handle_info(%Phoenix.Socket.Broadcast{event: "error", payload: _error}, socket) do {:noreply, assign(socket, errors: Errors.list())} end end