Skip to content

Commit c838307

Browse files
authored
fix: input toggles dont use localStorage (#450)
* fix: dont use local storage for text config items * fix: input toggles dont use localStorage * fix: input-toggle uses resetKey * fix: do not use broadcast channels to tell sw to update config * chore: fix build * chore: dont set debug var by default
1 parent aab3c00 commit c838307

File tree

13 files changed

+156
-313
lines changed

13 files changed

+156
-313
lines changed
File renamed without changes.

src/components/input-toggle.tsx

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/**
2+
Inspiration from https://dev.to/codebubb/create-a-simple-on-off-slide-toggle-with-css-db8
3+
*/
4+
import React, { useEffect, useMemo, useState } from 'react'
5+
import './input-toggle.css'
6+
import { InputDescription } from './input-description.js'
7+
import { InputLabel } from './input-label.js'
8+
9+
interface LocalStorageToggleProps {
10+
label: string
11+
value: boolean
12+
description?: string
13+
className?: string
14+
onClick?: React.MouseEventHandler<HTMLDivElement>
15+
onChange(value: boolean): void
16+
resetKey: number
17+
}
18+
19+
export const InputToggle: React.FC<LocalStorageToggleProps> = ({
20+
label,
21+
description = '',
22+
value,
23+
resetKey,
24+
onChange,
25+
...props
26+
}) => {
27+
const [internalValue, setInternalValue] = useState(value)
28+
29+
useEffect(() => {
30+
setInternalValue(value)
31+
}, [resetKey, value])
32+
/**
33+
* Lowercase and no spaces
34+
*/
35+
const id: string = useMemo(() => {
36+
return label.toLowerCase().replace(/\s/g, '-')
37+
}, [label])
38+
39+
const handleChange = (event: React.ChangeEvent<HTMLInputElement>): void => {
40+
const newValue = event.target.checked
41+
setInternalValue(newValue)
42+
onChange(newValue)
43+
}
44+
45+
return (
46+
<div {...props} className={`${props.className}`}>
47+
<InputLabel label={label} />
48+
<InputDescription description={description} />
49+
50+
<input
51+
type="checkbox"
52+
id={id}
53+
checked={internalValue}
54+
onChange={handleChange}
55+
className="dn"
56+
/>
57+
<label
58+
htmlFor={id}
59+
className={`relative dib h1 w2 flex-shrink-0 pointer br4 ${
60+
internalValue ? 'bg-green' : 'bg-dark-gray'
61+
} transition-all duration-200 ease-in-out`}
62+
>
63+
<span
64+
className={`absolute top-0 left-0 dib h1 w1 br-100 bg-white shadow-1 ${
65+
internalValue ? 'translate-x-100' : 'translate-x-0'
66+
} transition-transform duration-200 ease-in-out`}
67+
/>
68+
</label>
69+
</div>
70+
)
71+
}

src/components/local-storage-toggle.tsx

Lines changed: 0 additions & 76 deletions
This file was deleted.

src/context/config-context.tsx

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { createContext, useCallback, useEffect, useState } from 'react'
2-
import { getConfig, type ConfigDb } from '../lib/config-db.js'
2+
import { defaultDnsJsonResolvers, defaultEnableGatewayProviders, defaultEnableRecursiveGateways, defaultEnableWebTransport, defaultEnableWss, defaultGateways, defaultRouters, getConfig, resetConfig, type ConfigDb } from '../lib/config-db.js'
33
import { isConfigPage } from '../lib/is-config-page.js'
44
import { getUiComponentLogger } from '../lib/logger.js'
55

@@ -10,12 +10,14 @@ export interface ConfigContextType extends ConfigDb {
1010
isConfigExpanded: boolean
1111
setConfigExpanded(value: boolean): void
1212
setConfig(key: ConfigKey, value: any): void
13+
resetConfig(): Promise<void>
1314
}
1415

1516
export const ConfigContext = createContext<ConfigContextType>({
1617
isConfigExpanded: isLoadedInIframe,
1718
setConfigExpanded: (value: boolean) => {},
1819
setConfig: (key, value) => {},
20+
resetConfig: async () => Promise.resolve(),
1921
gateways: [],
2022
routers: [],
2123
dnsJsonResolvers: {},
@@ -28,30 +30,36 @@ export const ConfigContext = createContext<ConfigContextType>({
2830

2931
export const ConfigProvider = ({ children }: { children: JSX.Element[] | JSX.Element, expanded?: boolean }): JSX.Element => {
3032
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)
33+
const [gateways, setGateways] = useState<string[]>(defaultGateways)
34+
const [routers, setRouters] = useState<string[]>(defaultRouters)
35+
const [dnsJsonResolvers, setDnsJsonResolvers] = useState<Record<string, string>>(defaultDnsJsonResolvers)
36+
const [enableWss, setEnableWss] = useState(defaultEnableWss)
37+
const [enableWebTransport, setEnableWebTransport] = useState(defaultEnableWebTransport)
38+
const [enableGatewayProviders, setEnableGatewayProviders] = useState(defaultEnableGatewayProviders)
39+
const [enableRecursiveGateways, setEnableRecursiveGateways] = useState(defaultEnableRecursiveGateways)
3840
const [debug, setDebug] = useState('')
3941
const isExplicitlyLoadedConfigPage = isConfigPage(window.location.hash)
42+
const logger = getUiComponentLogger('config-context')
43+
const log = logger.forComponent('main')
44+
45+
async function loadConfig (): Promise<void> {
46+
const config = await getConfig(logger)
47+
setGateways(config.gateways)
48+
setRouters(config.routers)
49+
setDnsJsonResolvers(config.dnsJsonResolvers)
50+
setEnableWss(config.enableWss)
51+
setEnableWebTransport(config.enableWebTransport)
52+
setEnableGatewayProviders(config.enableGatewayProviders)
53+
setEnableRecursiveGateways(config.enableRecursiveGateways)
54+
setDebug(config.debug)
55+
}
4056
/**
4157
* We need to make sure that the configDb types are loaded with the values from IDB
4258
*/
4359
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-
})()
60+
void loadConfig().catch((err) => {
61+
log.error('Error loading config', err)
62+
})
5563
}, [])
5664

5765
/**
@@ -84,10 +92,16 @@ export const ConfigProvider = ({ children }: { children: JSX.Element[] | JSX.Ele
8492
setDebug(value)
8593
break
8694
default:
95+
log.error(`Unknown config key: ${key}`)
8796
throw new Error(`Unknown config key: ${key}`)
8897
}
8998
}, [])
9099

100+
const resetConfigLocal = async (): Promise<void> => {
101+
await resetConfig()
102+
await loadConfig()
103+
}
104+
91105
const setConfigExpandedWrapped = (value: boolean): void => {
92106
if (isLoadedInIframe || isExplicitlyLoadedConfigPage) {
93107
// ignore it
@@ -97,7 +111,7 @@ export const ConfigProvider = ({ children }: { children: JSX.Element[] | JSX.Ele
97111
}
98112

99113
return (
100-
<ConfigContext.Provider value={{ isConfigExpanded, setConfigExpanded: setConfigExpandedWrapped, setConfig: setConfigLocal, gateways, routers, dnsJsonResolvers, enableWss, enableWebTransport, enableGatewayProviders, enableRecursiveGateways, debug }}>
114+
<ConfigContext.Provider value={{ isConfigExpanded, setConfigExpanded: setConfigExpandedWrapped, setConfig: setConfigLocal, resetConfig: resetConfigLocal, gateways, routers, dnsJsonResolvers, enableWss, enableWebTransport, enableGatewayProviders, enableRecursiveGateways, debug }}>
101115
{children}
102116
</ConfigContext.Provider>
103117
)

src/lib/channel.ts

Lines changed: 0 additions & 120 deletions
This file was deleted.

src/lib/common.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,3 @@ export enum COLORS {
44
success = '#0cb892',
55
error = '#ea5037'
66
}
7-
8-
export enum ChannelActions {
9-
RELOAD_CONFIG = 'RELOAD_CONFIG',
10-
RELOAD_CONFIG_SUCCESS = 'RELOAD_CONFIG_SUCCESS'
11-
}

0 commit comments

Comments
 (0)