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 @@
@@ -102,8 +102,8 @@
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 @@