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