diff --git a/platforms/blabsy/src/components/chat/chat-window.tsx b/platforms/blabsy/src/components/chat/chat-window.tsx index 5f4b165f..c8cdd843 100644 --- a/platforms/blabsy/src/components/chat/chat-window.tsx +++ b/platforms/blabsy/src/components/chat/chat-window.tsx @@ -51,8 +51,8 @@ function MessageItem({
([^<]+)<\/a>/g, - '$2' + /]*)>([^<]+)<\/a>/g, + '$3' ) }} /> @@ -119,8 +119,8 @@ function MessageItem({ className='break-words whitespace-pre-wrap' dangerouslySetInnerHTML={{ __html: displayText.replace( - /([^<]+)<\/a>/g, - '$2' + /]*)>([^<]+)<\/a>/g, + '$3' ) }} /> diff --git a/platforms/blabsy/src/lib/context/chat-context.tsx b/platforms/blabsy/src/lib/context/chat-context.tsx index 8b61be18..caaf4575 100644 --- a/platforms/blabsy/src/lib/context/chat-context.tsx +++ b/platforms/blabsy/src/lib/context/chat-context.tsx @@ -103,33 +103,32 @@ export function ChatContextProvider({ (snapshot) => { const chatsData = snapshot.docs.map((doc) => doc.data()); - // Sort chats by last message timestamp (most recent first) + // Sort chats by most recent activity (most recent first) + // Priority: lastMessage timestamp > updatedAt > createdAt const sortedChats = chatsData.sort((a, b) => { - // If both have lastMessage, sort by timestamp - if (a.lastMessage?.timestamp && b.lastMessage?.timestamp) { - return ( - b.lastMessage.timestamp.toMillis() - - a.lastMessage.timestamp.toMillis() - ); - } - // If only one has lastMessage, prioritize it - if (a.lastMessage?.timestamp && !b.lastMessage?.timestamp) - return -1; - if (!a.lastMessage?.timestamp && b.lastMessage?.timestamp) - return 1; - // If neither has lastMessage, sort by updatedAt (with null checks) - if (a.updatedAt && b.updatedAt) { - return b.updatedAt.toMillis() - a.updatedAt.toMillis(); - } - // If only one has updatedAt, prioritize it - if (a.updatedAt && !b.updatedAt) return -1; - if (!a.updatedAt && b.updatedAt) return 1; - // If both are null, sort by createdAt as fallback - if (a.createdAt && b.createdAt) { - return b.createdAt.toMillis() - a.createdAt.toMillis(); - } - // If all else fails, maintain order - return 0; + // Get the most recent activity timestamp for each chat + const getMostRecentTimestamp = (chat: typeof a): number => { + // Priority 1: lastMessage timestamp (most recent activity) + if (chat.lastMessage?.timestamp) { + return chat.lastMessage.timestamp.toMillis(); + } + // Priority 2: updatedAt (for updated chats without messages) + if (chat.updatedAt) { + return chat.updatedAt.toMillis(); + } + // Priority 3: createdAt (for new chats) + if (chat.createdAt) { + return chat.createdAt.toMillis(); + } + // Fallback: 0 for chats with no timestamps + return 0; + }; + + const aTimestamp = getMostRecentTimestamp(a); + const bTimestamp = getMostRecentTimestamp(b); + + // Sort by most recent timestamp (descending) + return bTimestamp - aTimestamp; }); setChats(sortedChats); diff --git a/platforms/pictique-api/src/services/ChatService.ts b/platforms/pictique-api/src/services/ChatService.ts index ff301dd1..7fb4d11e 100644 --- a/platforms/pictique-api/src/services/ChatService.ts +++ b/platforms/pictique-api/src/services/ChatService.ts @@ -215,6 +215,11 @@ export class ChatService { const savedMessage = await this.messageRepository.save(message); + // Explicitly update the chat's updatedAt to ensure proper sorting + await this.chatRepository.update(chatId, { + updatedAt: new Date() + }); + console.log("Sent event", `chat:${chatId}`); this.eventEmitter.emit(`chat:${chatId}`, [savedMessage]); @@ -361,24 +366,46 @@ export class ChatService { ], }); - // Sort the chats by latest message timestamp (most recent first) + // Sort chats by most recent activity (most recent first) + // Priority: latest message timestamp > updatedAt > createdAt const sortedChats = chatsWithRelations.sort((a, b) => { - const aLatestMessage = a.messages[a.messages.length - 1]; - const bLatestMessage = b.messages[b.messages.length - 1]; + const getMostRecentTimestamp = (chat: typeof a): number => { + // Priority 1: latest message timestamp (most recent activity) + // Sort messages by createdAt ascending to get the latest one + const sortedMessages = [...(chat.messages || [])].sort( + (m1, m2) => m1.createdAt.getTime() - m2.createdAt.getTime() + ); + const latestMessage = sortedMessages[sortedMessages.length - 1]; + if (latestMessage) { + return latestMessage.createdAt.getTime(); + } + // Priority 2: updatedAt (for updated chats without messages) + if (chat.updatedAt) { + return chat.updatedAt.getTime(); + } + // Priority 3: createdAt (for new chats) + if (chat.createdAt) { + return chat.createdAt.getTime(); + } + // Fallback: 0 for chats with no timestamps + return 0; + }; - if (!aLatestMessage && !bLatestMessage) { - return b.createdAt.getTime() - a.createdAt.getTime(); - } - if (!aLatestMessage) return 1; - if (!bLatestMessage) return -1; + const aTimestamp = getMostRecentTimestamp(a); + const bTimestamp = getMostRecentTimestamp(b); - return bLatestMessage.createdAt.getTime() - aLatestMessage.createdAt.getTime(); + // Sort by most recent timestamp (descending) + return bTimestamp - aTimestamp; }); // For each chat, get the latest message and its read status const chatsWithLatestMessage = await Promise.all( sortedChats.map(async (chat) => { - const latestMessage = chat.messages[chat.messages.length - 1]; + // Sort messages by createdAt ascending to get the latest one + const sortedMessages = [...(chat.messages || [])].sort( + (m1, m2) => m1.createdAt.getTime() - m2.createdAt.getTime() + ); + const latestMessage = sortedMessages[sortedMessages.length - 1]; if (!latestMessage) { return { ...chat, latestMessage: undefined }; } diff --git a/platforms/pictique/src/lib/fragments/ChatMessage/ChatMessage.svelte b/platforms/pictique/src/lib/fragments/ChatMessage/ChatMessage.svelte index a9e690a2..1fd5466c 100644 --- a/platforms/pictique/src/lib/fragments/ChatMessage/ChatMessage.svelte +++ b/platforms/pictique/src/lib/fragments/ChatMessage/ChatMessage.svelte @@ -44,8 +44,8 @@
{@html displayText.replace( - /([^<]+)<\/a>/g, - '$2' + /]*)>([^<]+)<\/a>/g, + '$3' )}
@@ -102,8 +102,8 @@
{@html displayText.replace( - /([^<]+)<\/a>/g, - '$2' + /]*)>([^<]+)<\/a>/g, + '$3' )}
diff --git a/platforms/pictique/src/routes/(protected)/settings/account/username/+page.svelte b/platforms/pictique/src/routes/(protected)/settings/account/username/+page.svelte index bb312acc..c761f743 100644 --- a/platforms/pictique/src/routes/(protected)/settings/account/username/+page.svelte +++ b/platforms/pictique/src/routes/(protected)/settings/account/username/+page.svelte @@ -83,7 +83,13 @@
- +