ListItem.tsx 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import React from 'react';
  2. import { ConsumerGroupTopicPartition } from 'generated-sources';
  3. import { Link } from 'react-router-dom';
  4. import { ClusterName } from 'redux/interfaces/cluster';
  5. import { clusterTopicPath } from 'lib/paths';
  6. import MessageToggleIcon from 'components/common/Icons/MessageToggleIcon';
  7. import IconButtonWrapper from 'components/common/Icons/IconButtonWrapper';
  8. import { TableKeyLink } from 'components/common/table/Table/TableKeyLink.styled';
  9. import TopicContents from './TopicContents/TopicContents';
  10. import { ToggleButton } from './ListItem.styled';
  11. interface Props {
  12. clusterName: ClusterName;
  13. name: string;
  14. consumers: ConsumerGroupTopicPartition[];
  15. }
  16. const ListItem: React.FC<Props> = ({ clusterName, name, consumers }) => {
  17. const [isOpen, setIsOpen] = React.useState(false);
  18. const getTotalMessagesBehind = () => {
  19. let count = 0;
  20. consumers.forEach((consumer) => {
  21. count += consumer?.messagesBehind || 0;
  22. });
  23. return count;
  24. };
  25. return (
  26. <>
  27. <tr>
  28. <ToggleButton>
  29. <IconButtonWrapper onClick={() => setIsOpen(!isOpen)} aria-hidden>
  30. <MessageToggleIcon isOpen={isOpen} />
  31. </IconButtonWrapper>
  32. </ToggleButton>
  33. <TableKeyLink>
  34. <Link to={clusterTopicPath(clusterName, name)}>{name}</Link>
  35. </TableKeyLink>
  36. <td>{getTotalMessagesBehind()}</td>
  37. </tr>
  38. {isOpen && <TopicContents consumers={consumers} />}
  39. </>
  40. );
  41. };
  42. export default ListItem;