on main help sign in
fix: make sure to make rendered string concurrency sage
commitcf72cb88b53588d77725e3af4e49524479b885b2 authorKujtim Hoxha <kujtimii.h@gmail.com> dateSun 3 Aug 2025, 22:57 (1 year ago) parentdbb998c
1 file changed+9−2
internal/tui/exp/list/list.go+9−2
internal/tui/exp/list/list.go+9−2
@@ -3,6 +3,7 @@ package list
33import (
44 "slices"
55 "strings"
6+ "sync"
67
78 "github.com/charmbracelet/bubbles/v2/key"
89 tea "github.com/charmbracelet/bubbletea/v2"
@@ -90,6 +91,7 @@ type list[T Item] struct {
9091
9192 renderedItems *csync.Map[string, renderedItem]
9293
94+ renderMu sync.Mutex
9395 rendered string
9496
9597 movingByItem bool
@@ -328,7 +330,9 @@ func (l *list[T]) render() tea.Cmd {
328330 // we are not rendering the first time
329331 if l.rendered != "" {
330332 // rerender everything will mostly hit cache
333+ l.renderMu.Lock()
331334 l.rendered, _ = l.renderIterator(0, false, "")
335+ l.renderMu.Unlock()
332336 if l.direction == DirectionBackward {
333337 l.recalculateItemPositions()
334338 }
@@ -338,9 +342,10 @@ func (l *list[T]) render() tea.Cmd {
338342 }
339343 return focusChangeCmd
340344 }
345+ l.renderMu.Lock()
341346 rendered, finishIndex := l.renderIterator(0, true, "")
342347 l.rendered = rendered
343−
348+ l.renderMu.Unlock()
344349 // recalculate for the initial items
345350 if l.direction == DirectionBackward {
346351 l.recalculateItemPositions()
@@ -348,7 +353,10 @@ func (l *list[T]) render() tea.Cmd {
348353 renderCmd := func() tea.Msg {
349354 l.offset = 0
350355 // render the rest
356+
357+ l.renderMu.Lock()
351358 l.rendered, _ = l.renderIterator(finishIndex, false, l.rendered)
359+ l.renderMu.Unlock()
352360 // needed for backwards
353361 if l.direction == DirectionBackward {
354362 l.recalculateItemPositions()
@@ -357,7 +365,6 @@ func (l *list[T]) render() tea.Cmd {
357365 if l.focused {
358366 l.scrollToSelection()
359367 }
360−
361368 return nil
362369 }
363370 return tea.Batch(focusChangeCmd, renderCmd)