Message.tsx 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import * as React from 'react';
  2. import dayjs from 'dayjs';
  3. import { TopicMessage } from 'generated-sources';
  4. import Dropdown from 'components/common/Dropdown/Dropdown';
  5. import DropdownItem from 'components/common/Dropdown/DropdownItem';
  6. import useDataSaver from 'lib/hooks/useDataSaver';
  7. import VerticalElipsisIcon from 'components/common/Icons/VerticalElipsisIcon';
  8. import MessageToggleIcon from 'components/common/Icons/MessageToggleIcon';
  9. import IconButtonWrapper from 'components/common/Icons/IconButtonWrapper';
  10. import styled from 'styled-components';
  11. import MessageContent from './MessageContent/MessageContent';
  12. const StyledDataCell = styled.td`
  13. overflow: hidden;
  14. white-space: nowrap;
  15. text-overflow: ellipsis;
  16. max-width: 350px;
  17. min-width: 350px;
  18. `;
  19. const Message: React.FC<{ message: TopicMessage }> = ({
  20. message: {
  21. timestamp,
  22. timestampType,
  23. offset,
  24. key,
  25. partition,
  26. content,
  27. valueFormat,
  28. keyFormat,
  29. headers,
  30. },
  31. }) => {
  32. const [isOpen, setIsOpen] = React.useState(false);
  33. const { copyToClipboard, saveFile } = useDataSaver(
  34. 'topic-message',
  35. content || ''
  36. );
  37. const toggleIsOpen = () => setIsOpen(!isOpen);
  38. const [vEllipsisOpen, setVEllipsisOpen] = React.useState(false);
  39. return (
  40. <>
  41. <tr
  42. onMouseEnter={() => setVEllipsisOpen(true)}
  43. onMouseLeave={() => setVEllipsisOpen(false)}
  44. >
  45. <td>
  46. <IconButtonWrapper onClick={toggleIsOpen} aria-hidden>
  47. <MessageToggleIcon isOpen={isOpen} />
  48. </IconButtonWrapper>
  49. </td>
  50. <td>{offset}</td>
  51. <td>{partition}</td>
  52. <td>
  53. <div>{dayjs(timestamp).format('MM.DD.YYYY HH:mm:ss')}</div>
  54. </td>
  55. <StyledDataCell title={key}>{key}</StyledDataCell>
  56. <StyledDataCell>{content}</StyledDataCell>
  57. <td style={{ width: '5%' }}>
  58. {vEllipsisOpen && (
  59. <Dropdown label={<VerticalElipsisIcon />} right>
  60. <DropdownItem onClick={copyToClipboard}>
  61. Copy to clipboard
  62. </DropdownItem>
  63. <DropdownItem onClick={saveFile}>Save as a file</DropdownItem>
  64. </Dropdown>
  65. )}
  66. </td>
  67. </tr>
  68. {isOpen && (
  69. <MessageContent
  70. messageKey={key}
  71. messageKeyFormat={keyFormat}
  72. messageContent={content}
  73. messageContentFormat={valueFormat}
  74. headers={headers}
  75. timestamp={timestamp}
  76. timestampType={timestampType}
  77. />
  78. )}
  79. </>
  80. );
  81. };
  82. export default Message;