MessageContent.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import React from 'react';
  2. import EditorViewer from 'components/common/EditorViewer/EditorViewer';
  3. import BytesFormatted from 'components/common/BytesFormatted/BytesFormatted';
  4. import { SchemaType, TopicMessageTimestampTypeEnum } from 'generated-sources';
  5. import { formatTimestamp } from 'lib/dateTimeHelpers';
  6. import { useSearchParams } from 'react-router-dom';
  7. import * as S from './MessageContent.styled';
  8. type Tab = 'key' | 'content' | 'headers';
  9. export interface MessageContentProps {
  10. messageKey?: string;
  11. messageContent?: string;
  12. headers?: { [key: string]: string | undefined };
  13. timestamp?: Date;
  14. timestampType?: TopicMessageTimestampTypeEnum;
  15. keySize?: number;
  16. contentSize?: number;
  17. }
  18. const MessageContent: React.FC<MessageContentProps> = ({
  19. messageKey,
  20. messageContent,
  21. headers,
  22. timestamp,
  23. timestampType,
  24. keySize,
  25. contentSize,
  26. }) => {
  27. const [activeTab, setActiveTab] = React.useState<Tab>('content');
  28. const [searchParams] = useSearchParams();
  29. const keyFormat = searchParams.get('keySerde') || '';
  30. const valueFormat = searchParams.get('valueSerde') || '';
  31. const activeTabContent = () => {
  32. switch (activeTab) {
  33. case 'content':
  34. return messageContent;
  35. case 'key':
  36. return messageKey;
  37. default:
  38. return JSON.stringify(headers);
  39. }
  40. };
  41. const handleKeyTabClick = (e: React.MouseEvent) => {
  42. e.preventDefault();
  43. setActiveTab('key');
  44. };
  45. const handleContentTabClick = (e: React.MouseEvent) => {
  46. e.preventDefault();
  47. setActiveTab('content');
  48. };
  49. const handleHeadersTabClick = (e: React.MouseEvent) => {
  50. e.preventDefault();
  51. setActiveTab('headers');
  52. };
  53. const contentType =
  54. messageContent && messageContent.trim().startsWith('{')
  55. ? SchemaType.JSON
  56. : SchemaType.PROTOBUF;
  57. return (
  58. <S.Wrapper>
  59. <td colSpan={10}>
  60. <S.Section>
  61. <S.ContentBox>
  62. <S.Tabs>
  63. <S.Tab
  64. type="button"
  65. $active={activeTab === 'key'}
  66. onClick={handleKeyTabClick}
  67. >
  68. Key
  69. </S.Tab>
  70. <S.Tab
  71. $active={activeTab === 'content'}
  72. type="button"
  73. onClick={handleContentTabClick}
  74. >
  75. Value
  76. </S.Tab>
  77. <S.Tab
  78. $active={activeTab === 'headers'}
  79. type="button"
  80. onClick={handleHeadersTabClick}
  81. >
  82. Headers
  83. </S.Tab>
  84. </S.Tabs>
  85. <EditorViewer
  86. data={activeTabContent() || ''}
  87. maxLines={28}
  88. schemaType={contentType}
  89. />
  90. </S.ContentBox>
  91. <S.MetadataWrapper>
  92. <S.Metadata>
  93. <S.MetadataLabel>Timestamp</S.MetadataLabel>
  94. <span>
  95. <S.MetadataValue>{formatTimestamp(timestamp)}</S.MetadataValue>
  96. <S.MetadataMeta>Timestamp type: {timestampType}</S.MetadataMeta>
  97. </span>
  98. </S.Metadata>
  99. <S.Metadata>
  100. <S.MetadataLabel>Key Serde</S.MetadataLabel>
  101. <span>
  102. <S.MetadataValue>{keyFormat}</S.MetadataValue>
  103. <S.MetadataMeta>
  104. Size: <BytesFormatted value={keySize} />
  105. </S.MetadataMeta>
  106. </span>
  107. </S.Metadata>
  108. <S.Metadata>
  109. <S.MetadataLabel>Value Serde</S.MetadataLabel>
  110. <span>
  111. <S.MetadataValue>{valueFormat}</S.MetadataValue>
  112. <S.MetadataMeta>
  113. Size: <BytesFormatted value={contentSize} />
  114. </S.MetadataMeta>
  115. </span>
  116. </S.Metadata>
  117. </S.MetadataWrapper>
  118. </S.Section>
  119. </td>
  120. </S.Wrapper>
  121. );
  122. };
  123. export default MessageContent;