diff options
| author | Kyren223 <Kyren223@proton.me> | 2024-12-23 15:17:08 +0200 |
|---|---|---|
| committer | Kyren223 <Kyren223@proton.me> | 2024-12-23 15:17:08 +0200 |
| commit | 08f21ff857ec8190c74847b984bab43778193954 (patch) | |
| tree | ada8f01e78c53b86ab9487cfd665234ea4fa7df9 /internal/client/ui/core/chat | |
| parent | 3072e921d6f7da0f148157a7315dfe2e046c3a8f (diff) | |
Reimplemented message rendering by traversing backwards
Diffstat (limited to 'internal/client/ui/core/chat')
| -rw-r--r-- | internal/client/ui/core/chat/chat.go | 128 |
1 files changed, 9 insertions, 119 deletions
diff --git a/internal/client/ui/core/chat/chat.go b/internal/client/ui/core/chat/chat.go index 2179285..26cef9d 100644 --- a/internal/client/ui/core/chat/chat.go +++ b/internal/client/ui/core/chat/chat.go @@ -101,7 +101,7 @@ func (m Model) View() string { messages := m.renderMessages(messagesHeight) - result := messages + "\n" + messagebox + result := messages + messagebox return result } @@ -245,58 +245,6 @@ func (m *Model) RestoreAfterSwitch() tea.Cmd { return nil } -func (m *Model) renderMessage(message data.Message, width int, header bool, selected bool) string { - metadata := "" - if header && m.networkIndex != -1 { - var member *data.GetNetworkMembersRow = nil - network := state.State.Networks[m.networkIndex] - for _, networkMember := range network.Members { - if networkMember.User.ID == message.SenderID { - member = &networkMember - } - } - assert.NotNil(member, "user should always exist") - - senderStyle := NormalMemberStyle - if network.OwnerID == member.User.ID { - senderStyle = OwnerMemberStyle - } else if member.IsAdmin { - senderStyle = AdminMemberStyle - } - - now := time.Now() - unixTime := time.UnixMilli(message.ID.Time()).Local() - - var datetime string - if unixTime.Year() == now.Year() && unixTime.YearDay() == now.YearDay() { - datetime = " Today at " + unixTime.Format("3:04 PM") - } else if unixTime.Year() == now.Year() && unixTime.YearDay() == now.YearDay()-1 { - datetime = " Yesterday at " + unixTime.Format("3:04 PM") - } else { - datetime = unixTime.Format(" 02/01/2006 3:04 PM") - } - - dateTimeStyle := DateTimeStyle - if selected { - dateTimeStyle = dateTimeStyle.Background(colors.BackgroundDim) - senderStyle = senderStyle.Background(colors.BackgroundDim) - } - - sender := senderStyle.Render(member.User.Name) - sentDatetime := dateTimeStyle.Render(datetime) - metadata = Padding + sender + " " + sentDatetime + Padding + "\n" - } - - messageStyle := lipgloss.NewStyle().Width(width). - PaddingLeft(PaddingCount + 2).PaddingRight(PaddingCount) - if selected { - messageStyle = messageStyle.Background(colors.BackgroundDim) - } - content := messageStyle.Render(message.Content) - - return metadata + content -} - func (m *Model) renderMessageBox() string { var builder strings.Builder @@ -404,6 +352,7 @@ func (m *Model) renderMessages(height int) string { } renderedGroup := m.renderMessageGroup(group) + group = []data.Message{} renderedGroups = append(renderedGroups, renderedGroup) remainingHeight -= lipgloss.Height(renderedGroup) @@ -411,79 +360,20 @@ func (m *Model) renderMessages(height int) string { }) // We ran out of messages, so let's render the last group - if remainingHeight > 0 { + if remainingHeight > 0 && len(group) != 0 { renderedGroup := m.renderMessageGroup(group) renderedGroups = append(renderedGroups, renderedGroup) + remainingHeight -= lipgloss.Height(renderedGroup) } } - // selectedStart := -1 - // selectedMessage := "" - // _ = selectedMessage - - // const timeGap = 7 * 60 * 1000 // 7 minutes in millis - // initialTime := int64(0) - // previousSender := snowflake.ID(0) - // - // count := btree.Len() + var builder strings.Builder - // btree.Ascend(func(message data.Message) bool { - // count-- - // - // outsideTimeRange := message.ID.Time()-timeGap > initialTime - // header := outsideTimeRange || previousSender != message.SenderID - // - // if header { - // initialTime = message.ID.Time() - // previousSender = message.SenderID - // builder.WriteByte('\n') - // remains -= 1 - // - // } - // - // if m.index == count { - // selectedStart = height - remains - // var b strings.Builder - // - // DateTimeStyle = DateTimeStyle.Background(SelectedBackground.GetBackground()) - // remains -= m.renderMessage(message, &b, header) - // DateTimeStyle = DateTimeStyle.UnsetBackground() - // - // selectedMessage = b.String() - // builder.WriteString(b.String()) - // } else { - // remains -= m.renderMessage(message, &builder, header) - // } - // - // return true - // }) - // - // messages := builder.String() - // actualMessagesHeight := lipgloss.Height(messages) - // if actualMessagesHeight < height { - // diff := height - actualMessagesHeight - // messages = strings.Repeat("\n", diff) + messages - // if selectedStart != -1 { - // selectedStart += diff - // } - // } else if actualMessagesHeight > height { - // diff := actualMessagesHeight - height - // newlines := 0 - // index := -1 - // for i, c := range messages { - // if newlines == diff { - // index = i - // break - // } - // if c == '\n' { - // newlines++ - // } - // } - // assert.Assert(index != -1, "must always have enough newlines if it's greater") - // messages = messages[index:] - // } + // Add blank newline to fill any remaining height + for i := 0; i < remainingHeight; i++ { + builder.WriteByte('\n') + } - var builder strings.Builder for i := len(renderedGroups) - 1; i >= 0; i-- { builder.WriteString(renderedGroups[i]) builder.WriteByte('\n') // Gap between each group |
