| 
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';  | 
 | 13 | +import useAppParams from 'lib/hooks/useAppParams';  | 
 | 14 | +import { RouteParamsClusterTopic } from 'lib/paths';  | 
 | 15 | +import { useTopicActions } from 'components/contexts/TopicActionsContext';  | 
12 | 16 | 
 
  | 
13 | 17 | import MessageContent from './MessageContent/MessageContent';  | 
14 | 18 | import * as S from './MessageContent/MessageContent.styled';  | 
@@ -41,7 +45,24 @@ const Message: React.FC<Props> = ({  | 
41 | 45 |   keyFilters,  | 
42 | 46 |   contentFilters,  | 
43 | 47 | }) => {  | 
 | 48 | +  const { topicName } = useAppParams<RouteParamsClusterTopic>();  | 
 | 49 | +  const { openSidebarWithMessage } = useTopicActions();  | 
44 | 50 |   const [isOpen, setIsOpen] = React.useState(false);  | 
 | 51 | + | 
 | 52 | +  const message = {  | 
 | 53 | +    timestamp,  | 
 | 54 | +    timestampType,  | 
 | 55 | +    offset,  | 
 | 56 | +    key,  | 
 | 57 | +    keySize,  | 
 | 58 | +    partition,  | 
 | 59 | +    value,  | 
 | 60 | +    valueSize,  | 
 | 61 | +    headers,  | 
 | 62 | +    valueSerde,  | 
 | 63 | +    keySerde,  | 
 | 64 | +  };  | 
 | 65 | + | 
45 | 66 |   const savedMessageJson = {  | 
46 | 67 |     Value: value,  | 
47 | 68 |     Offset: offset,  | 
@@ -138,10 +159,28 @@ const Message: React.FC<Props> = ({  | 
138 | 159 |         <td style={{ width: '5%' }}>  | 
139 | 160 |           {vEllipsisOpen && (  | 
140 | 161 |             <Dropdown>  | 
141 |  | -              <DropdownItem onClick={copyToClipboard}>  | 
 | 162 | +              <DropdownItem  | 
 | 163 | +                aria-label="Copy to clipboard"  | 
 | 164 | +                onClick={copyToClipboard}  | 
 | 165 | +              >  | 
142 | 166 |                 Copy to clipboard  | 
143 | 167 |               </DropdownItem>  | 
144 |  | -              <DropdownItem onClick={saveFile}>Save as a file</DropdownItem>  | 
 | 168 | +              <DropdownItem aria-label="Save as a file" onClick={saveFile}>  | 
 | 169 | +                Save as a file  | 
 | 170 | +              </DropdownItem>  | 
 | 171 | +              <ActionDropdownItem  | 
 | 172 | +                aria-label="Produce message"  | 
 | 173 | +                onClick={() => {  | 
 | 174 | +                  openSidebarWithMessage(message);  | 
 | 175 | +                }}  | 
 | 176 | +                permission={{  | 
 | 177 | +                  resource: ResourceType.TOPIC,  | 
 | 178 | +                  action: Action.MESSAGES_PRODUCE,  | 
 | 179 | +                  value: topicName,  | 
 | 180 | +                }}  | 
 | 181 | +              >  | 
 | 182 | +                Produce message  | 
 | 183 | +              </ActionDropdownItem>  | 
145 | 184 |             </Dropdown>  | 
146 | 185 |           )}  | 
147 | 186 |         </td>  | 
 | 
0 commit comments