From 752c24dd9b25be00c65f8898123d2d14f895a2d7 Mon Sep 17 00:00:00 2001
From: mdashlw <mdashlw@gmail.com>
Date: Sun, 23 Mar 2025 09:18:00 +0000
Subject: [PATCH] Fix sorting in image navigator

---
 lib/philomena_web/controllers/search_controller.ex |  2 +-
 lib/philomena_web/image_navigator.ex               | 14 +++++++++-----
 lib/philomena_web/image_sorter.ex                  |  2 +-
 3 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/lib/philomena_web/controllers/search_controller.ex b/lib/philomena_web/controllers/search_controller.ex
index 694a726e..cb82c7d6 100644
--- a/lib/philomena_web/controllers/search_controller.ex
+++ b/lib/philomena_web/controllers/search_controller.ex
@@ -44,6 +44,6 @@ defmodule PhilomenaWeb.SearchController do
   defp search_function(true), do: &Search.search_records_with_hits/2
   defp search_function(_custom), do: &Search.search_records/2
 
-  defp custom_ordering?(%{params: %{"sf" => sf}}) when sf != "id", do: true
+  defp custom_ordering?(%{params: %{"sf" => sf}}) when sf not in ~W(id first_seen_at), do: true
   defp custom_ordering?(_conn), do: false
 end
diff --git a/lib/philomena_web/image_navigator.ex b/lib/philomena_web/image_navigator.ex
index 547fb617..01b782e0 100644
--- a/lib/philomena_web/image_navigator.ex
+++ b/lib/philomena_web/image_navigator.ex
@@ -9,7 +9,7 @@ defmodule PhilomenaWeb.ImageNavigator do
   }
 
   def find_consecutive(conn, image, compiled_query, compiled_filter) do
-    conn = update_in(conn.params, &Map.put_new(&1, "sf", "id"))
+    conn = update_in(conn.params, &Map.put_new(&1, "sf", "first_seen_at"))
 
     %{query: compiled_query, sorts: sorts} = ImageSorter.parse_sort(conn.params, compiled_query)
 
@@ -22,7 +22,7 @@ defmodule PhilomenaWeb.ImageNavigator do
       conn.params["sort"]
       |> permit_list()
       |> Enum.flat_map(&permit_value/1)
-      |> default_value(image.id)
+      |> default_cursors(conn.params["sf"], image)
 
     maybe_search_after(
       Image,
@@ -62,6 +62,13 @@ defmodule PhilomenaWeb.ImageNavigator do
     []
   end
 
+  defp default_cursors([], "id", image), do: [image.id]
+
+  defp default_cursors([], "first_seen_at", image),
+    do: [image.first_seen_at |> DateTime.to_unix(:millisecond), image.id]
+
+  defp default_cursors(list, _sf, _image), do: list
+
   defp apply_direction({"galleries.position", sort_body}, rel) do
     sort_body = update_in(sort_body.order, fn direction -> @order_for_dir[rel][direction] end)
 
@@ -78,9 +85,6 @@ defmodule PhilomenaWeb.ImageNavigator do
   defp permit_value(value) when is_binary(value) or is_number(value), do: [value]
   defp permit_value(_value), do: []
 
-  defp default_value([], term), do: [term]
-  defp default_value(list, _term), do: list
-
   defp hidden_filter(%{id: id}, param) when param != "1", do: %{term: %{hidden_by_user_ids: id}}
   defp hidden_filter(_user, _param), do: %{match_none: %{}}
 end
diff --git a/lib/philomena_web/image_sorter.ex b/lib/philomena_web/image_sorter.ex
index ed422288..564d3781 100644
--- a/lib/philomena_web/image_sorter.ex
+++ b/lib/philomena_web/image_sorter.ex
@@ -80,7 +80,7 @@ defmodule PhilomenaWeb.ImageSorter do
   end
 
   defp parse_sf(_params, sd, query) do
-    %{query: query, sorts: [%{"first_seen_at" => sd}]}
+    %{query: query, sorts: [%{"first_seen_at" => sd}, %{"id" => sd}]}
   end
 
   defp random_query(seed, sd, query) do