@@ -51,6 +51,7 @@ import { RoomPermalinkCreator } from "../../utils/permalinks/Permalinks";
5151import Spinner from "../views/elements/Spinner" ;
5252import EditorStateTransfer from '../../utils/EditorStateTransfer' ;
5353import ErrorDialog from '../views/dialogs/ErrorDialog' ;
54+ import CallEventGrouper from "./CallEventGrouper" ;
5455
5556const PAGINATE_SIZE = 20 ;
5657const INITIAL_SIZE = 20 ;
@@ -237,6 +238,9 @@ class TimelinePanel extends React.Component<IProps, IState> {
237238 private readReceiptActivityTimer : Timer ;
238239 private readMarkerActivityTimer : Timer ;
239240
241+ // A map of <callId, CallEventGrouper>
242+ private callEventGroupers = new Map < string , CallEventGrouper > ( ) ;
243+
240244 constructor ( props , context ) {
241245 super ( props , context ) ;
242246
@@ -388,6 +392,7 @@ class TimelinePanel extends React.Component<IProps, IState> {
388392 this . timelineWindow . unpaginate ( count , backwards ) ;
389393
390394 const { events, liveEvents, firstVisibleEventIndex } = this . getEvents ( ) ;
395+ this . buildCallEventGroupers ( events ) ;
391396 const newState : Partial < IState > = {
392397 events,
393398 liveEvents,
@@ -449,6 +454,7 @@ class TimelinePanel extends React.Component<IProps, IState> {
449454 debuglog ( "paginate complete backwards:" + backwards + "; success:" + r ) ;
450455
451456 const { events, liveEvents, firstVisibleEventIndex } = this . getEvents ( ) ;
457+ this . buildCallEventGroupers ( events ) ;
452458 const newState : Partial < IState > = {
453459 [ paginatingKey ] : false ,
454460 [ canPaginateKey ] : r ,
@@ -561,6 +567,7 @@ class TimelinePanel extends React.Component<IProps, IState> {
561567 if ( this . unmounted ) { return ; }
562568
563569 const { events, liveEvents, firstVisibleEventIndex } = this . getEvents ( ) ;
570+ this . buildCallEventGroupers ( events ) ;
564571 const lastLiveEvent = liveEvents [ liveEvents . length - 1 ] ;
565572
566573 const updatedState : Partial < IState > = {
@@ -1231,6 +1238,7 @@ class TimelinePanel extends React.Component<IProps, IState> {
12311238 canForwardPaginate : false ,
12321239 timelineLoading : true ,
12331240 } ) ;
1241+ this . buildCallEventGroupers ( ) ;
12341242 prom . then ( onLoaded , onError ) ;
12351243 }
12361244 }
@@ -1243,7 +1251,9 @@ class TimelinePanel extends React.Component<IProps, IState> {
12431251 // the results if so.
12441252 if ( this . unmounted ) return ;
12451253
1246- this . setState ( this . getEvents ( ) ) ;
1254+ const state = this . getEvents ( ) ;
1255+ this . buildCallEventGroupers ( state . events ) ;
1256+ this . setState ( state ) ;
12471257 }
12481258
12491259 // Force refresh the timeline before threads support pending events
@@ -1512,6 +1522,27 @@ class TimelinePanel extends React.Component<IProps, IState> {
15121522 eventType : EventType | string ,
15131523 ) => this . props . timelineSet . getRelationsForEvent ( eventId , relationType , eventType ) ;
15141524
1525+ private buildCallEventGroupers ( events ?: MatrixEvent [ ] ) : void {
1526+ const oldCallEventGroupers = this . callEventGroupers ;
1527+ this . callEventGroupers = new Map ( ) ;
1528+ events ?. forEach ( ev => {
1529+ if ( ! ev . getType ( ) . startsWith ( "m.call." ) && ! ev . getType ( ) . startsWith ( "org.matrix.call." ) ) {
1530+ return ;
1531+ }
1532+
1533+ const callId = ev . getContent ( ) . call_id ;
1534+ if ( ! this . callEventGroupers . has ( callId ) ) {
1535+ if ( oldCallEventGroupers . has ( callId ) ) {
1536+ // reuse the CallEventGrouper object where possible
1537+ this . callEventGroupers . set ( callId , oldCallEventGroupers . get ( callId ) ) ;
1538+ } else {
1539+ this . callEventGroupers . set ( callId , new CallEventGrouper ( ) ) ;
1540+ }
1541+ }
1542+ this . callEventGroupers . get ( callId ) . add ( ev ) ;
1543+ } ) ;
1544+ }
1545+
15151546 render ( ) {
15161547 // just show a spinner while the timeline loads.
15171548 //
@@ -1596,6 +1627,7 @@ class TimelinePanel extends React.Component<IProps, IState> {
15961627 enableFlair = { SettingsStore . getValue ( UIFeature . Flair ) }
15971628 hideThreadedMessages = { this . props . hideThreadedMessages }
15981629 disableGrouping = { this . props . disableGrouping }
1630+ callEventGroupers = { this . callEventGroupers }
15991631 />
16001632 ) ;
16011633 }
0 commit comments