import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAsyncFn } from "react-use"; import { searchForMedia } from "@/backend/metadata/search"; import { MWQuery } from "@/backend/metadata/types/mw"; import { IconPatch } from "@/components/buttons/IconPatch"; import { Icons } from "@/components/Icon"; import { SectionHeading } from "@/components/layout/SectionHeading"; import { MediaGrid } from "@/components/media/MediaGrid"; import { WatchedMediaCard } from "@/components/media/WatchedMediaCard"; import { Button } from "@/pages/About"; import { SearchLoadingPart } from "@/pages/parts/search/SearchLoadingPart"; import { MediaItem } from "@/utils/mediaTypes"; function SearchSuffix(props: { failed?: boolean; results?: number }) { const { t } = useTranslation(); const navigate = useNavigate(); const icon: Icons = props.failed ? Icons.WARNING : Icons.EYE_SLASH; return (
{/* standard suffix */} {!props.failed ? (
{(props.results ?? 0) > 0 ? ( <>

{t("home.search.allResults")}

) : (

{t("home.search.noResults")}

)}
) : null} {/* Error result */} {props.failed ? (

{t("home.search.failed")}

) : null}
); } export function SearchListPart({ searchQuery, onShowDetails, }: { searchQuery: string; onShowDetails?: (media: MediaItem) => void; }) { const { t } = useTranslation(); const [results, setResults] = useState([]); const [state, exec] = useAsyncFn((query: MWQuery) => searchForMedia(query)); useEffect(() => { async function runSearch(query: MWQuery) { const searchResults = await exec(query); if (!searchResults) return; setResults(searchResults); } if (searchQuery !== "") runSearch({ searchQuery }); }, [searchQuery, exec]); if (state.loading) return ; if (state.error) return ; if (!results) return null; return (
{results.length > 0 ? (
{results.map((v) => ( ))}
) : null}
); }