Browse Source

Работа над ServerStorage, попутный рефакторинг

Book Pauk 6 years ago
parent
commit
329ac44c11
2 changed files with 116 additions and 105 deletions
  1. 115 105
      client/components/Reader/Reader.vue
  2. 1 0
      client/components/Reader/share/bookManager.js

+ 115 - 105
client/components/Reader/Reader.vue

@@ -208,11 +208,10 @@ class Reader extends Vue {
         (async() => {
             await bookManager.init(this.settings);
             bookManager.addEventListener(this.bookManagerEvent);
-            await this.$refs.serverStorage.init();
 
             if (this.$root.rootRoute == '/reader') {
                 if (this.routeParamUrl) {
-                    this.loadBook({url: this.routeParamUrl, bookPos: this.routeParamPos});
+                    await this.loadBook({url: this.routeParamUrl, bookPos: this.routeParamPos});
                 } else {
                     this.loaderActive = true;
                 }
@@ -290,13 +289,22 @@ class Reader extends Vue {
     }
 
     bookManagerEvent(eventName) {
+        const serverStorage = this.$refs.serverStorage;
+        if (eventName == 'load-meta-finish') {
+            serverStorage.init();
+        }
+
         if (eventName == 'recent-changed') {
-            const oldBook = this.mostRecentBookReactive;
-            const newBook = bookManager.mostRecentBook();
+            (async() => {
+                const oldBook = this.mostRecentBookReactive;
+                const newBook = bookManager.mostRecentBook();
 
-            if (oldBook && newBook && oldBook.key != newBook.key) {
-                this.loadBook(newBook);
-            }
+                if (oldBook && newBook && oldBook.key != newBook.key) {
+                    await this.loadBook(newBook);
+                }
+
+                await serverStorage.saveRecent();
+            })();
         }
     }
 
@@ -649,7 +657,7 @@ class Reader extends Vue {
         return result;
     }
 
-    loadBook(opts) {
+    async loadBook(opts) {
         if (!opts || !opts.url) {
             this.mostRecentBook();
             return;
@@ -668,118 +676,120 @@ class Reader extends Vue {
         }
 
         this.progressActive = true;
-        this.$nextTick(async() => {
-            const progress = this.$refs.page;
-
-            this.actionList = [];
-            this.actionCur = -1;
-
-            try {
-                progress.show();
-                progress.setState({state: 'parse'});
-
-                // есть ли среди недавних
-                const key = bookManager.keyFromUrl(url);
-                let wasOpened = await bookManager.getRecentBook({key});
-                wasOpened = (wasOpened ? wasOpened : {});
-                const bookPos = (opts.bookPos !== undefined ? opts.bookPos : wasOpened.bookPos);
-                const bookPosSeen = (opts.bookPos !== undefined ? opts.bookPos : wasOpened.bookPosSeen);
-
-                let book = null;
-
-                if (!opts.force) {
-                    // пытаемся загрузить и распарсить книгу в менеджере из локального кэша
-                    const bookParsed = await bookManager.getBook({url}, (prog) => {
-                        progress.setState({progress: prog});
-                    });
-
-                    // если есть в локальном кэше
-                    if (bookParsed) {
-                        await bookManager.setRecentBook(Object.assign({bookPos, bookPosSeen}, bookParsed));
-                        this.mostRecentBook();
-                        this.addAction(bookPos);
-                        this.loaderActive = false;
-                        progress.hide(); this.progressActive = false;
-                        this.blinkCachedLoadMessage();
-
-                        await this.activateClickMapPage();
-                        return;
-                    }
 
-                    // иначе идем на сервер
-                    // пытаемся загрузить готовый файл с сервера
-                    if (wasOpened.path) {
-                        try {
-                            const resp = await readerApi.loadCachedBook(wasOpened.path, (state) => {
-                                progress.setState(state);
-                            });
-                            book = Object.assign({}, wasOpened, {data: resp.data});
-                        } catch (e) {
-                            //молчим
-                        }
-                    }
-                }
+        await this.$nextTick()
 
-                progress.setState({totalSteps: 5});
+        const progress = this.$refs.page;
 
-                // не удалось, скачиваем книгу полностью с конвертацией
-                let loadCached = true;
-                if (!book) {
-                    book = await readerApi.loadBook(url, (state) => {
-                        progress.setState(state);
-                    });
-                    loadCached = false;
-                }
+        this.actionList = [];
+        this.actionCur = -1;
+
+        try {
+            progress.show();
+            progress.setState({state: 'parse'});
+
+            // есть ли среди недавних
+            const key = bookManager.keyFromUrl(url);
+            let wasOpened = await bookManager.getRecentBook({key});
+            wasOpened = (wasOpened ? wasOpened : {});
+            const bookPos = (opts.bookPos !== undefined ? opts.bookPos : wasOpened.bookPos);
+            const bookPosSeen = (opts.bookPos !== undefined ? opts.bookPos : wasOpened.bookPosSeen);
 
-                // добавляем в bookManager
-                progress.setState({state: 'parse', step: 5});
-                const addedBook = await bookManager.addBook(book, (prog) => {
+            let book = null;
+
+            if (!opts.force) {
+                // пытаемся загрузить и распарсить книгу в менеджере из локального кэша
+                const bookParsed = await bookManager.getBook({url}, (prog) => {
                     progress.setState({progress: prog});
                 });
 
-                // добавляем в историю
-                await bookManager.setRecentBook(Object.assign({bookPos, bookPosSeen}, addedBook));
-                this.mostRecentBook();
-                this.addAction(bookPos);
-                this.updateRoute(true);
-
-                this.loaderActive = false;
-                progress.hide(); this.progressActive = false;
-                if (loadCached) {
+                // если есть в локальном кэше
+                if (bookParsed) {
+                    await bookManager.setRecentBook(Object.assign({bookPos, bookPosSeen}, bookParsed));
+                    this.mostRecentBook();
+                    this.addAction(bookPos);
+                    this.loaderActive = false;
+                    progress.hide(); this.progressActive = false;
                     this.blinkCachedLoadMessage();
-                } else
-                    this.stopBlink = true;
-
-                await this.activateClickMapPage();
-            } catch (e) {
-                progress.hide(); this.progressActive = false;
-                this.loaderActive = true;
-                this.$alert(e.message, 'Ошибка', {type: 'error'});
+
+                    await this.activateClickMapPage();
+                    return;
+                }
+
+                // иначе идем на сервер
+                // пытаемся загрузить готовый файл с сервера
+                if (wasOpened.path) {
+                    try {
+                        const resp = await readerApi.loadCachedBook(wasOpened.path, (state) => {
+                            progress.setState(state);
+                        });
+                        book = Object.assign({}, wasOpened, {data: resp.data});
+                    } catch (e) {
+                        //молчим
+                    }
+                }
             }
-        });
-    }
 
-    loadFile(opts) {
-        this.progressActive = true;
-        this.$nextTick(async() => {
-            const progress = this.$refs.page;
-            try {
-                progress.show();
-                progress.setState({state: 'upload'});
+            progress.setState({totalSteps: 5});
 
-                const url = await readerApi.uploadFile(opts.file, this.config.maxUploadFileSize, (state) => {
+            // не удалось, скачиваем книгу полностью с конвертацией
+            let loadCached = true;
+            if (!book) {
+                book = await readerApi.loadBook(url, (state) => {
                     progress.setState(state);
                 });
+                loadCached = false;
+            }
 
-                progress.hide(); this.progressActive = false;
+            // добавляем в bookManager
+            progress.setState({state: 'parse', step: 5});
+            const addedBook = await bookManager.addBook(book, (prog) => {
+                progress.setState({progress: prog});
+            });
 
-                this.loadBook({url});
-            } catch (e) {
-                progress.hide(); this.progressActive = false;
-                this.loaderActive = true;
-                this.$alert(e.message, 'Ошибка', {type: 'error'});
-            }
-        });
+            // добавляем в историю
+            await bookManager.setRecentBook(Object.assign({bookPos, bookPosSeen}, addedBook));
+            this.mostRecentBook();
+            this.addAction(bookPos);
+            this.updateRoute(true);
+
+            this.loaderActive = false;
+            progress.hide(); this.progressActive = false;
+            if (loadCached) {
+                this.blinkCachedLoadMessage();
+            } else
+                this.stopBlink = true;
+
+            await this.activateClickMapPage();
+        } catch (e) {
+            progress.hide(); this.progressActive = false;
+            this.loaderActive = true;
+            this.$alert(e.message, 'Ошибка', {type: 'error'});
+        }
+    }
+
+    async loadFile(opts) {
+        this.progressActive = true;
+
+        await this.$nextTick();
+
+        const progress = this.$refs.page;
+        try {
+            progress.show();
+            progress.setState({state: 'upload'});
+
+            const url = await readerApi.uploadFile(opts.file, this.config.maxUploadFileSize, (state) => {
+                progress.setState(state);
+            });
+
+            progress.hide(); this.progressActive = false;
+
+            await this.loadBook({url});
+        } catch (e) {
+            progress.hide(); this.progressActive = false;
+            this.loaderActive = true;
+            this.$alert(e.message, 'Ошибка', {type: 'error'});
+        }
     }
 
     blinkCachedLoadMessage() {

+ 1 - 0
client/components/Reader/share/bookManager.js

@@ -107,6 +107,7 @@ class BookManager {
         }
         await bmCacheStore.setItem('books', this.booksCached);
         await bmCacheStore.setItem('recent', this.recent);
+        this.emit('load-meta-finish');
     }
 
     async cleanBooks() {