From bc989422e2691efd669a1b3d7c845b0d427ff968 Mon Sep 17 00:00:00 2001 From: Moritz Date: Tue, 16 Dec 2025 11:07:28 +0100 Subject: [PATCH] refactor: reduce function nesting depth to fix Credo warnings Extract nested conditionals into separate helper functions: - check_amount_change/2 and related helpers in MembershipFeeTypeLive.Form - check_interval_change/2 and related helpers in MemberLive.Form This reduces nesting depth from 3 to 2, improving code readability. --- lib/mv_web/live/member_live/form.ex | 81 +++++++++++-------- .../live/membership_fee_type_live/form.ex | 74 ++++++++++------- 2 files changed, 92 insertions(+), 63 deletions(-) diff --git a/lib/mv_web/live/member_live/form.ex b/lib/mv_web/live/member_live/form.ex index 9018563..63ab513 100644 --- a/lib/mv_web/live/member_live/form.ex +++ b/lib/mv_web/live/member_live/form.ex @@ -272,39 +272,7 @@ defmodule MvWeb.MemberLive.Form do validated_form = AshPhoenix.Form.validate(socket.assigns.form, member_params) # Check for interval mismatch if membership_fee_type_id changed - socket = - if Map.has_key?(member_params, "membership_fee_type_id") && - socket.assigns.member && - socket.assigns.member.membership_fee_type do - new_fee_type_id = member_params["membership_fee_type_id"] - - if new_fee_type_id != "" && - new_fee_type_id != socket.assigns.member.membership_fee_type_id do - new_fee_type = find_fee_type(socket.assigns.available_fee_types, new_fee_type_id) - - if new_fee_type && - new_fee_type.interval != socket.assigns.member.membership_fee_type.interval do - assign( - socket, - :interval_warning, - gettext( - "Warning: Changing from %{old_interval} to %{new_interval} is not allowed. Please select a membership fee type with the same interval.", - old_interval: - MembershipFeeHelpers.format_interval( - socket.assigns.member.membership_fee_type.interval - ), - new_interval: MembershipFeeHelpers.format_interval(new_fee_type.interval) - ) - ) - else - assign(socket, :interval_warning, nil) - end - else - assign(socket, :interval_warning, nil) - end - else - socket - end + socket = check_interval_change(socket, member_params) {:noreply, assign(socket, form: validated_form)} end @@ -427,6 +395,53 @@ defmodule MvWeb.MemberLive.Form do end end + # Checks if membership fee type interval changed and updates socket assigns + defp check_interval_change(socket, member_params) do + if Map.has_key?(member_params, "membership_fee_type_id") && + socket.assigns.member && + socket.assigns.member.membership_fee_type do + handle_interval_change(socket, member_params["membership_fee_type_id"]) + else + socket + end + end + + # Handles interval change validation + defp handle_interval_change(socket, new_fee_type_id) do + if new_fee_type_id != "" && + new_fee_type_id != socket.assigns.member.membership_fee_type_id do + validate_interval_match(socket, new_fee_type_id) + else + assign(socket, :interval_warning, nil) + end + end + + # Validates that new fee type has same interval as current + defp validate_interval_match(socket, new_fee_type_id) do + new_fee_type = find_fee_type(socket.assigns.available_fee_types, new_fee_type_id) + + if new_fee_type && + new_fee_type.interval != socket.assigns.member.membership_fee_type.interval do + show_interval_warning(socket, new_fee_type) + else + assign(socket, :interval_warning, nil) + end + end + + # Shows interval mismatch warning + defp show_interval_warning(socket, new_fee_type) do + assign( + socket, + :interval_warning, + gettext( + "Warning: Changing from %{old_interval} to %{new_interval} is not allowed. Please select a membership fee type with the same interval.", + old_interval: + MembershipFeeHelpers.format_interval(socket.assigns.member.membership_fee_type.interval), + new_interval: MembershipFeeHelpers.format_interval(new_fee_type.interval) + ) + ) + end + defp find_fee_type(fee_types, fee_type_id) do Enum.find(fee_types, &(&1.id == fee_type_id)) end diff --git a/lib/mv_web/live/membership_fee_type_live/form.ex b/lib/mv_web/live/membership_fee_type_live/form.ex index 06d0dde..96611c8 100644 --- a/lib/mv_web/live/membership_fee_type_live/form.ex +++ b/lib/mv_web/live/membership_fee_type_live/form.ex @@ -195,36 +195,7 @@ defmodule MvWeb.MembershipFeeTypeLive.Form do validated_form = AshPhoenix.Form.validate(socket.assigns.form, params) # Check if amount changed on edit - socket = - if socket.assigns.membership_fee_type && Map.has_key?(params, "amount") do - new_amount_str = params["amount"] - old_amount = socket.assigns.membership_fee_type.amount - - case Decimal.parse(new_amount_str) do - {new_amount, _} when is_struct(new_amount, Decimal) -> - if Decimal.compare(new_amount, old_amount) != :eq do - # Amount changed - show warning - affected_count = get_affected_member_count(socket.assigns.membership_fee_type.id) - - socket - |> assign(:show_amount_warning, true) - |> assign(:old_amount, old_amount) - |> assign(:new_amount, new_amount) - |> assign(:affected_member_count, affected_count) - |> assign(:pending_amount, new_amount_str) - else - # Amount unchanged - hide warning - socket - |> assign(:show_amount_warning, false) - |> assign(:pending_amount, nil) - end - - :error -> - socket - end - else - socket - end + socket = check_amount_change(socket, params) {:noreply, assign(socket, form: validated_form)} end @@ -322,6 +293,49 @@ defmodule MvWeb.MembershipFeeTypeLive.Form do defp return_path("index", _membership_fee_type), do: ~p"/membership_fee_types" @spec get_affected_member_count(String.t()) :: non_neg_integer() + # Checks if amount changed and updates socket assigns accordingly + defp check_amount_change(socket, params) do + if socket.assigns.membership_fee_type && Map.has_key?(params, "amount") do + handle_amount_change(socket, params["amount"], socket.assigns.membership_fee_type.amount) + else + socket + end + end + + # Handles amount change detection and warning assignment + defp handle_amount_change(socket, new_amount_str, old_amount) do + case Decimal.parse(new_amount_str) do + {new_amount, _} when is_struct(new_amount, Decimal) -> + if Decimal.compare(new_amount, old_amount) != :eq do + show_amount_warning(socket, old_amount, new_amount, new_amount_str) + else + hide_amount_warning(socket) + end + + :error -> + socket + end + end + + # Shows amount change warning with affected member count + defp show_amount_warning(socket, old_amount, new_amount, new_amount_str) do + affected_count = get_affected_member_count(socket.assigns.membership_fee_type.id) + + socket + |> assign(:show_amount_warning, true) + |> assign(:old_amount, old_amount) + |> assign(:new_amount, new_amount) + |> assign(:affected_member_count, affected_count) + |> assign(:pending_amount, new_amount_str) + end + + # Hides amount change warning + defp hide_amount_warning(socket) do + socket + |> assign(:show_amount_warning, false) + |> assign(:pending_amount, nil) + end + defp get_affected_member_count(fee_type_id) do case Ash.count(Member |> Ash.Query.filter(membership_fee_type_id == ^fee_type_id)) do {:ok, count} -> count