refactor(member): share Ash error formatting across member-show components
This commit is contained in:
parent
24f67bea80
commit
856ea4279c
7 changed files with 105 additions and 36 deletions
34
lib/mv_web/helpers/ash_error_helpers.ex
Normal file
34
lib/mv_web/helpers/ash_error_helpers.ex
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
defmodule MvWeb.Helpers.AshErrorHelpers do
|
||||
@moduledoc """
|
||||
Shared formatting for Ash errors surfaced as flash messages in the
|
||||
member show LiveComponents.
|
||||
|
||||
Centralizes the translation of `Ash.Error.Invalid` / `Ash.Error.Forbidden`
|
||||
(and plain string/unknown errors) into user-facing text so the components do
|
||||
not each carry their own copy.
|
||||
"""
|
||||
use Gettext, backend: MvWeb.Gettext
|
||||
|
||||
@doc """
|
||||
Turns an Ash error into a human-readable, localized string.
|
||||
|
||||
- `Ash.Error.Invalid` — joins the individual error messages, falling back to
|
||||
`inspect/1` for sub-errors that carry no `:message`.
|
||||
- `Ash.Error.Forbidden` — a localized "not allowed" message.
|
||||
- a binary — passed through unchanged (already a ready-to-show message).
|
||||
- anything else — a localized generic error message.
|
||||
"""
|
||||
def format_error(%Ash.Error.Invalid{errors: errors}) do
|
||||
Enum.map_join(errors, ", ", fn
|
||||
%{message: message} -> message
|
||||
other -> inspect(other)
|
||||
end)
|
||||
end
|
||||
|
||||
def format_error(%Ash.Error.Forbidden{}) do
|
||||
gettext("You are not allowed to perform this action.")
|
||||
end
|
||||
|
||||
def format_error(error) when is_binary(error), do: error
|
||||
def format_error(_error), do: gettext("An error occurred")
|
||||
end
|
||||
|
|
@ -15,6 +15,7 @@ defmodule MvWeb.MemberLive.Show.DeactivateComponent do
|
|||
use MvWeb, :live_component
|
||||
|
||||
import MvWeb.Authorization, only: [can?: 3]
|
||||
import MvWeb.Helpers.AshErrorHelpers, only: [format_error: 1]
|
||||
|
||||
alias Mv.Membership
|
||||
alias MvWeb.Helpers.MemberHelpers
|
||||
|
|
@ -187,17 +188,4 @@ defmodule MvWeb.MemberLive.Show.DeactivateComponent do
|
|||
|> assign(:show_modal, false)
|
||||
|> assign(:error, nil)
|
||||
end
|
||||
|
||||
defp format_error(%Ash.Error.Invalid{errors: errors}) do
|
||||
Enum.map_join(errors, ", ", fn
|
||||
%{message: message} -> message
|
||||
other -> inspect(other)
|
||||
end)
|
||||
end
|
||||
|
||||
defp format_error(%Ash.Error.Forbidden{}) do
|
||||
gettext("You are not allowed to perform this action.")
|
||||
end
|
||||
|
||||
defp format_error(_error), do: gettext("An error occurred")
|
||||
end
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ defmodule MvWeb.MemberLive.Show.MembershipFeesComponent do
|
|||
require Ash.Query
|
||||
import MvWeb.LiveHelpers, only: [current_actor: 1]
|
||||
import MvWeb.Authorization, only: [can?: 3]
|
||||
import MvWeb.Helpers.AshErrorHelpers, only: [format_error: 1]
|
||||
|
||||
alias Mv.Membership
|
||||
alias Mv.MembershipFees
|
||||
|
|
@ -1144,17 +1145,6 @@ defmodule MvWeb.MemberLive.Show.MembershipFeesComponent do
|
|||
defp format_status_label(:unpaid), do: gettext("Unpaid")
|
||||
defp format_status_label(:suspended), do: gettext("Suspended")
|
||||
|
||||
defp format_error(%Ash.Error.Invalid{} = error) do
|
||||
Enum.map_join(error.errors, ", ", fn e -> e.message end)
|
||||
end
|
||||
|
||||
defp format_error(%Ash.Error.Forbidden{}) do
|
||||
gettext("You are not allowed to perform this action.")
|
||||
end
|
||||
|
||||
defp format_error(error) when is_binary(error), do: error
|
||||
defp format_error(_error), do: gettext("An error occurred")
|
||||
|
||||
defp validate_cycle_not_exists(cycles, cycle_start) do
|
||||
if Enum.any?(cycles, &(&1.cycle_start == cycle_start)) do
|
||||
{:error, :cycle_exists}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue