1package repo
  2
  3import (
  4	"fmt"
  5
  6	"github.com/charmbracelet/bubbles/key"
  7	tea "github.com/charmbracelet/bubbletea"
  8	"github.com/charmbracelet/soft-serve/ui/common"
  9	"github.com/charmbracelet/soft-serve/ui/components/code"
 10	"github.com/charmbracelet/soft-serve/ui/git"
 11)
 12
 13// Readme is the readme component page.
 14type Readme struct {
 15	common common.Common
 16	code   *code.Code
 17	ref    RefMsg
 18	repo   git.GitRepo
 19}
 20
 21// NewReadme creates a new readme model.
 22func NewReadme(common common.Common) *Readme {
 23	readme := code.New(common, "", "")
 24	readme.NoContentStyle = readme.NoContentStyle.SetString("No readme found.")
 25	return &Readme{
 26		code:   readme,
 27		common: common,
 28	}
 29}
 30
 31// SetSize implements common.Component.
 32func (r *Readme) SetSize(width, height int) {
 33	r.common.SetSize(width, height)
 34	r.code.SetSize(width, height)
 35}
 36
 37// ShortHelp implements help.KeyMap.
 38func (r *Readme) ShortHelp() []key.Binding {
 39	b := []key.Binding{
 40		r.common.KeyMap.UpDown,
 41	}
 42	return b
 43}
 44
 45// FullHelp implements help.KeyMap.
 46func (r *Readme) FullHelp() [][]key.Binding {
 47	k := r.code.KeyMap
 48	b := [][]key.Binding{
 49		{
 50			k.PageDown,
 51			k.PageUp,
 52			k.HalfPageDown,
 53			k.HalfPageUp,
 54		},
 55		{
 56			k.Down,
 57			k.Up,
 58		},
 59	}
 60	return b
 61}
 62
 63// Init implements tea.Model.
 64func (r *Readme) Init() tea.Cmd {
 65	if r.repo == nil {
 66		return common.ErrorCmd(git.ErrMissingRepo)
 67	}
 68	rm, rp := r.repo.Readme()
 69	r.code.GotoTop()
 70	return r.code.SetContent(rm, rp)
 71}
 72
 73// Update implements tea.Model.
 74func (r *Readme) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 75	cmds := make([]tea.Cmd, 0)
 76	switch msg := msg.(type) {
 77	case RepoMsg:
 78		r.repo = git.GitRepo(msg)
 79		cmds = append(cmds, r.Init())
 80	case RefMsg:
 81		r.ref = msg
 82		cmds = append(cmds, r.Init())
 83	}
 84	c, cmd := r.code.Update(msg)
 85	r.code = c.(*code.Code)
 86	if cmd != nil {
 87		cmds = append(cmds, cmd)
 88	}
 89	return r, tea.Batch(cmds...)
 90}
 91
 92// View implements tea.Model.
 93func (r *Readme) View() string {
 94	return r.code.View()
 95}
 96
 97// StausBarValue implements statusbar.StatusBar.
 98func (r *Readme) StatusBarValue() string {
 99	return ""
100}
101
102// StatusBarInfo implements statusbar.StatusBar.
103func (r *Readme) StatusBarInfo() string {
104	return fmt.Sprintf("☰ %.f%%", r.code.ScrollPercent()*100)
105}