From 44ab477abcc6c2c0fc05cf60895dcd8a9958d5c1 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 20:02:35 +0000 Subject: [PATCH] Fix: Stabilize realtime subscription callbacks --- src/hooks/moderation/useModerationQueueManager.ts | 8 ++++---- src/hooks/moderation/useRealtimeSubscriptions.ts | 11 +++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/hooks/moderation/useModerationQueueManager.ts b/src/hooks/moderation/useModerationQueueManager.ts index 74cbdc4f..318c5f2c 100644 --- a/src/hooks/moderation/useModerationQueueManager.ts +++ b/src/hooks/moderation/useModerationQueueManager.ts @@ -936,10 +936,10 @@ export function useModerationQueueManager(config: ModerationQueueManagerConfig): }, entityCache, profileCache, - recentlyRemovedIds: recentlyRemovedRef.current, - interactingWithIds: interactingWith, - currentItems: items, - }); + recentlyRemovedIds: recentlyRemovedRef.current, + interactingWithIds: interactingWith, + currentItemsRef: itemsRef, + }); return { items, diff --git a/src/hooks/moderation/useRealtimeSubscriptions.ts b/src/hooks/moderation/useRealtimeSubscriptions.ts index 619d1b3e..3c4f9a6a 100644 --- a/src/hooks/moderation/useRealtimeSubscriptions.ts +++ b/src/hooks/moderation/useRealtimeSubscriptions.ts @@ -61,8 +61,8 @@ export interface RealtimeSubscriptionConfig { /** Set of IDs currently being interacted with */ interactingWithIds: Set; - /** Current items in queue (for comparison) */ - currentItems: ModerationItem[]; + /** Current items in queue (for comparison) - using ref to avoid reconnections */ + currentItemsRef: React.MutableRefObject; } /** @@ -97,7 +97,7 @@ export function useRealtimeSubscriptions( profileCache, recentlyRemovedIds, interactingWithIds, - currentItems, + currentItemsRef, } = config; // Debounce management for UPDATE events @@ -339,7 +339,7 @@ export function useRealtimeSubscriptions( const matchesEntity = matchesEntityFilter(updatedSubmission, filters.entityFilter); const matchesStatus = matchesStatusFilter(updatedSubmission, filters.statusFilter); - const wasInQueue = currentItems.some(i => i.id === updatedSubmission.id); + const wasInQueue = currentItemsRef.current.some(i => i.id === updatedSubmission.id); const shouldBeInQueue = matchesEntity && matchesStatus; if (wasInQueue && !shouldBeInQueue) { @@ -375,7 +375,7 @@ export function useRealtimeSubscriptions( ); // Check if item actually changed - const currentItem = currentItems.find(i => i.id === fullItem.id); + const currentItem = currentItemsRef.current.find(i => i.id === fullItem.id); if (currentItem && !hasItemChanged(currentItem, fullItem)) { console.log('✅ Realtime UPDATE: No changes detected for', fullItem.id); return; @@ -392,7 +392,6 @@ export function useRealtimeSubscriptions( pauseWhenHidden, recentlyRemovedIds, interactingWithIds, - currentItems, debouncedUpdate, fetchSubmissionDetails, profileCache,