diff --git a/packages/frontend/src/pages/Dashboard.tsx b/packages/frontend/src/pages/Dashboard.tsx index 1483d03..d19d60b 100644 --- a/packages/frontend/src/pages/Dashboard.tsx +++ b/packages/frontend/src/pages/Dashboard.tsx @@ -1,21 +1,38 @@ import { useEffect, useState } from 'react'; -import { Link } from 'react-router-dom'; +import { Link, useNavigate } from 'react-router-dom'; import { statsApi, type Overview } from '../api/stats.js'; +import { sessionsApi } from '../api/sessions.js'; +import type { SessionRow } from '@flashcard/shared'; import { useLessons } from '../stores/lessonsStore.js'; import { formatDuration, formatDate } from '../lib/format.js'; export function DashboardPage() { const { tree, refresh } = useLessons(); const [ov, setOv] = useState(null); + const [active, setActive] = useState(null); + const navigate = useNavigate(); useEffect(() => { refresh(); statsApi.overview().then(setOv); }, [refresh]); + useEffect(() => { + sessionsApi.active().then(setActive).catch(() => {}); + }, []); + return (

Dashboard

+ {active && ( +
+ Je hebt een open sessie ({active.cardsShown} kaarten behandeld). +
+ + +
+
+ )}
diff --git a/packages/frontend/src/pages/Practice.tsx b/packages/frontend/src/pages/Practice.tsx index 7177131..05585b1 100644 --- a/packages/frontend/src/pages/Practice.tsx +++ b/packages/frontend/src/pages/Practice.tsx @@ -2,6 +2,7 @@ import { useEffect, useState } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import type { Card } from '@flashcard/shared'; import { cardsApi } from '../api/cards.js'; +import { sessionsApi } from '../api/sessions.js'; import { useSession } from '../stores/sessionStore.js'; import { Flashcard } from '../components/Flashcard.js'; @@ -12,7 +13,31 @@ export function PracticePage() { const [card, setCard] = useState(null); useEffect(() => { - if (!session) { navigate(`/practice/${lessonId}/setup`); return; } + if (useSession.getState().session) return; + (async () => { + const active = await sessionsApi.active(); + if (!active || String(active.lessonId) !== lessonId) return; + const nx = await sessionsApi.next(active.id); + useSession.setState({ + session: active, + current: nx.done ? null : nx.item, + done: nx.done, + showAnswer: false, + shownAt: Date.now(), + }); + })(); + }, [lessonId]); + + useEffect(() => { + if (session) return; + const t = setTimeout(async () => { + if (useSession.getState().session) return; + const active = await sessionsApi.active(); + if (!active || String(active.lessonId) !== lessonId) { + navigate(`/practice/${lessonId}/setup`); + } + }, 50); + return () => clearTimeout(t); }, [session, lessonId, navigate]); useEffect(() => {