mirror of
https://github.com/Kyren223/eko.git
synced 2026-08-29 02:41:31 +00:00
Worked on the UI for the network list
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
14
internal/client/ui/core/state/state.go
Normal file
14
internal/client/ui/core/state/state.go
Normal 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),
|
||||
}
|
||||
Reference in New Issue
Block a user