projects_readme.go (2017B)
1 package tui 2 3 import ( 4 "fmt" 5 6 appconfig "git.prime8.dev/moncheeta/prime8dev/internal/config" 7 appcontent "git.prime8.dev/moncheeta/prime8dev/internal/content" 8 "git.prime8.dev/moncheeta/prime8dev/internal/external" 9 tea "github.com/charmbracelet/bubbletea" 10 ) 11 12 type projectReadmeMsg struct { 13 projectID string 14 readme string 15 err error 16 } 17 18 func (m portfolioModel) selectedProject() *appconfig.Project { 19 if len(m.projects) == 0 { 20 return nil 21 } 22 if m.projectIndex < 0 || m.projectIndex >= len(m.projects) { 23 return nil 24 } 25 return &m.projects[m.projectIndex] 26 } 27 28 func (m *portfolioModel) maybeLoadProjectReadmeCmd() tea.Cmd { 29 if m.activeTab != tabProjects { 30 return nil 31 } 32 33 project := m.selectedProject() 34 if project == nil { 35 return nil 36 } 37 38 id := project.ID 39 if _, ok := m.projectReadmes[id]; ok { 40 return nil 41 } 42 if m.projectReadmeLoads[id] { 43 return nil 44 } 45 m.projectReadmeLoads[id] = true 46 return fetchProjectReadmeCmd(m.gitService, *project) 47 } 48 49 func (m *portfolioModel) maybePrefetchProjectReadmesCmd() tea.Cmd { 50 if m.activeTab != tabProjects { 51 return nil 52 } 53 if m.projectPrefetchDone { 54 return nil 55 } 56 cmds := make([]tea.Cmd, 0, len(m.projects)) 57 for _, project := range m.projects { 58 id := project.ID 59 if _, ok := m.projectReadmes[id]; ok { 60 continue 61 } 62 if m.projectReadmeLoads[id] { 63 continue 64 } 65 m.projectReadmeLoads[id] = true 66 cmds = append(cmds, fetchProjectReadmeCmd(m.gitService, project)) 67 } 68 69 m.projectPrefetchDone = true 70 if len(cmds) == 0 { 71 return nil 72 } 73 74 return tea.Batch(cmds...) 75 } 76 77 func fetchProjectReadmeCmd(service *external.Git, project appconfig.Project) tea.Cmd { 78 return func() tea.Msg { 79 current, err := appcontent.GetProjectByID(service, project.ID) 80 if err != nil { 81 return projectReadmeMsg{projectID: project.ID, err: err} 82 } 83 if current == nil || current.Markdown == "" { 84 return projectReadmeMsg{projectID: project.ID, err: fmt.Errorf("readme unavailable")} 85 } 86 return projectReadmeMsg{projectID: project.ID, readme: current.Markdown} 87 } 88 }