Skip to content

Commit 2eec2c8

Browse files
committed
loading
1 parent 993a715 commit 2eec2c8

File tree

4 files changed

+133
-14
lines changed

4 files changed

+133
-14
lines changed

cmd/example.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package cmd
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/charmbracelet/bubbles/spinner"
7+
tea "github.com/charmbracelet/bubbletea"
8+
"github.com/charmbracelet/lipgloss"
9+
"github.com/spf13/cobra"
10+
11+
)
12+
13+
var (
14+
// Available spinners
15+
spinners = []spinner.Spinner{
16+
spinner.Line,
17+
spinner.Dot,
18+
spinner.MiniDot,
19+
spinner.Jump,
20+
spinner.Pulse,
21+
spinner.Points,
22+
spinner.Globe,
23+
spinner.Moon,
24+
spinner.Monkey,
25+
}
26+
27+
textStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("252")).Render
28+
spinnerStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("69"))
29+
helpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("241")).Render
30+
)
31+
32+
type exampleModel struct {
33+
index int
34+
spinner spinner.Model
35+
}
36+
37+
func (m exampleModel) Init() tea.Cmd {
38+
return m.spinner.Tick
39+
}
40+
41+
func (m exampleModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
42+
switch msg := msg.(type) {
43+
case tea.KeyMsg:
44+
switch msg.String() {
45+
case "ctrl+c", "q", "esc":
46+
return m, tea.Quit
47+
case "h", "left":
48+
m.index--
49+
if m.index < 0 {
50+
m.index = len(spinners) - 1
51+
}
52+
m.resetSpinner()
53+
return m, m.spinner.Tick
54+
case "l", "right":
55+
m.index++
56+
if m.index >= len(spinners) {
57+
m.index = 0
58+
}
59+
m.resetSpinner()
60+
return m, m.spinner.Tick
61+
default:
62+
return m, nil
63+
}
64+
case spinner.TickMsg:
65+
var cmd tea.Cmd
66+
m.spinner, cmd = m.spinner.Update(msg)
67+
return m, cmd
68+
default:
69+
return m, nil
70+
}
71+
}
72+
73+
func (m *exampleModel) resetSpinner() {
74+
m.spinner = spinner.New()
75+
m.spinner.Style = spinnerStyle
76+
m.spinner.Spinner = spinners[m.index]
77+
}
78+
79+
func (m exampleModel) View() (s string) {
80+
var gap string
81+
switch m.index {
82+
case 1:
83+
gap = ""
84+
default:
85+
gap = " "
86+
}
87+
88+
s += fmt.Sprintf("\n %s%s%s\n\n", m.spinner.View(), gap, textStyle("Spinning..."))
89+
s += helpStyle("h/l, ←/→: change spinner • q: exit\n")
90+
return
91+
}
92+
93+
var exampleCmd = &cobra.Command{
94+
Use: "ex",
95+
Short: "Suggestion of commit message for staging repository",
96+
Aliases: []string{"e", "exx"},
97+
Run: func(cmd *cobra.Command, args []string) {
98+
m := exampleModel{}
99+
m.resetSpinner()
100+
p := tea.NewProgram(m)
101+
p.Run()
102+
},
103+
}
104+
105+
func init() {
106+
rootCmd.AddCommand(exampleCmd)
107+
}

cmd/suggest.go

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"strings"
77

8+
"github.com/charmbracelet/bubbles/spinner"
89
tea "github.com/charmbracelet/bubbletea"
910
"github.com/cocoide/commitify/internal/gateway"
1011
"github.com/cocoide/commitify/internal/service"
@@ -14,12 +15,13 @@ import (
1415
)
1516

1617
type model struct {
17-
choices []string
18-
currentIdx int
19-
errorMsg string
20-
isLoading bool
18+
choices []string
19+
currentIdx int
20+
errorMsg string
21+
isLoading bool
2122
animationIdx int
22-
messages []string
23+
messages []string
24+
spinner spinner.Model
2325
}
2426

2527
type generateMessages struct {
@@ -71,23 +73,28 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
7173
case tea.KeyCtrlC, tea.KeyEsc:
7274
return m, tea.Quit
7375
}
74-
case tea.Cmd:
75-
if m.isLoading {
76-
m.animationIdx = (m.animationIdx + 1) % 3
77-
}
76+
case spinner.TickMsg:
77+
var cmd tea.Cmd
78+
m.spinner, cmd = m.spinner.Update(msg)
79+
return m, cmd
7880
}
7981
return m, nil
8082
}
8183

84+
func (m *model) resetSpinner() {
85+
m.spinner = spinner.New()
86+
m.spinner.Style = spinnerStyle
87+
m.spinner.Spinner = spinner.Globe
88+
}
89+
8290
func (m model) View() string {
8391
if m.errorMsg != "" {
8492
red := color.New(color.FgRed).SprintFunc()
8593
return fmt.Sprintf(red(m.errorMsg))
8694
}
8795
if m.isLoading {
88-
AnimationEarth := []string{"🌎","🌍","🌏"}
89-
AnimationPoint := []string{".","..","..."}
90-
return fmt.Sprintf("%s Generating commit messages %s", AnimationEarth[m.animationIdx], AnimationPoint[m.animationIdx])
96+
s := fmt.Sprintf("\n %s %s\n\n", m.spinner.View(), textStyle("Generating commit messages..."))
97+
return s
9198
}
9299
var b strings.Builder
93100
if m.errorMsg != "" {
@@ -116,6 +123,7 @@ var suggestCmd = &cobra.Command{
116123
Aliases: []string{"s", "suggest"},
117124
Run: func(cmd *cobra.Command, args []string) {
118125
m := model{isLoading: true}
126+
m.resetSpinner()
119127
p := tea.NewProgram(m)
120128
p.Run()
121129
},

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ module github.com/cocoide/commitify
33
go 1.19
44

55
require (
6+
github.com/charmbracelet/bubbles v0.16.1
67
github.com/charmbracelet/bubbletea v0.24.2
8+
github.com/charmbracelet/lipgloss v0.7.1
79
github.com/fatih/color v1.15.0
810
github.com/joho/godotenv v1.5.1
911
github.com/sashabaranov/go-openai v1.15.1
@@ -31,7 +33,6 @@ require (
3133
require (
3234
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
3335
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect
34-
github.com/inconshreveable/mousetrap v1.1.0 // indirect
3536
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
3637
github.com/mattn/go-isatty v0.0.18 // indirect
3738
github.com/mattn/go-localereader v0.0.1 // indirect
@@ -41,7 +42,6 @@ require (
4142
github.com/muesli/reflow v0.3.0 // indirect
4243
github.com/muesli/termenv v0.15.1 // indirect
4344
github.com/rivo/uniseg v0.2.0 // indirect
44-
github.com/spf13/pflag v1.0.5 // indirect
4545
golang.org/x/sync v0.1.0 // indirect
4646
golang.org/x/sys v0.8.0 // indirect
4747
golang.org/x/term v0.6.0 // indirect

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,12 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
4141
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
4242
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
4343
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
44+
github.com/charmbracelet/bubbles v0.16.1 h1:6uzpAAaT9ZqKssntbvZMlksWHruQLNxg49H5WdeuYSY=
45+
github.com/charmbracelet/bubbles v0.16.1/go.mod h1:2QCp9LFlEsBQMvIYERr7Ww2H2bA7xen1idUDIzm/+Xc=
4446
github.com/charmbracelet/bubbletea v0.24.2 h1:uaQIKx9Ai6Gdh5zpTbGiWpytMU+CfsPp06RaW2cx/SY=
4547
github.com/charmbracelet/bubbletea v0.24.2/go.mod h1:XdrNrV4J8GiyshTtx3DNuYkR1FDaJmO3l2nejekbsgg=
48+
github.com/charmbracelet/lipgloss v0.7.1 h1:17WMwi7N1b1rVWOjMT+rCh7sQkvDU75B2hbZpc5Kc1E=
49+
github.com/charmbracelet/lipgloss v0.7.1/go.mod h1:yG0k3giv8Qj8edTCbbg6AlQ5e8KNWpFujkNawKNhE2c=
4650
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
4751
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
4852
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=

0 commit comments

Comments
 (0)