edits and reactions in threads
This commit is contained in:
parent
09643a172f
commit
92e69b5f1e
|
|
@ -175,8 +175,8 @@ class Room {
|
||||||
// This should be called from the client's sync handling
|
// This should be called from the client's sync handling
|
||||||
// when a thread-related event is received
|
// when a thread-related event is received
|
||||||
|
|
||||||
if (event.relationshipType == RelationshipTypes.thread &&
|
// if (event.relationshipType == RelationshipTypes.thread &&
|
||||||
event.relationshipEventId != null) {
|
// event.relationshipEventId != null) {
|
||||||
// Update thread metadata in database
|
// Update thread metadata in database
|
||||||
final root = await getEventById(event.relationshipEventId!);
|
final root = await getEventById(event.relationshipEventId!);
|
||||||
if (root == null) return;
|
if (root == null) return;
|
||||||
|
|
@ -191,7 +191,7 @@ class Room {
|
||||||
client,
|
client,
|
||||||
);
|
);
|
||||||
threads[event.relationshipEventId!] = (await client.database.getThread(id, event.relationshipEventId!, client))!;
|
threads[event.relationshipEventId!] = (await client.database.getThread(id, event.relationshipEventId!, client))!;
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the [Event] for the given [typeKey] and optional [stateKey].
|
/// Returns the [Event] for the given [typeKey] and optional [stateKey].
|
||||||
|
|
|
||||||
|
|
@ -491,6 +491,15 @@ class RoomTimeline extends Timeline {
|
||||||
addAggregatedEvent(event);
|
addAggregatedEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (event.relationshipEventId != null &&
|
||||||
|
(event.relationshipType == RelationshipTypes.edit ||
|
||||||
|
event.relationshipType == RelationshipTypes.reaction ||
|
||||||
|
event.relationshipType == RelationshipTypes.reference)) {
|
||||||
|
final parentEventIndex =
|
||||||
|
_findEvent(event_id: event.relationshipEventId);
|
||||||
|
unawaited(room.handleThreadSync(events[parentEventIndex]));
|
||||||
|
}
|
||||||
|
|
||||||
// Handle redaction events
|
// Handle redaction events
|
||||||
if (event.type == EventTypes.Redaction) {
|
if (event.type == EventTypes.Redaction) {
|
||||||
final index = _findEvent(event_id: event.redacts);
|
final index = _findEvent(event_id: event.redacts);
|
||||||
|
|
|
||||||
|
|
@ -105,6 +105,7 @@ class Thread {
|
||||||
room.id,
|
room.id,
|
||||||
rootEvent.eventId,
|
rootEvent.eventId,
|
||||||
'm.thread',
|
'm.thread',
|
||||||
|
recurse: true,
|
||||||
)
|
)
|
||||||
.timeout(timeout);
|
.timeout(timeout);
|
||||||
final matrixEvent = result.chunk.firstOrNull;
|
final matrixEvent = result.chunk.firstOrNull;
|
||||||
|
|
@ -172,14 +173,17 @@ class Thread {
|
||||||
final resp = await client.getEventContext(
|
final resp = await client.getEventContext(
|
||||||
room.id, eventId,
|
room.id, eventId,
|
||||||
limit: Room.defaultHistoryCount,
|
limit: Room.defaultHistoryCount,
|
||||||
|
|
||||||
// filter: jsonEncode(StateFilter(lazyLoadMembers: true).toJson()),
|
// filter: jsonEncode(StateFilter(lazyLoadMembers: true).toJson()),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
final events = [
|
final events = [
|
||||||
if (resp.eventsAfter != null) ...resp.eventsAfter!.reversed,
|
if (resp.eventsAfter != null) ...resp.eventsAfter!.reversed,
|
||||||
if (resp.event != null) resp.event!,
|
if (resp.event != null) resp.event!,
|
||||||
if (resp.eventsBefore != null) ...resp.eventsBefore!,
|
if (resp.eventsBefore != null) ...resp.eventsBefore!,
|
||||||
].map((e) => Event.fromMatrixEvent(e, room)).toList();
|
].map((e) => Event.fromMatrixEvent(e, room)).where((e) => e.relationshipType == RelationshipTypes.thread && e.relationshipEventId == rootEvent.eventId).toList();
|
||||||
|
|
||||||
// Try again to decrypt encrypted events but don't update the database.
|
// Try again to decrypt encrypted events but don't update the database.
|
||||||
if (room.encrypted && client.encryptionEnabled) {
|
if (room.encrypted && client.encryptionEnabled) {
|
||||||
|
|
@ -403,10 +407,9 @@ class Thread {
|
||||||
throw 'Tried to request history without a prev_batch token';
|
throw 'Tried to request history without a prev_batch token';
|
||||||
}
|
}
|
||||||
|
|
||||||
final resp = await client.getRelatingEventsWithRelType(
|
final resp = await client.getRelatingEvents(
|
||||||
room.id,
|
room.id,
|
||||||
rootEvent.eventId,
|
rootEvent.eventId,
|
||||||
RelationshipTypes.thread,
|
|
||||||
from: prev_batch,
|
from: prev_batch,
|
||||||
limit: historyCount,
|
limit: historyCount,
|
||||||
dir: direction,
|
dir: direction,
|
||||||
|
|
|
||||||
|
|
@ -73,11 +73,15 @@ class ThreadTimeline extends Timeline {
|
||||||
try {
|
try {
|
||||||
if (event.roomId != thread.room.id) return;
|
if (event.roomId != thread.room.id) return;
|
||||||
// Ignore events outside of this thread
|
// Ignore events outside of this thread
|
||||||
if (event.relationshipType != RelationshipTypes.thread ||
|
if (event.relationshipType == RelationshipTypes.thread &&
|
||||||
event.relationshipEventId != thread.rootEvent.eventId) {
|
event.relationshipEventId != thread.rootEvent.eventId) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (event.relationshipType == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (type != EventUpdateType.timeline && type != EventUpdateType.history) {
|
if (type != EventUpdateType.timeline && type != EventUpdateType.history) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -160,10 +164,9 @@ class ThreadTimeline extends Timeline {
|
||||||
filter ??= StateFilter(lazyLoadMembers: true);
|
filter ??= StateFilter(lazyLoadMembers: true);
|
||||||
filter.lazyLoadMembers ??= true;
|
filter.lazyLoadMembers ??= true;
|
||||||
|
|
||||||
final resp = await thread.client.getRelatingEventsWithRelType(
|
final resp = await thread.client.getRelatingEvents(
|
||||||
thread.room.id,
|
thread.room.id,
|
||||||
thread.rootEvent.eventId,
|
thread.rootEvent.eventId,
|
||||||
RelationshipTypes.thread,
|
|
||||||
dir: direction,
|
dir: direction,
|
||||||
from: direction == Direction.b ? chunk.prevBatch : chunk.nextBatch,
|
from: direction == Direction.b ? chunk.prevBatch : chunk.nextBatch,
|
||||||
limit: historyCount,
|
limit: historyCount,
|
||||||
|
|
@ -255,6 +258,11 @@ class ThreadTimeline extends Timeline {
|
||||||
if (onUpdate != null) {
|
if (onUpdate != null) {
|
||||||
onUpdate!();
|
onUpdate!();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (final e in events) {
|
||||||
|
addAggregatedEvent(e);
|
||||||
|
}
|
||||||
|
|
||||||
return resp.chunk.length;
|
return resp.chunk.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -337,9 +345,13 @@ class ThreadTimeline extends Timeline {
|
||||||
void addAggregatedEvent(Event event) {
|
void addAggregatedEvent(Event event) {
|
||||||
final relationshipType = event.relationshipType;
|
final relationshipType = event.relationshipType;
|
||||||
final relationshipEventId = event.relationshipEventId;
|
final relationshipEventId = event.relationshipEventId;
|
||||||
if (relationshipType == null || relationshipEventId == null) {
|
if (relationshipType == null ||
|
||||||
|
relationshipType == RelationshipTypes.thread ||
|
||||||
|
relationshipEventId == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// Logs().w(
|
||||||
|
// 'Adding aggregated event ${event.type} ${event.eventId} to $relationshipEventId ($relationshipType)');
|
||||||
final e = (aggregatedEvents[relationshipEventId] ??=
|
final e = (aggregatedEvents[relationshipEventId] ??=
|
||||||
<String, Set<Event>>{})[relationshipType] ??= <Event>{};
|
<String, Set<Event>>{})[relationshipType] ??= <Event>{};
|
||||||
_removeEventFromSet(e, event);
|
_removeEventFromSet(e, event);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue