import classNames from 'classnames'; import moment from 'moment'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; import CalendarEventQueueDetails from 'Calendar/Events/CalendarEventQueueDetails'; import getStatusStyle from 'Calendar/getStatusStyle'; import Icon from 'Components/Icon'; import Link from 'Components/Link/Link'; import EpisodeDetailsModal from 'Episode/EpisodeDetailsModal'; import episodeEntities from 'Episode/episodeEntities'; import getFinaleTypeName from 'Episode/getFinaleTypeName'; import { icons, kinds } from 'Helpers/Props'; import formatTime from 'Utilities/Date/formatTime'; import padNumber from 'Utilities/Number/padNumber'; import translate from 'Utilities/String/translate'; import styles from './AgendaEvent.css'; class AgendaEvent extends Component { // // Lifecycle constructor(props, context) { super(props, context); this.state = { isDetailsModalOpen: false }; } // // Listeners onPress = () => { this.setState({ isDetailsModalOpen: true }); }; onDetailsModalClose = () => { this.setState({ isDetailsModalOpen: false }); }; // // Render render() { const { id, series, episodeFile, title, seasonNumber, episodeNumber, absoluteEpisodeNumber, airDateUtc, monitored, unverifiedSceneNumbering, finaleType, hasFile, grabbed, queueItem, showDate, showEpisodeInformation, showFinaleIcon, showSpecialIcon, showCutoffUnmetIcon, timeFormat, longDateFormat, colorImpairedMode } = this.props; const startTime = moment(airDateUtc); const endTime = moment(airDateUtc).add(series.runtime, 'minutes'); const downloading = !!(queueItem || grabbed); const isMonitored = series.monitored && monitored; const statusStyle = getStatusStyle(hasFile, downloading, startTime, endTime, isMonitored); const missingAbsoluteNumber = series.seriesType === 'anime' && seasonNumber > 0 && !absoluteEpisodeNumber; return (
{ showDate && startTime.format(longDateFormat) }
{formatTime(airDateUtc, timeFormat)} - {formatTime(endTime.toISOString(), timeFormat, { includeMinuteZero: true })}
{series.title}
{ showEpisodeInformation &&
{seasonNumber}x{padNumber(episodeNumber, 2)} { series.seriesType === 'anime' && absoluteEpisodeNumber && ({absoluteEpisodeNumber}) }
-
}
{ showEpisodeInformation && title }
{ missingAbsoluteNumber && } { unverifiedSceneNumbering && !missingAbsoluteNumber ? : null } { !!queueItem && } { !queueItem && grabbed && } { showCutoffUnmetIcon && !!episodeFile && episodeFile.qualityCutoffNotMet && } { episodeNumber === 1 && seasonNumber > 0 && } { showFinaleIcon && finaleType ? : null } { showSpecialIcon && (episodeNumber === 0 || seasonNumber === 0) && }
); } } AgendaEvent.propTypes = { id: PropTypes.number.isRequired, series: PropTypes.object.isRequired, episodeFile: PropTypes.object, title: PropTypes.string.isRequired, seasonNumber: PropTypes.number.isRequired, episodeNumber: PropTypes.number.isRequired, absoluteEpisodeNumber: PropTypes.number, airDateUtc: PropTypes.string.isRequired, monitored: PropTypes.bool.isRequired, unverifiedSceneNumbering: PropTypes.bool, finaleType: PropTypes.string, hasFile: PropTypes.bool.isRequired, grabbed: PropTypes.bool, queueItem: PropTypes.object, showDate: PropTypes.bool.isRequired, showEpisodeInformation: PropTypes.bool.isRequired, showFinaleIcon: PropTypes.bool.isRequired, showSpecialIcon: PropTypes.bool.isRequired, showCutoffUnmetIcon: PropTypes.bool.isRequired, timeFormat: PropTypes.string.isRequired, longDateFormat: PropTypes.string.isRequired, colorImpairedMode: PropTypes.bool.isRequired }; export default AgendaEvent;