diff --git a/src/components/chapter/ChapterList.tsx b/src/components/chapter/ChapterList.tsx index 70978cb6..2474cb13 100644 --- a/src/components/chapter/ChapterList.tsx +++ b/src/components/chapter/ChapterList.tsx @@ -12,11 +12,11 @@ import Typography from '@mui/material/Typography'; import { CircularProgress, Fab } from '@mui/material'; import { Link } from 'react-router-dom'; import makeToast from 'components/util/Toast'; -import client from 'util/client'; import PlayArrow from '@mui/icons-material/PlayArrow'; import ChapterOptions from 'components/chapter/ChapterOptions'; import ChapterCard from 'components/chapter/ChapterCard'; import useLocalStorage from 'util/useLocalStorage'; +import useFetchChapters from './useFetchChapters'; const CustomVirtuoso = styled(Virtuoso)(({ theme }) => ({ listStyle: 'none', @@ -85,11 +85,7 @@ function findFirstUnreadChapter(chapters: IChapter[]): IChapter | undefined { export default function ChapterList(props: IProps) { const { id } = props; - const [chapters, setChapters] = useState([]); - const [noChaptersFound, setNoChaptersFound] = useState(false); - const [chapterUpdateTriggerer, setChapterUpdateTriggerer] = useState(0); - const [fetchedOnline, setFetchedOnline] = useState(false); - const [fetchedOffline, setFetchedOffline] = useState(false); + const [chapters, triggerChaptersUpdate, noChaptersFound] = useFetchChapters(id); const [firstUnreadChapter, setFirstUnreadChapter] = useState(); const [filteredChapters, setFilteredChapters] = useState([]); const [options, setOptions] = useLocalStorage( @@ -108,10 +104,6 @@ export default function ChapterList(props: IProps) { const [, setWsClient] = useState(); const [{ queue }, setQueueState] = useState(initialQueue); - function triggerChaptersUpdate() { - setChapterUpdateTriggerer(chapterUpdateTriggerer + 1); - } - useEffect(() => { const wsc = new WebSocket(`${baseWebsocketUrl}/api/v1/downloads`); wsc.onmessage = (e) => { @@ -141,25 +133,6 @@ export default function ChapterList(props: IProps) { return rtn; }; - useEffect(() => { - const shouldFetchOnline = fetchedOffline && !fetchedOnline; - - client.get(`/api/v1/manga/${id}/chapters?onlineFetch=${shouldFetchOnline}`) - .then((response) => response.data) - .then((data) => { - if (data.length === 0 && fetchedOffline) { - makeToast('No chapters found', 'warning'); - setNoChaptersFound(true); - } - setChapters(data); - }) - .then(() => { - if (shouldFetchOnline) { - setFetchedOnline(true); - } else setFetchedOffline(true); - }); - }, [fetchedOnline, fetchedOffline, chapterUpdateTriggerer]); - useEffect(() => { const filtered = options.active ? chapters.filter((chp) => unreadFilter(options.unread, chp) @@ -191,6 +164,12 @@ export default function ChapterList(props: IProps) { )); + useEffect(() => { + if (noChaptersFound) { + makeToast('No chapters found', 'warning'); + } + }, [noChaptersFound]); + if (chapters.length === 0 || noChaptersFound) { return (
void, boolean] { + const [chapters, setChapters] = useState([]); + const [noChaptersFound, setNoChaptersFound] = useState(false); + const [chapterUpdateTriggerer, setChapterUpdateTriggerer] = useState(0); + const [fetchedOnline, setFetchedOnline] = useState(false); + const [fetchedOffline, setFetchedOffline] = useState(false); + + const triggerChaptersUpdate = useCallback(() => setChapterUpdateTriggerer((prev) => prev + 1), + []); + + useEffect(() => { + const shouldFetchOnline = fetchedOffline && !fetchedOnline; + + client.get(`/api/v1/manga/${id}/chapters?onlineFetch=${shouldFetchOnline}`) + .then((response) => response.data) + .then((data) => { + if (data.length === 0 && fetchedOffline) { + setNoChaptersFound(true); + } + setChapters(data); + }) + .then(() => { + if (shouldFetchOnline) { + setFetchedOnline(true); + } else setFetchedOffline(true); + }); + }, [fetchedOnline, fetchedOffline, chapterUpdateTriggerer]); + + return [chapters, triggerChaptersUpdate, noChaptersFound]; +}