Рефакторинг, промежуточный коммит

This commit is contained in:
Book Pauk
2019-01-15 19:01:13 +07:00
parent 5198e3f7ba
commit 859849b66c
3 changed files with 105 additions and 111 deletions

View File

@@ -42,8 +42,9 @@
</el-header> </el-header>
<el-main> <el-main>
{{ bookPos }}
<keep-alive> <keep-alive>
<component ref="page" :is="pageActive" @load-book="loadBook" @parse-book="parseBook"></component> <component ref="page" :is="pageActive" @load-book="loadBook" @book-pos-changed="bookPosChanged"></component>
</keep-alive> </keep-alive>
</el-main> </el-main>
</el-container> </el-container>
@@ -66,9 +67,27 @@ export default @Component({
TextPage, TextPage,
ProgressPage ProgressPage
}, },
watch: {
bookPos: function(newValue) {
if (newValue !== undefined && this.pageActive == 'TextPage') {
const textPage = this.$refs.page;
if (textPage.bookPos != newValue) {
textPage.bookPos = newValue;
this.commit('reader/setOpenedBook', Object.assign({}, this.lastOpenedBook, {bookPos: newValue}));
}
}
},
routeParamPos: function(newValue) {
if (newValue !== undefined && newValue != this.bookPos) {
this.bookPos = newValue;
}
},
},
}) })
class Reader extends Vue { class Reader extends Vue {
loaderActive = false;
progressActive = false; progressActive = false;
bookPos = null;
created() { created() {
this.commit = this.$store.commit; this.commit = this.$store.commit;
@@ -76,18 +95,38 @@ class Reader extends Vue {
this.reader = this.$store.state.reader; this.reader = this.$store.state.reader;
this.$root.addKeyHook(this.keyHook); this.$root.addKeyHook(this.keyHook);
this.lastActivePage = false;
} }
mounted() { mounted() {
/*while (this.lastOpenedBook) { /*while (this.lastOpenedBook) {
this.commit('reader/delOpenedBook', this.lastOpenedBook); this.commit('reader/delOpenedBook', this.lastOpenedBook);
}*/ }*/
if (this.$root.rootRoute == '/reader' && this.routeParamUrl && this.routeParamUrl != this.lastOpenedBook.url) { const lastUrl = (this.lastOpenedBook ? this.lastOpenedBook.url : '');
this.commit('reader/setLoaderActive', true); if (this.$root.rootRoute == '/reader' && this.routeParamUrl && this.routeParamUrl != lastUrl) {
this.loadBook({url: this.routeParamUrl}); this.loaderActive = true;
this.loadBook({url: this.routeParamUrl, bookPos: this.routeParamPos});
} }
} }
get routeParamPos() {
let result = undefined;
const q = this.$route.query;
if (q['__p']) {
result = q['__p'];
if (Array.isArray(result))
result = result[0];
}
return (result ? parseInt(result, 10) || 0 : result);
}
updateRoute() {
const pos = (this.bookPos != undefined ? `__p=${this.bookPos}&` : '');
this.$router.replace(`/reader?${pos}url=${this.lastOpenedBook.url}`);
}
get routeParamUrl() { get routeParamUrl() {
let result = ''; let result = '';
const path = this.$route.fullPath; const path = this.$route.fullPath;
@@ -99,8 +138,9 @@ class Reader extends Vue {
return decodeURIComponent(result); return decodeURIComponent(result);
} }
get loaderActive() { bookPosChanged(event) {
return this.reader.loaderActive; this.bookPos = event.bookPos;
this.updateRoute();
} }
get fullScreenActive() { get fullScreenActive() {
@@ -113,16 +153,11 @@ class Reader extends Vue {
buttonClick(button) { buttonClick(button) {
switch (button) { switch (button) {
case 'loader': this.commit('reader/setLoaderActive', !this.loaderActive); this.resetRoute(); break; case 'loader': this.loaderActive = !this.loaderActive; break;
case 'fullscreen': this.commit('reader/setFullScreenActive', !this.fullScreenActive); break; case 'fullscreen': this.commit('reader/setFullScreenActive', !this.fullScreenActive); break;
} }
} }
resetRoute() {
if (this.loaderActive)
this.$router.replace('/reader');
}
buttonActiveClass(button) { buttonActiveClass(button) {
const classActive = { 'tool-button-active': true, 'tool-button-active:hover': true }; const classActive = { 'tool-button-active': true, 'tool-button-active:hover': true };
switch (button) { switch (button) {
@@ -143,7 +178,7 @@ class Reader extends Vue {
result = 'TextPage'; result = 'TextPage';
if (!result) { if (!result) {
this.commit('reader/setLoaderActive', true); this.loaderActive = true;
result = 'LoaderPage'; result = 'LoaderPage';
} }
@@ -151,6 +186,29 @@ class Reader extends Vue {
this.$root.$emit('set-app-title'); this.$root.$emit('set-app-title');
} }
if (this.lastActivePage != result && result == 'TextPage') {
//акивируем страницу с текстом
this.$nextTick(async() => {
const last = this.lastOpenedBook;
const isParsed = await bookManager.hasBookParsed(last);
if (!isParsed) {
this.$root.$emit('set-app-title');
this.loadBook({url: last.url, bookPos: last.bookPos});
return;
} else {
this.bookPos = last.bookPos;
}
const textPage = this.$refs.page;
textPage.lastBook = last;
textPage.bookPos = (this.bookPos !== undefined ? this.bookPos : 0);
textPage.showBook();
});
}
this.lastActivePage = result;
return result; return result;
} }
@@ -158,10 +216,26 @@ class Reader extends Vue {
this.progressActive = true; this.progressActive = true;
this.$nextTick(async() => { this.$nextTick(async() => {
const progress = this.$refs.page; const progress = this.$refs.page;
progress.show();
progress.setState({totalSteps: 5});
try { try {
progress.show();
progress.setState({state: 'parse'});
const bookParsed = await bookManager.getBook({url: opts.url}, (prog) => {
progress.setState({progress: prog});
});
if (bookParsed) {
this.commit('reader/setOpenedBook', bookManager.metaOnly(bookParsed));
this.bookPos = bookParsed.bookPos;
this.updateRoute();
this.loaderActive = false;
progress.hide(); this.progressActive = false;
return;
}
progress.setState({totalSteps: 5});
const book = await readerApi.loadBook(opts.url, (state) => { const book = await readerApi.loadBook(opts.url, (state) => {
progress.setState(state); progress.setState(state);
}); });
@@ -172,43 +246,15 @@ class Reader extends Vue {
}); });
this.commit('reader/setOpenedBook', bookManager.metaOnly(addedBook)); this.commit('reader/setOpenedBook', bookManager.metaOnly(addedBook));
this.commit('reader/setLoaderActive', false); this.bookPos = opts.bookPos;
this.updateRoute();
this.loaderActive = false;
progress.hide(); this.progressActive = false; progress.hide(); this.progressActive = false;
} catch (e) { } catch (e) {
progress.hide(); this.progressActive = false; progress.hide(); this.progressActive = false;
this.commit('reader/setLoaderActive', true); this.loaderActive = true;
this.resetRoute();
this.$alert(e.message, 'Ошибка', {type: 'error'});
}
});
}
parseBook(meta) {
this.progressActive = true;
this.$nextTick(async() => {
if (bookManager.hasBookParsed(meta)) {
this.progressActive = false;
return;
}
const progress = this.$refs.page;
progress.show();
progress.setState({state: 'parse'});
try {
const isParsed = await bookManager.getBook(meta, (prog) => {
progress.setState({progress: prog});
});
progress.hide(); this.progressActive = false;
if (!isParsed) {
this.loadBook({url: meta.url});
}
} catch (e) {
progress.hide(); this.progressActive = false;
this.commit('reader/setLoaderActive', true);
this.resetRoute();
this.$alert(e.message, 'Ошибка', {type: 'error'}); this.$alert(e.message, 'Ошибка', {type: 'error'});
} }
}); });

View File

@@ -1,9 +1,8 @@
<template> <template>
<div ref="main" class="main"> <div ref="main" class="main">
<pre>{{ this.lastOpenedBook }}</pre>
<pre>{{ meta }}</pre>
<pre>{{ bookPos }}</pre> <pre>{{ bookPos }}</pre>
<pre>{{ $route.query }}</pre> <pre>{{ lastBook }}</pre>
<pre>{{ meta }}</pre>
</div> </div>
</template> </template>
@@ -18,51 +17,39 @@ import bookManager from '../share/bookManager';
export default @Component({ export default @Component({
watch: { watch: {
bookPos: function(newValue) { bookPos: function(newValue) {
this.updateRoute(newValue); this.$emit('book-pos-changed', {bookPos: newValue});
this.commit('reader/setOpenedBook', Object.assign({}, this.lastOpenedBook, {bookPos: newValue}));
this.drawPage(); this.drawPage();
}, },
routeParamPos: function(newValue) {
if (newValue !== undefined && newValue != this.bookPos) {
this.bookPos = newValue;
}
},
}, },
}) })
class TextPage extends Vue { class TextPage extends Vue {
lastBook = null;
meta = null; meta = null;
fb2 = null; fb2 = null;
bookPos = 0; bookPos = 0;
created() { created() {
this.commit = this.$store.commit; this.commit = this.$store.commit;
this.dispatch = this.$store.dispatch; this.dispatch = this.$store.dispatch;
this.config = this.$store.state.config; this.config = this.$store.state.config;
this.reader = this.$store.state.reader; this.reader = this.$store.state.reader;
this.lastOpenTry = '';
} }
activated() { showBook() {
this.$refs.main.focus(); this.$refs.main.focus();
this.book = null; this.book = null;
this.meta = null; this.meta = null;
this.fb2 = null; this.fb2 = null;
let last = this.lastOpenedBook; this.drawPage();//пока не загрузили, очистим канвас
if (last && !(this.routeParamUrl && this.routeParamUrl != last.url)) { if (this.lastBook) {
(async() => { (async() => {
const isParsed = await bookManager.hasBookParsed(last); const isParsed = await bookManager.hasBookParsed(this.lastBook);
if (!isParsed) { if (!isParsed) {
this.$root.$emit('set-app-title');
if (this.lastOpenTry != last.url) {
this.$emit('parse-book', last);
this.lastOpenTry = last.url;
}
return; return;
} }
this.book = await bookManager.getBook(last); this.book = await bookManager.getBook(this.lastBook);
this.meta = bookManager.metaOnly(this.book); this.meta = bookManager.metaOnly(this.book);
this.fb2 = this.meta.fb2; this.fb2 = this.meta.fb2;
@@ -74,48 +61,13 @@ class TextPage extends Vue {
this.fb2.bookTitle this.fb2.bookTitle
]).join(' ')); ]).join(' '));
this.bookPos = (this.routeParamPos !== undefined ? this.routeParamPos : last.bookPos || 0);
this.updateRoute(this.bookPos);
this.drawPage(); this.drawPage();
})(); })();
} }
} }
get lastOpenedBook() {
return this.$store.getters['reader/lastOpenedBook'];
}
get routeParamUrl() {
let result = '';
const path = this.$route.fullPath;
const i = path.indexOf('url=');
if (i >= 0) {
result = path.substr(i + 4);
}
return decodeURIComponent(result);
}
get routeParamPos() {
let result = undefined;
const q = this.$route.query;
if (q['__p']) {
result = q['__p'];
if (Array.isArray(result))
result = result[0];
}
return (result ? parseInt(result, 10) || 0 : result);
}
updateRoute(newPos) {
if (this.book)
this.$router.replace(`/reader?__p=${newPos}&url=${this.lastOpenedBook.url}`);
}
drawPage() { drawPage() {
const last = this.lastOpenedBook; if (!this.lastBook)
if (!last)
return; return;
//пустой канвас //пустой канвас

View File

@@ -2,7 +2,6 @@ import Vue from 'vue';
// initial state // initial state
const state = { const state = {
loaderActive: false,
fullScreenActive: false, fullScreenActive: false,
openedBook: {}, openedBook: {},
}; };
@@ -28,9 +27,6 @@ const actions = {};
// mutations // mutations
const mutations = { const mutations = {
setLoaderActive(state, value) {
state.loaderActive = value;
},
setFullScreenActive(state, value) { setFullScreenActive(state, value) {
state.fullScreenActive = value; state.fullScreenActive = value;
}, },