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 {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue