mirror of
https://github.com/baairon/torlink.git
synced 2026-07-08 18:28:22 +02:00
feat: sort search results by date added (#48)
This commit is contained in:
+33
-4
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user