diff --git a/lib/plausible_web/components/generic.ex b/lib/plausible_web/components/generic.ex index cda27ed0692c..89e1272e0b24 100644 --- a/lib/plausible_web/components/generic.ex +++ b/lib/plausible_web/components/generic.ex @@ -485,8 +485,9 @@ defmodule PlausibleWeb.Components.Generic do attr :feature_toggle?, :boolean, default: false attr :current_role, :atom, default: nil attr :current_team, :any, default: nil + attr :current_user, :any, default: nil attr :site, :any - attr :conn, :any + attr :conn, :any, default: nil attr :show_content?, :boolean, default: true def tile(assigns) do @@ -506,6 +507,7 @@ defmodule PlausibleWeb.Components.Generic do feature_mod={@feature_mod} site={@site} conn={@conn} + current_user={@current_user} />
diff --git a/lib/plausible_web/components/site/feature.ex b/lib/plausible_web/components/site/feature.ex index 2bc74a55b5f9..7ef068672611 100644 --- a/lib/plausible_web/components/site/feature.ex +++ b/lib/plausible_web/components/site/feature.ex @@ -7,11 +7,12 @@ defmodule PlausibleWeb.Components.Site.Feature do attr(:site, Plausible.Site, required: true) attr(:feature_mod, :atom, required: true, values: Plausible.Billing.Feature.list()) - attr(:conn, Plug.Conn, required: true) + attr(:conn, :any, default: nil) + attr(:current_user, :any, default: nil) attr(:class, :any, default: nil) slot(:inner_block) - def toggle(assigns) do + def toggle(%{conn: %Plug.Conn{}} = assigns) do assigns = assigns |> assign(:current_setting, assigns.feature_mod.enabled?(assigns.site)) @@ -37,7 +38,22 @@ defmodule PlausibleWeb.Components.Site.Feature do """ end - def target(site, setting, conn, set_to) when is_boolean(set_to) do + def toggle(assigns) do + ~H""" + <.live_component + module={PlausibleWeb.Components.Site.Feature.ToggleLive} + id={"feature-toggle-#{@site.id}-#{@feature_mod}"} + site={@site} + feature_mod={@feature_mod} + current_user={@current_user} + class={@class} + > + {render_slot(@inner_block)} + + """ + end + + defp target(site, setting, conn, set_to) when is_boolean(set_to) do r = conn.request_path Routes.site_path(conn, :update_feature_visibility, site.domain, setting, r: r, set: set_to) end diff --git a/lib/plausible_web/components/site/toggle_live.ex b/lib/plausible_web/components/site/toggle_live.ex new file mode 100644 index 000000000000..0ab51752af44 --- /dev/null +++ b/lib/plausible_web/components/site/toggle_live.ex @@ -0,0 +1,96 @@ +defmodule PlausibleWeb.Components.Site.Feature.ToggleLive do + @moduledoc """ + LiveComponent for rendering a user-facing feature toggle in LiveView contexts. + Instead of using form submission, this component messages itself to handle toggles. + """ + use PlausibleWeb, :live_component + + def update(assigns, socket) do + site = Plausible.Repo.preload(assigns.site, :team) + current_setting = assigns.feature_mod.enabled?(site) + disabled? = assigns.feature_mod.check_availability(site.team) !== :ok + + {:ok, + socket + |> assign(assigns) + |> assign(:site, site) + |> assign(:current_setting, current_setting) + |> assign(:disabled?, disabled?)} + end + + def render(assigns) do + ~H""" +