From aaedbb7be9e613a22932cbc25a5c40133d34961c Mon Sep 17 00:00:00 2001 From: akabhirav <108609220+akabhirav@users.noreply.github.com> Date: Sun, 12 Feb 2023 20:43:41 +0530 Subject: [PATCH] add pagination to library and fix some prettier issues (#237) Co-authored-by: akxer <> --- .gitignore | 3 +- src/components/MangaGrid.tsx | 6 +-- src/components/library/LibraryMangaGrid.tsx | 47 ++++++++++++++------- src/screens/Library.tsx | 10 ----- src/screens/SearchAll.tsx | 2 +- 5 files changed, 37 insertions(+), 31 deletions(-) diff --git a/.gitignore b/.gitignore index c333f229..e1a092cc 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,6 @@ node_modules/ .eslintcache .vscode .env +.idea -build/* \ No newline at end of file +build/* diff --git a/src/components/MangaGrid.tsx b/src/components/MangaGrid.tsx index 149ca5c5..25b52ae6 100644 --- a/src/components/MangaGrid.tsx +++ b/src/components/MangaGrid.tsx @@ -23,7 +23,7 @@ export interface IMangaGridProps { lastPageNum: number; setLastPageNum: (lastPageNum: number) => void; gridLayout?: GridLayout; - horisontal?: boolean | undefined; + horizontal?: boolean | undefined; noFaces?: boolean | undefined; inLibraryIndicator?: boolean; } @@ -38,7 +38,7 @@ const MangaGrid: React.FC = (props) => { lastPageNum, setLastPageNum, gridLayout, - horisontal, + horizontal, noFaces, inLibraryIndicator, } = props; @@ -113,7 +113,7 @@ const MangaGrid: React.FC = (props) => { container spacing={1} style={ - horisontal + horizontal ? { margin: 0, width: '100%', diff --git a/src/components/library/LibraryMangaGrid.tsx b/src/components/library/LibraryMangaGrid.tsx index 9e639a6a..b951e2fa 100644 --- a/src/components/library/LibraryMangaGrid.tsx +++ b/src/components/library/LibraryMangaGrid.tsx @@ -6,10 +6,11 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import React, { useMemo } from 'react'; -import MangaGrid, { IMangaGridProps } from 'components/MangaGrid'; +import React, { useEffect, useState } from 'react'; +import MangaGrid from 'components/MangaGrid'; import { useLibraryOptionsContext } from 'components/context/LibraryOptionsContext'; import { StringParam, useQueryParam } from 'use-query-params'; +import { useMediaQuery, useTheme } from '@mui/material'; const FILTERED_OUT_MESSAGE = 'There are no Manga matching this filter'; @@ -90,37 +91,51 @@ const sortManga = ( return result; }; -const LibraryMangaGrid: React.FC = ({ +interface LibraryMangaGridProps { + mangas: IMangaCard[]; + isLoading: boolean; + message?: string; +} + +const LibraryMangaGrid: React.FC = ({ mangas, isLoading, - hasNextPage, - lastPageNum, - setLastPageNum, message, lastLibraryUpdate, }) => { const [query] = useQueryParam('query', StringParam); const { options } = useLibraryOptionsContext(); const { unread, downloaded } = options; + const [filteredPaginatedMangas, setFilteredPaginatedMangas] = useState([]); + const [sortedManga, setSortedManga] = useState([]); + const [filteredManga, setFilteredManga] = useState([]); + const totalPages = (mangas ?? []).length / 10; + const theme = useTheme(); + const isLargeScreen = useMediaQuery(theme.breakpoints.up('sm')); + const defaultPageNumber = isLargeScreen ? 4 : 1; + const [lastPageNum, setLastPageNum] = useState(defaultPageNumber); + useEffect(() => { + setFilteredManga(filterManga(mangas, query, unread, downloaded)); + setLastPageNum(defaultPageNumber); + window.scrollTo(0, 0); + }, [mangas, query, unread, downloaded]); - const sortedManga = useMemo( - () => sortManga(mangas, options.sorts, options.sortDesc), - [mangas, lastLibraryUpdate, options.sorts, options.sortDesc], - ); + useEffect(() => { + setSortedManga(sortManga(filteredManga, options.sorts, options.sortDesc)); + }, [filteredManga, lastLibraryUpdate, options.sorts, options.sortDesc]); - const filteredManga = useMemo( - () => filterManga(sortedManga, query, unread, downloaded), - [sortedManga, lastLibraryUpdate, query, unread, downloaded], - ); + useEffect(() => { + setFilteredPaginatedMangas((sortedManga ?? []).slice(0, lastPageNum * 10)); + }, [lastPageNum, sortedManga]); const showFilteredOutMessage = (unread != null || downloaded != null || query) && filteredManga.length === 0 && mangas.length > 0; return ( (1); - const handleTabChange = (newTab: number) => { setTabSearchParam(newTab === 0 ? undefined : newTab); }; @@ -76,9 +72,6 @@ export default function Library() { @@ -117,9 +110,6 @@ export default function Library() { diff --git a/src/screens/SearchAll.tsx b/src/screens/SearchAll.tsx index de292575..34fa4b19 100644 --- a/src/screens/SearchAll.tsx +++ b/src/screens/SearchAll.tsx @@ -211,7 +211,7 @@ const SearchAll: React.FC = () => { hasNextPage={false} lastPageNum={lastPageNum} setLastPageNum={setLastPageNum} - horisontal + horizontal noFaces message={fetched[id] ? 'No manga was found!' : undefined} inLibraryIndicator