1- import PageLoader from ' components/common/PageLoader/PageLoader' ;
2- import { Table } from ' components/common/table/Table/Table.styled' ;
3- import TableHeaderCell from ' components/common/table/TableHeaderCell/TableHeaderCell' ;
4- import { TopicMessage } from ' generated-sources' ;
5- import React , { useState , useMemo } from ' react' ;
6- import { format } from ' date-fns' ;
7- import { Button } from ' components/common/Button/Button' ;
8- import * as S from ' components/common/NewTable/Table.styled' ;
9- import { usePaginateTopics , useIsLiveMode } from ' lib/hooks/useMessagesFilters' ;
10- import { useMessageFiltersStore } from ' lib/hooks/useMessageFiltersStore' ;
11- import useDataSaver from ' lib/hooks/useDataSaver' ;
12- import Select , { SelectOption } from ' components/common/Select/Select' ;
13-
14- import PreviewModal from ' ./PreviewModal' ;
15- import Message , { PreviewFilter } from ' ./Message' ;
1+ import PageLoader from " components/common/PageLoader/PageLoader" ;
2+ import { Table } from " components/common/table/Table/Table.styled" ;
3+ import TableHeaderCell from " components/common/table/TableHeaderCell/TableHeaderCell" ;
4+ import { TopicMessage } from " generated-sources" ;
5+ import React , { useState , useMemo } from " react" ;
6+ import { format } from " date-fns" ;
7+ import { Button } from " components/common/Button/Button" ;
8+ import * as S from " components/common/NewTable/Table.styled" ;
9+ import { usePaginateTopics , useIsLiveMode } from " lib/hooks/useMessagesFilters" ;
10+ import { useMessageFiltersStore } from " lib/hooks/useMessageFiltersStore" ;
11+ import useDataSaver from " lib/hooks/useDataSaver" ;
12+ import Select , { SelectOption } from " components/common/Select/Select" ;
13+
14+ import PreviewModal from " ./PreviewModal" ;
15+ import Message , { PreviewFilter } from " ./Message" ;
1616
1717export interface MessagesTableProps {
1818 messages : TopicMessage [ ] ;
@@ -24,20 +24,19 @@ interface MessageData {
2424 Offset : number ;
2525 Key : string | undefined ;
2626 Partition : number ;
27- Headers : { [ key : string ] : string | undefined ; } | undefined ;
27+ Headers : { [ key : string ] : string | undefined } | undefined ;
2828 Timestamp : Date ;
2929}
3030
31- type DownloadFormat = ' json' | ' csv' ;
31+ type DownloadFormat = " json" | " csv" ;
3232
3333function padCurrentDateTimeString ( ) : string {
3434 const now : Date = new Date ( ) ;
35- const dateTimeString :string = format ( now , ' yyyy-MM-dd HH:mm:ss' ) ;
35+ const dateTimeString : string = format ( now , " yyyy-MM-dd HH:mm:ss" ) ;
3636
3737 return `_${ dateTimeString } ` ;
3838}
3939
40-
4140const MessagesTable : React . FC < MessagesTableProps > = ( {
4241 messages,
4342 isFetching,
@@ -50,16 +49,16 @@ const MessagesTable: React.FC<MessagesTableProps> = ({
5049 const nextCursor = useMessageFiltersStore ( ( state ) => state . nextCursor ) ;
5150 const isLive = useIsLiveMode ( ) ;
5251
53- const [ selectedFormat , setSelectedFormat ] = useState < DownloadFormat > ( ' json' ) ;
52+ const [ selectedFormat , setSelectedFormat ] = useState < DownloadFormat > ( " json" ) ;
5453
5554 const formatOptions : SelectOption < DownloadFormat > [ ] = [
56- { label : ' JSON' , value : ' json' } ,
57- { label : ' CSV' , value : ' csv' }
55+ { label : " JSON" , value : " json" } ,
56+ { label : " CSV" , value : " csv" } ,
5857 ] ;
5958
6059 const baseFileName = `topic-messages${ padCurrentDateTimeString ( ) } ` ;
6160
62- const savedMessagesJson : MessageData [ ] = messages . map ( message => ( {
61+ const savedMessagesJson : MessageData [ ] = messages . map ( ( message ) => ( {
6362 Value : message . content ,
6463 Offset : message . offset ,
6564 Key : message . key ,
@@ -70,47 +69,68 @@ const MessagesTable: React.FC<MessagesTableProps> = ({
7069
7170 const convertToCSV = useMemo ( ( ) => {
7271 return ( messagesData : MessageData [ ] ) => {
73- const headers = [ 'Value' , 'Offset' , 'Key' , 'Partition' , 'Headers' , 'Timestamp' ] as const ;
74- const rows = messagesData . map ( msg =>
75- headers . map ( header => {
76- const value = msg [ header ] ;
77- if ( header === 'Headers' ) {
78- return JSON . stringify ( value || { } ) ;
79- }
80- return String ( value ?? '' ) ;
81- } ) . join ( ',' )
72+ const headers = [
73+ "Value" ,
74+ "Offset" ,
75+ "Key" ,
76+ "Partition" ,
77+ "Headers" ,
78+ "Timestamp" ,
79+ ] as const ;
80+ const rows = messagesData . map ( ( msg ) =>
81+ headers
82+ . map ( ( header ) => {
83+ const value = msg [ header ] ;
84+ if ( header === "Headers" ) {
85+ return JSON . stringify ( value || { } ) ;
86+ }
87+ return String ( value ?? "" ) ;
88+ } )
89+ . join ( "," ) ,
8290 ) ;
83- return [ headers . join ( ',' ) , ...rows ] . join ( '\n' ) ;
91+ return [ headers . join ( "," ) , ...rows ] . join ( "\n" ) ;
8492 } ;
8593 } , [ ] ) ;
8694
87- const jsonSaver = useDataSaver ( `${ baseFileName } .json` , JSON . stringify ( savedMessagesJson , null , '\t' ) ) ;
88- const csvSaver = useDataSaver ( `${ baseFileName } .csv` , convertToCSV ( savedMessagesJson ) ) ;
89-
95+ const jsonSaver = useDataSaver (
96+ `${ baseFileName } .json` ,
97+ JSON . stringify ( savedMessagesJson , null , "\t" ) ,
98+ ) ;
99+ const csvSaver = useDataSaver (
100+ `${ baseFileName } .csv` ,
101+ convertToCSV ( savedMessagesJson ) ,
102+ ) ;
90103
91104 const handleFormatSelect = ( downloadFormat : DownloadFormat ) => {
92105 setSelectedFormat ( downloadFormat ) ;
93106 } ;
94107
95108 const handleDownload = ( ) => {
96- if ( selectedFormat === ' json' ) {
109+ if ( selectedFormat === " json" ) {
97110 jsonSaver . saveFile ( ) ;
98111 } else {
99112 csvSaver . saveFile ( ) ;
100113 }
101114 } ;
102115
103116 return (
104- < div style = { { position : 'relative' } } >
105- < div style = { { display : 'flex' , gap : '8px' , marginLeft : '1rem' , marginBottom : '1rem' } } >
117+ < div style = { { position : "relative" } } >
118+ < div
119+ style = { {
120+ display : "flex" ,
121+ gap : "8px" ,
122+ marginLeft : "1rem" ,
123+ marginBottom : "1rem" ,
124+ } }
125+ >
106126 < Select < DownloadFormat >
107127 id = "download-format"
108128 name = "download-format"
109129 onChange = { handleFormatSelect }
110130 options = { formatOptions }
111131 value = { selectedFormat }
112- minWidth = "70px"
113- selectSize = "M"
132+ minWidth = "70px"
133+ selectSize = "M"
114134 placeholder = "Select format to download"
115135 disabled = { isFetching || messages . length === 0 }
116136 />
@@ -126,10 +146,10 @@ const MessagesTable: React.FC<MessagesTableProps> = ({
126146
127147 { previewFor !== null && (
128148 < PreviewModal
129- values = { previewFor === ' key' ? keyFilters : contentFilters }
149+ values = { previewFor === " key" ? keyFilters : contentFilters }
130150 toggleIsOpen = { ( ) => setPreviewFor ( null ) }
131151 setFilters = { ( payload : PreviewFilter [ ] ) =>
132- previewFor === ' key'
152+ previewFor === " key"
133153 ? setKeyFilters ( payload )
134154 : setContentFilters ( payload )
135155 }
@@ -145,18 +165,18 @@ const MessagesTable: React.FC<MessagesTableProps> = ({
145165 < TableHeaderCell
146166 title = "Key"
147167 previewText = { `Preview ${
148- keyFilters . length ? `(${ keyFilters . length } selected)` : ''
168+ keyFilters . length ? `(${ keyFilters . length } selected)` : ""
149169 } `}
150- onPreview = { ( ) => setPreviewFor ( ' key' ) }
170+ onPreview = { ( ) => setPreviewFor ( " key" ) }
151171 />
152172 < TableHeaderCell
153173 title = "Value"
154174 previewText = { `Preview ${
155175 contentFilters . length
156176 ? `(${ contentFilters . length } selected)`
157- : ''
177+ : ""
158178 } `}
159- onPreview = { ( ) => setPreviewFor ( ' content' ) }
179+ onPreview = { ( ) => setPreviewFor ( " content" ) }
160180 />
161181 < TableHeaderCell > </ TableHeaderCell >
162182 </ tr >
@@ -169,7 +189,7 @@ const MessagesTable: React.FC<MessagesTableProps> = ({
169189 message . timestamp ,
170190 message . key ,
171191 message . partition ,
172- ] . join ( '-' ) }
192+ ] . join ( "-" ) }
173193 message = { message }
174194 keyFilters = { keyFilters }
175195 contentFilters = { contentFilters }
@@ -206,3 +226,4 @@ const MessagesTable: React.FC<MessagesTableProps> = ({
206226} ;
207227
208228export default MessagesTable ;
229+
0 commit comments