prime8dev

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

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 }