@@ -3,19 +3,20 @@ import {
33 ThemeProvider
44} from '@mui/material'
55import type { FC , ReactElement } from 'react'
6- import { useCallback , useEffect , useMemo , useRef } from 'react'
6+ import { useCallback , useContext , useEffect , useMemo , useRef } from 'react'
77
88import { DataKeyPair } from './components/DataKeyPair'
99import { useThemeDetector } from './hooks/useThemeDetector'
1010import {
1111 createJsonViewerStore ,
12- JsonViewerProvider ,
13- useJsonViewerStore ,
14- useJsonViewerStoreApi
12+ JsonViewerStoreContext ,
13+ useJsonViewerStore
1514} from './stores/JsonViewerStore'
1615import {
17- createTypeRegistryStore , predefined ,
18- TypeRegistryProvider , useTypeRegistryStore
16+ createTypeRegistryStore ,
17+ predefined ,
18+ TypeRegistryStoreContext ,
19+ useTypeRegistryStore
1920} from './stores/typeRegistry'
2021import { darkColorspace , lightColorspace } from './theme/base16'
2122import type { JsonViewerProps } from './type'
@@ -30,21 +31,21 @@ function useSetIfNotUndefinedEffect<Key extends keyof JsonViewerProps> (
3031 key : Key ,
3132 value : JsonViewerProps [ Key ] | undefined
3233) {
33- const api = useJsonViewerStoreApi ( )
34+ const { setState } = useContext ( JsonViewerStoreContext )
3435 useEffect ( ( ) => {
3536 if ( value !== undefined ) {
36- api . setState ( {
37+ setState ( {
3738 [ key ] : value
3839 } )
3940 }
40- } , [ key , value , api ] )
41+ } , [ key , value , setState ] )
4142}
4243
4344/**
4445 * @internal
4546 */
4647const JsonViewerInner : FC < JsonViewerProps > = ( props ) => {
47- const api = useJsonViewerStoreApi ( )
48+ const { setState } = useContext ( JsonViewerStoreContext )
4849 useSetIfNotUndefinedEffect ( 'value' , props . value )
4950 useSetIfNotUndefinedEffect ( 'editable' , props . editable )
5051 useSetIfNotUndefinedEffect ( 'indentWidth' , props . indentWidth )
@@ -60,19 +61,19 @@ const JsonViewerInner: FC<JsonViewerProps> = (props) => {
6061 useSetIfNotUndefinedEffect ( 'onSelect' , props . onSelect )
6162 useEffect ( ( ) => {
6263 if ( props . theme === 'light' ) {
63- api . setState ( {
64+ setState ( {
6465 colorspace : lightColorspace
6566 } )
6667 } else if ( props . theme === 'dark' ) {
67- api . setState ( {
68+ setState ( {
6869 colorspace : darkColorspace
6970 } )
7071 } else if ( typeof props . theme === 'object' ) {
71- api . setState ( {
72+ setState ( {
7273 colorspace : props . theme
7374 } )
7475 }
75- } , [ api , props . theme ] )
76+ } , [ setState , props . theme ] )
7677 const onceRef = useRef ( true )
7778 const predefinedTypes = useMemo ( ( ) => predefined ( ) , [ ] )
7879 const registerTypes = useTypeRegistryStore ( store => store . registerTypes )
@@ -143,17 +144,18 @@ export const JsonViewer = function JsonViewer<Value> (props: JsonViewerProps<Val
143144 } )
144145 } , [ themeType ] )
145146 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+
146152 return (
147153 < 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 } >
154156 < JsonViewerInner { ...mixedProps } />
155- </ JsonViewerProvider >
156- </ TypeRegistryProvider >
157+ </ JsonViewerStoreContext . Provider >
158+ </ TypeRegistryStoreContext . Provider >
157159 </ ThemeProvider >
158160 )
159161}
0 commit comments