fix(ui,i18n): E30 review round 3 — the stored language follows the screen, a fresh text starts collapsed, Retry waits again

This commit is contained in:
2026-10-01 10:43:59 +02:00
parent 08e62bbb16
commit 3563858fd1
14 changed files with 147 additions and 32 deletions
+26 -12
View File
@@ -1,28 +1,32 @@
// @vitest-environment jsdom
// jsdom: the order language comes from the account's stored one, checked against i18n's languages.
import { describe, expect, it } from "vitest";
import { placeByPriority, priorityChoices } from "./channelOrder";
const row = (id: string, priority: number, title: string | null = id) => ({ id, priority, title });
const ids = (rows: { id: string }[]) => rows.map((r) => r.id);
const EN = { language: "en" };
const HU = { language: "hu" };
describe("placeByPriority", () => {
const list = [row("a", 10), row("b", 5), row("c", 5), row("d", 0), row("e", 0)];
it("bubbles a raised channel up to the first row it now outranks", () => {
expect(
ids(placeByPriority([...list.slice(0, 4), { ...list[4]!, priority: 5 }], "e", "en")),
ids(placeByPriority([...list.slice(0, 4), { ...list[4]!, priority: 5 }], "e", EN)),
).toEqual(["a", "b", "c", "e", "d"]);
});
it("sinks a lowered channel below every row it no longer outranks", () => {
expect(
ids(placeByPriority([{ ...list[0]!, priority: 0 }, ...list.slice(1)], "a", "en")),
).toEqual(["b", "c", "a", "d", "e"]);
expect(ids(placeByPriority([{ ...list[0]!, priority: 0 }, ...list.slice(1)], "a", EN))).toEqual(
["b", "c", "a", "d", "e"],
);
});
it("orders equal priorities by title, case-folded, a missing title last", () => {
const rows = [row("x", 3, "beta"), row("y", 3, null), row("z", 3, "Alpha")];
expect(ids(placeByPriority(rows, "z", "en"))).toEqual(["z", "x", "y"]);
expect(ids(placeByPriority([row("y", 3, null), row("x", 3, "beta")], "y", "en"))).toEqual([
expect(ids(placeByPriority(rows, "z", EN))).toEqual(["z", "x", "y"]);
expect(ids(placeByPriority([row("y", 3, null), row("x", 3, "beta")], "y", EN))).toEqual([
"x",
"y",
]);
@@ -31,21 +35,31 @@ describe("placeByPriority", () => {
it("leaves every other row where it was, even ones out of the server's order", () => {
const rows = [row("p", 0), row("q", 9), row("r", 2)];
// r lands before the first row it outranks; p and q keep their (unsorted) order.
expect(ids(placeByPriority(rows, "r", "en"))).toEqual(["r", "p", "q"]);
expect(ids(placeByPriority(rows, "r", EN))).toEqual(["r", "p", "q"]);
});
it("returns an unknown id's list unchanged", () => {
expect(ids(placeByPriority(list, "nope", "en"))).toEqual(ids(list));
expect(ids(placeByPriority(list, "nope", EN))).toEqual(ids(list));
});
it("places a title in the reader's alphabet, as the server's collation does (E30 review)", () => {
const rows = [row("e", 0, "Ecset"), row("f", 0, "Fa"), row("m", 5, "Életrajz")];
const moved = [...rows.slice(0, 2), { ...rows[2]!, priority: 0 }];
expect(ids(placeByPriority(moved, "m", "hu"))).toEqual(["e", "m", "f"]);
expect(ids(placeByPriority(moved, "m", HU))).toEqual(["e", "m", "f"]);
const cs = [row("u", 0, "Cukor"), row("x", 0, "Dob"), row("c", 5, "Csiga")];
expect(
ids(placeByPriority([...cs.slice(0, 2), { ...cs[2]!, priority: 0 }], "c", "hu")),
).toEqual(["u", "c", "x"]);
expect(ids(placeByPriority([...cs.slice(0, 2), { ...cs[2]!, priority: 0 }], "c", HU))).toEqual([
"u",
"c",
"x",
]);
});
it("places by the STORED language, whatever the screen shows: the server sorts by that", () => {
const cs = [row("u", 0, "Cukor"), row("x", 0, "Dob"), row("c", 5, "Csiga")];
const moved = [...cs.slice(0, 2), { ...cs[2]!, priority: 0 }];
// None stored (a Hungarian screen picked while signed out): the server's English order.
expect(ids(placeByPriority(moved, "c", {}))).toEqual(["c", "u", "x"]);
expect(ids(placeByPriority(moved, "c", { language: "de" }))).toEqual(["c", "u", "x"]);
});
});