fix(ui): dialogs: loop around and scroll list when navigating with up/down keys

Ayman Bagabas created

Change summary

internal/ui/dialog/commands.go | 10 ++++------
internal/ui/dialog/models.go   | 10 ++++------
internal/ui/dialog/sessions.go | 10 ++++------
3 files changed, 12 insertions(+), 18 deletions(-)

Detailed changes

internal/ui/dialog/commands.go 🔗

@@ -153,19 +153,17 @@ func (c *Commands) HandleMsg(msg tea.Msg) Action {
 			c.list.Focus()
 			if c.list.IsSelectedFirst() {
 				c.list.SelectLast()
-				c.list.ScrollToBottom()
-				break
+			} else {
+				c.list.SelectPrev()
 			}
-			c.list.SelectPrev()
 			c.list.ScrollToSelected()
 		case key.Matches(msg, c.keyMap.Next):
 			c.list.Focus()
 			if c.list.IsSelectedLast() {
 				c.list.SelectFirst()
-				c.list.ScrollToTop()
-				break
+			} else {
+				c.list.SelectNext()
 			}
-			c.list.SelectNext()
 			c.list.ScrollToSelected()
 		case key.Matches(msg, c.keyMap.Select):
 			if selectedItem := c.list.SelectedItem(); selectedItem != nil {

internal/ui/dialog/models.go 🔗

@@ -174,19 +174,17 @@ func (m *Models) HandleMsg(msg tea.Msg) Action {
 			m.list.Focus()
 			if m.list.IsSelectedFirst() {
 				m.list.SelectLast()
-				m.list.ScrollToBottom()
-				break
+			} else {
+				m.list.SelectPrev()
 			}
-			m.list.SelectPrev()
 			m.list.ScrollToSelected()
 		case key.Matches(msg, m.keyMap.Next):
 			m.list.Focus()
 			if m.list.IsSelectedLast() {
 				m.list.SelectFirst()
-				m.list.ScrollToTop()
-				break
+			} else {
+				m.list.SelectNext()
 			}
-			m.list.SelectNext()
 			m.list.ScrollToSelected()
 		case key.Matches(msg, m.keyMap.Select, m.keyMap.Edit):
 			selectedItem := m.list.SelectedItem()

internal/ui/dialog/sessions.go 🔗

@@ -190,19 +190,17 @@ func (s *Session) HandleMsg(msg tea.Msg) Action {
 				s.list.Focus()
 				if s.list.IsSelectedFirst() {
 					s.list.SelectLast()
-					s.list.ScrollToBottom()
-					break
+				} else {
+					s.list.SelectPrev()
 				}
-				s.list.SelectPrev()
 				s.list.ScrollToSelected()
 			case key.Matches(msg, s.keyMap.Next):
 				s.list.Focus()
 				if s.list.IsSelectedLast() {
 					s.list.SelectFirst()
-					s.list.ScrollToTop()
-					break
+				} else {
+					s.list.SelectNext()
 				}
-				s.list.SelectNext()
 				s.list.ScrollToSelected()
 			case key.Matches(msg, s.keyMap.Select):
 				if item := s.list.SelectedItem(); item != nil {