diff --git a/src/hooks/moderation/useModerationQueueManager.ts b/src/hooks/moderation/useModerationQueueManager.ts index 4bb93438..e533d03b 100644 --- a/src/hooks/moderation/useModerationQueueManager.ts +++ b/src/hooks/moderation/useModerationQueueManager.ts @@ -197,74 +197,7 @@ export function useModerationQueueManager(config: ModerationQueueManagerConfig): setLoadingState("refreshing"); } - // Helper function to apply filters consistently to both count and data queries - const applyFilters = (query: any) => { - let filteredQuery = query; - - // CRITICAL: Multi-level ordering - // Level 1: Always sort by escalated first (descending) - filteredQuery = filteredQuery.order('escalated', { ascending: false }); - - // Level 2: Apply user-selected sort (use debounced config) - filteredQuery = filteredQuery.order( - sort.debouncedConfig.field, - { ascending: sort.debouncedConfig.direction === 'asc' } - ); - - // Level 3: Tertiary sort by created_at (if not already primary) - if (sort.debouncedConfig.field !== 'created_at') { - filteredQuery = filteredQuery.order('created_at', { ascending: true }); - } - - // Apply tab-based status filtering - const tab = filters.activeTab; - const statusFilter = filters.debouncedStatusFilter; - const entityFilter = filters.debouncedEntityFilter; - - if (tab === "mainQueue") { - if (statusFilter === "all") { - filteredQuery = filteredQuery.in("status", ["pending", "flagged", "partially_approved"]); - } else if (statusFilter === "pending") { - filteredQuery = filteredQuery.in("status", ["pending", "partially_approved"]); - } else { - filteredQuery = filteredQuery.eq("status", statusFilter); - } - } else { - if (statusFilter === "all") { - filteredQuery = filteredQuery.in("status", ["approved", "rejected"]); - } else { - filteredQuery = filteredQuery.eq("status", statusFilter); - } - } - - // Apply entity type filter - if (entityFilter === "photos") { - filteredQuery = filteredQuery.eq("submission_type", "photo"); - } else if (entityFilter === "submissions") { - filteredQuery = filteredQuery.neq("submission_type", "photo"); - } - - // Apply access control - if (!isAdmin && !isSuperuser) { - const now = new Date().toISOString(); - filteredQuery = filteredQuery.or( - `assigned_to.is.null,locked_until.lt.${now},assigned_to.eq.${user.id}`, - ); - } - - return filteredQuery; - }; - - // Get total count using the same filter logic - let countQuery = supabase - .from("content_submissions") - .select("*", { count: "exact", head: true }); - - countQuery = applyFilters(countQuery); - const { count } = await countQuery; - pagination.setTotalCount(count || 0); - - // Build data query with full select + // Build base query let submissionsQuery = supabase .from("content_submissions") .select( @@ -290,8 +223,64 @@ export function useModerationQueueManager(config: ModerationQueueManagerConfig): `, ); - // Apply the same filters to data query - submissionsQuery = applyFilters(submissionsQuery); + // CRITICAL: Multi-level ordering + // Level 1: Always sort by escalated first (descending) + submissionsQuery = submissionsQuery.order('escalated', { ascending: false }); + + // Level 2: Apply user-selected sort (use debounced config) + submissionsQuery = submissionsQuery.order( + sort.debouncedConfig.field, + { ascending: sort.debouncedConfig.direction === 'asc' } + ); + + // Level 3: Tertiary sort by created_at (if not already primary) + if (sort.debouncedConfig.field !== 'created_at') { + submissionsQuery = submissionsQuery.order('created_at', { ascending: true }); + } + + // Apply tab-based status filtering + const tab = filters.activeTab; + const statusFilter = filters.debouncedStatusFilter; + const entityFilter = filters.debouncedEntityFilter; + + if (tab === "mainQueue") { + if (statusFilter === "all") { + submissionsQuery = submissionsQuery.in("status", ["pending", "flagged", "partially_approved"]); + } else if (statusFilter === "pending") { + submissionsQuery = submissionsQuery.in("status", ["pending", "partially_approved"]); + } else { + submissionsQuery = submissionsQuery.eq("status", statusFilter); + } + } else { + if (statusFilter === "all") { + submissionsQuery = submissionsQuery.in("status", ["approved", "rejected"]); + } else { + submissionsQuery = submissionsQuery.eq("status", statusFilter); + } + } + + // Apply entity type filter + if (entityFilter === "photos") { + submissionsQuery = submissionsQuery.eq("submission_type", "photo"); + } else if (entityFilter === "submissions") { + submissionsQuery = submissionsQuery.neq("submission_type", "photo"); + } + + // Apply access control + if (!isAdmin && !isSuperuser) { + const now = new Date().toISOString(); + submissionsQuery = submissionsQuery.or( + `assigned_to.is.null,locked_until.lt.${now},assigned_to.eq.${user.id}`, + ); + } + + // Get total count + const { count } = await supabase + .from("content_submissions") + .select("*", { count: "exact", head: true }) + .match(submissionsQuery as any); + + pagination.setTotalCount(count || 0); // Apply pagination const startIndex = pagination.startIndex;