diff --git a/src/components/moderation/ModerationQueue.tsx b/src/components/moderation/ModerationQueue.tsx index 87027218..eb933922 100644 --- a/src/components/moderation/ModerationQueue.tsx +++ b/src/components/moderation/ModerationQueue.tsx @@ -102,6 +102,7 @@ export const ModerationQueue = forwardRef((props, ref) => { const fetchInProgressRef = useRef(false); const itemsRef = useRef([]); const loadedIdsRef = useRef>(new Set()); + const lastFetchTimestampRef = useRef(null); // Get admin settings for polling configuration const { @@ -206,6 +207,11 @@ export const ModerationQueue = forwardRef((props, ref) => { submissionsQuery = submissionsQuery.neq('submission_type', 'photo'); } + // Silent polling: only fetch submissions created/updated since last poll + if (silent && lastFetchTimestampRef.current) { + submissionsQuery = submissionsQuery.gt('submitted_at', lastFetchTimestampRef.current); + } + // CRM-style claim filtering: moderators only see unclaimed OR self-assigned submissions // Admins see all submissions if (!isAdmin && !isSuperuser) { @@ -427,6 +433,9 @@ export const ModerationQueue = forwardRef((props, ref) => { const currentPreserveInteraction = preserveInteractionRef.current; if (silent) { + // Update timestamp for next poll + lastFetchTimestampRef.current = new Date().toISOString(); + // Background polling: behavior controlled by admin settings const currentLoadedIds = loadedIdsRef.current; const newSubmissions = moderationItems.filter(item => !currentLoadedIds.has(item.id)); @@ -484,6 +493,8 @@ export const ModerationQueue = forwardRef((props, ref) => { } } else { // Normal fetch: Load all items and reset pending + console.log('🔄 Manual refresh - replacing entire queue'); + lastFetchTimestampRef.current = null; // Reset timestamp to fetch everything next time setItems(moderationItems); setPendingNewItems([]); setNewItemsCount(0);