import PropTypes from 'prop-types'; import React, { Component } from 'react'; import formatBytes from 'Utilities/Number/formatBytes'; import hasDifferentItems from 'Utilities/Object/hasDifferentItems'; import { icons, kinds, tooltipPositions } from 'Helpers/Props'; import Icon from 'Components/Icon'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import TableRow from 'Components/Table/TableRow'; import TableRowCell from 'Components/Table/Cells/TableRowCell'; import TableRowCellButton from 'Components/Table/Cells/TableRowCellButton'; import TableSelectCell from 'Components/Table/Cells/TableSelectCell'; import Popover from 'Components/Tooltip/Popover'; import EpisodeQuality from 'Episode/EpisodeQuality'; import EpisodeLanguage from 'Episode/EpisodeLanguage'; import SelectSeriesModal from 'InteractiveImport/Series/SelectSeriesModal'; import SelectSeasonModal from 'InteractiveImport/Season/SelectSeasonModal'; import SelectEpisodeModal from 'InteractiveImport/Episode/SelectEpisodeModal'; import SelectQualityModal from 'InteractiveImport/Quality/SelectQualityModal'; import SelectLanguageModal from 'InteractiveImport/Language/SelectLanguageModal'; import InteractiveImportRowCellPlaceholder from './InteractiveImportRowCellPlaceholder'; import styles from './InteractiveImportRow.css'; class InteractiveImportRow extends Component { // // Lifecycle constructor(props, context) { super(props, context); this.state = { isSelectSeriesModalOpen: false, isSelectSeasonModalOpen: false, isSelectEpisodeModalOpen: false, isSelectQualityModalOpen: false, isSelectLanguageModalOpen: false }; } componentDidMount() { const { id, series, seasonNumber, episodes, quality, language } = this.props; if ( series && seasonNumber != null && episodes.length && quality && language ) { this.props.onSelectedChange({ id, value: true }); } } componentDidUpdate(prevProps) { const { id, series, seasonNumber, episodes, quality, language, isSelected, onValidRowChange } = this.props; if ( prevProps.series === series && prevProps.seasonNumber === seasonNumber && !hasDifferentItems(prevProps.episodes, episodes) && prevProps.quality === quality && prevProps.language === language && prevProps.isSelected === isSelected ) { return; } const isValid = !!( series && seasonNumber != null && episodes.length && quality && language ); if (isSelected && !isValid) { onValidRowChange(id, false); } else { onValidRowChange(id, true); } } // // Control selectRowAfterChange = (value) => { const { id, isSelected } = this.props; if (!isSelected && value === true) { this.props.onSelectedChange({ id, value }); } } // // Listeners onSelectSeriesPress = () => { this.setState({ isSelectSeriesModalOpen: true }); } onSelectSeasonPress = () => { this.setState({ isSelectSeasonModalOpen: true }); } onSelectEpisodePress = () => { this.setState({ isSelectEpisodeModalOpen: true }); } onSelectQualityPress = () => { this.setState({ isSelectQualityModalOpen: true }); } onSelectLanguagePress = () => { this.setState({ isSelectLanguageModalOpen: true }); } onSelectSeriesModalClose = (changed) => { this.setState({ isSelectSeriesModalOpen: false }); this.selectRowAfterChange(changed); } onSelectSeasonModalClose = (changed) => { this.setState({ isSelectSeasonModalOpen: false }); this.selectRowAfterChange(changed); } onSelectEpisodeModalClose = (changed) => { this.setState({ isSelectEpisodeModalOpen: false }); this.selectRowAfterChange(changed); } onSelectQualityModalClose = (changed) => { this.setState({ isSelectQualityModalOpen: false }); this.selectRowAfterChange(changed); } onSelectLanguageModalClose = (changed) => { this.setState({ isSelectLanguageModalOpen: false }); this.selectRowAfterChange(changed); } // // Render render() { const { id, allowSeriesChange, relativePath, series, seasonNumber, episodes, quality, language, size, rejections, isReprocessing, isSelected, onSelectedChange } = this.props; const { isSelectSeriesModalOpen, isSelectSeasonModalOpen, isSelectEpisodeModalOpen, isSelectQualityModalOpen, isSelectLanguageModalOpen } = this.state; const seriesTitle = series ? series.title : ''; const isAnime = series ? series.seriesType === 'anime' : false; const episodeInfo = episodes.map((episode) => { return (