reply rendering

This commit is contained in:
Henry Hiles 2025-11-12 11:33:17 -05:00
commit 2a4525a78f
No known key found for this signature in database
6 changed files with 226 additions and 109 deletions

View file

@ -1,4 +1,5 @@
import "package:flutter/widgets.dart";
import "package:flutter_chat_core/flutter_chat_core.dart";
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:matrix/matrix.dart";
import "package:nexus/models/full_room.dart";
@ -37,3 +38,84 @@ extension GetImage on Uri {
);
}
}
extension ToMessage on Event {
Future<Message?> toMessage({bool mustBeText = false}) async {
final replyId = relationshipType == RelationshipTypes.reply
? relationshipEventId
: null;
final metadata = {
"eventType": type,
"displayName": senderFromMemoryOrFallback.displayName,
"txnId": transactionId,
};
if (redacted) {
return Message.text(
metadata: metadata,
id: eventId,
authorId: senderId,
text: "~~This message has been redacted.~~",
deletedAt: redactedBecause?.originServerTs,
);
}
final asText = Message.text(
metadata: metadata,
id: eventId,
authorId: senderId,
text: body,
replyToMessageId: replyId,
deliveredAt: originServerTs,
);
if (mustBeText) return asText;
return switch (type) {
EventTypes.Message => switch (messageType) {
MessageTypes.Image => Message.image(
metadata: metadata,
id: eventId,
authorId: senderId,
source: (await getAttachmentUri()).toString(),
replyToMessageId: replyId,
deliveredAt: originServerTs,
),
MessageTypes.Audio => Message.audio(
metadata: metadata,
id: eventId,
authorId: senderId,
text: body,
replyToMessageId: replyId,
source: (await getAttachmentUri()).toString(),
deliveredAt: originServerTs,
duration: Duration(hours: 1),
),
MessageTypes.File => Message.file(
name: content["filename"].toString(),
metadata: metadata,
id: eventId,
authorId: senderId,
source: (await getAttachmentUri()).toString(),
replyToMessageId: replyId,
deliveredAt: originServerTs,
),
_ => asText,
},
EventTypes.RoomMember => Message.system(
metadata: metadata,
id: eventId,
authorId: senderId,
text:
"${senderFromMemoryOrFallback.calcDisplayname()} joined the room.",
),
EventTypes.Redaction => null,
_ => Message.unsupported(
metadata: metadata,
id: eventId,
authorId: senderId,
replyToMessageId: replyId,
),
};
}
}