import React, { useCallback, useState } from 'react'; import ProtocolLabel from 'Activity/Queue/ProtocolLabel'; import Icon from 'Components/Icon'; import Link from 'Components/Link/Link'; import SpinnerIconButton from 'Components/Link/SpinnerIconButton'; import ConfirmModal from 'Components/Modal/ConfirmModal'; import TableRowCell from 'Components/Table/Cells/TableRowCell'; import TableRow from 'Components/Table/TableRow'; import Popover from 'Components/Tooltip/Popover'; import Tooltip from 'Components/Tooltip/Tooltip'; import type DownloadProtocol from 'DownloadClient/DownloadProtocol'; import { icons, kinds, tooltipPositions } from 'Helpers/Props'; import Language from 'Language/Language'; import IndexerFlags from 'Movie/IndexerFlags'; import MovieFormats from 'Movie/MovieFormats'; import MovieLanguage from 'Movie/MovieLanguage'; import MovieQuality from 'Movie/MovieQuality'; import { QualityModel } from 'Quality/Quality'; import CustomFormat from 'typings/CustomFormat'; import MovieBlocklist from 'typings/MovieBlocklist'; import MovieHistory from 'typings/MovieHistory'; import formatDateTime from 'Utilities/Date/formatDateTime'; import formatAge from 'Utilities/Number/formatAge'; import formatBytes from 'Utilities/Number/formatBytes'; import formatCustomFormatScore from 'Utilities/Number/formatCustomFormatScore'; import translate from 'Utilities/String/translate'; import OverrideMatchModal from './OverrideMatch/OverrideMatchModal'; import Peers from './Peers'; import styles from './InteractiveSearchRow.css'; function getDownloadIcon( isGrabbing: boolean, isGrabbed: boolean, grabError?: string ) { if (isGrabbing) { return icons.SPINNER; } else if (isGrabbed) { return icons.DOWNLOADING; } else if (grabError) { return icons.DOWNLOADING; } return icons.DOWNLOAD; } function getDownloadKind(isGrabbed: boolean, grabError?: string) { if (isGrabbed) { return kinds.SUCCESS; } if (grabError) { return kinds.DANGER; } return kinds.DEFAULT; } function getDownloadTooltip( isGrabbing: boolean, isGrabbed: boolean, grabError?: string ) { if (isGrabbing) { return ''; } else if (isGrabbed) { return translate('AddedToDownloadQueue'); } else if (grabError) { return grabError; } return translate('AddToDownloadQueue'); } interface InteractiveSearchRowProps { guid: string; protocol: DownloadProtocol; age: number; ageHours: number; ageMinutes: number; publishDate: string; title: string; infoUrl: string; indexerId: number; indexer: string; size: number; seeders?: number; leechers?: number; quality: QualityModel; languages: Language[]; customFormats: CustomFormat[]; customFormatScore: number; mappedMovieId?: number; indexerFlags: 0; rejections: string[]; downloadAllowed: boolean; isGrabbing: boolean; isGrabbed: boolean; grabError?: string; historyFailedData?: MovieHistory; historyGrabbedData?: MovieHistory; blocklistData?: MovieBlocklist; longDateFormat: string; timeFormat: string; searchPayload: object; onGrabPress(...args: unknown[]): void; } function InteractiveSearchRow(props: InteractiveSearchRowProps) { const { guid, indexerId, protocol, age, ageHours, ageMinutes, publishDate, title, infoUrl, indexer, size, seeders, leechers, quality, languages, customFormatScore, customFormats, mappedMovieId, indexerFlags = 0, rejections = [], downloadAllowed, isGrabbing = false, isGrabbed = false, longDateFormat, timeFormat, grabError, historyGrabbedData = {} as MovieHistory, historyFailedData = {} as MovieHistory, blocklistData = {} as MovieBlocklist, searchPayload, onGrabPress, } = props; const [isConfirmGrabModalOpen, setIsConfirmGrabModalOpen] = useState(false); const [isOverrideModalOpen, setIsOverrideModalOpen] = useState(false); const onGrabPressWrapper = useCallback(() => { if (downloadAllowed) { onGrabPress({ guid, indexerId, }); return; } setIsConfirmGrabModalOpen(true); }, [ guid, indexerId, downloadAllowed, onGrabPress, setIsConfirmGrabModalOpen, ]); const onGrabConfirm = useCallback(() => { setIsConfirmGrabModalOpen(false); onGrabPress({ guid, indexerId, ...searchPayload, }); }, [guid, indexerId, searchPayload, onGrabPress, setIsConfirmGrabModalOpen]); const onGrabCancel = useCallback(() => { setIsConfirmGrabModalOpen(false); }, [setIsConfirmGrabModalOpen]); const onOverridePress = useCallback(() => { setIsOverrideModalOpen(true); }, [setIsOverrideModalOpen]); const onOverrideModalClose = useCallback(() => { setIsOverrideModalOpen(false); }, [setIsOverrideModalOpen]); return ( {formatAge(age, ageHours, ageMinutes)}
{title}
{indexer} {historyGrabbedData?.date && !historyFailedData?.date ? ( ) : null} {historyFailedData?.date ? ( ) : null} {blocklistData?.date ? ( ) : null} {formatBytes(size)} {protocol === 'torrent' ? ( ) : null} } position={tooltipPositions.LEFT} /> {indexerFlags ? ( } title={translate('IndexerFlags')} body={} position={tooltipPositions.LEFT} /> ) : null} {rejections.length ? ( } title={translate('ReleaseRejected')} body={
    {rejections.map((rejection, index) => { return
  • {rejection}
  • ; })}
} position={tooltipPositions.LEFT} /> ) : null}
); } export default InteractiveSearchRow;