Let a reader switch off the chores the app invented
Today's dailies carries two different things: each game's standing chore — "Commissions, resin", a fixed list nobody publishes — and any event with a checklist. The first is the app guessing at a routine the reader never asked for, and it was the only part of that strip with no way out. So the switch removes exactly that. Events keep their checklists whatever their source, including ones the reader added themselves and marked daily, which was the requirement most at risk of being filtered away by a switch aimed at something else. Nothing is discarded. The ticks live under `dailies:<game>` and nothing here reads or writes them, so switching back on restores every logged day and every streak — the same promise `detectDaily` already makes. Defaulted on, because everyone has these today and a setting that silently removes something on upgrade is worse than one nobody notices. Gating where the chore is built rather than where it is drawn means the counts follow for free: "N still waiting on you today" is derived from the items, and a game left with nothing contributes no group at all, so the strip's own empty guard drops it rather than leaving a heading with no rows. Named for what it removes. A switch called "dailies" would read as broken while the strip stayed on screen showing the reader's own events. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 5
parent
f324208457
commit
4277c28e50
@@ -538,6 +538,7 @@ export function App() {
|
||||
the lanes out here would also cost a reader's own game its place in
|
||||
the order their repeating events are grouped under. */}
|
||||
<Dailies
|
||||
showChores={prefs.showChores}
|
||||
games={focus === null ? enabled : [focus]}
|
||||
events={todo.filter(repeatsDaily).map((r) => r.event)}
|
||||
region={prefs.region}
|
||||
|
||||
@@ -230,6 +230,18 @@ export function Controls({
|
||||
hint="Guessed from what the source wrote, so it misses some and invents others. Off, only events you mark yourself get a checklist. Your ticks and streaks are kept either way."
|
||||
/>
|
||||
|
||||
{/* The chores are the app's own invention — no source publishes
|
||||
"Commissions, resin" — and they were the one part of the strip
|
||||
with no way out. Named for what it removes rather than for
|
||||
"dailies", which would read as broken while the strip stayed on
|
||||
screen showing the reader's own events. */}
|
||||
<Check
|
||||
checked={prefs.showChores}
|
||||
onChange={(showChores) => onUpdate({ showChores })}
|
||||
label="Show each game's own daily chores"
|
||||
hint="Commissions, resin, daily training and the rest. Nobody publishes these, so the app keeps a fixed list per game. Off, the strip shows only events with a checklist. Your ticks and streaks are kept either way."
|
||||
/>
|
||||
|
||||
{ignoredCount > 0 && (
|
||||
<Check
|
||||
checked={prefs.showIgnored}
|
||||
|
||||
@@ -85,6 +85,7 @@ export function dailyGroups(
|
||||
region: Region,
|
||||
meta: (id: LaneId) => GameMeta,
|
||||
startOf: (event: DisplayEvent) => number,
|
||||
showChores = true,
|
||||
): DailyGroup[] {
|
||||
// A lane can arrive through an event without being in `games` — an event on a
|
||||
// game the reader has since switched off, say — and dropping it here would
|
||||
@@ -102,7 +103,13 @@ export function dailyGroups(
|
||||
const today = dayKey(now, region, lane);
|
||||
const resetsIn = msUntilReset(now, region, lane);
|
||||
|
||||
if (!isCustomGameId(lane)) {
|
||||
// The standing chore is the app's own invention — no source publishes
|
||||
// "Commissions, resin" — so it is the one part of this strip a reader can
|
||||
// reasonably want gone. Switched off it is simply not built; nothing reads
|
||||
// or writes its ticks here, so `dailies:<game>` keeps every day the reader
|
||||
// ever logged and switching back on restores the lot. A game the reader
|
||||
// invented never had one to begin with.
|
||||
if (showChores && !isCustomGameId(lane)) {
|
||||
items.push({
|
||||
key: dailiesId(lane as GameId),
|
||||
game: lane,
|
||||
@@ -141,6 +148,7 @@ export function Dailies({
|
||||
now,
|
||||
daysFor,
|
||||
onToggleDay,
|
||||
showChores,
|
||||
}: {
|
||||
/** Every lane the reader is looking at, in their own order. */
|
||||
games: LaneId[];
|
||||
@@ -151,6 +159,8 @@ export function Dailies({
|
||||
*/
|
||||
events: DisplayEvent[];
|
||||
region: Region;
|
||||
/** Whether to carry each game's standing chore — `prefs.showChores`. */
|
||||
showChores: boolean;
|
||||
now: number;
|
||||
daysFor: (id: string) => string[];
|
||||
onToggleDay: (id: string, day: string) => void;
|
||||
@@ -176,6 +186,7 @@ export function Dailies({
|
||||
region,
|
||||
gameMeta,
|
||||
(event) => Date.parse(event.startsAt),
|
||||
showChores,
|
||||
);
|
||||
const items = groups.flatMap((group) => group.items);
|
||||
const total = items.length;
|
||||
|
||||
@@ -155,6 +155,18 @@ export interface Prefs {
|
||||
* who already switched it on keep it — stored prefs win over this default.
|
||||
*/
|
||||
detectDaily: boolean;
|
||||
/**
|
||||
* Whether Today's dailies carries each game's standing chore — commissions,
|
||||
* sanity, daily training.
|
||||
*
|
||||
* On by default, because every reader has these today and a setting that
|
||||
* silently removes something on upgrade is worse than one nobody notices.
|
||||
* Off hides only the chores: an event with a checklist is something the
|
||||
* reader engaged with and stays either way. Like `detectDaily` it discards
|
||||
* nothing — the ticks live under `dailies:<game>` and are never written from
|
||||
* here, so switching back on restores every one of them.
|
||||
*/
|
||||
showChores: boolean;
|
||||
showCompleted: boolean;
|
||||
/** Reveal events the reader has ignored, so they can be restored. */
|
||||
showIgnored: boolean;
|
||||
@@ -186,6 +198,7 @@ function defaults(): Prefs {
|
||||
showUpcoming: false,
|
||||
timelineSplitUpcoming: true,
|
||||
detectDaily: false,
|
||||
showChores: true,
|
||||
showCompleted: true,
|
||||
showIgnored: false,
|
||||
theme: DEFAULT_THEME_CHOICE,
|
||||
|
||||
Reference in New Issue
Block a user