defmodule MvWeb.JoinRequestLive.Helpers do @moduledoc """ Shared helpers for JoinRequest LiveViews (Index, Show): status display, badge variants, and reviewer display. """ use Gettext, backend: MvWeb.Gettext @doc "Human-readable label for a join request status atom." def format_status(:pending_confirmation), do: gettext("Pending confirmation") def format_status(:submitted), do: gettext("Submitted") def format_status(:approved), do: gettext("Approved") def format_status(:rejected), do: gettext("Rejected") def format_status(other), do: to_string(other) @doc "Badge variant for the status (used with CoreComponents.badge)." def status_badge_variant(:submitted), do: :info def status_badge_variant(:approved), do: :success def status_badge_variant(:rejected), do: :error def status_badge_variant(_), do: :neutral @doc """ Returns the reviewer display string (e.g. email) for a join request, or nil if none. Prefers the denormalized :reviewed_by_display (set on approve/reject) so the UI works for all roles without loading the User resource. Falls back to :reviewed_by_user when loaded (e.g. admin or legacy data before backfill). """ def reviewer_display(req) when is_map(req) do case Map.get(req, :reviewed_by_display) do s when is_binary(s) -> trimmed = String.trim(s) if trimmed == "", do: reviewer_display_from_user(req), else: trimmed _ -> reviewer_display_from_user(req) end end def reviewer_display(_), do: nil defp reviewer_display_from_user(req) do user = Map.get(req, :reviewed_by_user) case user do nil -> nil %{email: email} when is_binary(email) -> s = String.trim(email) if s == "", do: nil, else: s %{"email" => email} when is_binary(email) -> s = String.trim(email) if s == "", do: nil, else: s _ -> nil end end end