edits and reactions in threads

This commit is contained in:
OfficialDakari 2025-11-02 14:11:11 +05:00
parent 09643a172f
commit 92e69b5f1e
4 changed files with 34 additions and 10 deletions

View File

@ -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].

View File

@ -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);

View File

@ -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,

View File

@ -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] ??=
<String, Set<Event>>{})[relationshipType] ??= <Event>{};
_removeEventFromSet(e, event);