import React, { useCallback, useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { createSelector } from 'reselect'; import AppState from 'App/State/AppState'; 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, kinds } from 'Helpers/Props'; import { saveReleaseProfile, setReleaseProfileValue, } from 'Store/Actions/Settings/releaseProfiles'; import selectSettings from 'Store/Selectors/selectSettings'; import ReleaseProfile from 'typings/Settings/ReleaseProfile'; import translate from 'Utilities/String/translate'; import styles from './EditReleaseProfileModalContent.css'; const tagInputDelimiters = ['Tab', 'Enter']; const newReleaseProfile: ReleaseProfile = { id: 0, name: '', enabled: true, required: [], ignored: [], tags: [], indexerId: 0, }; function createReleaseProfileSelector(id?: number) { return createSelector( (state: AppState) => state.settings.releaseProfiles, (releaseProfiles) => { const { items, isFetching, error, isSaving, saveError, pendingChanges } = releaseProfiles; const mapping = id ? items.find((i) => i.id === id)! : newReleaseProfile; const settings = selectSettings( mapping, pendingChanges, saveError ); return { id, isFetching, error, isSaving, saveError, item: settings.settings, ...settings, }; } ); } interface EditReleaseProfileModalContentProps { id?: number; onModalClose: () => void; onDeleteReleaseProfilePress?: () => void; } function EditReleaseProfileModalContent({ id, onModalClose, onDeleteReleaseProfilePress, }: EditReleaseProfileModalContentProps) { const { item, isFetching, isSaving, error, saveError, ...otherProps } = useSelector(createReleaseProfileSelector(id)); const { name, enabled, required, ignored, tags, indexerId } = item; const dispatch = useDispatch(); const previousIsSaving = usePrevious(isSaving); useEffect(() => { if (!id) { Object.entries(newReleaseProfile).forEach(([name, value]) => { // @ts-expect-error 'setReleaseProfileValue' isn't typed yet dispatch(setReleaseProfileValue({ name, value })); }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { if (previousIsSaving && !isSaving && !saveError) { onModalClose(); } }, [previousIsSaving, isSaving, saveError, onModalClose]); const handleSavePress = useCallback(() => { dispatch(saveReleaseProfile({ id })); }, [dispatch, id]); const handleInputChange = useCallback( (payload: { name: string; value: string | number }) => { // @ts-expect-error 'setReleaseProfileValue' isn't typed yet dispatch(setReleaseProfileValue(payload)); }, [dispatch] ); return ( {id ? translate('EditReleaseProfile') : translate('AddReleaseProfile')}
{translate('Name')} {translate('EnableProfile')} {translate('MustContain')} {translate('MustNotContain')} {translate('Indexer')} {translate('Tags')}
{id ? ( ) : null} {translate('Save')}
); } export default EditReleaseProfileModalContent;