import React, { useCallback, useMemo, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import TextTruncate from 'react-text-truncate'; import { MOVIE_SEARCH, REFRESH_MOVIE } from 'Commands/commandNames'; import Icon from 'Components/Icon'; import IconButton from 'Components/Link/IconButton'; import Link from 'Components/Link/Link'; import SpinnerIconButton from 'Components/Link/SpinnerIconButton'; import Popover from 'Components/Tooltip/Popover'; import { icons } from 'Helpers/Props'; import DeleteMovieModal from 'Movie/Delete/DeleteMovieModal'; import MovieDetailsLinks from 'Movie/Details/MovieDetailsLinks'; import EditMovieModalConnector from 'Movie/Edit/EditMovieModalConnector'; import MovieIndexProgressBar from 'Movie/Index/ProgressBar/MovieIndexProgressBar'; import MovieIndexPosterSelect from 'Movie/Index/Select/MovieIndexPosterSelect'; import MoviePoster from 'Movie/MoviePoster'; import { executeCommand } from 'Store/Actions/commandActions'; import dimensions from 'Styles/Variables/dimensions'; import fonts from 'Styles/Variables/fonts'; import translate from 'Utilities/String/translate'; import createMovieIndexItemSelector from '../createMovieIndexItemSelector'; import MovieIndexOverviewInfo from './MovieIndexOverviewInfo'; import selectOverviewOptions from './selectOverviewOptions'; import styles from './MovieIndexOverview.css'; const columnPadding = parseInt(dimensions.movieIndexColumnPadding); const columnPaddingSmallScreen = parseInt( dimensions.movieIndexColumnPaddingSmallScreen ); const defaultFontSize = parseInt(fonts.defaultFontSize); const lineHeight = parseFloat(fonts.lineHeight); // Hardcoded height beased on line-height of 32 + bottom margin of 10. // Less side-effecty than using react-measure. const titleRowHeight = 42; interface MovieIndexOverviewProps { movieId: number; sortKey: string; posterWidth: number; posterHeight: number; rowHeight: number; isSelectMode: boolean; isSmallScreen: boolean; } function MovieIndexOverview(props: MovieIndexOverviewProps) { const { movieId, sortKey, posterWidth, posterHeight, rowHeight, isSelectMode, isSmallScreen, } = props; const { movie, qualityProfile, isRefreshingMovie, isSearchingMovie } = useSelector(createMovieIndexItemSelector(props.movieId)); const overviewOptions = useSelector(selectOverviewOptions); const { title, monitored, status, path, overview, images, hasFile, isAvailable, tmdbId, imdbId, youTubeTrailerId, } = movie; const dispatch = useDispatch(); const [isEditMovieModalOpen, setIsEditMovieModalOpen] = useState(false); const [isDeleteMovieModalOpen, setIsDeleteMovieModalOpen] = useState(false); const onRefreshPress = useCallback(() => { dispatch( executeCommand({ name: REFRESH_MOVIE, movieIds: [movieId], }) ); }, [movieId, dispatch]); const onSearchPress = useCallback(() => { dispatch( executeCommand({ name: MOVIE_SEARCH, movieIds: [movieId], }) ); }, [movieId, dispatch]); const onEditMoviePress = useCallback(() => { setIsEditMovieModalOpen(true); }, [setIsEditMovieModalOpen]); const onEditMovieModalClose = useCallback(() => { setIsEditMovieModalOpen(false); }, [setIsEditMovieModalOpen]); const onDeleteMoviePress = useCallback(() => { setIsEditMovieModalOpen(false); setIsDeleteMovieModalOpen(true); }, [setIsDeleteMovieModalOpen]); const onDeleteMovieModalClose = useCallback(() => { setIsDeleteMovieModalOpen(false); }, [setIsDeleteMovieModalOpen]); const link = `/movie/${tmdbId}`; const elementStyle = { width: `${posterWidth}px`, height: `${posterHeight}px`, }; const contentHeight = useMemo(() => { const padding = isSmallScreen ? columnPaddingSmallScreen : columnPadding; return rowHeight - padding; }, [rowHeight, isSmallScreen]); const overviewHeight = contentHeight - titleRowHeight; return (
{isSelectMode ? : null}
{title}
} title={translate('Links')} body={ } /> {overviewOptions.showSearchAction ? ( ) : null}
); } export default MovieIndexOverview;