Просмотр исходного кода

fix(tui): preserve scroll position when reflowing due to message stream (#1716)

Yihui Khuu 6 месяцев назад
Родитель
Сommit
fe26b4a7b1
1 измененных файлов с 11 добавлено и 1 удалено
  1. 11 1
      packages/tui/internal/components/chat/messages.go

+ 11 - 1
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)