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}