@@ -462,17 +462,17 @@ export default class MessagePanel extends React.Component<IProps, IState> {
462
462
return ! this . isMounted ;
463
463
} ;
464
464
465
- private get showHiddenEvents ( ) : boolean {
465
+ public get showHiddenEvents ( ) : boolean {
466
466
return this . context ?. showHiddenEventsInTimeline ?? this . showHiddenEventsInTimeline ;
467
467
}
468
468
469
469
// TODO: Implement granular (per-room) hide options
470
- public shouldShowEvent ( mxEv : MatrixEvent ) : boolean {
470
+ public shouldShowEvent ( mxEv : MatrixEvent , forceHideEvents = false ) : boolean {
471
471
if ( MatrixClientPeg . get ( ) . isUserIgnored ( mxEv . getSender ( ) ) ) {
472
472
return false ; // ignored = no show (only happens if the ignore happens after an event was received)
473
473
}
474
474
475
- if ( this . showHiddenEvents ) {
475
+ if ( this . showHiddenEvents && ! forceHideEvents ) {
476
476
return true ;
477
477
}
478
478
@@ -1403,5 +1403,91 @@ class MemberGrouper extends BaseGrouper {
1403
1403
}
1404
1404
}
1405
1405
1406
+ // Wrap consecutive hidden events in a ListSummary, ignore if redacted
1407
+ class HiddenEventGrouper extends BaseGrouper {
1408
+ static canStartGroup = function ( panel : MessagePanel , ev : MatrixEvent ) : boolean {
1409
+ return ! panel . shouldShowEvent ( ev , true ) && panel . showHiddenEvents ;
1410
+ } ;
1411
+
1412
+ constructor (
1413
+ public readonly panel : MessagePanel ,
1414
+ public readonly event : MatrixEvent ,
1415
+ public readonly prevEvent : MatrixEvent ,
1416
+ public readonly lastShownEvent : MatrixEvent ,
1417
+ protected readonly layout : Layout ,
1418
+ ) {
1419
+ super ( panel , event , prevEvent , lastShownEvent , layout ) ;
1420
+ this . events = [ event ] ;
1421
+ }
1422
+
1423
+ public shouldGroup ( ev : MatrixEvent ) : boolean {
1424
+ if ( this . panel . wantsDateSeparator ( this . events [ 0 ] , ev . getDate ( ) ) ) {
1425
+ return false ;
1426
+ }
1427
+ return ! this . panel . shouldShowEvent ( ev , true ) ;
1428
+ }
1429
+
1430
+ public add ( ev : MatrixEvent , showHiddenEvents ?: boolean ) : void {
1431
+ this . readMarker = this . readMarker || this . panel . readMarkerForEvent ( ev . getId ( ) , ev === this . lastShownEvent ) ;
1432
+ this . events . push ( ev ) ;
1433
+ }
1434
+
1435
+ public getTiles ( ) : ReactNode [ ] {
1436
+ if ( ! this . events || ! this . events . length ) return [ ] ;
1437
+
1438
+ const isGrouped = true ;
1439
+ const panel = this . panel ;
1440
+ const ret = [ ] ;
1441
+ const lastShownEvent = this . lastShownEvent ;
1442
+
1443
+ if ( panel . wantsDateSeparator ( this . prevEvent , this . events [ 0 ] . getDate ( ) ) ) {
1444
+ const ts = this . events [ 0 ] . getTs ( ) ;
1445
+ ret . push (
1446
+ < li key = { ts + '~' } > < DateSeparator key = { ts + '~' } ts = { ts } /> </ li > ,
1447
+ ) ;
1448
+ }
1449
+
1450
+ const key = "hiddeneventlistsummary-" + (
1451
+ this . prevEvent ? this . events [ 0 ] . getId ( ) : "initial"
1452
+ ) ;
1453
+
1454
+ const senders = new Set < RoomMember > ( ) ;
1455
+ let eventTiles = this . events . map ( ( e , i ) => {
1456
+ senders . add ( e . sender ) ;
1457
+ const prevEvent = i === 0 ? this . prevEvent : this . events [ i - 1 ] ;
1458
+ return panel . getTilesForEvent (
1459
+ prevEvent , e , e === lastShownEvent , isGrouped , this . nextEvent , this . nextEventTile ) ;
1460
+ } ) . reduce ( ( a , b ) => a . concat ( b ) , [ ] ) ;
1461
+
1462
+ if ( eventTiles . length === 0 ) {
1463
+ eventTiles = null ;
1464
+ }
1465
+
1466
+ ret . push (
1467
+ < EventListSummary
1468
+ key = { key }
1469
+ threshold = { 2 }
1470
+ events = { this . events }
1471
+ onToggle = { panel . onHeightChanged } // Update scroll state
1472
+ summaryMembers = { Array . from ( senders ) }
1473
+ summaryText = { _t ( "%(count)s hidden messages." , { count : eventTiles . length } ) }
1474
+ layout = { this . layout }
1475
+ >
1476
+ { eventTiles }
1477
+ </ EventListSummary > ,
1478
+ ) ;
1479
+
1480
+ if ( this . readMarker ) {
1481
+ ret . push ( this . readMarker ) ;
1482
+ }
1483
+
1484
+ return ret ;
1485
+ }
1486
+
1487
+ public getNewPrevEvent ( ) : MatrixEvent {
1488
+ return this . events [ this . events . length - 1 ] ;
1489
+ }
1490
+ }
1491
+
1406
1492
// all the grouper classes that we use
1407
- const groupers = [ CreationGrouper , MemberGrouper , RedactionGrouper ] ;
1493
+ const groupers = [ CreationGrouper , MemberGrouper , RedactionGrouper , HiddenEventGrouper ] ;
0 commit comments