import Link from 'next/link'; import React, { useContext } from 'react'; import { useSWRInfinite } from 'swr'; import type { MovieResult, PersonResult, TvResult, } from '../../../server/models/Search'; import { LanguageContext } from '../../context/LanguageContext'; import PersonCard from '../PersonCard'; import Slider from '../Slider'; import TitleCard from '../TitleCard'; import ShowMoreCard from './ShowMoreCard'; interface MixedResult { page: number; totalResults: number; totalPages: number; results: (TvResult | MovieResult | PersonResult)[]; } interface MediaSliderProps { title: string; url: string; linkUrl?: string; sliderKey: string; hideWhenEmpty?: boolean; } const MediaSlider: React.FC = ({ title, url, linkUrl, sliderKey, hideWhenEmpty = false, }) => { const { locale } = useContext(LanguageContext); const { data, error } = useSWRInfinite( (pageIndex: number, previousPageData: MixedResult | null) => { if (previousPageData && pageIndex + 1 > previousPageData.totalPages) { return null; } return `${url}?page=${pageIndex + 1}&language=${locale}`; }, { initialSize: 2, } ); if (hideWhenEmpty && (data?.[0].results ?? []).length === 0) { return null; } const titles = (data ?? []).reduce( (a, v) => [...a, ...v.results], [] as (MovieResult | TvResult | PersonResult)[] ); const finalTitles = titles.slice(0, 20).map((title) => { switch (title.mediaType) { case 'movie': return ( ); case 'tv': return ( ); case 'person': return ( ); } }); if (linkUrl && titles.length > 20) { finalTitles.push( title.mediaType !== 'person' ? title.posterPath : undefined )} /> ); } return ( <>
{linkUrl ? ( {title} ) : (
{title}
)}
); }; export default MediaSlider;