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 defineMessages from '@app/utils/defineMessages'; 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 Link from 'next/link'; import { useState } from 'react'; import { useIntl } from 'react-intl'; import { mutate } from 'swr'; const messages = defineMessages('components.RequestBlock', { 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); const res = await fetch(`/api/v1/request/${request.id}/${type}`, { method: 'POST', }); if (!res.ok) throw new Error(); if (onUpdate) { onUpdate(); mutate('/api/v1/request/count'); } setIsUpdating(false); }; const deleteRequest = async () => { setIsUpdating(true); const res = await fetch(`/api/v1/request/${request.id}`, { method: 'DELETE', }); if (!res.ok) throw new Error(); if (onUpdate) { onUpdate(); mutate('/api/v1/request/count'); } setIsUpdating(false); }; return (
setShowEditModal(false)} onComplete={() => { if (onUpdate) { onUpdate(); } setShowEditModal(false); }} />
{request.requestedBy.displayName}
{request.modifiedBy && (
{request.modifiedBy.displayName}
)}
{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 === 0 ? intl.formatMessage(globalMessages.specials) : 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;