import React, { useState } from 'react'; import { useToasts } from 'react-toast-notifications'; import type { MediaType } from '../../../server/models/Search'; import Available from '../../assets/available.svg'; import Requested from '../../assets/requested.svg'; import Unavailable from '../../assets/unavailable.svg'; import { withProperties } from '../../utils/typeHelpers'; import Transition from '../Transition'; import Placeholder from './Placeholder'; import axios from 'axios'; import { MediaRequest } from '../../../server/entity/MediaRequest'; import MovieRequestModal from '../RequestModal/MovieRequestModal'; import Link from 'next/link'; import { MediaStatus } from '../../../server/constants/media'; interface TitleCardProps { id: number; image?: string; summary?: string; year: string; title: string; userScore: number; mediaType: MediaType; status?: MediaStatus; requestId?: number; } const TitleCard: React.FC = ({ id, image, summary, year, title, status, mediaType, requestId, }) => { const { addToast } = useToasts(); const [isUpdating, setIsUpdating] = useState(false); const [currentStatus, setCurrentStatus] = useState(status); const [showDetail, setShowDetail] = useState(false); const [showRequestModal, setShowRequestModal] = useState(false); const [showCancelModal, setShowCancelModal] = useState(false); const request = async () => { setIsUpdating(true); const response = await axios.post('/api/v1/request', { mediaId: id, mediaType, }); if (response.data) { setCurrentStatus(response.data.media.status); addToast( {title} succesfully requested! , { appearance: 'success', autoDismiss: true } ); } setIsUpdating(false); }; const cancelRequest = async () => { const response = await axios.delete( `/api/v1/request/${requestId}` ); if (response.data.id) { setCurrentStatus(undefined); } }; // Just to get the year from the date if (year) { year = year.slice(0, 4); } return (
setShowRequestModal(false)} onOk={() => request()} /> setShowCancelModal(false)} onOk={() => cancelRequest()} />
setShowDetail(true)} onMouseLeave={() => setShowDetail(false)} onClick={() => setShowDetail(true)} onKeyDown={(e) => { if (e.key === 'Enter') { setShowDetail(true); } }} role="link" tabIndex={0} >
{mediaType === 'movie' ? 'MOVIE' : 'TV SHOW'}
{currentStatus === MediaStatus.AVAILABLE && ( )} {currentStatus === MediaStatus.PENDING && ( )} {currentStatus === MediaStatus.PROCESSING && ( )}
{year}

{title}

{summary}
{!currentStatus && ( )} {currentStatus === MediaStatus.PENDING && ( )} {currentStatus === MediaStatus.PROCESSING && ( )} {currentStatus === MediaStatus.AVAILABLE && ( )}
); }; export default withProperties(TitleCard, { Placeholder });