fix: Read receipts and filtered events
This commit is contained in:
parent
e75b06a5a6
commit
ee770aa5ba
3 changed files with 91 additions and 77 deletions
41
lib/utils/filtered_timeline_extension.dart
Normal file
41
lib/utils/filtered_timeline_extension.dart
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
import 'package:famedlysdk/famedlysdk.dart';
|
||||
|
||||
import '../app_config.dart';
|
||||
|
||||
extension FilteredTimelineExtension on Timeline {
|
||||
List<Event> getFilteredEvents({bool collapseRoomCreate = true}) {
|
||||
final filteredEvents = events
|
||||
.where((e) =>
|
||||
// always filter out edit and reaction relationships
|
||||
!{RelationshipTypes.Edit, RelationshipTypes.Reaction}
|
||||
.contains(e.relationshipType) &&
|
||||
// always filter out m.key.* events
|
||||
!e.type.startsWith('m.key.verification.') &&
|
||||
// event types to hide: redaction and reaction events
|
||||
// if a reaction has been redacted we also want it to be hidden in the timeline
|
||||
!{EventTypes.Reaction, EventTypes.Redaction}.contains(e.type) &&
|
||||
// if we enabled to hide all redacted events, don't show those
|
||||
(!AppConfig.hideRedactedEvents || !e.redacted) &&
|
||||
// if we enabled to hide all unknown events, don't show those
|
||||
(!AppConfig.hideUnknownEvents || e.isEventTypeKnown) &&
|
||||
// remove state events that we don't want to render
|
||||
(!{EventTypes.Message, EventTypes.Sticker, EventTypes.Encrypted}
|
||||
.contains(e.type) ||
|
||||
!AppConfig.hideAllStateEvents))
|
||||
.toList();
|
||||
|
||||
// Hide state events from the room creater right after the room created event
|
||||
if (collapseRoomCreate &&
|
||||
filteredEvents[filteredEvents.length - 1].type ==
|
||||
EventTypes.RoomCreate) {
|
||||
while (filteredEvents.length >= 3 &&
|
||||
filteredEvents[filteredEvents.length - 2].senderId ==
|
||||
filteredEvents[filteredEvents.length - 1].senderId &&
|
||||
![EventTypes.Message, EventTypes.Sticker, EventTypes.Encrypted]
|
||||
.contains(filteredEvents[filteredEvents.length - 2].type)) {
|
||||
filteredEvents.removeAt(filteredEvents.length - 2);
|
||||
}
|
||||
}
|
||||
return filteredEvents;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
import 'package:famedlysdk/famedlysdk.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
|
||||
import 'filtered_timeline_extension.dart';
|
||||
import '../app_config.dart';
|
||||
import 'date_time_extension.dart';
|
||||
|
||||
|
|
@ -61,4 +61,36 @@ extension RoomStatusExtension on Room {
|
|||
}
|
||||
return typingText;
|
||||
}
|
||||
|
||||
String getLocalizedSeenByText(
|
||||
BuildContext context, Timeline timeline, List<Event> filteredEvents) {
|
||||
var seenByText = '';
|
||||
if (timeline.events.isNotEmpty) {
|
||||
final filteredEvents =
|
||||
timeline.getFilteredEvents(collapseRoomCreate: false);
|
||||
final lastReceipts = <User>{};
|
||||
// now we iterate the timeline events until we hit the first rendered event
|
||||
for (final event in timeline.events) {
|
||||
lastReceipts.addAll(event.receipts.map((r) => r.user));
|
||||
if (event.eventId == filteredEvents.first.eventId) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
lastReceipts.removeWhere((user) =>
|
||||
user.id == client.userID || user.id == filteredEvents.first.senderId);
|
||||
if (lastReceipts.length == 1) {
|
||||
seenByText =
|
||||
L10n.of(context).seenByUser(lastReceipts.first.calcDisplayname());
|
||||
} else if (lastReceipts.length == 2) {
|
||||
seenByText = seenByText = L10n.of(context).seenByUserAndUser(
|
||||
lastReceipts.first.calcDisplayname(),
|
||||
lastReceipts.last.calcDisplayname());
|
||||
} else if (lastReceipts.length > 2) {
|
||||
seenByText = L10n.of(context).seenByUserAndCountOthers(
|
||||
lastReceipts.first.calcDisplayname(),
|
||||
(lastReceipts.length - 1).toString());
|
||||
}
|
||||
}
|
||||
return seenByText;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue