fix: bad ux
This commit is contained in:
parent
a70ed5a372
commit
5a425b8c60
15 changed files with 791 additions and 463 deletions
|
|
@ -2,42 +2,48 @@ package listdomains
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"sort"
|
||||
|
||||
"git.juancwu.dev/juancwu/porkbacon/internal/porkbun"
|
||||
"git.juancwu.dev/juancwu/porkbacon/internal/ui/messages"
|
||||
"github.com/charmbracelet/bubbles/paginator"
|
||||
"github.com/charmbracelet/bubbles/list"
|
||||
"github.com/charmbracelet/bubbles/spinner"
|
||||
tea "github.com/charmbracelet/bubbletea"
|
||||
"github.com/charmbracelet/lipgloss"
|
||||
)
|
||||
|
||||
type item struct {
|
||||
domain porkbun.Domain
|
||||
}
|
||||
|
||||
func (i item) Title() string { return i.domain.Domain }
|
||||
func (i item) Description() string {
|
||||
return fmt.Sprintf("Status: %s | Expires: %s", i.domain.Status, i.domain.ExpireDate)
|
||||
}
|
||||
func (i item) FilterValue() string { return i.domain.Domain }
|
||||
|
||||
type Model struct {
|
||||
loading bool
|
||||
client *porkbun.Client
|
||||
domains []string
|
||||
paginator paginator.Model
|
||||
spinner spinner.Model
|
||||
stderr string
|
||||
loading bool
|
||||
client *porkbun.Client
|
||||
list list.Model
|
||||
spinner spinner.Model
|
||||
stderr string
|
||||
}
|
||||
|
||||
func New(client *porkbun.Client) Model {
|
||||
p := paginator.New()
|
||||
p.Type = paginator.Dots
|
||||
p.PerPage = 1
|
||||
p.ActiveDot = lipgloss.NewStyle().Foreground(lipgloss.AdaptiveColor{Light: "235", Dark: "252"}).Render("•")
|
||||
p.InactiveDot = lipgloss.NewStyle().Foreground(lipgloss.AdaptiveColor{Light: "250", Dark: "238"}).Render("•")
|
||||
l := list.New([]list.Item{}, list.NewDefaultDelegate(), 0, 0)
|
||||
l.Title = "My Domains"
|
||||
l.SetShowHelp(true)
|
||||
|
||||
s := spinner.New()
|
||||
s.Spinner = spinner.Dot
|
||||
s.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("205"))
|
||||
|
||||
return Model{
|
||||
loading: false,
|
||||
client: client,
|
||||
domains: nil,
|
||||
paginator: p,
|
||||
spinner: s,
|
||||
loading: false,
|
||||
client: client,
|
||||
list: l,
|
||||
spinner: s,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -47,46 +53,59 @@ func (m Model) Init() tea.Cmd {
|
|||
|
||||
func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
var cmd tea.Cmd
|
||||
var cmds []tea.Cmd
|
||||
|
||||
switch msg := msg.(type) {
|
||||
case tea.KeyMsg:
|
||||
if !m.loading && msg.String() == "esc" {
|
||||
m.loading = false
|
||||
m.domains = nil
|
||||
return m, func() tea.Msg {
|
||||
return messages.SwitchPageMsg{Page: messages.PageMenu}
|
||||
}
|
||||
}
|
||||
case tea.WindowSizeMsg:
|
||||
m.list.SetSize(msg.Width, msg.Height)
|
||||
|
||||
if len(m.domains) > 0 {
|
||||
m.paginator, cmd = m.paginator.Update(msg)
|
||||
return m, cmd
|
||||
case tea.KeyMsg:
|
||||
if m.loading {
|
||||
break
|
||||
}
|
||||
if msg.String() == "enter" {
|
||||
if i, ok := m.list.SelectedItem().(item); ok {
|
||||
return m, func() tea.Msg {
|
||||
return messages.DomainSelectedMsg{Domain: &i.domain}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
case messages.ListDomainsMsg:
|
||||
m.loading = true
|
||||
m.domains = nil
|
||||
return m, tea.Batch(listDomains(m.client), m.spinner.Tick)
|
||||
cmds = append(cmds, listDomains(m.client), m.spinner.Tick)
|
||||
return m, tea.Batch(cmds...)
|
||||
|
||||
case *porkbun.DomainListAllResponse:
|
||||
m.loading = false
|
||||
var items []list.Item
|
||||
for _, domain := range msg.Domains {
|
||||
m.domains = append(m.domains, renderDomain(&domain))
|
||||
items = append(items, item{domain: domain})
|
||||
}
|
||||
m.paginator.SetTotalPages(len(m.domains))
|
||||
m.paginator.Page = 0
|
||||
// Sort by domain name
|
||||
sort.Slice(items, func(i, j int) bool {
|
||||
return items[i].(item).domain.Domain < items[j].(item).domain.Domain
|
||||
})
|
||||
|
||||
cmd = m.list.SetItems(items)
|
||||
cmds = append(cmds, cmd)
|
||||
|
||||
case messages.ErrorMsg:
|
||||
m.stderr = fmt.Sprintf("Error: %v", msg)
|
||||
m.loading = false
|
||||
return m, nil
|
||||
}
|
||||
|
||||
if m.loading {
|
||||
m.spinner, cmd = m.spinner.Update(msg)
|
||||
return m, cmd
|
||||
cmds = append(cmds, cmd)
|
||||
return m, tea.Batch(cmds...)
|
||||
}
|
||||
|
||||
return m, nil
|
||||
m.list, cmd = m.list.Update(msg)
|
||||
cmds = append(cmds, cmd)
|
||||
|
||||
return m, tea.Batch(cmds...)
|
||||
}
|
||||
|
||||
func (m Model) View() string {
|
||||
|
|
@ -98,11 +117,7 @@ func (m Model) View() string {
|
|||
return fmt.Sprintf("\n\n %s Loading... press ctl+c to quit\n\n", m.spinner.View())
|
||||
}
|
||||
|
||||
if len(m.domains) > 0 {
|
||||
return fmt.Sprintf("%s\n\n%s\n\n(Press Esc to go back, arrows to navigate)", m.domains[m.paginator.Page], m.paginator.View())
|
||||
}
|
||||
|
||||
return "Uhh.. This is awkward... Press Esc to go back."
|
||||
return m.list.View()
|
||||
}
|
||||
|
||||
func listDomains(client *porkbun.Client) tea.Cmd {
|
||||
|
|
@ -115,25 +130,3 @@ func listDomains(client *porkbun.Client) tea.Cmd {
|
|||
return resp
|
||||
}
|
||||
}
|
||||
|
||||
func renderDomain(item *porkbun.Domain) string {
|
||||
var b strings.Builder
|
||||
b.WriteString("Domain: " + item.Domain + "\n")
|
||||
b.WriteString("Status: " + item.Status + "\n")
|
||||
b.WriteString("Create Date: " + item.CreateDate + "\n")
|
||||
b.WriteString("Expire Date: " + item.ExpireDate + "\n")
|
||||
b.WriteString("Security Lock: " + item.SecurityLock + "\n")
|
||||
b.WriteString("Whois Privacy: " + item.WhoIsPrivacy + "\n")
|
||||
b.WriteString(fmt.Sprintln("Auto Renew:", item.AutoRenew))
|
||||
b.WriteString(fmt.Sprintln("Not Local:", item.NotLocal))
|
||||
if len(item.Labels) > 0 {
|
||||
b.WriteString("Labels:\n")
|
||||
}
|
||||
for i, label := range item.Labels {
|
||||
b.WriteString("=> " + label.Title)
|
||||
if i < len(item.Labels)-1 {
|
||||
b.WriteString("\n")
|
||||
}
|
||||
}
|
||||
return b.String()
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue