defmodule LivebookWeb.SessionLive.RuntimeComponent do use LivebookWeb, :live_component alias Livebook.{Session, Runtime} @impl true def mount(socket) do {:ok, assign(socket, type: nil)} end @impl true def update(assigns, socket) do assigns = if socket.assigns.type == nil do type = if assigns.runtime do runtime_type(assigns.runtime) else "elixir_standalone" end Map.put(assigns, :type, type) else assigns end {:ok, assign(socket, assigns)} end @impl true def render(assigns) do ~H"""

Runtime

The code is evaluated in a separate Elixir runtime (node), which you can configure yourself here.

<%= if @runtime do %>
Type <%= runtime_type_label(@runtime) %>
Node name <%= @runtime.node %>
<% else %>

No connected node

<% end %>
<.choice_button active={@type == "elixir_standalone"} phx-click="set_runtime_type" phx-value-type="elixir_standalone" phx-target={@myself}> Elixir standalone <.choice_button active={@type == "mix_standalone"} phx-click="set_runtime_type" phx-value-type="mix_standalone" phx-target={@myself}> Mix standalone <.choice_button active={@type == "attached"} phx-click="set_runtime_type" phx-value-type="attached" phx-target={@myself}> Attached node <.choice_button active={@type == "embedded"} phx-click="set_runtime_type" phx-value-type="embedded" phx-target={@myself}> Embedded
<%= live_render @socket, live_view_for_type(@type), id: "runtime-config-#{@type}", session: %{"session_id" => @session_id, "current_runtime" => @runtime} %>
""" end defp runtime_type_label(%Runtime.ElixirStandalone{}), do: "Elixir standalone" defp runtime_type_label(%Runtime.MixStandalone{}), do: "Mix standalone" defp runtime_type_label(%Runtime.Attached{}), do: "Attached" defp runtime_type_label(%Runtime.Embedded{}), do: "Embedded" defp runtime_type(%Runtime.ElixirStandalone{}), do: "elixir_standalone" defp runtime_type(%Runtime.MixStandalone{}), do: "mix_standalone" defp runtime_type(%Runtime.Attached{}), do: "attached" defp runtime_type(%Runtime.Embedded{}), do: "embedded" defp live_view_for_type("elixir_standalone"), do: LivebookWeb.SessionLive.ElixirStandaloneLive defp live_view_for_type("mix_standalone"), do: LivebookWeb.SessionLive.MixStandaloneLive defp live_view_for_type("attached"), do: LivebookWeb.SessionLive.AttachedLive defp live_view_for_type("embedded"), do: LivebookWeb.SessionLive.EmbeddedLive @impl true def handle_event("set_runtime_type", %{"type" => type}, socket) do {:noreply, assign(socket, type: type)} end def handle_event("disconnect", _params, socket) do Session.disconnect_runtime(socket.assigns.session_id) {:noreply, socket} end end