feat: Implement course team management with dedicated UI and API, add course preview token generation, and refactor course settings UI.

This commit is contained in:
2026-02-18 00:01:47 -03:00
parent 89b1d1353d
commit f365e585a2
13 changed files with 798 additions and 301 deletions
+9 -1
View File
@@ -32,7 +32,15 @@ export default function CourseOutlinePage({ params }: { params: { id: string } }
setUserGrades(grades);
const enrollmentData = await lmsApi.getEnrollments(user.id);
setIsEnrolled(enrollmentData.some(e => e.course_id === params.id));
const enrolled = enrollmentData.some(e => e.course_id === params.id);
// Allow preview token to override enrollment status
const isPreview = typeof window !== 'undefined' && !!sessionStorage.getItem('preview_token');
setIsEnrolled(enrolled || isPreview);
} else {
// Even if not logged in, if there's a preview token, consider "enrolled" for UI
const isPreview = typeof window !== 'undefined' && !!sessionStorage.getItem('preview_token');
if (isPreview) setIsEnrolled(true);
}
} catch (err) {
console.error(err);
+14 -1
View File
@@ -346,7 +346,20 @@ export interface UpdateAnnouncementPayload {
const getToken = () => typeof window !== 'undefined' ? localStorage.getItem('experience_token') : null;
const getToken = () => {
if (typeof window === 'undefined') return null;
// Check for preview token in URL
const urlParams = new URLSearchParams(window.location.search);
const previewToken = urlParams.get('preview_token');
if (previewToken) {
sessionStorage.setItem('preview_token', previewToken);
return previewToken;
}
return sessionStorage.getItem('preview_token') || localStorage.getItem('experience_token');
};
const apiFetch = async (url: string, options: RequestInit = {}, isCMS: boolean = false) => {
const token = getToken();