import React, { useContext } from 'react'; import type { MediaRequest } from '../../../../server/entity/MediaRequest'; import { useIntl, FormattedDate, FormattedRelativeTime, defineMessages, } from 'react-intl'; import { useUser, Permission } from '../../../hooks/useUser'; import { LanguageContext } from '../../../context/LanguageContext'; import type { MovieDetails } from '../../../../server/models/Movie'; import type { TvDetails } from '../../../../server/models/Tv'; import useSWR from 'swr'; import Badge from '../../Common/Badge'; import StatusBadge from '../../StatusBadge'; import Table from '../../Common/Table'; import { MediaRequestStatus } from '../../../../server/constants/media'; import Button from '../../Common/Button'; import axios from 'axios'; import globalMessages from '../../../i18n/globalMessages'; import Link from 'next/link'; const messages = defineMessages({ requestedby: 'Requested by {username}', seasons: 'Seasons', notavailable: 'N/A', }); const isMovie = (movie: MovieDetails | TvDetails): movie is MovieDetails => { return (movie as MovieDetails).title !== undefined; }; interface RequestItemProps { request: MediaRequest; onDelete: () => void; } const RequestItem: React.FC = ({ request, onDelete }) => { const intl = useIntl(); 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(); } }; const deleteRequest = async () => { await axios.delete(`/api/v1/request/${request.id}`); onDelete(); }; if (!title && !error) { return ( ); } if (!title || !requestData) { return ( ); } return ( {isMovie(title) ? title.title : title.name}
{intl.formatMessage(messages.requestedby, { username: requestData.requestedBy.username, })}
{requestData.seasons.length > 0 && (
{intl.formatMessage(messages.seasons)} {requestData.seasons.map((season) => ( {season.seasonNumber} ))}
)}
{requestData.modifiedBy ? ( {requestData.modifiedBy.username} ( ) ) : ( N/A )}
{requestData.status !== MediaRequestStatus.PENDING && ( )} {requestData.status === MediaRequestStatus.PENDING && hasPermission(Permission.MANAGE_REQUESTS) && ( <> )} ); }; export default RequestItem;