From 0dc0538e4246f59a16737693550b453ecd7067d9 Mon Sep 17 00:00:00 2001 From: Rajat Date: Thu, 25 Dec 2025 23:48:08 +0530 Subject: [PATCH 1/3] Themeable course viewer using shadcn components --- .../products/drip-customer-experience.png | Bin 0 -> 90198 bytes apps/docs/src/pages/en/products/section.md | 6 + .../course-old/[slug]/[id]/[lesson]/page.tsx | 36 ++ .../course-old/[slug]/[id]/helpers.ts | 120 +++++ .../[slug]/[id]/layout-with-sidebar.tsx | 160 +++++++ .../course-old/[slug]/[id]/layout.tsx | 64 +++ .../course-old/[slug]/[id]/page.tsx | 156 +++++++ .../[slug]/[id]/layout-with-sidebar.tsx | 434 +++++++++++++++--- .../course/[slug]/[id]/page.tsx | 23 +- .../components/admin/dashboard-content.tsx | 5 +- .../admin/dashboard-skeleton/app-sidebar.tsx | 5 +- .../components/admin/next-theme-switcher.tsx | 37 ++ .../components/admin/page-editor/index.tsx | 2 +- .../admin/page-editor/next-theme-switcher.tsx | 22 - apps/web/components/notifications-viewer.tsx | 7 +- .../components/public/lesson-viewer/index.tsx | 70 +-- .../public/lesson-viewer/quiz-viewer.tsx | 11 +- apps/web/ui-config/strings.ts | 1 + 18 files changed, 1029 insertions(+), 130 deletions(-) create mode 100644 apps/docs/public/assets/products/drip-customer-experience.png create mode 100644 apps/web/app/(with-contexts)/course-old/[slug]/[id]/[lesson]/page.tsx create mode 100644 apps/web/app/(with-contexts)/course-old/[slug]/[id]/helpers.ts create mode 100644 apps/web/app/(with-contexts)/course-old/[slug]/[id]/layout-with-sidebar.tsx create mode 100644 apps/web/app/(with-contexts)/course-old/[slug]/[id]/layout.tsx create mode 100644 apps/web/app/(with-contexts)/course-old/[slug]/[id]/page.tsx create mode 100644 apps/web/components/admin/next-theme-switcher.tsx delete mode 100644 apps/web/components/admin/page-editor/next-theme-switcher.tsx diff --git a/apps/docs/public/assets/products/drip-customer-experience.png b/apps/docs/public/assets/products/drip-customer-experience.png new file mode 100644 index 0000000000000000000000000000000000000000..454101de51518f6c7ef13e097e77704eac1bfce8 GIT binary patch literal 90198 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

-YxZ?S`w|*CAykh^=i( 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 +}) { + const params = use(props.params); + const { slug, id, lesson } = params; + const { profile, setProfile } = useContext(ProfileContext); + const address = useContext(AddressContext); + + if (!lesson) { + redirect(`/course-old/${slug}/${id}`); + } + + return ( + + ); +} diff --git a/apps/web/app/(with-contexts)/course-old/[slug]/[id]/helpers.ts b/apps/web/app/(with-contexts)/course-old/[slug]/[id]/helpers.ts new file mode 100644 index 000000000..ea139709d --- /dev/null +++ b/apps/web/app/(with-contexts)/course-old/[slug]/[id]/helpers.ts @@ -0,0 +1,120 @@ +import { sortCourseGroups } from "@ui-lib/utils"; +import { Course, Group, Lesson } from "@courselit/common-models"; +import { FetchBuilder } from "@courselit/utils"; + +export type CourseFrontend = CourseWithoutGroups & { + groups: GroupWithLessons[]; + firstLesson: string; +}; + +export type GroupWithLessons = Group & { lessons: Lesson[] }; +type CourseWithoutGroups = Pick< + Course, + | "title" + | "description" + | "featuredImage" + | "updatedAt" + | "creatorId" + | "slug" + | "cost" + | "courseId" + | "tags" + | "paymentPlans" + | "defaultPaymentPlan" +>; + +export const getProduct = async ( + id: string, + address: string, +): Promise => { + const fetch = new FetchBuilder() + .setUrl(`${address}/api/graph`) + .setIsGraphQLEndpoint(true) + .setPayload({ + query: ` + query ($id: String!) { + product: getCourse(id: $id) { + title, + description, + featuredImage { + file, + caption + }, + updatedAt, + creatorId, + slug, + cost, + courseId, + groups { + id, + name, + rank, + lessonsOrder, + drip { + status, + type, + delayInMillis, + dateInUTC + } + }, + lessons { + lessonId, + title, + requiresEnrollment, + courseId, + groupId, + }, + tags, + firstLesson + paymentPlans { + planId + name + type + oneTimeAmount + emiAmount + emiTotalInstallments + subscriptionMonthlyAmount + subscriptionYearlyAmount + } + leadMagnet + defaultPaymentPlan + } + } + `, + variables: { id }, + }) + .setIsGraphQLEndpoint(true) + .build(); + const response = await fetch.exec(); + return formatCourse(response.product); +}; + +export function formatCourse( + post: Course & { lessons: Lesson[]; firstLesson: string; groups: Group[] }, +): CourseFrontend { + for (const group of sortCourseGroups(post as Course)) { + (group as GroupWithLessons).lessons = post.lessons + .filter((lesson: Lesson) => lesson.groupId === group.id) + .sort( + (a: any, b: any) => + group.lessonsOrder?.indexOf(a.lessonId) - + group.lessonsOrder?.indexOf(b.lessonId), + ); + } + + return { + title: post.title, + description: post.description, + featuredImage: post.featuredImage, + updatedAt: post.updatedAt, + creatorId: post.creatorId, + slug: post.slug, + cost: post.cost, + courseId: post.courseId, + groups: post.groups as GroupWithLessons[], + tags: post.tags, + firstLesson: post.firstLesson, + paymentPlans: post.paymentPlans, + defaultPaymentPlan: post.defaultPaymentPlan, + }; +} diff --git a/apps/web/app/(with-contexts)/course-old/[slug]/[id]/layout-with-sidebar.tsx b/apps/web/app/(with-contexts)/course-old/[slug]/[id]/layout-with-sidebar.tsx new file mode 100644 index 000000000..20a9cafb5 --- /dev/null +++ b/apps/web/app/(with-contexts)/course-old/[slug]/[id]/layout-with-sidebar.tsx @@ -0,0 +1,160 @@ +"use client"; + +import { useContext } from "react"; +import { + formattedLocaleDate, + isEnrolled, + isLessonCompleted, +} from "@ui-lib/utils"; +import { CheckCircled, Circle, Lock } from "@courselit/icons"; +import { SIDEBAR_TEXT_COURSE_ABOUT } from "@ui-config/strings"; +import { Profile, Constants } from "@courselit/common-models"; +import { + ComponentScaffoldMenuItem, + ComponentScaffold, + Divider, +} from "@components/public/scaffold"; +import { ProfileContext, SiteInfoContext } from "@components/contexts"; +import { CourseFrontend, GroupWithLessons } from "./helpers"; + +export default function ProductPage({ + product, + children, +}: { + product: CourseFrontend; + children: React.ReactNode; +}) { + const { profile } = useContext(ProfileContext); + const siteInfo = useContext(SiteInfoContext); + + if (!profile) { + return null; + } + + return ( + + {children} + + ); +} + +export function generateSideBarItems( + course: CourseFrontend, + profile: Profile, +): (ComponentScaffoldMenuItem | Divider)[] { + if (!course) return []; + + const items: (ComponentScaffoldMenuItem | Divider)[] = [ + { + label: SIDEBAR_TEXT_COURSE_ABOUT, + href: `/course/${course.slug}/${course.courseId}`, + }, + ]; + + let lastGroupDripDateInMillis = Date.now(); + + for (const group of course.groups) { + let availableLabel = ""; + if (group.drip && group.drip.status) { + if ( + group.drip.type === + Constants.dripType[0].split("-")[0].toUpperCase() + ) { + const delayInMillis = + (group?.drip?.delayInMillis ?? 0) + + lastGroupDripDateInMillis; + const daysUntilAvailable = Math.ceil( + (delayInMillis - Date.now()) / 86400000, + ); + availableLabel = + daysUntilAvailable && + !isGroupAccessibleToUser(course, profile as Profile, group) + ? isEnrolled(course.courseId, profile) + ? `Available in ${daysUntilAvailable} days` + : `Available ${daysUntilAvailable} days after enrollment` + : ""; + } else { + const today = new Date(); + const dripDate = new Date(group?.drip?.dateInUTC ?? ""); + const timeDiff = dripDate.getTime() - today.getTime(); + const daysDiff = Math.ceil(timeDiff / (1000 * 3600 * 24)); + + availableLabel = + daysDiff > 0 && + !isGroupAccessibleToUser(course, profile, group) + ? `Available on ${formattedLocaleDate(dripDate)}` + : ""; + } + } + + // Update lastGroupDripDateInMillis for relative drip types + if ( + group.drip && + group.drip.status && + group.drip.type === + Constants.dripType[0].split("-")[0].toUpperCase() + ) { + lastGroupDripDateInMillis += group?.drip?.delayInMillis ?? 0; + } + + items.push({ + badge: availableLabel, + label: group.name, + }); + + for (const lesson of group.lessons) { + items.push({ + label: lesson.title, + href: `/course/${course.slug}/${course.courseId}/${lesson.lessonId}`, + icon: + profile && profile.userId ? ( + isEnrolled(course.courseId, profile) ? ( + isLessonCompleted({ + courseId: course.courseId, + lessonId: lesson.lessonId, + profile, + }) ? ( + + ) : ( + + ) + ) : lesson.requiresEnrollment ? ( + + ) : undefined + ) : lesson.requiresEnrollment ? ( + + ) : undefined, + iconPlacementRight: true, + }); + } + } + + return items; +} + +export function isGroupAccessibleToUser( + course: CourseFrontend, + profile: Profile, + group: GroupWithLessons, +): boolean { + if (!group.drip || !group.drip.status) return true; + + if (!Array.isArray(profile.purchases)) return false; + + for (const purchase of profile.purchases) { + if (purchase.courseId === course.courseId) { + if (Array.isArray(purchase.accessibleGroups)) { + if (purchase.accessibleGroups.includes(group.id)) { + return true; + } + } + } + } + + return false; +} diff --git a/apps/web/app/(with-contexts)/course-old/[slug]/[id]/layout.tsx b/apps/web/app/(with-contexts)/course-old/[slug]/[id]/layout.tsx new file mode 100644 index 000000000..e5bc545ea --- /dev/null +++ b/apps/web/app/(with-contexts)/course-old/[slug]/[id]/layout.tsx @@ -0,0 +1,64 @@ +import { Metadata, ResolvingMetadata } from "next"; +import { getFullSiteSetup } from "@ui-lib/utils"; +import { headers } from "next/headers"; +import { FetchBuilder } from "@courselit/utils"; +import { notFound } from "next/navigation"; +import LayoutWithSidebar from "./layout-with-sidebar"; +import { getProduct } from "./helpers"; +import { getAddressFromHeaders } from "@/app/actions"; + +export async function generateMetadata( + props: { params: Promise<{ slug: string; id: string }> }, + parent: ResolvingMetadata, +): Promise { + const params = await props.params; + const address = await getAddressFromHeaders(headers); + const siteInfo = await getFullSiteSetup(address); + + if (!siteInfo) { + return { + title: `${(await parent)?.title?.absolute}`, + }; + } + + try { + const query = ` + query ($id: String!) { + course: getCourse(id: $id) { + title + } + } + `; + const fetch = new FetchBuilder() + .setUrl(`${address}/api/graph`) + .setPayload({ + query, + variables: { id: params.id }, + }) + .setIsGraphQLEndpoint(true) + .build(); + const response = await fetch.exec(); + const course = response.course; + + return { + title: `${course?.title} | ${(await parent)?.title?.absolute}`, + }; + } catch (error) { + notFound(); + } +} + +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ slug: string; id: string }>; +}) { + const params = await props.params; + + const { children } = props; + + const { id } = params; + const address = await getAddressFromHeaders(headers); + const product = await getProduct(id, address); + + return {children}; +} diff --git a/apps/web/app/(with-contexts)/course-old/[slug]/[id]/page.tsx b/apps/web/app/(with-contexts)/course-old/[slug]/[id]/page.tsx new file mode 100644 index 000000000..2bf9aa0b5 --- /dev/null +++ b/apps/web/app/(with-contexts)/course-old/[slug]/[id]/page.tsx @@ -0,0 +1,156 @@ +"use client"; + +import { useContext, useEffect, useState, use } from "react"; +import { isEnrolled } from "@ui-lib/utils"; +import { ArrowRight } from "@courselit/icons"; +import { + COURSE_PROGRESS_START, + ENROLL_BUTTON_TEXT, + BTN_VIEW_CERTIFICATE, +} from "@ui-config/strings"; +import { checkPermission } from "@courselit/utils"; +import { Profile, UIConstants } from "@courselit/common-models"; +import { + Link, + Button2, + getSymbolFromCurrency, + Image, +} from "@courselit/components-library"; +import { TextRenderer } from "@courselit/page-blocks"; +import { TableOfContent } from "@components/table-of-content"; +import { + AddressContext, + ProfileContext, + SiteInfoContext, + ThemeContext, +} from "@components/contexts"; +import { getProduct } from "./helpers"; +import { getUserProfile } from "@/app/(with-contexts)/helpers"; +import { BadgeCheck } from "lucide-react"; +import { emptyDoc as TextEditorEmptyDoc } from "@courselit/text-editor"; +import WidgetErrorBoundary from "@components/public/base-layout/template/widget-error-boundary"; +const { permissions } = UIConstants; + +export default function ProductPage(props: { + params: Promise<{ slug: string; id: string }>; +}) { + const params = use(props.params); + const { id } = params; + const [product, setProduct] = useState(null); + const { profile, setProfile } = useContext(ProfileContext); + const siteInfo = useContext(SiteInfoContext); + const address = useContext(AddressContext); + const [progress, setProgress] = useState(null); + const { theme } = useContext(ThemeContext); + + useEffect(() => { + if (id) { + getProduct(id, address.backend).then((product) => { + setProduct(product); + }); + } + }, [id]); + + useEffect(() => { + if (product) { + getUserProfile(address.backend).then((profile) => { + setProfile(profile); + setProgress( + profile.purchases?.find( + (purchase) => purchase.courseId === product.courseId, + ), + ); + }); + } + }, [product]); + + if (!profile) { + return null; + } + + if (!product || !siteInfo) { + return null; + } + + const descriptionJson = product.description + ? JSON.parse(product.description) + : TextEditorEmptyDoc; + + return ( +

+

{product.title}

+ {progress?.certificateId && ( + + + {" "} + {BTN_VIEW_CERTIFICATE} + + + )} + {!isEnrolled(product.courseId, profile as Profile) && + checkPermission(profile.permissions ?? [], [ + permissions.enrollInCourse, + ]) && ( +
+
+
+ {getSymbolFromCurrency( + siteInfo.currencyISOCode ?? "", + )} + {product.cost} + + {product.costType ?? ""} + +
+ + {ENROLL_BUTTON_TEXT} + +
+
+ )} + {product.featuredImage && ( +
+
+ {product.featuredImage.caption} +
+
+ )} +
+
+ + + + +
+
+ {isEnrolled(product.courseId, profile as Profile) && ( +
+ + + {COURSE_PROGRESS_START} + + + +
+ )} +
+ ); +} diff --git a/apps/web/app/(with-contexts)/course/[slug]/[id]/layout-with-sidebar.tsx b/apps/web/app/(with-contexts)/course/[slug]/[id]/layout-with-sidebar.tsx index b0857e286..40bcd8aff 100644 --- a/apps/web/app/(with-contexts)/course/[slug]/[id]/layout-with-sidebar.tsx +++ b/apps/web/app/(with-contexts)/course/[slug]/[id]/layout-with-sidebar.tsx @@ -1,17 +1,57 @@ "use client"; -import { useContext } from "react"; -import { isEnrolled, isLessonCompleted } from "@ui-lib/utils"; +import { ReactNode, useContext } from "react"; +import { + formattedLocaleDate, + isEnrolled, + isLessonCompleted, +} from "@ui-lib/utils"; import { CheckCircled, Circle, Lock } from "@courselit/icons"; -import { SIDEBAR_TEXT_COURSE_ABOUT } from "@ui-config/strings"; +import { + BTN_EXIT_COURSE_TOOLTIP, + SIDEBAR_TEXT_COURSE_ABOUT, +} from "@ui-config/strings"; import { Profile, Constants } from "@courselit/common-models"; import { - ComponentScaffoldMenuItem, - ComponentScaffold, - Divider, -} from "@components/public/scaffold"; -import { ProfileContext, SiteInfoContext } from "@components/contexts"; + ProfileContext, + SiteInfoContext, + ThemeContext, +} from "@components/contexts"; import { CourseFrontend, GroupWithLessons } from "./helpers"; +import { + Sidebar, + SidebarContent, + SidebarGroup, + SidebarGroupContent, + SidebarGroupLabel, + SidebarHeader, + SidebarInset, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + SidebarProvider, + SidebarTrigger, +} from "@components/ui/sidebar"; +import { Image } from "@courselit/components-library"; +import Link from "next/link"; +import { truncate } from "@courselit/utils"; +import { Button } from "@components/ui/button"; +import { ChevronRight, Clock, LogOutIcon } from "lucide-react"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@components/ui/tooltip"; +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from "@components/ui/collapsible"; +import { usePathname } from "next/navigation"; +import { Caption } from "@courselit/page-primitives"; +import { useTheme } from "next-themes"; +import NextThemeSwitcher from "@components/admin/next-theme-switcher"; export default function ProductPage({ product, @@ -21,72 +61,282 @@ export default function ProductPage({ children: React.ReactNode; }) { const { profile } = useContext(ProfileContext); - const siteInfo = useContext(SiteInfoContext); + const { theme, setTheme } = useTheme(); if (!profile) { return null; } return ( - - {children} - + + +
+ +
+ + + + + + + {BTN_EXIT_COURSE_TOOLTIP} + + +
+
+
{children}
+
+ ); } +export function AppSidebar({ + course, + profile, + ...rest +}: { + course: CourseFrontend; + profile: Partial; +} & React.ComponentProps) { + const siteinfo = useContext(SiteInfoContext); + const pathname = usePathname(); + const sideBarItems = generateSideBarItems( + course, + profile as Profile, + pathname, + ); + const { theme } = useContext(ThemeContext); + + return ( + + + + + + +
+ logo +
+
+ {siteinfo.title} +
+ +
+
+
+
+ + {sideBarItems.map((item, index) => + item.items?.length ? ( + + + + +
+ + + + + {truncate( + item.title, + item.badge + ? 15 + : 26, + )} + + + {item.title} + + + + {item.badge?.text && ( + + + + + { + item.badge + .text + } + + + +

+ { + item.badge + .description + } +

+
+
+ )} +
+ +
+
+
+ {item.items?.length ? ( + + + + {item.items.map( + (item, index) => ( + + + + + + + + {truncate( + item.title, + 22, + )} + + + { + item.title + } + + + + + {item.icon} + + + + ), + )} + + + + ) : null} +
+
+ ) : ( + + + + + + {item.title} + + + + + + ), + )} +
+ {!siteinfo.hideCourseLitBranding && ( + +
+ Powered by{" "} + CourseLit + + + )} + + ); +} + +interface SidebarItem { + title: string; + href: string; + badge?: { + text: string; + description: string; + }; + isActive?: boolean; + items?: { + title: string; + href: string; + icon?: ReactNode; + isActive?: boolean; + }[]; +} + export function generateSideBarItems( course: CourseFrontend, profile: Profile, -): (ComponentScaffoldMenuItem | Divider)[] { + pathname: string, +): SidebarItem[] { if (!course) return []; - const items: (ComponentScaffoldMenuItem | Divider)[] = [ + const items: SidebarItem[] = [ { - label: SIDEBAR_TEXT_COURSE_ABOUT, + title: SIDEBAR_TEXT_COURSE_ABOUT, href: `/course/${course.slug}/${course.courseId}`, + isActive: pathname === `/course/${course.slug}/${course.courseId}`, }, ]; let lastGroupDripDateInMillis = Date.now(); for (const group of course.groups) { - let availableLabel = ""; - if (group.drip && group.drip.status) { - if ( - group.drip.type === - Constants.dripType[0].split("-")[0].toUpperCase() - ) { - const delayInMillis = - group?.drip?.delayInMillis ?? 0 + lastGroupDripDateInMillis; - const daysUntilAvailable = Math.ceil( - (delayInMillis - Date.now()) / 86400000, - ); - availableLabel = - daysUntilAvailable && - !isGroupAccessibleToUser(course, profile as Profile, group) - ? isEnrolled(course.courseId, profile) - ? `Available in ${daysUntilAvailable} days` - : `Available ${daysUntilAvailable} days after enrollment` - : ""; - } else { - const today = new Date(); - const dripDate = new Date(group?.drip?.dateInUTC ?? ""); - const timeDiff = dripDate.getTime() - today.getTime(); - const daysDiff = Math.ceil(timeDiff / (1000 * 3600 * 24)); - - availableLabel = - daysDiff > 0 && - !isGroupAccessibleToUser(course, profile, group) - ? `Available in ${daysDiff} days` - : ""; - } - } - // Update lastGroupDripDateInMillis for relative drip types if ( group.drip && @@ -97,15 +347,30 @@ export function generateSideBarItems( lastGroupDripDateInMillis += group?.drip?.delayInMillis ?? 0; } - items.push({ - badge: availableLabel, - label: group.name, - }); + const groupItem: SidebarItem = { + title: group.name, + href: "#", + isActive: false, + badge: getDripLabel({ + course, + group, + profile, + lastGroupDripDateInMillis, + }), + items: [], + }; for (const lesson of group.lessons) { - items.push({ - label: lesson.title, + const isActive = + pathname === + `/course/${course.slug}/${course.courseId}/${lesson.lessonId}`; + if (isActive) { + groupItem.isActive = true; + } + groupItem.items!.push({ + title: lesson.title, href: `/course/${course.slug}/${course.courseId}/${lesson.lessonId}`, + isActive, icon: profile && profile.userId ? ( isEnrolled(course.courseId, profile) ? ( @@ -124,14 +389,67 @@ export function generateSideBarItems( ) : lesson.requiresEnrollment ? ( ) : undefined, - iconPlacementRight: true, }); } + + items.push(groupItem); } return items; } +function getDripLabel({ + course, + group, + profile, + lastGroupDripDateInMillis, +}: { + course: CourseFrontend; + group: GroupWithLessons; + profile: Profile; + lastGroupDripDateInMillis: number; +}): { text: string; description: string } | undefined { + if (group.drip && group.drip.status) { + let availableLabel = ""; + let text = ""; + if ( + group.drip.type === + Constants.dripType[0].split("-")[0].toUpperCase() + ) { + const delayInMillis = + (group?.drip?.delayInMillis ?? 0) + lastGroupDripDateInMillis; + const daysUntilAvailable = Math.ceil( + (delayInMillis - Date.now()) / 86400000, + ); + availableLabel = + daysUntilAvailable && + !isGroupAccessibleToUser(course, profile as Profile, group) + ? isEnrolled(course.courseId, profile) + ? `Available in ${daysUntilAvailable} days` + : `Available ${daysUntilAvailable} days after enrollment` + : ""; + text = `${daysUntilAvailable} days`; + } else { + const today = new Date(); + const dripDate = new Date(group?.drip?.dateInUTC ?? ""); + const timeDiff = dripDate.getTime() - today.getTime(); + const daysDiff = Math.ceil(timeDiff / (1000 * 3600 * 24)); + + availableLabel = + daysDiff > 0 && !isGroupAccessibleToUser(course, profile, group) + ? `Available on ${formattedLocaleDate(dripDate)}` + : ""; + text = formattedLocaleDate(dripDate); + } + return { + text, + description: availableLabel, + }; + } + + return undefined; +} + export function isGroupAccessibleToUser( course: CourseFrontend, profile: Profile, diff --git a/apps/web/app/(with-contexts)/course/[slug]/[id]/page.tsx b/apps/web/app/(with-contexts)/course/[slug]/[id]/page.tsx index 2bf9aa0b5..76522d0d6 100644 --- a/apps/web/app/(with-contexts)/course/[slug]/[id]/page.tsx +++ b/apps/web/app/(with-contexts)/course/[slug]/[id]/page.tsx @@ -12,7 +12,6 @@ import { checkPermission } from "@courselit/utils"; import { Profile, UIConstants } from "@courselit/common-models"; import { Link, - Button2, getSymbolFromCurrency, Image, } from "@courselit/components-library"; @@ -29,6 +28,7 @@ import { getUserProfile } from "@/app/(with-contexts)/helpers"; import { BadgeCheck } from "lucide-react"; import { emptyDoc as TextEditorEmptyDoc } from "@courselit/text-editor"; import WidgetErrorBoundary from "@components/public/base-layout/template/widget-error-boundary"; +import { Button, Header1 } from "@courselit/page-primitives"; const { permissions } = UIConstants; export default function ProductPage(props: { @@ -78,16 +78,18 @@ export default function ProductPage(props: { return (
-

{product.title}

+ + {product.title} + {progress?.certificateId && ( - + )} {!isEnrolled(product.courseId, profile as Profile) && @@ -108,7 +110,9 @@ export default function ProductPage(props: { - {ENROLL_BUTTON_TEXT} +
@@ -126,7 +130,7 @@ export default function ProductPage(props: { )}
-
+
- +
)} diff --git a/apps/web/components/admin/dashboard-content.tsx b/apps/web/components/admin/dashboard-content.tsx index 18b4c76cc..b93b18c25 100644 --- a/apps/web/components/admin/dashboard-content.tsx +++ b/apps/web/components/admin/dashboard-content.tsx @@ -18,6 +18,8 @@ import { Fragment, ReactNode, useContext } from "react"; import LoadingScreen from "./loading-screen"; import PermissionError from "./permission-error"; +import NextThemeSwitcher from "./next-theme-switcher"; + export default function DashboardContent({ breadcrumbs, children, @@ -87,7 +89,8 @@ export default function DashboardContent({ )}
-
+
+
diff --git a/apps/web/components/admin/dashboard-skeleton/app-sidebar.tsx b/apps/web/components/admin/dashboard-skeleton/app-sidebar.tsx index b745faa77..3cfe17a2c 100644 --- a/apps/web/components/admin/dashboard-skeleton/app-sidebar.tsx +++ b/apps/web/components/admin/dashboard-skeleton/app-sidebar.tsx @@ -98,13 +98,12 @@ export function AppSidebar({ ...props }: ComponentProps) { -
+
logo
diff --git a/apps/web/components/admin/next-theme-switcher.tsx b/apps/web/components/admin/next-theme-switcher.tsx new file mode 100644 index 000000000..537b62f01 --- /dev/null +++ b/apps/web/components/admin/next-theme-switcher.tsx @@ -0,0 +1,37 @@ +import { Button } from "@components/ui/button"; +import { Sun, Moon } from "lucide-react"; +import { useTheme } from "next-themes"; +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from "@components/ui/tooltip"; +import { BTN_TOGGLE_THEME } from "@ui-config/strings"; + +export default function NextThemeSwitcher({ + variant = "outline", +}: { + variant?: "outline" | "ghost"; +}) { + const { theme, setTheme } = useTheme(); + const isDark = theme === "dark"; + + return ( + + + + + {BTN_TOGGLE_THEME} + + ); +} diff --git a/apps/web/components/admin/page-editor/index.tsx b/apps/web/components/admin/page-editor/index.tsx index b0aef8fc0..034d03606 100644 --- a/apps/web/components/admin/page-editor/index.tsx +++ b/apps/web/components/admin/page-editor/index.tsx @@ -51,7 +51,7 @@ import { } from "@/components/ui/select"; import { ThemeWithDraftState } from "./theme-editor/theme-with-draft-state"; import useThemes from "./use-themes"; -import NextThemeSwitcher from "./next-theme-switcher"; +import NextThemeSwitcher from "../next-theme-switcher"; import { useTheme } from "next-themes"; const EditWidget = dynamic(() => import("./edit-widget")); diff --git a/apps/web/components/admin/page-editor/next-theme-switcher.tsx b/apps/web/components/admin/page-editor/next-theme-switcher.tsx deleted file mode 100644 index eb863ec3e..000000000 --- a/apps/web/components/admin/page-editor/next-theme-switcher.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { Button } from "@components/ui/button"; -import { Sun, Moon } from "lucide-react"; -import { useTheme } from "next-themes"; - -export default function NextThemeSwitcher() { - const { theme, setTheme } = useTheme(); - const isDark = theme === "dark"; - - return ( - - ); -} diff --git a/apps/web/components/notifications-viewer.tsx b/apps/web/components/notifications-viewer.tsx index 0b9c77e92..7aea13f7c 100644 --- a/apps/web/components/notifications-viewer.tsx +++ b/apps/web/components/notifications-viewer.tsx @@ -17,7 +17,6 @@ import { TriangleAlert, } from "lucide-react"; import { formatDistanceToNow } from "date-fns"; - import { Button } from "@/components/ui/button"; import { Popover, @@ -229,11 +228,7 @@ export function NotificationsViewer() { return ( - )}
)} {lesson && !error && ( <> -
-

+
+ {lesson.title} -

+
{String.prototype.toUpperCase.call( LESSON_TYPE_VIDEO, @@ -308,6 +314,7 @@ export const LessonViewer = ({ unknown > } + theme={theme.theme} /> )} @@ -335,10 +342,13 @@ export const LessonViewer = ({ lesson.media?.file && (
- +
)} @@ -349,32 +359,38 @@ export const LessonViewer = ({
{!lesson.prevLesson && ( - - + )} {lesson.prevLesson && ( - {COURSE_PROGRESS_PREV} - + )}
- +
)}
diff --git a/apps/web/components/public/lesson-viewer/quiz-viewer.tsx b/apps/web/components/public/lesson-viewer/quiz-viewer.tsx index f0798830d..0b8fec507 100644 --- a/apps/web/components/public/lesson-viewer/quiz-viewer.tsx +++ b/apps/web/components/public/lesson-viewer/quiz-viewer.tsx @@ -4,7 +4,7 @@ import { Quiz as QuizContent, } from "@courselit/common-models"; import { FetchBuilder } from "@courselit/utils"; -import { ChangeEvent, useState } from "react"; +import { ChangeEvent, useContext, useState } from "react"; import { TOAST_TITLE_ERROR, QUIZ_VIEWER_EVALUATE_BTN, @@ -14,6 +14,8 @@ import { QUIZ_SCORE_PREFIX_MESSAGE, } from "@/ui-config/strings"; import { Form, FormSubmit, useToast } from "@courselit/components-library"; +import { Header2, Text1 } from "@courselit/page-primitives"; +import { ThemeContext } from "@components/contexts"; interface QuizViewerProps { lessonId: string; @@ -32,6 +34,7 @@ export default function QuizViewer({ ]); const [loading, setLoading] = useState(false); const { toast } = useToast(); + const { theme } = useContext(ThemeContext); const setAnswerForQuestion = ( checked: boolean, @@ -119,9 +122,9 @@ export default function QuizViewer({
{questions.map((question: Question, questionIndex: number) => (
-

+ {questionIndex + 1}. {question.text} -

+ {question.options.map((option, index: number) => (
- + {option.text}
))}
diff --git a/apps/web/ui-config/strings.ts b/apps/web/ui-config/strings.ts index 8f48119f1..cdbd0bb7a 100644 --- a/apps/web/ui-config/strings.ts +++ b/apps/web/ui-config/strings.ts @@ -72,6 +72,7 @@ export const FORM_FIELD_FEATURED_IMAGE = "Featured image"; export const BTN_DELETE_COURSE = "Delete product"; export const BTN_EXIT_COURSE = "Exit"; export const BTN_EXIT_COURSE_TOOLTIP = "Exit course"; +export const BTN_TOGGLE_THEME = "Toggle theme"; export const BTN_ADD_VIDEO = "Add"; export const ADD_VIDEO_DIALOG_TITLE = "Embed an online video"; export const LABEL_NEW_PASSWORD = "New password"; From 812886c678b73a5e26b131ab128f4990bbe26ac0 Mon Sep 17 00:00:00 2001 From: Rajat Date: Fri, 26 Dec 2025 11:16:59 +0530 Subject: [PATCH 2/3] Design adjustments --- .../course/[slug]/[id]/layout-with-sidebar.tsx | 2 +- .../public/lesson-viewer/quiz-viewer.tsx | 17 +++++++---------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/apps/web/app/(with-contexts)/course/[slug]/[id]/layout-with-sidebar.tsx b/apps/web/app/(with-contexts)/course/[slug]/[id]/layout-with-sidebar.tsx index 40bcd8aff..11ab60150 100644 --- a/apps/web/app/(with-contexts)/course/[slug]/[id]/layout-with-sidebar.tsx +++ b/apps/web/app/(with-contexts)/course/[slug]/[id]/layout-with-sidebar.tsx @@ -149,7 +149,7 @@ export function AppSidebar({ diff --git a/apps/web/components/public/lesson-viewer/quiz-viewer.tsx b/apps/web/components/public/lesson-viewer/quiz-viewer.tsx index 0b8fec507..4678f07ce 100644 --- a/apps/web/components/public/lesson-viewer/quiz-viewer.tsx +++ b/apps/web/components/public/lesson-viewer/quiz-viewer.tsx @@ -13,8 +13,8 @@ import { TOAST_QUIZ_PASS_MESSAGE, QUIZ_SCORE_PREFIX_MESSAGE, } from "@/ui-config/strings"; -import { Form, FormSubmit, useToast } from "@courselit/components-library"; -import { Header2, Text1 } from "@courselit/page-primitives"; +import { Form, useToast } from "@courselit/components-library"; +import { Button, Header2, Text1 } from "@courselit/page-primitives"; import { ThemeContext } from "@components/contexts"; interface QuizViewerProps { @@ -154,14 +154,11 @@ export default function QuizViewer({ ))}
- +
); From 9c2d5eb0fc69c2b9a23f434a6e42cbf1110a1932 Mon Sep 17 00:00:00 2001 From: Rajat Date: Fri, 26 Dec 2025 11:54:20 +0530 Subject: [PATCH 3/3] Removed unused vars --- .../(with-contexts)/course/[slug]/[id]/layout-with-sidebar.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/web/app/(with-contexts)/course/[slug]/[id]/layout-with-sidebar.tsx b/apps/web/app/(with-contexts)/course/[slug]/[id]/layout-with-sidebar.tsx index 11ab60150..7b81e0238 100644 --- a/apps/web/app/(with-contexts)/course/[slug]/[id]/layout-with-sidebar.tsx +++ b/apps/web/app/(with-contexts)/course/[slug]/[id]/layout-with-sidebar.tsx @@ -50,7 +50,6 @@ import { } from "@components/ui/collapsible"; import { usePathname } from "next/navigation"; import { Caption } from "@courselit/page-primitives"; -import { useTheme } from "next-themes"; import NextThemeSwitcher from "@components/admin/next-theme-switcher"; export default function ProductPage({ @@ -61,7 +60,6 @@ export default function ProductPage({ children: React.ReactNode; }) { const { profile } = useContext(ProfileContext); - const { theme, setTheme } = useTheme(); if (!profile) { return null;