mirror of
https://gitlab.com/veilid/veilidchat.git
synced 2025-07-24 15:05:22 -04:00
add unsent messages, fix hotkeys so they work with chrome
This commit is contained in:
parent
576c8e477a
commit
34f9bea6eb
5 changed files with 149 additions and 138 deletions
|
@ -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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue