|
507 | 507 | opacity: 0.9; |
508 | 508 | } |
509 | 509 |
|
| 510 | + .missing-messages-window-message.received { |
| 511 | + text-decoration: line-through; |
| 512 | + opacity: 0.5; |
| 513 | + } |
| 514 | + |
| 515 | + .missing-messages-window-message.received .message-id { |
| 516 | + color: #885500; |
| 517 | + } |
| 518 | + |
| 519 | + .missing-messages-window-message.received .retrieval-hint { |
| 520 | + color: #884400; |
| 521 | + } |
| 522 | + |
510 | 523 | .system-window.minimized .system-window-content, |
511 | 524 | .missing-messages-window.minimized .missing-messages-window-content { |
512 | 525 | display: none; |
|
624 | 637 | this.seenMessages = new Set(); |
625 | 638 | this.missingMessagesCount = 0; |
626 | 639 | this.seenMissingMessages = new Set(); // Track unique missing messages |
| 640 | + this.missingMessagesByHint = new Map(); // Map retrieval hint to message element for crossing out |
627 | 641 |
|
628 | 642 | this.initProtobuf(); |
629 | 643 | this.initElements(); |
|
1161 | 1175 | try { |
1162 | 1176 | if (!wakuMessage.payload || !wakuMessage.payload.length || !this.Chat2Message) return; |
1163 | 1177 |
|
| 1178 | + // Check if this message's hash matches any missing message retrieval hints |
| 1179 | + if (wakuMessage.hash) { |
| 1180 | + const hashHex = this.bytesToHex(wakuMessage.hash); |
| 1181 | + this.markMissingMessageAsReceived(hashHex); |
| 1182 | + } |
| 1183 | + |
1164 | 1184 | // Abusing an API :] |
1165 | 1185 | const messageId = ReliableChannel.getMessageId(wakuMessage.payload) |
1166 | 1186 | // We already processed this message |
|
1308 | 1328 | this.chatContainer.scrollTop = this.chatContainer.scrollHeight; |
1309 | 1329 | } |
1310 | 1330 |
|
| 1331 | + markMissingMessageAsReceived(hashHex) { |
| 1332 | + // Check if we have a missing message with this retrieval hint |
| 1333 | + const messageElement = this.missingMessagesByHint.get(hashHex); |
| 1334 | + if (messageElement && !messageElement.classList.contains('received')) { |
| 1335 | + // Cross out the message |
| 1336 | + messageElement.classList.add('received'); |
| 1337 | + |
| 1338 | + // Log for debugging |
| 1339 | + console.log(`Missing message received: ${hashHex.substring(0, 12)}...`); |
| 1340 | + this.addSystemMessage(`Missing message recovered: ${hashHex.substring(0, 12)}...`); |
| 1341 | + } |
| 1342 | + } |
| 1343 | + |
1311 | 1344 | handleMissingMessages(missingMessages) { |
1312 | 1345 | if (!missingMessages || missingMessages.length === 0) return; |
1313 | 1346 |
|
|
1344 | 1377 | messageElement.dataset.fullId = messageIdHex; |
1345 | 1378 | messageElement.dataset.fullHint = retrievalHintHex; |
1346 | 1379 |
|
| 1380 | + // Store in map for quick lookup by retrieval hint |
| 1381 | + if (retrievalHintHex !== 'N/A') { |
| 1382 | + this.missingMessagesByHint.set(retrievalHintHex, messageElement); |
| 1383 | + } |
| 1384 | + |
1347 | 1385 | this.missingMessagesContent.appendChild(messageElement); |
1348 | 1386 |
|
1349 | 1387 | // Auto-scroll to bottom of missing messages window |
|
1355 | 1393 | const removedMessage = messages[0]; |
1356 | 1394 | // Remove from seen set when removing from display |
1357 | 1395 | const removedId = removedMessage.dataset.fullId; |
| 1396 | + const removedHint = removedMessage.dataset.fullHint; |
1358 | 1397 | if (removedId) { |
1359 | 1398 | this.seenMissingMessages.delete(removedId); |
1360 | 1399 | this.missingMessagesCount--; |
1361 | 1400 | } |
| 1401 | + if (removedHint && removedHint !== 'N/A') { |
| 1402 | + this.missingMessagesByHint.delete(removedHint); |
| 1403 | + } |
1362 | 1404 | removedMessage.remove(); |
1363 | 1405 | } |
1364 | 1406 | }); |
|
0 commit comments