1
- import React , { createContext , useState } from 'react'
1
+ import React , { createContext , useCallback , useEffect , useState } from 'react'
2
+ import { getConfig , type ConfigDb } from '../lib/config-db.js'
2
3
import { isConfigPage } from '../lib/is-config-page.js'
4
+ import { getUiComponentLogger } from '../lib/logger.js'
3
5
4
6
const isLoadedInIframe = window . self !== window . top
5
7
6
- export const ConfigContext = createContext ( {
8
+ type ConfigKey = keyof ConfigDb
9
+ export interface ConfigContextType extends ConfigDb {
10
+ isConfigExpanded : boolean
11
+ setConfigExpanded ( value : boolean ) : void
12
+ setConfig ( key : ConfigKey , value : any ) : void
13
+ }
14
+
15
+ export const ConfigContext = createContext < ConfigContextType > ( {
7
16
isConfigExpanded : isLoadedInIframe ,
8
- setConfigExpanded : ( value : boolean ) => { }
17
+ setConfigExpanded : ( value : boolean ) => { } ,
18
+ setConfig : ( key , value ) => { } ,
19
+ gateways : [ ] ,
20
+ routers : [ ] ,
21
+ dnsJsonResolvers : { } ,
22
+ enableWss : false ,
23
+ enableWebTransport : false ,
24
+ enableGatewayProviders : false ,
25
+ enableRecursiveGateways : false ,
26
+ debug : ''
9
27
} )
10
28
11
29
export const ConfigProvider = ( { children } : { children : JSX . Element [ ] | JSX . Element , expanded ?: boolean } ) : JSX . Element => {
12
30
const [ isConfigExpanded , setConfigExpanded ] = useState ( isConfigPage ( window . location . hash ) )
31
+ const [ gateways , setGateways ] = useState < string [ ] > ( [ ] )
32
+ const [ routers , setRouters ] = useState < string [ ] > ( [ ] )
33
+ const [ dnsJsonResolvers , setDnsJsonResolvers ] = useState < Record < string , string > > ( { } )
34
+ const [ enableWss , setEnableWss ] = useState ( false )
35
+ const [ enableWebTransport , setEnableWebTransport ] = useState ( false )
36
+ const [ enableGatewayProviders , setEnableGatewayProviders ] = useState ( false )
37
+ const [ enableRecursiveGateways , setEnableRecursiveGateways ] = useState ( false )
38
+ const [ debug , setDebug ] = useState ( '' )
13
39
const isExplicitlyLoadedConfigPage = isConfigPage ( window . location . hash )
40
+ /**
41
+ * We need to make sure that the configDb types are loaded with the values from IDB
42
+ */
43
+ useEffect ( ( ) => {
44
+ void ( async ( ) => {
45
+ const config = await getConfig ( getUiComponentLogger ( 'config-context' ) )
46
+ setGateways ( config . gateways )
47
+ setRouters ( config . routers )
48
+ setDnsJsonResolvers ( config . dnsJsonResolvers )
49
+ setEnableWss ( config . enableWss )
50
+ setEnableWebTransport ( config . enableWebTransport )
51
+ setEnableGatewayProviders ( config . enableGatewayProviders )
52
+ setEnableRecursiveGateways ( config . enableRecursiveGateways )
53
+ setDebug ( config . debug )
54
+ } ) ( )
55
+ } , [ ] )
56
+
57
+ /**
58
+ * Sets the config values for the context provider. To save to IDB, use the `setConfig` function from `lib/config-db.ts`.
59
+ */
60
+ const setConfigLocal = useCallback ( ( key : ConfigKey , value : any ) => {
61
+ switch ( key ) {
62
+ case 'gateways' :
63
+ setGateways ( value )
64
+ break
65
+ case 'routers' :
66
+ setRouters ( value )
67
+ break
68
+ case 'dnsJsonResolvers' :
69
+ setDnsJsonResolvers ( value )
70
+ break
71
+ case 'enableWss' :
72
+ setEnableWss ( value )
73
+ break
74
+ case 'enableWebTransport' :
75
+ setEnableWebTransport ( value )
76
+ break
77
+ case 'enableGatewayProviders' :
78
+ setEnableGatewayProviders ( value )
79
+ break
80
+ case 'enableRecursiveGateways' :
81
+ setEnableRecursiveGateways ( value )
82
+ break
83
+ case 'debug' :
84
+ setDebug ( value )
85
+ break
86
+ default :
87
+ throw new Error ( `Unknown config key: ${ key } ` )
88
+ }
89
+ } , [ ] )
14
90
15
91
const setConfigExpandedWrapped = ( value : boolean ) : void => {
16
92
if ( isLoadedInIframe || isExplicitlyLoadedConfigPage ) {
@@ -21,7 +97,7 @@ export const ConfigProvider = ({ children }: { children: JSX.Element[] | JSX.Ele
21
97
}
22
98
23
99
return (
24
- < ConfigContext . Provider value = { { isConfigExpanded, setConfigExpanded : setConfigExpandedWrapped } } >
100
+ < ConfigContext . Provider value = { { isConfigExpanded, setConfigExpanded : setConfigExpandedWrapped , setConfig : setConfigLocal , gateways , routers , dnsJsonResolvers , enableWss , enableWebTransport , enableGatewayProviders , enableRecursiveGateways , debug } } >
25
101
{ children }
26
102
</ ConfigContext . Provider >
27
103
)
0 commit comments