defmodule LivebookWeb.Output.PlainTextComponent do use LivebookWeb, :live_component @impl true def mount(socket) do {:ok, socket |> assign(initialized: false) |> stream(:chunks, [])} end @impl true def update(%{event: {:append, output}}, socket) do {:ok, append_output(socket, output)} end def update(assigns, socket) do {output, assigns} = Map.pop(assigns, :output) socket = assign(socket, assigns) if socket.assigns.initialized do # After initialization, output text may be pruned and updates # are sent as events instead {:ok, socket} else {:ok, socket |> append_output(output) |> assign(:initialized, true)} end end defp append_output(socket, output) do chunk = %{ id: Livebook.Utils.random_long_id(), text: output.text, style: output.style } stream_insert(socket, :chunks, chunk) end @impl true def render(assigns) do ~H"""