1package tui
 2
 3import (
 4	"fmt"
 5	"log"
 6	"soft-serve/tui/bubbles/repo"
 7	"soft-serve/tui/bubbles/selection"
 8	"time"
 9
10	tea "github.com/charmbracelet/bubbletea"
11	"github.com/charmbracelet/lipgloss"
12	"github.com/muesli/termenv"
13)
14
15type errMsg struct{ err error }
16
17func (e errMsg) Error() string {
18	return e.err.Error()
19}
20
21func (b *Bubble) setupCmd() tea.Msg {
22	if b.config == nil || b.config.RepoSource == nil {
23		return errMsg{err: fmt.Errorf("config not set")}
24	}
25	ct := time.Now()
26	lipgloss.SetColorProfile(termenv.ANSI256)
27	b.repos = b.repoSource.AllRepos()
28	mes := append([]MenuEntry{}, b.config.Menu...)
29	rs := make([]string, 0)
30	if b.config.ShowAllRepos {
31	OUTER:
32		for _, r := range b.repos {
33			for _, me := range mes {
34				if r.Name == me.Repo {
35					continue OUTER
36				}
37			}
38			mes = append(mes, MenuEntry{Name: r.Name, Repo: r.Name})
39		}
40	}
41	if len(mes) == 0 {
42		return errMsg{fmt.Errorf("no repos found")}
43	}
44	var tmplConfig *Config
45	for _, me := range mes {
46		if me.Repo == "config" {
47			tmplConfig = b.config
48		}
49		width := b.width
50		boxLeftWidth := b.styles.Menu.GetWidth() + b.styles.Menu.GetHorizontalFrameSize()
51		// TODO: also send this along with a tea.WindowSizeMsg
52		var heightMargin = lipgloss.Height(b.headerView()) +
53			lipgloss.Height(b.footerView()) +
54			b.styles.RepoBody.GetVerticalFrameSize() +
55			b.styles.App.GetVerticalMargins()
56		rb := repo.NewBubble(b.repoSource, me.Repo, b.styles, width, boxLeftWidth, b.height, heightMargin, tmplConfig)
57		rb.Host = b.config.Host
58		rb.Port = b.config.Port
59		initCmd := rb.Init()
60		msg := initCmd()
61		switch msg := msg.(type) {
62		case repo.ErrMsg:
63			return errMsg{fmt.Errorf("missing %s: %s", me.Repo, msg.Error)}
64		}
65		me.bubble = rb
66		b.repoMenu = append(b.repoMenu, me)
67		rs = append(rs, me.Name)
68	}
69	b.repoSelect = selection.NewBubble(rs, b.styles)
70	b.boxes[0] = b.repoSelect
71	ir := -1
72	if b.initialRepo != "" {
73		for i, me := range b.repoMenu {
74			if me.Repo == b.initialRepo {
75				ir = i
76			}
77		}
78	}
79	if ir == -1 {
80		b.boxes[1] = b.repoMenu[0].bubble
81		b.activeBox = 0
82	} else {
83		b.boxes[1] = b.repoMenu[ir].bubble
84		b.repoSelect.SelectedItem = ir
85		b.activeBox = 1
86	}
87	b.state = loadedState
88	log.Printf("App bubble loaded in %s", time.Since(ct))
89	return nil
90}