|
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, |
@@ -146,10 +167,28 @@ const Message: React.FC<Props> = ({ |
146 | 167 | <td style={{ width: '5%' }}> |
147 | 168 | {vEllipsisOpen && ( |
148 | 169 | <Dropdown> |
149 | | - <DropdownItem onClick={copyToClipboard}> |
| 170 | + <DropdownItem |
| 171 | + aria-label="Copy to clipboard" |
| 172 | + onClick={copyToClipboard} |
| 173 | + > |
150 | 174 | Copy to clipboard |
151 | 175 | </DropdownItem> |
152 | | - <DropdownItem onClick={saveFile}>Save as a file</DropdownItem> |
| 176 | + <DropdownItem aria-label="Save as a file" onClick={saveFile}> |
| 177 | + Save as a file |
| 178 | + </DropdownItem> |
| 179 | + <ActionDropdownItem |
| 180 | + aria-label="Reproduce message" |
| 181 | + onClick={() => { |
| 182 | + openSidebarWithMessage(message); |
| 183 | + }} |
| 184 | + permission={{ |
| 185 | + resource: ResourceType.TOPIC, |
| 186 | + action: Action.MESSAGES_PRODUCE, |
| 187 | + value: topicName, |
| 188 | + }} |
| 189 | + > |
| 190 | + Reproduce message |
| 191 | + </ActionDropdownItem> |
153 | 192 | </Dropdown> |
154 | 193 | )} |
155 | 194 | </td> |
|
0 commit comments