diff --git a/lib/src/room.dart b/lib/src/room.dart index 040beb65..1ae4c40f 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -175,8 +175,8 @@ class Room { // This should be called from the client's sync handling // when a thread-related event is received - if (event.relationshipType == RelationshipTypes.thread && - event.relationshipEventId != null) { + // if (event.relationshipType == RelationshipTypes.thread && + // event.relationshipEventId != null) { // Update thread metadata in database final root = await getEventById(event.relationshipEventId!); if (root == null) return; @@ -191,7 +191,7 @@ class Room { client, ); threads[event.relationshipEventId!] = (await client.database.getThread(id, event.relationshipEventId!, client))!; - } + //} } /// Returns the [Event] for the given [typeKey] and optional [stateKey]. diff --git a/lib/src/room_timeline.dart b/lib/src/room_timeline.dart index 5afd5015..b0306a87 100644 --- a/lib/src/room_timeline.dart +++ b/lib/src/room_timeline.dart @@ -491,6 +491,15 @@ class RoomTimeline extends Timeline { 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 if (event.type == EventTypes.Redaction) { final index = _findEvent(event_id: event.redacts); diff --git a/lib/src/thread.dart b/lib/src/thread.dart index 726a48c9..8552392d 100644 --- a/lib/src/thread.dart +++ b/lib/src/thread.dart @@ -105,6 +105,7 @@ class Thread { room.id, rootEvent.eventId, 'm.thread', + recurse: true, ) .timeout(timeout); final matrixEvent = result.chunk.firstOrNull; @@ -172,14 +173,17 @@ class Thread { final resp = await client.getEventContext( room.id, eventId, limit: Room.defaultHistoryCount, + // filter: jsonEncode(StateFilter(lazyLoadMembers: true).toJson()), ); + + final events = [ if (resp.eventsAfter != null) ...resp.eventsAfter!.reversed, if (resp.event != null) resp.event!, 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. if (room.encrypted && client.encryptionEnabled) { @@ -403,10 +407,9 @@ class Thread { throw 'Tried to request history without a prev_batch token'; } - final resp = await client.getRelatingEventsWithRelType( + final resp = await client.getRelatingEvents( room.id, rootEvent.eventId, - RelationshipTypes.thread, from: prev_batch, limit: historyCount, dir: direction, diff --git a/lib/src/thread_timeline.dart b/lib/src/thread_timeline.dart index 7772c3d3..7a73c1fc 100644 --- a/lib/src/thread_timeline.dart +++ b/lib/src/thread_timeline.dart @@ -73,11 +73,15 @@ class ThreadTimeline extends Timeline { try { if (event.roomId != thread.room.id) return; // Ignore events outside of this thread - if (event.relationshipType != RelationshipTypes.thread || + if (event.relationshipType == RelationshipTypes.thread && event.relationshipEventId != thread.rootEvent.eventId) { return; } + if (event.relationshipType == null) { + return; + } + if (type != EventUpdateType.timeline && type != EventUpdateType.history) { return; } @@ -160,10 +164,9 @@ class ThreadTimeline extends Timeline { filter ??= StateFilter(lazyLoadMembers: true); filter.lazyLoadMembers ??= true; - final resp = await thread.client.getRelatingEventsWithRelType( + final resp = await thread.client.getRelatingEvents( thread.room.id, thread.rootEvent.eventId, - RelationshipTypes.thread, dir: direction, from: direction == Direction.b ? chunk.prevBatch : chunk.nextBatch, limit: historyCount, @@ -255,6 +258,11 @@ class ThreadTimeline extends Timeline { if (onUpdate != null) { onUpdate!(); } + + for (final e in events) { + addAggregatedEvent(e); + } + return resp.chunk.length; } @@ -337,9 +345,13 @@ class ThreadTimeline extends Timeline { void addAggregatedEvent(Event event) { final relationshipType = event.relationshipType; final relationshipEventId = event.relationshipEventId; - if (relationshipType == null || relationshipEventId == null) { + if (relationshipType == null || + relationshipType == RelationshipTypes.thread || + relationshipEventId == null) { return; } + // Logs().w( + // 'Adding aggregated event ${event.type} ${event.eventId} to $relationshipEventId ($relationshipType)'); final e = (aggregatedEvents[relationshipEventId] ??= >{})[relationshipType] ??= {}; _removeEventFromSet(e, event);