defmodule LivebookWeb.Hub.Edit.TeamComponent do use LivebookWeb, :live_component alias Livebook.Hubs.Team alias Livebook.Teams alias LivebookWeb.LayoutHelpers @impl true def update(assigns, socket) do socket = assign(socket, assigns) changeset = Team.change_hub(assigns.hub) show_key? = assigns.params["show-key"] == "true" secrets = Livebook.Hubs.get_secrets(assigns.hub) secret_name = assigns.params["secret_name"] secret_value = if assigns.live_action == :edit_secret do Enum.find_value(secrets, &(&1.name == secret_name && &1.value)) end {:ok, socket |> assign( secrets: secrets, show_key: show_key?, secret_name: secret_name, secret_value: secret_value ) |> assign_form(changeset)} end @impl true def render(assigns) do ~H"""

General

<.form :let={f} id={@id} class="flex flex-col mt-4 space-y-4" for={@form} phx-submit="save" phx-change="validate" phx-target={@myself} >
<.emoji_field field={f[:hub_emoji]} label="Emoji" />

Secrets

Secrets are a safe way to share credentials and tokens with notebooks. They are often shared with Smart cells and can be read as environment variables using the LB_ prefix.

<.live_component module={LivebookWeb.Hub.SecretListComponent} id="hub-secrets-list" hub={@hub} secrets={@secrets} target={@myself} />
<.modal show={@show_key} id="show-key-modal" width={:medium} patch={~p"/hub/#{@hub.id}"}>

Teams Key

This is your Teams Key. If you want to join or invite others to your organization, you will need to share your Teams Key with them. We recommend storing it somewhere safe:
<.modal :if={@live_action in [:new_secret, :edit_secret]} id="secrets-modal" show width={:medium} patch={~p"/hub/#{@hub.id}"} > <.live_component module={LivebookWeb.Hub.SecretFormComponent} id="secrets" hub={@hub} secret_name={@secret_name} secret_value={@secret_value} return_to={~p"/hub/#{@hub.id}"} />
""" end @impl true def handle_event("save", %{"team" => params}, socket) do case Teams.update_hub(socket.assigns.hub, params) do {:ok, hub} -> {:noreply, socket |> put_flash(:success, "Hub updated successfully") |> push_navigate(to: ~p"/hub/#{hub.id}")} {:error, changeset} -> {:noreply, assign_form(socket, changeset)} end end def handle_event("validate", %{"team" => attrs}, socket) do changeset = socket.assigns.hub |> Team.change_hub(attrs) |> Map.replace!(:action, :validate) {:noreply, assign_form(socket, changeset)} end def handle_event("delete_hub_secret", attrs, socket) do %{hub: hub} = socket.assigns on_confirm = fn socket -> {:ok, secret} = Livebook.Secrets.update_secret(%Livebook.Secrets.Secret{}, attrs) case Livebook.Hubs.delete_secret(hub, secret) do :ok -> socket |> put_flash(:success, "Secret deleted successfully") |> push_navigate(to: ~p"/hub/#{hub.id}") {:transport_error, reason} -> put_flash(socket, :error, reason) end end {:noreply, confirm(socket, on_confirm, title: "Delete hub secret - #{attrs["name"]}", description: "Are you sure you want to delete this hub secret?", confirm_text: "Delete", confirm_icon: "delete-bin-6-line" )} end defp assign_form(socket, %Ecto.Changeset{} = changeset) do assign(socket, form: to_form(changeset)) end end