@@ -3,6 +3,7 @@ import React from "react";
33
44import { BlockRenderer } from "./components/BlockRenderer" ;
55import { PageDelimiter } from "./components/PageDelimiter" ;
6+ import { JsonViewPanel } from "./components/dev/JsonViewPanel" ;
67import { RendererProvider } from "./context/RendererContext" ;
78
89interface JsonDocRendererProps {
@@ -12,6 +13,7 @@ interface JsonDocRendererProps {
1213 theme ?: "light" | "dark" ;
1314 resolveImageUrl ?: ( url : string ) => Promise < string > ;
1415 devMode ?: boolean ;
16+ viewJson ?: boolean ;
1517}
1618
1719export const JsonDocRenderer = ( {
@@ -21,56 +23,70 @@ export const JsonDocRenderer = ({
2123 theme = "light" ,
2224 resolveImageUrl,
2325 devMode = false ,
26+ viewJson = false ,
2427} : JsonDocRendererProps ) => {
25- return (
26- < RendererProvider value = { { devMode, resolveImageUrl } } >
27- < div className = { `json-doc-renderer jsondoc-theme-${ theme } ${ className } ` } >
28- < div className = "json-doc-page" >
29- { /* Page icon */ }
30- { page . icon && (
31- < div className = "json-doc-page-icon" >
32- { page . icon . type === "emoji" && page . icon . emoji }
33- </ div >
34- ) }
28+ const renderedContent = (
29+ < div className = "json-doc-page" >
30+ { /* Page icon */ }
31+ { page . icon && (
32+ < div className = "json-doc-page-icon" >
33+ { page . icon . type === "emoji" && page . icon . emoji }
34+ </ div >
35+ ) }
3536
36- { /* Page title */ }
37- { page . properties ?. title && (
38- < h1 className = "json-doc-page-title" >
39- { page . properties . title . title ?. [ 0 ] ?. plain_text || "Untitled" }
40- </ h1 >
41- ) }
37+ { /* Page title */ }
38+ { page . properties ?. title && (
39+ < h1 className = "json-doc-page-title" >
40+ { page . properties . title . title ?. [ 0 ] ?. plain_text || "Untitled" }
41+ </ h1 >
42+ ) }
4243
43- { /* Page children blocks */ }
44- { page . children && page . children . length > 0 && (
45- < div className = "json-doc-page-content" >
46- { page . children . map ( ( block : any , index : number ) => {
47- const currentPageNum = block . metadata ?. origin ?. page_num ;
48- const nextPageNum =
49- index < page . children . length - 1
50- ? page . children [ index + 1 ] ?. metadata ?. origin ?. page_num
51- : null ;
44+ { /* Page children blocks */ }
45+ { page . children && page . children . length > 0 && (
46+ < div className = "json-doc-page-content" >
47+ { page . children . map ( ( block : any , index : number ) => {
48+ const currentPageNum = block . metadata ?. origin ?. page_num ;
49+ const nextPageNum =
50+ index < page . children . length - 1
51+ ? page . children [ index + 1 ] ?. metadata ?. origin ?. page_num
52+ : null ;
5253
53- // Show delimiter after the last block of each page
54- const showPageDelimiter =
55- currentPageNum &&
56- ( nextPageNum !== currentPageNum || index === page . children . length - 1 ) ;
54+ // Show delimiter after the last block of each page
55+ const showPageDelimiter =
56+ currentPageNum &&
57+ ( nextPageNum !== currentPageNum || index === page . children . length - 1 ) ;
5758
58- return (
59- < React . Fragment key = { block . id || index } >
60- < BlockRenderer
61- block = { block }
62- depth = { 0 }
63- components = { components }
64- />
65- { showPageDelimiter && (
66- < PageDelimiter pageNumber = { currentPageNum } />
67- ) }
68- </ React . Fragment >
69- ) ;
70- } ) }
71- </ div >
72- ) }
59+ return (
60+ < React . Fragment key = { block . id || index } >
61+ < BlockRenderer
62+ block = { block }
63+ depth = { 0 }
64+ components = { components }
65+ />
66+ { showPageDelimiter && (
67+ < PageDelimiter pageNumber = { currentPageNum } />
68+ ) }
69+ </ React . Fragment >
70+ ) ;
71+ } ) }
7372 </ div >
73+ ) }
74+ </ div >
75+ ) ;
76+
77+ return (
78+ < RendererProvider value = { { devMode, resolveImageUrl } } >
79+ < div className = { `json-doc-renderer jsondoc-theme-${ theme } ${ className } ` } >
80+ { viewJson ? (
81+ < div className = "flex h-screen" >
82+ < div className = "w-1/2 overflow-y-auto" >
83+ { renderedContent }
84+ </ div >
85+ < JsonViewPanel data = { page } />
86+ </ div >
87+ ) : (
88+ renderedContent
89+ ) }
7490 </ div >
7591 </ RendererProvider >
7692 ) ;
0 commit comments