fix: inconsistent state of save button in admin config page

Massimo Melina committed Feb 6, 2022 at 11:38 UTC ec4e574a4e01eecc73aaf69b78d2f1fe0a7daa2c
1 file changed +13 -11
admin/src/ConfigPage.ts
+13 -11
@@ -10,15 +10,7 @@ import StringStringField from './StringStringField'
10
11 let loaded: Dict | undefined
12
13 -subscribeKey(state, 'config', () => {
14 - const changes: Dict = {}
15 - if (state.config)
16 - for (const [k, v] of Object.entries(state.config))
17 - if (JSON.stringify(v) !== JSON.stringify(loaded?.[k]))
18 - changes[k] = v
19 - state.changes = changes
20 - console.debug('changes', Object.keys(changes))
21 -})
13 +subscribeKey(state, 'config', recalculateChanges)
14
15 export default function ConfigPage() {
16 const [res, reload] = useApiComp('get_config', {
@@ -77,8 +69,18 @@ export default function ConfigPage() {
69
70 async function save() {
71 await apiCall('set_config', { values: state.changes })
80 - Object.assign(state.config, state.changes)
81 - Object.assign(loaded, state.config)
72 + Object.assign(loaded, state.changes) // since changes are recalculated subscribing state.config, but it depends on 'loaded' to (which cannot be subscribed), be sure to update loaded first
73 + recalculateChanges()
74 console.debug('saved')
75 }
76 }
77 +
78 +function recalculateChanges() {
79 + const changes: Dict = {}
80 + if (state.config)
81 + for (const [k, v] of Object.entries(state.config))
82 + if (JSON.stringify(v) !== JSON.stringify(loaded?.[k]))
83 + changes[k] = v
84 + state.changes = changes
85 + console.debug('changes', Object.keys(changes))
86 +}