|
|
|
import { ArrowCircleRightIcon } from '@heroicons/react/outline';
|
|
|
|
import Link from 'next/link';
|
|
|
|
import React from 'react';
|
|
|
|
import { defineMessages, useIntl } from 'react-intl';
|
|
|
|
import useSWR from 'swr';
|
|
|
|
import { GenreSliderItem } from '../../../../server/interfaces/api/discoverInterfaces';
|
|
|
|
import GenreCard from '../../GenreCard';
|
|
|
|
import Slider from '../../Slider';
|
|
|
|
import { genreColorMap } from '../constants';
|
|
|
|
|
|
|
|
const messages = defineMessages({
|
|
|
|
tvgenres: 'Series Genres',
|
|
|
|
});
|
|
|
|
|
|
|
|
const TvGenreSlider: React.FC = () => {
|
|
|
|
const intl = useIntl();
|
|
|
|
const { data, error } = useSWR<GenreSliderItem[]>(
|
|
|
|
`/api/v1/discover/genreslider/tv`,
|
|
|
|
{
|
|
|
|
refreshInterval: 0,
|
|
|
|
revalidateOnFocus: false,
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<>
|
|
|
|
<div className="slider-header">
|
|
|
|
<Link href="/discover/tv/genres">
|
|
|
|
<a className="slider-title">
|
|
|
|
<span>{intl.formatMessage(messages.tvgenres)}</span>
|
|
|
|
<ArrowCircleRightIcon className="w-6 h-6 ml-2" />
|
|
|
|
</a>
|
|
|
|
</Link>
|
|
|
|
</div>
|
|
|
|
<Slider
|
|
|
|
sliderKey="tv-genres"
|
|
|
|
isLoading={!data && !error}
|
|
|
|
isEmpty={false}
|
|
|
|
items={(data ?? []).map((genre, index) => (
|
|
|
|
<GenreCard
|
|
|
|
key={`genre-tv-${genre.id}-${index}`}
|
|
|
|
name={genre.name}
|
|
|
|
image={`https://image.tmdb.org/t/p/w1280_filter(duotone,${
|
|
|
|
genreColorMap[genre.id] ?? genreColorMap[0]
|
|
|
|
})${genre.backdrops[4]}`}
|
|
|
|
url={`/discover/tv/genre/${genre.id}`}
|
|
|
|
/>
|
|
|
|
))}
|
|
|
|
placeholder={<GenreCard.Placeholder />}
|
|
|
|
emptyMessage=""
|
|
|
|
/>
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default React.memo(TvGenreSlider);
|