diff --git a/frontend/src/features/conversation/list/ConversationListItem.vue b/frontend/src/features/conversation/list/ConversationListItem.vue index 364e324..66344c5 100644 --- a/frontend/src/features/conversation/list/ConversationListItem.vue +++ b/frontend/src/features/conversation/list/ConversationListItem.vue @@ -39,10 +39,14 @@
-

- +

+ {{ trimmedLastMessage }} -

+
{ if (listConversation) { listConversation.last_message = message.content listConversation.last_message_at = message.created_at + listConversation.last_message_sender = message.sender_type if (listConversation.uuid !== conversation?.data?.uuid) { listConversation.unread_message_count += 1 } } else { + // Conversation is not in the list, fetch the first page of the conversations list as this updated conversation might be at the top. fetchFirstPageConversations() } } diff --git a/frontend/src/websocket.js b/frontend/src/websocket.js index 0f1d690..79fcdd8 100644 --- a/frontend/src/websocket.js +++ b/frontend/src/websocket.js @@ -55,6 +55,7 @@ export class WebSocketClient { const data = JSON.parse(event.data) const handlers = { + // On new message, update the message in the conversation list and in the currently opened conversation. [WS_EVENT.NEW_MESSAGE]: () => { this.convStore.updateConversationList(data.data) this.convStore.updateConversationMessage(data.data) diff --git a/internal/conversation/conversation.go b/internal/conversation/conversation.go index d8f7493..3379308 100644 --- a/internal/conversation/conversation.go +++ b/internal/conversation/conversation.go @@ -399,8 +399,8 @@ func (c *Manager) ActiveUserConversationsCount(userID int) (int, error) { } // UpdateConversationLastMessage updates the last message details for a conversation. -func (c *Manager) UpdateConversationLastMessage(convesationID int, conversationUUID, lastMessage string, lastMessageAt time.Time) error { - if _, err := c.q.UpdateConversationLastMessage.Exec(convesationID, conversationUUID, lastMessage, lastMessageAt); err != nil { +func (c *Manager) UpdateConversationLastMessage(conversation int, conversationUUID, lastMessage, lastMessageSenderType string, lastMessageAt time.Time) error { + if _, err := c.q.UpdateConversationLastMessage.Exec(conversation, conversationUUID, lastMessage, lastMessageSenderType, lastMessageAt); err != nil { c.lo.Error("error updating conversation last message", "error", err) return err } diff --git a/internal/conversation/message.go b/internal/conversation/message.go index 6644fca..8bbafb4 100644 --- a/internal/conversation/message.go +++ b/internal/conversation/message.go @@ -356,10 +356,10 @@ func (m *Manager) InsertMessage(message *models.Message) error { } // Update conversation last message details in conversation metadata. - m.UpdateConversationLastMessage(message.ConversationID, message.ConversationUUID, message.TextContent, message.CreatedAt) + m.UpdateConversationLastMessage(message.ConversationID, message.ConversationUUID, message.TextContent, message.SenderType, message.CreatedAt) // Broadcast new message. - m.BroadcastNewMessage(message.ConversationUUID, message.TextContent, message.UUID, message.CreatedAt.Format(time.RFC3339), message.Type, message.Private) + m.BroadcastNewMessage(message) return nil } diff --git a/internal/conversation/models/models.go b/internal/conversation/models/models.go index 37ed4bb..4910bcc 100644 --- a/internal/conversation/models/models.go +++ b/internal/conversation/models/models.go @@ -56,6 +56,7 @@ type Conversation struct { CustomAttributes pq.StringArray `db:"custom_attributes" json:"custom_attributes"` LastMessageAt null.Time `db:"last_message_at" json:"last_message_at"` LastMessage null.String `db:"last_message" json:"last_message"` + LastMessageSender null.String `db:"last_message_sender" json:"last_message_sender"` Contact umodels.User `db:"contact" json:"contact"` SLAPolicyID null.Int `db:"sla_policy_id" json:"sla_policy_id"` SlaPolicyName null.String `db:"sla_policy_name" json:"sla_policy_name"` diff --git a/internal/conversation/queries.sql b/internal/conversation/queries.sql index 571ef40..42e428d 100644 --- a/internal/conversation/queries.sql +++ b/internal/conversation/queries.sql @@ -47,6 +47,7 @@ SELECT conversations.subject, conversations.last_message, conversations.last_message_at, + conversations.last_message_sender, conversations.next_sla_deadline_at, conversations.priority_id, ( @@ -197,7 +198,7 @@ SET assignee_last_seen_at = now(), WHERE uuid = $1; -- name: update-conversation-last-message -UPDATE conversations SET last_message = $3, last_message_at = $4 WHERE CASE +UPDATE conversations SET last_message = $3, last_message_sender = $4, last_message_at = $5, updated_at = NOW() WHERE CASE WHEN $1 > 0 THEN id = $1 ELSE uuid = $2 END diff --git a/internal/conversation/ws.go b/internal/conversation/ws.go index 64ace23..7a6aaa9 100644 --- a/internal/conversation/ws.go +++ b/internal/conversation/ws.go @@ -2,24 +2,26 @@ package conversation import ( "encoding/json" + "time" + cmodels "github.com/abhinavxd/libredesk/internal/conversation/models" wsmodels "github.com/abhinavxd/libredesk/internal/ws/models" ) // BroadcastNewMessage broadcasts a new message to all users. -func (m *Manager) BroadcastNewMessage(conversationUUID, content, messageUUID, lastMessageAt, typ string, private bool) { - message := wsmodels.Message{ +func (m *Manager) BroadcastNewMessage(message *cmodels.Message) { + m.broadcastToUsers([]int{}, wsmodels.Message{ Type: wsmodels.MessageTypeNewMessage, Data: map[string]interface{}{ - "conversation_uuid": conversationUUID, - "content": content, - "created_at": lastMessageAt, - "uuid": messageUUID, - "private": private, - "type": typ, + "conversation_uuid": message.ConversationUUID, + "content": message.TextContent, + "created_at": message.CreatedAt.Format(time.RFC3339), + "uuid": message.UUID, + "private": message.Private, + "type": message.Type, + "sender_type": message.SenderType, }, - } - m.broadcastToUsers([]int{}, message) + }) } // BroadcastMessageUpdate broadcasts a message update to all users. diff --git a/schema.sql b/schema.sql index 12ba3f6..7bdbd0d 100644 --- a/schema.sql +++ b/schema.sql @@ -209,6 +209,7 @@ CREATE TABLE conversations ( waiting_since TIMESTAMPTZ NULL, last_message_at TIMESTAMPTZ NULL, last_message TEXT NULL, + last_message_sender message_sender_type NULL, next_sla_deadline_at TIMESTAMPTZ NULL, snoozed_until TIMESTAMPTZ NULL );