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) team = Plausible.Teams.with_subscription(site.team) site = %{site | team: team} current_setting = assigns.feature_mod.enabled?(site) disabled? = assigns.feature_mod.check_availability(team) !== :ok {:ok, socket |> assign(assigns) |> assign(:site, site) |> assign(:current_setting, current_setting) |> assign(:disabled?, disabled?)} end attr :site, Plausible.Site, required: true attr :feature_mod, :atom, required: true attr :current_user, Plausible.Auth.User, required: true def render(assigns) do ~H"""
Show in dashboard
""" end def handle_event("toggle", _params, socket) do site = socket.assigns.site feature_mod = socket.assigns.feature_mod current_user = socket.assigns.current_user case feature_mod.toggle(site, current_user) do {:ok, updated_site} -> new_setting = Map.fetch!(updated_site, feature_mod.toggle_field()) message = if new_setting do "#{feature_mod.toggle_display_name()} are now visible again on your dashboard" else "#{feature_mod.toggle_display_name()} are now hidden from your dashboard" end send(self(), {:feature_toggled, message, updated_site}) socket = assign(socket, site: updated_site, current_setting: feature_mod.enabled?(updated_site)) {:noreply, socket} {:error, _} -> {:noreply, socket} end end end