Make spinner message changeable

This commit is contained in:
Dan Jones 2024-10-24 20:02:55 -05:00
commit 01e3c3aade
3 changed files with 90 additions and 3 deletions

View file

@ -2,6 +2,7 @@ package spin
import (
"context"
"errors"
"fmt"
"github.com/charmbracelet/bubbles/spinner"
@ -17,6 +18,8 @@ type model struct {
type errMsg error
type textMessage string
func newModel(text string) model {
s := spinner.New()
s.Spinner = spinner.Dot
@ -33,6 +36,10 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.err = msg
return m, nil
case textMessage:
m.text = string(msg)
return m, nil
default:
var cmd tea.Cmd
m.spinner, cmd = m.spinner.Update(msg)
@ -51,8 +58,28 @@ func (m model) View() string {
return str
}
func Spin(ctx context.Context, message string) error {
func Spin(ctx context.Context, message string) (chan string, chan error) {
p := tea.NewProgram(newModel(message), tea.WithContext(ctx))
_, err := p.Run()
return err
msgChan := make(chan string, 10)
errChan := make(chan error)
go func() {
for {
m := <-msgChan
p.Send(textMessage(m))
}
}()
go func() {
_, err := p.Run()
if errors.Is(err, context.Canceled) {
err = nil
} else if errors.Is(err, context.DeadlineExceeded) {
err = nil
} else if errors.Is(err, tea.ErrProgramKilled) {
err = nil
}
errChan <- err
}()
return msgChan, errChan
}