package upgrade import ( "git.cycore.io/scm/talos-upgrade/pkg/palette" "git.cycore.io/scm/talos-upgrade/pkg/release" "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" "github.com/google/go-github/v55/github" "github.com/pkg/errors" ) type LoadState struct { Core *CoreState progressPercent float64 Err error spinner spinner.Model textStyle func(...string) string spinnerStyle lipgloss.Style helpStyle func(...string) string } func (l *LoadState) Init() tea.Cmd { l.spinner = spinner.New( spinner.WithSpinner(spinner.Globe), ) l.textStyle = lipgloss.NewStyle().Foreground(lipgloss.Color(palette.Foreground)).Render l.spinnerStyle = lipgloss.NewStyle().Foreground(lipgloss.Color(palette.Blue)) l.helpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color(palette.BrightBlack)).Render go func() { var err error defer func() { l.progressPercent = 1.0 l.Err = err }() if err = l.Core.UpdateNodeList(l.Core.ctx); err != nil { err = errors.Wrap(err, "failed to update node list") return } l.progressPercent = 0.5 if l.Core.CurrentReleases == nil { var list []*github.RepositoryRelease //list, err := release.GetAfter(s.Core.ctx, s.Core.LowestTalosVersion) list, err = release.GetAll(l.Core.ctx) if err != nil { err = errors.Wrap(err, "failed to load current Talos releases") return } l.Core.CurrentReleases = list } }() return l.spinner.Tick } func (l *LoadState) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: return l, tea.Quit case tea.WindowSizeMsg: l.Core.Width = msg.Width l.Core.Height = msg.Height return l, nil case spinner.TickMsg: if l.progressPercent == 1.0 { return NewSelectRelease(l.Core), nil } var cmd tea.Cmd l.spinner, cmd = l.spinner.Update(msg) return l, cmd default: if l.progressPercent == 1.0 { return NewSelectRelease(l.Core), nil } return l, nil } } func (l *LoadState) View() string { pad := " " return "\n" + pad + l.spinner.View() + " loading system status..." }