diff --git a/src/app/[locale]/courses/contents/[courseId]/page.tsx b/src/app/[locale]/courses/contents/[courseId]/page.tsx new file mode 100644 index 00000000..7332c63e --- /dev/null +++ b/src/app/[locale]/courses/contents/[courseId]/page.tsx @@ -0,0 +1,54 @@ +import { notFound, redirect } from 'next/navigation' +import { getCourseById } from '@/database/course/select' +import { NextContentButton, PreviousContentButton } from '@/src/components/courses/contents/[courseId]/ContentNavigationButtons' +import { ContentProvider } from '@/src/components/courses/contents/[courseId]/ContentProvider' +import { ContentRenderer } from '@/src/components/courses/contents/[courseId]/ContentRenderer' +import { ContentPageBreadcrumbs } from '@/src/components/courses/contents/[courseId]/ContentsPageBreadcrumbs' +import { ContentSwitchButton } from '@/src/components/courses/contents/[courseId]/ContentSwitchButton' +import PageHeading from '@/src/components/Shared/PageHeading' +import { getScopedI18n } from '@/src/i18n/server-localization' +import _logger from '@/src/lib/log/Logger' +import getReferer from '@/src/lib/Shared/getReferer' + +const logger = _logger.createModuleLogger('/' + import.meta.url.split('/').reverse().slice(0, 2).reverse().join('/')!) + +export default async function CourseContentsPage({ params }: { params: Promise<{ courseId: string }> }) { + const t = await getScopedI18n('Courses.Contents') + const { courseId } = await params + const course = await getCourseById(courseId) + const referer = await getReferer() + + if (!course) notFound() + if (course.contents.length === 0) { + logger.info(`Course (id: ${course.id}) has no contents, redirecting user back to ${referer ?? '/courses'} page.`) + + // redirects users to where they came from when redirected by the app, or to the /courses page if user navigated manually. + redirect(referer ?? '/courses') + } + + return ( + <> + + + + +
+
+ +
+ + +
+
+ +
+

{t('Navigation.title')}

+ {course.contents.map((c) => ( + + ))} +
+
+
+ + ) +} diff --git a/src/components/courses/(hamburger-menu)/CourseActionMenu.tsx b/src/components/courses/(hamburger-menu)/CourseActionMenu.tsx index 467ae696..03fe08fa 100644 --- a/src/components/courses/(hamburger-menu)/CourseActionMenu.tsx +++ b/src/components/courses/(hamburger-menu)/CourseActionMenu.tsx @@ -29,7 +29,7 @@ import { useSession } from '@/src/lib/auth/client' import { generateToken } from '@/src/lib/Shared/generateToken' import { Course } from '@/src/schemas/CourseSchema' -export default function CourseActionMenu({ id, questions, share_key, owner_id, collaborators }: {} & Course) { +export default function CourseActionMenu({ id, questions, share_key, owner_id, collaborators, contents }: {} & Course) { const t = useScopedI18n('Components.CourseActionMenu') const [menuOpen, setMenuOpen] = useState(false) @@ -106,6 +106,18 @@ export default function CourseActionMenu({ id, questions, share_key, owner_id, c + { + router.push(`${window.location.origin}/courses/contents/${id}`) + }} + disabled={contents.length === 0}> + {t('show_course_contents.label')} + + + {t('invite_to_submenu_label')} diff --git a/src/components/courses/CourseCard.tsx b/src/components/courses/CourseCard.tsx index 31258974..bcb202a1 100644 --- a/src/components/courses/CourseCard.tsx +++ b/src/components/courses/CourseCard.tsx @@ -44,7 +44,7 @@ export function CourseCard(course: Course) { {course.description}
- + } /> - q.points).reduce((prev, current) => (prev += current), 0)} /> +