add unsent messages, fix hotkeys so they work with chrome

This commit is contained in:
Christien Rioux 2025-05-17 19:30:45 -04:00
parent 576c8e477a
commit 34f9bea6eb
5 changed files with 149 additions and 138 deletions

View file

@ -23,6 +23,7 @@ import 'chat_builders/chat_builders.dart';
const onEndReachedThreshold = 0.75;
const _kScrollTag = 'kScrollTag';
const kSeqId = 'seqId';
const kSending = 'sending';
const maxMessageLength = 2048;
class ChatComponentWidget extends StatefulWidget {
@ -321,51 +322,55 @@ class _ChatComponentWidgetState extends State<ChatComponentWidget> {
final windowState = data.value;
await _chatController.setMessages(windowState.window.toList());
// await _chatController.setMessages(windowState.window.toList());
// final newMessagesSet = windowState.window.toSet();
// final newMessagesById =
// Map.fromEntries(newMessagesSet.map((m) => MapEntry(m.id, m)));
// final newMessagesBySeqId = Map.fromEntries(
// newMessagesSet.map((m) => MapEntry(m.metadata![kSeqId], m)));
// final oldMessagesSet = _chatController.messages.toSet();
final newMessagesSet = windowState.window.toSet();
final newMessagesById =
Map.fromEntries(newMessagesSet.map((m) => MapEntry(m.id, m)));
final newMessagesBySeqId = Map.fromEntries(
newMessagesSet.map((m) => MapEntry(m.metadata![kSeqId], m)));
final oldMessagesSet = _chatController.messages.toSet();
// if (oldMessagesSet.isEmpty) {
// await _chatController.setMessages(windowState.window.toList());
// return;
// }
if (oldMessagesSet.isEmpty) {
await _chatController.setMessages(windowState.window.toList());
return;
}
// // See how many messages differ by equality (not identity)
// // If there are more than `replaceAllMessagesThreshold` differences
// // just replace the whole list of messages
// final diffs = newMessagesSet.diffAndIntersect(oldMessagesSet,
// diffThisMinusOther: true, diffOtherMinusThis: true);
// final addedMessages = diffs.diffThisMinusOther!;
// final removedMessages = diffs.diffOtherMinusThis!;
// See how many messages differ by equality (not identity)
// If there are more than `replaceAllMessagesThreshold` differences
// just replace the whole list of messages
final diffs = newMessagesSet.diffAndIntersect(oldMessagesSet,
diffThisMinusOther: true, diffOtherMinusThis: true);
final addedMessages = diffs.diffThisMinusOther!;
final removedMessages = diffs.diffOtherMinusThis!;
// final replaceAllPaginationLimit = windowState.windowCount / 3;
final replaceAllPaginationLimit = windowState.windowCount / 3;
// if ((addedMessages.length >= replaceAllPaginationLimit) ||
// removedMessages.length >= replaceAllPaginationLimit) {
// await _chatController.setMessages(windowState.window.toList());
// return;
// }
if ((addedMessages.length >= replaceAllPaginationLimit) ||
removedMessages.length >= replaceAllPaginationLimit) {
await _chatController.setMessages(windowState.window.toList());
return;
}
// // Remove messages that are gone, and replace the ones that have changed
// for (final m in removedMessages) {
// final newm = newMessagesById[m.id];
// if (newm != null) {
// await _chatController.updateMessage(m, newm);
// } else {
// final newm = newMessagesBySeqId[m.metadata![kSeqId]];
// if (newm != null) {
// await _chatController.updateMessage(m, newm);
// addedMessages.remove(newm);
// } else {
// await _chatController.removeMessage(m);
// }
// }
// }
// Remove messages that are gone, and replace the ones that have changed
for (final m in removedMessages) {
final newm = newMessagesById[m.id];
if (newm != null) {
await _chatController.updateMessage(m, newm);
} else {
final newm = newMessagesBySeqId[m.metadata![kSeqId]];
if (newm != null) {
await _chatController.updateMessage(m, newm);
addedMessages.remove(newm);
} else {
await _chatController.removeMessage(m);
}
}
}
if (addedMessages.isNotEmpty) {
await _chatController.setMessages(windowState.window.toList());
}
// // // Check for append
// if (addedMessages.isNotEmpty) {