feat: sort search results by date added (#48)

This commit is contained in:
Felix-Ayush
2026-07-05 10:07:09 -04:00
committed by GitHub
parent 87880d25a4
commit 8673f744f7
2 changed files with 42 additions and 5 deletions
+33 -4
View File
@@ -18,10 +18,10 @@ function r(p: Partial<TorrentResult> & { infoHash: string }): TorrentResult {
const ids = (list: TorrentResult[]): string[] => list.map((x) => x.infoHash);
describe("nextSort", () => {
it("cycles through 7 states: none -> size asc/desc -> seeders asc/desc -> source asc/desc -> none", () => {
it("cycles through 9 states: none -> size asc/desc -> seeders asc/desc -> source asc/desc -> added asc/desc -> none", () => {
const seq: Sort[] = [];
let s: Sort = "none";
for (let i = 0; i < 7; i++) {
for (let i = 0; i < 9; i++) {
s = nextSort(s);
seq.push(s);
}
@@ -32,12 +32,14 @@ describe("nextSort", () => {
{ field: "seeders", dir: "desc" },
{ field: "source", dir: "asc" },
{ field: "source", dir: "desc" },
{ field: "added", dir: "asc" },
{ field: "added", dir: "desc" },
"none",
]);
});
it("SORT_CYCLE has exactly 7 states starting with none", () => {
expect(SORT_CYCLE).toHaveLength(7);
it("SORT_CYCLE has exactly 9 states starting with none", () => {
expect(SORT_CYCLE).toHaveLength(9);
expect(SORT_CYCLE[0]).toBe("none");
});
});
@@ -113,6 +115,33 @@ describe("sortResults", () => {
expect(ids(sortResults(list, { field: "source", dir: "desc" }))).toEqual(["b", "c", "a"]);
});
it("added asc: oldest first", () => {
const list = [
r({ infoHash: "a", added: 300 }),
r({ infoHash: "b", added: 100 }),
r({ infoHash: "c", added: 200 }),
];
expect(ids(sortResults(list, { field: "added", dir: "asc" }))).toEqual(["b", "c", "a"]);
});
it("added desc: newest first", () => {
const list = [
r({ infoHash: "a", added: 300 }),
r({ infoHash: "b", added: 100 }),
r({ infoHash: "c", added: 200 }),
];
expect(ids(sortResults(list, { field: "added", dir: "desc" }))).toEqual(["a", "c", "b"]);
});
it("added treats missing timestamps as zero", () => {
const list = [
r({ infoHash: "a", added: 500 }),
r({ infoHash: "b" }),
r({ infoHash: "c", added: 100 }),
];
expect(ids(sortResults(list, { field: "added", dir: "asc" }))).toEqual(["b", "c", "a"]);
});
it("does not mutate the input array", () => {
const list = [
r({ infoHash: "a", sizeBytes: 1 }),
+9 -1
View File
@@ -1,6 +1,6 @@
import type { TorrentResult } from "../sources/types";
export type SortField = "size" | "seeders" | "source";
export type SortField = "size" | "seeders" | "source" | "added";
export type SortDir = "asc" | "desc";
export interface SortState {
field: SortField;
@@ -22,6 +22,8 @@ export const SORT_CYCLE: Sort[] = [
{ field: "seeders", dir: "desc" },
{ field: "source", dir: "asc" },
{ field: "source", dir: "desc" },
{ field: "added", dir: "asc" },
{ field: "added", dir: "desc" },
];
function sameSort(a: Sort, b: Sort): boolean {
@@ -57,6 +59,12 @@ export function sortResults(list: TorrentResult[], sort: Sort): TorrentResult[]
case "source":
arr.sort((a, b) => mul * a.source.localeCompare(b.source) || b.seeders - a.seeders);
break;
case "added":
arr.sort(
(a, b) =>
mul * ((a.added ?? 0) - (b.added ?? 0)) || b.seeders - a.seeders,
);
break;
}
return arr;
}