Worked on the UI for the network list

This commit is contained in:
2024-11-27 22:04:55 +02:00
parent 11e523bb89
commit 4a0d94e489
5 changed files with 105 additions and 102 deletions

View File

@@ -11,11 +11,15 @@ var (
LightBlue = lipgloss.Color("#5874FF")
Blue = lipgloss.Color("#0029f5")
DarkCyan = lipgloss.Color("#007E8A")
DarkerCyan = lipgloss.Color("#005d66")
DarkMidnightBlue = lipgloss.Color("#1E1E2E")
Turquoise = lipgloss.Color("#54D7A9")
Red = lipgloss.Color("#F16265")
White = lipgloss.Color("#FFFFFF")
Black = lipgloss.Color("#000000")
Green = lipgloss.Color("#46d46c")
Purple = lipgloss.Color("#BB91F0")
DarkPurple = lipgloss.Color("#87123d")
Background = DarkMidnightBlue
Error = Red

View File

@@ -12,8 +12,10 @@ import (
"github.com/kyren223/eko/internal/client/gateway"
"github.com/kyren223/eko/internal/client/ui"
"github.com/kyren223/eko/internal/client/ui/core/networkcreation"
"github.com/kyren223/eko/internal/client/ui/core/networks"
"github.com/kyren223/eko/internal/client/ui/core/networklist"
"github.com/kyren223/eko/internal/client/ui/core/state"
"github.com/kyren223/eko/internal/client/ui/loadscreen"
"github.com/kyren223/eko/internal/packet"
"github.com/kyren223/eko/pkg/snowflake"
)
@@ -29,11 +31,11 @@ type Model struct {
name string
privKey ed25519.PrivateKey
networks networks.Model
loading loadscreen.Model
timer timer.Model
timeout time.Duration
connected bool
networkList networklist.Model
loading loadscreen.Model
timer timer.Model
timeout time.Duration
connected bool
id snowflake.ID
@@ -42,13 +44,13 @@ type Model struct {
func New(privKey ed25519.PrivateKey, name string) Model {
return Model{
name: name,
privKey: privKey,
networks: networks.New(),
loading: loadscreen.New(connectingToServer),
timer: newTimer(initialTimeout),
timeout: initialTimeout,
connected: false,
name: name,
privKey: privKey,
networkList: networklist.New(),
loading: loadscreen.New(connectingToServer),
timer: newTimer(initialTimeout),
timeout: initialTimeout,
connected: false,
}
}
@@ -61,7 +63,7 @@ func (m Model) View() string {
return m.loading.View()
}
result := m.networks.View()
result := m.networkList.View()
result = lipgloss.Place(
ui.Width, ui.Height,
@@ -80,50 +82,65 @@ func (m Model) View() string {
}
func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
if !m.connected {
switch msg := msg.(type) {
case gateway.ConnectionEstablished:
m.id = snowflake.ID(msg)
m.connected = true
m.timeout = initialTimeout
return m, m.timer.Stop()
case gateway.ConnectionFailed:
m.timer = newTimer(m.timeout)
m.updateLoadScreenContent()
return m, m.timer.Start()
case timer.TimeoutMsg:
m.timeout = min(m.timeout*2, time.Minute)
m.loading.SetContent(connectingToServer)
return m, gateway.Connect(m.privKey, connectionTimeout)
case timer.StartStopMsg:
var cmd tea.Cmd
m.timer, cmd = m.timer.Update(msg)
return m, cmd
case timer.TickMsg:
m.updateLoadScreenContent()
var cmd tea.Cmd
m.timer, cmd = m.timer.Update(msg)
return m, cmd
case spinner.TickMsg:
var loadscreenCmd tea.Cmd
m.loading, loadscreenCmd = m.loading.Update(msg)
return m, loadscreenCmd
default:
return m, nil
}
if m.connected {
cmd := m.updateConnected(msg)
return m, cmd
} else {
cmd := m.updateNotConnected(msg)
return m, cmd
}
}
func (m *Model) updateNotConnected(msg tea.Msg) tea.Cmd {
switch msg := msg.(type) {
case gateway.ConnectionEstablished:
m.id = snowflake.ID(msg)
m.connected = true
m.timeout = initialTimeout
return m.timer.Stop()
case gateway.ConnectionFailed:
m.timer = newTimer(m.timeout)
m.updateLoadScreenContent()
return m.timer.Start()
case timer.TimeoutMsg:
m.timeout = min(m.timeout*2, time.Minute)
m.loading.SetContent(connectingToServer)
return gateway.Connect(m.privKey, connectionTimeout)
case timer.StartStopMsg:
var cmd tea.Cmd
m.timer, cmd = m.timer.Update(msg)
return cmd
case timer.TickMsg:
m.updateLoadScreenContent()
var cmd tea.Cmd
m.timer, cmd = m.timer.Update(msg)
return cmd
case spinner.TickMsg:
var loadscreenCmd tea.Cmd
m.loading, loadscreenCmd = m.loading.Update(msg)
return loadscreenCmd
default:
return nil
}
}
func (m *Model) updateConnected(msg tea.Msg) tea.Cmd {
switch msg := msg.(type) {
case gateway.ConnectionLost:
m.connected = false
m.timeout = initialTimeout
return m, tea.Batch(gateway.Connect(m.privKey, connectionTimeout), m.loading.Init())
return tea.Batch(gateway.Connect(m.privKey, connectionTimeout), m.loading.Init())
case *packet.NetworksInfo:
for _, network := range msg.Networks {
state.State.Networks[network.ID] = network
}
case ui.QuitMsg:
gateway.Disconnect()
@@ -148,19 +165,19 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
if cmd != nil {
m.networkCreationPopup = nil
}
return m, cmd
return cmd
}
default:
if m.networkCreationPopup != nil {
popup, cmd := m.networkCreationPopup.Update(msg)
m.networkCreationPopup = &popup
return m, cmd
return cmd
}
}
}
return m, nil
return nil
}
func (m *Model) updateLoadScreenContent() {

View File

@@ -9,7 +9,7 @@ import (
"github.com/charmbracelet/lipgloss"
"github.com/kyren223/eko/internal/client/gateway"
"github.com/kyren223/eko/internal/client/ui/colors"
"github.com/kyren223/eko/internal/client/ui/core/networks"
"github.com/kyren223/eko/internal/client/ui/core/networklist"
"github.com/kyren223/eko/internal/client/ui/field"
"github.com/kyren223/eko/internal/client/ui/layouts/flex"
"github.com/kyren223/eko/internal/packet"
@@ -156,7 +156,7 @@ func (m Model) Init() tea.Cmd {
func (m Model) View() string {
name := m.name.View()
iconPreview := networks.IconStyle(m.lastFg, m.lastBg).Render(m.icon.Value())
iconPreview := networklist.IconStyle(m.lastFg, m.lastBg).Render(m.icon.Value())
iconPreview = lipgloss.NewStyle().Width(m.nameWidth).Align(lipgloss.Center).Render(iconPreview)
color := colors.Gray

View File

@@ -1,4 +1,4 @@
package networks
package networklist
import (
"strings"
@@ -6,7 +6,8 @@ import (
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
"github.com/kyren223/eko/internal/client/ui"
"github.com/kyren223/eko/internal/data"
"github.com/kyren223/eko/internal/client/ui/colors"
"github.com/kyren223/eko/internal/client/ui/core/state"
)
var (
@@ -14,53 +15,18 @@ var (
partialIconStyle = lipgloss.NewStyle().Width(6).Height(3).PaddingTop(1).Margin(0, 1).
Align(lipgloss.Center).
Border(lipgloss.ThickBorder(), false, false)
networks = []string{
"󰜈 ",
" ",
"Kr",
" ",
// "Test",
// "██████\n██████\n██████",
// " ▄▄▄▄ \n █ █ \n ▀▀▀▀ ",
// " \n 󰜈 \n ",
// "Hmm",
// "Another",
}
reverse = lipgloss.NewStyle().Foreground(lipgloss.Color("#20999D"))
// Render("")
label1 = lipgloss.NewStyle().
Background(lipgloss.Color("#20999D")).Foreground(lipgloss.Color("#000000")).
Padding(0, 1).
Bold(true).
Render("󰜈")
label2 = reverse.Render("") + label1 + reverse.Render("")
label3 = ""
label4 = lipgloss.NewStyle().
Foreground(lipgloss.Color("#20999D")).
Bold(true).
Render("󰜈")
name = lipgloss.NewStyle().
Bold(true).
Render("Kyren223")
user = lipgloss.JoinHorizontal(lipgloss.Center, label4, " ", name)
trustedUsersButton = IconStyle(lipgloss.Color(colors.Turquoise), lipgloss.Color(colors.DarkerCyan)).
MarginBottom(1).Render(" ")
)
func IconStyle(fg, bg lipgloss.Color) lipgloss.Style {
return partialIconStyle.Foreground(fg).Background(bg)
}
type Model struct {
networks []string
a data.Network
}
type Model struct{}
func New() Model {
return Model{
networks: networks,
}
return Model{}
}
func (m Model) Init() tea.Cmd {
@@ -74,9 +40,11 @@ func (m Model) View() string {
// top := strings.Repeat(border.Top, 6)
// builder.WriteString(fmt.Sprintf("%s%s%s\n", border.TopLeft, top, border.TopRight))
builder.WriteString("\n")
for _, network := range m.networks {
builder.WriteString(IconStyle(lipgloss.Color("#ffbf00"), lipgloss.Color("#4a3d5c")).
MarginBottom(1).Render(network))
builder.WriteString(trustedUsersButton)
builder.WriteString("\n")
for _, network := range state.State.Networks {
builder.WriteString(IconStyle(lipgloss.Color(network.FgHexColor), lipgloss.Color(network.BgHexColor)).
MarginBottom(1).Render(network.Icon))
builder.WriteString("\n")
}
// bottom := strings.Repeat(border.Bottom, 6)
@@ -87,7 +55,7 @@ func (m Model) View() string {
sep := lipgloss.NewStyle().Border(lipgloss.ThickBorder(), false, true, false, false).Height(ui.Height).Width(0)
result = lipgloss.JoinHorizontal(lipgloss.Top, result, sep.Render(""))
return result + user
return result
}
func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {

View File

@@ -0,0 +1,14 @@
package state
import (
"github.com/kyren223/eko/internal/packet"
"github.com/kyren223/eko/pkg/snowflake"
)
type state struct {
Networks map[snowflake.ID]packet.FullNetwork
}
var State state = state{
Networks: make(map[snowflake.ID]packet.FullNetwork),
}