import React from 'react'; 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'; import BytesFormatted from 'components/common/BytesFormatted/BytesFormatted'; import { Tag } from 'components/common/Tag/Tag.styled'; import VerticalElipsisIcon from 'components/common/Icons/VerticalElipsisIcon'; import { TableKeyLink } from 'components/common/table/Table/TableKeyLink.styled'; import * as S from './List.styled'; export interface ListItemProps { topic: TopicWithDetailedInfo; selected: boolean; toggleTopicSelected(topicName: TopicName): void; deleteTopic: (clusterName: ClusterName, topicName: TopicName) => void; recreateTopic: (clusterName: ClusterName, topicName: TopicName) => void; clusterName: ClusterName; clearTopicMessages(topicName: TopicName, clusterName: ClusterName): void; } const ListItem: React.FC = ({ topic: { name, internal, partitions, segmentSize, replicationFactor, cleanUpPolicy, }, selected, toggleTopicSelected, deleteTopic, recreateTopic, clusterName, clearTopicMessages, }) => { const { isReadOnly, isTopicDeletionAllowed } = React.useContext(ClusterContext); const [isDeleteTopicConfirmationVisible, setDeleteTopicConfirmationVisible] = React.useState(false); const [ isRecreateTopicConfirmationVisible, setRecreateTopicConfirmationVisible, ] = React.useState(false); const { outOfSyncReplicas, numberOfMessages } = React.useMemo(() => { if (partitions === undefined || partitions.length === 0) { return { outOfSyncReplicas: 0, numberOfMessages: 0, }; } return partitions.reduce( (memo, { replicas, offsetMax, offsetMin }) => { const outOfSync = replicas?.filter(({ inSync }) => !inSync); return { outOfSyncReplicas: memo.outOfSyncReplicas + (outOfSync?.length || 0), numberOfMessages: memo.numberOfMessages + (offsetMax - offsetMin), }; }, { outOfSyncReplicas: 0, numberOfMessages: 0, } ); }, [partitions]); const deleteTopicHandler = React.useCallback(() => { deleteTopic(clusterName, name); }, [clusterName, deleteTopic, name]); const recreateTopicHandler = React.useCallback(() => { recreateTopic(clusterName, name); setRecreateTopicConfirmationVisible(false); }, [recreateTopic, clusterName, name]); const clearTopicMessagesHandler = React.useCallback(() => { clearTopicMessages(clusterName, name); }, [clearTopicMessages, clusterName, name]); const [vElipsisVisble, setVElipsisVisble] = React.useState(false); return ( setVElipsisVisble(true)} onMouseLeave={() => setVElipsisVisble(false)} > {!isReadOnly && ( {!internal && ( { toggleTopicSelected(name); }} /> )} )} {internal && IN} {name} {partitions?.length} {outOfSyncReplicas} {replicationFactor} {numberOfMessages} {!internal && !isReadOnly && vElipsisVisble ? (
} right> {cleanUpPolicy === 'DELETE' && ( Clear Messages )} {isTopicDeletionAllowed && ( setDeleteTopicConfirmationVisible(true)} danger > Remove Topic )} setRecreateTopicConfirmationVisible(true)} danger > Recreate Topic
) : null} setDeleteTopicConfirmationVisible(false)} onConfirm={deleteTopicHandler} > Are you sure want to remove {name} topic? setRecreateTopicConfirmationVisible(false)} onConfirm={recreateTopicHandler} > Are you sure to recreate {name} topic? ); }; export default ListItem;