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