refactor: delete the section hint nothing could reach

The "Running now" header had a hint reading "next after this ends in …", and the
commit before this one fixed a real defect in the string it produced — an
unannounced end became the word "ended". Both were beside the point: the branch
cannot render at all.

`Section` shows `action ?? hint`. The hint needed a second live row to have
anything to say, and two live rows are two visible rows, which is exactly the
condition that puts the sort control in the same slot. So the action was present
whenever the hint was, and won every time.

What it would have said is already on the page. The headline panel's "Then" list
names the deadlines behind the closest one and counts each of them down, which is
the same answer with more room. So the hint slot goes, `followingDeadlineMs` goes
with it as its only caller, and `Section` is left with the one control slot it
actually uses.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
Lucas Winther
2026-08-20 06:39:37 +02:00
co-authored by Claude Opus 5
parent 026b1315d3
commit 0b5aa12173
3 changed files with 11 additions and 78 deletions
-35
View File
@@ -3,7 +3,6 @@ import {
advanceFocus,
countByGame,
firstToExpire,
followingDeadlineMs,
nextToExpire,
outstanding,
resolveFocus,
@@ -47,40 +46,6 @@ describe("outstanding", () => {
});
});
describe("followingDeadlineMs", () => {
const HOUR = 3_600_000;
test("reads the second deadline, not the second row", () => {
// The "Running now" header says what falls due after the top row. The list
// arrives in whichever order the reader chose, so under "doing first" its
// second row is the second thing they are partway through — the mistake
// `firstToExpire` prevents one row up.
const rows = [
row("mid-run", "genshin", 9 * 24 * HOUR),
row("next-week", "hsr", 5 * 24 * HOUR),
row("tonight", "zzz", 3 * HOUR),
];
expect(followingDeadlineMs(rows)).toBe(5 * 24 * HOUR);
});
test("an unannounced end is not a deadline of zero", () => {
// The old code took `rows[1].msRemaining ?? 0`, and `formatRemaining(0)` is
// the string "ended" — so a second row with `endsAt: null` had the header
// reading "next after this ends in ended". Null means there is nothing to
// say, and the caller says nothing.
expect(followingDeadlineMs([row("tonight", "genshin", 3 * HOUR), row("undated", "hsr", null)]))
.toBeNull();
});
test("one deadline has nothing behind it", () => {
expect(followingDeadlineMs([row("only", "genshin", 3 * HOUR)])).toBeNull();
});
test("an empty list is null, not a zero", () => {
expect(followingDeadlineMs([])).toBeNull();
});
});
describe("firstToExpire", () => {
test("takes the soonest, not the first row", () => {
// The list arrives sorted by whatever mode the reader chose. Under "doing