From 4a0d94e4893cd77a0bb498b355d3e1b3cbeed2df Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Wed, 27 Nov 2024 22:04:55 +0200 Subject: [PATCH] Worked on the UI for the network list --- internal/client/ui/colors/colors.go | 4 + internal/client/ui/core/core.go | 127 ++++++++++-------- .../core/networkcreation/networkcreation.go | 4 +- .../networklist.go} | 58 ++------ internal/client/ui/core/state/state.go | 14 ++ 5 files changed, 105 insertions(+), 102 deletions(-) rename internal/client/ui/core/{networks/networks.go => networklist/networklist.go} (52%) create mode 100644 internal/client/ui/core/state/state.go diff --git a/internal/client/ui/colors/colors.go b/internal/client/ui/colors/colors.go index 67d91fc..bd4e708 100644 --- a/internal/client/ui/colors/colors.go +++ b/internal/client/ui/colors/colors.go @@ -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 diff --git a/internal/client/ui/core/core.go b/internal/client/ui/core/core.go index 1f86121..737029f 100644 --- a/internal/client/ui/core/core.go +++ b/internal/client/ui/core/core.go @@ -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() { diff --git a/internal/client/ui/core/networkcreation/networkcreation.go b/internal/client/ui/core/networkcreation/networkcreation.go index b7f76d4..4575143 100644 --- a/internal/client/ui/core/networkcreation/networkcreation.go +++ b/internal/client/ui/core/networkcreation/networkcreation.go @@ -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 diff --git a/internal/client/ui/core/networks/networks.go b/internal/client/ui/core/networklist/networklist.go similarity index 52% rename from internal/client/ui/core/networks/networks.go rename to internal/client/ui/core/networklist/networklist.go index 5de9f38..7b191e8 100644 --- a/internal/client/ui/core/networks/networks.go +++ b/internal/client/ui/core/networklist/networklist.go @@ -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) { diff --git a/internal/client/ui/core/state/state.go b/internal/client/ui/core/state/state.go new file mode 100644 index 0000000..eeba245 --- /dev/null +++ b/internal/client/ui/core/state/state.go @@ -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), +}