import Link from 'next/link'; import React, { useContext, useEffect } from 'react'; import { useSWRInfinite } from 'swr'; import { MediaStatus } from '../../../server/constants/media'; import type { MovieResult, PersonResult, TvResult, } from '../../../server/models/Search'; import { LanguageContext } from '../../context/LanguageContext'; import useSettings from '../../hooks/useSettings'; 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 settings = useSettings(); const { locale } = useContext(LanguageContext); const { data, error, setSize, size } = useSWRInfinite( (pageIndex: number, previousPageData: MixedResult | null) => { if (previousPageData && pageIndex + 1 > previousPageData.totalPages) { return null; } return `${url}?page=${pageIndex + 1}&language=${locale}`; }, { initialSize: 2, } ); let titles = (data ?? []).reduce( (a, v) => [...a, ...v.results], [] as (MovieResult | TvResult | PersonResult)[] ); if (settings.currentSettings.hideAvailable) { titles = titles.filter( (i) => (i.mediaType === 'movie' || i.mediaType === 'tv') && i.mediaInfo?.status !== MediaStatus.AVAILABLE && i.mediaInfo?.status !== MediaStatus.PARTIALLY_AVAILABLE ); } useEffect(() => { if ( titles.length < 24 && size < 5 && (data?.[0]?.totalResults ?? 0) > size * 20 ) { setSize(size + 1); } }, [titles, setSize, size, data]); if (hideWhenEmpty && (data?.[0].results ?? []).length === 0) { return null; } const finalTitles = titles.slice(0, 20).map((title) => { switch (title.mediaType) { case 'movie': return ( 0} /> ); case 'tv': return ( 0} /> ); case 'person': return ( ); } }); if (linkUrl && titles.length > 20) { finalTitles.push( title.mediaType !== 'person' ? title.posterPath : undefined )} /> ); } return ( <>
{linkUrl ? ( {title} ) : (
{title}
)}
); }; export default MediaSlider;