prime8dev

prime8dev
git clone https://git.prime8.dev/prime8dev.git
Log | Files | Refs | README | LICENSE

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 }