Skip to content

Commit cdb20f2

Browse files
committed
feat: init next JsonViewer component
1 parent eda7905 commit cdb20f2

File tree

10 files changed

+171
-4
lines changed

10 files changed

+171
-4
lines changed

examples/next/next-env.d.ts

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/// <reference types="next" />
2+
/// <reference types="next/image-types/global" />
3+
4+
// NOTE: This file should not be edited
5+
// see https://nextjs.org/docs/basic-features/typescript for more information.

examples/next/next.config.js

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/** @type {import('next').NextConfig} */
2+
const nextConfig = {
3+
reactStrictMode: true,
4+
optimizeFonts: true,
5+
experimental: {
6+
externalDir: true
7+
}
8+
}
9+
10+
const withTM = require('next-transpile-modules')([], {
11+
resolveSymlinks: true,
12+
debug: false
13+
})
14+
15+
module.exports = withTM(nextConfig)

examples/next/package.json

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"name": "@textea/json-viewer-example-next",
3+
"private": true,
4+
"scripts": {
5+
"dev": "next dev",
6+
"build": "next build",
7+
"start": "next start",
8+
"lint": "next lint"
9+
},
10+
"dependencies": {
11+
"@textea/json-viewer": "workspace:^",
12+
"next": "^12.3.0",
13+
"react": "^18.2.0",
14+
"react-dom": "^18.2.0"
15+
},
16+
"devDependencies": {
17+
"@textea/dev-kit": "^0.12.16",
18+
"@types/node": "^18.7.17",
19+
"@types/react": "^18.0.19",
20+
"@types/react-dom": "^18.0.6",
21+
"next-transpile-modules": "^9.0.0",
22+
"typescript": "^4.8.3"
23+
}
24+
}

examples/next/pages/index.tsx

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { unstable_JsonViewer as JsonViewer } from '@textea/json-viewer'
2+
import type React from 'react'
3+
import { useCallback, useState } from 'react'
4+
5+
import type { InteractionProps } from '../../../src/type'
6+
7+
function aPlusB (a:number, b: number) {
8+
return a + b
9+
}
10+
11+
const example = {
12+
string: 'this is a test string',
13+
integer: 42,
14+
array: [1, 2, 3, 'test', NaN],
15+
float: 3.14159,
16+
undefined,
17+
object: {
18+
'first-child': true,
19+
'second-child': false,
20+
'last-child': null
21+
},
22+
fn: aPlusB,
23+
string_number: '1234',
24+
date: new Date('Tue Sep 13 2022 14:07:44 GMT-0500 (Central Daylight Time)')
25+
}
26+
27+
const IndexPage: React.FC = () => {
28+
const [src, setSrc] = useState<object>(() => example)
29+
const handleEdit = useCallback((update: InteractionProps) => {
30+
setSrc(update.updated_src)
31+
}, [])
32+
return (
33+
<div>
34+
<JsonViewer src={src} onEdit={handleEdit}/>
35+
</div>
36+
)
37+
}
38+
39+
export default IndexPage

examples/next/tsconfig.json

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"extends": "@textea/dev-kit/config/tsconfig.root.json",
3+
"compilerOptions": {
4+
"baseUrl": ".",
5+
"paths": {
6+
"@textea/json-viewer": ["../../src/index"]
7+
},
8+
"jsx": "preserve",
9+
"jsxImportSource": "react",
10+
"noEmit": true
11+
},
12+
"include": [
13+
"next-env.d.ts",
14+
"**/*.ts",
15+
"**/*.tsx"
16+
],
17+
"exclude": [
18+
"node_modules"
19+
]
20+
}

src/index.tsx

+7-1
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@ import { JsonViewer } from './components/JsonViewer'
44
import { AddKeyRequest } from './components/ObjectKeyModal/AddKeyRequest'
55
import { ValidationFailure } from './components/ValidationFailure'
66
import { isTheme, toType } from './helpers/util'
7+
import { JsonViewer as unstable_JsonViewer } from './next'
78
import ObjectAttributes from './stores/ObjectAttributes'
89
// global theme
910
import Theme from './themes/getStyle'
1011
import type { ReactJsonViewProps } from './type'
1112

13+
export {
14+
unstable_JsonViewer
15+
}
16+
1217
// forward src through to JsonObject component
1318
class ReactJsonView extends React.PureComponent<ReactJsonViewProps, any> {
1419
constructor (props: ReactJsonViewProps) {
@@ -178,7 +183,8 @@ class ReactJsonView extends React.PureComponent<ReactJsonViewProps, any> {
178183

179184
return (
180185
<div
181-
className={'react-json-view' + `${className ? ' ' : ''}${className ?? ''}`}
186+
className={'react-json-view' +
187+
`${className ? ' ' : ''}${className ?? ''}`}
182188
style={{ ...Theme(theme, 'app-container').style, ...style }}
183189
>
184190
<ValidationFailure

src/next.tsx

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { Box, createTheme, ThemeProvider } from '@mui/material'
2+
import type React from 'react'
3+
import { useEffect, useMemo } from 'react'
4+
5+
import {
6+
createJsonViewerStore,
7+
JsonViewerProvider, useJsonViewerStoreApi
8+
} from './stores/JsonViewerStore'
9+
import type { ReactJsonViewProps } from './type'
10+
11+
const JsonViewerInner: React.FC<ReactJsonViewProps> = (props) => {
12+
const api = useJsonViewerStoreApi()
13+
useEffect(() => {
14+
api.setState(state => ({
15+
...state,
16+
src: props.src
17+
}))
18+
}, [api, props.src])
19+
// todo: still working on it
20+
return (
21+
<Box>
22+
{JSON.stringify(props.src)}
23+
</Box>
24+
)
25+
}
26+
27+
export const JsonViewer: React.FC<ReactJsonViewProps> = (props) => {
28+
const theme = useMemo(() => createTheme({
29+
// todo: inject theme based on base16
30+
}), [])
31+
return (
32+
<ThemeProvider theme={theme}>
33+
<JsonViewerProvider createStore={createJsonViewerStore}>
34+
<JsonViewerInner {...props}/>
35+
</JsonViewerProvider>
36+
</ThemeProvider>
37+
)
38+
}

src/stores/JsonViewerStore.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ import createContext from 'zustand/context'
33
import { combine } from 'zustand/middleware'
44

55
// todo
6-
const createJsonViewerStore = (src: any) => create(combine({
7-
src
6+
export const createJsonViewerStore = () => create(combine({
7+
src: {}
88
}, () => ({
99
get: () => {},
1010
set: () => {}
1111
})))
12-
type JsonViewerStore = ReturnType<typeof createJsonViewerStore>
12+
export type JsonViewerStore = ReturnType<typeof createJsonViewerStore>
1313

1414
export const {
1515
useStore: useJsonViewerStore,

src/type.d.ts

+3
Original file line numberDiff line numberDiff line change
@@ -294,3 +294,6 @@ export type ThemeKeys =
294294

295295
declare const JsonViewer: React.ComponentType<ReactJsonViewProps>
296296
export default JsonViewer
297+
298+
// unstable components
299+
export const unstable_JsonViewer: React.FC<ReactJsonViewProps>

yarn.lock

+17
Original file line numberDiff line numberDiff line change
@@ -1570,6 +1570,23 @@ __metadata:
15701570
languageName: unknown
15711571
linkType: soft
15721572

1573+
"@textea/json-viewer-example-next@workspace:examples/next":
1574+
version: 0.0.0-use.local
1575+
resolution: "@textea/json-viewer-example-next@workspace:examples/next"
1576+
dependencies:
1577+
"@textea/dev-kit": ^0.12.16
1578+
"@textea/json-viewer": "workspace:^"
1579+
"@types/node": ^18.7.17
1580+
"@types/react": ^18.0.19
1581+
"@types/react-dom": ^18.0.6
1582+
next: ^12.3.0
1583+
next-transpile-modules: ^9.0.0
1584+
react: ^18.2.0
1585+
react-dom: ^18.2.0
1586+
typescript: ^4.8.3
1587+
languageName: unknown
1588+
linkType: soft
1589+
15731590
"@textea/json-viewer@workspace:., @textea/json-viewer@workspace:^":
15741591
version: 0.0.0-use.local
15751592
resolution: "@textea/json-viewer@workspace:."

0 commit comments

Comments
 (0)