import React, { useCallback, useEffect, useMemo } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import AppState from 'App/State/AppState'; import useMovieCollection from 'Collection/useMovieCollection'; import Form from 'Components/Form/Form'; import FormGroup from 'Components/Form/FormGroup'; import FormInputGroup from 'Components/Form/FormInputGroup'; import FormLabel from 'Components/Form/FormLabel'; import Button from 'Components/Link/Button'; import SpinnerErrorButton from 'Components/Link/SpinnerErrorButton'; import ModalBody from 'Components/Modal/ModalBody'; import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import usePrevious from 'Helpers/Hooks/usePrevious'; import { inputTypes } from 'Helpers/Props'; import MoviePoster from 'Movie/MoviePoster'; import { saveMovieCollection, setMovieCollectionValue, } from 'Store/Actions/movieCollectionActions'; import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector'; import selectSettings from 'Store/Selectors/selectSettings'; import { InputChanged } from 'typings/inputs'; import translate from 'Utilities/String/translate'; import styles from './EditMovieCollectionModalContent.css'; export interface EditMovieCollectionModalContentProps { collectionId: number; onModalClose: () => void; } function EditMovieCollectionModalContent({ collectionId, onModalClose, }: EditMovieCollectionModalContentProps) { const dispatch = useDispatch(); const { title, overview, monitored, qualityProfileId, minimumAvailability, rootFolderPath, searchOnAdd, images, tags, } = useMovieCollection(collectionId)!; const { isSaving, saveError, pendingChanges } = useSelector( (state: AppState) => state.movieCollections ); const { isSmallScreen } = useSelector(createDimensionsSelector()); const wasSaving = usePrevious(isSaving); const { settings, ...otherSettings } = useMemo(() => { return selectSettings( { monitored, minimumAvailability, qualityProfileId, rootFolderPath, searchOnAdd, tags, }, pendingChanges, saveError ); }, [ monitored, minimumAvailability, qualityProfileId, rootFolderPath, searchOnAdd, tags, pendingChanges, saveError, ]); const handleInputChange = useCallback( ({ name, value }: InputChanged) => { // @ts-expect-error actions aren't typed dispatch(setMovieCollectionValue({ name, value })); }, [dispatch] ); const handleSavePress = useCallback(() => { dispatch( saveMovieCollection({ id: collectionId, }) ); }, [collectionId, dispatch]); useEffect(() => { if (!isSaving && wasSaving && !saveError) { onModalClose(); } }, [isSaving, wasSaving, saveError, onModalClose]); return ( {translate('EditMovieCollectionModalHeader', { title })}
{isSmallScreen ? null : (
)}
{overview}
{translate('Monitored')} {translate('MinimumAvailability')} {translate('QualityProfile')} {translate('RootFolder')} {translate('Tags')} {translate('SearchOnAdd')}
{translate('Save')}
); } export default EditMovieCollectionModalContent;