diff --git a/lib/livebook_web/live/session_live/secrets_list_component.ex b/lib/livebook_web/live/session_live/secrets_list_component.ex index 58d3b9fec..53ade69cf 100644 --- a/lib/livebook_web/live/session_live/secrets_list_component.ex +++ b/lib/livebook_web/live/session_live/secrets_list_component.ex @@ -3,6 +3,11 @@ defmodule LivebookWeb.SessionLive.SecretsListComponent do alias Livebook.Session + @impl true + def mount(socket) do + {:ok, assign(socket, hub_secrets_counter: 1)} + end + @impl true def render(assigns) do ~H""" @@ -52,7 +57,7 @@ defmodule LivebookWeb.SessionLive.SecretsListComponent do -
+
<.hub_secret :for={secret <- Enum.sort_by(@hub_secrets, & &1.name)} id={"hub-#{secret.hub_id}-secret-#{secret.name}"} @@ -156,7 +161,10 @@ defmodule LivebookWeb.SessionLive.SecretsListComponent do phx-change="toggle_secret" phx-target={@myself} > - <.switch_field field={f[:toggled]} /> + <.switch_field + field={f[:toggled]} + value={Session.Data.secret_toggled?(@secret, @secrets)} + /> <.hidden_field field={f[:name]} value={@secret.name} />
@@ -213,12 +221,40 @@ defmodule LivebookWeb.SessionLive.SecretsListComponent do def handle_event("toggle_secret", %{"data" => data}, socket) do if data["toggled"] == "true" do secret = Enum.find(socket.assigns.hub_secrets, &(&1.name == data["name"])) - Session.set_secret(socket.assigns.session.pid, secret) + + session_secrets = + Session.Data.session_secrets(socket.assigns.secrets, socket.assigns.hub.id) + + overrides_session_secret? = Enum.any?(session_secrets, &(&1.name == secret.name)) + + if overrides_session_secret? do + session_pid = socket.assigns.session.pid + + on_confirm = fn socket -> + Session.set_secret(session_pid, secret) + socket + end + + {:noreply, + socket + # Before the action is confirmed, we want to render the secret + # back as "untoggled", so we force a patch to override the + # client state + |> update(:hub_secrets_counter, &(&1 + 1)) + |> confirm(on_confirm, + title: "Override session secret", + description: + "There is a session secret named #{secret.name}, this action will erase it.", + confirm_text: "Override" + )} + else + Session.set_secret(socket.assigns.session.pid, secret) + {:noreply, socket} + end else Session.unset_secret(socket.assigns.session.pid, data["name"]) + {:noreply, socket} end - - {:noreply, socket} end def handle_event("update_outdated", %{"name" => name}, socket) do @@ -236,8 +272,8 @@ defmodule LivebookWeb.SessionLive.SecretsListComponent do {:noreply, confirm(socket, on_confirm, - title: "Delete session secret - #{secret_name}", - description: "Are you sure you want to delete this session secret?", + title: "Delete session secret", + description: "Are you sure you want to delete #{secret_name} session secret?", confirm_text: "Delete", confirm_icon: "delete-bin-6-line" )}