From 6e0973b8e71eefb52668562ddda9df570317faeb Mon Sep 17 00:00:00 2001 From: Xare123 <57245242+Xare123@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:43:54 -0700 Subject: [PATCH] Include the originator when assembling a reply thread threads() returned the originator only when addMessages had already registered it, which happens only if a reply reached the thread map first. A thread whose originator loaded before its replies rendered without the message being replied to. getThreadOriginator already registers it on demand, so call it before filtering. Also parse threadOriginatorPart properly. int.parse(part[0]) read a single character, so '12:0:0' resolved to 1 and matched the reply against the wrong part. A non-numeric leading character also threw from a plain int getter. Split on ':' and fall back to 0. --- lib/database/global/chat_messages.dart | 21 +++++++++++++-------- lib/database/html/message.dart | 2 +- lib/database/io/message.dart | 2 +- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/lib/database/global/chat_messages.dart b/lib/database/global/chat_messages.dart index 5663304ac4..5f5b6fd70f 100644 --- a/lib/database/global/chat_messages.dart +++ b/lib/database/global/chat_messages.dart @@ -12,14 +12,19 @@ class ChatMessages { List get messages => _messages.values.toList(); List get reactions => _reactions.values.toList(); List get attachments => _attachments.values.toList(); - List threads(String originatorGuid, int originatorPart, {bool returnOriginator = true}) => - _threads[originatorGuid] - ?.values - .where((e) => - (e.normalizedThreadPart == originatorPart && e.guid != originatorGuid) || - (returnOriginator ? e.guid == originatorGuid : false)) - .toList() ?? - []; + List threads(String originatorGuid, int originatorPart, {bool returnOriginator = true}) { + // addMessages only registers the originator when a reply is already in the + // thread map, so a thread whose originator loaded before its replies would + // omit it here. getThreadOriginator registers it on demand. + if (returnOriginator) getThreadOriginator(originatorGuid); + return _threads[originatorGuid] + ?.values + .where((e) => + (e.normalizedThreadPart == originatorPart && e.guid != originatorGuid) || + (returnOriginator && e.guid == originatorGuid)) + .toList() ?? + []; + } void addMessages(List __messages) { for (Message m in __messages) { diff --git a/lib/database/html/message.dart b/lib/database/html/message.dart index 3c6b4b4cf2..a52b02abad 100644 --- a/lib/database/html/message.dart +++ b/lib/database/html/message.dart @@ -447,7 +447,7 @@ class Message { return isFromMe != newerMessage.isFromMe; } - int get normalizedThreadPart => threadOriginatorPart == null ? 0 : int.parse(threadOriginatorPart![0]); + int get normalizedThreadPart => int.tryParse(threadOriginatorPart?.split(':').first ?? '') ?? 0; bool connectToUpper() => threadOriginatorGuid != null; diff --git a/lib/database/io/message.dart b/lib/database/io/message.dart index eceb9f1722..9aa849abf4 100644 --- a/lib/database/io/message.dart +++ b/lib/database/io/message.dart @@ -1243,7 +1243,7 @@ class Message { return "$part:${run.range[0]}:${run.range[1]}"; } - int get normalizedThreadPart => threadOriginatorPart == null ? 0 : int.parse(threadOriginatorPart![0]); + int get normalizedThreadPart => int.tryParse(threadOriginatorPart?.split(':').first ?? '') ?? 0; bool connectToUpper() => threadOriginatorGuid != null;