Files
tuio/internal/tui/view.go
T
2026-03-09 11:37:43 -03:00

116 lines
2.6 KiB
Go

package tui
import (
"fmt"
"strings"
tea "charm.land/bubbletea/v2"
)
const (
header = "App do Dono - Instalador Cliente"
)
func (m Model) View() tea.View {
pad := strings.Repeat(" ", padding)
var body string
helpMsg := "ctrl+c: sair"
switch m.currentStep {
case StepCheckDocker:
body = m.viewCheckDocker()
case StepDockerInstall:
body = m.viewDockerInstall()
helpMsg = "qualquer tecla: sair"
case StepIPQuestion:
body = m.viewIPQuestion()
case StepServerConfig:
body = m.serverForm.View()
helpMsg = "tab: próximo campo • enter: confirmar • ctrl+c: sair"
case StepDatabaseConfig:
body = m.dbForm.View()
helpMsg = "tab: próximo campo • enter: confirmar • ctrl+c: sair"
case StepCertConfig:
body = m.certForm.View()
helpMsg = "tab: próximo campo • enter: confirmar • ctrl+c: sair"
}
help := HelpStyle.Render(helpMsg)
v := tea.NewView(fmt.Sprintf("\n%s%s\n\n%s\n\n%s%s\n",
pad, TitleStyle.Render(header),
body,
pad, help,
))
v.AltScreen = true
return v
}
func (m Model) viewCheckDocker() string {
pad := strings.Repeat(" ", padding)
barWidth := 40
filled := int(m.checkProgress * float64(barWidth))
empty := barWidth - filled
bar := ProgressFillStyle.Render(strings.Repeat("█", filled)) +
ProgressEmptyStyle.Render(strings.Repeat("░", empty))
percent := fmt.Sprintf(" %d%%", int(m.checkProgress*100))
var sb strings.Builder
sb.WriteString(pad + "Avaliando instalação do Docker...\n\n")
sb.WriteString(pad + bar + HelpStyle.Render(percent))
if m.checkDockerDone && m.checkProgress == 1 {
found := ""
if m.dockerInstalled {
found = "encontrado"
} else {
found = "não encontrado"
}
sb.WriteString("\n\n" + pad + fmt.Sprintf("Docker %s na máquina. Pressione qualquer tecla para seguir.", found))
}
return sb.String()
}
func (m Model) viewDockerInstall() string {
pad := strings.Repeat(" ", padding)
var sb strings.Builder
sb.WriteString(pad + "Nenhuma versão do Docker encontrada no sistema.\n")
sb.WriteString(pad + "Instale o Docker manualmente e execute este instalador novamente para concluir a configuração.")
return sb.String()
}
func (m Model) viewIPQuestion() string {
pad := strings.Repeat(" ", padding)
var options = []string{"Sim", "Não"}
var sb strings.Builder
sb.WriteString(pad + "Existe IP público disponível para a máquina?\n")
for i, opt := range options {
cursor := " "
text := ""
isSelected := m.cursor == i
if isSelected {
cursor = CursorStyle.Render("> ")
text = CursorStyle.Render(opt)
} else {
text = opt
}
sb.WriteString("\n" + pad + cursor + text)
}
return sb.String()
}