defmodule LivebookWeb.SessionLive.RuntimeComponent do use LivebookWeb, :live_component alias Livebook.Runtime @impl true def mount(socket) do {:ok, assign(socket, error_message: nil)} end @impl true def update(%{event: {:error, message}}, socket) do {:ok, assign(socket, error_message: message)} end def update(assigns, socket) do with %{runtime_status: :connecting} <- socket.assigns, %{runtime_status: :connected} <- assigns, true <- socket.assigns.type == runtime_type(assigns.runtime) do send(self(), {:push_patch, socket.assigns.return_to}) end socket = socket |> assign(assigns) |> assign_new(:type, fn -> runtime_type(assigns.runtime) end) {:ok, socket} end @impl true def render(assigns) do ~H"""

Runtime settings

<.choice_button :if={Livebook.Config.runtime_enabled?(Livebook.Runtime.Standalone)} active={@type == "standalone"} phx-click="set_runtime_type" phx-value-type="standalone" phx-target={@myself} > Standalone <.choice_button :if={Livebook.Config.runtime_enabled?(Livebook.Runtime.Attached)} active={@type == "attached"} phx-click="set_runtime_type" phx-value-type="attached" phx-target={@myself} > Attached node <.choice_button :if={Livebook.Config.runtime_enabled?(Livebook.Runtime.Embedded)} active={@type == "embedded"} phx-click="set_runtime_type" phx-value-type="embedded" phx-target={@myself} > Embedded <.choice_button :if={Livebook.Config.runtime_enabled?(Livebook.Runtime.Fly)} active={@type == "fly"} phx-click="set_runtime_type" phx-value-type="fly" phx-target={@myself} > Fly.io machine <.choice_button :if={Livebook.Config.runtime_enabled?(Livebook.Runtime.K8s)} active={@type == "k8s"} phx-click="set_runtime_type" phx-value-type="k8s" phx-target={@myself} > Kubernetes Pod
<%= @error_message %>
<.live_component id={"runtime-config-#{@type}"} module={component_for_type(@type)} session={@session} runtime={@runtime} runtime_status={@runtime_status} runtime_connect_info={@runtime_connect_info} hub={@hub} hub_secrets={@hub_secrets} />
""" end defp runtime_type(%Runtime.Standalone{}), do: "standalone" defp runtime_type(%Runtime.Attached{}), do: "attached" defp runtime_type(%Runtime.Embedded{}), do: "embedded" defp runtime_type(%Runtime.Fly{}), do: "fly" defp runtime_type(%Runtime.K8s{}), do: "k8s" defp component_for_type("standalone"), do: LivebookWeb.SessionLive.StandaloneRuntimeComponent defp component_for_type("attached"), do: LivebookWeb.SessionLive.AttachedRuntimeComponent defp component_for_type("embedded"), do: LivebookWeb.SessionLive.EmbeddedRuntimeComponent defp component_for_type("fly"), do: LivebookWeb.SessionLive.FlyRuntimeComponent defp component_for_type("k8s"), do: LivebookWeb.SessionLive.K8sRuntimeComponent @impl true def handle_event("set_runtime_type", %{"type" => type}, socket) do {:noreply, assign(socket, type: type)} end end