Skip to content

Commit 167b4c5

Browse files
committed
feat: sorting modules, multiple spinners
1 parent 460d3d2 commit 167b4c5

File tree

6 files changed

+79
-27
lines changed

6 files changed

+79
-27
lines changed

internal/tui/model.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"github.com/charmbracelet/bubbles/progress"
66
"github.com/charmbracelet/bubbles/spinner"
77
tea "github.com/charmbracelet/bubbletea"
8-
"github.com/charmbracelet/lipgloss"
98

109
"github.com/chaindead/modup/internal/deps"
1110
)
@@ -15,7 +14,7 @@ type model struct {
1514
// scan mode
1615
packages modules
1716
modules []deps.Module
18-
scanning []string
17+
scanning namedSpinners
1918

2019
// choose mode
2120
list list.Model
@@ -37,13 +36,9 @@ type model struct {
3736
}
3837

3938
func NewModel() model {
40-
p := newProgress()
41-
s := spinner.New()
42-
s.Spinner = spinner.MiniDot
43-
s.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("63"))
4439
return model{
45-
spinner: s,
46-
progress: p,
40+
spinner: newSpinner(),
41+
progress: newProgress(),
4742
scanning: nil,
4843
}
4944
}

internal/tui/modules.go

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ type modules struct {
1313
cnt int
1414
mu *sync.RWMutex
1515

16-
queue []string
17-
scanning []string
16+
queue []string
1817
}
1918

2019
func createModules(packages []string) modules {
@@ -43,14 +42,3 @@ func (m modules) isFinished() bool {
4342
func (m modules) progressFloat() float64 {
4443
return float64(m.current) / float64(m.cnt)
4544
}
46-
47-
func remove(slice []string, s string) []string {
48-
for i, p := range slice {
49-
if p == s {
50-
slice = append(slice[:i], slice[i+1:]...)
51-
break
52-
}
53-
}
54-
55-
return slice
56-
}

internal/tui/slice_spin.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package tui
2+
3+
import "github.com/charmbracelet/bubbles/spinner"
4+
5+
type namedSpinner struct {
6+
name string
7+
spin spinner.Model
8+
}
9+
10+
type namedSpinners []namedSpinner
11+
12+
func (s namedSpinners) remove(name string) namedSpinners {
13+
for i, p := range s {
14+
if p.name == name {
15+
return append(s[:i], s[i+1:]...)
16+
}
17+
}
18+
19+
return s
20+
}
21+
22+
func (s namedSpinners) lastSpinner() spinner.Model {
23+
return s[len(s)-1].spin
24+
}

internal/tui/styles.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55

66
"github.com/charmbracelet/bubbles/progress"
7+
"github.com/charmbracelet/bubbles/spinner"
78
tea "github.com/charmbracelet/bubbletea"
89
"github.com/charmbracelet/lipgloss"
910
)
@@ -31,6 +32,13 @@ func newProgress() progress.Model {
3132
)
3233
}
3334

35+
func newSpinner() spinner.Model {
36+
s := spinner.New()
37+
s.Spinner = spinner.MiniDot
38+
s.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("63"))
39+
return s
40+
}
41+
3442
func stepPrint(template string, args ...interface{}) tea.Cmd {
3543
line := stepIcon.Render() + " " + fmt.Sprintf(template, args...)
3644

internal/tui/update.go

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ package tui
22

33
import (
44
"fmt"
5+
"sort"
56

67
"github.com/charmbracelet/bubbles/progress"
78
"github.com/charmbracelet/bubbles/spinner"
89
tea "github.com/charmbracelet/bubbletea"
10+
11+
"github.com/chaindead/modup/internal/deps"
912
)
1013

1114
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
@@ -33,7 +36,19 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
3336

3437
case spinner.TickMsg:
3538
var cmd tea.Cmd
36-
m.spinner, cmd = m.spinner.Update(msg)
39+
40+
if msg.ID == m.spinner.ID() {
41+
m.spinner, cmd = m.spinner.Update(msg)
42+
return m, cmd
43+
}
44+
45+
for i := range m.scanning {
46+
if msg.ID == m.scanning[i].spin.ID() {
47+
m.scanning[i].spin, cmd = m.scanning[i].spin.Update(msg)
48+
break
49+
}
50+
}
51+
3752
return m, cmd
3853
case progress.FrameMsg:
3954
progressModel, cmd := m.progress.Update(msg)
@@ -64,11 +79,17 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
6479
return m, nil
6580
}
6681

67-
m.scanning = append(m.scanning, pkg)
68-
return m, getPkgInfo(pkg)
82+
m.scanning = append(m.scanning, namedSpinner{
83+
name: pkg,
84+
spin: newSpinner(),
85+
})
86+
return m, tea.Batch(
87+
getPkgInfo(pkg),
88+
m.scanning.lastSpinner().Tick,
89+
)
6990
case getPackageInfoMsg:
7091
m.packages.current++
71-
m.scanning = remove(m.scanning, msg.mod.Path)
92+
m.scanning = m.scanning.remove(msg.mod.Path)
7293
if msg.mod.Updatable {
7394
m.modules = append(m.modules, msg.mod)
7495
}
@@ -91,6 +112,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
91112
tea.Quit,
92113
)
93114
}
115+
m.modules = sortModules(m.modules)
94116

95117
return m, tea.Sequence(
96118
textPrint("%s %s", mark, pkg),
@@ -153,3 +175,18 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
153175

154176
return m, nil
155177
}
178+
179+
var categoryMap = map[string]int{
180+
"minor": 1,
181+
"patch": 2,
182+
"prerelease": 3,
183+
"metadata": 4,
184+
}
185+
186+
func sortModules(ms []deps.Module) []deps.Module {
187+
sort.Slice(ms, func(i, j int) bool {
188+
return categoryMap[ms[i].UpdateCategory] < categoryMap[ms[j].UpdateCategory]
189+
})
190+
191+
return ms
192+
}

internal/tui/views.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ func (m model) viewScan() string {
3636

3737
var lines []string
3838
for _, p := range m.scanning {
39-
name := currentPkgNameStyle.Render(p)
40-
lines = append(lines, m.spinner.View()+" Scanning "+name)
39+
name := currentPkgNameStyle.Render(p.name)
40+
lines = append(lines, p.spin.View()+" Scanning "+name)
4141
}
4242

4343
body := strings.Join(lines, "\n")

0 commit comments

Comments
 (0)