1- import React , { MouseEventHandler } from 'react' ;
1+ import React , { MouseEventHandler , CSSProperties } from 'react' ;
22// @ts -ignore no types for the package
33import Panel from 'react-flex-panel' ;
44import FontAwesome from 'react-fontawesome' ;
5+ import { FixedSizeList , ListChildComponentProps } from 'react-window' ;
6+ import AutoSizer from 'react-virtualized-auto-sizer' ;
57import classNames from 'classnames' ;
68import './App.scss' ;
79import { ObjectInspector } from 'react-inspector' ;
@@ -84,15 +86,16 @@ function base64ToArrayBuffer(base64: string) {
8486 return bytes ;
8587}
8688
87- const FrameEntry = ( { frame, selected, onClick} :
88- { frame : WsFrameState , selected : boolean , onClick : MouseEventHandler } ) => {
89+ const FrameEntry = ( { frame, selected, onClick, style } :
90+ { frame : WsFrameState , selected : boolean , onClick : MouseEventHandler , style : CSSProperties } ) => {
8991 const rsocketFrame = tryDeserializeFrame ( frame . payload )
9092 const frameName = rsocketFrame
9193 ? < span className = "name" > { shortFrame ( rsocketFrame ) } </ span >
9294 : < span className = "name" > { frame . text != null ? "Text Frame" : "Binary Frame" } </ span >
9395 return (
9496 < li
9597 className = { classNames ( "frame" , "frame-" + frame . type , { "frame-selected" : selected } ) }
98+ style = { style }
9699 onClick = { onClick } >
97100 < FontAwesome name = { frame . type === "incoming" ? "arrow-circle-down" : "arrow-circle-up" } />
98101 < TimeStamp time = { frame . time } />
@@ -412,6 +415,24 @@ export const App = observer(({store}: { store: AppStateStore }) => {
412415 }
413416 const { frames, activeFrame} = connection ;
414417 const active = frames . find ( f => f . id === activeFrame ) ;
418+
419+ const Row = ( { index, style, data } : ListChildComponentProps ) => {
420+ const frame = data [ index ] ;
421+
422+ return (
423+ < FrameEntry
424+ key = { frame . id }
425+ style = { style }
426+ frame = { frame }
427+ selected = { frame . id === activeFrame }
428+ onClick = { e => {
429+ store . selectFrame ( frame . id ) ;
430+ e . stopPropagation ( ) ;
431+ } }
432+ />
433+ ) ;
434+ } ;
435+
415436 return (
416437 < Panel cols className = "App" >
417438 < Panel size = { 300 } minSize = { 180 } resizable className = "LeftPanel" >
@@ -430,17 +451,16 @@ export const App = observer(({store}: { store: AppStateStore }) => {
430451 }
431452 </ select >
432453 </ div >
433- < ul className = "frame-list" onClick = { ( ) => store . selectFrame ( undefined ) } >
434- { frames . map ( ( frame : WsFrameState ) =>
435- < FrameEntry key = { frame . id }
436- frame = { frame }
437- selected = { frame . id === activeFrame }
438- onClick = { e => {
439- store . selectFrame ( frame . id ) ;
440- e . stopPropagation ( ) ;
441- } }
442- /> ) }
443- </ ul >
454+
455+ < div className = "frame-list" >
456+ < AutoSizer disableWidth >
457+ { ( { height } ) => (
458+ < FixedSizeList height = { height } width = "100%" itemCount = { frames . length } itemSize = { 18 } innerElementType = "ul" >
459+ { Row }
460+ </ FixedSizeList >
461+ ) }
462+ </ AutoSizer >
463+ </ div >
444464 </ Panel >
445465 < Panel minSize = { 100 } className = "PanelView" >
446466 { active != null ? < FrameView wsFrame = { active } /> :
0 commit comments