fix(soon): stop pointing at events you've finished or ignored

Two symptoms of one bug. The "next to expire" headline counted events
the reader had marked done or ignored, and the dailies strip kept a
tickable chip for a repeating event they had already finished.

showCompleted and showIgnored decide what a reader can *look at*. The
headline and the strip are *instructions*, so they answer a different
question — what is still on your plate — and both now go through one
`outstanding` lens.

Also fixes a second bug in the same line: `next` took the head of the
list, which under "doing first" sorting is whatever you're partway
through, not the soonest deadline. It reads the minimum now.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Lucas WintherandClaude Opus 5 committed 2026-08-16 20:40:46 +02:00
1 parent c3e9b9064d
commit edc6f3e4bb
7 files changed
+186 -12

No files matched your search

+5 -1
View File
@@ -30,7 +30,11 @@ export function Dailies({
onToggleDay,
}: {
games: GameId[];
/** Live events that repeat daily — detected, or marked by the reader. */
/**
* Live events that repeat daily — detected, or marked by the reader — and
* that the reader has not already finished or ignored. An event they marked
* done has no line left to tick, and listing it is the app arguing with them.
*/
events: GachaEvent[];
region: Region;
now: number;
+15 -3
View File
@@ -10,14 +10,26 @@ import { Meter, URGENCY_COLOR } from "./Meter.tsx";
* Deliberately not a stat grid. One number, because the reader has exactly one
* question on arrival.
*/
export function NextUp({ row, onOpen }: { row: RowEvent | null; onOpen: (id: string) => void }) {
export function NextUp({
row,
onOpen,
}: {
/**
* The soonest-expiring event the reader has neither finished nor ignored.
* A panel headed "next to expire" is a deadline they still have to meet, so
* an event they already ticked off does not belong in it however visible
* they have chosen to keep it elsewhere.
*/
row: RowEvent | null;
onOpen: (id: string) => void;
}) {
if (row === null) {
return (
<section className="border-b border-hairline px-4 py-8">
<p className="eyebrow">Nothing running</p>
<p className="mt-2 max-w-sm text-sm text-muted">
No live events in the games you have switched on. Turn a game back on
below, or check again after the next patch.
Nothing live and unfinished in the games you have switched on. Turn a
game back on below, or check again after the next patch.
</p>
</section>
);