add edits

This commit is contained in:
Henry Hiles 2025-11-23 16:56:42 -05:00
commit 6523420120
No known key found for this signature in database
3 changed files with 47 additions and 15 deletions

View file

@ -19,17 +19,28 @@ class RoomChatController extends AsyncNotifier<ChatController> {
if (event.roomId != room.id) return; if (event.roomId != room.id) return;
final message = await event.toMessage(); final message = await event.toMessage();
if (message != null) { if (message != null) {
if (event.relationshipType == RelationshipTypes.edit) {
final controller = await future;
final oldMessage = controller.messages.firstWhereOrNull(
(element) => element.id == event.relationshipEventId,
);
if (oldMessage == null) return;
await updateMessage(oldMessage, message);
} else {
await insertMessage(message); await insertMessage(message);
} }
}
}).cancel, }).cancel,
); );
return InMemoryChatController( return InMemoryChatController(
messages: (await Future.wait( messages: {
for (var msg in (await Future.wait(
response.chunk.map( response.chunk.map(
(event) => Event.fromMatrixEvent(event, room).toMessage(), (event) => Event.fromMatrixEvent(event, room).toMessage(),
), ),
)).nonNulls.toList().reversed.toList(), )).nonNulls.toList().reversed.toList())
msg.id: msg,
}.values.toList(),
); );
} }

View file

@ -40,13 +40,24 @@ extension ToMessage on Event {
? relationshipEventId ? relationshipEventId
: null; : null;
final sender = (await fetchSenderUser()) ?? senderFromMemoryOrFallback; final sender = (await fetchSenderUser()) ?? senderFromMemoryOrFallback;
final newContent = content["m.new_content"] as Map<String, Object?>?;
final metadata = { final metadata = {
"formatted": formattedText.isEmpty ? body : formattedText, "formatted":
newContent?["formatted_body"] ??
newContent?["body"] ??
(formattedText.isEmpty ? this.body : formattedText),
"eventType": type, "eventType": type,
"displayName": sender.displayName ?? sender.id, "displayName": sender.displayName ?? sender.id,
"txnId": transactionId, "txnId": transactionId,
}; };
final editedAt = relationshipType == RelationshipTypes.edit
? originServerTs
: null;
final body = newContent?["body"] as String? ?? this.body;
final eventId = relationshipEventId ?? this.eventId;
if (redacted) return null; if (redacted) return null;
final asText = final asText =
@ -57,6 +68,7 @@ extension ToMessage on Event {
text: body, text: body,
replyToMessageId: replyId, replyToMessageId: replyId,
deliveredAt: originServerTs, deliveredAt: originServerTs,
editedAt: editedAt,
) )
as TextMessage; as TextMessage;

View file

@ -142,7 +142,10 @@ class RoomChat extends HookConsumerWidget {
), ),
(m) => (m) =>
"<a href=\"${m.group(0)!}\">${m.group(0)!}</a>", "<a href=\"${m.group(0)!}\">${m.group(0)!}</a>",
), ) +
((message.editedAt != null)
? "<sub edited>(edited)</sub>"
: ""),
customWidgetBuilder: (element) { customWidgetBuilder: (element) {
if (element.localName == "mx-reply") { if (element.localName == "mx-reply") {
return SizedBox.shrink(); return SizedBox.shrink();
@ -193,11 +196,17 @@ class RoomChat extends HookConsumerWidget {
"color", "color",
value, value,
), ),
"data-mx-bg-color" => "data-mx-bg-color" =>
MapEntry( MapEntry(
"background-color", "background-color",
value, value,
), ),
"edited" => MapEntry(
"display",
"block",
),
_ => null, _ => null,
}, },
) )