Browse Source

Работа над ServerStorage

Book Pauk 6 năm trước cách đây
mục cha
commit
f65a91dfed

+ 47 - 2
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);
     }

+ 25 - 10
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);
 
-    setRecentLast(newRecentLast) {
-        this.recentLast = newRecentLast;
+        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');
     }
 
-    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;
     }