types.go (3544B)
1 package tui 2 3 import ( 4 "math/rand" 5 "time" 6 7 appconfig "git.prime8.dev/moncheeta/prime8dev/internal/config" 8 appcontent "git.prime8.dev/moncheeta/prime8dev/internal/content" 9 "git.prime8.dev/moncheeta/prime8dev/internal/external" 10 "github.com/charmbracelet/bubbles/help" 11 "github.com/charmbracelet/bubbles/viewport" 12 "github.com/patrickmn/go-cache" 13 ) 14 15 const ( 16 tabAbout = iota 17 tabProjects 18 tabExperience 19 tabBlog 20 21 minWindowWidth = 80 22 minWindowHeight = 24 23 ) 24 25 var tabLabels = []string{"about", "projects", "experience", "blog"} 26 27 type tickMsg time.Time 28 29 type portfolioModel struct { 30 user string 31 about appconfig.About 32 currentJob *appconfig.Experience 33 aboutNameASCII string 34 aboutNameReady bool 35 aboutNameLoading bool 36 aboutASCIICache map[int]string 37 aboutASCIILoads map[int]bool 38 39 projects []appconfig.Project 40 experience []appconfig.Experience 41 blogs []appcontent.Blog 42 43 activeTab int 44 projectIndex int 45 projectReadmeScroll bool 46 experienceIndex int 47 blogIndex int 48 blogOpen bool 49 50 width int 51 height int 52 now time.Time 53 54 bootTitle string 55 bootSubtitle string 56 bootTitleFrame string 57 bootSubtitleFrame string 58 bootStartedAt time.Time 59 bootFadeProgress float64 60 bootActive bool 61 bootRand *rand.Rand 62 63 keys keyMap 64 help help.Model 65 viewport viewport.Model 66 gitService *external.Git 67 68 projectReadmes map[string]string 69 projectReadmeErrors map[string]string 70 projectReadmeLoads map[string]bool 71 projectReadmeRender map[string]map[int]string 72 projectMarkdownLoads map[string]bool 73 projectPrefetchDone bool 74 75 blogMarkdownRender map[string]map[int]string 76 blogMarkdownLoads map[string]bool 77 78 wakaHours string 79 wakaWeekly *external.WeeklyStats 80 wakaLoaded bool 81 wakaLoading bool 82 wakaTime *external.WakaTime 83 } 84 85 func newPortfolioModel(user string) portfolioModel { 86 gitService := external.NewGit() 87 88 about := appconfig.GetAbout() 89 exp := appconfig.GetExperience() 90 blogs, _ := appcontent.LoadBlogs() 91 projects, _ := appcontent.LoadProjects(gitService) 92 bootTitle := about.Name 93 if bootTitle == "" { 94 bootTitle = "prime8.dev" 95 } 96 vp := viewport.New(1, 1) 97 vp.SetContent("loading...") 98 99 h := help.New() 100 h.ShowAll = false 101 102 m := portfolioModel{ 103 gitService: gitService, 104 user: user, 105 about: about, 106 currentJob: appconfig.CurrentJob(exp), 107 aboutNameASCII: about.Name, 108 aboutNameReady: false, 109 aboutNameLoading: false, 110 aboutASCIICache: make(map[int]string), 111 aboutASCIILoads: make(map[int]bool), 112 projects: projects, 113 experience: exp, 114 blogs: blogs, 115 now: time.Now(), 116 width: 80, 117 height: 24, 118 bootTitle: bootTitle, 119 bootSubtitle: "www.prime8.dev", 120 bootStartedAt: time.Now(), 121 bootActive: true, 122 bootRand: rand.New(rand.NewSource(time.Now().UnixNano())), 123 keys: defaultKeyMap(), 124 help: h, 125 viewport: vp, 126 127 projectReadmes: make(map[string]string), 128 projectReadmeErrors: make(map[string]string), 129 projectReadmeLoads: make(map[string]bool), 130 projectReadmeRender: make(map[string]map[int]string), 131 projectMarkdownLoads: make(map[string]bool), 132 133 blogMarkdownRender: make(map[string]map[int]string), 134 blogMarkdownLoads: make(map[string]bool), 135 wakaTime: external.NewWakaTime(cache.New(5*time.Minute, 10*time.Minute)), 136 } 137 m.syncBootFrame(m.bootStartedAt) 138 m.syncViewport() 139 140 return m 141 }