import Badge from '@app/components/Common/Badge'; import Button from '@app/components/Common/Button'; import Tooltip from '@app/components/Common/Tooltip'; import RequestModal from '@app/components/RequestModal'; import useRequestOverride from '@app/hooks/useRequestOverride'; import { useUser } from '@app/hooks/useUser'; import globalMessages from '@app/i18n/globalMessages'; import { CalendarIcon, CheckIcon, EyeIcon, PencilIcon, TrashIcon, UserIcon, XMarkIcon, } from '@heroicons/react/24/solid'; import { MediaRequestStatus } from '@server/constants/media'; import type { MediaRequest } from '@server/entity/MediaRequest'; import axios from 'axios'; import Link from 'next/link'; import { useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; const messages = defineMessages({ seasons: '{seasonCount, plural, one {Season} other {Seasons}}', requestoverrides: 'Request Overrides', server: 'Destination Server', profilechanged: 'Quality Profile', rootfolder: 'Root Folder', languageprofile: 'Language Profile', requestdate: 'Request Date', requestedby: 'Requested By', lastmodifiedby: 'Last Modified By', approve: 'Approve Request', decline: 'Decline Request', edit: 'Edit Request', delete: 'Delete Request', }); interface RequestBlockProps { request: MediaRequest; onUpdate?: () => void; } const RequestBlock = ({ request, onUpdate }: RequestBlockProps) => { const { user } = useUser(); const intl = useIntl(); const [isUpdating, setIsUpdating] = useState(false); const [showEditModal, setShowEditModal] = useState(false); const { profile, rootFolder, server, languageProfile } = useRequestOverride(request); const updateRequest = async (type: 'approve' | 'decline'): Promise => { setIsUpdating(true); await axios.post(`/api/v1/request/${request.id}/${type}`); if (onUpdate) { onUpdate(); } setIsUpdating(false); }; const deleteRequest = async () => { setIsUpdating(true); await axios.delete(`/api/v1/request/${request.id}`); if (onUpdate) { onUpdate(); } setIsUpdating(false); }; return (
setShowEditModal(false)} onComplete={() => { if (onUpdate) { onUpdate(); } setShowEditModal(false); }} />
{request.status === MediaRequestStatus.PENDING && ( <> )} {request.status !== MediaRequestStatus.PENDING && ( )}
{request.is4k && ( 4K )} {request.status === MediaRequestStatus.APPROVED && ( {intl.formatMessage(globalMessages.approved)} )} {request.status === MediaRequestStatus.DECLINED && ( {intl.formatMessage(globalMessages.declined)} )} {request.status === MediaRequestStatus.PENDING && ( {intl.formatMessage(globalMessages.pending)} )} {request.status === MediaRequestStatus.FAILED && ( {intl.formatMessage(globalMessages.failed)} )}
{intl.formatDate(request.createdAt, { year: 'numeric', month: 'long', day: 'numeric', })}
{(request.seasons ?? []).length > 0 && (
{intl.formatMessage(messages.seasons, { seasonCount: request.seasons.length, })}
{request.seasons.map((season) => ( {season.seasonNumber} ))}
)} {(server || profile || rootFolder || languageProfile) && ( <>
{intl.formatMessage(messages.requestoverrides)}
    {server && (
  • {intl.formatMessage(messages.server)} {server}
  • )} {profile && (
  • {intl.formatMessage(messages.profilechanged)} {profile}
  • )} {rootFolder && (
  • {intl.formatMessage(messages.rootfolder)} {rootFolder}
  • )} {languageProfile && (
  • {intl.formatMessage(messages.languageprofile)} {languageProfile}
  • )}
)}
); }; export default RequestBlock;