Skip to content

Commit c498986

Browse files
fix: validate cursor after refresh to prevent panic
1 parent 45a8cf4 commit c498986

File tree

2 files changed

+61
-8
lines changed

2 files changed

+61
-8
lines changed

internal/tui/update/update.go

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,7 @@ func Update(m model.Model, msg tea.Msg) (model.Model, tea.Cmd) {
579579
if m.CurrentView == model.FileView {
580580
switch msg.String() {
581581
case " ":
582-
if len(m.Files) > 0 {
582+
if len(m.Files) > 0 && m.Cursor < len(m.Files) {
583583
f := &m.Files[m.Cursor]
584584
f.Staged = !f.Staged
585585
if f.Staged {
@@ -590,16 +590,29 @@ func Update(m model.Model, msg tea.Msg) (model.Model, tea.Cmd) {
590590
m.Message = fmt.Sprintf("✓ File %s removed from stage", f.Name)
591591
}
592592
m.MessageType = "success"
593+
} else {
594+
// Resetear cursor y mostrar mensaje apropiado
595+
if len(m.Files) > 0 {
596+
m.Cursor = 0
597+
} else {
598+
m.Message = "⚠ No files to stage"
599+
m.MessageType = "warning"
600+
}
593601
}
594602
case "a":
595-
for i := range m.Files {
596-
if !m.Files[i].Staged {
597-
m.Files[i].Staged = true
598-
git.Add(m.Files[i].Name)
603+
if len(m.Files) > 0 {
604+
for i := range m.Files {
605+
if !m.Files[i].Staged {
606+
m.Files[i].Staged = true
607+
git.Add(m.Files[i].Name)
608+
}
599609
}
610+
m.Message = "✓ All files added to stage"
611+
m.MessageType = "success"
612+
} else {
613+
m.Message = "⚠ No files to stage"
614+
m.MessageType = "warning"
600615
}
601-
m.Message = "✓ All files added to stage"
602-
m.MessageType = "success"
603616
case "c":
604617
ok := false
605618
for _, f := range m.Files {
@@ -625,6 +638,7 @@ func Update(m model.Model, msg tea.Msg) (model.Model, tea.Cmd) {
625638
m.Message = ""
626639
case "r":
627640
m.RefreshData()
641+
utils.ValidateCursor(&m)
628642
m.Message = "✓ Status updated"
629643
m.MessageType = "success"
630644
case "p":
@@ -657,10 +671,13 @@ func Update(m model.Model, msg tea.Msg) (model.Model, tea.Cmd) {
657671
m.MessageType = "info"
658672
return m, nil
659673
case "x":
660-
if len(m.Files) > 0 {
674+
if len(m.Files) > 0 && m.Cursor < len(m.Files) {
661675
m.DialogType = "discard_changes"
662676
m.DialogTarget = m.Files[m.Cursor].Name
663677
m.CurrentView = model.ConfirmDialog
678+
} else {
679+
m.Message = "⚠ No file selected or no files available"
680+
m.MessageType = "warning"
664681
}
665682
case "?":
666683
if m.CurrentView == model.FileView {
@@ -691,6 +708,7 @@ func Update(m model.Model, msg tea.Msg) (model.Model, tea.Cmd) {
691708
m.DialogTarget = ""
692709
m.LogLines = nil
693710
m.RefreshData()
711+
utils.ValidateCursor(&m)
694712
}
695713

696714
case fetchMsg:
@@ -702,6 +720,7 @@ func Update(m model.Model, msg tea.Msg) (model.Model, tea.Cmd) {
702720
m.Message = "✓ Changes fetched successfully"
703721
m.MessageType = "success"
704722
m.RefreshData()
723+
utils.ValidateCursor(&m)
705724
}
706725

707726
case pullMsg:
@@ -713,6 +732,7 @@ func Update(m model.Model, msg tea.Msg) (model.Model, tea.Cmd) {
713732
m.Message = "✓ Changes pulled successfully"
714733
m.MessageType = "success"
715734
m.RefreshData()
735+
utils.ValidateCursor(&m)
716736
}
717737
}
718738

internal/utils/validate_cursor.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// validateCursor ensures the cursor is within valid bounds for the current view
2+
package utils
3+
4+
import "froggit/internal/tui/model"
5+
6+
func ValidateCursor(m *model.Model) {
7+
switch m.CurrentView {
8+
case model.FileView:
9+
if len(m.Files) == 0 {
10+
m.Cursor = 0
11+
} else if m.Cursor >= len(m.Files) {
12+
m.Cursor = len(m.Files) - 1
13+
} else if m.Cursor < 0 {
14+
m.Cursor = 0
15+
}
16+
case model.BranchView:
17+
if len(m.Branches) == 0 {
18+
m.Cursor = 0
19+
} else if m.Cursor >= len(m.Branches) {
20+
m.Cursor = len(m.Branches) - 1
21+
} else if m.Cursor < 0 {
22+
m.Cursor = 0
23+
}
24+
case model.RemoteView:
25+
if len(m.Remotes) == 0 {
26+
m.Cursor = 0
27+
} else if m.Cursor >= len(m.Remotes) {
28+
m.Cursor = len(m.Remotes) - 1
29+
} else if m.Cursor < 0 {
30+
m.Cursor = 0
31+
}
32+
}
33+
}

0 commit comments

Comments
 (0)