diff options
| author | Kyren223 <Kyren223@proton.me> | 2024-12-04 18:35:11 +0200 |
|---|---|---|
| committer | Kyren223 <Kyren223@proton.me> | 2024-12-04 18:35:11 +0200 |
| commit | 37cd043920aa92189d9ae19e7631968290e4d352 (patch) | |
| tree | 62282034ca56a52bbe36634d77932beaefa5d0ef /internal/client/ui/messagebox | |
| parent | 567d569dd649cc0b82d6f8890e2bd77b052ebed6 (diff) | |
Started work on basic vim input box
Diffstat (limited to 'internal/client/ui/messagebox')
| -rw-r--r-- | internal/client/ui/messagebox/messagebox.go | 131 |
1 files changed, 0 insertions, 131 deletions
diff --git a/internal/client/ui/messagebox/messagebox.go b/internal/client/ui/messagebox/messagebox.go deleted file mode 100644 index 0728cb1..0000000 --- a/internal/client/ui/messagebox/messagebox.go +++ /dev/null @@ -1,131 +0,0 @@ -package messagebox - -import ( - "slices" - "strings" - "time" - - "github.com/charmbracelet/bubbles/viewport" - tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/lipgloss" - - "github.com/kyren223/eko/internal/client/api" - "github.com/kyren223/eko/internal/data" - "github.com/kyren223/eko/pkg/snowflake" -) - -var ( - senderStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("5")).Bold(true) - timestampStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("#585c62")).Italic(true) -) - -type user struct { - name string - isFetching bool -} - -type Model struct { - Viewport viewport.Model - messages []data.Message - users map[snowflake.ID]user -} - -func New(width, height int) Model { - return Model{ - Viewport: viewport.New(width, height), - messages: nil, - users: make(map[snowflake.ID]user), - } -} - -func (m Model) Init() tea.Cmd { - return api.GetMessages -} - -func (m Model) View() string { - return m.Viewport.View() -} - -func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { - var cmds []tea.Cmd - - for id, user := range m.users { - if !user.isFetching && user.name == "" { - cmds = append(cmds, api.GetUserById(id)) - user.isFetching = true - m.users[id] = user - } - } - - var cmd tea.Cmd - m.Viewport, cmd = m.Viewport.Update(msg) - cmds = append(cmds, cmd) - - switch msg := msg.(type) { - case api.UserProfileUpdate: - m.users[msg.ID] = user{msg.Name, false} - m.UpdateMessages() - } - - return m, tea.Batch(cmds...) -} - -func (m *Model) AppendMessage(message data.Message) { - m.messages = append(m.messages, message) - m.UpdateMessages() -} - -func (m *Model) SetMessages(messages []data.Message) { - m.messages = messages - m.UpdateMessages() -} - -func (m *Model) UpdateMessages() { - for _, message := range m.messages { - if _, exists := m.users[message.SenderID]; !exists { - m.users[message.SenderID] = user{name: "", isFetching: false} - } - } - - m.sortMessages() - m.updateContent() - m.Viewport.GotoBottom() -} - -func (m *Model) sortMessages() { - slices.SortFunc(m.messages, func(a, b data.Message) int { - if a.ID-b.ID < 0 { - return -1 - } else { - return 1 - } - }) -} - -func (m *Model) updateContent() { - if len(m.messages) == 0 { - return - } - - var builder strings.Builder - - for _, message := range m.messages { - sender := m.users[message.SenderID].name - builder.WriteString(senderStyle.Render(sender)) - builder.WriteByte(' ') - - timestamp := timestampFromID(message.ID) - builder.WriteString(timestampStyle.Render(timestamp)) - builder.WriteByte('\n') - - builder.WriteString(message.Content) - builder.WriteByte('\n') - } - - m.Viewport.SetContent(builder.String()[:builder.Len()-1]) -} - -func timestampFromID(id snowflake.ID) string { - localTime := time.UnixMilli(id.Time()) - return localTime.Format("02/01/2006 3:04 PM") -} |
