Files
jellyseerr/src/components/TitleCard/TmdbTitleCard.tsx
Ryan Cohen 16545eec22 feat: tooltip foundation (#2950)
* feat: add foundation for tooltips

* fix: add lang

* refactor: remove React import where no longer necessary
2022-08-19 19:35:50 +09:00

64 lines
1.5 KiB
TypeScript

import { useInView } from 'react-intersection-observer';
import useSWR from 'swr';
import TitleCard from '.';
import type { MovieDetails } from '../../../server/models/Movie';
import type { TvDetails } from '../../../server/models/Tv';
interface TmdbTitleCardProps {
tmdbId: number;
type: 'movie' | 'tv';
}
const isMovie = (movie: MovieDetails | TvDetails): movie is MovieDetails => {
return (movie as MovieDetails).title !== undefined;
};
const TmdbTitleCard = ({ tmdbId, type }: TmdbTitleCardProps) => {
const { ref, inView } = useInView({
triggerOnce: true,
});
const url =
type === 'movie' ? `/api/v1/movie/${tmdbId}` : `/api/v1/tv/${tmdbId}`;
const { data: title, error } = useSWR<MovieDetails | TvDetails>(
inView ? `${url}` : null
);
if (!title && !error) {
return (
<div ref={ref}>
<TitleCard.Placeholder />
</div>
);
}
if (!title) {
return <TitleCard.Placeholder />;
}
return isMovie(title) ? (
<TitleCard
id={title.id}
image={title.posterPath}
status={title.mediaInfo?.status}
summary={title.overview}
title={title.title}
userScore={title.voteAverage}
year={title.releaseDate}
mediaType={'movie'}
/>
) : (
<TitleCard
id={title.id}
image={title.posterPath}
status={title.mediaInfo?.status}
summary={title.overview}
title={title.name}
userScore={title.voteAverage}
year={title.firstAirDate}
mediaType={'tv'}
/>
);
};
export default TmdbTitleCard;