From 8a9324f60415177de2e7e6619abd4290f256d51c Mon Sep 17 00:00:00 2001 From: akxer <> Date: Sun, 12 Feb 2023 17:40:49 +0530 Subject: [PATCH 1/3] add pagination to library and fix some prettier issues --- src/screens/Reader.tsx | 1 + src/screens/SourceMangas.tsx | 1 + src/typings.d.ts | 1 + 3 files changed, 3 insertions(+) diff --git a/src/screens/Reader.tsx b/src/screens/Reader.tsx index a4d2ad03b0..3ed165a96f 100644 --- a/src/screens/Reader.tsx +++ b/src/screens/Reader.tsx @@ -70,6 +70,7 @@ export default function Reader() { id: +mangaId, title: '', thumbnailUrl: '', + genre: [], }); const [chapter, setChapter] = useState(initialChapter()); const [curPage, setCurPage] = useState(0); diff --git a/src/screens/SourceMangas.tsx b/src/screens/SourceMangas.tsx index 2e96e87e97..91e9089ea8 100644 --- a/src/screens/SourceMangas.tsx +++ b/src/screens/SourceMangas.tsx @@ -202,6 +202,7 @@ export default function SourceMangas(props: { popular: boolean }) { thumbnailUrl: it.thumbnailUrl, id: it.id, inLibrary: it.inLibrary, + genre: it.genre, })), ]); setHasNextPage(data.hasNextPage); diff --git a/src/typings.d.ts b/src/typings.d.ts index 442560bd52..23079a6b3a 100644 --- a/src/typings.d.ts +++ b/src/typings.d.ts @@ -78,6 +78,7 @@ type MetadataKeyValuePair = [AppMetadataKeys, AllowedMetadataValueTypes]; interface IMangaCard { id: number; title: string; + genre: string[]; thumbnailUrl: string; unreadCount?: number; downloadCount?: number; From ba7eba4c43f976e643a6a1ec1c1dd0118cc59e08 Mon Sep 17 00:00:00 2001 From: akxer <> Date: Sun, 12 Feb 2023 18:27:04 +0530 Subject: [PATCH 2/3] add genre search support like tachiyomi android app --- src/components/library/LibraryMangaGrid.tsx | 23 +++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/components/library/LibraryMangaGrid.tsx b/src/components/library/LibraryMangaGrid.tsx index b951e2fa9e..b0ef23c409 100644 --- a/src/components/library/LibraryMangaGrid.tsx +++ b/src/components/library/LibraryMangaGrid.tsx @@ -41,19 +41,38 @@ const queryFilter = (query: NullAndUndefined, { title }: IMangaCard): bo return title.toLowerCase().includes(query.toLowerCase()); }; +const queryGenreFilter = (query: NullAndUndefined, { genre }: IMangaCard): boolean => { + if (!query) return true; + const queries = query.split(',').map((str) => str.toLowerCase().trim()); + return queries.every((element) => genre.map((el) => el.toLowerCase()).includes(element)); +}; + const filterManga = ( manga: IMangaCard[], query: NullAndUndefined, unread: NullAndUndefined, downloaded: NullAndUndefined, -): IMangaCard[] => - manga.filter((m) => { +): IMangaCard[] => { + if (query) { + const titleFilteredManga = manga.filter((m) => queryFilter(query, m)); + const genreFilteredManga = manga.filter((m) => queryGenreFilter(query, m)); + const unique = titleFilteredManga.concat(genreFilteredManga).reduce((acc: Record, obj) => { + const { id } = obj; + if (!acc[id]) { + acc[id] = obj; + } + return acc; + }, {}); + return Object.values(unique); + } + return manga.filter((m) => { if (query) { return queryFilter(query, m); } return downloadedFilter(downloaded, m) && unreadFilter(unread, m); }); +}; const sortByUnread = (a: IMangaCard, b: IMangaCard): number => // eslint-disable-next-line implicit-arrow-linebreak From 6a3f7c5176bf90e6af18253a77959321b93befa3 Mon Sep 17 00:00:00 2001 From: akxer <> Date: Sun, 12 Feb 2023 21:54:29 +0530 Subject: [PATCH 3/3] Search by genre like you do in tachiyomi mobile app --- src/components/library/LibraryMangaGrid.tsx | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/components/library/LibraryMangaGrid.tsx b/src/components/library/LibraryMangaGrid.tsx index b0ef23c409..e43f88da97 100644 --- a/src/components/library/LibraryMangaGrid.tsx +++ b/src/components/library/LibraryMangaGrid.tsx @@ -53,6 +53,7 @@ const filterManga = ( unread: NullAndUndefined, downloaded: NullAndUndefined, ): IMangaCard[] => { + let filteredManga: IMangaCard[] = []; if (query) { const titleFilteredManga = manga.filter((m) => queryFilter(query, m)); const genreFilteredManga = manga.filter((m) => queryGenreFilter(query, m)); @@ -63,15 +64,12 @@ const filterManga = ( } return acc; }, {}); - return Object.values(unique); + filteredManga = Object.values(unique); } - return manga.filter((m) => { - if (query) { - return queryFilter(query, m); - } - - return downloadedFilter(downloaded, m) && unreadFilter(unread, m); - }); + filteredManga = (filteredManga.length ? filteredManga : manga).filter( + (m) => downloadedFilter(downloaded, m) && unreadFilter(unread, m), + ); + return filteredManga; }; const sortByUnread = (a: IMangaCard, b: IMangaCard): number =>