Skip to content

Commit 01ee68d

Browse files
author
Rajat
committed
Text renderer based on page-primitives; Table block for editor and renderer; table-of-content component; editor ui tweaks;
1 parent ebcf5f0 commit 01ee68d

55 files changed

Lines changed: 691 additions & 739 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,20 @@
11
"use client";
22

3-
import { TextRenderer } from "@courselit/components-library";
3+
import { TextRenderer } from "@courselit/page-blocks";
4+
import { ThemeStyle } from "@courselit/page-models";
5+
import { TableOfContent } from "@components/table-of-content";
46

5-
export default function ClientSideTextRenderer({ json }: { json: any }) {
6-
return <TextRenderer json={json} showTableOfContent={true} />;
7+
export default function ClientSideTextRenderer({
8+
json,
9+
theme,
10+
}: {
11+
json: any;
12+
theme: ThemeStyle;
13+
}) {
14+
return (
15+
<div className="flex flex-col gap-4">
16+
<TableOfContent json={json} theme={theme} />
17+
<TextRenderer json={json} theme={theme} />
18+
</div>
19+
);
720
}

apps/web/app/(with-contexts)/(with-layout)/blog/[slug]/[id]/page.tsx

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Course } from "@courselit/common-models";
2-
import { Caption, Header1, Section, Text1 } from "@courselit/page-primitives";
2+
import { Caption, Header1, Section } from "@courselit/page-primitives";
33
import { formattedLocaleDate, getFullSiteSetup } from "@ui-lib/utils";
44
import { getAddressFromHeaders } from "@/app/actions";
55
import { headers } from "next/headers";
@@ -96,11 +96,10 @@ export default async function ProductPage(props: {
9696
</div>
9797
)}
9898
{product?.description && (
99-
<Text1 theme={theme.theme} component="span">
100-
<ClientSideTextRenderer
101-
json={JSON.parse(product.description)}
102-
/>
103-
</Text1>
99+
<ClientSideTextRenderer
100+
json={JSON.parse(product.description)}
101+
theme={theme.theme}
102+
/>
104103
)}
105104
</div>
106105
</Section>

apps/web/app/(with-contexts)/course/[slug]/[id]/page.tsx

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,20 @@ import {
1414
Link,
1515
Button2,
1616
getSymbolFromCurrency,
17-
TextRenderer,
18-
TextEditorEmptyDoc,
1917
Image,
2018
} from "@courselit/components-library";
19+
import { TextRenderer } from "@courselit/page-blocks";
20+
import { TableOfContent } from "@components/table-of-content";
2121
import {
2222
AddressContext,
2323
ProfileContext,
2424
SiteInfoContext,
25+
ThemeContext,
2526
} from "@components/contexts";
2627
import { getProduct } from "./helpers";
2728
import { getUserProfile } from "@/app/(with-contexts)/helpers";
2829
import { BadgeCheck } from "lucide-react";
30+
import { emptyDoc as TextEditorEmptyDoc } from "@courselit/text-editor";
2931
const { permissions } = UIConstants;
3032

3133
export default function ProductPage(props: {
@@ -38,6 +40,7 @@ export default function ProductPage(props: {
3840
const siteInfo = useContext(SiteInfoContext);
3941
const address = useContext(AddressContext);
4042
const [progress, setProgress] = useState<any>(null);
43+
const { theme } = useContext(ThemeContext);
4144

4245
useEffect(() => {
4346
if (id) {
@@ -68,6 +71,10 @@ export default function ProductPage(props: {
6871
return null;
6972
}
7073

74+
const descriptionJson = product.description
75+
? JSON.parse(product.description)
76+
: TextEditorEmptyDoc;
77+
7178
return (
7279
<div className="flex flex-col pb-[100px] lg:max-w-[40rem] xl:max-w-[48rem] mx-auto">
7380
<h1 className="text-4xl font-semibold mb-8">{product.title}</h1>
@@ -118,14 +125,13 @@ export default function ProductPage(props: {
118125
</div>
119126
)}
120127
<div className="overflow-hidden min-h-[360px]">
121-
<TextRenderer
122-
json={
123-
product.description
124-
? JSON.parse(product.description)
125-
: TextEditorEmptyDoc
126-
}
127-
showTableOfContent={true}
128-
/>
128+
<div className="flex flex-col gap-4">
129+
<TableOfContent
130+
json={descriptionJson}
131+
theme={theme.theme}
132+
/>
133+
<TextRenderer json={descriptionJson} theme={theme.theme} />
134+
</div>
129135
</div>
130136
{isEnrolled(product.courseId, profile as Profile) && (
131137
<div className="self-end">

apps/web/app/(with-contexts)/dashboard/(sidebar)/community/[id]/manage/page.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import DashboardContent from "@components/admin/dashboard-content";
44
import {
55
AddressContext,
66
ProfileContext,
7-
SiteInfoContext,
87
} from "@components/contexts";
98
import {
109
COMMUNITY_HEADER,
@@ -31,8 +30,6 @@ import {
3130
Image,
3231
Link,
3332
MediaSelector,
34-
TextEditor,
35-
TextEditorEmptyDoc,
3633
useToast,
3734
} from "@courselit/components-library";
3835
import { Separator } from "@components/ui/separator";
@@ -72,6 +69,7 @@ import { Input } from "@/components/ui/input";
7269
import { redirect, useRouter } from "next/navigation";
7370
import { useMembership } from "@/hooks/use-membership";
7471
import { useGraphQLFetch } from "@/hooks/use-graphql-fetch";
72+
import { Editor, emptyDoc as TextEditorEmptyDoc } from "@courselit/text-editor";
7573
const { PaymentPlanType: paymentPlanType, MembershipEntityType } = Constants;
7674

7775
export default function Page(props: {
@@ -90,7 +88,6 @@ export default function Page(props: {
9088
];
9189
const { profile } = useContext(ProfileContext);
9290
const address = useContext(AddressContext);
93-
const siteinfo = useContext(SiteInfoContext);
9491

9592
const [name, setName] = useState("");
9693
const [enabled, setEnabled] = useState(false);
@@ -565,7 +562,7 @@ export default function Page(props: {
565562
/>
566563
<div>
567564
<h2 className="font-semibold">Description</h2>
568-
<TextEditor
565+
<Editor
569566
initialContent={description}
570567
onChange={(state: any) => setDescription(state)}
571568
showToolbar={false}

apps/web/app/(with-contexts)/dashboard/(sidebar)/product/[id]/content/section/[section]/lesson/page.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,7 @@ import {
5151
TextEditorContent,
5252
UIConstants,
5353
} from "@courselit/common-models";
54-
import {
55-
MediaSelector,
56-
TextEditor,
57-
TextEditorEmptyDoc,
58-
useToast,
59-
} from "@courselit/components-library";
54+
import { MediaSelector, useToast } from "@courselit/components-library";
6055
import {
6156
MIMETYPE_VIDEO,
6257
MIMETYPE_AUDIO,
@@ -67,6 +62,7 @@ import { QuizBuilder } from "@components/admin/products/quiz-builder";
6762
import { isTextEditorNonEmpty, truncate } from "@ui-lib/utils";
6863
import { Skeleton } from "@/components/ui/skeleton";
6964
import { Separator } from "@components/ui/separator";
65+
import { Editor, emptyDoc as TextEditorEmptyDoc } from "@courselit/text-editor";
7066

7167
const { permissions } = UIConstants;
7268

@@ -214,7 +210,7 @@ export default function LessonPage() {
214210
case Constants.LessonType.TEXT:
215211
return (
216212
<div className="space-y-2">
217-
<TextEditor
213+
<Editor
218214
initialContent={textContent}
219215
refresh={refresh}
220216
onChange={(state: any) => {

apps/web/app/(with-contexts)/dashboard/(sidebar)/product/[id]/manage/components/product-details.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,7 @@ import { Button } from "@/components/ui/button";
55
import { Input } from "@/components/ui/input";
66
import { Label } from "@/components/ui/label";
77
import { Separator } from "@/components/ui/separator";
8-
import {
9-
TextEditor,
10-
TextEditorEmptyDoc,
11-
useToast,
12-
} from "@courselit/components-library";
8+
import { useToast } from "@courselit/components-library";
139
import { AddressContext } from "@components/contexts";
1410
import {
1511
APP_MESSAGE_COURSE_SAVED,
@@ -20,6 +16,7 @@ import {
2016
} from "@ui-config/strings";
2117
import { useGraphQLFetch } from "@/hooks/use-graphql-fetch";
2218
import { Save, Loader2 } from "lucide-react";
19+
import { Editor, emptyDoc as TextEditorEmptyDoc } from "@courselit/text-editor";
2320

2421
const MUTATION_UPDATE_BASIC_DETAILS = `
2522
mutation UpdateBasicDetails($courseId: String!, $title: String!, $description: String!) {
@@ -131,7 +128,7 @@ export default function ProductDetails({ product }: ProductDetailsProps) {
131128
Description
132129
</Label>
133130

134-
<TextEditor
131+
<Editor
135132
initialContent={formData.description}
136133
onChange={(state: any) => {
137134
handleInputChange({

apps/web/components/admin/blogs/editor/details.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import React, { FormEvent, useContext, useEffect, useState } from "react";
22
import {
33
MediaSelector,
4-
TextEditor,
5-
TextEditorEmptyDoc,
64
Form,
75
FormField,
86
Button,
@@ -23,6 +21,7 @@ import {
2321
import { MIMETYPE_IMAGE } from "@/ui-config/constants";
2422
import { Media, Profile } from "@courselit/common-models";
2523
import { AddressContext, ProfileContext } from "@components/contexts";
24+
import { Editor, emptyDoc as TextEditorEmptyDoc } from "@courselit/text-editor";
2625

2726
interface DetailsProps {
2827
id: string;
@@ -145,7 +144,7 @@ export default function Details({ id }: DetailsProps) {
145144
onChange={(e) => setTitle(e.target.value)}
146145
/>
147146
<PageBuilderPropertyHeader label={COURSE_CONTENT_HEADER} />
148-
<TextEditor
147+
<Editor
149148
initialContent={description}
150149
refresh={refreshDetails}
151150
onChange={(state: any) => setDescription(state)}

apps/web/components/admin/page-editor/theme-editor/interactive-selector.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ function InteractiveSelector({
421421
<Info className="h-4 w-4" />
422422
<span>
423423
Use any supported Tailwind class here.{" "}
424-
<DocumentationLink path="/en/theme/customization" />
424+
<DocumentationLink path="/en/website/themes#supported-tailwind-classes" />
425425
</span>
426426
</div>
427427
</div>

apps/web/components/community/banner.tsx

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,13 @@ import { useState, useEffect, useRef, useContext } from "react";
22
import { Button } from "@/components/ui/button";
33
import { Alert, AlertDescription } from "@/components/ui/alert";
44
import { AlertCircle, Pencil, Check, X, Loader2 } from "lucide-react";
5-
import {
6-
TextEditor,
7-
TextEditorEmptyDoc,
8-
TextRenderer,
9-
useToast,
10-
} from "@courselit/components-library";
5+
import { useToast } from "@courselit/components-library";
6+
import { TextRenderer } from "@courselit/page-blocks";
117
import { isTextEditorNonEmpty } from "@ui-lib/utils";
128
import { BUTTON_SAVING, TOAST_TITLE_SUCCESS } from "@ui-config/strings";
139
import { AddressContext } from "@components/contexts";
1410
import type { TextEditorContent } from "@courselit/common-models";
11+
import { Editor, emptyDoc as TextEditorEmptyDoc } from "@courselit/text-editor";
1512

1613
interface BannerComponentProps {
1714
canEdit: boolean;
@@ -116,10 +113,12 @@ export default function Banner({
116113
</>
117114
) : (
118115
<div className="space-y-2">
119-
<TextEditor
116+
<Editor
120117
showToolbar={false}
121118
initialContent={editedBannerText}
122-
onChange={(value) => setEditedBannerText(value)}
119+
onChange={(value) =>
120+
setEditedBannerText(value as TextEditorContent)
121+
}
123122
url={address.backend}
124123
/>
125124
<div className="flex justify-end space-x-2">

apps/web/components/community/info.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@ import {
1414
FormField,
1515
getSymbolFromCurrency,
1616
Link,
17-
TextRenderer,
1817
useToast,
1918
} from "@courselit/components-library";
19+
import { TextRenderer } from "@courselit/page-blocks";
2020
import {
2121
AddressContext,
2222
ProfileContext,
2323
SiteInfoContext,
24+
ThemeContext,
2425
} from "@components/contexts";
2526
import {
2627
Dialog,
@@ -74,6 +75,7 @@ export function CommunityInfo({
7475
const currencySymbol =
7576
getSymbolFromCurrency(siteinfo.currencyISOCode || "USD") || "$";
7677
const { toast } = useToast();
78+
const { theme } = useContext(ThemeContext);
7779

7880
const handleJoinSubmit = async (e: FormEvent) => {
7981
e.preventDefault();
@@ -121,7 +123,12 @@ export function CommunityInfo({
121123
/>
122124
<div className="space-y-2">
123125
<div className="text-sm text-muted-foreground">
124-
{description && <TextRenderer json={description} />}
126+
{description && (
127+
<TextRenderer
128+
json={description}
129+
theme={theme.theme}
130+
/>
131+
)}
125132
</div>
126133
<p className="text-sm">
127134
<strong>{memberCount.toLocaleString()}</strong> members

0 commit comments

Comments
 (0)