forked from AkkomaGang/akkoma-fe
Fix setting restore from file
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: AkkomaGang/akkoma-fe#405
This commit is contained in:
parent
8765491399
commit
e274adf47d
1 changed files with 26 additions and 18 deletions
|
@ -22,7 +22,7 @@ export const multiChoiceProperties = [
|
|||
|
||||
export const defaultState = {
|
||||
profile: 'default',
|
||||
profileVersion: 0,
|
||||
profileVersion: 0, // internal fe copy of server-side version
|
||||
expertLevel: 0, // used to track which settings to show and hide
|
||||
colors: {},
|
||||
theme: undefined,
|
||||
|
@ -127,6 +127,21 @@ export const instanceDefaultProperties = Object.entries(defaultState)
|
|||
.filter(([key, value]) => value === undefined)
|
||||
.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 = {
|
||||
state: { ...defaultState },
|
||||
getters: {
|
||||
|
@ -198,19 +213,17 @@ const config = {
|
|||
store.dispatch('listSettingsProfiles')
|
||||
})
|
||||
},
|
||||
loadSettings ({ dispatch }, data) {
|
||||
loadSettings (store, data) {
|
||||
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(
|
||||
name => dispatch('setOption', { name, value: data[name] })
|
||||
)
|
||||
// Limit to supported properties
|
||||
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 }) {
|
||||
commit('setHighlight', { user, color, type })
|
||||
|
@ -244,12 +257,7 @@ const config = {
|
|||
.then(({ settings, version }) => {
|
||||
console.log('found settings version', version)
|
||||
if (forceUpdate || (version > store.state.profileVersion)) {
|
||||
store.commit('setOption', { name: 'profileVersion', value: version })
|
||||
Object.entries(settings).forEach(([name, value]) => {
|
||||
if (store.state[name] !== value) {
|
||||
store.dispatch('setOption', { name, value })
|
||||
}
|
||||
})
|
||||
updateLocalSettings(store, Object.entries(settings), version)
|
||||
} else {
|
||||
console.log('settings are up to date')
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue