package issues import ( "fmt" "strings" "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) // The main bubbletea Model type Model struct { Issue Issue Path string viewport viewport.Model } func (m Model) Init() tea.Cmd { return nil } // Handles quit logic and viewport scroll and size updates func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg.(type) { case tea.KeyMsg: return m, tea.Quit } return m, nil } // [lipgloss] style definitions var ( titleStyle = lipgloss.NewStyle(). Bold(true). Underline(true) statusStyle = lipgloss.NewStyle(). Faint(true). Italic(true) variadicTitleStyle = lipgloss.NewStyle(). Align(lipgloss.Left). Italic(true) variadicDataStyle = lipgloss.NewStyle(). Width(40). BorderStyle(lipgloss.ASCIIBorder()) borderStyle = lipgloss.NewStyle(). Padding(1, 2). Margin(1). BorderStyle(lipgloss.NormalBorder()) ) // Handles all view logic for [issue.Issue] func (m Model) renderIssue() string { var output string // title output = output + titleStyle.Render(m.Issue.Title) // status output = output + fmt.Sprintf("\n%s", statusStyle.Render(m.Issue.Status.Data)) // variadics var tags string for _, field := range m.Issue.Tags.Fields { tags = tags + field.Path + ", " } tags = strings.TrimRight(tags, ", ") var blockedby string for _, field := range m.Issue.Blockedby.Fields { blockedby = blockedby + field.Path + ", " } blockedby = strings.TrimRight(blockedby, ", ") if len(m.Issue.Tags.Fields) > 0 { output = output + variadicTitleStyle.Render("\n\nTags:") output = output + fmt.Sprintf("\n%s", variadicDataStyle.Render(tags)) } if len(m.Issue.Blockedby.Fields) > 0 { output = output + variadicTitleStyle.Render("\n\nBlockedby:") output = output + fmt.Sprintf("\n%s", variadicDataStyle.Render(blockedby)) } // description output = output + titleStyle.Render("\n\nDescription:\n") output = output + fmt.Sprintf("\n%s", m.Issue.Description.Data) return borderStyle.Render(output) } // Wraps [issue.Model.renderIssue] in a viewport func (m Model) View() string { return m.renderIssue() }