Работа с ServerStorage

This commit is contained in:
Book Pauk
2019-03-17 22:04:56 +07:00
parent 3a46a157f9
commit 712bf405bb
3 changed files with 103 additions and 4 deletions

View File

@@ -20,9 +20,15 @@ export default @Component({
serverStorageKey: function() {
this.serverStorageKeyChanged();
},
settings: function() {
this.saveSettings();
},
profiles: function() {
this.saveProfiles();
},
currentProfile: function() {
this.currentProfileChanged();
},
},
})
class ServerStorage extends Vue {
@@ -30,6 +36,9 @@ class ServerStorage extends Vue {
this.commit = this.$store.commit;
this.prevServerStorageKey = null;
this.$root.$on('generateNewServerStorageKey', () => {this.generateNewServerStorageKey()});
this.oldProfiles = {};
this.oldSettings = {};
}
async init() {
@@ -39,6 +48,7 @@ class ServerStorage extends Vue {
} else {
await this.serverStorageKeyChanged();
}
await this.currentProfileChanged();
}
async serverStorageKeyChanged() {
@@ -51,6 +61,13 @@ class ServerStorage extends Vue {
}
}
async currentProfileChanged() {
if (!this.currentProfile)
return;
await this.loadSettings();
}
get serverSyncEnabled() {
return this.$store.state.reader.serverSyncEnabled;
}
@@ -59,6 +76,10 @@ class ServerStorage extends Vue {
return this.$store.state.reader.settings;
}
get settingsRev() {
return this.$store.state.reader.settingsRev;
}
get serverStorageKey() {
return this.$store.state.reader.serverStorageKey;
}
@@ -94,6 +115,68 @@ class ServerStorage extends Vue {
this.$notify.error({message});
}
async loadSettings() {
if (!this.serverSyncEnabled || !this.currentProfile)
return;
const setsId = `settings-${this.currentProfile}`;
let sets = await this.storageGet({[setsId]: {}});
if (sets.state == 'success') {
const oldRev = this.settingsRev[setsId] || 0;
sets = sets.items[setsId];
if (sets.rev == 0)
sets.data = {};
this.oldSettings = sets.data;
this.commit('reader/setSettings', sets.data);
this.commit('reader/setSettingsRev', {[setsId]: sets.rev});
this.notifySuccessIfNeeded(oldRev, sets.rev);
} else {
this.warning(`Неверный ответ сервера: ${sets.state}`);
}
}
async saveSettings() {
if (!this.serverSyncEnabled || !this.currentProfile || this.savingSettings)
return;
const diff = utils.getObjDiff(this.oldSettings, this.settings);
if (utils.isEmptyObjDiff(diff))
return;
this.savingSettings = true;
try {
const setsId = `settings-${this.currentProfile}`;
let result = {state: ''};
let tries = 0;
while (result.state != 'success' && tries < maxSetTries) {
const oldRev = this.settingsRev[setsId] || 0;
result = await this.storageSet({[setsId]: {rev: oldRev + 1, data: this.settings}});
if (result.state == 'reject') {
await this.loadSettings();
const newSettings = utils.applyObjDiff(this.settings, diff);
this.commit('reader/setSettings', newSettings);
}
tries++;
}
if (tries >= maxSetTries) {
this.commit('reader/setSettings', this.oldSettings);
this.error('Не удалось отправить данные на сервер');
} else {
this.oldSettings = this.settings;
this.commit('reader/setSettingsRev', {[setsId]: this.settingsRev[setsId] + 1});
}
} finally {
this.savingSettings = false;
}
}
async loadProfiles() {
if (!this.serverSyncEnabled)
return;

View File

@@ -99,7 +99,7 @@
<div class="text">
Рекомендуется сохранить ключ в надежном месте, чтобы всегда иметь возможность восстановить настройки,
например, после переустановки ОС или чистки/смены браузера.<br>
<b>ПРЕДУПРЕЖДЕНИЕ!</b> При утере ключа, НИКТО не сможет восстановить ваши настройки, т.к. все данные сжимаются
<b>ПРЕДУПРЕЖДЕНИЕ!</b> При утере ключа, НИКТО не сможет восстановить ваши данные, т.к. они сжимаются
и шифруются ключом доступа перед отправкой на сервер.
</div>
</el-form-item>
@@ -454,7 +454,7 @@
//-----------------------------------------------------------------------------
import Vue from 'vue';
import Component from 'vue-class-component';
//import _ from 'lodash';
import _ from 'lodash';
import {copyTextToClipboard} from '../../../share/utils';
import Window from '../../share/Window.vue';
@@ -468,6 +468,9 @@ export default @Component({
return Object.assign({}, rstore.settingDefaults);
},
watch: {
settings: function() {
this.settingsChanged();
},
form: function(newValue) {
this.commit('reader/setSettings', newValue);
},
@@ -508,6 +511,13 @@ class SettingsPage extends Vue {
this.commit = this.$store.commit;
this.reader = this.$store.state.reader;
this.form = {};
this.settingsChanged();
}
settingsChanged() {
if (_.isEqual(this.form, this.settings))
return;
this.form = Object.assign({}, this.settings);
for (let prop in rstore.settingDefaults) {
this[prop] = this.form[prop];
@@ -545,7 +555,9 @@ class SettingsPage extends Vue {
}
get profilesArray() {
return Object.keys(this.profiles);
const result = Object.keys(this.profiles)
result.sort();
return result;
}
get currentProfile() {