import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useDispatch } from 'react-redux'; import Icon from 'Components/Icon'; import TableRowCell from 'Components/Table/Cells/TableRowCell'; import TableRowCellButton from 'Components/Table/Cells/TableRowCellButton'; import TableSelectCell from 'Components/Table/Cells/TableSelectCell'; import Column from 'Components/Table/Column'; import TableRow from 'Components/Table/TableRow'; import Popover from 'Components/Tooltip/Popover'; import { icons, kinds, tooltipPositions } from 'Helpers/Props'; import SelectLanguageModal from 'InteractiveImport/Language/SelectLanguageModal'; import SelectMovieModal from 'InteractiveImport/Movie/SelectMovieModal'; import SelectQualityModal from 'InteractiveImport/Quality/SelectQualityModal'; import SelectReleaseGroupModal from 'InteractiveImport/ReleaseGroup/SelectReleaseGroupModal'; import Language from 'Language/Language'; import Movie from 'Movie/Movie'; import MovieFormats from 'Movie/MovieFormats'; import MovieLanguage from 'Movie/MovieLanguage'; import MovieQuality from 'Movie/MovieQuality'; import { QualityModel } from 'Quality/Quality'; import { reprocessInteractiveImportItems, updateInteractiveImportItem, } from 'Store/Actions/interactiveImportActions'; import { SelectStateInputProps } from 'typings/props'; import Rejection from 'typings/Rejection'; import formatBytes from 'Utilities/Number/formatBytes'; import translate from 'Utilities/String/translate'; import InteractiveImportRowCellPlaceholder from './InteractiveImportRowCellPlaceholder'; import styles from './InteractiveImportRow.css'; type SelectType = 'movie' | 'releaseGroup' | 'quality' | 'language'; type SelectedChangeProps = SelectStateInputProps & { hasMovieFileId: boolean; }; interface InteractiveImportRowProps { id: number; allowMovieChange: boolean; relativePath: string; movie?: Movie; releaseGroup?: string; quality?: QualityModel; languages?: Language[]; size: number; customFormats?: object[]; rejections: Rejection[]; columns: Column[]; movieFileId?: number; isReprocessing?: boolean; isSelected?: boolean; modalTitle: string; onSelectedChange(result: SelectedChangeProps): void; onValidRowChange(id: number, isValid: boolean): void; } function InteractiveImportRow(props: InteractiveImportRowProps) { const { id, allowMovieChange, relativePath, movie, quality, languages, releaseGroup, size, customFormats, rejections, isSelected, modalTitle, movieFileId, columns, onSelectedChange, onValidRowChange, } = props; const dispatch = useDispatch(); const isMovieColumnVisible = useMemo( () => columns.find((c) => c.name === 'movie')?.isVisible ?? false, [columns] ); const [selectModalOpen, setSelectModalOpen] = useState( null ); useEffect( () => { if (allowMovieChange && movie && quality && languages) { onSelectedChange({ id, hasMovieFileId: !!movieFileId, value: true, shiftKey: false, }); } }, // eslint-disable-next-line react-hooks/exhaustive-deps [] ); useEffect(() => { const isValid = !!(movie && quality && languages); if (isSelected && !isValid) { onValidRowChange(id, false); } else { onValidRowChange(id, true); } }, [id, movie, quality, languages, isSelected, onValidRowChange]); const onSelectedChangeWrapper = useCallback( (result: SelectedChangeProps) => { onSelectedChange({ ...result, hasMovieFileId: !!movieFileId, }); }, [movieFileId, onSelectedChange] ); const selectRowAfterChange = useCallback(() => { if (!isSelected) { onSelectedChange({ id, hasMovieFileId: !!movieFileId, value: true, shiftKey: false, }); } }, [id, movieFileId, isSelected, onSelectedChange]); const onSelectModalClose = useCallback(() => { setSelectModalOpen(null); }, [setSelectModalOpen]); const onSelectMoviePress = useCallback(() => { setSelectModalOpen('movie'); }, [setSelectModalOpen]); const onMovieSelect = useCallback( (movie: Movie) => { dispatch( updateInteractiveImportItem({ id, movie, }) ); dispatch(reprocessInteractiveImportItems({ ids: [id] })); setSelectModalOpen(null); selectRowAfterChange(); }, [id, dispatch, setSelectModalOpen, selectRowAfterChange] ); const onSelectReleaseGroupPress = useCallback(() => { setSelectModalOpen('releaseGroup'); }, [setSelectModalOpen]); const onReleaseGroupSelect = useCallback( (releaseGroup: string) => { dispatch( updateInteractiveImportItem({ id, releaseGroup, }) ); dispatch(reprocessInteractiveImportItems({ ids: [id] })); setSelectModalOpen(null); selectRowAfterChange(); }, [id, dispatch, setSelectModalOpen, selectRowAfterChange] ); const onSelectQualityPress = useCallback(() => { setSelectModalOpen('quality'); }, [setSelectModalOpen]); const onQualitySelect = useCallback( (quality: QualityModel) => { dispatch( updateInteractiveImportItem({ id, quality, }) ); dispatch(reprocessInteractiveImportItems({ ids: [id] })); setSelectModalOpen(null); selectRowAfterChange(); }, [id, dispatch, setSelectModalOpen, selectRowAfterChange] ); const onSelectLanguagePress = useCallback(() => { setSelectModalOpen('language'); }, [setSelectModalOpen]); const onLanguagesSelect = useCallback( (languages: Language[]) => { dispatch( updateInteractiveImportItem({ id, languages, }) ); dispatch(reprocessInteractiveImportItems({ ids: [id] })); setSelectModalOpen(null); selectRowAfterChange(); }, [id, dispatch, setSelectModalOpen, selectRowAfterChange] ); const movieTitle = movie ? movie.title : ''; const showMoviePlaceholder = isSelected && !movie; const showReleaseGroupPlaceholder = isSelected && !releaseGroup; const showQualityPlaceholder = isSelected && !quality; const showLanguagePlaceholder = isSelected && !languages; return ( {relativePath} {isMovieColumnVisible ? ( {showMoviePlaceholder ? ( ) : ( movieTitle )} ) : null} {showReleaseGroupPlaceholder ? ( ) : ( releaseGroup )} {showQualityPlaceholder && } {!showQualityPlaceholder && !!quality && ( )} {showLanguagePlaceholder && } {!showLanguagePlaceholder && !!languages && ( )} {formatBytes(size)} {customFormats?.length ? ( } title={translate('Formats')} body={
} position={tooltipPositions.LEFT} /> ) : null}
{rejections.length ? ( } title={translate('ReleaseRejected')} body={
    {rejections.map((rejection, index) => { return
  • {rejection.reason}
  • ; })}
} position={tooltipPositions.LEFT} canFlip={false} /> ) : null}
1 : false} real={quality ? quality.revision.real > 0 : false} modalTitle={modalTitle} onQualitySelect={onQualitySelect} onModalClose={onSelectModalClose} /> l.id) : []} modalTitle={modalTitle} onLanguagesSelect={onLanguagesSelect} onModalClose={onSelectModalClose} />
); } export default InteractiveImportRow;