diff --git a/src/components/content/courses/CourseDetails.js b/src/components/content/courses/CourseDetails.js index 4c68642..e62fa20 100644 --- a/src/components/content/courses/CourseDetails.js +++ b/src/components/content/courses/CourseDetails.js @@ -1,11 +1,8 @@ import React, { useEffect, useState, useCallback, useRef } from 'react'; import axios from 'axios'; import { useToast } from '@/hooks/useToast'; -import { Tag } from 'primereact/tag'; -import Image from 'next/image'; import { useRouter } from 'next/router'; import CoursePaymentButton from '@/components/bitcoinConnect/CoursePaymentButton'; -import ZapDisplay from '@/components/zaps/ZapDisplay'; import GenericButton from '@/components/buttons/GenericButton'; import { nip19 } from 'nostr-tools'; import { useImageProxy } from '@/hooks/useImageProxy'; @@ -20,8 +17,10 @@ import useTrackCourse from '@/hooks/tracking/useTrackCourse'; import WelcomeModal from '@/components/onboarding/WelcomeModal'; import { ProgressSpinner } from 'primereact/progressspinner'; import { Toast } from 'primereact/toast'; -import MoreOptionsMenu from '@/components/ui/MoreOptionsMenu'; -import { Divider } from 'primereact/divider'; + +// Import the desktop and mobile components +import DesktopCourseDetails from './DesktopCourseDetails'; +import MobileCourseDetails from './MobileCourseDetails'; export default function CourseDetails({ processedEvent, @@ -201,190 +200,33 @@ export default function CourseDetails({ ); } + // Shared props for both mobile and desktop components + const detailsProps = { + processedEvent, + paidCourse, + lessons, + decryptionPerformed, + author, + zapAmount, + zapsLoading, + menuItems, + returnImageProxy, + renderPaymentMessage, + isCompleted, + showCompletedTag + }; + return (
- {/* Header with course image, title and options */} - {!isPhone && ( -
- {/* Course image */} -
- course image -
- - {/* Title and options */} -
-
-
- {isCompleted && showCompletedTag && ( - - )} -

{processedEvent.name}

-
-
- - -
-
- - {/* Topics/tags */} -
- {processedEvent.topics && - processedEvent.topics.length > 0 && - processedEvent.topics.map((topic, index) => ( - - ))} -
- - {/* Author info */} - -
-
+ {isPhone ? ( + + ) : ( + )} - - {/* Mobile-specific layout */} - {isPhone && ( -
- {/* Completed tag is now moved to the parent component */} - - {/* Mobile topics/tags right below image (image is in parent component) */} -
- {processedEvent.topics && - processedEvent.topics.length > 0 && - processedEvent.topics.map((topic, index) => ( - - ))} -
- - {/* Title and zaps in same row */} -
-

{processedEvent.name}

- -
- - {/* Author info and more options in bottom row */} - -
- )} - - - - {/* Course details */} -
- {/* Left column: Description */} -
-

About This Course

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

{line}

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

Course Information

- -
-
-

Course Content

-
-
-

Lessons

-

{lessons.length}

-
- {paidCourse && ( -
-

Price

-

{processedEvent.price} sats

-
- )} -
-
- - {processedEvent.published && ( -
-

Details

-
-

Published

-

- {new Date(processedEvent.published * 1000).toLocaleDateString()} -

-
-
- )} -
-
-
); diff --git a/src/components/content/courses/CourseSidebar.js b/src/components/content/courses/CourseSidebar.js index 7ba936f..3dcf2d0 100644 --- a/src/components/content/courses/CourseSidebar.js +++ b/src/components/content/courses/CourseSidebar.js @@ -109,7 +109,7 @@ const CourseSidebar = ({ // Mobile content tab const MobileLessonsTab = () => ( -
+

Course Lessons

@@ -138,7 +138,7 @@ const CourseSidebar = ({ visible ? 'w-80 opacity-100' : 'w-0 opacity-0 overflow-hidden' }`} > -
{/* Adjusted to match new header spacing */}
diff --git a/src/components/content/courses/DesktopCourseDetails.js b/src/components/content/courses/DesktopCourseDetails.js new file mode 100644 index 0000000..1f854c8 --- /dev/null +++ b/src/components/content/courses/DesktopCourseDetails.js @@ -0,0 +1,151 @@ +import React from 'react'; +import Image from 'next/image'; +import { Tag } from 'primereact/tag'; +import { useRouter } from 'next/router'; +import ZapDisplay from '@/components/zaps/ZapDisplay'; +import MoreOptionsMenu from '@/components/ui/MoreOptionsMenu'; +import { Divider } from 'primereact/divider'; + +export default function DesktopCourseDetails({ + processedEvent, + paidCourse, + lessons, + decryptionPerformed, + author, + zapAmount, + zapsLoading, + menuItems, + returnImageProxy, + renderPaymentMessage, + isCompleted, + showCompletedTag +}) { + const router = useRouter(); + + return ( + <> + {/* Header with course image, title and options */} +
+ {/* Course image */} +
+ course image +
+ + {/* Title and options */} +
+
+
+ {isCompleted && showCompletedTag && ( + + )} +

{processedEvent.name}

+
+
+ + +
+
+ + {/* Topics/tags */} +
+ {processedEvent.topics && + processedEvent.topics.length > 0 && + processedEvent.topics.map((topic, index) => ( + + ))} +
+ + {/* Author info */} + +
+
+ + + + {/* Course details */} +
+ {/* Left column: Description */} +
+

About This Course

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

{line}

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

Course Information

+ +
+
+

Course Content

+
+
+

Lessons

+

{lessons.length}

+
+ {paidCourse && ( +
+

Price

+

{processedEvent.price} sats

+
+ )} +
+
+ + {processedEvent.published && ( +
+

Details

+
+

Published

+

+ {new Date(processedEvent.published * 1000).toLocaleDateString()} +

+
+
+ )} +
+
+
+ + ); +} \ No newline at end of file diff --git a/src/components/content/courses/MobileCourseDetails.js b/src/components/content/courses/MobileCourseDetails.js new file mode 100644 index 0000000..bb992e4 --- /dev/null +++ b/src/components/content/courses/MobileCourseDetails.js @@ -0,0 +1,134 @@ +import React from 'react'; +import Image from 'next/image'; +import { Tag } from 'primereact/tag'; +import { useRouter } from 'next/router'; +import ZapDisplay from '@/components/zaps/ZapDisplay'; +import MoreOptionsMenu from '@/components/ui/MoreOptionsMenu'; +import { Divider } from 'primereact/divider'; + +export default function MobileCourseDetails({ + processedEvent, + paidCourse, + lessons, + decryptionPerformed, + author, + zapAmount, + zapsLoading, + menuItems, + returnImageProxy, + renderPaymentMessage, + isCompleted, + showCompletedTag +}) { + const router = useRouter(); + + return ( + <> + {/* Mobile-specific layout */} +
+ {/* Topics/tags right below image (image is in parent component) */} +
+ {processedEvent.topics && + processedEvent.topics.length > 0 && + processedEvent.topics.map((topic, index) => ( + + ))} +
+ + {/* Title and zaps in same row */} +
+

{processedEvent.name}

+ +
+ + {/* Author info and more options in bottom row */} + +
+ + + + {/* Course details */} +
+ {/* Description */} +
+

About This Course

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

{line}

)} +
+ + {/* Payment section */} +
+ {renderPaymentMessage()} +
+
+ + {/* Course details */} +
+

Course Information

+ +
+
+

Course Content

+
+
+

Lessons

+

{lessons.length}

+
+ {paidCourse && ( +
+

Price

+

{processedEvent.price} sats

+
+ )} +
+
+ + {processedEvent.published && ( +
+

Details

+
+

Published

+

+ {new Date(processedEvent.published * 1000).toLocaleDateString()} +

+
+
+ )} +
+
+
+ + ); +} \ No newline at end of file diff --git a/src/pages/course/[slug]/index.js b/src/pages/course/[slug]/index.js index 7985220..90aa5c1 100644 --- a/src/pages/course/[slug]/index.js +++ b/src/pages/course/[slug]/index.js @@ -523,29 +523,22 @@ const Course = () => { {/* Content tab content */}
{uniqueLessons.length > 0 && uniqueLessons[activeIndex] ? ( -
+
{renderLesson(uniqueLessons[activeIndex])}
) : ( -
+

Select a lesson from the sidebar to begin learning.

)} {course?.content && ( -
+
)}
- {/* Lessons tab - only visible on mobile */} -
-
-

Please use the sidebar to navigate lessons.

-
-
- {/* QA tab content */}
{renderQASection()}