import React, { useState, useContext } from 'react'; import { FormattedMessage, defineMessages, FormattedNumber, FormattedDate, } from 'react-intl'; import type { MovieDetails as MovieDetailsType } from '../../../server/models/Movie'; import useSWR from 'swr'; import { useRouter } from 'next/router'; import { useToasts } from 'react-toast-notifications'; import Button from '../Common/Button'; import MovieRequestModal from '../RequestModal/MovieRequestModal'; import type { MediaRequest } from '../../../server/entity/MediaRequest'; import axios from 'axios'; 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'; 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', }); 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 router = useRouter(); const { locale } = useContext(LanguageContext); const { addToast } = useToasts(); const [showRequestModal, setShowRequestModal] = useState(false); const [showCancelModal, setShowCancelModal] = 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}` ); const request = async () => { const response = await axios.post('/api/v1/request', { mediaId: data?.id, mediaType: 'movie', }); if (response.data) { revalidate(); addToast( {data?.title} succesfully requested! , { appearance: 'success', autoDismiss: true } ); } }; const cancelRequest = async () => { const response = await axios.delete( `/api/v1/request/${data?.request?.id}` ); if (response.data.id) { revalidate(); } }; if (!data && !error) { return
loading!
; } if (!data) { return
Unknwon?
; } return (
setShowRequestModal(false)} onOk={() => request()} /> setShowCancelModal(false)} onOk={() => cancelRequest()} />
{data.releaseDate.slice(0, 4)}

{data.title}

{' '} | {data.genres.map((g) => g.name).join(', ')}
{!data.request && ( )} {data.request?.status === MediaRequestStatus.PENDING && ( )} {data.request?.status === MediaRequestStatus.APPROVED && ( )} {data.request?.status === MediaRequestStatus.AVAILABLE && ( )}

{data.overview}

{data.voteAverage}/10
{data.status}
{data.originalLanguage}
( ))} /> ( ))} /> ( ))} />
); }; export default MovieDetails;