Compare commits

...

2 commits

Author SHA1 Message Date
1f2c96a485 Merge pull request 'Fix setting restore from file' (#406) from Oneric/akkoma-fe:fix-file-restore into develop
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #406
2024-08-25 09:07:18 +00:00
e274adf47d 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
2024-07-06 01:59:42 +02:00

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')
} }