Fix setting restore from file
All checks were successful
ci/woodpecker/pr/woodpecker Pipeline was successful

Previously restoring from file would also restore the old version value
breaking upload of the new settings to the server.

Additionallly it didn’t even attempt to sync settings after restore and
was insufferably slow due to individually updating every single setting
with a dispatch. Instead only update changed settings like on server
syncs which usually speeds the process up considerably.

Fixes: #405
This commit is contained in:
Oneric 2024-07-06 01:55:53 +02:00
parent 8765491399
commit e274adf47d

View file

@ -22,7 +22,7 @@ export const multiChoiceProperties = [
export const defaultState = { export const defaultState = {
profile: 'default', profile: 'default',
profileVersion: 0, profileVersion: 0, // internal fe copy of server-side version
expertLevel: 0, // used to track which settings to show and hide expertLevel: 0, // used to track which settings to show and hide
colors: {}, colors: {},
theme: undefined, theme: undefined,
@ -127,6 +127,21 @@ export const instanceDefaultProperties = Object.entries(defaultState)
.filter(([key, value]) => value === undefined) .filter(([key, value]) => value === undefined)
.map(([key, value]) => key) .map(([key, value]) => key)
function updateLocalSettings(store, settingEntries, version = null) {
if (version == null)
version = store.state.profileVersion
settingEntries.forEach(([name, value]) => {
if (store.state[name] !== value) {
store.dispatch('setOption', { name, value })
}
})
// Set this at the end to override any potentially stored profileVersion
store.commit('setOption', { name: 'profileVersion', value: version })
}
const config = { const config = {
state: { ...defaultState }, state: { ...defaultState },
getters: { getters: {
@ -198,19 +213,17 @@ const config = {
store.dispatch('listSettingsProfiles') store.dispatch('listSettingsProfiles')
}) })
}, },
loadSettings ({ dispatch }, data) { loadSettings (store, data) {
const knownKeys = new Set(Object.keys(defaultState)) const knownKeys = new Set(Object.keys(defaultState))
const presentKeys = new Set(Object.keys(data))
const intersection = new Set()
for (let elem of presentKeys) {
if (knownKeys.has(elem)) {
intersection.add(elem)
}
}
intersection.forEach( // Limit to supported properties
name => dispatch('setOption', { name, value: data[name] }) const newSettingEntries =
) Object.entries(data)
.filter(([key, value]) => knownKeys.has(key))
// disregard stored profileVersion; sync afterwards increases previous version
updateLocalSettings(store, newSettingEntries, null)
store.dispatch('syncSettings')
}, },
setHighlight ({ commit, dispatch }, { user, color, type }) { setHighlight ({ commit, dispatch }, { user, color, type }) {
commit('setHighlight', { user, color, type }) commit('setHighlight', { user, color, type })
@ -244,12 +257,7 @@ const config = {
.then(({ settings, version }) => { .then(({ settings, version }) => {
console.log('found settings version', version) console.log('found settings version', version)
if (forceUpdate || (version > store.state.profileVersion)) { if (forceUpdate || (version > store.state.profileVersion)) {
store.commit('setOption', { name: 'profileVersion', value: version }) updateLocalSettings(store, Object.entries(settings), version)
Object.entries(settings).forEach(([name, value]) => {
if (store.state[name] !== value) {
store.dispatch('setOption', { name, value })
}
})
} else { } else {
console.log('settings are up to date') console.log('settings are up to date')
} }