|
|
@@ -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)
|