defmodule MvWeb.LiveHelpers do @moduledoc """ Shared LiveView lifecycle hooks and helper functions. ## on_mount Hooks - `:default` - Sets the user's locale from session (defaults to "de") - `:ensure_user_role_loaded` - Ensures current_user has role relationship loaded ## Usage Add to LiveView modules via: ```elixir on_mount {MvWeb.LiveHelpers, :default} on_mount {MvWeb.LiveHelpers, :ensure_user_role_loaded} ``` """ import Phoenix.Component def on_mount(:default, _params, session, socket) do locale = session["locale"] || "de" Gettext.put_locale(locale) {:cont, socket} end def on_mount(:ensure_user_role_loaded, _params, _session, socket) do socket = ensure_user_role_loaded(socket) {:cont, socket} end defp ensure_user_role_loaded(socket) do if socket.assigns[:current_user] do user = socket.assigns.current_user user_with_role = load_user_role(user) assign(socket, :current_user, user_with_role) else socket end end defp load_user_role(user) do case Map.get(user, :role) do %Ash.NotLoaded{} -> load_role_safely(user) nil -> load_role_safely(user) _role -> user end end defp load_role_safely(user) do # Use self as actor for loading own role relationship opts = [domain: Mv.Accounts, actor: user] case Ash.load(user, :role, opts) do {:ok, loaded_user} -> loaded_user {:error, error} -> # Log warning if role loading fails - this can cause authorization issues require Logger Logger.warning("Failed to load role for user #{user.id}: #{inspect(error)}") user end end end