defmodule LivebookWeb.SessionLive.RuntimeComponent do use LivebookWeb, :live_component alias Livebook.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 = runtime_type(assigns.runtime) Map.put(assigns, :type, type) else assigns end {:ok, assign(socket, assigns)} end @impl true def render(assigns) do ~H"""

Runtime settings

<%= if Livebook.Config. runtime_enabled?(Livebook.Runtime.ElixirStandalone) do %> <.choice_button active={@type == "elixir_standalone"} phx-click="set_runtime_type" phx-value-type="elixir_standalone" phx-target={@myself}> Elixir standalone <% end %> <%= if Livebook.Config. runtime_enabled?(Livebook.Runtime.MixStandalone) do %> <.choice_button active={@type == "mix_standalone"} phx-click="set_runtime_type" phx-value-type="mix_standalone" phx-target={@myself}> Mix standalone <% end %> <%= if Livebook.Config. runtime_enabled?(Livebook.Runtime.Attached) do %> <.choice_button active={@type == "attached"} phx-click="set_runtime_type" phx-value-type="attached" phx-target={@myself}> Attached node <% end %> <%= if Livebook.Config. runtime_enabled?(Livebook.Runtime.Embedded) do %> <.choice_button active={@type == "embedded"} phx-click="set_runtime_type" phx-value-type="embedded" phx-target={@myself}> Embedded <% end %>
<%= live_render @socket, live_view_for_type(@type), id: "runtime-config-#{@type}", session: %{"session" => @session, "current_runtime" => @runtime} %>
""" end 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 end