fix more details modal stuff

This commit is contained in:
Pas 2025-06-02 11:36:29 -06:00
parent 0b54fc5182
commit db6fc4355d
5 changed files with 158 additions and 38 deletions

View file

@ -79,7 +79,19 @@ export function DetailsContent({ data, minimal = false }: DetailsContentProps) {
undefined,
formattedLanguage,
);
setImdbData(imdbMetadata);
// Transform the data to match the expected format
if (
typeof imdbMetadata.imdb_rating === "number" &&
typeof imdbMetadata.votes === "number"
) {
setImdbData({
rating: imdbMetadata.imdb_rating,
votes: imdbMetadata.votes,
trailer_url: imdbMetadata.trailer_url || null,
});
} else {
setImdbData(null);
}
// Fetch Rotten Tomatoes data
if (data.type === "movie") {
@ -176,15 +188,16 @@ export function DetailsContent({ data, minimal = false }: DetailsContentProps) {
)}
</div>
<div
className="absolute inset-0 bg-cover bg-center opacity-60 before:absolute before:inset-0 before:bg-[radial-gradient(circle_at_center,_transparent_0%,_rgba(0,0,0,0.5)_80%)]"
className="absolute inset-0 bg-cover bg-top opacity-60 before:absolute before:inset-0 before:bg-[radial-gradient(circle_at_center,_transparent_0%,_rgba(0,0,0,0.5)_80%)]"
style={{
backgroundImage: data.backdrop
? `url(${data.backdrop})`
: undefined,
backgroundPosition: "center top",
maskImage:
"linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1) 120px)",
"linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1) 150px)",
WebkitMaskImage:
"linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1) 120px)",
"linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1) 150px)",
zIndex: -1,
}}
/>
@ -204,6 +217,7 @@ export function DetailsContent({ data, minimal = false }: DetailsContentProps) {
seasons={
data.type === "show" ? data.seasonData?.seasons.length : undefined
}
imdbData={imdbData}
/>
{/* Two Column Layout - Stacked on Mobile */}

View file

@ -18,6 +18,7 @@ export function DetailsHeader({
voteCount,
releaseDate,
seasons,
imdbData,
}: DetailsHeaderProps) {
const formatDate = (dateString?: string) => {
if (!dateString) return null;
@ -30,7 +31,7 @@ export function DetailsHeader({
<div className="flex items-center gap-2 text-sm text-white/80">
{voteAverage && (
<div className="flex items-center gap-1">
<Icon icon={Icons.RISING_STAR} className="text-yellow-400" />
<Icon icon={Icons.TMDB} />
<span>{voteAverage.toFixed(1)}</span>
{voteCount && (
<span className="text-white/60">
@ -39,6 +40,20 @@ export function DetailsHeader({
)}
</div>
)}
{imdbData?.rating && (
<>
<span className="text-white/60"></span>
<div className="flex items-center gap-1">
<Icon icon={Icons.IMDB} className="text-yellow-400" />
<span>{imdbData.rating.toFixed(1)}</span>
{imdbData.votes && (
<span className="text-white/60">
({imdbData.votes.toLocaleString()})
</span>
)}
</div>
</>
)}
{releaseDate && (
<>
<span className="text-white/60"></span>

View file

@ -117,7 +117,7 @@ export function DetailsModal({ id, data, minimal }: DetailsModalProps) {
darken
close={modal.hide}
show={modal.isShown}
durationClass="duration-400"
durationClass="duration-500"
>
<Helmet>
<html data-no-scroll />

View file

@ -1,41 +1,128 @@
export function DetailsSkeleton() {
// Static arrays of unique identifiers for skeleton elements
const episodeSkeletons = [
"episode-skeleton-1",
"episode-skeleton-2",
"episode-skeleton-3",
"episode-skeleton-4",
];
const castSkeletons = [
"cast-skeleton-1",
"cast-skeleton-2",
"cast-skeleton-3",
"cast-skeleton-4",
"cast-skeleton-5",
"cast-skeleton-6",
];
return (
<div className="animate-pulse">
<div className="relative">
{/* Backdrop */}
<div className="h-64 relative -mt-12">
<div
className="absolute inset-0 bg-mediaCard-hoverBackground"
style={{
maskImage:
"linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1) 60px)",
WebkitMaskImage:
"linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1) 60px)",
}}
/>
<div className="relative h-full flex flex-col animate-pulse">
{/* Backdrop */}
<div
className="relative -mt-12 z-20"
style={{
height: "500px",
}}
>
{/* Title/Logo positioned on backdrop */}
<div className="absolute inset-x-0 bottom-20 z-30 px-6">
<div className="h-12 w-64 bg-white/10 rounded-lg" />{" "}
{/* Logo/Title placeholder */}
</div>
{/* Content */}
<div className="px-6 pb-6 mt-[-30px]">
<div className="h-8 w-3/4 bg-white/10 rounded mb-3" /> {/* Title */}
<div className="space-y-2 mb-6">
<div
className="absolute inset-0 bg-white/10"
style={{
maskImage:
"linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1) 120px)",
WebkitMaskImage:
"linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1) 120px)",
zIndex: -1,
}}
/>
</div>
{/* Content */}
<div className="px-6 pb-6 mt-[-70px] flex-grow relative z-30">
{/* Header */}
<div className="flex flex-wrap items-center gap-4 mb-6">
<div className="h-10 w-32 bg-white/10 rounded-lg" />{" "}
{/* Play button */}
<div className="h-10 w-32 bg-white/10 rounded-lg" />{" "}
{/* Trailer button */}
<div className="h-10 w-32 bg-white/10 rounded-lg" />{" "}
{/* Share button */}
<div className="flex-1" />
<div className="h-6 w-24 bg-white/10 rounded-lg" /> {/* Rating */}
<div className="h-6 w-24 bg-white/10 rounded-lg" />{" "}
{/* Release date */}
</div>
{/* Two Column Layout */}
<div className="grid grid-cols-1 md:grid-cols-3 md:gap-6 pt-4">
{/* Left Column - Main Content (2/3) */}
<div className="md:col-span-2">
{/* Description */}
<div className="h-4 bg-white/10 rounded w-full" />
<div className="h-4 bg-white/10 rounded w-full" />
<div className="h-4 bg-white/10 rounded w-full" />
<div className="h-4 bg-white/10 rounded w-3/4" />
<div className="space-y-2 mb-6">
<div className="h-4 bg-white/10 rounded w-full" />
<div className="h-4 bg-white/10 rounded w-full" />
<div className="h-4 bg-white/10 rounded w-3/4" />
</div>
{/* Genres */}
<div className="flex flex-wrap gap-2 mb-6">
<div className="h-6 w-20 bg-white/10 rounded-full" />
<div className="h-6 w-24 bg-white/10 rounded-full" />
<div className="h-6 w-16 bg-white/10 rounded-full" />
</div>
{/* Director and Cast */}
<div className="space-y-4 mb-6">
<div className="h-4 w-48 bg-white/10 rounded" /> {/* Director */}
<div className="h-4 w-64 bg-white/10 rounded" /> {/* Cast */}
</div>
</div>
{/* Additional details */}
<div className="grid grid-cols-2 gap-3 mb-6">
<div className="h-4 bg-white/10 rounded w-3/4" />
<div className="h-4 bg-white/10 rounded w-3/4" />
<div className="h-4 bg-white/10 rounded w-3/4" />
<div className="h-4 bg-white/10 rounded w-3/4" />
{/* Right Column - Details Info (1/3) */}
<div className="md:col-span-1">
<div className="bg-video-context-border p-4 rounded-lg border-buttons-primary bg-opacity-80">
<div className="space-y-3">
<div className="h-4 w-32 bg-white/10 rounded" /> {/* Runtime */}
<div className="h-4 w-24 bg-white/10 rounded" />{" "}
{/* Language */}
<div className="h-4 w-36 bg-white/10 rounded" />{" "}
{/* Release date */}
<div className="h-4 w-20 bg-white/10 rounded" /> {/* Rating */}
<div className="h-4 w-40 bg-white/10 rounded" />{" "}
{/* External ratings */}
</div>
</div>
</div>
{/* Genres */}
<div className="flex flex-wrap gap-2">
<div className="h-6 w-20 bg-white/10 rounded-full" />
<div className="h-6 w-24 bg-white/10 rounded-full" />
<div className="h-6 w-16 bg-white/10 rounded-full" />
</div>
{/* Episodes Carousel Skeleton */}
<div className="mt-8">
<div className="h-6 w-48 bg-white/10 rounded mb-4" />{" "}
{/* Season selector */}
<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4">
{episodeSkeletons.map((key) => (
<div key={key} className="aspect-video bg-white/10 rounded-lg" />
))}
</div>
</div>
{/* Cast Carousel Skeleton */}
<div className="mt-8">
<div className="h-6 w-32 bg-white/10 rounded mb-4" />{" "}
{/* Cast title */}
<div className="flex gap-4 overflow-x-auto pb-4">
{castSkeletons.map((key) => (
<div key={key} className="flex-shrink-0 w-32">
<div className="aspect-[2/3] bg-white/10 rounded-lg mb-2" />{" "}
{/* Profile image */}
<div className="h-4 w-24 bg-white/10 rounded mx-auto" />{" "}
{/* Name */}
</div>
))}
</div>
</div>
</div>

View file

@ -109,6 +109,10 @@ export interface DetailsHeaderProps {
voteCount?: number;
releaseDate?: string;
seasons?: number;
imdbData?: {
rating: number;
votes: number;
};
}
export interface DetailsInfoProps {