|
@@ -3,7 +3,7 @@ import useGet from "../../../utils/hooks/useGet";
|
|
|
import type { ChapterListData } from "../../../types/http";
|
|
import type { ChapterListData } from "../../../types/http";
|
|
|
|
|
|
|
|
import styles from "../../../styles/chapter.module.scss";
|
|
import styles from "../../../styles/chapter.module.scss";
|
|
|
-import { useCallback } from "react";
|
|
|
|
|
|
|
+import { useCallback, useMemo } from "react";
|
|
|
import VirtualScroll from "../../VirtualScroll";
|
|
import VirtualScroll from "../../VirtualScroll";
|
|
|
import clsx from "clsx";
|
|
import clsx from "clsx";
|
|
|
|
|
|
|
@@ -14,12 +14,23 @@ interface TocProps {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const Toc = (props: TocProps) => {
|
|
const Toc = (props: TocProps) => {
|
|
|
- const { novel, className } = props;
|
|
|
|
|
|
|
+ const { novel, chapter, className } = props;
|
|
|
|
|
|
|
|
const { data: { data: chapters } = { data: null } } = useGet<ChapterListData>(
|
|
const { data: { data: chapters } = { data: null } } = useGet<ChapterListData>(
|
|
|
`/api/novel/${novel}/chapters`
|
|
`/api/novel/${novel}/chapters`
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
|
|
+ const startIndex = useMemo(() => {
|
|
|
|
|
+ const uri = `${novel}/${chapter}`;
|
|
|
|
|
+ if (chapters && Array.isArray(chapters.chapters)) {
|
|
|
|
|
+ const idx = chapters.chapters.findIndex((item) => item.uri === uri);
|
|
|
|
|
+ if (idx > -1) {
|
|
|
|
|
+ return idx;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }, [novel, chapter, chapters]);
|
|
|
|
|
+
|
|
|
const getTocItem = useCallback(
|
|
const getTocItem = useCallback(
|
|
|
(offset: number, limit: number) => {
|
|
(offset: number, limit: number) => {
|
|
|
if (!chapters) return [];
|
|
if (!chapters) return [];
|
|
@@ -29,9 +40,14 @@ const Toc = (props: TocProps) => {
|
|
|
for (let i = offset; i < len; i++) {
|
|
for (let i = offset; i < len; i++) {
|
|
|
const item = chapters.chapters[i];
|
|
const item = chapters.chapters[i];
|
|
|
list.push(
|
|
list.push(
|
|
|
- <li key={item.id}>
|
|
|
|
|
|
|
+ <li
|
|
|
|
|
+ key={item.id}
|
|
|
|
|
+ className={clsx({
|
|
|
|
|
+ [styles["current"]]: item.uri === `${novel}/${chapter}`,
|
|
|
|
|
+ })}
|
|
|
|
|
+ >
|
|
|
<Link href={`/novel/${item.uri}`} title={item.name} key={item.id}>
|
|
<Link href={`/novel/${item.uri}`} title={item.name} key={item.id}>
|
|
|
- <i>1</i>
|
|
|
|
|
|
|
+ <i>{i + 1}</i>
|
|
|
<strong>{item.name}</strong>
|
|
<strong>{item.name}</strong>
|
|
|
</Link>
|
|
</Link>
|
|
|
</li>
|
|
</li>
|
|
@@ -39,7 +55,7 @@ const Toc = (props: TocProps) => {
|
|
|
}
|
|
}
|
|
|
return list;
|
|
return list;
|
|
|
},
|
|
},
|
|
|
- [chapters]
|
|
|
|
|
|
|
+ [chapter, chapters, novel]
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
return (
|
|
return (
|
|
@@ -52,6 +68,7 @@ const Toc = (props: TocProps) => {
|
|
|
total={chapters.chapters.length}
|
|
total={chapters.chapters.length}
|
|
|
getItems={getTocItem}
|
|
getItems={getTocItem}
|
|
|
className={styles["toolbar-scrollbar"]}
|
|
className={styles["toolbar-scrollbar"]}
|
|
|
|
|
+ startIndex={startIndex}
|
|
|
/>
|
|
/>
|
|
|
) : null}
|
|
) : null}
|
|
|
{/* {chapters ? (
|
|
{/* {chapters ? (
|