feat: Implement database-level sorting for moderation queue

This commit is contained in:
gpt-engineer-app[bot]
2025-10-13 13:23:54 +00:00
parent 90ae7d9a41
commit 0af5443c81
8 changed files with 269 additions and 18 deletions

View File

@@ -7,6 +7,7 @@ import {
useProfileCache,
useModerationFilters,
usePagination,
useModerationSort,
useRealtimeSubscriptions,
} from "./index";
import { useModerationQueue } from "@/hooks/useModerationQueue";
@@ -43,6 +44,7 @@ export interface ModerationQueueManager {
// Sub-hooks (exposed for granular control)
filters: ReturnType<typeof useModerationFilters>;
pagination: ReturnType<typeof usePagination>;
sort: ReturnType<typeof useModerationSort>;
queue: ReturnType<typeof useModerationQueue>;
// Realtime
@@ -97,7 +99,7 @@ export function useModerationQueueManager(config: ModerationQueueManagerConfig):
},
});
// Removed - sorting functionality deleted
const sort = useModerationSort();
const queue = useModerationQueue();
const entityCache = useEntityCache();
@@ -217,6 +219,21 @@ export function useModerationQueueManager(config: ModerationQueueManagerConfig):
`,
);
// CRITICAL: Multi-level ordering
// Level 1: Always sort by escalated first (descending)
submissionsQuery = submissionsQuery.order('escalated', { ascending: false });
// Level 2: Apply user-selected sort
submissionsQuery = submissionsQuery.order(
sort.config.field,
{ ascending: sort.config.direction === 'asc' }
);
// Level 3: Tertiary sort by created_at (if not already primary)
if (sort.config.field !== 'created_at') {
submissionsQuery = submissionsQuery.order('created_at', { ascending: true });
}
// Apply tab-based status filtering
const tab = filters.activeTab;
const statusFilter = filters.debouncedStatusFilter;
@@ -444,7 +461,7 @@ export function useModerationQueueManager(config: ModerationQueueManagerConfig):
setLoadingState("ready");
}
},
[user, isAdmin, isSuperuser, filters, pagination, profileCache, entityCache, toast],
[user, isAdmin, isSuperuser, filters, pagination, sort, profileCache, entityCache, toast],
);
// Store fetchItems in ref to avoid re-creating visibility listener
@@ -772,13 +789,13 @@ export function useModerationQueueManager(config: ModerationQueueManagerConfig):
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [user?.id]);
// Filter changes trigger refetch
// Filter and sort changes trigger refetch
useEffect(() => {
if (!user || !initialFetchCompleteRef.current || isMountingRef.current) return;
pagination.reset();
fetchItems(true);
}, [filters.debouncedEntityFilter, filters.debouncedStatusFilter]);
}, [filters.debouncedEntityFilter, filters.debouncedStatusFilter, sort.config]);
// Pagination changes trigger refetch
useEffect(() => {
@@ -921,6 +938,7 @@ export function useModerationQueueManager(config: ModerationQueueManagerConfig):
actionLoading,
filters,
pagination,
sort,
queue,
newItemsCount,
pendingNewItems,