Baustein 4: Merkkarten mit Wiederholung nach Zeitabstand
- Abgespecktes SM-2 mit drei Bewertungsstufen statt sechs - Abstaende 1, 3, dann Abstand mal Leichtigkeit; gedeckelt bei 180 Tagen - "nochmal" bringt die Karte in derselben Sitzung wieder - Taeglicher Stapel, gedeckelt auf 20 Karten, ueberfaellige zuerst - Fuenf Faecher zur Anzeige, abgeleitet aus dem Abstand - Filter nach Themenblock fuer gezieltes Ueben - Lernmodus fuers Handy: grosse Flaechen, Antippen, Wischen, kein Hover; am Rechner zusaetzlich Leertaste und Tasten 1/2/3 - Tabellen karte und karten_verlauf, jede Bewertung wird mitgeschrieben - Merkkarten zaehlen im Wochenfortschritt mit, gelernt ab Fach 4 - Kopfzeile am Handy einzeilig, Tipp-Hervorhebung abgeschaltet - 29 neue Tests, insgesamt 133 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
103a603eb4
commit
bb592ad2bd
@@ -0,0 +1,77 @@
|
||||
import type { Metadata } from 'next';
|
||||
import Link from 'next/link';
|
||||
import { redirect } from 'next/navigation';
|
||||
import { erfordereBenutzer } from '@/lib/auth/rechte';
|
||||
import { inhalte } from '@/lib/inhalte';
|
||||
import { alsKartenstand, staendeVon } from '@/lib/repos/karten';
|
||||
import { fach, fachNamen, heutigerStapel } from '@/lib/lernen/sm2';
|
||||
import { heute } from '@/lib/zeit';
|
||||
import { Lernmodus, type Lernkarte } from './Lernmodus';
|
||||
|
||||
export const metadata: Metadata = { title: 'Lernmodus' };
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
const STAPELGROESSE = 20;
|
||||
|
||||
export default async function LernSeite({ searchParams }: { searchParams: Promise<{ block?: string }> }) {
|
||||
const benutzer = await erfordereBenutzer();
|
||||
if (benutzer.rolle !== 'azubi') redirect('/karten');
|
||||
|
||||
const { block } = await searchParams;
|
||||
const alle = inhalte();
|
||||
const gewaehlterBlock = block && alle.blockNach.has(block) ? block : undefined;
|
||||
|
||||
const staende = staendeVon(benutzer.id);
|
||||
const heuteDatum = heute();
|
||||
|
||||
const faellige = heutigerStapel(
|
||||
alle.karten.map((karte) => ({
|
||||
karteId: karte.id,
|
||||
faelligAm: staende.get(karte.id)?.faelligAm ?? null,
|
||||
block: karte.block,
|
||||
})),
|
||||
heuteDatum,
|
||||
STAPELGROESSE,
|
||||
gewaehlterBlock,
|
||||
);
|
||||
|
||||
const karten: Lernkarte[] = faellige.map((eintrag) => {
|
||||
const karte = alle.karteNach.get(eintrag.karteId)!;
|
||||
const stand = alsKartenstand(staende.get(karte.id));
|
||||
return {
|
||||
id: karte.id,
|
||||
frage: karte.frage,
|
||||
antwort: karte.antwort,
|
||||
handoutId: karte.handoutId,
|
||||
handoutTitel: karte.handoutTitel,
|
||||
blockTitel: alle.blockNach.get(karte.block)?.titel ?? karte.block,
|
||||
fach: fach(stand),
|
||||
fachName: fachNamen[fach(stand)] ?? '',
|
||||
};
|
||||
});
|
||||
|
||||
if (karten.length === 0) {
|
||||
return (
|
||||
<div className="stapel">
|
||||
<div className="karte-grund stapel" style={{ textAlign: 'center', padding: '2rem 1.25rem' }}>
|
||||
<p style={{ fontSize: '2.5rem', margin: 0 }} aria-hidden="true">
|
||||
✓
|
||||
</p>
|
||||
<h1 style={{ marginBottom: '0.2rem' }}>Für heute nichts fällig</h1>
|
||||
<p className="leise" style={{ marginBottom: 0 }}>
|
||||
{gewaehlterBlock
|
||||
? 'In diesem Themenblock ist heute keine Karte dran.'
|
||||
: 'Alle Karten sitzen gerade fest genug. Morgen kommt der nächste Stapel.'}
|
||||
</p>
|
||||
<div className="reihe" style={{ justifyContent: 'center' }}>
|
||||
<Link href="/karten" className="knopf">
|
||||
Zurück zur Übersicht
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return <Lernmodus karten={karten} block={gewaehlterBlock ?? null} />;
|
||||
}
|
||||
Reference in New Issue
Block a user