Skip to content

Commit 21bffbb

Browse files
authored
Sort session messages by first received timestamp, not "timestamp" field (#1229)
1 parent 4e9171f commit 21bffbb

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

.changeset/witty-suits-fry.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@livekit/components-react': patch
3+
---
4+
5+
Sort session messages by first received timestamp, not "timestamp" field

packages/react/src/hooks/useSessionMessages.ts

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,28 +109,50 @@ export function useSessionMessages(session?: UseSessionReturn): UseSessionMessag
109109

110110
const receivedMessages = React.useMemo(() => {
111111
const merged: Array<ReceivedMessage> = [...transcriptionMessages, ...chat.chatMessages];
112-
return merged.sort((a, b) => a.timestamp - b.timestamp);
112+
return merged;
113113
}, [transcriptionMessages, chat.chatMessages]);
114114

115+
const messageFirstReceivedTimeMapRef = React.useRef(new Map<ReceivedMessage['id'], Date>());
116+
const sortedReceivedMessages = React.useMemo(() => {
117+
const now = new Date();
118+
for (const message of receivedMessages) {
119+
if (messageFirstReceivedTimeMapRef.current.has(message.id)) {
120+
continue;
121+
}
122+
123+
messageFirstReceivedTimeMapRef.current.set(message.id, now);
124+
}
125+
126+
return receivedMessages.sort((a, b) => {
127+
const aFirstReceivedAt = messageFirstReceivedTimeMapRef.current.get(a.id);
128+
const bFirstReceivedAt = messageFirstReceivedTimeMapRef.current.get(b.id);
129+
if (typeof aFirstReceivedAt === 'undefined' || typeof bFirstReceivedAt === 'undefined') {
130+
return 0;
131+
}
132+
133+
return aFirstReceivedAt.getTime() - bFirstReceivedAt.getTime();
134+
});
135+
}, [receivedMessages]);
136+
115137
const previouslyReceivedMessageIdsRef = React.useRef(new Set());
116138
React.useEffect(() => {
117-
for (const message of receivedMessages) {
139+
for (const message of sortedReceivedMessages) {
118140
if (previouslyReceivedMessageIdsRef.current.has(message.id)) {
119141
continue;
120142
}
121143

122144
previouslyReceivedMessageIdsRef.current.add(message.id);
123145
emitter.emit(MessagesEvent.MessageReceived, message);
124146
}
125-
}, [receivedMessages]);
147+
}, [sortedReceivedMessages]);
126148

127149
return React.useMemo(
128150
() => ({
129-
messages: receivedMessages,
151+
messages: sortedReceivedMessages,
130152
send: chat.send,
131153
isSending: chat.isSending,
132154
internal: { emitter },
133155
}),
134-
[receivedMessages, chat.send, chat.isSending],
156+
[sortedReceivedMessages, chat.send, chat.isSending],
135157
);
136158
}

0 commit comments

Comments
 (0)