feat: restore landing style and add separate courses/admin UX

This commit is contained in:
root
2026-02-06 16:10:41 +00:00
parent 3d488f22b7
commit 4ca66ea896
26 changed files with 2119 additions and 1054 deletions

View File

@ -419,6 +419,38 @@ class ApiClient {
return this.request<any>(`/moderation/reviews/${reviewId}/unhide`, { method: 'POST' });
}
async getModerationCourses(params?: { status?: string; search?: string }) {
const searchParams = new URLSearchParams();
if (params?.status) searchParams.set('status', params.status);
if (params?.search) searchParams.set('search', params.search);
const query = searchParams.toString();
return this.request<any[]>(`/moderation/courses${query ? `?${query}` : ''}`);
}
async getPendingModerationCourses() {
return this.request<any[]>('/moderation/pending');
}
async approveModerationCourse(courseId: string, note?: string) {
return this.request<any>(`/moderation/${courseId}/approve`, {
method: 'POST',
body: JSON.stringify({ note }),
});
}
async rejectModerationCourse(courseId: string, reason: string) {
return this.request<any>(`/moderation/${courseId}/reject`, {
method: 'POST',
body: JSON.stringify({ reason }),
});
}
async deleteModerationCourse(courseId: string) {
return this.request<void>(`/moderation/${courseId}`, {
method: 'DELETE',
});
}
// Search
async searchCourses(query: string, filters?: { category?: string; difficulty?: string }) {
const searchParams = new URLSearchParams({ q: query });