|
1 | 1 | import React from 'react';
|
2 | 2 | import useDataSaver from 'lib/hooks/useDataSaver';
|
3 |
| -import { TopicMessage } from 'generated-sources'; |
| 3 | +import { Action, ResourceType, TopicMessage } from 'generated-sources'; |
4 | 4 | import MessageToggleIcon from 'components/common/Icons/MessageToggleIcon';
|
5 | 5 | import IconButtonWrapper from 'components/common/Icons/IconButtonWrapper';
|
6 | 6 | import { Dropdown, DropdownItem } from 'components/common/Dropdown';
|
| 7 | +import { ActionDropdownItem } from 'components/common/ActionComponent'; |
7 | 8 | import { formatTimestamp } from 'lib/dateTimeHelpers';
|
8 | 9 | import { JSONPath } from 'jsonpath-plus';
|
9 | 10 | import Ellipsis from 'components/common/Ellipsis/Ellipsis';
|
10 | 11 | import WarningRedIcon from 'components/common/Icons/WarningRedIcon';
|
11 | 12 | import Tooltip from 'components/common/Tooltip/Tooltip';
|
12 | 13 | import { useTimezone } from 'lib/hooks/useTimezones';
|
| 14 | +import useAppParams from 'lib/hooks/useAppParams'; |
| 15 | +import { RouteParamsClusterTopic } from 'lib/paths'; |
| 16 | +import { useTopicActions } from 'components/contexts/TopicActionsContext'; |
13 | 17 |
|
14 | 18 | import MessageContent from './MessageContent/MessageContent';
|
15 | 19 | import * as S from './MessageContent/MessageContent.styled';
|
@@ -43,7 +47,24 @@ const Message: React.FC<Props> = ({
|
43 | 47 | contentFilters,
|
44 | 48 | }) => {
|
45 | 49 | const { currentTimezone } = useTimezone();
|
| 50 | + const { topicName } = useAppParams<RouteParamsClusterTopic>(); |
| 51 | + const { openSidebarWithMessage } = useTopicActions(); |
46 | 52 | const [isOpen, setIsOpen] = React.useState(false);
|
| 53 | + |
| 54 | + const message = { |
| 55 | + timestamp, |
| 56 | + timestampType, |
| 57 | + offset, |
| 58 | + key, |
| 59 | + keySize, |
| 60 | + partition, |
| 61 | + value, |
| 62 | + valueSize, |
| 63 | + headers, |
| 64 | + valueSerde, |
| 65 | + keySerde, |
| 66 | + }; |
| 67 | + |
47 | 68 | const savedMessageJson = {
|
48 | 69 | Value: value,
|
49 | 70 | Offset: offset,
|
@@ -142,10 +163,28 @@ const Message: React.FC<Props> = ({
|
142 | 163 | <td style={{ width: '5%' }}>
|
143 | 164 | {vEllipsisOpen && (
|
144 | 165 | <Dropdown>
|
145 |
| - <DropdownItem onClick={copyToClipboard}> |
| 166 | + <DropdownItem |
| 167 | + aria-label="Copy to clipboard" |
| 168 | + onClick={copyToClipboard} |
| 169 | + > |
146 | 170 | Copy to clipboard
|
147 | 171 | </DropdownItem>
|
148 |
| - <DropdownItem onClick={saveFile}>Save as a file</DropdownItem> |
| 172 | + <DropdownItem aria-label="Save as a file" onClick={saveFile}> |
| 173 | + Save as a file |
| 174 | + </DropdownItem> |
| 175 | + <ActionDropdownItem |
| 176 | + aria-label="Reproduce message" |
| 177 | + onClick={() => { |
| 178 | + openSidebarWithMessage(message); |
| 179 | + }} |
| 180 | + permission={{ |
| 181 | + resource: ResourceType.TOPIC, |
| 182 | + action: Action.MESSAGES_PRODUCE, |
| 183 | + value: topicName, |
| 184 | + }} |
| 185 | + > |
| 186 | + Reproduce message |
| 187 | + </ActionDropdownItem> |
149 | 188 | </Dropdown>
|
150 | 189 | )}
|
151 | 190 | </td>
|
|
0 commit comments