Skip to content

Commit 561a30c

Browse files
committed
fix: prevent duplicate conversations from self-messages and relay backfill
- Add message deduplication using Set to track processed message IDs - Filter out self-messages where sender = recipient - Prevents duplicate conversation entries from: * Same message arriving from cache AND real-time subscription * Self-directed messages creating spurious conversations - Ensures normal sent messages still appear in recipient conversations - Reduces conversation count from 8 to 7 (removes duplicate) Fixes issue where fast cache loading (0.5ms) creates race condition with real-time subscription receiving backfill messages already in cache.
1 parent 285bd37 commit 561a30c

1 file changed

Lines changed: 23 additions & 1 deletion

File tree

src/hooks/useConversations.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export const useConversations = () => {
2121
const [conversations, setConversations] = useState<Conversation[]>([]);
2222
const [isLoading, setIsLoading] = useState(true);
2323
const [error, setError] = useState<string | null>(null);
24+
const [processedMessageIds] = useState<Set<string>>(new Set());
2425

2526
/**
2627
* Load conversations from relays
@@ -91,6 +92,27 @@ export const useConversations = () => {
9192
isSent: message.isSent,
9293
});
9394

95+
// Deduplication: Skip if we've already processed this message
96+
if (processedMessageIds.has(message.id)) {
97+
console.log('[useConversations] ⏭️ Skipping duplicate message', {
98+
id: message.id?.substring(0, 8),
99+
});
100+
return;
101+
}
102+
103+
// Filter out self-messages: Skip if sender = recipient (message to self)
104+
if (message.senderPubkey === message.recipientPubkey) {
105+
console.log('[useConversations] 🚫 Skipping self-message (sender = recipient)', {
106+
id: message.id?.substring(0, 8),
107+
pubkey: message.senderPubkey?.substring(0, 8),
108+
});
109+
processedMessageIds.add(message.id); // Mark as processed to avoid checking again
110+
return;
111+
}
112+
113+
// Mark message as processed
114+
processedMessageIds.add(message.id);
115+
94116
const otherPubkey = message.isSent ? message.recipientPubkey : message.senderPubkey;
95117
let updatedConversation: Conversation | undefined;
96118

@@ -173,7 +195,7 @@ export const useConversations = () => {
173195
});
174196
}
175197
}
176-
}, []); /**
198+
}, [processedMessageIds]); /**
177199
* Subscribe to new messages for real-time updates
178200
*/
179201
useEffect(() => {

0 commit comments

Comments
 (0)