import Spinner from '@app/assets/spinner.svg'; import Badge from '@app/components/Common/Badge'; import Tooltip from '@app/components/Common/Tooltip'; import DownloadBlock from '@app/components/DownloadBlock'; import useSettings from '@app/hooks/useSettings'; import { Permission, useUser } from '@app/hooks/useUser'; import globalMessages from '@app/i18n/globalMessages'; import { MediaStatus } from '@server/constants/media'; import type { DownloadingItem } from '@server/lib/downloadtracker'; import { defineMessages, useIntl } from 'react-intl'; const messages = defineMessages({ status: '{status}', status4k: '4K {status}', playonplex: 'Play on Plex', openinarr: 'Open in {arr}', managemedia: 'Manage {mediaType}', seasonepisodenumber: 'S{seasonNumber}E{episodeNumber}', }); interface StatusBadgeProps { status?: MediaStatus; downloadItem?: DownloadingItem[]; is4k?: boolean; inProgress?: boolean; plexUrl?: string; serviceUrl?: string; tmdbId?: number; mediaType?: 'movie' | 'tv'; title?: string | string[]; } const StatusBadge = ({ status, downloadItem = [], is4k = false, inProgress = false, plexUrl, serviceUrl, tmdbId, mediaType, title, }: StatusBadgeProps) => { const intl = useIntl(); const { hasPermission } = useUser(); const settings = useSettings(); let mediaLink: string | undefined; let mediaLinkDescription: string | undefined; const calculateDownloadProgress = (media: DownloadingItem) => { return Math.round(((media?.size - media?.sizeLeft) / media?.size) * 100); }; if ( mediaType && plexUrl && hasPermission( is4k ? [ Permission.REQUEST_4K, mediaType === 'movie' ? Permission.REQUEST_4K_MOVIE : Permission.REQUEST_4K_TV, ] : [ Permission.REQUEST, mediaType === 'movie' ? Permission.REQUEST_MOVIE : Permission.REQUEST_TV, ], { type: 'or', } ) && (!is4k || (mediaType === 'movie' ? settings.currentSettings.movie4kEnabled : settings.currentSettings.series4kEnabled)) ) { mediaLink = plexUrl; mediaLinkDescription = intl.formatMessage(messages.playonplex); } else if (hasPermission(Permission.MANAGE_REQUESTS)) { if (mediaType && tmdbId) { mediaLink = `/${mediaType}/${tmdbId}?manage=1`; mediaLinkDescription = intl.formatMessage(messages.managemedia, { mediaType: intl.formatMessage( mediaType === 'movie' ? globalMessages.movie : globalMessages.tvshow ), }); } else if (hasPermission(Permission.ADMIN) && serviceUrl) { mediaLink = serviceUrl; mediaLinkDescription = intl.formatMessage(messages.openinarr, { arr: mediaType === 'movie' ? 'Radarr' : 'Sonarr', }); } } const tooltipContent = ( ); const badgeDownloadProgress = (
); switch (status) { case MediaStatus.AVAILABLE: return ( {inProgress && badgeDownloadProgress}
{intl.formatMessage( is4k ? messages.status4k : messages.status, { status: inProgress ? intl.formatMessage(globalMessages.processing) : intl.formatMessage(globalMessages.available), } )} {inProgress && ( <> {mediaType === 'tv' && downloadItem[0].episode && ( {intl.formatMessage(messages.seasonepisodenumber, { seasonNumber: downloadItem[0].episode.seasonNumber, episodeNumber: downloadItem[0].episode.episodeNumber, })} )} )}
); case MediaStatus.PARTIALLY_AVAILABLE: return ( {inProgress && badgeDownloadProgress}
{intl.formatMessage( is4k ? messages.status4k : messages.status, { status: inProgress ? intl.formatMessage(globalMessages.processing) : intl.formatMessage(globalMessages.partiallyavailable), } )} {inProgress && ( <> {mediaType === 'tv' && downloadItem[0].episode && ( {intl.formatMessage(messages.seasonepisodenumber, { seasonNumber: downloadItem[0].episode.seasonNumber, episodeNumber: downloadItem[0].episode.episodeNumber, })} )} )}
); case MediaStatus.PROCESSING: return ( {inProgress && badgeDownloadProgress}
{intl.formatMessage( is4k ? messages.status4k : messages.status, { status: inProgress ? intl.formatMessage(globalMessages.processing) : intl.formatMessage(globalMessages.requested), } )} {inProgress && ( <> {mediaType === 'tv' && downloadItem[0].episode && ( {intl.formatMessage(messages.seasonepisodenumber, { seasonNumber: downloadItem[0].episode.seasonNumber, episodeNumber: downloadItem[0].episode.episodeNumber, })} )} )}
); case MediaStatus.PENDING: return ( {intl.formatMessage(is4k ? messages.status4k : messages.status, { status: intl.formatMessage(globalMessages.pending), })} ); default: return null; } }; export default StatusBadge;