From ac722880c45c0c64d583b5c6d67bf2b3a2ac6547 Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Tue, 2 Dec 2025 10:13:08 -0700 Subject: [PATCH] update media card skeleton and on recomented carousel --- src/components/media/MediaCard.tsx | 16 +++++-- .../carousels/SimilarMediaCarousel.tsx | 46 +++++++++++++------ 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/src/components/media/MediaCard.tsx b/src/components/media/MediaCard.tsx index 763a24c6..4fd28646 100644 --- a/src/components/media/MediaCard.tsx +++ b/src/components/media/MediaCard.tsx @@ -49,10 +49,16 @@ function useIntersectionObserver(options: IntersectionObserverInit = {}) { } // Skeleton Component -function MediaCardSkeleton() { +export function MediaCardSkeleton() { return ( -
-
+ + +
{/* Poster skeleton - matches MediaCard poster dimensions exactly */}
@@ -71,8 +77,8 @@ function MediaCardSkeleton() {
-
-
+ + ); } diff --git a/src/components/overlays/detailsModal/components/carousels/SimilarMediaCarousel.tsx b/src/components/overlays/detailsModal/components/carousels/SimilarMediaCarousel.tsx index 81c96223..0dc808eb 100644 --- a/src/components/overlays/detailsModal/components/carousels/SimilarMediaCarousel.tsx +++ b/src/components/overlays/detailsModal/components/carousels/SimilarMediaCarousel.tsx @@ -3,7 +3,7 @@ import { useTranslation } from "react-i18next"; import { getMediaPoster, getRelatedMedia } from "@/backend/metadata/tmdb"; import { TMDBContentTypes } from "@/backend/metadata/types/tmdb"; -import { MediaCard } from "@/components/media/MediaCard"; +import { MediaCard, MediaCardSkeleton } from "@/components/media/MediaCard"; import { useIsMobile } from "@/hooks/useIsMobile"; import { CarouselNavButtons } from "@/pages/discover/components/CarouselNavButtons"; import { useOverlayStack } from "@/stores/interface/overlayStack"; @@ -22,6 +22,7 @@ export function SimilarMediaCarousel({ const { isMobile } = useIsMobile(); const { showModal } = useOverlayStack(); const [similarMedia, setSimilarMedia] = useState([]); + const [isLoading, setIsLoading] = useState(true); const carouselRef = useRef(null); const carouselRefs = useRef<{ [key: string]: HTMLDivElement | null }>({ similar: null, @@ -29,6 +30,7 @@ export function SimilarMediaCarousel({ useEffect(() => { const loadSimilarMedia = async () => { + setIsLoading(true); try { const results = await getRelatedMedia(mediaId, mediaType, 12); const mediaItems: MediaItem[] = results.map((result) => { @@ -57,6 +59,8 @@ export function SimilarMediaCarousel({ setSimilarMedia(mediaItems); } catch (err) { console.error("Failed to load similar media:", err); + } finally { + setIsLoading(false); } }; @@ -76,7 +80,7 @@ export function SimilarMediaCarousel({ }); }; - if (similarMedia.length === 0) return null; + if (!isLoading && similarMedia.length === 0) return null; return (
@@ -96,19 +100,31 @@ export function SimilarMediaCarousel({ >
- {similarMedia.map((media) => ( -
- -
- ))} + {isLoading + ? // Show skeleton cards while loading + Array.from({ length: 12 }, (_, i) => ( +
+ +
+ )) + : // Show actual media cards when loaded + similarMedia.map((media) => ( +
+ +
+ ))}