Skip to content

Commit 506ec71

Browse files
type block renderers
image and rich text wip
1 parent 2349ef7 commit 506ec71

15 files changed

+165
-144
lines changed

typescript/src/renderer/JsonDocRenderer.tsx

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
import "./styles/index.css";
2-
import React from "react";
2+
import React, { useEffect } from "react";
3+
4+
import { Page } from "@/models/generated";
5+
// import { validateAgainstSchema } from "@/validation/validator";
36

47
import { BlockRenderer } from "./components/BlockRenderer";
58
import { PageDelimiter } from "./components/PageDelimiter";
69
import { JsonViewPanel } from "./components/dev/JsonViewPanel";
710
import { RendererProvider } from "./context/RendererContext";
811

912
interface JsonDocRendererProps {
10-
page: any;
13+
page: Page;
1114
className?: string;
1215
components?: React.ComponentProps<typeof BlockRenderer>["components"];
1316
theme?: "light" | "dark";
@@ -25,30 +28,46 @@ export const JsonDocRenderer = ({
2528
devMode = false,
2629
viewJson = false,
2730
}: JsonDocRendererProps) => {
31+
console.log("page: ", page);
32+
33+
const loadAndValidate = async () => {
34+
// const response = await fetch("/schema/page/page_schema.json"); // Updated path
35+
// const data = await response.json();
36+
// console.log("schema: ", data);
37+
// validateAgainstSchema(
38+
// page,
39+
// )
40+
};
41+
42+
useEffect(() => {
43+
console.log("in jsondocrendererrrr");
44+
loadAndValidate();
45+
}, []);
46+
47+
// return null;
2848
const renderedContent = (
2949
<div className="json-doc-page">
50+
hello
3051
{/* Page icon */}
3152
{page.icon && (
3253
<div className="json-doc-page-icon">
3354
{page.icon.type === "emoji" && page.icon.emoji}
3455
</div>
3556
)}
36-
3757
{/* Page title */}
3858
{page.properties?.title && (
3959
<h1 className="json-doc-page-title">
4060
{page.properties.title.title?.[0]?.plain_text || "Untitled"}
4161
</h1>
4262
)}
43-
4463
{/* Page children blocks */}
4564
{page.children && page.children.length > 0 && (
4665
<div className="json-doc-page-content">
4766
{page.children.map((block: any, index: number) => {
4867
const currentPageNum = block.metadata?.origin?.page_num;
4968
const nextPageNum =
5069
index < page.children.length - 1
51-
? page.children[index + 1]?.metadata?.origin?.page_num
70+
? (page.children[index + 1]?.metadata as any)?.origin?.page_num
5271
: null;
5372

5473
// Show delimiter after the last block of each page
@@ -77,6 +96,7 @@ export const JsonDocRenderer = ({
7796

7897
return (
7998
<RendererProvider value={{ devMode, resolveImageUrl }}>
99+
hello and hello
80100
<div className={`json-doc-renderer jsondoc-theme-${theme} ${className}`}>
81101
{viewJson ? (
82102
<div className="flex h-screen">

typescript/src/renderer/components/BlockRenderer.tsx

Lines changed: 78 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,25 @@
11
import React from "react";
22

3+
import {
4+
Block,
5+
BlockBase,
6+
Heading1Block,
7+
Heading2Block,
8+
Heading3Block,
9+
ParagraphBlock,
10+
BulletedListItemBlock,
11+
NumberedListItemBlock,
12+
CodeBlock,
13+
ImageBlock,
14+
TableBlock,
15+
QuoteBlock,
16+
DividerBlock,
17+
ToDoBlock,
18+
ToggleBlock,
19+
ColumnListBlock,
20+
EquationBlock,
21+
} from "@/models/generated";
22+
323
import { useRenderer } from "../context/RendererContext";
424

525
import { DevWrapper } from "./dev/DevWrapper";
@@ -56,7 +76,7 @@ export type BlockComponents = {
5676
};
5777

5878
interface BlockRendererProps {
59-
block: any;
79+
block: Block;
6080
depth?: number;
6181
components?: BlockComponents;
6282
}
@@ -80,92 +100,127 @@ export const BlockRenderer: React.FC<BlockRendererProps> = ({
80100
// Paragraph block
81101
if (block?.type === "paragraph") {
82102
const ParagraphComponent = components?.paragraph || ParagraphBlockRenderer;
83-
return wrapWithDev(<ParagraphComponent {...commonProps} />);
103+
return wrapWithDev(
104+
<ParagraphComponent {...commonProps} block={block as ParagraphBlock} />
105+
);
84106
}
85107

86108
// Heading blocks
87-
if (block?.type === "heading_1") {
109+
if (
110+
block?.type === "heading_1" ||
111+
block?.type === "heading_2" ||
112+
block?.type === "heading_3"
113+
) {
88114
const HeadingComponent = components?.heading_1 || HeadingBlockRenderer;
89-
return wrapWithDev(<HeadingComponent {...commonProps} level={1} />);
90-
}
91-
if (block?.type === "heading_2") {
92-
const HeadingComponent = components?.heading_2 || HeadingBlockRenderer;
93-
return wrapWithDev(<HeadingComponent {...commonProps} level={2} />);
94-
}
95-
if (block?.type === "heading_3") {
96-
const HeadingComponent = components?.heading_3 || HeadingBlockRenderer;
97-
return wrapWithDev(<HeadingComponent {...commonProps} level={3} />);
115+
return wrapWithDev(
116+
<HeadingComponent
117+
{...commonProps}
118+
block={block as Heading1Block | Heading2Block | Heading3Block}
119+
/>
120+
);
98121
}
122+
// if (block?.type === "heading_2") {
123+
// const HeadingComponent = components?.heading_2 || HeadingBlockRenderer;
124+
// return wrapWithDev(<HeadingComponent {...commonProps} level={2} />);
125+
// }
126+
// if (block?.type === "heading_3") {
127+
// const HeadingComponent = components?.heading_3 || HeadingBlockRenderer;
128+
// return wrapWithDev(<HeadingComponent {...commonProps} level={3} />);
129+
// }
99130

100131
// List item blocks
101132
if (block?.type === "bulleted_list_item") {
102133
const BulletedListItemComponent =
103134
components?.bulleted_list_item || ListItemBlockRenderer;
104135
return wrapWithDev(
105-
<BulletedListItemComponent {...commonProps} type="bulleted" />
136+
<BulletedListItemComponent
137+
{...commonProps}
138+
block={block as BulletedListItemBlock}
139+
/>
106140
);
107141
}
108142
if (block?.type === "numbered_list_item") {
109143
const NumberedListItemComponent =
110144
components?.numbered_list_item || ListItemBlockRenderer;
111145
return wrapWithDev(
112-
<NumberedListItemComponent {...commonProps} type="numbered" />
146+
<NumberedListItemComponent
147+
{...commonProps}
148+
block={block as NumberedListItemBlock}
149+
/>
113150
);
114151
}
115152

116153
// Code block
117154
if (block?.type === "code") {
118155
const CodeComponent = components?.code || CodeBlockRenderer;
119-
return wrapWithDev(<CodeComponent {...commonProps} />);
156+
return wrapWithDev(
157+
<CodeComponent {...commonProps} block={block as CodeBlock} />
158+
);
120159
}
121160

122161
// Image block
123162
if (block?.type === "image") {
124163
const ImageComponent = components?.image || ImageBlockRenderer;
125-
return wrapWithDev(<ImageComponent {...commonProps} />);
164+
return wrapWithDev(
165+
<ImageComponent {...commonProps} block={block as ImageBlock} />
166+
);
126167
}
127168

128169
// Table blocks
129170
if (block?.type === "table") {
130171
const TableComponent = components?.table || TableBlockRenderer;
131-
return wrapWithDev(<TableComponent {...commonProps} />);
172+
return wrapWithDev(
173+
<TableComponent {...commonProps} block={block as TableBlock} />
174+
);
132175
}
133176

134177
// Quote block
135178
if (block?.type === "quote") {
136179
const QuoteComponent = components?.quote || QuoteBlockRenderer;
137-
return wrapWithDev(<QuoteComponent {...commonProps} />);
180+
return wrapWithDev(
181+
<QuoteComponent {...commonProps} block={block as QuoteBlock} />
182+
);
138183
}
139184

140185
// Divider block
141186
if (block?.type === "divider") {
142187
const DividerComponent = components?.divider || DividerBlockRenderer;
143-
return wrapWithDev(<DividerComponent {...commonProps} />);
188+
return wrapWithDev(
189+
<DividerComponent {...commonProps} block={block as DividerBlock} />
190+
);
144191
}
145192

146193
// To-do block
147194
if (block?.type === "to_do") {
148195
const ToDoComponent = components?.to_do || ToDoBlockRenderer;
149-
return wrapWithDev(<ToDoComponent {...commonProps} />);
196+
return wrapWithDev(
197+
<ToDoComponent {...commonProps} block={block as ToDoBlock} />
198+
);
150199
}
151200

152201
// Toggle block
153202
if (block?.type === "toggle") {
154203
const ToggleComponent = components?.toggle || ToggleBlockRenderer;
155-
return wrapWithDev(<ToggleComponent {...commonProps} />);
204+
return wrapWithDev(
205+
<ToggleComponent {...commonProps} block={block as ToggleBlock} />
206+
);
156207
}
157208

158209
// Column list and column blocks
159210
if (block?.type === "column_list") {
160211
const ColumnListComponent =
161212
components?.column_list || ColumnListBlockRenderer;
162-
return wrapWithDev(<ColumnListComponent {...commonProps} />);
213+
return wrapWithDev(
214+
<ColumnListComponent {...commonProps} block={block as ColumnListBlock} />
215+
);
163216
}
164217

165218
// Equation block
166219
if (block?.type === "equation") {
167220
const EquationComponent = components?.equation || EquationBlockRenderer;
168-
return wrapWithDev(<EquationComponent {...commonProps} />);
221+
return wrapWithDev(
222+
<EquationComponent {...commonProps} block={block as EquationBlock} />
223+
);
169224
}
170225

171226
// Fallback for unsupported block types

typescript/src/renderer/components/RichTextRenderer.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import React from "react";
22

3+
// import { RichText } from "@/models/generated";
4+
35
interface RichTextRendererProps {
46
richText: any[];
57
}
@@ -13,7 +15,7 @@ export const RichTextRenderer: React.FC<RichTextRendererProps> = ({
1315

1416
return (
1517
<>
16-
{richText.map((item: any, index: number) => {
18+
{richText.map((item, index: number) => {
1719
const key = `rich-text-${index}`;
1820

1921
if (item?.type === "text") {
Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
import React from "react";
22

3+
import { CodeBlock } from "@/models/generated";
4+
35
import { RichTextRenderer } from "../RichTextRenderer";
4-
import { BlockRenderer } from "../BlockRenderer";
56

67
interface CodeBlockRendererProps extends React.HTMLAttributes<HTMLDivElement> {
7-
block: any;
8-
depth?: number;
9-
components?: React.ComponentProps<typeof BlockRenderer>["components"];
8+
block: CodeBlock;
109
}
1110

1211
export const CodeBlockRenderer: React.FC<CodeBlockRendererProps> = ({
1312
block,
14-
depth = 0,
1513
className,
16-
components,
1714
...props
1815
}) => {
1916
const codeData = block.code;
@@ -39,22 +36,7 @@ export const CodeBlockRenderer: React.FC<CodeBlockRendererProps> = ({
3936
</div>
4037
</div>
4138

42-
{/* Render children blocks recursively */}
43-
{block.children && block.children.length > 0 && (
44-
<div
45-
className="notion-block-children"
46-
style={{ marginLeft: `${depth * 24}px` }}
47-
>
48-
{block.children.map((child: any, index: number) => (
49-
<BlockRenderer
50-
key={child.id || index}
51-
block={child}
52-
depth={depth + 1}
53-
components={components}
54-
/>
55-
))}
56-
</div>
57-
)}
39+
{/* code block can't have children */}
5840
</div>
5941
);
6042
};

typescript/src/renderer/components/blocks/ColumnListBlockRenderer.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import React from "react";
22

3+
import { ColumnListBlock } from "@/models/generated";
4+
35
import { BlockRenderer } from "../BlockRenderer";
46

57
interface ColumnListBlockRendererProps
68
extends React.HTMLAttributes<HTMLDivElement> {
7-
block: any;
9+
block: ColumnListBlock;
810
depth?: number;
911
components?: React.ComponentProps<typeof BlockRenderer>["components"];
1012
}
@@ -22,7 +24,7 @@ export const ColumnListBlockRenderer: React.FC<
2224
className="notion-column-list"
2325
style={{ display: "flex", gap: "16px" }}
2426
>
25-
{block.children?.map((child: any, index: number) => {
27+
{block.children?.map((child, index: number) => {
2628
if (child?.type === "column") {
2729
return (
2830
<div
Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
import React from "react";
22

3+
import { DividerBlock } from "@/models/generated";
4+
35
import { BlockRenderer } from "../BlockRenderer";
46

57
interface DividerBlockRendererProps
68
extends React.HTMLAttributes<HTMLDivElement> {
7-
block: any;
9+
block: DividerBlock;
810
depth?: number;
911
components?: React.ComponentProps<typeof BlockRenderer>["components"];
1012
}
1113

1214
export const DividerBlockRenderer: React.FC<DividerBlockRendererProps> = ({
1315
block,
14-
depth = 0,
1516
className,
16-
components,
1717
...props
1818
}) => {
1919
return (
@@ -25,23 +25,6 @@ export const DividerBlockRenderer: React.FC<DividerBlockRendererProps> = ({
2525
<div className="notion-cursor-default">
2626
<div role="separator"></div>
2727
</div>
28-
29-
{/* Render children blocks recursively */}
30-
{block.children && block.children.length > 0 && (
31-
<div
32-
className="notion-block-children"
33-
style={{ marginLeft: `${depth * 24}px` }}
34-
>
35-
{block.children.map((child: any, index: number) => (
36-
<BlockRenderer
37-
key={child.id || index}
38-
block={child}
39-
depth={depth + 1}
40-
components={components}
41-
/>
42-
))}
43-
</div>
44-
)}
4528
</div>
4629
);
4730
};

0 commit comments

Comments
 (0)