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}