|  | 
| 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