diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index eab917f4d..8768ed4ff 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -71,28 +71,36 @@ class Choreographer { List prevMessages() { const int howFarBack = 5; - final List events = chatController.timeline?.events ?? []; + final List events = chatController.timeline?.events + .where( + (e) => + e.messageType == MessageTypes.Text || + e.messageType == MessageTypes.Audio, + ) + .toList() ?? + []; + // Sort from most recent to least + events.sort( + (a, b) => b.originServerTs.compareTo(a.originServerTs), + ); final List messages = []; for (final Event event in events) { - if (event.messageType == MessageTypes.Text || - event.messageType == MessageTypes.Audio) { - final Map? content = - (event.messageType == MessageTypes.Text) - ? event.content - : (event as PangeaMessageEvent) - .getSpeechToTextLocalOnly(l1LangCode, l2LangCode) - ?.toJson(); - if (content != null) { - messages.add( - PreviousMessage( - event.content, - event.senderId, - event.originServerTs, - ), - ); - if (messages.length >= howFarBack) { - return messages; - } + final Map? content = + (event.messageType == MessageTypes.Text) + ? event.content + : (event as PangeaMessageEvent) + .getSpeechToTextLocalOnly(l1LangCode, l2LangCode) + ?.toJson(); + if (content != null) { + messages.add( + PreviousMessage( + event.content, + event.senderId, + event.originServerTs, + ), + ); + if (messages.length >= howFarBack) { + return messages; } } } diff --git a/lib/pangea/constants/model_keys.dart b/lib/pangea/constants/model_keys.dart index d252a3c7c..195e919b4 100644 --- a/lib/pangea/constants/model_keys.dart +++ b/lib/pangea/constants/model_keys.dart @@ -70,6 +70,9 @@ class ModelKey { static const String enableIGC = "enable_igc"; static const String enableIT = "enable_it"; static const String prevMessages = "prev_messages"; + static const String prevContent = "prev_content"; + static const String prevSender = "prev_sender"; + static const String prevTimestamp = "prev_timestamp"; static const String originalSent = "original_sent"; static const String originalWritten = "original_written"; diff --git a/lib/pangea/repo/igc_repo.dart b/lib/pangea/repo/igc_repo.dart index 552895068..50dba9c2a 100644 --- a/lib/pangea/repo/igc_repo.dart +++ b/lib/pangea/repo/igc_repo.dart @@ -95,18 +95,33 @@ class IgcRepo { } } -/// Previous text/audio messages sent in chat +/// Previous text/audio message sent in chat /// Contain message content, sender, and timestamp class PreviousMessage { Map content; String sender; DateTime timestamp; - PreviousMessage( - this.content, - this.sender, - this.timestamp, - ); + PreviousMessage({ + required this.content, + required this.sender, + required this.timestamp, + }); + + factory PreviousMessage.fromJson(Map json) => + PreviousMessage( + content: jsonDecode(json[ModelKey.prevContent]) ?? {}, + sender: json[ModelKey.prevSender] ?? "", + timestamp: json[ModelKey.prevTimestamp] == null + ? DateTime.now() + : DateTime.parse(json[ModelKey.prevTimestamp]), + ); + + Map toJson() => { + ModelKey.prevContent: jsonEncode(content), + ModelKey.prevSender: sender, + ModelKey.prevTimestamp: timestamp.toIso8601String(), + }; } class IGCRequestBody { @@ -132,6 +147,7 @@ class IGCRequestBody { ModelKey.userL2: userL2, "enable_it": enableIT, "enable_igc": enableIGC, - "prev_messages": prevMessages, + ModelKey.prevMessages: + jsonEncode(prevMessages.map((x) => x.toJson()).toList()), }; }