121 lines
3 KiB
Go
121 lines
3 KiB
Go
package ui
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"git.juancwu.dev/juancwu/porkbacon/internal/config"
|
|
"git.juancwu.dev/juancwu/porkbacon/internal/ui/messages"
|
|
"git.juancwu.dev/juancwu/porkbacon/internal/ui/pages/dns"
|
|
"git.juancwu.dev/juancwu/porkbacon/internal/ui/pages/domaindetails"
|
|
"git.juancwu.dev/juancwu/porkbacon/internal/ui/pages/domainmenu"
|
|
"git.juancwu.dev/juancwu/porkbacon/internal/ui/pages/listdomains"
|
|
"git.juancwu.dev/juancwu/porkbacon/internal/ui/pages/login"
|
|
tea "github.com/charmbracelet/bubbletea"
|
|
)
|
|
|
|
type MainModel struct {
|
|
currentPage messages.Page
|
|
pages map[messages.Page]tea.Model
|
|
width int
|
|
height int
|
|
}
|
|
|
|
func New() MainModel {
|
|
cfg, err := config.Load()
|
|
if err != nil {
|
|
fmt.Printf("Error loading config: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
pages := make(map[messages.Page]tea.Model)
|
|
pages[messages.PageLogin] = login.New(cfg)
|
|
|
|
return MainModel{
|
|
currentPage: messages.PageLogin,
|
|
pages: pages,
|
|
}
|
|
}
|
|
|
|
func (m MainModel) Init() tea.Cmd {
|
|
return m.pages[messages.PageLogin].Init()
|
|
}
|
|
|
|
func (m MainModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|
var cmd tea.Cmd
|
|
var cmds []tea.Cmd
|
|
|
|
switch msg := msg.(type) {
|
|
case tea.KeyMsg:
|
|
if msg.String() == "ctrl+c" {
|
|
return m, tea.Quit
|
|
}
|
|
case tea.WindowSizeMsg:
|
|
m.width = msg.Width
|
|
m.height = msg.Height
|
|
for k, p := range m.pages {
|
|
m.pages[k], _ = p.Update(msg)
|
|
}
|
|
|
|
case messages.SwitchPageMsg:
|
|
m.currentPage = msg.Page
|
|
return m, nil
|
|
|
|
case messages.SessionReadyMsg:
|
|
m.pages[messages.PageListDomains] = listdomains.New(msg.Client)
|
|
m.pages[messages.PageDomainMenu] = domainmenu.New()
|
|
m.pages[messages.PageDomainDetails] = domaindetails.New()
|
|
m.pages[messages.PageDNSList] = dns.NewListModel(msg.Client)
|
|
|
|
if m.width > 0 && m.height > 0 {
|
|
for k, p := range m.pages {
|
|
m.pages[k], _ = p.Update(tea.WindowSizeMsg{Width: m.width, Height: m.height})
|
|
}
|
|
}
|
|
|
|
// Initial flow: Go to ListDomains and trigger load
|
|
m.currentPage = messages.PageListDomains
|
|
return m, func() tea.Msg { return messages.ListDomainsMsg{} }
|
|
|
|
case messages.DomainSelectedMsg:
|
|
// Broadcast to DomainMenu and DomainDetails and DNSList
|
|
// Then switch to DomainMenu
|
|
// We need to update those models with the message
|
|
for _, pageKey := range []messages.Page{messages.PageDomainMenu, messages.PageDomainDetails, messages.PageDNSList} {
|
|
if p, ok := m.pages[pageKey]; ok {
|
|
var c tea.Cmd
|
|
m.pages[pageKey], c = p.Update(msg)
|
|
if c != nil {
|
|
cmds = append(cmds, c)
|
|
}
|
|
}
|
|
}
|
|
m.currentPage = messages.PageDomainMenu
|
|
return m, tea.Batch(cmds...)
|
|
|
|
case messages.RefreshMsg:
|
|
page, ok := m.pages[m.currentPage]
|
|
if ok {
|
|
var c tea.Cmd
|
|
m.pages[m.currentPage], c = page.Update(msg)
|
|
cmds = append(cmds, c)
|
|
}
|
|
return m, tea.Batch(cmds...)
|
|
}
|
|
|
|
page, ok := m.pages[m.currentPage]
|
|
if ok {
|
|
m.pages[m.currentPage], cmd = page.Update(msg)
|
|
cmds = append(cmds, cmd)
|
|
}
|
|
|
|
return m, tea.Batch(cmds...)
|
|
}
|
|
|
|
func (m MainModel) View() string {
|
|
page, ok := m.pages[m.currentPage]
|
|
if ok {
|
|
return page.View()
|
|
}
|
|
return "Unknown Page"
|
|
}
|