From 724e7aa642404b963568b47ac3ba36483eea0c0b Mon Sep 17 00:00:00 2001 From: austinkelsay Date: Wed, 14 May 2025 12:29:13 -0500 Subject: [PATCH] start/continue lesson button on course overview --- .../content/courses/details/CourseDetails.js | 8 ++- .../courses/details/DesktopCourseDetails.js | 72 ++++++++++++++++--- .../courses/details/MobileCourseDetails.js | 53 +++++++++++++- .../content/courses/lessons/DocumentLesson.js | 20 +++--- .../content/courses/tabs/CourseOverview.js | 10 ++- src/pages/course/[slug]/index.js | 8 +++ 6 files changed, 148 insertions(+), 23 deletions(-) diff --git a/src/components/content/courses/details/CourseDetails.js b/src/components/content/courses/details/CourseDetails.js index 53ef5e6..f586592 100644 --- a/src/components/content/courses/details/CourseDetails.js +++ b/src/components/content/courses/details/CourseDetails.js @@ -31,6 +31,9 @@ export default function CourseDetails({ handlePaymentError, isMobileView, showCompletedTag = true, + completedLessons, + onLessonSelect, + toggleToContentTab }) { const [zapAmount, setZapAmount] = useState(0); const [author, setAuthor] = useState(null); @@ -213,7 +216,10 @@ export default function CourseDetails({ returnImageProxy, renderPaymentMessage, isCompleted, - showCompletedTag + showCompletedTag, + completedLessons, + onLessonSelect, + toggleToContentTab }; return ( diff --git a/src/components/content/courses/details/DesktopCourseDetails.js b/src/components/content/courses/details/DesktopCourseDetails.js index d01e5f9..7ad619e 100644 --- a/src/components/content/courses/details/DesktopCourseDetails.js +++ b/src/components/content/courses/details/DesktopCourseDetails.js @@ -4,6 +4,7 @@ import { Tag } from 'primereact/tag'; import ZapDisplay from '@/components/zaps/ZapDisplay'; import MoreOptionsMenu from '@/components/ui/MoreOptionsMenu'; import { Divider } from 'primereact/divider'; +import GenericButton from '@/components/buttons/GenericButton'; export default function DesktopCourseDetails({ processedEvent, @@ -17,9 +18,46 @@ export default function DesktopCourseDetails({ returnImageProxy, renderPaymentMessage, isCompleted, - showCompletedTag + showCompletedTag, + completedLessons, + onLessonSelect, + toggleToContentTab }) { + // Calculate next lesson to start/continue + const getNextLessonIndex = () => { + if (!lessons || lessons.length === 0) return 0; + + // If no completed lessons, start with the first one + if (completedLessons.length === 0) return 0; + + // Find the highest completed lesson index + const lessonIndices = lessons.map((lesson, index) => { + return { id: lesson.id, index }; + }); + + // Get indices of completed lessons + const completedIndices = lessonIndices + .filter(item => completedLessons.includes(item.id)) + .map(item => item.index); + + // Get the max completed index + const maxCompletedIndex = Math.max(...completedIndices); + + // Return the next lesson index (or the last one if all completed) + return Math.min(maxCompletedIndex + 1, lessons.length - 1); + }; + + const nextLessonIndex = getNextLessonIndex(); + const buttonLabel = completedLessons.length === 0 + ? "Start Lesson 1" + : `Continue to Lesson ${nextLessonIndex + 1}`; + + const handleContinueClick = () => { + onLessonSelect(nextLessonIndex); + toggleToContentTab(); + }; + return ( <> {/* Header with course image, title and options */} @@ -33,7 +71,7 @@ export default function DesktopCourseDetails({ className="object-cover" /> - + {/* Title and options */}
@@ -56,7 +94,7 @@ export default function DesktopCourseDetails({ />
- + {/* Topics/tags */}
{processedEvent.topics && @@ -65,7 +103,7 @@ export default function DesktopCourseDetails({ ))}
- + {/* Author info */}
- + - + {/* Course details */}
{/* Left column: Description */} @@ -99,19 +137,19 @@ export default function DesktopCourseDetails({

About This Course

{processedEvent?.description?.split('\n') - .map((line, index) =>

{line}

)} + .map((line, index) =>

{line}

)}
- + {/* Payment section */}
{renderPaymentMessage()}
- + {/* Right column: Course details */}

Course Information

- +

Course Content

@@ -128,7 +166,7 @@ export default function DesktopCourseDetails({ )}
- + {processedEvent.published && (

Details

@@ -141,6 +179,18 @@ export default function DesktopCourseDetails({
)}
+ {/* Continue/Start button */} + {lessons && lessons.length > 0 && !isCompleted && ( +
+ +
+ )} diff --git a/src/components/content/courses/details/MobileCourseDetails.js b/src/components/content/courses/details/MobileCourseDetails.js index ec53934..463c8f1 100644 --- a/src/components/content/courses/details/MobileCourseDetails.js +++ b/src/components/content/courses/details/MobileCourseDetails.js @@ -4,6 +4,7 @@ import { Tag } from 'primereact/tag'; import ZapDisplay from '@/components/zaps/ZapDisplay'; import MoreOptionsMenu from '@/components/ui/MoreOptionsMenu'; import { Divider } from 'primereact/divider'; +import GenericButton from '@/components/buttons/GenericButton'; export default function MobileCourseDetails({ processedEvent, @@ -17,8 +18,45 @@ export default function MobileCourseDetails({ returnImageProxy, renderPaymentMessage, isCompleted, - showCompletedTag + showCompletedTag, + completedLessons, + onLessonSelect, + toggleToContentTab }) { + // Calculate next lesson to start/continue + const getNextLessonIndex = () => { + if (!lessons || lessons.length === 0) return 0; + + // If no completed lessons, start with the first one + if (completedLessons.length === 0) return 0; + + // Find the highest completed lesson index + const lessonIndices = lessons.map((lesson, index) => { + return { id: lesson.id, index }; + }); + + // Get indices of completed lessons + const completedIndices = lessonIndices + .filter(item => completedLessons.includes(item.id)) + .map(item => item.index); + + // Get the max completed index + const maxCompletedIndex = Math.max(...completedIndices); + + // Return the next lesson index (or the last one if all completed) + return Math.min(maxCompletedIndex + 1, lessons.length - 1); + }; + + const nextLessonIndex = getNextLessonIndex(); + const buttonLabel = completedLessons.length === 0 + ? "Start Lesson 1" + : `Continue to Lesson ${nextLessonIndex + 1}`; + + const handleContinueClick = () => { + onLessonSelect(nextLessonIndex); + toggleToContentTab(); + }; + return ( <> {/* Mobile-specific layout */} @@ -128,6 +166,19 @@ export default function MobileCourseDetails({ )} + + {/* Continue/Start button */} + {lessons && lessons.length > 0 && !isCompleted && ( +
+ +
+ )} diff --git a/src/components/content/courses/lessons/DocumentLesson.js b/src/components/content/courses/lessons/DocumentLesson.js index d13cb49..813e0b3 100644 --- a/src/components/content/courses/lessons/DocumentLesson.js +++ b/src/components/content/courses/lessons/DocumentLesson.js @@ -120,7 +120,7 @@ const DocumentLesson = ({ lesson, course, decryptionPerformed, isPaid, setComple ); } - + if (isPaid && !decryptionPerformed) { return (
@@ -133,7 +133,7 @@ const DocumentLesson = ({ lesson, course, decryptionPerformed, isPaid, setComple
); } - + return ; }; @@ -141,13 +141,15 @@ const DocumentLesson = ({ lesson, course, decryptionPerformed, isPaid, setComple
- lesson background image -
+
+ lesson background image +
+
diff --git a/src/components/content/courses/tabs/CourseOverview.js b/src/components/content/courses/tabs/CourseOverview.js index 20d0408..a3e5920 100644 --- a/src/components/content/courses/tabs/CourseOverview.js +++ b/src/components/content/courses/tabs/CourseOverview.js @@ -1,6 +1,7 @@ import React from 'react'; import { Tag } from 'primereact/tag'; import CourseDetails from '../details/CourseDetails'; +import GenericButton from '@/components/buttons/GenericButton'; /** * Component to display course overview with details @@ -13,12 +14,15 @@ const CourseOverview = ({ handlePaymentSuccess, handlePaymentError, isMobileView, - completedLessons + completedLessons, + onLessonSelect, + toggleToContentTab }) => { // Determine if course is completed const isCompleted = lessons && lessons.length > 0 && completedLessons.length === lessons.length; return ( + <>
{isMobileView && course && (
@@ -50,8 +54,12 @@ const CourseOverview = ({ handlePaymentError={handlePaymentError} isMobileView={isMobileView} showCompletedTag={!isMobileView} + completedLessons={completedLessons} + onLessonSelect={onLessonSelect} + toggleToContentTab={toggleToContentTab} />
+ ); }; diff --git a/src/pages/course/[slug]/index.js b/src/pages/course/[slug]/index.js index 36b4229..090c0c3 100644 --- a/src/pages/course/[slug]/index.js +++ b/src/pages/course/[slug]/index.js @@ -242,6 +242,14 @@ const Course = () => { handlePaymentError={handlePaymentError} isMobileView={isMobileView} completedLessons={completedLessons} + onLessonSelect={(index) => { + handleLessonSelect(index); + // Update URL with active parameter + const url = new URL(window.location.href); + url.searchParams.set('active', index); + router.push(url, undefined, { shallow: true }); + }} + toggleToContentTab={() => toggleTab(1)} // Assuming content tab is at index 1 />