From bcac58c7cfea2cbf5285c90783112ef09f44ef61 Mon Sep 17 00:00:00 2001 From: ayn2op Date: Thu, 21 May 2026 20:35:37 -0400 Subject: [PATCH] refactor(chat): extract pure cursorAfterDelete helper --- internal/ui/chat/state.go | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/internal/ui/chat/state.go b/internal/ui/chat/state.go index dbb9e77..d9ca816 100644 --- a/internal/ui/chat/state.go +++ b/internal/ui/chat/state.go @@ -148,24 +148,26 @@ func (m *Model) onMessageDelete(message *gateway.MessageDeleteEvent) { m.messagesList.deleteMessage(deletedIndex) - // Keep the cursor on the same logical item after removal. - newCursor := prevCursor - switch { - case prevCursor > deletedIndex: - // The list shrank before the cursor, so shift back. - newCursor = prevCursor - 1 - case prevCursor == deletedIndex: - // Prefer the previous item; fall forward if we deleted the first. - newCursor = deletedIndex - 1 - if newCursor < 0 { - newCursor = min(deletedIndex, len(m.messagesList.messages)-1) - } - } + newCursor := cursorAfterDelete(prevCursor, deletedIndex, len(m.messagesList.messages)) if newCursor != prevCursor { m.messagesList.SetCursor(newCursor) } } +func cursorAfterDelete(prevCursor, deletedIndex, remaining int) int { + switch { + case prevCursor > deletedIndex: + return prevCursor - 1 + case prevCursor == deletedIndex: + if prev := deletedIndex - 1; prev >= 0 { + return prev + } + return min(deletedIndex, remaining-1) + default: + return prevCursor + } +} + func (m *Model) onGuildMembersChunk(event *gateway.GuildMembersChunkEvent) { m.messagesList.setFetchingChunk(false, uint(len(event.Members))) }