From 284f778fc613d9f7cac8cced12e37d1ae11d591e 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 12:29:01 +0000 Subject: [PATCH] Fix: Implement sorting functionality --- .../moderation/ActiveFiltersDisplay.tsx | 1 - .../moderation/QueueSortControls.tsx | 2 - .../moderation/useModerationQueueManager.ts | 68 +++++++++++++++++-- src/lib/moderation/sorting.ts | 8 --- src/types/moderation.ts | 2 +- 5 files changed, 65 insertions(+), 16 deletions(-) diff --git a/src/components/moderation/ActiveFiltersDisplay.tsx b/src/components/moderation/ActiveFiltersDisplay.tsx index 174a9b03..e4800191 100644 --- a/src/components/moderation/ActiveFiltersDisplay.tsx +++ b/src/components/moderation/ActiveFiltersDisplay.tsx @@ -22,7 +22,6 @@ const getEntityFilterIcon = (filter: EntityFilter) => { const getSortFieldLabel = (field: SortField): string => { switch (field) { - case 'username': return 'Submitter'; case 'submission_type': return 'Type'; case 'escalated': return 'Escalated'; case 'status': return 'Status'; diff --git a/src/components/moderation/QueueSortControls.tsx b/src/components/moderation/QueueSortControls.tsx index 3e2dd352..bcfa5de0 100644 --- a/src/components/moderation/QueueSortControls.tsx +++ b/src/components/moderation/QueueSortControls.tsx @@ -15,7 +15,6 @@ interface QueueSortControlsProps { const getSortFieldLabel = (field: SortField): string => { switch (field) { case 'created_at': return 'Date Created'; - case 'username': return 'Submitter'; case 'submission_type': return 'Type'; case 'status': return 'Status'; case 'escalated': return 'Escalated'; @@ -58,7 +57,6 @@ export const QueueSortControls = ({ {getSortFieldLabel('created_at')} - {getSortFieldLabel('username')} {getSortFieldLabel('submission_type')} {getSortFieldLabel('status')} {getSortFieldLabel('escalated')} diff --git a/src/hooks/moderation/useModerationQueueManager.ts b/src/hooks/moderation/useModerationQueueManager.ts index 3ea47967..8a1558b2 100644 --- a/src/hooks/moderation/useModerationQueueManager.ts +++ b/src/hooks/moderation/useModerationQueueManager.ts @@ -12,7 +12,7 @@ import { } from "./index"; import { useModerationQueue } from "@/hooks/useModerationQueue"; import { smartMergeArray } from "@/lib/smartStateUpdate"; -import type { ModerationItem, EntityFilter, StatusFilter, LoadingState, SortConfig } from "@/types/moderation"; +import type { ModerationItem, EntityFilter, StatusFilter, LoadingState, SortConfig, SortField } from "@/types/moderation"; /** * Configuration for useModerationQueueManager @@ -100,11 +100,29 @@ export function useModerationQueueManager(config: ModerationQueueManagerConfig): }); const sort = useModerationSort({ - initialConfig: { field: "created_at", direction: "asc" }, + initialConfig: { field: "created_at", direction: "desc" }, persist: true, storageKey: "moderationQueue_sortConfig", }); + /** + * Map UI sort field to actual database column + */ + const getSortColumn = (field: SortField): string => { + switch (field) { + case 'created_at': + return 'created_at'; + case 'submission_type': + return 'submission_type'; + case 'status': + return 'status'; + case 'escalated': + return 'escalated'; + default: + return 'created_at'; + } + }; + const queue = useModerationQueue(); const entityCache = useEntityCache(); const profileCache = useProfileCache(); @@ -222,8 +240,23 @@ export function useModerationQueueManager(config: ModerationQueueManagerConfig): ) `, ) - .order("escalated", { ascending: false }) - .order("created_at", { ascending: true }); + // Apply user-selected sort configuration + const sortColumn = getSortColumn(sort.field); + const sortAscending = sort.direction === 'asc'; + + console.log('[Query] Applying sort:', { + uiField: sort.field, + dbColumn: sortColumn, + direction: sort.direction, + ascending: sortAscending + }); + + submissionsQuery = submissionsQuery.order(sortColumn, { ascending: sortAscending }); + + // Secondary sort by created_at for consistency when primary sort has ties + if (sortColumn !== 'created_at') { + submissionsQuery = submissionsQuery.order('created_at', { ascending: true }); + } // Apply tab-based status filtering const tab = filters.activeTab; @@ -875,6 +908,33 @@ export function useModerationQueueManager(config: ModerationQueueManagerConfig): }; }, [settings.refreshOnTabVisible]); + // Refetch when sort configuration changes + useEffect(() => { + console.log('🔄 [Sort Changed]', { + field: sort.config.field, + direction: sort.config.direction, + timestamp: new Date().toISOString() + }); + + // Skip if initial fetch hasn't completed yet + if (!initialFetchCompleteRef.current) { + console.log('⏭️ Skipping sort refetch (initial fetch not complete)'); + return; + } + + // Skip if mounting + if (isMountingRef.current) { + console.log('⏭️ Skipping sort refetch (mounting)'); + return; + } + + // Trigger refetch with new sort + if (fetchItemsRef.current) { + console.log('✅ Triggering refetch due to sort change'); + fetchItemsRef.current(false); + } + }, [sort.config.field, sort.config.direction]); + // Initialize realtime subscriptions useRealtimeSubscriptions({ enabled: settings.useRealtimeQueue && !!user, diff --git a/src/lib/moderation/sorting.ts b/src/lib/moderation/sorting.ts index 31a15512..0b77c708 100644 --- a/src/lib/moderation/sorting.ts +++ b/src/lib/moderation/sorting.ts @@ -27,12 +27,6 @@ export function sortModerationItems( comparison = new Date(a.created_at).getTime() - new Date(b.created_at).getTime(); break; - case 'username': - const usernameA = a.user_profile?.username || a.user_profile?.display_name || ''; - const usernameB = b.user_profile?.username || b.user_profile?.display_name || ''; - comparison = usernameA.localeCompare(usernameB); - break; - case 'submission_type': comparison = (a.submission_type || '').localeCompare(b.submission_type || ''); break; @@ -123,8 +117,6 @@ export function getSortFieldLabel(field: SortField): string { switch (field) { case 'created_at': return 'Date Created'; - case 'username': - return 'Submitter'; case 'submission_type': return 'Type'; case 'status': diff --git a/src/types/moderation.ts b/src/types/moderation.ts index 68a059bf..ae93bd55 100644 --- a/src/types/moderation.ts +++ b/src/types/moderation.ts @@ -102,7 +102,7 @@ export type QueueTab = 'mainQueue' | 'archive'; /** * Fields that can be used for sorting the moderation queue */ -export type SortField = 'created_at' | 'username' | 'submission_type' | 'status' | 'escalated'; +export type SortField = 'created_at' | 'submission_type' | 'status' | 'escalated'; /** * Direction for sorting (ascending or descending)