From 712bf405bba22cde5163eed4d8a8a296ee6899f1 Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Sun, 17 Mar 2019 22:04:56 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D1=81?= =?UTF-8?q?=20ServerStorage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reader/ServerStorage/ServerStorage.vue | 83 +++++++++++++++++++ .../Reader/SettingsPage/SettingsPage.vue | 18 +++- client/store/modules/reader.js | 6 +- 3 files changed, 103 insertions(+), 4 deletions(-) diff --git a/client/components/Reader/ServerStorage/ServerStorage.vue b/client/components/Reader/ServerStorage/ServerStorage.vue index 27280df3..331d8610 100644 --- a/client/components/Reader/ServerStorage/ServerStorage.vue +++ b/client/components/Reader/ServerStorage/ServerStorage.vue @@ -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; diff --git a/client/components/Reader/SettingsPage/SettingsPage.vue b/client/components/Reader/SettingsPage/SettingsPage.vue index 7d650333..86ebf11d 100644 --- a/client/components/Reader/SettingsPage/SettingsPage.vue +++ b/client/components/Reader/SettingsPage/SettingsPage.vue @@ -99,7 +99,7 @@
Рекомендуется сохранить ключ в надежном месте, чтобы всегда иметь возможность восстановить настройки, например, после переустановки ОС или чистки/смены браузера.
- ПРЕДУПРЕЖДЕНИЕ! При утере ключа, НИКТО не сможет восстановить ваши настройки, т.к. все данные сжимаются + ПРЕДУПРЕЖДЕНИЕ! При утере ключа, НИКТО не сможет восстановить ваши данные, т.к. они сжимаются и шифруются ключом доступа перед отправкой на сервер.
@@ -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() { diff --git a/client/store/modules/reader.js b/client/store/modules/reader.js index 61c7973d..d885d731 100644 --- a/client/store/modules/reader.js +++ b/client/store/modules/reader.js @@ -183,6 +183,7 @@ const state = { profilesRev: 0, currentProfile: '', settings: Object.assign({}, settingDefaults), + settingsRev: {}, }; // getters @@ -213,7 +214,10 @@ const mutations = { }, setSettings(state, value) { state.settings = Object.assign({}, state.settings, value); - } + }, + setSettingsRev(state, value) { + state.settingsRev = Object.assign({}, state.settingsRev, value); + }, }; export default {