MessageItem.tsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import React from 'react';
  2. import { format } from 'date-fns';
  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 MessageContent from './MessageContent';
  8. export interface MessageItemProp {
  9. partition: TopicMessage['partition'];
  10. offset: TopicMessage['offset'];
  11. timestamp: TopicMessage['timestamp'];
  12. content?: TopicMessage['content'];
  13. messageKey?: TopicMessage['key'];
  14. }
  15. const MessageItem: React.FC<MessageItemProp> = ({
  16. partition,
  17. offset,
  18. timestamp,
  19. content,
  20. messageKey,
  21. }) => {
  22. const { copyToClipboard, saveFile } = useDataSaver(
  23. 'topic-message',
  24. content || ''
  25. );
  26. return (
  27. <tr>
  28. <td style={{ width: 200 }}>{format(timestamp, 'yyyy-MM-dd HH:mm:ss')}</td>
  29. <td>{messageKey}</td>
  30. <td style={{ width: 150 }}>{offset}</td>
  31. <td style={{ width: 100 }}>{partition}</td>
  32. <td style={{ wordBreak: 'break-word' }}>
  33. {content && <MessageContent message={content} />}
  34. </td>
  35. <td className="has-text-right">
  36. <Dropdown
  37. label={
  38. <span className="icon">
  39. <i className="fas fa-cog" />
  40. </span>
  41. }
  42. right
  43. >
  44. <DropdownItem onClick={copyToClipboard}>
  45. Copy to clipboard
  46. </DropdownItem>
  47. <DropdownItem onClick={saveFile}>Save as a file</DropdownItem>
  48. </Dropdown>
  49. </td>
  50. </tr>
  51. );
  52. };
  53. export default MessageItem;