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.
This commit is contained in:
Moritz 2025-11-10 16:34:00 +01:00
parent 150bba2ef8
commit c416d0fb91
Signed by: moritz
GPG key ID: 1020A035E5DD0824

View file

@ -109,50 +109,11 @@ defmodule MvWeb.MemberLive.Index do
@impl true @impl true
def handle_info({:sort, field_str}, socket) do def handle_info({:sort, field_str}, socket) do
field = String.to_existing_atom(field_str) 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} = socket
if socket.assigns.sort_field == field do |> update_sort_components(socket.assigns.sort_field, new_field, new_order)
{toggle_order(socket.assigns.sort_order), field} |> push_sort_url(new_field, new_order)
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
)}
end end
@impl true @impl true
@ -204,6 +165,55 @@ defmodule MvWeb.MemberLive.Index do
# ------------------------------------------------------------- # -------------------------------------------------------------
# FUNCTIONS # 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 # Load members eg based on a query for sorting
defp load_members(socket, search_query) do defp load_members(socket, search_query) do
query = query =