import { uniqBy } from 'lodash'; import React, { useCallback, useState } from 'react'; import { Tab, TabList, TabPanel, Tabs } from 'react-tabs'; import Alert from 'Components/Alert'; import DescriptionList from 'Components/DescriptionList/DescriptionList'; import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem'; import DescriptionListItemDescription from 'Components/DescriptionList/DescriptionListItemDescription'; import DescriptionListItemTitle from 'Components/DescriptionList/DescriptionListItemTitle'; import FieldSet from 'Components/FieldSet'; import Label from 'Components/Label'; import Button from 'Components/Link/Button'; import Link from 'Components/Link/Link'; 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 TableRowCell from 'Components/Table/Cells/TableRowCell'; import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; import TableRow from 'Components/Table/TableRow'; import TagListConnector from 'Components/TagListConnector'; import { kinds } from 'Helpers/Props'; import DeleteIndexerModal from 'Indexer/Delete/DeleteIndexerModal'; import EditIndexerModalConnector from 'Indexer/Edit/EditIndexerModalConnector'; import PrivacyLabel from 'Indexer/Index/Table/PrivacyLabel'; import Indexer, { IndexerCapabilities } from 'Indexer/Indexer'; import useIndexer from 'Indexer/useIndexer'; import translate from 'Utilities/String/translate'; import IndexerHistory from './History/IndexerHistory'; import styles from './IndexerInfoModalContent.css'; const TABS = ['details', 'categories', 'history', 'stats']; interface IndexerInfoModalContentProps { indexerId: number; onModalClose(): void; onCloneIndexerPress(id: number): void; } function IndexerInfoModalContent(props: IndexerInfoModalContentProps) { const { indexerId, onModalClose, onCloneIndexerPress } = props; const { id, name, description, encoding, language, indexerUrls, fields, tags, protocol, privacy, capabilities = {} as IndexerCapabilities, } = useIndexer(indexerId) as Indexer; const [selectedTab, setSelectedTab] = useState(TABS[0]); const [isEditIndexerModalOpen, setIsEditIndexerModalOpen] = useState(false); const [isDeleteIndexerModalOpen, setIsDeleteIndexerModalOpen] = useState(false); const handleTabSelect = useCallback( (selectedIndex: number) => { const selectedTab = TABS[selectedIndex]; setSelectedTab(selectedTab); }, [setSelectedTab] ); const handleEditIndexerPress = useCallback(() => { setIsEditIndexerModalOpen(true); }, [setIsEditIndexerModalOpen]); const handleEditIndexerModalClose = useCallback(() => { setIsEditIndexerModalOpen(false); }, [setIsEditIndexerModalOpen]); const handleDeleteIndexerPress = useCallback(() => { setIsEditIndexerModalOpen(false); setIsDeleteIndexerModalOpen(true); }, [setIsDeleteIndexerModalOpen]); const handleDeleteIndexerModalClose = useCallback(() => { setIsDeleteIndexerModalOpen(false); onModalClose(); }, [setIsDeleteIndexerModalOpen, onModalClose]); const handleCloneIndexerPressWrapper = useCallback(() => { onCloneIndexerPress(id); onModalClose(); }, [id, onCloneIndexerPress, onModalClose]); const baseUrl = fields.find((field) => field.name === 'baseUrl')?.value ?? (Array.isArray(indexerUrls) ? indexerUrls[0] : undefined); const indexerUrl = baseUrl?.replace(/(:\/\/)api\./, '$1'); const vipExpiration = fields.find((field) => field.name === 'vipExpiration')?.value ?? undefined; return ( {`${name}`} {translate('Details')} {translate('Categories')} {translate('History')}
: '-'} /> {vipExpiration ? ( ) : null} {translate('IndexerSite')} {indexerUrl ? ( {indexerUrl} ) : ( '-' )} {protocol === 'usenet' ? translate('NewznabUrl') : translate('TorznabUrl')} {`${window.location.origin}${window.Prowlarr.urlBase}/${id}/api`} {tags.length > 0 ? ( <> {translate('Tags')} ) : null}
0 ? ( ) : ( translate('NotSupported') ) } /> 0 ? capabilities.tvSearchParams.map((p) => { return ( ); }) : translate('NotSupported') } /> 0 ? capabilities.movieSearchParams.map((p) => { return ( ); }) : translate('NotSupported') } /> 0 ? capabilities.bookSearchParams.map((p) => { return ( ); }) : translate('NotSupported') } /> 0 ? capabilities.musicSearchParams.map((p) => { return ( ); }) : translate('NotSupported') } />
{capabilities?.categories?.length > 0 ? (
{uniqBy(capabilities.categories, 'id') .sort((a, b) => a.id - b.id) .map((category) => { return ( {category.id} {category.name} {category?.subCategories?.length > 0 ? uniqBy(category.subCategories, 'id') .sort((a, b) => a.id - b.id) .map((subCategory) => { return ( {subCategory.id} {subCategory.name} ); }) : null} ); })}
) : ( {translate('NoIndexerCategories')} )}
); } export default IndexerInfoModalContent;