Просмотр исходного кода

fix(page): 页码引用按 prev→curr 取段落区间

页码记录的是「该页起始于哪一段」,当前页正文应为上一页页标段到
当前页页标段(如 prev=53、curr=62 → 53..62),原先取的是
curr→next,方向错误。

同时 useTipitaka 的 para 分支只从 id 反解区间,忽略了 para/book
两个 prop(实际是死参数),导致 id 为 `88-62` 时只请求单个段落。
现在 para prop 存在时优先使用。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QKeiirQWenFHZ6uexWPvG8
visuddhinanda 2 недель назад
Родитель
Сommit
27d6be8ba0

+ 6 - 4
dashboard-v6/src/components/article/hooks/usePageNav.ts

@@ -8,7 +8,7 @@
  *
  * pageId 形如 `M-dīghanikāya-2-10`(页码类型_书名_卷号_页码)。
  * 内部调用 fetchPageNav 请求 /api/v2/nav-page,并把返回的
- * curr.paragraph → next.paragraph 区间转换为 TypePali 需要的参数。
+ * prev.paragraph → curr.paragraph 区间转换为 TypePali 需要的参数。
  *
  * @returns
  *   - nav        页码导航数据(curr/prev/next),失败时为 undefined
@@ -77,14 +77,16 @@ export const usePageNav = (
         const data = res.data;
         setNav(data);
 
-        const begin = data.curr.paragraph;
-        const end = data.next.paragraph;
+        // 页标记录的是「该页起始于哪一段」,所以当前页的正文区间是
+        // 上一页页标所在段 → 当前页页标所在段,例如 prev=53、curr=62 → 53..62。
+        const begin = data.prev?.paragraph ?? data.curr.paragraph;
+        const end = data.curr.paragraph;
         const para: number[] = [];
         for (let index = begin; index <= end; index++) {
           para.push(index);
         }
         setParamPali({
-          id: `${data.curr.book}-${data.curr.paragraph}`,
+          id: `${data.curr.book}-${begin}-${end}`,
           book: data.curr.book.toString(),
           para: para.join(),
           mode: mode,

+ 17 - 7
dashboard-v6/src/hooks/useTipitaka.ts

@@ -73,18 +73,28 @@ const useTipitaka = ({
         if (type === "chapter") {
           response = await fetchChapter(id, srcDataMode, channelId);
         } else if (type === "para") {
-          const [book, pFrom, pTo] = id
+          const [idBook, pFrom, pTo] = id
             .split("-")
             .map((item) => parseInt(item));
-          const _to = pTo ?? pFrom;
 
-          const pList: number[] = [];
-          for (let index = pFrom; index <= _to; index++) {
-            pList.push(index);
+          // para/book prop 优先:调用方(如页码导航)可直接指定段落列表,
+          // 否则退回从 id(`book-from[-to]`)反解出的区间。
+          let reqBook = idBook.toString();
+          let reqPara: string;
+          if (para) {
+            reqBook = book ? book : reqBook;
+            reqPara = para;
+          } else {
+            const _to = pTo ?? pFrom;
+            const pList: number[] = [];
+            for (let index = pFrom; index <= _to; index++) {
+              pList.push(index);
+            }
+            reqPara = pList.join(",");
           }
           response = await fetchPara(
-            book.toString(),
-            pList.join(","),
+            reqBook,
+            reqPara,
             srcDataMode,
             channelId
           );