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}