From 904134789e71d2e260fd1ae2acd7a08a3dd8a605 Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Sun, 8 Jun 2025 11:14:15 +0300 Subject: [PATCH] Optimized `OnNewMessageReceived` by only calling it when there is a single message --- internal/client/ui/core/chat/chat.go | 26 ++++++++++++++------------ internal/client/ui/core/core.go | 4 +++- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/internal/client/ui/core/chat/chat.go b/internal/client/ui/core/chat/chat.go index afc2c6a..89a066b 100644 --- a/internal/client/ui/core/chat/chat.go +++ b/internal/client/ui/core/chat/chat.go @@ -1623,7 +1623,9 @@ func (m *Model) NewMsgSep(height, remainingHeight int) string { return newMsgStyle.Render(line + NewText) } -func (m *Model) OnNewMessagesReceived(info *packet.MessagesInfo) { +func (m *Model) OnNewMessageReceived(info *packet.MessagesInfo) { + assert.Assert(len(info.Messages) == 1, "expected only a single message", "len", len(info.Messages)) + var chatId *snowflake.ID = nil if m.receiverIndex != -1 { chatId = &state.Data.Signals[m.receiverIndex] @@ -1638,18 +1640,18 @@ func (m *Model) OnNewMessagesReceived(info *packet.MessagesInfo) { return } - for _, msg := range info.Messages { - if msg.SenderID == *state.UserID { - m.outdatedLastReadMsg = &msg.ID - return - } + msg := info.Messages[0] - if m.base == SnapToBottom { - lastMsg := state.GetLastMessage(*chatId) - if lastMsg != nil && m.outdatedLastReadMsg != nil && - *lastMsg == *m.outdatedLastReadMsg { - m.outdatedLastReadMsg = &msg.ID - } + if msg.SenderID == *state.UserID { + m.outdatedLastReadMsg = &msg.ID + return + } + + if m.base == SnapToBottom { + lastMsg := state.GetLastMessage(*chatId) + if lastMsg != nil && m.outdatedLastReadMsg != nil && + *lastMsg == *m.outdatedLastReadMsg { + m.outdatedLastReadMsg = &msg.ID } } } diff --git a/internal/client/ui/core/core.go b/internal/client/ui/core/core.go index 79c8c4f..34a75f5 100644 --- a/internal/client/ui/core/core.go +++ b/internal/client/ui/core/core.go @@ -328,7 +328,9 @@ func (m *Model) updateConnected(message tea.Msg) tea.Cmd { } case *packet.MessagesInfo: - m.chat.OnNewMessagesReceived(msg) // MUST BE BEFORE STATE UPDATE + if len(msg.Messages) == 1 { + m.chat.OnNewMessageReceived(msg) // MUST BE BEFORE STATE UPDATE + } state.UpdateMessages(msg) case *packet.TrustInfo: