From c416d0fb91a0b92bfb068f7cc9f5222c7adf1f94 Mon Sep 17 00:00:00 2001 From: Moritz Date: Mon, 10 Nov 2025 16:34:00 +0100 Subject: [PATCH] refactor: split long sort handler into smaller functions Extract determine_new_sort/2, update_sort_components/4, and push_sort_url/3 from handle_info({:sort, ...}). Reduces function from 46 to 7 lines. --- lib/mv_web/live/member_live/index.ex | 96 +++++++++++++++------------- 1 file changed, 53 insertions(+), 43 deletions(-) diff --git a/lib/mv_web/live/member_live/index.ex b/lib/mv_web/live/member_live/index.ex index 7b20278..c933133 100644 --- a/lib/mv_web/live/member_live/index.ex +++ b/lib/mv_web/live/member_live/index.ex @@ -109,50 +109,11 @@ defmodule MvWeb.MemberLive.Index do @impl true def handle_info({:sort, field_str}, socket) do field = String.to_existing_atom(field_str) - old_field = socket.assigns.sort_field + {new_field, new_order} = determine_new_sort(field, socket) - {new_order, new_field} = - if socket.assigns.sort_field == field do - {toggle_order(socket.assigns.sort_order), field} - else - {:asc, field} - end - - active_id = :"sort_#{new_field}" - old_id = :"sort_#{old_field}" - - # Update the new SortHeader - send_update(MvWeb.Components.SortHeaderComponent, - id: active_id, - sort_field: new_field, - sort_order: new_order - ) - - # Reset the current SortHeader - send_update(MvWeb.Components.SortHeaderComponent, - id: old_id, - sort_field: new_field, - sort_order: new_order - ) - - existing_search_query = socket.assigns.query - - # Build the URL with queries - query_params = %{ - "query" => existing_search_query, - "sort_field" => Atom.to_string(new_field), - "sort_order" => Atom.to_string(new_order) - } - - # Set the new path with params - new_path = ~p"/members?#{query_params}" - - # Push the new URL - {:noreply, - push_patch(socket, - to: new_path, - replace: true - )} + socket + |> update_sort_components(socket.assigns.sort_field, new_field, new_order) + |> push_sort_url(new_field, new_order) end @impl true @@ -204,6 +165,55 @@ defmodule MvWeb.MemberLive.Index do # ------------------------------------------------------------- # FUNCTIONS # ------------------------------------------------------------- + + # Determines new sort field and order based on current state + defp determine_new_sort(field, socket) do + if socket.assigns.sort_field == field do + {field, toggle_order(socket.assigns.sort_order)} + else + {field, :asc} + end + end + + # Updates both the active and old SortHeader components + defp update_sort_components(socket, old_field, new_field, new_order) do + active_id = :"sort_#{new_field}" + old_id = :"sort_#{old_field}" + + # Update the new SortHeader + send_update(MvWeb.Components.SortHeaderComponent, + id: active_id, + sort_field: new_field, + sort_order: new_order + ) + + # Reset the current SortHeader + send_update(MvWeb.Components.SortHeaderComponent, + id: old_id, + sort_field: new_field, + sort_order: new_order + ) + + socket + end + + # Builds sort URL and pushes navigation patch + defp push_sort_url(socket, field, order) do + query_params = %{ + "query" => socket.assigns.query, + "sort_field" => Atom.to_string(field), + "sort_order" => Atom.to_string(order) + } + + new_path = ~p"/members?#{query_params}" + + {:noreply, + push_patch(socket, + to: new_path, + replace: true + )} + end + # Load members eg based on a query for sorting defp load_members(socket, search_query) do query =