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