Watch
1
0
Fork
You've already forked nexus
0
forked from Nexus/nexus

we got quotes 🔥

This commit is contained in:
Henry Hiles 2025-12-03 12:16:59 -05:00
commit 11c03733cf
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
4 changed files with 159 additions and 124 deletions

View file

@ -0,0 +1,8 @@
import "package:flutter/widgets.dart";
extension ColorHex on Color {
String get hex {
final rgb = toARGB32() & 0x00FFFFFF;
return "#${rgb.toRadixString(16).padLeft(6, "0")}";
}
}

View file

@ -0,0 +1,100 @@
import "package:flutter_chat_core/flutter_chat_core.dart";
import "package:matrix/matrix.dart";
extension EventToMessage on Event {
Future<Message?> toMessage({bool mustBeText = false}) async {
final replyId = relationshipType == RelationshipTypes.reply
? relationshipEventId
: null;
final sender = (await fetchSenderUser()) ?? senderFromMemoryOrFallback;
final newContent = content["m.new_content"] as Map<String, Object?>?;
final metadata = {
"formatted":
newContent?["formatted_body"] ??
newContent?["body"] ??
content["formatted_body"] ??
this.body,
"eventType": type,
"displayName": sender.displayName ?? sender.id,
"txnId": transactionId,
};
final editedAt = relationshipType == RelationshipTypes.edit
? originServerTs
: null;
final body = newContent?["body"] as String? ?? this.body;
final eventId = editedAt == null
? this.eventId
: relationshipEventId ?? this.eventId;
if (redacted) return null;
final asText =
Message.text(
metadata: metadata,
id: eventId,
authorId: senderId,
text: body,
replyToMessageId: replyId,
deliveredAt: originServerTs,
editedAt: editedAt,
)
as TextMessage;
if (mustBeText) return asText;
return switch (type) {
EventTypes.Encrypted => asText.copyWith(
text: "Unable to decrypt message.",
metadata: {"formatted": "Unable to decrypt message.", ...metadata},
),
EventTypes.Message => switch (messageType) {
MessageTypes.Image => Message.image(
metadata: metadata,
id: eventId,
authorId: senderId,
text: text,
source: (await getAttachmentUri()).toString(),
replyToMessageId: replyId,
deliveredAt: originServerTs,
),
MessageTypes.Audio => Message.audio(
metadata: metadata,
id: eventId,
authorId: senderId,
text: text,
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,
EventTypes.Reaction => null,
_ => Message.unsupported(
metadata: metadata,
id: eventId,
authorId: senderId,
replyToMessageId: replyId,
),
};
}
}

View file

@ -0,0 +1,15 @@
import "package:flutter_chat_core/flutter_chat_core.dart";
import "package:matrix/matrix.dart";
import "package:nexus/helpers/extensions/event_to_message.dart";
extension ListToMessages on List<MatrixEvent> {
Future<List<Message>> toMessages(Room room) async {
final messages = await Future.wait(
map((event) => Event.fromMatrixEvent(event, room).toMessage()),
);
return {
for (var msg in messages.nonNulls.toList().reversed.toList()) msg.id: msg,
}.values.toList();
}
}

View file

@ -0,0 +1,14 @@
import "package:flutter/material.dart";
extension SchemeToTheme on ColorScheme {
ThemeData get theme => ThemeData.from(colorScheme: this).copyWith(
cardTheme: CardThemeData(color: primaryContainer),
appBarTheme: AppBarTheme(
titleSpacing: 0,
backgroundColor: surfaceContainerLow,
),
inputDecorationTheme: const InputDecorationTheme(
border: OutlineInputBorder(),
),
);
}