import React, { useContext, useState } from 'react'; import type { MediaRequest } from '../../../server/entity/MediaRequest'; import type { TvDetails } from '../../../server/models/Tv'; import type { MovieDetails } from '../../../server/models/Movie'; import useSWR from 'swr'; import { LanguageContext } from '../../context/LanguageContext'; import { MediaStatus, MediaRequestStatus, } from '../../../server/constants/media'; import Badge from '../Common/Badge'; import { useUser, Permission } from '../../hooks/useUser'; import axios from 'axios'; import Button from '../Common/Button'; import { withProperties } from '../../utils/typeHelpers'; import Link from 'next/link'; const isMovie = (movie: MovieDetails | TvDetails): movie is MovieDetails => { return (movie as MovieDetails).title !== undefined; }; const RequestCardPlaceholder: React.FC = () => { return (
); }; interface RequestCardProps { request: MediaRequest; } const RequestCard: React.FC = ({ request }) => { const { hasPermission } = useUser(); const { locale } = useContext(LanguageContext); const url = request.type === 'movie' ? `/api/v1/movie/${request.media.tmdbId}` : `/api/v1/tv/${request.media.tmdbId}`; const { data: title, error } = useSWR( `${url}?language=${locale}` ); const { data: requestData, error: requestError, revalidate } = useSWR< MediaRequest >(`/api/v1/request/${request.id}`, { initialData: request, }); const modifyRequest = async (type: 'approve' | 'decline') => { const response = await axios.get(`/api/v1/request/${request.id}/${type}`); if (response) { revalidate(); } }; if (!title && !error) { return ; } if (!requestData && !requestError) { return ; } if (!title || !requestData) { return ; } return (

{isMovie(title) ? title.title : title.name}

Requested by {requestData.requestedBy.username}
{requestData.media.status === MediaStatus.AVAILABLE && ( Available )} {requestData.media.status === MediaStatus.PARTIALLY_AVAILABLE && ( Partially Available )} {requestData.media.status === MediaStatus.PROCESSING && ( Unavailable )} {requestData.media.status === MediaStatus.PENDING && ( Pending )}
{request.seasons.length > 0 && (
Seasons {request.seasons.map((season) => ( {season.seasonNumber} ))}
)} {requestData.status === MediaRequestStatus.PENDING && hasPermission(Permission.MANAGE_REQUESTS) && (
)}
); }; export default withProperties(RequestCard, { Placeholder: RequestCardPlaceholder, });