Check-my-work attachments, smart review follows deletions, GPL-3.0-only
- "Check my work" now takes photos and documents of the attempt: documents
are read in the browser into text, photos go to /api/homework as
solutionImages and are transcribed by the vision model before the check
("Reading your solution..."). The finished attempt comes back in
meta.solutionText and is stored as the record's attempt, so "Redo"
re-checks the same work without keeping the files.
- Deleting a deck now drops its due schedules and mistakes from the library's
smart review immediately (the counts resolve against the live deck list);
Undo brings them back, because the learning data itself is never erased.
- The phone override for the glacier blobs was still at 0.1/0.2: it is now a
quarter of the original value there too (0.025/0.05), matching the desktop.
- License: GPL-3.0-only (LICENSE, package.json, README section).
Tests: phase-3 photos-only API + desktop attachment checks (28/28), review
suite deck-delete checks (18/18), i18n/mobile/phase-2 green. README:
decisions 57-58. SW -> freezmo-v45.
This commit is contained in:
parent
9d204b85be
commit
d559865a09
13 changed files with 1033 additions and 24 deletions
|
|
@ -15,7 +15,7 @@ import { createFolder, folderStore, renameFolder } from "@/lib/folders";
|
|||
import { deleteHomework, homeworkStore, sortHomework } from "@/lib/homework";
|
||||
import { learningStore } from "@/lib/history";
|
||||
import { useI18n } from "@/lib/i18n";
|
||||
import { computeStats, dueCount, mistakeCount } from "@/lib/learning";
|
||||
import { computeStats, dueItems, mistakeItems } from "@/lib/learning";
|
||||
import { settingsStore } from "@/lib/settings";
|
||||
import { ALL_FOLDERS, folderSelection, useSelectedFolder } from "@/lib/nav";
|
||||
import { springGentle, springSheet } from "@/lib/motion";
|
||||
|
|
@ -108,8 +108,16 @@ export function LibraryScreen({ initialTab = "decks" }: { initialTab?: "decks" |
|
|||
() => settingsStore.getSnapshot().dailyGoal,
|
||||
() => 20,
|
||||
);
|
||||
const due = useMemo(() => dueCount(srs), [srs]);
|
||||
const mistakes = useMemo(() => mistakeCount(answers), [answers]);
|
||||
/* Smart-review counts resolve against the live deck list: deleting a deck
|
||||
must drop its due schedules and its mistakes right away. `dueCount` is not
|
||||
used directly because it counts raw schedules, including decks that no
|
||||
longer exist. */
|
||||
const deckIds = useMemo(() => new Set(decks.map((deck) => deck.id)), [decks]);
|
||||
const due = useMemo(() => dueItems(srs).filter((item) => deckIds.has(item.deck.id)).length, [srs, deckIds]);
|
||||
const mistakes = useMemo(
|
||||
() => mistakeItems(answers).filter((item) => deckIds.has(item.deck.id)).length,
|
||||
[answers, deckIds],
|
||||
);
|
||||
const todayCount = useMemo(() => computeStats(answers).todayCount, [answers]);
|
||||
const importRef = useRef<HTMLInputElement>(null);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue