defmodule PlausibleWeb.Live.CustomerSupport.User do @moduledoc """ User coordinator LiveView for Customer Support interface. Manages tab-based navigation and delegates rendering to specialized components: Overview and API Keys. """ use PlausibleWeb.CustomerSupport.Live import Ecto.Query alias Plausible.Repo alias PlausibleWeb.CustomerSupport.User.Components.{ Overview, Keys } def handle_params(%{"id" => user_id} = params, _uri, socket) do tab = params["tab"] || "overview" user = Resource.User.get(user_id) if user do keys_count = count_keys(user) socket = socket |> assign(:user, user) |> assign(:tab, tab) |> assign(:keys_count, keys_count) {:noreply, go_to_tab(socket, tab, params, :user, tab_component(tab))} else {:noreply, redirect(socket, to: Routes.customer_support_path(socket, :index))} end end def render(assigns) do ~H"""
<.user_header user={@user} /> <.user_tab_navigation user={@user} tab={@tab} keys_count={@keys_count} /> <.live_component module={tab_component(@tab)} user={@user} tab={@tab} id={"user-#{@user.id}-#{@tab}"} />
""" end defp user_header(assigns) do ~H"""

{@user.name} SSO

{@user.email}

<.input_with_clipboard id="user-identifier" name="user-identifier" label="User Identifier" value={@user.id} />
""" end defp user_tab_navigation(assigns) do ~H""" <.tab_navigation tab={@tab}> <:tabs> <.tab to="overview" tab={@tab}>Overview <.tab to="keys" tab={@tab}> API Keys ({@keys_count}) """ end defp tab_component("overview"), do: Overview defp tab_component("keys"), do: Keys defp tab_component(_), do: Overview defp count_keys(user) do from(api_key in Plausible.Auth.ApiKey, where: api_key.user_id == ^user.id ) |> Repo.aggregate(:count) end end