import React from 'react'; import cx from 'classnames'; import { NavLink } from 'react-router-dom'; import { ClusterName, TopicName, TopicWithDetailedInfo, } from 'redux/interfaces'; import DropdownItem from 'components/common/Dropdown/DropdownItem'; import Dropdown from 'components/common/Dropdown/Dropdown'; import ConfirmationModal from 'components/common/ConfirmationModal/ConfirmationModal'; import ClusterContext from 'components/contexts/ClusterContext'; export interface ListItemProps { topic: TopicWithDetailedInfo; deleteTopic: (clusterName: ClusterName, topicName: TopicName) => void; clusterName: ClusterName; clearTopicMessages(topicName: TopicName, clusterName: ClusterName): void; } const ListItem: React.FC = ({ topic: { name, internal, partitions }, deleteTopic, clusterName, clearTopicMessages, }) => { const { isReadOnly } = React.useContext(ClusterContext); const [isDeleteTopicConfirmationVisible, setDeleteTopicConfirmationVisible] = React.useState(false); const outOfSyncReplicas = React.useMemo(() => { if (partitions === undefined || partitions.length === 0) { return 0; } return partitions.reduce((memo: number, { replicas }) => { const outOfSync = replicas?.filter(({ inSync }) => !inSync); return memo + (outOfSync?.length || 0); }, 0); }, [partitions]); const deleteTopicHandler = React.useCallback(() => { deleteTopic(clusterName, name); }, [clusterName, name]); const clearTopicMessagesHandler = React.useCallback(() => { clearTopicMessages(clusterName, name); }, [clusterName, name]); return ( {name} {partitions?.length} {outOfSyncReplicas}
{internal ? 'Internal' : 'External'}
{!internal && !isReadOnly ? ( <>
} right > Clear Messages setDeleteTopicConfirmationVisible(true)} > Remove Topic
setDeleteTopicConfirmationVisible(false)} onConfirm={deleteTopicHandler} > Are you sure want to remove {name} topic? ) : null} ); }; export default ListItem;