diff --git a/src/components/Discover/index.tsx b/src/components/Discover/index.tsx index bca0ca477..1a3fccf91 100644 --- a/src/components/Discover/index.tsx +++ b/src/components/Discover/index.tsx @@ -1,20 +1,13 @@ -import React, { useContext } from 'react'; +import React from 'react'; import useSWR from 'swr'; -import type { - MovieResult, - TvResult, - PersonResult, -} from '../../../server/models/Search'; -import TitleCard from '../TitleCard'; -import PersonCard from '../PersonCard'; import TmdbTitleCard from '../TitleCard/TmdbTitleCard'; import Slider from '../Slider'; import Link from 'next/link'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { LanguageContext } from '../../context/LanguageContext'; import type { MediaResultsResponse } from '../../../server/interfaces/api/mediaInterfaces'; import type { RequestResultsResponse } from '../../../server/interfaces/api/requestInterfaces'; import RequestCard from '../RequestCard'; +import MediaSlider from '../MediaSlider'; const messages = defineMessages({ recentrequests: 'Recent Requests', @@ -26,47 +19,8 @@ const messages = defineMessages({ trending: 'Trending', }); -interface MovieDiscoverResult { - page: number; - totalResults: number; - totalPages: number; - results: MovieResult[]; -} - -interface TvDiscoverResult { - page: number; - totalResults: number; - totalPages: number; - results: TvResult[]; -} - -interface MixedResult { - page: number; - totalResults: number; - totalPages: number; - results: (TvResult | MovieResult | PersonResult)[]; -} - const Discover: React.FC = () => { const intl = useIntl(); - const { locale } = useContext(LanguageContext); - const { data: movieData, error: movieError } = useSWR( - `/api/v1/discover/movies?language=${locale}` - ); - const { data: tvData, error: tvError } = useSWR( - `/api/v1/discover/tv?language=${locale}` - ); - - const { - data: movieUpcomingData, - error: movieUpcomingError, - } = useSWR( - `/api/v1/discover/movies/upcoming?language=${locale}` - ); - - const { data: trendingData, error: trendingError } = useSWR( - `/api/v1/discover/trending?language=${locale}` - ); const { data: media, error: mediaError } = useSWR( '/api/v1/media?filter=available&take=20&sort=mediaAdded' @@ -140,202 +94,29 @@ const Discover: React.FC = () => { placeholder={} emptyMessage={intl.formatMessage(messages.nopending)} /> -
- -
- ( - - ))} + title={intl.formatMessage(messages.upcoming)} + linkUrl="/discover/movies/upcoming" + url="/api/v1/discover/movies/upcoming" /> -
- -
- { - switch (title.mediaType) { - case 'movie': - return ( - - ); - case 'tv': - return ( - - ); - case 'person': - return ( - - ); - } - })} + title={intl.formatMessage(messages.trending)} + url="/api/v1/discover/trending" + linkUrl="/discover/trending" /> -
- -
- ( - - ))} + -
- -
- ( - - ))} + ); diff --git a/src/components/MediaSlider/index.tsx b/src/components/MediaSlider/index.tsx new file mode 100644 index 000000000..6640f5863 --- /dev/null +++ b/src/components/MediaSlider/index.tsx @@ -0,0 +1,121 @@ +import Link from 'next/link'; +import React, { useContext } from 'react'; +import useSWR 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'; + +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 } = useSWR(`${url}?language=${locale}`); + + if (hideWhenEmpty && (data?.results ?? []).length === 0) { + return null; + } + + return ( + <> +
+
+ {linkUrl ? ( + + + {title} + + + + + + ) : ( +
+ {title} +
+ )} +
+
+ { + switch (title.mediaType) { + case 'movie': + return ( + + ); + case 'tv': + return ( + + ); + case 'person': + return ( + + ); + } + })} + /> + + ); +}; + +export default MediaSlider; diff --git a/src/components/MovieDetails/index.tsx b/src/components/MovieDetails/index.tsx index 72bd923b1..22c683681 100644 --- a/src/components/MovieDetails/index.tsx +++ b/src/components/MovieDetails/index.tsx @@ -10,10 +10,8 @@ import type { MovieDetails as MovieDetailsType } from '../../../server/models/Mo import useSWR from 'swr'; import { useRouter } from 'next/router'; import Button from '../Common/Button'; -import type { MovieResult } from '../../../server/models/Search'; import Link from 'next/link'; import Slider from '../Slider'; -import TitleCard from '../TitleCard'; import PersonCard from '../PersonCard'; import { LanguageContext } from '../../context/LanguageContext'; import LoadingSpinner from '../Common/LoadingSpinner'; @@ -34,6 +32,7 @@ import ExternalLinkBlock from '../ExternalLinkBlock'; import { sortCrewPriority } from '../../utils/creditHelpers'; import StatusBadge from '../StatusBadge'; import RequestButton from '../RequestButton'; +import MediaSlider from '../MediaSlider'; const messages = defineMessages({ releasedate: 'Release Date', @@ -70,13 +69,6 @@ interface MovieDetailsProps { movie?: MovieDetailsType; } -interface SearchResult { - page: number; - totalResults: number; - totalPages: number; - results: MovieResult[]; -} - const MovieDetails: React.FC = ({ movie }) => { const { hasPermission } = useUser(); const router = useRouter(); @@ -89,12 +81,6 @@ const MovieDetails: React.FC = ({ movie }) => { initialData: movie, } ); - const { data: recommended, error: recommendedError } = useSWR( - `/api/v1/movie/${router.query.movieId}/recommendations?language=${locale}` - ); - const { data: similar, error: similarError } = useSWR( - `/api/v1/movie/${router.query.movieId}/similar?language=${locale}` - ); const { data: ratingData } = useSWR( `/api/v1/movie/${router.query.movieId}/ratings` ); @@ -525,106 +511,20 @@ const MovieDetails: React.FC = ({ movie }) => { /> ))} /> - {(recommended?.results ?? []).length > 0 && ( - <> -
- -
- ( - - ))} - /> - - )} - {(similar?.results ?? []).length > 0 && ( - <> -
- -
- ( - - ))} - /> - - )} + +
); diff --git a/src/components/TvDetails/index.tsx b/src/components/TvDetails/index.tsx index 615f969ad..ff2cd7282 100644 --- a/src/components/TvDetails/index.tsx +++ b/src/components/TvDetails/index.tsx @@ -8,10 +8,8 @@ import { import useSWR from 'swr'; import { useRouter } from 'next/router'; import Button from '../Common/Button'; -import type { TvResult } from '../../../server/models/Search'; import Link from 'next/link'; import Slider from '../Slider'; -import TitleCard from '../TitleCard'; import PersonCard from '../PersonCard'; import { LanguageContext } from '../../context/LanguageContext'; import LoadingSpinner from '../Common/LoadingSpinner'; @@ -36,6 +34,7 @@ import { sortCrewPriority } from '../../utils/creditHelpers'; import { Crew } from '../../../server/models/common'; import StatusBadge from '../StatusBadge'; import RequestButton from '../RequestButton'; +import MediaSlider from '../MediaSlider'; const messages = defineMessages({ firstAirDate: 'First Air Date', @@ -70,13 +69,6 @@ interface TvDetailsProps { tv?: TvDetailsType; } -interface SearchResult { - page: number; - totalResults: number; - totalPages: number; - results: TvResult[]; -} - const TvDetails: React.FC = ({ tv }) => { const { hasPermission } = useUser(); const router = useRouter(); @@ -90,12 +82,6 @@ const TvDetails: React.FC = ({ tv }) => { initialData: tv, } ); - const { data: recommended, error: recommendedError } = useSWR( - `/api/v1/tv/${router.query.tvId}/recommendations?language=${locale}` - ); - const { data: similar, error: similarError } = useSWR( - `/api/v1/tv/${router.query.tvId}/similar?language=${locale}` - ); const { data: ratingData } = useSWR( `/api/v1/tv/${router.query.tvId}/ratings` @@ -528,103 +514,20 @@ const TvDetails: React.FC = ({ tv }) => { /> ))} /> - {(recommended?.results ?? []).length > 0 && ( - <> -
- -
- ( - - ))} - /> - - )} - {(similar?.results ?? []).length > 0 && ( - <> -
- -
- ( - - ))} - /> - - )} + +
);