import React, { useCallback, useState } from 'react'; import { useSelector } from 'react-redux'; import { SelectActionType, useSelect } from 'App/SelectContext'; import Label from 'Components/Label'; import IconButton from 'Components/Link/IconButton'; 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 { icons } from 'Helpers/Props'; import DeleteIndexerModal from 'Indexer/Delete/DeleteIndexerModal'; import EditIndexerModalConnector from 'Indexer/Edit/EditIndexerModalConnector'; import createIndexerIndexItemSelector from 'Indexer/Index/createIndexerIndexItemSelector'; import IndexerInfoModal from 'Indexer/Info/IndexerInfoModal'; import titleCase from 'Utilities/String/titleCase'; import translate from 'Utilities/String/translate'; import CapabilitiesLabel from './CapabilitiesLabel'; import IndexerStatusCell from './IndexerStatusCell'; import ProtocolLabel from './ProtocolLabel'; import styles from './IndexerIndexRow.css'; interface IndexerIndexRowProps { indexerId: number; sortKey: string; columns: Column[]; isSelectMode: boolean; } function IndexerIndexRow(props: IndexerIndexRowProps) { const { indexerId, columns, isSelectMode } = props; const { indexer, appProfile } = useSelector( createIndexerIndexItemSelector(props.indexerId) ); const { name: indexerName, indexerUrls, enable, redirect, tags, protocol, privacy, priority, status, fields, added, capabilities, } = indexer; const baseUrl = fields.find((field) => field.name === 'baseUrl')?.value ?? (Array.isArray(indexerUrls) ? indexerUrls[0] : undefined); const [isIndexerInfoModalOpen, setIsIndexerInfoModalOpen] = useState(false); const [isEditIndexerModalOpen, setIsEditIndexerModalOpen] = useState(false); const [isDeleteIndexerModalOpen, setIsDeleteIndexerModalOpen] = useState(false); const [selectState, selectDispatch] = useSelect(); const onEditIndexerPress = useCallback(() => { setIsEditIndexerModalOpen(true); }, [setIsEditIndexerModalOpen]); const onEditIndexerModalClose = useCallback(() => { setIsEditIndexerModalOpen(false); }, [setIsEditIndexerModalOpen]); const onIndexerInfoPress = useCallback(() => { setIsIndexerInfoModalOpen(true); }, [setIsIndexerInfoModalOpen]); const onIndexerInfoModalClose = useCallback(() => { setIsIndexerInfoModalOpen(false); }, [setIsIndexerInfoModalOpen]); const onDeleteIndexerPress = useCallback(() => { setIsEditIndexerModalOpen(false); setIsDeleteIndexerModalOpen(true); }, [setIsDeleteIndexerModalOpen]); const onDeleteIndexerModalClose = useCallback(() => { setIsDeleteIndexerModalOpen(false); }, [setIsDeleteIndexerModalOpen]); const checkInputCallback = useCallback(() => { // Mock handler to satisfy `onChange` being required for `CheckInput`. }, []); const onSelectedChange = useCallback( ({ id, value, shiftKey }) => { selectDispatch({ type: SelectActionType.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 === 'sortName') { return ( {indexerName} ); } if (name === 'privacy') { return ( ); } if (name === 'priority') { return ( {priority} ); } if (name === 'protocol') { return ( ); } if (name === 'appProfileId') { return ( {appProfile?.name || ''} ); } if (name === 'capabilities') { return ( ); } if (name === 'added') { return ( ); } if (name === 'tags') { return ( ); } if (name === 'actions') { return ( {baseUrl ? ( ) : null} ); } return null; })} ); } export default IndexerIndexRow;