From 6be0e086356e71a36bb7b8331fbd06de29d3b432 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 25 Jul 2023 04:34:41 +0300 Subject: [PATCH] Convert Delete Indexer to Typescript --- .../src/Indexer/Delete/DeleteIndexerModal.js | 34 ------- .../src/Indexer/Delete/DeleteIndexerModal.tsx | 25 ++++++ .../Delete/DeleteIndexerModalContent.js | 88 ------------------- .../Delete/DeleteIndexerModalContent.tsx | 51 +++++++++++ .../DeleteIndexerModalContentConnector.js | 57 ------------ src/NzbDrone.Core/Localization/Core/en.json | 1 + 6 files changed, 77 insertions(+), 179 deletions(-) delete mode 100644 frontend/src/Indexer/Delete/DeleteIndexerModal.js create mode 100644 frontend/src/Indexer/Delete/DeleteIndexerModal.tsx delete mode 100644 frontend/src/Indexer/Delete/DeleteIndexerModalContent.js create mode 100644 frontend/src/Indexer/Delete/DeleteIndexerModalContent.tsx delete mode 100644 frontend/src/Indexer/Delete/DeleteIndexerModalContentConnector.js diff --git a/frontend/src/Indexer/Delete/DeleteIndexerModal.js b/frontend/src/Indexer/Delete/DeleteIndexerModal.js deleted file mode 100644 index aed954829..000000000 --- a/frontend/src/Indexer/Delete/DeleteIndexerModal.js +++ /dev/null @@ -1,34 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import Modal from 'Components/Modal/Modal'; -import { sizes } from 'Helpers/Props'; -import DeleteIndexerModalContentConnector from './DeleteIndexerModalContentConnector'; - -function DeleteIndexerModal(props) { - const { - isOpen, - onModalClose, - ...otherProps - } = props; - - return ( - - - - ); -} - -DeleteIndexerModal.propTypes = { - ...DeleteIndexerModalContentConnector.propTypes, - isOpen: PropTypes.bool.isRequired, - onModalClose: PropTypes.func.isRequired -}; - -export default DeleteIndexerModal; diff --git a/frontend/src/Indexer/Delete/DeleteIndexerModal.tsx b/frontend/src/Indexer/Delete/DeleteIndexerModal.tsx new file mode 100644 index 000000000..13850aa77 --- /dev/null +++ b/frontend/src/Indexer/Delete/DeleteIndexerModal.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import Modal from 'Components/Modal/Modal'; +import { sizes } from 'Helpers/Props'; +import DeleteIndexerModalContent from './DeleteIndexerModalContent'; + +interface DeleteIndexerModalProps { + isOpen: boolean; + indexerId: number; + onModalClose(): void; +} + +function DeleteIndexerModal(props: DeleteIndexerModalProps) { + const { isOpen, indexerId, onModalClose } = props; + + return ( + + + + ); +} + +export default DeleteIndexerModal; diff --git a/frontend/src/Indexer/Delete/DeleteIndexerModalContent.js b/frontend/src/Indexer/Delete/DeleteIndexerModalContent.js deleted file mode 100644 index e3d46e108..000000000 --- a/frontend/src/Indexer/Delete/DeleteIndexerModalContent.js +++ /dev/null @@ -1,88 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import Button from 'Components/Link/Button'; -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 { kinds } from 'Helpers/Props'; -import translate from 'Utilities/String/translate'; - -class DeleteIndexerModalContent extends Component { - - // - // Lifecycle - - constructor(props, context) { - super(props, context); - - this.state = { - deleteFiles: false, - addImportExclusion: false - }; - } - - // - // Listeners - - onDeleteFilesChange = ({ value }) => { - this.setState({ deleteFiles: value }); - }; - - onAddImportExclusionChange = ({ value }) => { - this.setState({ addImportExclusion: value }); - }; - - onDeleteMovieConfirmed = () => { - const deleteFiles = this.state.deleteFiles; - const addImportExclusion = this.state.addImportExclusion; - - this.setState({ deleteFiles: false, addImportExclusion: false }); - this.props.onDeletePress(deleteFiles, addImportExclusion); - }; - - // - // Render - - render() { - const { - name, - onModalClose - } = this.props; - - return ( - - - Delete - {name} - - - - {`Are you sure you want to delete ${name} from Prowlarr`} - - - - - - - - - ); - } -} - -DeleteIndexerModalContent.propTypes = { - name: PropTypes.string.isRequired, - onDeletePress: PropTypes.func.isRequired, - onModalClose: PropTypes.func.isRequired -}; - -export default DeleteIndexerModalContent; diff --git a/frontend/src/Indexer/Delete/DeleteIndexerModalContent.tsx b/frontend/src/Indexer/Delete/DeleteIndexerModalContent.tsx new file mode 100644 index 000000000..7373ba885 --- /dev/null +++ b/frontend/src/Indexer/Delete/DeleteIndexerModalContent.tsx @@ -0,0 +1,51 @@ +import React, { useCallback } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import Button from 'Components/Link/Button'; +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 { kinds } from 'Helpers/Props'; +import { deleteIndexer } from 'Store/Actions/indexerActions'; +import { createIndexerSelectorForHook } from 'Store/Selectors/createIndexerSelector'; +import translate from 'Utilities/String/translate'; + +interface DeleteIndexerModalContentProps { + indexerId: number; + onModalClose(): void; +} + +function DeleteIndexerModalContent(props: DeleteIndexerModalContentProps) { + const { indexerId, onModalClose } = props; + + const { name } = useSelector(createIndexerSelectorForHook(indexerId)); + const dispatch = useDispatch(); + + const onConfirmDelete = useCallback(() => { + dispatch(deleteIndexer({ id: indexerId })); + + onModalClose(); + }, [indexerId, dispatch, onModalClose]); + + return ( + + + {translate('Delete')} - {name} + + + + {translate('AreYouSureYouWantToDeleteIndexer', [name])} + + + + + + + + + ); +} + +export default DeleteIndexerModalContent; diff --git a/frontend/src/Indexer/Delete/DeleteIndexerModalContentConnector.js b/frontend/src/Indexer/Delete/DeleteIndexerModalContentConnector.js deleted file mode 100644 index 1e92eb845..000000000 --- a/frontend/src/Indexer/Delete/DeleteIndexerModalContentConnector.js +++ /dev/null @@ -1,57 +0,0 @@ -import { push } from 'connected-react-router'; -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { createSelector } from 'reselect'; -import { deleteIndexer } from 'Store/Actions/indexerActions'; -import createIndexerSelector from 'Store/Selectors/createIndexerSelector'; -import DeleteIndexerModalContent from './DeleteIndexerModalContent'; - -function createMapStateToProps() { - return createSelector( - createIndexerSelector(), - (indexer) => { - return indexer; - } - ); -} - -const mapDispatchToProps = { - deleteIndexer, - push -}; - -class DeleteIndexerModalContentConnector extends Component { - - // - // Listeners - - onDeletePress = () => { - this.props.deleteIndexer({ - id: this.props.indexerId - }); - - this.props.onModalClose(true); - }; - - // - // Render - - render() { - return ( - - ); - } -} - -DeleteIndexerModalContentConnector.propTypes = { - indexerId: PropTypes.number.isRequired, - onModalClose: PropTypes.func.isRequired, - deleteIndexer: PropTypes.func.isRequired, - push: PropTypes.func.isRequired -}; - -export default connect(createMapStateToProps, mapDispatchToProps)(DeleteIndexerModalContentConnector); diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index f10617902..a2a78cc46 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -52,6 +52,7 @@ "AppsMinimumSeeders": "Apps Minimum Seeders", "AppsMinimumSeedersHelpText": "Minimum seeders required by the Applications for the indexer to grab, empty is Sync profile's default", "AreYouSureYouWantToDeleteCategory": "Are you sure you want to delete mapped category?", + "AreYouSureYouWantToDeleteIndexer": "Are you sure you want to delete '{0}' from Prowlarr?", "AreYouSureYouWantToResetYourAPIKey": "Are you sure you want to reset your API Key?", "Artist": "Artist", "AudioSearch": "Audio Search",