import PropTypes from 'prop-types'; import React, { Component } from 'react'; import formatBytes from 'Utilities/Number/formatBytes'; import { icons, kinds, tooltipPositions } from 'Helpers/Props'; import Icon from 'Components/Icon'; 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 SelectArtistModal from 'InteractiveImport/Artist/SelectArtistModal'; import SelectAlbumModal from 'InteractiveImport/Album/SelectAlbumModal'; import SelectTrackModal from 'InteractiveImport/Track/SelectTrackModal'; 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 = { isSelectArtistModalOpen: false, isSelectAlbumModalOpen: false, isSelectTrackModalOpen: false, isSelectQualityModalOpen: false, isSelectLanguageModalOpen: false }; } componentDidMount() { const { id, artist, album, tracks, quality, language } = this.props; if ( artist && album != null && tracks.length && quality && language ) { this.props.onSelectedChange({ id, value: true }); } } componentDidUpdate(prevProps) { const { id, artist, album, tracks, quality, language, isSelected, onValidRowChange } = this.props; if (prevProps.isSelected === isSelected) { return; } const isValid = !!( artist && album && tracks.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 onSelectArtistPress = () => { this.setState({ isSelectArtistModalOpen: true }); } onSelectAlbumPress = () => { this.setState({ isSelectAlbumModalOpen: true }); } onSelectTrackPress = () => { this.setState({ isSelectTrackModalOpen: true }); } onSelectQualityPress = () => { this.setState({ isSelectQualityModalOpen: true }); } onSelectLanguagePress = () => { this.setState({ isSelectLanguageModalOpen: true }); } onSelectArtistModalClose = (changed) => { this.setState({ isSelectArtistModalOpen: false }); this.selectRowAfterChange(changed); } onSelectAlbumModalClose = (changed) => { this.setState({ isSelectAlbumModalOpen: false }); this.selectRowAfterChange(changed); } onSelectTrackModalClose = (changed) => { this.setState({ isSelectTrackModalOpen: 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, relativePath, artist, album, tracks, quality, language, size, rejections, isSelected, onSelectedChange } = this.props; const { isSelectArtistModalOpen, isSelectAlbumModalOpen, isSelectTrackModalOpen, isSelectQualityModalOpen, isSelectLanguageModalOpen } = this.state; const artistName = artist ? artist.artistName : ''; const albumTitle = album ? album.title : ''; const trackNumbers = tracks.map((track) => track.trackNumber) .join(', '); const showArtistPlaceholder = isSelected && !artist; const showAlbumNumberPlaceholder = isSelected && !!artist && !album; const showTrackNumbersPlaceholder = isSelected && !!album && !tracks.length; return ( {relativePath} { showArtistPlaceholder ? : artistName } { showAlbumNumberPlaceholder ? : albumTitle } { showTrackNumbersPlaceholder ? : trackNumbers } {formatBytes(size)} { !!rejections.length && } title="Release Rejected" body={
    { rejections.map((rejection, index) => { return (
  • {rejection.reason}
  • ); }) }
} position={tooltipPositions.LEFT} /> }
1} real={quality.revision.real > 0} onModalClose={this.onSelectQualityModalClose} />
); } } InteractiveImportRow.propTypes = { id: PropTypes.number.isRequired, relativePath: PropTypes.string.isRequired, artist: PropTypes.object, album: PropTypes.object, tracks: PropTypes.arrayOf(PropTypes.object).isRequired, quality: PropTypes.object, language: PropTypes.object, size: PropTypes.number.isRequired, rejections: PropTypes.arrayOf(PropTypes.object).isRequired, isSelected: PropTypes.bool, onSelectedChange: PropTypes.func.isRequired, onValidRowChange: PropTypes.func.isRequired }; InteractiveImportRow.defaultProps = { tracks: [] }; export default InteractiveImportRow;