Gitfed
bastien-mrq/gitfed / cmd / gitfed-ctl / view.go
package main

import (
	"fmt"

	"github.com/charmbracelet/lipgloss"
)

func (m model) View() string {
	if m.quitting {
		return ""
	}

	body := m.renderScreen()
	header := styleTitle.Render("gitfed-ctl") + "  " + styleTag.Render(screenLabel(m.screen))
	footer := styleFooter.Render(m.footerHint())

	return lipgloss.JoinVertical(lipgloss.Left, header, "", body, "", footer)
}

func (m model) renderScreen() string {
	switch m.screen {
	case screenDashboard:
		return m.viewDashboard()
	case screenUpdatesCheck:
		return m.viewUpdatesCheck()
	case screenUpdatesAckBreaking:
		return m.viewAckBreaking()
	case screenUpdatesConfirm:
		return m.viewConfirm()
	case screenUpdatesRunning:
		return m.viewRunning()
	case screenUpdatesSuccess:
		return m.viewSuccess()
	}
	return ""
}

func screenLabel(s screen) string {
	names := map[screen]string{
		screenDashboard:          "accueil",
		screenUpdatesCheck:       "mises à jour · vérification",
		screenUpdatesAckBreaking: "mises à jour · changements cassants",
		screenUpdatesConfirm:     "mises à jour · confirmation",
		screenUpdatesRunning:     "mises à jour · en cours",
		screenUpdatesSuccess:     "mises à jour · terminé",
	}
	return names[s]
}

func (m model) footerHint() string {
	switch m.screen {
	case screenDashboard:
		hint := "entrée : vérifier les mises à jour   ·   r : rafraîchir   ·   q : quitter"
		if !m.kubectlOK && m.k3sYAMLPresent {
			hint = "f : réparer kubectl   ·   " + hint
		}
		return hint
	case screenUpdatesCheck:
		if m.checked && m.checkErr != nil {
			return "r : réessayer   ·   esc : retour"
		}
		if m.checked && m.upToDate {
			return "entrée / esc : retour à l'accueil"
		}
		return "esc : retour"
	case screenUpdatesAckBreaking:
		if allAcked(m.ackChecklist) {
			return "↑↓ naviguer   ·   espace : cocher   ·   entrée : continuer   ·   esc : annuler"
		}
		return "↑↓ naviguer   ·   espace : cocher chaque changement cassant pour continuer   ·   esc : annuler"
	case screenUpdatesConfirm:
		return "espace : bascule sauvegarde   ·   entrée : déployer   ·   esc : annuler"
	case screenUpdatesRunning:
		if m.pipelineErr != nil {
			return "q : quitter"
		}
		return "ctrl+c : annuler"
	case screenUpdatesSuccess:
		return "entrée : retour à l'accueil   ·   q : quitter"
	}
	return "ctrl+c : quitter"
}

func row(gl string, label string, val string) string {
	l := styleBody.Render(label)
	if val != "" {
		return fmt.Sprintf("%s  %-46s %s", gl, l, styleBold.Render(val))
	}
	return fmt.Sprintf("%s  %s", gl, l)
}