diff options
Diffstat (limited to 'internal/client/client.go')
| -rw-r--r-- | internal/client/client.go | 122 |
1 files changed, 17 insertions, 105 deletions
diff --git a/internal/client/client.go b/internal/client/client.go index 10ca6f2..27301fe 100644 --- a/internal/client/client.go +++ b/internal/client/client.go @@ -3,20 +3,13 @@ package client import ( "context" "crypto/ed25519" - "fmt" "log" - "strings" - "github.com/charmbracelet/bubbles/cursor" - "github.com/charmbracelet/bubbles/textarea" tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/lipgloss" - "github.com/kyren223/eko/internal/client/api" "github.com/kyren223/eko/internal/client/gateway" - "github.com/kyren223/eko/internal/client/ui/messagebox" - "github.com/kyren223/eko/internal/data" - "github.com/kyren223/eko/internal/packet" + "github.com/kyren223/eko/internal/client/ui" + "github.com/kyren223/eko/internal/client/ui/auth" "github.com/kyren223/eko/pkg/assert" ) @@ -33,6 +26,12 @@ func Run() { log.Println("client started") program := tea.NewProgram(initialModel(), tea.WithAltScreen()) assert.AddFlush(BubbleTeaCloser{program}) + defer func() { + if r := recover(); r != nil { + program.Kill() + log.Println("recovered from panic:", r) + } + }() _, privKey, err := ed25519.GenerateKey(nil) assert.NoError(err, "private key gen should not error") @@ -44,116 +43,29 @@ func Run() { } type model struct { - messagebox messagebox.Model - textarea textarea.Model - err error + model tea.Model } func initialModel() model { - ta := textarea.New() - ta.Placeholder = "Send a message..." - ta.Focus() - - ta.Prompt = "┃ " - ta.CharLimit = 280 - - ta.SetWidth(30) - ta.SetHeight(3) - - // Remove cursor line styling - ta.FocusedStyle.CursorLine = lipgloss.NewStyle() - - ta.ShowLineNumbers = false - - ta.KeyMap.InsertNewline.SetEnabled(false) - - return model{ - textarea: ta, - messagebox: messagebox.New(30, 20), - err: nil, - } + return model{auth.New()} } func (m model) Init() tea.Cmd { - return tea.Batch(textarea.Blink, api.GetMessages) + return m.model.Init() } func (m model) View() string { - return fmt.Sprintf( - "%s\n%s", - m.messagebox.View(), - m.textarea.View(), - ) + "" + return m.model.View() } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { - case tea.WindowSizeMsg: - m.messagebox.Viewport.Width = msg.Width - m.messagebox.Viewport.Height = msg.Height - m.textarea.Height() - m.messagebox.Viewport.GotoBottom() - - m.textarea.SetWidth(msg.Width) - log.Println("resized to:", msg.Width, "x", msg.Height) - - var mbCmd, taCmd tea.Cmd - m.messagebox, mbCmd = m.messagebox.Update(msg) - m.textarea, taCmd = m.textarea.Update(msg) - return m, tea.Batch(mbCmd, taCmd) - - case tea.KeyMsg: - switch msg.Type { - case tea.KeyEsc, tea.KeyCtrlC: - return m, tea.Quit - - case tea.KeyEnter: - value := m.textarea.Value() - - content := strings.TrimSpace(value) - if content == "" { - return m, nil - } - m.textarea.Reset() - - return m, api.SendMessage(content) - - default: - var cmd tea.Cmd - m.textarea, cmd = m.textarea.Update(msg) - return m, cmd - } - - case packet.Payload: - switch msg := msg.(type) { - case *packet.Messages: - m.messagebox.SetMessages(msg.Messages) - - var cmd tea.Cmd - m.messagebox, cmd = m.messagebox.Update(msg) - return m, cmd - - default: - return m, nil - } - - case api.AppendMessage: - m.messagebox.AppendMessage(data.Message(msg)) - - var cmd tea.Cmd - m.messagebox, cmd = m.messagebox.Update(msg) - return m, cmd - - case api.UserProfileUpdate: - var cmd tea.Cmd - m.messagebox, cmd = m.messagebox.Update(msg) - return m, cmd - - case cursor.BlinkMsg: + case ui.ModelTransition: + m.model = msg.Model + return m, nil + default: var cmd tea.Cmd - m.textarea, cmd = m.textarea.Update(msg) + m.model, cmd = m.model.Update(msg) return m, cmd - - default: - return m, nil } } |
