diff --git a/src/hooks/useMessaging.ts b/src/hooks/useMessaging.ts index f37b716..51f67cd 100644 --- a/src/hooks/useMessaging.ts +++ b/src/hooks/useMessaging.ts @@ -587,6 +587,19 @@ export function useMessaging(options: UseMessagingOptions = {}): UseMessagingRet } ); + // Conversation deleted by the other party — remove from local state + const unsubscribeConvDeleted = socketService.onConversationDeleted( + (data: Record) => { + const convId = data.conversationId as string | undefined; + if (!convId) return; + setConversations((prev) => prev.filter((c) => c.id !== convId)); + if (currentConversationIdRef.current === convId) { + currentConversationIdRef.current = null; + setMessages([]); + } + } + ); + // Auth error handling (token refresh + reconnect) is handled globally // by PresenceProvider — no duplicate handler needed here. @@ -598,6 +611,7 @@ export function useMessaging(options: UseMessagingOptions = {}): UseMessagingRet unsubscribeStatus(); unsubscribeRead(); unsubscribeDelivered(); + unsubscribeConvDeleted(); // Clean up typing timeout to prevent memory leak if (typingTimeoutRef.current) { clearTimeout(typingTimeoutRef.current); diff --git a/src/services/socket.service.ts b/src/services/socket.service.ts index e1c61c2..05b3281 100644 --- a/src/services/socket.service.ts +++ b/src/services/socket.service.ts @@ -29,6 +29,7 @@ class SocketService { private connectionResponseHandlers: Set = new Set(); private connectionHandlers: Set<(connected: boolean) => void> = new Set(); private authErrorHandlers: Set<() => void> = new Set(); + private conversationDeletedHandlers: Set = new Set(); private isConnecting = false; private currentToken: string | null = null; private listenersAttached = false; @@ -157,6 +158,10 @@ class SocketService { this.socket.on('connection_response', (data: Record) => { this.connectionResponseHandlers.forEach((handler) => handler(data)); }); + + this.socket.on('conversation_deleted', (data: Record) => { + this.conversationDeletedHandlers.forEach((handler) => handler(data)); + }); } // Reconnect with a fresh token (used when the previous token expired) @@ -196,6 +201,7 @@ class SocketService { this.deliveredHandlers.clear(); this.connectionRequestHandlers.clear(); this.connectionResponseHandlers.clear(); + this.conversationDeletedHandlers.clear(); this.connectionHandlers.clear(); this.authErrorHandlers.clear(); } @@ -348,6 +354,11 @@ class SocketService { return () => this.connectionResponseHandlers.delete(handler); } + onConversationDeleted(handler: NotificationEventHandler): () => void { + this.conversationDeletedHandlers.add(handler); + return () => this.conversationDeletedHandlers.delete(handler); + } + onConnectionChange(handler: (connected: boolean) => void): () => void { this.connectionHandlers.add(handler); return () => this.connectionHandlers.delete(handler);