import React, { useCallback, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { useSelect } from 'App/SelectContext'; import { MOVIE_SEARCH, REFRESH_MOVIE } from 'Commands/commandNames'; import Icon from 'Components/Icon'; import ImdbRating from 'Components/ImdbRating'; import IconButton from 'Components/Link/IconButton'; import SpinnerIconButton from 'Components/Link/SpinnerIconButton'; import RottenTomatoRating from 'Components/RottenTomatoRating'; import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellConnector'; import VirtualTableRowCell from 'Components/Table/Cells/VirtualTableRowCell'; import VirtualTableSelectCell from 'Components/Table/Cells/VirtualTableSelectCell'; import Column from 'Components/Table/Column'; import TagListConnector from 'Components/TagListConnector'; import TmdbRating from 'Components/TmdbRating'; import Tooltip from 'Components/Tooltip/Tooltip'; import { icons, kinds } from 'Helpers/Props'; import DeleteMovieModal from 'Movie/Delete/DeleteMovieModal'; import MovieDetailsLinks from 'Movie/Details/MovieDetailsLinks'; import EditMovieModalConnector from 'Movie/Edit/EditMovieModalConnector'; import createMovieIndexItemSelector from 'Movie/Index/createMovieIndexItemSelector'; import MovieTitleLink from 'Movie/MovieTitleLink'; import { executeCommand } from 'Store/Actions/commandActions'; import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector'; import { SelectStateInputProps } from 'typings/props'; import formatRuntime from 'Utilities/Date/formatRuntime'; import formatBytes from 'Utilities/Number/formatBytes'; import titleCase from 'Utilities/String/titleCase'; import translate from 'Utilities/String/translate'; import MovieIndexProgressBar from '../ProgressBar/MovieIndexProgressBar'; import MovieStatusCell from './MovieStatusCell'; import selectTableOptions from './selectTableOptions'; import styles from './MovieIndexRow.css'; interface MovieIndexRowProps { movieId: number; sortKey: string; columns: Column[]; isSelectMode: boolean; } function MovieIndexRow(props: MovieIndexRowProps) { const { movieId, columns, isSelectMode } = props; const { movie, qualityProfile, isRefreshingMovie, isSearchingMovie } = useSelector(createMovieIndexItemSelector(props.movieId)); const { showSearchAction } = useSelector(selectTableOptions); const { movieRuntimeFormat } = useSelector(createUISettingsSelector()); const { monitored, titleSlug, title, collection, studio, status, originalLanguage, originalTitle, added, year, inCinemas, digitalRelease, physicalRelease, runtime, minimumAvailability, path, sizeOnDisk, genres = [], ratings, certification, tags = [], tmdbId, imdbId, isAvailable, hasFile, movieFile, youTubeTrailerId, isSaving = false, } = movie; const dispatch = useDispatch(); const [isEditMovieModalOpen, setIsEditMovieModalOpen] = useState(false); const [isDeleteMovieModalOpen, setIsDeleteMovieModalOpen] = useState(false); const [selectState, selectDispatch] = useSelect(); 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 onSelectedChange = useCallback( ({ id, value, shiftKey }: SelectStateInputProps) => { selectDispatch({ type: 'toggleSelected', id, isSelected: value, shiftKey, }); }, [selectDispatch] ); return ( <> {isSelectMode ? ( ) : null} {columns.map((column) => { const { name, isVisible } = column; if (!isVisible) { return null; } if (name === 'status') { return ( ); } if (name === 'sortTitle') { return ( ); } if (name === 'collection') { return ( {collection ? collection.title : null} ); } if (name === 'studio') { return ( {studio} ); } if (name === 'originalLanguage') { return ( {originalLanguage.name} ); } if (name === 'originalTitle') { return ( {originalTitle} ); } if (name === 'qualityProfileId') { return ( {qualityProfile.name} ); } if (name === 'added') { return ( // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore ts(2739) ); } if (name === 'year') { return ( {year} ); } if (name === 'inCinemas') { return ( // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore ts(2739) ); } if (name === 'digitalRelease') { return ( // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore ts(2739) ); } if (name === 'physicalRelease') { return ( // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore ts(2739) ); } if (name === 'runtime') { return ( {formatRuntime(runtime, movieRuntimeFormat)} ); } if (name === 'minimumAvailability') { return ( {titleCase(minimumAvailability)} ); } if (name === 'path') { return ( {path} ); } if (name === 'sizeOnDisk') { return ( {formatBytes(sizeOnDisk)} ); } if (name === 'genres') { const joinedGenres = genres.join(', '); return ( {joinedGenres} ); } if (name === 'movieStatus') { return ( ); } if (name === 'tmdbRating') { return ( ); } if (name === 'rottenTomatoesRating') { return ( ); } if (name === 'imdbRating') { return ( ); } if (name === 'certification') { return ( {certification} ); } if (name === 'tags') { return ( ); } if (name === 'actions') { return ( } tooltip={ } canFlip={true} kind={kinds.INVERSE} /> {showSearchAction ? ( ) : null} ); } return null; })} ); } export default MovieIndexRow;