1- import { useEffect } from "react" ;
1+ import { useEffect , useMemo } from "react" ;
22import { JsonViewer } from "@textea/json-viewer" ;
33import { Sidebar } from "./components/sidebar" ;
44import { Input } from "@/components/ui/input" ;
@@ -20,21 +20,17 @@ export default function App() {
2020 if ( apiVersion === "v1" ) Y . applyUpdate ( ydoc , buf ) ;
2121 if ( apiVersion === "v2" ) Y . applyUpdateV2 ( ydoc , buf ) ;
2222 }
23- displayOptionStore . setState ( { display : ydoc } ) ;
23+ displayOptionStore . setState ( { display : ydoc , displayError : null } ) ;
2424 // @ts -expect-error expose ydoc for advance debug
2525 window . currentDoc = ydoc ;
2626 } catch ( e ) {
27- displayOptionStore . setState ( { display : e } ) ;
27+ // @ts -expect-error expose ydoc for advance debug
28+ window . currentDoc = null ;
29+ ydoc . destroy ( ) ;
30+ displayOptionStore . setState ( { display : null , displayError : e } ) ;
2831 }
2932
30- if (
31- typeof prev === "object" &&
32- prev &&
33- "destroy" in prev &&
34- typeof prev . destroy === "function"
35- ) {
36- prev . destroy ( ) ;
37- }
33+ if ( prev && prev . destroy ) prev . destroy ( ) ;
3834 } , [ inputBuffer , apiVersion ] ) ;
3935
4036 return (
@@ -50,17 +46,19 @@ export default function App() {
5046 }
5147 className = "mb-4 bg-gray-800 text-white border-gray-700"
5248 />
53- < div className = "flex-1 overflow-auto bg-gray-800 rounded-lg p-4 [&>div]:px-4 [&>div]:py-2" >
54- < Viewer />
49+ < div className = "flex-1 gap-4 grid grid-cols-2 overflow-auto bg-gray-800 rounded-lg p-4 [&>div]:px-4 [&>div]:py-2" >
50+ < MainViewer />
51+ < SideViewer />
5552 </ div >
5653 </ main >
5754 </ div >
5855 ) ;
5956}
6057
61- function Viewer ( ) {
58+ function MainViewer ( ) {
6259 const {
6360 display,
61+ displayError,
6462 indentWidth,
6563 enableClipboard,
6664 displaySize,
@@ -69,7 +67,46 @@ function Viewer() {
6967 return (
7068 < JsonViewer
7169 theme = "dark"
72- value = { display }
70+ value = { displayError ?? display }
71+ indentWidth = { indentWidth }
72+ enableClipboard = { enableClipboard }
73+ displayDataTypes = { displayDataTypes }
74+ displaySize = { displaySize }
75+ defaultInspectDepth = { 3 }
76+ />
77+ ) ;
78+ }
79+
80+ function SideViewer ( ) {
81+ const {
82+ display,
83+ displayError,
84+ indentWidth,
85+ enableClipboard,
86+ displaySize,
87+ displayDataTypes,
88+ } = useStore ( displayOptionStore ) ;
89+ const getApiType = useStore ( yDocOptionStore , ( s ) => s . getApiType ) ;
90+ const contentDisplay = useMemo ( ( ) => {
91+ if ( ! display ) return null ;
92+ try {
93+ const ydoc = new Y . Doc ( ) ;
94+ Y . applyUpdateV2 ( ydoc , Y . encodeStateAsUpdateV2 ( display ) ) ;
95+ const displayObj : Record < string , unknown > = { } ;
96+ for ( const key of ydoc . share . keys ( ) ) {
97+ displayObj [ key ] = ydoc [ getApiType ] ( key ) ;
98+ }
99+ ydoc . destroy ( ) ;
100+ return displayObj ;
101+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
102+ } catch ( e ) {
103+ return null ;
104+ }
105+ } , [ display , getApiType ] ) ;
106+ return (
107+ < JsonViewer
108+ theme = "dark"
109+ value = { displayError ?? contentDisplay }
73110 indentWidth = { indentWidth }
74111 enableClipboard = { enableClipboard }
75112 displayDataTypes = { displayDataTypes }
0 commit comments