defmodule VikWeb.LogLive do @moduledoc false use VikWeb, :live_view alias Vik.Logger on_mount VikWeb.Auth on_mount {VikWeb.SystemHandler, :static} @initial_lines 50 @impl true def mount(%{"n" => n}, _session, socket) do {:ok, mount_logs(socket, n)} end @impl true def mount(_params, _session, socket) do {:ok, mount_logs(socket, @initial_lines)} end defp mount_logs(socket, n) do Logger.subscribe() stream_lines(socket, :logs, Logger.tail(n)) end @impl true def handle_event("shortcut", %{"ctrl" => true, "key" => "k"}, socket) do Logger.clear() {:noreply, stream(socket, :logs, [], reset: true)} end @impl true def handle_event("shortcut", _, socket) do {:noreply, socket} end @impl true def handle_info({:lines, lines}, socket) do {:noreply, stream(socket, :logs, lines, at: 0)} end @impl true def render(assigns) do ~H"""

Logs

<.terminal id="logs" lines={@streams.logs} />
""" end attr :id, :string, required: true attr :lines, :list, required: true attr :scroll, :boolean, default: false def terminal(assigns) do ~H"""
{line}
""" end end