1package repo
  2
  3import (
  4	"sort"
  5	"strings"
  6
  7	tea "github.com/charmbracelet/bubbletea"
  8	ggit "github.com/charmbracelet/soft-serve/git"
  9	"github.com/charmbracelet/soft-serve/ui/common"
 10	"github.com/charmbracelet/soft-serve/ui/components/selector"
 11	"github.com/charmbracelet/soft-serve/ui/components/tabs"
 12	"github.com/charmbracelet/soft-serve/ui/git"
 13)
 14
 15type RefItemsMsg struct {
 16	prefix string
 17	items  []selector.IdentifiableItem
 18}
 19
 20type Refs struct {
 21	common    common.Common
 22	selector  *selector.Selector
 23	repo      git.GitRepo
 24	ref       *ggit.Reference
 25	refPrefix string
 26}
 27
 28func NewRefs(common common.Common, refPrefix string) *Refs {
 29	r := &Refs{
 30		common:    common,
 31		refPrefix: refPrefix,
 32	}
 33	s := selector.New(common, []selector.IdentifiableItem{}, RefItemDelegate{common.Styles})
 34	s.SetShowFilter(false)
 35	s.SetShowHelp(false)
 36	s.SetShowPagination(true)
 37	s.SetShowStatusBar(false)
 38	s.SetShowTitle(false)
 39	s.SetFilteringEnabled(false)
 40	s.DisableQuitKeybindings()
 41	r.selector = s
 42	return r
 43}
 44
 45func (r *Refs) SetSize(width, height int) {
 46	r.common.SetSize(width, height)
 47	r.selector.SetSize(width, height)
 48}
 49
 50func (r *Refs) Init() tea.Cmd {
 51	return r.updateItemsCmd
 52}
 53
 54func (r *Refs) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 55	cmds := make([]tea.Cmd, 0)
 56	switch msg := msg.(type) {
 57	case RepoMsg:
 58		r.selector.Select(0)
 59		r.repo = git.GitRepo(msg)
 60		cmds = append(cmds, r.Init())
 61	case RefMsg:
 62		r.ref = msg
 63		cmds = append(cmds, r.Init())
 64	case RefItemsMsg:
 65		cmds = append(cmds, r.selector.SetItems(msg.items))
 66	case selector.SelectMsg:
 67		switch i := msg.IdentifiableItem.(type) {
 68		case RefItem:
 69			cmds = append(cmds,
 70				switchRefCmd(i.Reference),
 71				tabs.SelectTabCmd(int(filesTab)),
 72			)
 73		}
 74	case tea.KeyMsg:
 75		switch msg.String() {
 76		case "l", "right":
 77			cmds = append(cmds, r.selector.SelectItem)
 78		}
 79	}
 80	m, cmd := r.selector.Update(msg)
 81	r.selector = m.(*selector.Selector)
 82	if cmd != nil {
 83		cmds = append(cmds, cmd)
 84	}
 85	return r, tea.Batch(cmds...)
 86}
 87
 88func (r *Refs) View() string {
 89	return r.selector.View()
 90}
 91
 92func (r *Refs) StatusBarValue() string {
 93	return ""
 94}
 95
 96func (r *Refs) StatusBarInfo() string {
 97	return ""
 98}
 99
100func (r *Refs) updateItemsCmd() tea.Msg {
101	its := make(RefItems, 0)
102	refs, err := r.repo.References()
103	if err != nil {
104		return common.ErrorMsg(err)
105	}
106	for _, ref := range refs {
107		if strings.HasPrefix(ref.Name().String(), r.refPrefix) {
108			its = append(its, RefItem{ref})
109		}
110	}
111	sort.Sort(its)
112	items := make([]selector.IdentifiableItem, len(its))
113	for i, it := range its {
114		items[i] = it
115	}
116	return RefItemsMsg{
117		items:  items,
118		prefix: r.refPrefix,
119	}
120}
121
122func switchRefCmd(ref *ggit.Reference) tea.Cmd {
123	return func() tea.Msg {
124		return RefMsg(ref)
125	}
126}