import { ServerIcon } from '@heroicons/react/outline'; import { CheckCircleIcon, DocumentRemoveIcon } from '@heroicons/react/solid'; import axios from 'axios'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { IssueStatus } from '../../../server/constants/issue'; import { MediaStatus } from '../../../server/constants/media'; import { MovieDetails } from '../../../server/models/Movie'; import { TvDetails } from '../../../server/models/Tv'; import useSettings from '../../hooks/useSettings'; import { Permission, useUser } from '../../hooks/useUser'; import globalMessages from '../../i18n/globalMessages'; import Button from '../Common/Button'; import ConfirmButton from '../Common/ConfirmButton'; import SlideOver from '../Common/SlideOver'; import DownloadBlock from '../DownloadBlock'; import IssueBlock from '../IssueBlock'; import RequestBlock from '../RequestBlock'; const messages = defineMessages({ manageModalTitle: 'Manage {mediaType}', manageModalRequests: 'Requests', manageModalNoRequests: 'No requests.', manageModalClearMedia: 'Clear Media Data', manageModalClearMediaWarning: '* This will irreversibly remove all data for this {mediaType}, including any requests. If this item exists in your Plex library, the media information will be recreated during the next scan.', openarr: 'Open in {arr}', openarr4k: 'Open in 4K {arr}', downloadstatus: 'Download Status', markavailable: 'Mark as Available', mark4kavailable: 'Mark as Available in 4K', allseasonsmarkedavailable: '* All seasons will be marked as available.', // Recreated here for lowercase versions to go with the modal clear media warning movie: 'movie', tvshow: 'series', }); const isMovie = (movie: MovieDetails | TvDetails): movie is MovieDetails => { return (movie as MovieDetails).title !== undefined; }; interface ManageSlideOverProps { // mediaType: 'movie' | 'tv'; show?: boolean; onClose: () => void; revalidate: () => void; } interface ManageSlideOverMovieProps extends ManageSlideOverProps { mediaType: 'movie'; data: MovieDetails; } interface ManageSlideOverTvProps extends ManageSlideOverProps { mediaType: 'tv'; data: TvDetails; } const ManageSlideOver: React.FC< ManageSlideOverMovieProps | ManageSlideOverTvProps > = ({ show, mediaType, onClose, data, revalidate }) => { const { hasPermission } = useUser(); const intl = useIntl(); const settings = useSettings(); const deleteMedia = async () => { if (data?.mediaInfo?.id) { await axios.delete(`/api/v1/media/${data?.mediaInfo?.id}`); revalidate(); } }; const markAvailable = async (is4k = false) => { await axios.post(`/api/v1/media/${data?.mediaInfo?.id}/available`, { is4k, }); revalidate(); }; return ( onClose()} subText={isMovie(data) ? data.title : data.name} > {((data?.mediaInfo?.downloadStatus ?? []).length > 0 || (data?.mediaInfo?.downloadStatus4k ?? []).length > 0) && ( <>

{intl.formatMessage(messages.downloadstatus)}

)} {data?.mediaInfo && (data.mediaInfo.status !== MediaStatus.AVAILABLE || (data.mediaInfo.status4k !== MediaStatus.AVAILABLE && settings.currentSettings.series4kEnabled)) && (
{data?.mediaInfo && data?.mediaInfo.status !== MediaStatus.AVAILABLE && (
)} {data?.mediaInfo && data?.mediaInfo.status4k !== MediaStatus.AVAILABLE && settings.currentSettings.series4kEnabled && (
)} {mediaType === 'tv' && (
{intl.formatMessage(messages.allseasonsmarkedavailable)}
)}
)} {(data.mediaInfo?.issues ?? []).length > 0 && ( <>

Open Issues

)}

{intl.formatMessage(messages.manageModalRequests)}

{hasPermission(Permission.ADMIN) && (data?.mediaInfo?.serviceUrl || data?.mediaInfo?.serviceUrl4k) && (
{data?.mediaInfo?.serviceUrl && ( )} {data?.mediaInfo?.serviceUrl4k && ( )}
)} {data?.mediaInfo && (
deleteMedia()} confirmText={intl.formatMessage(globalMessages.areyousure)} className="w-full" > {intl.formatMessage(messages.manageModalClearMedia)}
{intl.formatMessage(messages.manageModalClearMediaWarning, { mediaType: intl.formatMessage( mediaType === 'movie' ? messages.movie : messages.tvshow ), })}
)}
); }; export default ManageSlideOver;