import classNames from 'classnames'; import React, { useCallback, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { REFRESH_SERIES, SERIES_SEARCH } from 'Commands/commandNames'; import Label from 'Components/Label'; import IconButton from 'Components/Link/IconButton'; import Link from 'Components/Link/Link'; import SpinnerIconButton from 'Components/Link/SpinnerIconButton'; import TagListConnector from 'Components/TagListConnector'; import { icons } from 'Helpers/Props'; import DeleteSeriesModal from 'Series/Delete/DeleteSeriesModal'; import EditSeriesModalConnector from 'Series/Edit/EditSeriesModalConnector'; import SeriesIndexProgressBar from 'Series/Index/ProgressBar/SeriesIndexProgressBar'; import SeriesIndexPosterSelect from 'Series/Index/Select/SeriesIndexPosterSelect'; import { Statistics } from 'Series/Series'; import SeriesPoster from 'Series/SeriesPoster'; import { executeCommand } from 'Store/Actions/commandActions'; import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector'; import formatDateTime from 'Utilities/Date/formatDateTime'; import getRelativeDate from 'Utilities/Date/getRelativeDate'; import translate from 'Utilities/String/translate'; import createSeriesIndexItemSelector from '../createSeriesIndexItemSelector'; import selectPosterOptions from './selectPosterOptions'; import SeriesIndexPosterInfo from './SeriesIndexPosterInfo'; import styles from './SeriesIndexPoster.css'; interface SeriesIndexPosterProps { seriesId: number; sortKey: string; isSelectMode: boolean; posterWidth: number; posterHeight: number; } function SeriesIndexPoster(props: SeriesIndexPosterProps) { const { seriesId, sortKey, isSelectMode, posterWidth, posterHeight } = props; const { series, qualityProfile, isRefreshingSeries, isSearchingSeries } = useSelector(createSeriesIndexItemSelector(props.seriesId)); const { detailedProgressBar, showTitle, showMonitored, showQualityProfile, showTags, showSearchAction, } = useSelector(selectPosterOptions); const { showRelativeDates, shortDateFormat, longDateFormat, timeFormat } = useSelector(createUISettingsSelector()); const { title, monitored, status, path, titleSlug, originalLanguage, network, nextAiring, previousAiring, added, statistics = {} as Statistics, images, tags, } = series; const { seasonCount = 0, episodeCount = 0, episodeFileCount = 0, totalEpisodeCount = 0, sizeOnDisk = 0, } = statistics; const dispatch = useDispatch(); const [hasPosterError, setHasPosterError] = useState(false); const [isEditSeriesModalOpen, setIsEditSeriesModalOpen] = useState(false); const [isDeleteSeriesModalOpen, setIsDeleteSeriesModalOpen] = useState(false); const onRefreshPress = useCallback(() => { dispatch( executeCommand({ name: REFRESH_SERIES, seriesId, }) ); }, [seriesId, dispatch]); const onSearchPress = useCallback(() => { dispatch( executeCommand({ name: SERIES_SEARCH, seriesId, }) ); }, [seriesId, dispatch]); const onPosterLoadError = useCallback(() => { setHasPosterError(true); }, [setHasPosterError]); const onPosterLoad = useCallback(() => { setHasPosterError(false); }, [setHasPosterError]); const onEditSeriesPress = useCallback(() => { setIsEditSeriesModalOpen(true); }, [setIsEditSeriesModalOpen]); const onEditSeriesModalClose = useCallback(() => { setIsEditSeriesModalOpen(false); }, [setIsEditSeriesModalOpen]); const onDeleteSeriesPress = useCallback(() => { setIsEditSeriesModalOpen(false); setIsDeleteSeriesModalOpen(true); }, [setIsDeleteSeriesModalOpen]); const onDeleteSeriesModalClose = useCallback(() => { setIsDeleteSeriesModalOpen(false); }, [setIsDeleteSeriesModalOpen]); const link = `/series/${titleSlug}`; const elementStyle = { width: `${posterWidth}px`, height: `${posterHeight}px`, }; return (