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;