From f65a91dfedfd565769aae244826513fdf834831f Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Fri, 22 Mar 2019 11:58:14 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B4=20ServerStorage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reader/ServerStorage/ServerStorage.vue | 49 ++++++++++++++++++- client/components/Reader/share/bookManager.js | 37 +++++++++----- 2 files changed, 73 insertions(+), 13 deletions(-) diff --git a/client/components/Reader/ServerStorage/ServerStorage.vue b/client/components/Reader/ServerStorage/ServerStorage.vue index 5b531978..f4ea2a3f 100644 --- a/client/components/Reader/ServerStorage/ServerStorage.vue +++ b/client/components/Reader/ServerStorage/ServerStorage.vue @@ -57,6 +57,7 @@ class ServerStorage extends Vue { await this.serverStorageKeyChanged(); } await this.currentProfileChanged(); + await this.loadRecent(); } async generateNewServerStorageKey() { @@ -363,8 +364,8 @@ class ServerStorage extends Vue { recent.data = {}; this.oldRecent = _.cloneDeep(recent.data); - bookManager.setRecent(recent.data); - bookManager.setRecentRev(recent.rev); + await bookManager.setRecent(recent.data); + await bookManager.setRecentRev(recent.rev); this.notifySuccessIfNeeded(oldRev, recent.rev); } else { @@ -372,6 +373,50 @@ class ServerStorage extends Vue { } } + async saveRecent() { + if (!this.serverSyncEnabled || this.savingRecent) + return; + + const bm = bookManager; + + const diff = utils.getObjDiff(this.oldRecent, bm.recent); + if (utils.isEmptyObjDiff(diff)) + return; + + this.savingRecent = true; + try { + let result = {state: ''}; + let tries = 0; + while (result.state != 'success' && tries < maxSetTries) { + try { + result = await this.storageSet({recent: {rev: bm.recentRev + 1, data: bm.recent}}); + } catch(e) { + this.savingRecent = false; + this.error(`Ошибка соединения с сервером: (${e.message}). Изменения не сохранены.`); + return; + } + + if (result.state == 'reject') { + await this.loadRecent(true); + const newRecent = utils.applyObjDiff(bm.recent, diff); + await bm.setRecent(newRecent); + } + + tries++; + } + + if (tries >= maxSetTries) { + console.error(result); + this.error('Не удалось отправить данные на сервер. Данные не сохранены и могут быть перезаписаны.'); + } else { + this.oldRecent = _.cloneDeep(bm.recent); + await bm.setRecentRev(bm.recentRev + 1); + } + } finally { + this.savingRecent = false; + } + } + async storageCheck(items) { return await this.storageApi('check', items); } diff --git a/client/components/Reader/share/bookManager.js b/client/components/Reader/share/bookManager.js index 4f2d2d68..96843e95 100644 --- a/client/components/Reader/share/bookManager.js +++ b/client/components/Reader/share/bookManager.js @@ -36,8 +36,8 @@ class BookManager { this.recentLast = await bmCacheStore.getItem('recent-last'); if (this.recentLast) this.recent[this.recentLast.key] = this.recentLast; - this.recentRev = bmRecentStore.getItem('recent-rev') || 0; - this.recentLastRev = bmRecentStore.getItem('recent-last-rev') || 0; + this.recentRev = await bmRecentStore.getItem('recent-rev') || 0; + this.recentLastRev = await bmRecentStore.getItem('recent-last-rev') || 0; this.books = Object.assign({}, this.booksCached); this.recentChanged2 = true; @@ -355,20 +355,35 @@ class BookManager { return result; } - setRecent(newRecent) { - this.recent = newRecent; + async setRecent(newRecent) { + //this.recent = newRecent; + const mergedRecent = _.cloneDeep(this.recent); + + Object.assign(mergedRecent, newRecent); + for (const rec of Object.values(mergedRecent)) { + await bmRecentStore.setItem(rec.key, rec); + } + + this.recent = mergedRecent; + await bmCacheStore.setItem('recent', this.recent); + + this.recentLast = null; + await bmCacheStore.setItem('recent-last', null); + + this.mostRecentCached = null; + this.emit('recent-changed'); } - setRecentLast(newRecentLast) { - this.recentLast = newRecentLast; - } - - setRecentRev(newRecentRev) { - bmRecentStore.setItem('recent-rev', newRecentRev); + async setRecentRev(newRecentRev) { + await bmRecentStore.setItem('recent-rev', newRecentRev); this.recentRev = newRecentRev; } - setRecentLastRev(newRecentLastRev) { + async setRecentLast(newRecentLast) { + this.recentLast = newRecentLast; + } + + async setRecentLastRev(newRecentLastRev) { bmRecentStore.setItem('recent-last-rev', newRecentLastRev); this.recentLastRev = newRecentLastRev; }