From c0d175fc67ea8f231ee00c8a70577559d27dc018 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Wed, 15 Oct 2025 13:50:49 +0000 Subject: [PATCH] Fix queue refresh on lock state change --- src/components/moderation/QueueItem.tsx | 43 +++++++++++++++---- .../moderation/useModerationQueueManager.ts | 7 ++- src/hooks/useModerationQueue.ts | 23 +++++++++- 3 files changed, 63 insertions(+), 10 deletions(-) diff --git a/src/components/moderation/QueueItem.tsx b/src/components/moderation/QueueItem.tsx index 15be6dc0..0debfb7f 100644 --- a/src/components/moderation/QueueItem.tsx +++ b/src/components/moderation/QueueItem.tsx @@ -81,6 +81,7 @@ export const QueueItem = memo(({ onInteractionBlur }: QueueItemProps) => { const [validationResult, setValidationResult] = useState(null); + const [isClaiming, setIsClaiming] = useState(false); // Fetch relational photo data for photo submissions const { photos: photoItems, loading: photosLoading } = usePhotoSubmissionItems( @@ -96,6 +97,12 @@ export const QueueItem = memo(({ setValidationResult(result); }, []); + const handleClaim = useCallback(async () => { + setIsClaiming(true); + await onClaimSubmission(item.id); + setIsClaiming(false); + }, [onClaimSubmission, item.id]); + return ( Loading photos... ) : photoItems.length > 0 ? (
-
Photos ({photoItems.length}):
+
+ Photos ({photoItems.length}): + {import.meta.env.DEV && photoItems[0] && ( + + URL: {photoItems[0].cloudflare_image_url?.slice(0, 30)}... + + )} +
({ id: photo.id, @@ -312,9 +326,13 @@ export const QueueItem = memo(({ />
) : ( -
- No photos found in submission -
+ + + No Photos Found + + This photo submission has no photos attached. This may be a data integrity issue. + + )} {/* Context Information */} @@ -356,13 +374,22 @@ export const QueueItem = memo(({
Claim this submission to lock it for 15 minutes while you review
diff --git a/src/hooks/moderation/useModerationQueueManager.ts b/src/hooks/moderation/useModerationQueueManager.ts index a126acb6..b3b69b5d 100644 --- a/src/hooks/moderation/useModerationQueueManager.ts +++ b/src/hooks/moderation/useModerationQueueManager.ts @@ -111,7 +111,12 @@ export function useModerationQueueManager(config: ModerationQueueManagerConfig): }, }); - const queue = useModerationQueue(); + const queue = useModerationQueue({ + onLockStateChange: () => { + logger.log('🔄 Lock state changed, invalidating queue cache'); + queueQuery.invalidate(); + } + }); const entityCache = useEntityCache(); const profileCache = useProfileCache(); diff --git a/src/hooks/useModerationQueue.ts b/src/hooks/useModerationQueue.ts index d4fde1f2..b9a852ba 100644 --- a/src/hooks/useModerationQueue.ts +++ b/src/hooks/useModerationQueue.ts @@ -21,7 +21,12 @@ interface QueueStats { avgWaitHours: number; } -export const useModerationQueue = () => { +interface UseModerationQueueConfig { + onLockStateChange?: () => void; +} + +export const useModerationQueue = (config?: UseModerationQueueConfig) => { + const { onLockStateChange } = config || {}; const [currentLock, setCurrentLock] = useState(null); const [queueStats, setQueueStats] = useState(null); const [isLoading, setIsLoading] = useState(false); @@ -158,6 +163,11 @@ export const useModerationQueue = () => { description: `${claimed.submission_type} submission (waiting ${formatInterval(claimed.waiting_time)})`, }); + // Trigger refresh callback + if (onLockStateChange) { + onLockStateChange(); + } + return claimed.submission_id; } catch (error: any) { console.error('Error claiming submission:', error); @@ -239,6 +249,12 @@ export const useModerationQueue = () => { } fetchStats(); + + // Trigger refresh callback + if (onLockStateChange) { + onLockStateChange(); + } + return true; } @@ -333,6 +349,11 @@ export const useModerationQueue = () => { description: 'You now have 15 minutes to review this submission', }); + // Trigger refresh callback + if (onLockStateChange) { + onLockStateChange(); + } + return true; } catch (error: any) { console.error('Error claiming submission:', error);