diff --git a/packages/frontend/src/api/admin-lessons.ts b/packages/frontend/src/api/admin-lessons.ts new file mode 100644 index 0000000..28f1ec1 --- /dev/null +++ b/packages/frontend/src/api/admin-lessons.ts @@ -0,0 +1,7 @@ +import type { Lesson } from '@flashcard/shared'; +import { api } from './client.js'; + +export const adminLessonsApi = { + setCurated: (id: number, isCurated: boolean) => + api.patch(`/admin/lessons/${id}/curated`, { isCurated }), +}; diff --git a/packages/frontend/src/api/lessons.ts b/packages/frontend/src/api/lessons.ts index f531dca..6c2aa61 100644 --- a/packages/frontend/src/api/lessons.ts +++ b/packages/frontend/src/api/lessons.ts @@ -1,4 +1,7 @@ -import type { Lesson, LessonCreateInput, LessonMoveInput, LessonTreeNode, LessonUpdateInput } from '@flashcard/shared'; +import type { + Lesson, LessonCreateInput, LessonMoveInput, LessonTreeNode, LessonUpdateInput, + Visibility, SubscriptionEntry, +} from '@flashcard/shared'; import { api } from './client.js'; export const lessonsApi = { @@ -7,4 +10,10 @@ export const lessonsApi = { update: (id: number, input: LessonUpdateInput) => api.patch(`/lessons/${id}`, input), remove: (id: number) => api.delete(`/lessons/${id}`), move: (id: number, input: LessonMoveInput) => api.post(`/lessons/${id}/move`, input), + setVisibility: (id: number, visibility: Visibility) => + api.patch(`/lessons/${id}/visibility`, { visibility }), + fork: (id: number) => api.post(`/lessons/${id}/fork`), + subscribe: (id: number) => api.post<{ ok: true }>(`/lessons/${id}/subscribe`), + unsubscribe: (id: number) => api.delete(`/lessons/${id}/subscribe`), + mySubscriptions: () => api.get('/me/subscriptions'), }; diff --git a/packages/frontend/src/api/marketplace.ts b/packages/frontend/src/api/marketplace.ts new file mode 100644 index 0000000..1a445a3 --- /dev/null +++ b/packages/frontend/src/api/marketplace.ts @@ -0,0 +1,16 @@ +import type { MarketplaceLesson } from '@flashcard/shared'; +import { api } from './client.js'; + +export interface MarketplaceListResponse { rows: MarketplaceLesson[]; total: number; } + +export const marketplaceApi = { + list: (params: { q?: string; curated?: boolean; limit?: number; offset?: number } = {}) => { + const qs = new URLSearchParams(); + if (params.q) qs.set('q', params.q); + if (params.curated !== undefined) qs.set('curated', String(params.curated)); + if (params.limit !== undefined) qs.set('limit', String(params.limit)); + if (params.offset !== undefined) qs.set('offset', String(params.offset)); + const s = qs.toString(); + return api.get(`/marketplace/lessons${s ? '?' + s : ''}`); + }, +};