Refactor setupCmd and fix menu entries

Toby Padilla created

Change summary

tui/bubbles/repo/bubble.go |   4 -
tui/commands.go            | 112 +++++++++++++++++++++++++--------------
2 files changed, 72 insertions(+), 44 deletions(-)

Detailed changes

tui/bubbles/repo/bubble.go 🔗

@@ -3,10 +3,8 @@ package repo
 import (
 	"bytes"
 	"fmt"
-	"log"
 	"strconv"
 	"text/template"
-	"time"
 
 	"github.com/charmbracelet/bubbles/viewport"
 	tea "github.com/charmbracelet/bubbletea"
@@ -162,7 +160,6 @@ func (b Bubble) sshAddress() string {
 }
 
 func (b *Bubble) setupCmd() tea.Msg {
-	ct := time.Now()
 	r, err := b.repoSource.GetRepo(b.name)
 	if err == git.ErrMissingRepo {
 		return nil
@@ -184,7 +181,6 @@ func (b *Bubble) setupCmd() tea.Msg {
 	}
 	b.readmeViewport.Viewport.SetContent(md)
 	b.GotoTop()
-	log.Printf("Repo bubble loaded in %s", time.Since(ct))
 	return nil
 }
 

tui/commands.go 🔗

@@ -2,13 +2,11 @@ package tui
 
 import (
 	"fmt"
-	"log"
-	"time"
 
 	tea "github.com/charmbracelet/bubbletea"
 	"github.com/charmbracelet/lipgloss"
 	"github.com/charmbracelet/soft/config"
-	"github.com/charmbracelet/soft/tui/bubbles/repo"
+	br "github.com/charmbracelet/soft/tui/bubbles/repo"
 	"github.com/charmbracelet/soft/tui/bubbles/selection"
 	"github.com/muesli/termenv"
 )
@@ -23,50 +21,23 @@ func (b *Bubble) setupCmd() tea.Msg {
 	if b.config == nil || b.config.Source == nil {
 		return errMsg{err: fmt.Errorf("config not set")}
 	}
-	ct := time.Now()
 	lipgloss.SetColorProfile(termenv.ANSI256)
-	b.repos = b.config.Source.AllRepos()
-	mes := append([]MenuEntry{}, b.repoMenu...)
-	rs := make([]string, 0)
-OUTER:
-	for _, r := range b.repos {
-		for _, me := range mes {
-			if r.Name == me.Repo {
-				continue OUTER
-			}
-		}
-		mes = append(mes, MenuEntry{Name: r.Name, Repo: r.Name})
+	mes, err := b.menuEntriesFromSource()
+	if err != nil {
+		return errMsg{err}
 	}
 	if len(mes) == 0 {
 		return errMsg{fmt.Errorf("no repos found")}
 	}
-	var tmplConfig *config.Config
-	for _, me := range mes {
-		if me.Repo == "config" {
-			tmplConfig = b.config
-		}
-		width := b.width
-		boxLeftWidth := b.styles.Menu.GetWidth() + b.styles.Menu.GetHorizontalFrameSize()
-		// TODO: also send this along with a tea.WindowSizeMsg
-		var heightMargin = lipgloss.Height(b.headerView()) +
-			lipgloss.Height(b.footerView()) +
-			b.styles.RepoBody.GetVerticalFrameSize() +
-			b.styles.App.GetVerticalMargins()
-		rb := repo.NewBubble(b.config.Source, me.Repo, b.styles, width, boxLeftWidth, b.height, heightMargin, tmplConfig)
-		rb.Host = b.config.Host
-		rb.Port = b.config.Port
-		initCmd := rb.Init()
-		msg := initCmd()
-		switch msg := msg.(type) {
-		case repo.ErrMsg:
-			return errMsg{fmt.Errorf("missing %s: %s", me.Repo, msg.Error)}
-		}
-		me.bubble = rb
-		b.repoMenu = append(b.repoMenu, me)
-		rs = append(rs, me.Name)
+	b.repoMenu = mes
+	rs := make([]string, 0)
+	for _, m := range mes {
+		rs = append(rs, m.Name)
 	}
 	b.repoSelect = selection.NewBubble(rs, b.styles)
 	b.boxes[0] = b.repoSelect
+
+	// Jump to an initial repo
 	ir := -1
 	if b.initialRepo != "" {
 		for i, me := range b.repoMenu {
@@ -83,7 +54,68 @@ OUTER:
 		b.repoSelect.SelectedItem = ir
 		b.activeBox = 1
 	}
+
 	b.state = loadedState
-	log.Printf("App bubble loaded in %s", time.Since(ct))
 	return nil
 }
+
+func (b *Bubble) menuEntriesFromSource() ([]MenuEntry, error) {
+	mes := make([]MenuEntry, 0)
+	for _, r := range b.config.Repos {
+		me, err := b.newMenuEntry(r.Name, r.Repo)
+		if err != nil {
+			return nil, err
+		}
+		mes = append(mes, me)
+	}
+	rs := b.config.Source.AllRepos()
+OUTER:
+	for _, r := range rs {
+		for _, me := range mes {
+			if r.Name == me.Repo {
+				continue OUTER
+			}
+		}
+		me, err := b.newMenuEntry(r.Name, r.Name)
+		if err != nil {
+			return nil, err
+		}
+		mes = append(mes, me)
+	}
+	return mes, nil
+}
+
+func (b *Bubble) newMenuEntry(name string, repo string) (MenuEntry, error) {
+	var tmplConfig *config.Config
+	me := MenuEntry{Name: name, Repo: repo}
+	width := b.width
+	boxLeftWidth := b.styles.Menu.GetWidth() + b.styles.Menu.GetHorizontalFrameSize()
+	// TODO: also send this along with a tea.WindowSizeMsg
+	var heightMargin = lipgloss.Height(b.headerView()) +
+		lipgloss.Height(b.footerView()) +
+		b.styles.RepoBody.GetVerticalFrameSize() +
+		b.styles.App.GetVerticalMargins()
+	if repo == "config" {
+		tmplConfig = b.config
+	}
+	rb := br.NewBubble(
+		b.config.Source,
+		me.Repo,
+		b.styles,
+		width,
+		boxLeftWidth,
+		b.height,
+		heightMargin,
+		tmplConfig,
+	)
+	rb.Host = b.config.Host
+	rb.Port = b.config.Port
+	initCmd := rb.Init()
+	msg := initCmd()
+	switch msg := msg.(type) {
+	case br.ErrMsg:
+		return me, fmt.Errorf("missing %s: %s", me.Repo, msg.Error)
+	}
+	me.bubble = rb
+	return me, nil
+}