Skip to content

Commit 664006e

Browse files
committed
fix: combine sorting and first message received logging logic to eliminate double effect run issue
1 parent 4e4742a commit 664006e

File tree

1 file changed

+17
-25
lines changed

1 file changed

+17
-25
lines changed

packages/react/src/hooks/useSessionMessages.ts

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -112,49 +112,41 @@ export function useSessionMessages(session?: UseSessionReturn): UseSessionMessag
112112
return merged;
113113
}, [transcriptionMessages, chat.chatMessages]);
114114

115-
const [messageFirstReceivedTimeMap, setMessageFirstReceivedTime] = React.useState(
115+
const messageFirstReceivedTimeMapRef = React.useRef(
116116
new Map<ReceivedMessage['id'], Date>(),
117117
);
118-
React.useEffect(() => {
119-
setMessageFirstReceivedTime((oldMap) => {
120-
const newMap = new Map(oldMap);
118+
const sortedReceivedMessages = React.useMemo(() => {
119+
const now = new Date();
120+
for (const message of receivedMessages) {
121+
if (messageFirstReceivedTimeMapRef.current.has(message.id)) {
122+
continue;
123+
}
121124

122-
const now = new Date();
123-
for (const message of receivedMessages) {
124-
if (newMap.has(message.id)) {
125-
continue;
126-
}
125+
messageFirstReceivedTimeMapRef.current.set(message.id, now);
126+
}
127127

128-
newMap.set(message.id, now);
128+
return receivedMessages.sort((a, b) => {
129+
const aFirstReceivedAt = messageFirstReceivedTimeMapRef.current.get(a.id);
130+
const bFirstReceivedAt = messageFirstReceivedTimeMapRef.current.get(b.id);
131+
if (typeof aFirstReceivedAt === 'undefined' || typeof bFirstReceivedAt === 'undefined') {
132+
return 0;
129133
}
130134

131-
return newMap;
135+
return aFirstReceivedAt.getTime() - bFirstReceivedAt.getTime();
132136
});
133137
}, [receivedMessages]);
134138

135139
const previouslyReceivedMessageIdsRef = React.useRef(new Set());
136140
React.useEffect(() => {
137-
for (const message of receivedMessages) {
141+
for (const message of sortedReceivedMessages) {
138142
if (previouslyReceivedMessageIdsRef.current.has(message.id)) {
139143
continue;
140144
}
141145

142146
previouslyReceivedMessageIdsRef.current.add(message.id);
143147
emitter.emit(MessagesEvent.MessageReceived, message);
144148
}
145-
}, [receivedMessages]);
146-
147-
const sortedReceivedMessages = React.useMemo(() => {
148-
return receivedMessages.sort((a, b) => {
149-
const aFirstReceivedAt = messageFirstReceivedTimeMap.get(a.id);
150-
const bFirstReceivedAt = messageFirstReceivedTimeMap.get(b.id);
151-
if (typeof aFirstReceivedAt === 'undefined' || typeof bFirstReceivedAt === 'undefined') {
152-
return 0;
153-
}
154-
155-
return aFirstReceivedAt.getTime() - bFirstReceivedAt.getTime();
156-
});
157-
}, [receivedMessages, messageFirstReceivedTimeMap]);
149+
}, [sortedReceivedMessages]);
158150

159151
return React.useMemo(
160152
() => ({

0 commit comments

Comments
 (0)