Работа с ServerStorage
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user