|
|
|
@ -233,8 +233,12 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
|
|
|
|
movieAttributes.push(
|
|
|
|
|
data.genres
|
|
|
|
|
.map((g) => (
|
|
|
|
|
<Link href={`/discover/movies?genre=${g.id}`} key={`genre-${g.id}`}>
|
|
|
|
|
<a className="hover:underline">{g.name}</a>
|
|
|
|
|
<Link
|
|
|
|
|
href={`/discover/movies?genre=${g.id}`}
|
|
|
|
|
key={`genre-${g.id}`}
|
|
|
|
|
className="hover:underline"
|
|
|
|
|
>
|
|
|
|
|
{g.name}
|
|
|
|
|
</Link>
|
|
|
|
|
))
|
|
|
|
|
.reduce((prev, curr) => (
|
|
|
|
@ -448,18 +452,19 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
|
|
|
|
{sortedCrew.slice(0, 6).map((person) => (
|
|
|
|
|
<li key={`crew-${person.job}-${person.id}`}>
|
|
|
|
|
<span>{person.job}</span>
|
|
|
|
|
<Link href={`/person/${person.id}`}>
|
|
|
|
|
<a className="crew-name">{person.name}</a>
|
|
|
|
|
<Link href={`/person/${person.id}`} className="crew-name">
|
|
|
|
|
{person.name}
|
|
|
|
|
</Link>
|
|
|
|
|
</li>
|
|
|
|
|
))}
|
|
|
|
|
</ul>
|
|
|
|
|
<div className="mt-4 flex justify-end">
|
|
|
|
|
<Link href={`/movie/${data.id}/crew`}>
|
|
|
|
|
<a className="flex items-center text-gray-400 transition duration-300 hover:text-gray-100">
|
|
|
|
|
<span>{intl.formatMessage(messages.viewfullcrew)}</span>
|
|
|
|
|
<ArrowRightCircleIcon className="ml-1.5 inline-block h-5 w-5" />
|
|
|
|
|
</a>
|
|
|
|
|
<Link
|
|
|
|
|
href={`/movie/${data.id}/crew`}
|
|
|
|
|
className="flex items-center text-gray-400 transition duration-300 hover:text-gray-100"
|
|
|
|
|
>
|
|
|
|
|
<span>{intl.formatMessage(messages.viewfullcrew)}</span>
|
|
|
|
|
<ArrowRightCircleIcon className="ml-1.5 inline-block h-5 w-5" />
|
|
|
|
|
</Link>
|
|
|
|
|
</div>
|
|
|
|
|
</>
|
|
|
|
@ -470,10 +475,9 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
|
|
|
|
<Link
|
|
|
|
|
href={`/discover/movies?keywords=${keyword.id}`}
|
|
|
|
|
key={`keyword-id-${keyword.id}`}
|
|
|
|
|
className="mb-2 mr-2 inline-flex last:mr-0"
|
|
|
|
|
>
|
|
|
|
|
<a className="mb-2 mr-2 inline-flex last:mr-0">
|
|
|
|
|
<Tag>{keyword.name}</Tag>
|
|
|
|
|
</a>
|
|
|
|
|
<Tag>{keyword.name}</Tag>
|
|
|
|
|
</Link>
|
|
|
|
|
))}
|
|
|
|
|
</div>
|
|
|
|
@ -483,31 +487,29 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
|
|
|
|
{data.collection && (
|
|
|
|
|
<div className="mb-6">
|
|
|
|
|
<Link href={`/collection/${data.collection.id}`}>
|
|
|
|
|
<a>
|
|
|
|
|
<div className="group relative z-0 scale-100 transform-gpu cursor-pointer overflow-hidden rounded-lg bg-gray-800 bg-cover bg-center shadow-md ring-1 ring-gray-700 transition duration-300 hover:scale-105 hover:ring-gray-500">
|
|
|
|
|
<div className="absolute inset-0 z-0">
|
|
|
|
|
<CachedImage
|
|
|
|
|
src={`https://image.tmdb.org/t/p/w1440_and_h320_multi_faces/${data.collection.backdropPath}`}
|
|
|
|
|
alt=""
|
|
|
|
|
layout="fill"
|
|
|
|
|
objectFit="cover"
|
|
|
|
|
/>
|
|
|
|
|
<div
|
|
|
|
|
className="absolute inset-0"
|
|
|
|
|
style={{
|
|
|
|
|
backgroundImage:
|
|
|
|
|
'linear-gradient(180deg, rgba(31, 41, 55, 0.47) 0%, rgba(31, 41, 55, 0.80) 100%)',
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="relative z-10 flex h-full items-center justify-between p-4 text-gray-200 transition duration-300 group-hover:text-white">
|
|
|
|
|
<div>{data.collection.name}</div>
|
|
|
|
|
<Button buttonSize="sm">
|
|
|
|
|
{intl.formatMessage(globalMessages.view)}
|
|
|
|
|
</Button>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="group relative z-0 scale-100 transform-gpu cursor-pointer overflow-hidden rounded-lg bg-gray-800 bg-cover bg-center shadow-md ring-1 ring-gray-700 transition duration-300 hover:scale-105 hover:ring-gray-500">
|
|
|
|
|
<div className="absolute inset-0 z-0">
|
|
|
|
|
<CachedImage
|
|
|
|
|
src={`https://image.tmdb.org/t/p/w1440_and_h320_multi_faces/${data.collection.backdropPath}`}
|
|
|
|
|
alt=""
|
|
|
|
|
layout="fill"
|
|
|
|
|
objectFit="cover"
|
|
|
|
|
/>
|
|
|
|
|
<div
|
|
|
|
|
className="absolute inset-0"
|
|
|
|
|
style={{
|
|
|
|
|
backgroundImage:
|
|
|
|
|
'linear-gradient(180deg, rgba(31, 41, 55, 0.47) 0%, rgba(31, 41, 55, 0.80) 100%)',
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</a>
|
|
|
|
|
<div className="relative z-10 flex h-full items-center justify-between p-4 text-gray-200 transition duration-300 group-hover:text-white">
|
|
|
|
|
<div>{data.collection.name}</div>
|
|
|
|
|
<Button buttonSize="sm">
|
|
|
|
|
{intl.formatMessage(globalMessages.view)}
|
|
|
|
|
</Button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</Link>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
@ -704,15 +706,13 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
|
|
|
|
<Link
|
|
|
|
|
href={`/discover/movies/language/${data.originalLanguage}`}
|
|
|
|
|
>
|
|
|
|
|
<a>
|
|
|
|
|
{intl.formatDisplayName(data.originalLanguage, {
|
|
|
|
|
type: 'language',
|
|
|
|
|
fallback: 'none',
|
|
|
|
|
}) ??
|
|
|
|
|
data.spokenLanguages.find(
|
|
|
|
|
(lng) => lng.iso_639_1 === data.originalLanguage
|
|
|
|
|
)?.name}
|
|
|
|
|
</a>
|
|
|
|
|
{intl.formatDisplayName(data.originalLanguage, {
|
|
|
|
|
type: 'language',
|
|
|
|
|
fallback: 'none',
|
|
|
|
|
}) ??
|
|
|
|
|
data.spokenLanguages.find(
|
|
|
|
|
(lng) => lng.iso_639_1 === data.originalLanguage
|
|
|
|
|
)?.name}
|
|
|
|
|
</Link>
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
@ -768,8 +768,9 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
|
|
|
|
<Link
|
|
|
|
|
href={`/discover/movies/studio/${s.id}`}
|
|
|
|
|
key={`studio-${s.id}`}
|
|
|
|
|
className="block"
|
|
|
|
|
>
|
|
|
|
|
<a className="block">{s.name}</a>
|
|
|
|
|
{s.name}
|
|
|
|
|
</Link>
|
|
|
|
|
);
|
|
|
|
|
})}
|
|
|
|
@ -827,11 +828,13 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
|
|
|
|
{data.credits.cast.length > 0 && (
|
|
|
|
|
<>
|
|
|
|
|
<div className="slider-header">
|
|
|
|
|
<Link href="/movie/[movieId]/cast" as={`/movie/${data.id}/cast`}>
|
|
|
|
|
<a className="slider-title">
|
|
|
|
|
<span>{intl.formatMessage(messages.cast)}</span>
|
|
|
|
|
<ArrowRightCircleIcon />
|
|
|
|
|
</a>
|
|
|
|
|
<Link
|
|
|
|
|
href="/movie/[movieId]/cast"
|
|
|
|
|
as={`/movie/${data.id}/cast`}
|
|
|
|
|
className="slider-title"
|
|
|
|
|
>
|
|
|
|
|
<span>{intl.formatMessage(messages.cast)}</span>
|
|
|
|
|
<ArrowRightCircleIcon />
|
|
|
|
|
</Link>
|
|
|
|
|
</div>
|
|
|
|
|
<Slider
|
|
|
|
|