summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYihui Khuu <[email protected]>2025-08-09 04:14:09 +1000
committerGitHub <[email protected]>2025-08-08 13:14:09 -0500
commitfe26b4a7b11a0443c3dab0cb97f8f9b10746b485 (patch)
tree76ff7a2fac07976709b64c0fac8bc84f291175bb
parent8c173e18b7e0e52fe8345a7a1112ea617d83118f (diff)
downloadopencode-fe26b4a7b11a0443c3dab0cb97f8f9b10746b485.tar.gz
opencode-fe26b4a7b11a0443c3dab0cb97f8f9b10746b485.zip
fix(tui): preserve scroll position when reflowing due to message stream (#1716)
-rw-r--r--packages/tui/internal/components/chat/messages.go12
1 files changed, 11 insertions, 1 deletions
diff --git a/packages/tui/internal/components/chat/messages.go b/packages/tui/internal/components/chat/messages.go
index 46036b75f..22cb97fb5 100644
--- a/packages/tui/internal/components/chat/messages.go
+++ b/packages/tui/internal/components/chat/messages.go
@@ -210,7 +210,18 @@ func (m *messagesComponent) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.clipboard = msg.clipboard
m.loading = false
m.tail = m.viewport.AtBottom()
+
+ // Preserve scroll across reflow
+ // if the user was at bottom, keep following; otherwise restore the previous offset.
+ wasAtBottom := m.viewport.AtBottom()
+ prevYOffset := m.viewport.YOffset
m.viewport = msg.viewport
+ if wasAtBottom {
+ m.viewport.GotoBottom()
+ } else {
+ m.viewport.YOffset = prevYOffset
+ }
+
m.header = msg.header
if m.dirty {
cmds = append(cmds, m.renderView())
@@ -218,7 +229,6 @@ func (m *messagesComponent) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}
m.tail = m.viewport.AtBottom()
-
viewport, cmd := m.viewport.Update(msg)
m.viewport = viewport
cmds = append(cmds, cmd)