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
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
/>