diff --git a/src/main/events/catalogue/search-games.ts b/src/main/events/catalogue/search-games.ts index 40b3b033..09ac2cee 100644 --- a/src/main/events/catalogue/search-games.ts +++ b/src/main/events/catalogue/search-games.ts @@ -2,13 +2,16 @@ import type { CatalogueSearchPayload } from "@types"; import { registerEvent } from "../register-event"; import { HydraApi } from "@main/services"; +const PAGE_SIZE = 12; + const searchGames = async ( _event: Electron.IpcMainInvokeEvent, - payload: CatalogueSearchPayload + payload: CatalogueSearchPayload, + page: number ) => { return HydraApi.post( "/catalogue/search", - { ...payload, take: 24, skip: 0 }, + { ...payload, take: page * PAGE_SIZE, skip: (page - 1) * PAGE_SIZE }, { needsAuth: false } ); }; diff --git a/src/preload/index.ts b/src/preload/index.ts index 8548754b..547607fb 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -55,8 +55,8 @@ contextBridge.exposeInMainWorld("electron", { }, /* Catalogue */ - searchGames: (payload: CatalogueSearchPayload) => - ipcRenderer.invoke("searchGames", payload), + searchGames: (payload: CatalogueSearchPayload, page: number) => + ipcRenderer.invoke("searchGames", payload, page), getCatalogue: (category: CatalogueCategory) => ipcRenderer.invoke("getCatalogue", category), getGameShopDetails: (objectId: string, shop: GameShop, language: string) => diff --git a/src/renderer/src/components/header/header.tsx b/src/renderer/src/components/header/header.tsx index 97ecbdc2..f53eb6e8 100644 --- a/src/renderer/src/components/header/header.tsx +++ b/src/renderer/src/components/header/header.tsx @@ -7,7 +7,7 @@ import { useAppDispatch, useAppSelector } from "@renderer/hooks"; import * as styles from "./header.css"; import { AutoUpdateSubHeader } from "./auto-update-sub-header"; -import { setSearch } from "@renderer/features"; +import { setFilters } from "@renderer/features"; const pathTitle: Record = { "/": "home", @@ -27,7 +27,7 @@ export function Header() { ); const searchValue = useAppSelector( - (state) => state.catalogueSearch.value.title + (state) => state.catalogueSearch.filters.title ); const dispatch = useAppDispatch(); @@ -59,7 +59,7 @@ export function Header() { }; const handleSearch = (value: string) => { - dispatch(setSearch({ title: value })); + dispatch(setFilters({ title: value })); if (!location.pathname.startsWith("/catalogue")) { navigate("/catalogue"); @@ -120,7 +120,7 @@ export function Header() { {searchValue && ( - - */} + {totalPages > 1 && ( +
+ {Array.from({ length: 3 }).map((_, i) => ( + + ))} +
+ )}
dispatch(setSearch({ genres: [] }))} + onClear={() => dispatch(setFilters({ genres: [] }))} color={filterCategoryColors.genres} onSelect={(value) => { if (filters.genres.includes(value)) { dispatch( - setSearch({ + setFilters({ genres: filters.genres.filter((genre) => genre !== value), }) ); } else { - dispatch(setSearch({ genres: [...filters.genres, value] })); + dispatch(setFilters({ genres: [...filters.genres, value] })); } }} items={[ @@ -329,17 +338,17 @@ export default function Catalogue() { dispatch(setSearch({ tags: [] }))} + onClear={() => dispatch(setFilters({ tags: [] }))} onSelect={(value) => { if (filters.tags.includes(Number(value))) { dispatch( - setSearch({ + setFilters({ tags: filters.tags.filter((tag) => tag !== Number(value)), }) ); } else { dispatch( - setSearch({ tags: [...filters.tags, Number(value)] }) + setFilters({ tags: [...filters.tags, Number(value)] }) ); } }} @@ -358,12 +367,12 @@ export default function Catalogue() { title={t("download_sources")} color={filterCategoryColors.downloadSourceFingerprints} onClear={() => - dispatch(setSearch({ downloadSourceFingerprints: [] })) + dispatch(setFilters({ downloadSourceFingerprints: [] })) } onSelect={(value) => { if (filters.downloadSourceFingerprints.includes(value)) { dispatch( - setSearch({ + setFilters({ downloadSourceFingerprints: filters.downloadSourceFingerprints.filter( (fingerprint) => fingerprint !== value @@ -372,7 +381,7 @@ export default function Catalogue() { ); } else { dispatch( - setSearch({ + setFilters({ downloadSourceFingerprints: [ ...filters.downloadSourceFingerprints, value, @@ -393,11 +402,11 @@ export default function Catalogue() { dispatch(setSearch({ developers: [] }))} + onClear={() => dispatch(setFilters({ developers: [] }))} onSelect={(value) => { if (filters.developers.includes(value)) { dispatch( - setSearch({ + setFilters({ developers: filters.developers.filter( (developer) => developer !== value ), @@ -405,7 +414,7 @@ export default function Catalogue() { ); } else { dispatch( - setSearch({ developers: [...filters.developers, value] }) + setFilters({ developers: [...filters.developers, value] }) ); } }} @@ -419,11 +428,11 @@ export default function Catalogue() { dispatch(setSearch({ publishers: [] }))} + onClear={() => dispatch(setFilters({ publishers: [] }))} onSelect={(value) => { if (filters.publishers.includes(value)) { dispatch( - setSearch({ + setFilters({ publishers: filters.publishers.filter( (publisher) => publisher !== value ), @@ -431,7 +440,7 @@ export default function Catalogue() { ); } else { dispatch( - setSearch({ publishers: [...filters.publishers, value] }) + setFilters({ publishers: [...filters.publishers, value] }) ); } }} diff --git a/src/renderer/src/pages/catalogue/filter-section.tsx b/src/renderer/src/pages/catalogue/filter-section.tsx index e82b9ded..4039ab59 100644 --- a/src/renderer/src/pages/catalogue/filter-section.tsx +++ b/src/renderer/src/pages/catalogue/filter-section.tsx @@ -45,6 +45,10 @@ export function FilterSection({ const { formatNumber } = useFormat(); + if (!items.length) { + return null; + } + return (
diff --git a/src/renderer/src/pages/settings/settings-download-sources.tsx b/src/renderer/src/pages/settings/settings-download-sources.tsx index f5c01a21..aabbab27 100644 --- a/src/renderer/src/pages/settings/settings-download-sources.tsx +++ b/src/renderer/src/pages/settings/settings-download-sources.tsx @@ -13,8 +13,9 @@ import { SPACING_UNIT, vars } from "@renderer/theme.css"; import { settingsContext } from "@renderer/context"; import { downloadSourcesTable } from "@renderer/dexie"; import { downloadSourcesWorker } from "@renderer/workers"; -import { clearSearch, setSearch } from "@renderer/features"; import { useNavigate } from "react-router-dom"; +import { clearFilters } from "@renderer/features"; +import { setFilters } from "@renderer/features"; export function SettingsDownloadSources() { const [showAddDownloadSourceModal, setShowAddDownloadSourceModal] = @@ -103,8 +104,8 @@ export function SettingsDownloadSources() { }; const navigateToCatalogue = (fingerprint: string) => { - dispatch(clearSearch()); - dispatch(setSearch({ downloadSourceFingerprints: [fingerprint] })); + dispatch(clearFilters()); + dispatch(setFilters({ downloadSourceFingerprints: [fingerprint] })); navigate("/catalogue"); }; diff --git a/src/renderer/src/workers/download-sources.worker.ts b/src/renderer/src/workers/download-sources.worker.ts index 185afed5..dd43b682 100644 --- a/src/renderer/src/workers/download-sources.worker.ts +++ b/src/renderer/src/workers/download-sources.worker.ts @@ -156,6 +156,7 @@ self.onmessage = async (event: MessageEvent) => { const existingRepacks = await repacksTable.toArray(); for (const downloadSource of downloadSources) { + console.log(downloadSource); if (!downloadSource.fingerprint) { await deleteDownloadSource(downloadSource.id); await importDownloadSource(downloadSource.url);