diff --git a/packages/frontend/src/api/search.ts b/packages/frontend/src/api/search.ts new file mode 100644 index 0000000..79ec7b6 --- /dev/null +++ b/packages/frontend/src/api/search.ts @@ -0,0 +1,28 @@ +import { api } from './client.js'; + +export interface SearchLessonResult { + id: number; + name: string; + ownerDisplayName: string; + location: 'library' | 'marketplace'; + totalCards: number; + isCurated: boolean; +} + +export interface SearchCardResult { + id: number; + lessonId: number; + lessonName: string; + question: string; + snippet: string; +} + +export interface SearchResult { + lessons: SearchLessonResult[]; + cards: SearchCardResult[]; +} + +export const searchApi = { + search: (q: string, limit = 30) => + api.get(`/search?q=${encodeURIComponent(q)}&limit=${limit}`), +}; diff --git a/packages/frontend/src/api/sessions.ts b/packages/frontend/src/api/sessions.ts index 85f4b0c..95abc59 100644 --- a/packages/frontend/src/api/sessions.ts +++ b/packages/frontend/src/api/sessions.ts @@ -6,6 +6,7 @@ export interface SessionState { session: SessionRow; queue: QueueItem[]; index: export const sessionsApi = { start: (input: SessionStartInput) => api.post('/sessions', input), + startDue: () => api.post(`/sessions/due`), active: () => api.get('/sessions/active'), state: (id: number) => api.get(`/sessions/${id}`), next: (id: number) => api.get<{ done: true } | { done: false; item: QueueItem }>(`/sessions/${id}/next`), diff --git a/packages/frontend/src/api/stats.ts b/packages/frontend/src/api/stats.ts index a396083..0e2282f 100644 --- a/packages/frontend/src/api/stats.ts +++ b/packages/frontend/src/api/stats.ts @@ -20,4 +20,9 @@ export const statsApi = { lesson: (id: number) => api.get(`/stats/lessons/${id}`), card: (id: number) => api.get(`/stats/cards/${id}`), heatmap: (weeks = 12) => api.get<{ day: string; sessions: number; attempts: number }[]>(`/stats/heatmap?weeks=${weeks}`), + lessonsProgress: () => api.get<{ rows: Array<{ + lessonId: number; name: string; totalCards: number; masteredCards: number; + scorePct: number; lastSessionAt: number | null; + }> }>(`/stats/lessons-progress`), + due: () => api.get<{ overdue: number; today: number; tomorrow: number; thisWeek: number }>(`/stats/due`), };