From 7efae6315cd365ea4212f3fce23a7ec21da7a810 Mon Sep 17 00:00:00 2001 From: "Alexander I. Chebykin" Date: Wed, 20 Apr 2022 01:22:10 +0300 Subject: [PATCH] Last played books saving added Last played books saving added --- src/App.vue | 111 ++++++++++++++++++++++++------ src/components/AuthorsLib.vue | 3 +- src/components/BooksLib.vue | 2 +- src/components/SettingsDialog.vue | 37 ++++++---- src/plugins/locales/en.js | 1 + src/plugins/locales/ru.js | 1 + src/store.js | 39 ++++++----- yarn.lock | 12 ++-- 8 files changed, 147 insertions(+), 59 deletions(-) diff --git a/src/App.vue b/src/App.vue index 1558626..6a61558 100644 --- a/src/App.vue +++ b/src/App.vue @@ -49,9 +49,12 @@ @bookSelected="loadBook" @loadChapter="loadChapter" > - + + { - this.isLoading = false; + this.loading.wiki = false; if (fillAuthorInfo) { let authorInfo = this.$store.getters.author; @@ -414,23 +435,48 @@ }, loadAuthors () { + this.loading.authors = true; + this.axios.get(`lib/authors.json?r=${Math.random()}`) .then(response => { - this.$store.commit("setAuthors", response.data); - this.isLoading = false; + let lastAuthorHash = localStorage.lastAuthor ? localStorage.lastAuthor : null; + let authors = []; + let authorToLoad = null; + + response.data.forEach(author => { + let authorExt = author; + authorExt.hash = this.getHash(JSON.stringify({ + author: authorExt.author, + books: authorExt.books + })); + authors.push(authorExt); + if (lastAuthorHash !== null && lastAuthorHash == authorExt.hash) { + authorToLoad = { ...authorExt }; + } + }); + + this.$store.commit("setAuthors", authors); + + if (authorToLoad !== null && this.$store.getters.autoLoadBooks) { + this.loadBooks(authorToLoad); + } + + this.loading.authors = false; }) .catch(error => { this.showMessage(this.$t("error"), error); console.error(error); + this.loading.authors = false; }) }, /** * Load book data * - * @param {object} bookData Book data + * @param {object} bookData Book data + * @param {boolean} switchToTab Switch to Book tab after data loading */ - loadBook (bookData) { + loadBook (bookData, switchToTab = false) { if (this.audioElement !== null && this.$store.getters.autoBookmark) { this.setBookmark(); } @@ -448,10 +494,11 @@ reader: bookData.reader !== undefined && bookData.reader.trim() !== "" ? bookData.reader : "", + hash: bookData.hash, wiki: "" }); - this.isLoading = true; + this.loading.book = true; this.axios.get(`${bookData.book}?r=${Math.random()}`) .then(response => { @@ -473,11 +520,15 @@ } this.backgroundImage = bookData.image; - this.$router.push({ path: "/book" }); - this.isLoading = false; + + if (switchToTab) { + this.$router.push({ path: "/book" }); + } + + this.loading.book = false; }) .catch(error => { - this.isLoading = false; + this.loading.book = false; this.showMessage(this.$t("error"), error); console.error(error); @@ -487,14 +538,16 @@ /** * Load books data * - * @param {object} authorData Author data + * @param {object} authorData Author data + * @param {boolean} switchToTab Switch to Books tab after data loading */ - loadBooks (authorData) { - this.isLoading = true; + loadBooks (authorData, switchToTab = false) { + this.loading.books = true; this.axios.get(`${authorData.books}?r=${Math.random()}`) .then(response => { let books = {}; + let bookToLoad = null; response.data.forEach((book) => { let cycle = book.cycle !== undefined ? book.cycle : "no_cycle"; @@ -503,12 +556,22 @@ books[cycle] = []; } - books[cycle].push(book); + let bookExt = { ...book }; + bookExt.hash = this.getHash(JSON.stringify({ + book: bookExt.book, + })); + + books[cycle].push(bookExt); + + if (localStorage[authorData.hash] && localStorage[authorData.hash] == bookExt.hash) { + bookToLoad = { ...bookExt }; + } }); this.$store.commit("setAuthor", { name: authorData.author || "", image: authorData.image || "", + hash: authorData.hash || "", wiki: "" }); @@ -516,12 +579,18 @@ if (this.useWikipedia) { this.fillWikiInfo(authorData.author); } - this.$router.push({ path: "/books" }); + if (bookToLoad !== null && this.$store.getters.autoLoadBooks) { + this.loadBook(bookToLoad); + } - this.isLoading = false; + if (switchToTab) { + this.$router.push({ path: "/books" }); + } + + this.loading.books = false; }) .catch(error => { - this.isLoading = false; + this.loading.books = false; this.showMessage(this.$t("error"), error); console.error(error); @@ -562,7 +631,7 @@ component.audioElement.removeEventListener("canplay", _listener, true); }, true); - if (autoplay) this.play(); + if (autoplay) { this.play(); } }, loadNextChapter (autoplay = true) { @@ -593,6 +662,8 @@ play () { this.status = this.statuses.playing; this.audioElement.play(); + localStorage.lastAuthor = this.$store.getters.author.hash; + localStorage[this.$store.getters.author.hash] = this.$store.getters.book.hash; }, prevChapter () { @@ -606,7 +677,7 @@ if (this.$store.getters.chapters.length == 0) { return; } let data = { - chapter: this.$store.getters.curChapter, + chapter: this.$store.getters.curChapter, progress: this.currentProgress }; diff --git a/src/components/AuthorsLib.vue b/src/components/AuthorsLib.vue index 2299fb7..c09a2fc 100644 --- a/src/components/AuthorsLib.vue +++ b/src/components/AuthorsLib.vue @@ -17,6 +17,7 @@ > +
{{ $t("playbackRate") }}
- Ok + Ok
@@ -70,21 +78,23 @@ export default { data () { return { - dialog: false, - activeTab: 0, - autoBookmark: false, - darkTheme: false, - locale: "en", - playbackRate: 1, + dialog: false, + activeTab: 0, + autoBookmark: false, + autoLoadBooks: false, + darkTheme: false, + locale: "en", + playbackRate: 1, } }, watch: { dialog (val) { if (val) { - this.autoBookmark = this.$store.getters.autoBookmark; - this.darkTheme = this.$store.getters.darkTheme; - this.playbackRate = this.$store.getters.playbackRate; + this.autoBookmark = this.$store.getters.autoBookmark; + this.autoLoadBooks = this.$store.getters.autoLoadBooks; + this.darkTheme = this.$store.getters.darkTheme; + this.playbackRate = this.$store.getters.playbackRate; let userLocale = navigator.language || navigator.userLanguage; userLocale = userLocale.indexOf("-") > 0 @@ -95,9 +105,10 @@ } }, - autoBookmark (val) { this.$store.commit("setAutoBookmark", val); }, - darkTheme (val) { this.$store.commit("setDarkTheme", val); }, - playbackRate (val) { this.$store.commit("setPlaybackRate", val); } + autoBookmark (val) { this.$store.commit("setAutoBookmark", val); }, + autoLoadBooks (val) { this.$store.commit("setAutoLoadBooks", val); }, + darkTheme (val) { this.$store.commit("setDarkTheme", val); }, + playbackRate (val) { this.$store.commit("setPlaybackRate", val); } } } diff --git a/src/plugins/locales/en.js b/src/plugins/locales/en.js index df3bfc7..b006b6b 100644 --- a/src/plugins/locales/en.js +++ b/src/plugins/locales/en.js @@ -3,6 +3,7 @@ const messages = { about: "About", authors: "Authors", autoBookmarks: "Auto-bookmarks", + autoLoadBooks: "Auto-load last opened books", book: "Books", bookmarkSaved: "Bookmark saved", books: "Book", diff --git a/src/plugins/locales/ru.js b/src/plugins/locales/ru.js index df74467..8dbe843 100644 --- a/src/plugins/locales/ru.js +++ b/src/plugins/locales/ru.js @@ -3,6 +3,7 @@ const messages = { about: "О программе", authors: "Авторы", autoBookmarks: "Автозакладки", + autoLoadBooks: "Автоматически загружать последние открытые книги", book: "Книга", bookmarkSaved: "Закладка сохранена", books: "Книги", diff --git a/src/store.js b/src/store.js index 66710fd..e3774ea 100644 --- a/src/store.js +++ b/src/store.js @@ -11,6 +11,7 @@ const store = createStore({ }, authors: [], autoBookmark: false, + autoLoadBooks: false, book: { author: "", photo: "", @@ -27,27 +28,29 @@ const store = createStore({ }, getters: { - author: state => { return state.author; }, - authors: state => { return state.authors; }, - autoBookmark: state => { return state.autoBookmark; }, - book: state => { return state.book; }, - books: state => { return state.books; }, - chapters: state => { return state.chapters }, - curChapter: state => { return state.curChapter }, - darkTheme: state => { return state.darkTheme }, - playbackRate: state => { return state.playbackRate }, + author: state => { return state.author; }, + authors: state => { return state.authors; }, + autoBookmark: state => { return state.autoBookmark; }, + autoLoadBooks: state => { return state.autoLoadBooks; }, + book: state => { return state.book; }, + books: state => { return state.books; }, + chapters: state => { return state.chapters }, + curChapter: state => { return state.curChapter }, + darkTheme: state => { return state.darkTheme }, + playbackRate: state => { return state.playbackRate }, }, mutations: { - setAuthor (state, payload) { state.author = payload; }, - setAuthors (state, payload) { state.authors = payload; }, - setAutoBookmark (state, payload) { state.autoBookmark = payload; }, - setBook (state, payload) { state.book = payload; }, - setBooks (state, payload) { state.books = payload; }, - setChapters (state, payload) { state.chapters = payload; }, - setCurChapter (state, payload) { state.curChapter = payload; }, - setDarkTheme (state, payload) { state.darkTheme = payload; }, - setPlaybackRate (state, payload) { state.playbackRate = payload; }, + setAuthor (state, payload) { state.author = payload; }, + setAuthors (state, payload) { state.authors = payload; }, + setAutoBookmark (state, payload) { state.autoBookmark = payload; }, + setAutoLoadBooks (state, payload) { state.autoLoadBooks = payload; }, + setBook (state, payload) { state.book = payload; }, + setBooks (state, payload) { state.books = payload; }, + setChapters (state, payload) { state.chapters = payload; }, + setCurChapter (state, payload) { state.curChapter = payload; }, + setDarkTheme (state, payload) { state.darkTheme = payload; }, + setPlaybackRate (state, payload) { state.playbackRate = payload; }, } }); diff --git a/yarn.lock b/yarn.lock index 6bf6602..71a318e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5191,9 +5191,9 @@ sass-loader@^10.0.0: semver "^7.3.2" sass@^1.50.0: - version "1.50.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.50.0.tgz#3e407e2ebc53b12f1e35ce45efb226ea6063c7c8" - integrity sha512-cLsD6MEZ5URXHStxApajEh7gW189kkjn4Rc8DQweMyF+o5HF5nfEz8QYLMlPsTOD88DknatTmBWkOcw5/LnJLQ== + version "1.50.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.50.1.tgz#e9b078a1748863013c4712d2466ce8ca4e4ed292" + integrity sha512-noTnY41KnlW2A9P8sdwESpDmo+KBNkukI1i8+hOK3footBUcohNHtdOJbckp46XO95nuvcHDDZ+4tmOnpK3hjw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -5942,9 +5942,9 @@ vuetify-loader@^2.0.0-alpha.0: upath "^2.0.1" "vuetify@npm:@vuetify/nightly@next": - version "3.0.0-next-20220416.0" - resolved "https://registry.yarnpkg.com/@vuetify/nightly/-/nightly-3.0.0-next-20220416.0.tgz#d3be97e6130900647b51ca924ae60b0812a9b5d2" - integrity sha512-3jgtwcZXmrCeR1gcLyL2jvUnZftc9RyaXHdQpXQhmlFazYEtSymsRoD8RAEv2P2GeVGKVKkR7KfBrVhUBEgaSg== + version "3.0.0-next-20220419.0" + resolved "https://registry.yarnpkg.com/@vuetify/nightly/-/nightly-3.0.0-next-20220419.0.tgz#4ad519eb61721f89b734a4c334a45b40b665ebbb" + integrity sha512-BqgKBxmgtOyA4LByRIQIpSfYyM5GQq2I3+hjkrP2NbZ0n1rSDlov4YRmauqLzII9ys0Lxi0HXwu7dXLEHJkHBQ== vuex@^4.0.2: version "4.0.2"