diff --git a/front/packages/ui/src/browse/index.tsx b/front/packages/ui/src/browse/index.tsx index a6db6f06..f66d3ac3 100644 --- a/front/packages/ui/src/browse/index.tsx +++ b/front/packages/ui/src/browse/index.tsx @@ -60,25 +60,28 @@ export const itemMap = ( item.kind === "show" ? item.watchStatus?.unseenEpisodesCount ?? item.episodesCount! : null, }); +export const createFilterString = (mediaType: MediaType): string | undefined => { + return mediaType !== MediaTypeAll ? `kind eq ${mediaType.key}` : undefined; +} + const query = ( mediaType: MediaType, sortKey?: SortBy, sortOrd?: SortOrd, ): QueryIdentifier => { - const filter = mediaType !== MediaTypeAll ? `kind eq ${mediaType.key}` : undefined; return { parser: LibraryItemP, path: ["items"], infinite: true, params: { sortBy: sortKey ? `${sortKey}:${sortOrd ?? "asc"}` : "name:asc", - filter, + filter: createFilterString(mediaType), fields: ["watchStatus", "episodesCount"], }, }; }; -const getMediaTypeFromParam = (mediaTypeParam?: string): MediaType => { +export const getMediaTypeFromParam = (mediaTypeParam?: string): MediaType => { const mediaTypeKey = (mediaTypeParam as MediaTypeKey) || MediaTypeKey.All; return MediaTypes.find((t) => t.key === mediaTypeKey) ?? MediaTypeAll; }; diff --git a/front/packages/ui/src/search/index.tsx b/front/packages/ui/src/search/index.tsx index 89ba727e..f67b3223 100644 --- a/front/packages/ui/src/search/index.tsx +++ b/front/packages/ui/src/search/index.tsx @@ -23,17 +23,18 @@ import { usePageStyle } from "@kyoo/primitives"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { createParam } from "solito"; -import { itemMap } from "../browse"; +import {createFilterString, getMediaTypeFromParam, itemMap} from "../browse"; import { ItemGrid } from "../browse/grid"; import { BrowseSettings } from "../browse/header"; import { ItemList } from "../browse/list"; -import { Layout, SearchSort, SortOrd } from "../browse/types"; +import {Layout, type MediaType, MediaTypes, SearchSort, SortOrd} from "../browse/types"; import { InfiniteFetch } from "../fetch-infinite"; import { DefaultLayout } from "../layout"; -const { useParam } = createParam<{ sortBy?: string }>(); +const { useParam } = createParam<{ sortBy?: string, mediaType?: string }>(); const query = ( + mediaType: MediaType, query?: string, sortKey?: SearchSort, sortOrd?: SortOrd, @@ -43,6 +44,7 @@ const query = ( infinite: true, params: { q: query, + filter: createFilterString(mediaType), sortBy: sortKey && sortKey !== SearchSort.Relevance ? `${sortKey}:${sortOrd ?? "asc"}` : undefined, }, @@ -52,15 +54,18 @@ export const SearchPage: QueryPage<{ q?: string }> = ({ q }) => { const pageStyle = usePageStyle(); const { t } = useTranslation(); const [sort, setSort] = useParam("sortBy"); + const [mediaTypeParam, setMediaTypeParam] = useParam("mediaType"); const sortKey = (sort?.split(":")[0] as SearchSort) || SearchSort.Relevance; const sortOrd = (sort?.split(":")[1] as SortOrd) || SortOrd.Asc; const [layout, setLayout] = useState(Layout.Grid); + const mediaType = getMediaTypeFromParam(mediaTypeParam); + console.log("search: mediaType", mediaType); const LayoutComponent = layout === Layout.Grid ? ItemGrid : ItemList; return ( = ({ q }) => { setSort={(key, ord) => { setSort(`${key}:${ord}`); }} + mediaType={mediaType} + availableMediaTypes={MediaTypes} + setMediaType={(mediaType) => { + setMediaTypeParam(mediaType.key); + }} layout={layout} setLayout={setLayout} /> @@ -84,6 +94,9 @@ export const SearchPage: QueryPage<{ q?: string }> = ({ q }) => { }; SearchPage.getLayout = DefaultLayout; -SearchPage.getFetchUrls = ({ q, sortBy }) => [ - query(q, sortBy?.split("-")[0] as SearchSort, sortBy?.split("-")[1] as SortOrd), -]; +SearchPage.getFetchUrls = ({ q, sortBy, mediaType }) => { + const mediaTypeObj = getMediaTypeFromParam(mediaType); + return [ + query(mediaTypeObj, q, sortBy?.split("-")[0] as SearchSort, sortBy?.split("-")[1] as SortOrd), + ]; +}