import React, { useState, useContext } from 'react'; import { FormattedMessage, defineMessages, FormattedNumber, FormattedDate, useIntl, } from 'react-intl'; import type { MovieDetails as MovieDetailsType } from '../../../server/models/Movie'; 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'; import { useUser, Permission } from '../../hooks/useUser'; import { MediaStatus } from '../../../server/constants/media'; import RequestModal from '../RequestModal'; const messages = defineMessages({ releasedate: 'Release Date', userrating: 'User Rating', status: 'Status', revenue: 'Revenue', budget: 'Budget', originallanguage: 'Original Language', overview: 'Overview', runtime: '{minutes} minutes', cast: 'Cast', recommendations: 'Recommendations', similar: 'Similar Titles', cancelrequest: 'Cancel Request', available: 'Available', unavailable: 'Unavailable', request: 'Request', pending: 'Pending', overviewunavailable: 'Overview unavailable', }); interface MovieDetailsProps { movie?: MovieDetailsType; } interface SearchResult { page: number; totalResults: number; totalPages: number; results: MovieResult[]; } enum MediaRequestStatus { PENDING = 1, APPROVED, DECLINED, AVAILABLE, } const MovieDetails: React.FC = ({ movie }) => { const { hasPermission } = useUser(); const router = useRouter(); const intl = useIntl(); const { locale } = useContext(LanguageContext); const [showRequestModal, setShowRequestModal] = useState(false); const { data, error, revalidate } = useSWR( `/api/v1/movie/${router.query.movieId}?language=${locale}`, { 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}` ); if (!data && !error) { return ; } if (!data) { return
Broken?
; } return (
{ revalidate(); setShowRequestModal(false); }} onCancel={() => setShowRequestModal(false)} />
{data.releaseDate.slice(0, 4)}

{data.title}

{(data.runtime ?? 0) > 0 && ( <> {' '} |{' '} )} {data.genres.map((g) => g.name).join(', ')}
{(!data.mediaInfo || data.mediaInfo?.status === MediaStatus.UNKNOWN) && ( )} {data.mediaInfo?.status === MediaStatus.PENDING && ( )} {data.mediaInfo?.status === MediaStatus.PROCESSING && ( )} {data.mediaInfo?.status === MediaStatus.AVAILABLE && ( )} {hasPermission(Permission.MANAGE_REQUESTS) && ( )}
{/* {data.mediaInfo?.status === MediaStatus.PENDING && hasPermission(Permission.MANAGE_REQUESTS) && ( revalidate()} /> )} */}

{data.overview ? data.overview : intl.formatMessage(messages.overviewunavailable)}

{data.voteCount > 0 && (
{data.voteAverage}/10
)}
{data.status}
{data.revenue > 0 && (
)} {data.budget > 0 && (
)}
{data.originalLanguage}
( ))} /> ( ))} /> ( ))} />
); }; export default MovieDetails;