Refactor content handling in message controller

This commit is contained in:
Henry Hiles 2026-04-05 16:30:40 -04:00
commit 7fc314036e
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs

View file

@ -1,4 +1,5 @@
import "package:collection/collection.dart"; import "package:collection/collection.dart";
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter_chat_core/flutter_chat_core.dart"; import "package:flutter_chat_core/flutter_chat_core.dart";
import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/controllers/client_state_controller.dart"; import "package:nexus/controllers/client_state_controller.dart";
@ -16,7 +17,6 @@ class MessageController extends AsyncNotifier<Message?> {
return null; return null;
} }
if (!ref.mounted) return null;
final event = config.event.lastEditRowId == null final event = config.event.lastEditRowId == null
? config.event ? config.event
: config.room.events.firstWhereOrNull( : config.room.events.firstWhereOrNull(
@ -24,11 +24,11 @@ class MessageController extends AsyncNotifier<Message?> {
) ?? ) ??
config.event; config.event;
if (!ref.mounted) return null; final decrypted = (event.decrypted ?? event.content);
final content = (event.decrypted ?? event.content);
final type = (config.event.decryptedType ?? config.event.type); final type = (config.event.decryptedType ?? config.event.type);
final newContent = content["m.new_content"] as Map?; final content = decrypted["m.new_content"] == null
? decrypted
: IMap(decrypted["m.new_content"]);
final homeserver = ref final homeserver = ref
.read(ClientStateController.provider) .read(ClientStateController.provider)
@ -39,24 +39,19 @@ class MessageController extends AsyncNotifier<Message?> {
final metadata = { final metadata = {
"body": config.event.redactedBy == null "body": config.event.redactedBy == null
? (newContent?["body"] ?? content["body"] ?? "") ? (content["body"] ?? "")
: "Deleted Message", : "Deleted Message",
"flashing": false, "flashing": false,
"timelineId": event.timelineRowId, "timelineId": event.timelineRowId,
"big": event.localContent?.bigEmoji == true, "big": event.localContent?.bigEmoji == true,
"eventType": type, "eventType": type,
"pmp": event.content["com.beeper.per_message_profile"], "pmp": content["com.beeper.per_message_profile"],
"error": event.sendError, "error": event.sendError,
"format": content["format"], "format": content["format"] ?? content["format"],
"editSource": "editSource": event.localContent?.editSource ?? content["body"],
event.localContent?.editSource ??
newContent?["body"] ??
content["body"],
"txnId": config.event.transactionId, "txnId": config.event.transactionId,
}; };
if (!ref.mounted) return null;
final editedAt = event.relationType == "m.replace" final editedAt = event.relationType == "m.replace"
? event.timestamp ? event.timestamp
: null; : null;
@ -67,12 +62,6 @@ class MessageController extends AsyncNotifier<Message?> {
return null; return null;
} }
// TODO: Use server-generated preview if enabled
// final match = Uri.tryParse(
// RegExp(regexLink, caseSensitive: false).firstMatch(body)?.group(0) ?? "",
// );
final replyId = final replyId =
config.event.content["m.relates_to"]?["m.in_reply_to"]?["event_id"]; config.event.content["m.relates_to"]?["m.in_reply_to"]?["event_id"];
@ -81,12 +70,7 @@ class MessageController extends AsyncNotifier<Message?> {
metadata: metadata, metadata: metadata,
id: config.event.eventId, id: config.event.eventId,
authorId: event.authorId, authorId: event.authorId,
text: text: content["formatted_body"] ?? content["body"] ?? "",
newContent?["formatted_body"] ??
newContent?["body"] ??
content["formatted_body"] ??
content["body"] ??
"",
replyToMessageId: replyId, replyToMessageId: replyId,
deliveredAt: config.event.timestamp, deliveredAt: config.event.timestamp,
editedAt: editedAt, editedAt: editedAt,