diff --git a/src/hooks/useMessaging.ts b/src/hooks/useMessaging.ts index ddbcf14..82796ad 100644 --- a/src/hooks/useMessaging.ts +++ b/src/hooks/useMessaging.ts @@ -489,10 +489,41 @@ export function useMessaging(options: UseMessagingOptions = {}): UseMessagingRet // eslint-disable-next-line react-hooks/exhaustive-deps }, [autoConnect, isAuthenticated]); - // Re-join conversation room when reconnecting + // Re-join conversation room when reconnecting + fetch missed messages useEffect(() => { if (isConnected && currentConversationIdRef.current) { - socketService.joinConversation(currentConversationIdRef.current); + const conversationId = currentConversationIdRef.current; + + const rejoinAndCatchUp = async (attempt = 1) => { + // Re-join the room + const result = await socketService.joinConversation(conversationId); + if (!result.success && attempt < 3 && currentConversationIdRef.current === conversationId) { + console.warn(`Room join attempt ${attempt} failed for ${conversationId}, retrying...`); + setTimeout(() => rejoinAndCatchUp(attempt + 1), 1000 * attempt); + return; + } + + // Fetch recent messages to catch any missed during disconnect + if (currentConversationIdRef.current === conversationId) { + try { + const { messages: recentMessages } = await messagesService.getMessages(conversationId, 1, 20); + setMessages((prev) => { + const existingIds = new Set(prev.map((m) => m.id)); + const newMessages = recentMessages.filter((m) => !existingIds.has(m.id)); + if (newMessages.length === 0) return prev; + // Merge and sort by creation date + const merged = [...prev, ...newMessages].sort( + (a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime() + ); + return merged; + }); + } catch (err) { + console.error('Failed to catch up messages after reconnect:', err); + } + } + }; + + rejoinAndCatchUp(); } }, [isConnected]); diff --git a/src/services/socket.service.ts b/src/services/socket.service.ts index 286b38f..2493c8a 100644 --- a/src/services/socket.service.ts +++ b/src/services/socket.service.ts @@ -148,6 +148,7 @@ class SocketService { this.socket = null; } this.currentToken = null; + this.isConnecting = false; } isConnected(): boolean {