diff --git a/src/stores/workRead.js b/src/stores/workRead.js index 1aa2e03..d1e1d26 100644 --- a/src/stores/workRead.js +++ b/src/stores/workRead.js @@ -21,10 +21,13 @@ export const useWorkReadState = defineStore('workRead', () => { const category = ref([]) const fandom = ref([]) const lang = ref(null) + const chapters = ref([]) + const chapterIndex = ref(null) function setData(data) { + cid.value = data.chapterId id.value = data.workId title.value = data.title - summary.value = [escapeAndFormatText(data.summary)] + summary.value = data.summary ? escapeAndFormatText(data.summary) : null pseud.value = data.pseud text.value = data.text publishedTime.value = data.stats.publishedTime @@ -34,11 +37,26 @@ export const useWorkReadState = defineStore('workRead', () => { category.value = data.category fandom.value = data.fandom lang.value = data.lang + chapters.value = data.chapters || [] + chapterIndex.value = data.chapterIndex ?? null } async function loadWork(target, targetc) { - if (target == id.value && targetc == cid.value || state.value == 'loading') return + const itarget = parseInt(target) + if (isNaN(itarget)) { + console.log('a') + state.value = 'errformat' + return + } + const itargetc = parseInt(targetc) + if ( + itarget === id.value && + (itargetc === cid.value || (isNaN(itargetc) && cid.value === null)) && + state.value !== 'loading' + ) return + id.value = itarget + cid.value = isNaN(itargetc) ? null : itargetc state.value = 'loading' - const result = await api.getWork(target, targetc) + const result = await api.getWork(id.value, cid.value) if (result.status == 200) { setData(result.data) state.value = 'ready' @@ -61,6 +79,8 @@ export const useWorkReadState = defineStore('workRead', () => { category, fandom, lang, + chapters, + chapterIndex, setData, loadWork } diff --git a/src/views/SimpleSearch.vue b/src/views/SimpleSearch.vue index 99e12ca..584e755 100644 --- a/src/views/SimpleSearch.vue +++ b/src/views/SimpleSearch.vue @@ -1,6 +1,6 @@ diff --git a/src/views/Work.vue b/src/views/Work.vue index b2ecb66..053f580 100644 --- a/src/views/Work.vue +++ b/src/views/Work.vue @@ -19,8 +19,6 @@ import 'mdui/components/button.js' import 'mdui/components/dropdown.js' import 'mdui/components/menu.js' import 'mdui/components/menu-item.js' -import 'mdui/components/collapse.js' -import 'mdui/components/collapse-item.js' import 'mdui/components/card.js' import '@mdui/icons/bookmark.js' @@ -41,6 +39,7 @@ let lastCloseTimer = null let isObserver = null let paragraphs = [] let currentParagraph = null +const chapterDialog = ref(null) const categoryName = { mm: "男/男", @@ -48,21 +47,25 @@ const categoryName = { fm: '女/男' } - onServerPrefetch(async () => { await workReadState.loadWork(route.params.id, route.params.cid) }) onMounted(async () => { + watch(() => workReadState.state, (value) => { if (value == 'ready') routeState.customTitle = workReadState.title }) if (workReadState.state != 'ssrnotfound') await workReadState.loadWork(route.params.id, route.params.cid) if (workReadState.state == 'ready') { routeState.customTitle = workReadState.title + if (parseInt(route.params.cid) != workReadState.cid) { + router.replace(`/work/${workReadState.id}/${workReadState.cid}`) + return; + } const paraCount = workReadState.text.length - 1 isObserver = new IntersectionObserver((entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { currentParagraph = entry.target - readIndex = entry.target.dataset.index; + readIndex = entry.target.dataset.index readPercent.value = parseInt(readIndex / paraCount * 100) if (lastPercent == 0) { lastPercent = readPercent.value @@ -89,8 +92,13 @@ onMounted(async () => { }) onBeforeUnmount(() => { - isObserver.disconnect(); + if(isObserver) isObserver.disconnect(); }) + +async function switchWorkWithIndex(target) { + workReadState.loadWork(workReadState.id,workReadState.chapters[target].chapterId); + router.replace(`/work/${workReadState.id}/${workReadState.cid}`) +} 返回 +