From 0b2c4d3ad1b2286969d7ed9bcb6a703a3fa8dff2 Mon Sep 17 00:00:00 2001 From: swve Date: Mon, 28 Apr 2025 21:12:53 +0200 Subject: [PATCH] feat: activity page changes --- .../activity/[activityid]/activity.tsx | 169 ++++++++++++++---- .../Activity/FixedActivitySecondaryBar.tsx | 6 +- apps/web/hooks/useContributorStatus.ts | 12 +- 3 files changed, 144 insertions(+), 43 deletions(-) diff --git a/apps/web/app/orgs/[orgslug]/(withmenu)/course/[courseuuid]/activity/[activityid]/activity.tsx b/apps/web/app/orgs/[orgslug]/(withmenu)/course/[courseuuid]/activity/[activityid]/activity.tsx index 885d4ab4..6c3e6a3b 100644 --- a/apps/web/app/orgs/[orgslug]/(withmenu)/course/[courseuuid]/activity/[activityid]/activity.tsx +++ b/apps/web/app/orgs/[orgslug]/(withmenu)/course/[courseuuid]/activity/[activityid]/activity.tsx @@ -3,7 +3,7 @@ import Link from 'next/link' import { getAPIUrl, getUriWithOrg } from '@services/config/config' import Canva from '@components/Objects/Activities/DynamicCanva/DynamicCanva' import VideoActivity from '@components/Objects/Activities/Video/Video' -import { BookOpenCheck, Check, CheckCircle, ChevronDown, ChevronLeft, ChevronRight, FileText, Folder, List, Menu, MoreVertical, UserRoundPen, Video, Layers, ListFilter, ListTree, X, Edit2 } from 'lucide-react' +import { BookOpenCheck, Check, CheckCircle, ChevronDown, ChevronLeft, ChevronRight, FileText, Folder, List, Menu, MoreVertical, UserRoundPen, Video, Layers, ListFilter, ListTree, X, Edit2, EllipsisVertical } from 'lucide-react' import { markActivityAsComplete, unmarkActivityAsComplete } from '@services/courses/activity' import DocumentPdfActivity from '@components/Objects/Activities/DocumentPdf/DocumentPdf' import ActivityIndicators from '@components/Pages/Courses/ActivityIndicators' @@ -42,6 +42,43 @@ interface ActivityClientProps { course: any } +function ActivityActions({ activity, activityid, course, orgslug, assignment }: { activity: any, activityid: string, course: any, orgslug: string, assignment: any }) { + const session = useLHSession() as any; + const { contributorStatus } = useContributorStatus(course.course_uuid); + + return ( +
+ {activity && activity.published == true && activity.content.paid_access != false && ( + + {activity.activity_type != 'TYPE_ASSIGNMENT' && ( + <> + + + )} + {activity.activity_type == 'TYPE_ASSIGNMENT' && ( + <> + + + + + )} + + )} +
+ ); +} + function ActivityClient(props: ActivityClientProps) { const activityid = props.activityid const courseuuid = props.courseuuid @@ -131,6 +168,24 @@ function ActivityClient(props: ActivityClientProps) { + {activity && activity.published == true && activity.content.paid_access != false && ( + + { ( +
+ + +
+ )} +
+ )} -
-
+
+
-
+
{activity && activity.published == true && activity.content.paid_access != false && ( {activity.activity_type != 'TYPE_ASSIGNMENT' && ( @@ -168,30 +223,9 @@ function ActivityClient(props: ActivityClientProps) { className="bg-emerald-600 rounded-full px-5 drop-shadow-md flex items-center space-x-2 p-2.5 text-white hover:cursor-pointer transition delay-150 duration-300 ease-in-out" > - Contribute to Activity + Contribute )} - - - - )} - {activity.activity_type == 'TYPE_ASSIGNMENT' && ( - <> - - - - )} @@ -249,7 +283,19 @@ function ActivityClient(props: ActivityClientProps) { )} )} - + + {/* Activity Actions below the content box */} + {activity && activity.published == true && activity.content.paid_access != false && ( +
+ +
+ )} {/* Fixed Activity Secondary Bar */} {activity && activity.published == true && activity.content.paid_access != false && ( @@ -483,15 +529,66 @@ function NextActivityButton({ course, currentActivityId, orgslug }: { course: an }; return ( - -
- {!isMobile && Next} - -
-
+
+ Next + + {nextActivity.name} + +
+ ); +} + +function PreviousActivityButton({ course, currentActivityId, orgslug }: { course: any, currentActivityId: string, orgslug: string }) { + const router = useRouter(); + const isMobile = useMediaQuery('(max-width: 768px)'); + + const findPreviousActivity = () => { + let allActivities: any[] = []; + let currentIndex = -1; + + // Flatten all activities from all chapters + course.chapters.forEach((chapter: any) => { + chapter.activities.forEach((activity: any) => { + const cleanActivityUuid = activity.activity_uuid?.replace('activity_', ''); + allActivities.push({ + ...activity, + cleanUuid: cleanActivityUuid, + chapterName: chapter.name + }); + + // Check if this is the current activity + if (activity.id === currentActivityId) { + currentIndex = allActivities.length - 1; + } + }); + }); + + // Get previous activity + return currentIndex > 0 ? allActivities[currentIndex - 1] : null; + }; + + const previousActivity = findPreviousActivity(); + + if (!previousActivity) return null; + + const navigateToActivity = () => { + const cleanCourseUuid = course.course_uuid?.replace('course_', ''); + router.push(getUriWithOrg(orgslug, '') + `/course/${cleanCourseUuid}/activity/${previousActivity.cleanUuid}`); + }; + + return ( +
+ + Previous + + {previousActivity.name} +
); } diff --git a/apps/web/components/Pages/Activity/FixedActivitySecondaryBar.tsx b/apps/web/components/Pages/Activity/FixedActivitySecondaryBar.tsx index 41679d4e..ae86377a 100644 --- a/apps/web/components/Pages/Activity/FixedActivitySecondaryBar.tsx +++ b/apps/web/components/Pages/Activity/FixedActivitySecondaryBar.tsx @@ -160,11 +160,7 @@ export default function FixedActivitySecondaryBar(props: FixedActivitySecondaryB