import React from 'react'; import useDataSaver from 'lib/hooks/useDataSaver'; import { TopicMessage } from 'generated-sources'; import MessageToggleIcon from 'components/common/Icons/MessageToggleIcon'; import IconButtonWrapper from 'components/common/Icons/IconButtonWrapper'; import { Dropdown, DropdownItem } from 'components/common/Dropdown'; import { formatTimestamp } from 'lib/dateTimeHelpers'; import { JSONPath } from 'jsonpath-plus'; import Ellipsis from 'components/common/Ellipsis/Ellipsis'; import WarningRedIcon from 'components/common/Icons/WarningRedIcon'; import MessageContent from './MessageContent/MessageContent'; import * as S from './MessageContent/MessageContent.styled'; export interface PreviewFilter { field: string; path: string; } export interface Props { keyFilters: PreviewFilter[]; contentFilters: PreviewFilter[]; message: TopicMessage; } const Message: React.FC = ({ message: { timestamp, timestampType, offset, key, keySize, partition, content, valueSize, headers, valueSerde, keySerde, }, keyFilters, contentFilters, }) => { const [isOpen, setIsOpen] = React.useState(false); const savedMessageJson = { Value: content, Offset: offset, Key: key, Partition: partition, Headers: headers, Timestamp: timestamp, }; const savedMessage = JSON.stringify(savedMessageJson, null, '\t'); const { copyToClipboard, saveFile } = useDataSaver( 'topic-message', savedMessage || '' ); const toggleIsOpen = () => setIsOpen(!isOpen); const [vEllipsisOpen, setVEllipsisOpen] = React.useState(false); const getParsedJson = (jsonValue: string) => { try { return JSON.parse(jsonValue); } catch (e) { return {}; } }; const renderFilteredJson = ( jsonValue?: string, filters?: PreviewFilter[] ) => { if (!filters?.length || !jsonValue) return jsonValue; const parsedJson = getParsedJson(jsonValue); return ( <> {filters.map((item) => { return (
{item.field}:{' '} {JSON.stringify( JSONPath({ path: item.path, json: parsedJson, wrap: false }) )}
); })} ); }; return ( <> setVEllipsisOpen(true)} onMouseLeave={() => setVEllipsisOpen(false)} onClick={toggleIsOpen} > {offset} {partition}
{formatTimestamp(timestamp)}
{keySerde === 'Fallback' && } {valueSerde === 'Fallback' && } {vEllipsisOpen && ( Copy to clipboard Save as a file )}
{isOpen && ( )} ); }; export default Message;