diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index 6d5b62ba..a0560625 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -1442,7 +1442,8 @@ "genreMovies": "{{genre}} Movies", "genreShows": "{{genre}} Shows", "categoryMovies": "{{category}} Movies", - "categoryShows": "{{category}} Shows" + "categoryShows": "{{category}} Shows", + "top10": "Top 10" }, "change": "Change", "more": "View more" diff --git a/src/backend/metadata/traktApi.ts b/src/backend/metadata/traktApi.ts index e7bc4edd..52132a8f 100644 --- a/src/backend/metadata/traktApi.ts +++ b/src/backend/metadata/traktApi.ts @@ -303,6 +303,7 @@ export const getParamountTVShows = () => fetchFromTrakt("/paramounttv"); // Popular content export const getPopularTVShows = () => fetchFromTrakt("/populartv"); export const getPopularMovies = () => fetchFromTrakt("/popularmovies"); +export const getTop10Movies = () => fetchFromTrakt("/top10"); // Discovery content used for the featured carousel export const getDiscoverContent = () => diff --git a/src/pages/discover/components/MediaCarousel.tsx b/src/pages/discover/components/MediaCarousel.tsx index 77a76f95..85c3301f 100644 --- a/src/pages/discover/components/MediaCarousel.tsx +++ b/src/pages/discover/components/MediaCarousel.tsx @@ -192,16 +192,20 @@ export function MediaCarousel({ ]); // Fetch media using our hook - const { media, sectionTitle, actualContentType } = useDiscoverMedia({ - contentType, - mediaType, - id: selectedProviderId || selectedGenreId || selectedRecommendationId, - fallbackType: content.fallback, - genreName: selectedGenreName, - providerName: selectedProviderName, - mediaTitle: selectedRecommendationTitle, - isCarouselView: true, - }); + const { media, sectionTitle, actualContentType, error, isLoading } = + useDiscoverMedia({ + contentType, + mediaType, + id: selectedProviderId || selectedGenreId || selectedRecommendationId, + fallbackType: content.fallback, + genreName: selectedGenreName, + providerName: selectedProviderName, + mediaTitle: selectedRecommendationTitle, + isCarouselView: true, + }); + + // Hide section if there's an error or no content (after loading is complete) + const shouldHide = !isLoading && (error || media.length === 0); // Find active button const activeButton = React.useMemo(() => { @@ -304,6 +308,11 @@ export function MediaCarousel({ actualContentType, ]); + // Hide the entire section if there's an error or no content + if (shouldHide) { + return null; + } + return (
diff --git a/src/pages/discover/discoverContent.tsx b/src/pages/discover/discoverContent.tsx index 75ba4fd2..a41c0635 100644 --- a/src/pages/discover/discoverContent.tsx +++ b/src/pages/discover/discoverContent.tsx @@ -76,6 +76,19 @@ export function DiscoverContent() { ); } + // Top 10 Movies + carousels.push( + , + ); + // Latest Releases carousels.push(