@@ -3,19 +3,20 @@ import {
3
3
ThemeProvider
4
4
} from '@mui/material'
5
5
import type { FC , ReactElement } from 'react'
6
- import { useCallback , useEffect , useMemo , useRef } from 'react'
6
+ import { useCallback , useContext , useEffect , useMemo , useRef } from 'react'
7
7
8
8
import { DataKeyPair } from './components/DataKeyPair'
9
9
import { useThemeDetector } from './hooks/useThemeDetector'
10
10
import {
11
11
createJsonViewerStore ,
12
- JsonViewerProvider ,
13
- useJsonViewerStore ,
14
- useJsonViewerStoreApi
12
+ JsonViewerStoreContext ,
13
+ useJsonViewerStore
15
14
} from './stores/JsonViewerStore'
16
15
import {
17
- createTypeRegistryStore , predefined ,
18
- TypeRegistryProvider , useTypeRegistryStore
16
+ createTypeRegistryStore ,
17
+ predefined ,
18
+ TypeRegistryStoreContext ,
19
+ useTypeRegistryStore
19
20
} from './stores/typeRegistry'
20
21
import { darkColorspace , lightColorspace } from './theme/base16'
21
22
import type { JsonViewerProps } from './type'
@@ -30,21 +31,21 @@ function useSetIfNotUndefinedEffect<Key extends keyof JsonViewerProps> (
30
31
key : Key ,
31
32
value : JsonViewerProps [ Key ] | undefined
32
33
) {
33
- const api = useJsonViewerStoreApi ( )
34
+ const { setState } = useContext ( JsonViewerStoreContext )
34
35
useEffect ( ( ) => {
35
36
if ( value !== undefined ) {
36
- api . setState ( {
37
+ setState ( {
37
38
[ key ] : value
38
39
} )
39
40
}
40
- } , [ key , value , api ] )
41
+ } , [ key , value , setState ] )
41
42
}
42
43
43
44
/**
44
45
* @internal
45
46
*/
46
47
const JsonViewerInner : FC < JsonViewerProps > = ( props ) => {
47
- const api = useJsonViewerStoreApi ( )
48
+ const { setState } = useContext ( JsonViewerStoreContext )
48
49
useSetIfNotUndefinedEffect ( 'value' , props . value )
49
50
useSetIfNotUndefinedEffect ( 'editable' , props . editable )
50
51
useSetIfNotUndefinedEffect ( 'indentWidth' , props . indentWidth )
@@ -60,19 +61,19 @@ const JsonViewerInner: FC<JsonViewerProps> = (props) => {
60
61
useSetIfNotUndefinedEffect ( 'onSelect' , props . onSelect )
61
62
useEffect ( ( ) => {
62
63
if ( props . theme === 'light' ) {
63
- api . setState ( {
64
+ setState ( {
64
65
colorspace : lightColorspace
65
66
} )
66
67
} else if ( props . theme === 'dark' ) {
67
- api . setState ( {
68
+ setState ( {
68
69
colorspace : darkColorspace
69
70
} )
70
71
} else if ( typeof props . theme === 'object' ) {
71
- api . setState ( {
72
+ setState ( {
72
73
colorspace : props . theme
73
74
} )
74
75
}
75
- } , [ api , props . theme ] )
76
+ } , [ setState , props . theme ] )
76
77
const onceRef = useRef ( true )
77
78
const predefinedTypes = useMemo ( ( ) => predefined ( ) , [ ] )
78
79
const registerTypes = useTypeRegistryStore ( store => store . registerTypes )
@@ -143,17 +144,18 @@ export const JsonViewer = function JsonViewer<Value> (props: JsonViewerProps<Val
143
144
} )
144
145
} , [ themeType ] )
145
146
const mixedProps = { ...props , theme : themeType }
147
+
148
+ // eslint-disable-next-line react-hooks/exhaustive-deps
149
+ const jsonViewerStore = useMemo ( ( ) => createJsonViewerStore ( props ) , [ ] )
150
+ const typeRegistryStore = useMemo ( ( ) => createTypeRegistryStore ( ) , [ ] )
151
+
146
152
return (
147
153
< ThemeProvider theme = { theme } >
148
- < TypeRegistryProvider createStore = { createTypeRegistryStore } >
149
- < JsonViewerProvider createStore = { ( ) => {
150
- // This function only runs once, so we don't need a memo for this.
151
- // Refs: https://github.com./pmndrs/zustand/blob/77d14b17bc33a6f10f072802fac56aa78510710e/src/context.ts#L36-L38
152
- return createJsonViewerStore ( props )
153
- } } >
154
+ < TypeRegistryStoreContext . Provider value = { typeRegistryStore } >
155
+ < JsonViewerStoreContext . Provider value = { jsonViewerStore } >
154
156
< JsonViewerInner { ...mixedProps } />
155
- </ JsonViewerProvider >
156
- </ TypeRegistryProvider >
157
+ </ JsonViewerStoreContext . Provider >
158
+ </ TypeRegistryStoreContext . Provider >
157
159
</ ThemeProvider >
158
160
)
159
161
}
0 commit comments