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	ct := time.Now()
23	lipgloss.SetColorProfile(termenv.ANSI256)
24	b.repos = b.repoSource.AllRepos()
25	mes := append([]MenuEntry{}, b.config.Menu...)
26	rs := make([]string, 0)
27	if b.config.ShowAllRepos {
28	OUTER:
29		for _, r := range b.repos {
30			for _, me := range mes {
31				if r.Name == me.Repo {
32					continue OUTER
33				}
34			}
35			mes = append(mes, MenuEntry{Name: r.Name, Repo: r.Name})
36		}
37	}
38	var tmplConfig *Config
39	for _, me := range mes {
40		if me.Repo == "config" {
41			tmplConfig = b.config
42		}
43		width := b.width
44		boxLeftWidth := b.styles.Menu.GetWidth() + b.styles.Menu.GetHorizontalFrameSize()
45		// TODO: also send this along with a tea.WindowSizeMsg
46		var heightMargin = lipgloss.Height(b.headerView()) +
47			lipgloss.Height(b.footerView()) +
48			b.styles.RepoBody.GetVerticalFrameSize() +
49			b.styles.App.GetVerticalMargins()
50		rb := repo.NewBubble(b.repoSource, me.Repo, b.styles, width, boxLeftWidth, b.height, heightMargin, tmplConfig)
51		rb.Host = b.config.Host
52		rb.Port = b.config.Port
53		initCmd := rb.Init()
54		msg := initCmd()
55		switch msg := msg.(type) {
56		case repo.ErrMsg:
57			return errMsg{fmt.Errorf("missing %s: %s", me.Repo, msg.Error)}
58		}
59		me.bubble = rb
60		b.repoMenu = append(b.repoMenu, me)
61		rs = append(rs, me.Name)
62	}
63	b.repoSelect = selection.NewBubble(rs, b.styles)
64	b.boxes[0] = b.repoSelect
65	ir := -1
66	if b.initialRepo != "" {
67		for i, me := range b.repoMenu {
68			if me.Repo == b.initialRepo {
69				ir = i
70			}
71		}
72	}
73	if ir == -1 {
74		b.boxes[1] = b.repoMenu[0].bubble
75		b.activeBox = 0
76	} else {
77		b.boxes[1] = b.repoMenu[ir].bubble
78		b.repoSelect.SelectedItem = ir
79		b.activeBox = 1
80	}
81	b.state = loadedState
82	log.Printf("App bubble loaded in %s", time.Since(ct))
83	return nil
84}