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