Ver código fonte

Made ui reactive and styled

arianagiroux 4 semanas atrás
pai
commit
125987753c
4 arquivos alterados com 34 adições e 20 exclusões
  1. 1 1
      go.mod
  2. 2 0
      internal/tui/cmds.go
  3. 31 18
      internal/tui/tui.go
  4. 0 1
      main.go

+ 1 - 1
go.mod

@@ -5,13 +5,13 @@ go 1.25.6
 require (
 	github.com/NimbleMarkets/ntcharts v0.4.0
 	github.com/charmbracelet/bubbletea v1.3.10
+	github.com/charmbracelet/lipgloss v1.1.0
 )
 
 require (
 	github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
 	github.com/charmbracelet/bubbles v0.20.0 // indirect
 	github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
-	github.com/charmbracelet/lipgloss v1.1.0 // indirect
 	github.com/charmbracelet/x/ansi v0.10.1 // indirect
 	github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
 	github.com/charmbracelet/x/term v0.2.1 // indirect

+ 2 - 0
internal/tui/cmds.go

@@ -1,7 +1,9 @@
 package tui
 
+// A simple boolean flag sent when the program is ready to poll addresses
 type pollMsg bool
 
+// / A simple error message binding to conform to type [tea.Cmd]
 type errMsg struct{ err error }
 
 func (e errMsg) Error() string { return e.err.Error() }

+ 31 - 18
internal/tui/tui.go

@@ -5,21 +5,23 @@ import (
 
 	"github.com/NimbleMarkets/ntcharts/linechart/streamlinechart"
 	tea "github.com/charmbracelet/bubbletea"
+	"github.com/charmbracelet/lipgloss"
 )
 
 // Bubbletea model
 //
 // BUG(state): how do declare pointer here?
 type Model struct {
+	width     int
 	Addresses []Address // as defined in internal/tui/types.go
 }
 
-func InitialModel(addresses []string, max_results int) Model {
+func InitialModel(addresses []string) Model {
 	var model Model
 	for _, address := range addresses {
 		var addr Address
+		addr.max_results = 10
 		addr.Address = address
-		addr.max_results = max_results
 		model.Addresses = append(model.Addresses, addr)
 	}
 	return model
@@ -30,15 +32,18 @@ func (m Model) Init() tea.Cmd {
 }
 
 func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
-	switch msg.(type) {
+	switch msg := msg.(type) {
 	// if case is KeyMsg (keypress)
+	case tea.WindowSizeMsg:
+		m.width = msg.Width
+		for i, address := range m.Addresses {
+			address.max_results = m.width
+			m.Addresses[i] = address
+		}
+
 	case tea.KeyMsg:
 		return m, tea.Quit
-		// switch msg.String() {
 
-		// case "ctrl+c", "q": // These keys should exit the program.
-		// 	return m, tea.Quit
-		// }
 	case pollMsg:
 		m.Poll()
 	}
@@ -46,22 +51,30 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 }
 
 func (m Model) View() string {
+	var headerStyle = lipgloss.NewStyle().
+		Bold(true).
+		Italic(true)
+
+	var blockStyle = lipgloss.NewStyle().
+		Width(m.width).
+		Align(lipgloss.Center)
+
 	output := "Results:\n\n"
 	for _, address := range m.Addresses {
-		last := address.Last()
-		if last == -1 {
-			output = output + fmt.Sprintf("- %s\tloading...\n\n", address.Address)
+
+		if len(address.results) == 0 {
+			output = output + fmt.Sprintf("%s\tloading...\n\n", headerStyle.Render(address.Address))
 		} else {
-			output = output + fmt.Sprintf("- %s\n\n", address.Address)
-		}
+			output = output + fmt.Sprintf("%s\n\n", blockStyle.Render(headerStyle.Render(address.Address)))
 
-		// Linechart
-		slc := streamlinechart.New(address.max_results, 10)
-		for _, v := range address.results {
-			slc.Push(v)
+			// Linechart
+			slc := streamlinechart.New(m.width, 10)
+			for _, v := range address.results {
+				slc.Push(v)
+			}
+			slc.Draw()
+			output = output + fmt.Sprintf("%s\n\n", slc.View())
 		}
-		slc.Draw()
-		output = output + fmt.Sprintf("%s\n\n", slc.View())
 	}
 
 	return output

+ 0 - 1
main.go

@@ -11,7 +11,6 @@ import (
 func main() {
 	var model = tui.InitialModel( // TODO(argv) set args via argv
 		[]string{"doesntresolve.comdoasdf", "google.ca"},
-		100,
 	)
 
 	p := tea.NewProgram(model)