|
12 | 12 | let messageValue = $state('');
|
13 | 13 | let messagesContainer: HTMLDivElement;
|
14 | 14 |
|
| 15 | + // Function to remove duplicate messages by ID |
| 16 | + function removeDuplicateMessages( |
| 17 | + messagesArray: Record<string, unknown>[] |
| 18 | + ): Record<string, unknown>[] { |
| 19 | + const seen = new Set<string>(); |
| 20 | + return messagesArray.filter((msg) => { |
| 21 | + const id = msg.id as string; |
| 22 | + if (seen.has(id)) { |
| 23 | + console.log(`Removing duplicate message with ID: ${id}`); |
| 24 | + return false; |
| 25 | + } |
| 26 | + seen.add(id); |
| 27 | + return true; |
| 28 | + }); |
| 29 | + } |
| 30 | +
|
15 | 31 | function scrollToBottom() {
|
16 | 32 | if (messagesContainer) {
|
17 | 33 | messagesContainer.scrollTop = messagesContainer.scrollHeight;
|
|
38 | 54 | };
|
39 | 55 |
|
40 | 56 | eventSource.onmessage = (e) => {
|
41 |
| - const data = JSON.parse(e.data); |
42 |
| - console.log('messages', data); |
43 |
| - addMessages(data); |
44 |
| - // Use setTimeout to ensure DOM has updated |
45 |
| - setTimeout(scrollToBottom, 0); |
| 57 | + try { |
| 58 | + const data = JSON.parse(e.data); |
| 59 | + console.log('📨 SSE message received:', data); |
| 60 | + console.log('Current messages count before adding:', messages.length); |
| 61 | + addMessages(data); |
| 62 | + console.log('Messages count after adding:', messages.length); |
| 63 | + // Use setTimeout to ensure DOM has updated |
| 64 | + setTimeout(scrollToBottom, 0); |
| 65 | + } catch (error) { |
| 66 | + console.error('Error parsing SSE message:', error); |
| 67 | + } |
46 | 68 | };
|
47 | 69 | }
|
48 | 70 |
|
|
112 | 134 | };
|
113 | 135 | });
|
114 | 136 |
|
115 |
| - messages = messages.concat(processedMessages); |
| 137 | + // Prevent duplicate messages by checking IDs |
| 138 | + const existingIds = new Set(messages.map((msg) => msg.id)); |
| 139 | + const uniqueNewMessages = processedMessages.filter((msg) => !existingIds.has(msg.id)); |
| 140 | +
|
| 141 | + if (uniqueNewMessages.length > 0) { |
| 142 | + console.log(`Adding ${uniqueNewMessages.length} new unique messages`); |
| 143 | + const newMessagesArray = messages.concat(uniqueNewMessages); |
| 144 | + // Final safety check to remove any duplicates |
| 145 | + messages = removeDuplicateMessages(newMessagesArray); |
| 146 | + } else { |
| 147 | + console.log('No new unique messages to add'); |
| 148 | + } |
116 | 149 | }
|
117 | 150 |
|
118 | 151 | onMount(async () => {
|
|
124 | 157 |
|
125 | 158 | <section class="chat relative px-0">
|
126 | 159 | <div class="h-[calc(100vh-220px)] overflow-auto" bind:this={messagesContainer}>
|
127 |
| - {#each messages as msg (msg.id)} |
| 160 | + {#each removeDuplicateMessages(messages) as msg (msg.id)} |
128 | 161 | <ChatMessage
|
129 | 162 | isOwn={msg.isOwn as boolean}
|
130 | 163 | userImgSrc={msg.userImgSrc as string}
|
|
0 commit comments