Merge branch 'krille/refactor-handle-ephemerals' into 'main'

refactor: Handle Ephemerals method

Closes #306

See merge request famedly/company/frontend/famedlysdk!1064
This commit is contained in:
Krille Fear 2022-07-08 16:20:51 +00:00
commit c070a7ed40
1 changed files with 46 additions and 27 deletions

View File

@ -1739,43 +1739,62 @@ class Client extends MatrixApi {
} }
Future<void> _handleEphemerals(Room room, List<BasicRoomEvent> events) async { Future<void> _handleEphemerals(Room room, List<BasicRoomEvent> events) async {
var updateReceipts = false;
final receiptStateContent =
room.roomAccountData['m.receipt']?.content ?? {};
for (final event in events) { for (final event in events) {
await _handleRoomEvents(room, [event], EventUpdateType.ephemeral); await _handleRoomEvents(room, [event], EventUpdateType.ephemeral);
// Receipt events are deltas between two states. We will create a // Receipt events are deltas between two states. We will create a
// fake room account data event for this and store the difference // fake room account data event for this and store the difference
// there. // there.
if (event.type == 'm.receipt') { if (event.type != 'm.receipt') continue;
final receiptStateContent = updateReceipts = true;
room.roomAccountData['m.receipt']?.content ?? {}; for (final entry in event.content.entries) {
for (final eventEntry in event.content.entries) { final eventId = entry.key;
final eventID = eventEntry.key; final value = entry.value;
if (event.content[eventID]['m.read'] != null) {
final Map<String, dynamic> userTimestampMap = final userTimestampMap =
event.content[eventID]['m.read']; (value is Map ? Map<String, dynamic>.from(value) : null)
?.tryGetMap<String, dynamic>('m.read');
if (userTimestampMap == null) continue;
for (final userTimestampMapEntry in userTimestampMap.entries) { for (final userTimestampMapEntry in userTimestampMap.entries) {
final mxid = userTimestampMapEntry.key; final mxid = userTimestampMapEntry.key;
// Remove previous receipt event from this user // Remove previous receipt event from this user
if (receiptStateContent[eventID] is Map<String, dynamic> && if (receiptStateContent
receiptStateContent[eventID]['m.read'] .tryGetMap<String, dynamic>(eventId)
is Map<String, dynamic> && ?.tryGetMap<String, dynamic>('m.read')
receiptStateContent[eventID]['m.read'].containsKey(mxid)) { ?.containsKey(mxid) ??
receiptStateContent[eventID]['m.read'].remove(mxid); false) {
receiptStateContent[eventId]['m.read'].remove(mxid);
} }
if (userTimestampMap[mxid] is Map<String, dynamic> && if (userTimestampMap
userTimestampMap[mxid].containsKey('ts')) { .tryGetMap<String, dynamic>(mxid)
?.containsKey('ts') ??
false) {
receiptStateContent[mxid] = { receiptStateContent[mxid] = {
'event_id': eventID, 'event_id': eventId,
'ts': userTimestampMap[mxid]['ts'], 'ts': userTimestampMap[mxid]['ts'],
}; };
} }
} }
} }
} }
event.content = receiptStateContent;
await _handleRoomEvents(room, [event], EventUpdateType.accountData); if (updateReceipts) {
} await _handleRoomEvents(
room,
[
BasicRoomEvent(
type: 'm.receipt',
roomId: room.id,
content: receiptStateContent,
)
],
EventUpdateType.accountData);
} }
} }