diff --git a/src/components/moderation/ActiveFiltersDisplay.tsx b/src/components/moderation/ActiveFiltersDisplay.tsx index 174a9b03..6b85793a 100644 --- a/src/components/moderation/ActiveFiltersDisplay.tsx +++ b/src/components/moderation/ActiveFiltersDisplay.tsx @@ -1,14 +1,12 @@ -import { Filter, MessageSquare, FileText, Image, ArrowUp, ArrowDown } from 'lucide-react'; +import { Filter, MessageSquare, FileText, Image } from 'lucide-react'; import { Badge } from '@/components/ui/badge'; -import type { EntityFilter, StatusFilter, SortConfig, SortField } from '@/types/moderation'; +import type { EntityFilter, StatusFilter } from '@/types/moderation'; interface ActiveFiltersDisplayProps { entityFilter: EntityFilter; statusFilter: StatusFilter; - sortConfig: SortConfig; defaultEntityFilter?: EntityFilter; defaultStatusFilter?: StatusFilter; - defaultSortField?: SortField; } const getEntityFilterIcon = (filter: EntityFilter) => { @@ -20,29 +18,17 @@ 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'; - case 'created_at': return 'Date'; - default: return field; - } -}; +// Removed - sorting functionality deleted export const ActiveFiltersDisplay = ({ entityFilter, - statusFilter, - sortConfig, + statusFilter, defaultEntityFilter = 'all', - defaultStatusFilter = 'pending', - defaultSortField = 'created_at' + defaultStatusFilter = 'pending' }: ActiveFiltersDisplayProps) => { const hasActiveFilters = entityFilter !== defaultEntityFilter || - statusFilter !== defaultStatusFilter || - sortConfig.field !== defaultSortField; + statusFilter !== defaultStatusFilter; if (!hasActiveFilters) return null; @@ -60,12 +46,6 @@ export const ActiveFiltersDisplay = ({ {statusFilter} )} - {sortConfig.field !== defaultSortField && ( - - {sortConfig.direction === 'asc' ? : } - Sort: {getSortFieldLabel(sortConfig.field)} - - )} ); }; diff --git a/src/components/moderation/ModerationQueue.tsx b/src/components/moderation/ModerationQueue.tsx index bb308199..48fa5d30 100644 --- a/src/components/moderation/ModerationQueue.tsx +++ b/src/components/moderation/ModerationQueue.tsx @@ -112,11 +112,9 @@ export const ModerationQueue = forwardRef((props, ref) => { @@ -126,7 +124,6 @@ export const ModerationQueue = forwardRef((props, ref) => { )} diff --git a/src/components/moderation/QueueFilters.tsx b/src/components/moderation/QueueFilters.tsx index c47bee32..2e3878cb 100644 --- a/src/components/moderation/QueueFilters.tsx +++ b/src/components/moderation/QueueFilters.tsx @@ -2,17 +2,14 @@ import { Filter, MessageSquare, FileText, Image, X } from 'lucide-react'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Button } from '@/components/ui/button'; -import { QueueSortControls } from './QueueSortControls'; -import type { EntityFilter, StatusFilter, SortConfig } from '@/types/moderation'; +import type { EntityFilter, StatusFilter } from '@/types/moderation'; interface QueueFiltersProps { activeEntityFilter: EntityFilter; activeStatusFilter: StatusFilter; - sortConfig: SortConfig; isMobile: boolean; onEntityFilterChange: (filter: EntityFilter) => void; onStatusFilterChange: (filter: StatusFilter) => void; - onSortConfigChange: (config: SortConfig) => void; onClearFilters: () => void; showClearButton: boolean; } @@ -29,11 +26,9 @@ const getEntityFilterIcon = (filter: EntityFilter) => { export const QueueFilters = ({ activeEntityFilter, activeStatusFilter, - sortConfig, isMobile, onEntityFilterChange, onStatusFilterChange, - onSortConfigChange, onClearFilters, showClearButton }: QueueFiltersProps) => { @@ -112,13 +107,6 @@ export const QueueFilters = ({ - - {/* Sort Controls */} - {/* Clear Filters Button */} diff --git a/src/components/moderation/QueueSortControls.tsx b/src/components/moderation/QueueSortControls.tsx deleted file mode 100644 index 3e2dd352..00000000 --- a/src/components/moderation/QueueSortControls.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import { ArrowUp, ArrowDown } from 'lucide-react'; -import { Label } from '@/components/ui/label'; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; -import { Button } from '@/components/ui/button'; -import type { SortConfig, SortField } from '@/types/moderation'; - -interface QueueSortControlsProps { - sortConfig: SortConfig; - onSortChange: (config: SortConfig) => void; - isMobile?: boolean; - variant?: 'inline' | 'standalone'; - showLabel?: boolean; -} - -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'; - default: return field; - } -}; - -export const QueueSortControls = ({ - sortConfig, - onSortChange, - isMobile = false, - variant = 'inline', - showLabel = true -}: QueueSortControlsProps) => { - const handleFieldChange = (field: SortField) => { - onSortChange({ ...sortConfig, field }); - }; - - const handleDirectionToggle = () => { - onSortChange({ - ...sortConfig, - direction: sortConfig.direction === 'asc' ? 'desc' : 'asc' - }); - }; - - return ( -
- {showLabel && ( - - )} -
- - - -
-
- ); -}; diff --git a/src/hooks/moderation/index.ts b/src/hooks/moderation/index.ts index 8c1604a4..e9727013 100644 --- a/src/hooks/moderation/index.ts +++ b/src/hooks/moderation/index.ts @@ -12,8 +12,7 @@ export type { CachedProfile } from './useProfileCache'; export { useModerationFilters } from './useModerationFilters'; export type { ModerationFilters, ModerationFiltersConfig } from './useModerationFilters'; -export { useModerationSort } from './useModerationSort'; -export type { ModerationSort, ModerationSortConfig } from './useModerationSort'; +// Removed - sorting functionality deleted export { usePagination } from './usePagination'; export type { PaginationState, PaginationConfig } from './usePagination'; diff --git a/src/hooks/moderation/useModerationQueueManager.ts b/src/hooks/moderation/useModerationQueueManager.ts index 3ea47967..76e040bb 100644 --- a/src/hooks/moderation/useModerationQueueManager.ts +++ b/src/hooks/moderation/useModerationQueueManager.ts @@ -6,13 +6,12 @@ import { useEntityCache, useProfileCache, useModerationFilters, - useModerationSort, usePagination, useRealtimeSubscriptions, } 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 } from "@/types/moderation"; /** * Configuration for useModerationQueueManager @@ -44,7 +43,6 @@ export interface ModerationQueueManager { // Sub-hooks (exposed for granular control) filters: ReturnType; pagination: ReturnType; - sort: ReturnType; queue: ReturnType; // Realtime @@ -99,11 +97,7 @@ export function useModerationQueueManager(config: ModerationQueueManagerConfig): }, }); - const sort = useModerationSort({ - initialConfig: { field: "created_at", direction: "asc" }, - persist: true, - storageKey: "moderationQueue_sortConfig", - }); + // Removed - sorting functionality deleted const queue = useModerationQueue(); const entityCache = useEntityCache(); @@ -221,9 +215,7 @@ export function useModerationQueueManager(config: ModerationQueueManagerConfig): status ) `, - ) - .order("escalated", { ascending: false }) - .order("created_at", { ascending: true }); + ); // Apply tab-based status filtering const tab = filters.activeTab; @@ -929,7 +921,6 @@ export function useModerationQueueManager(config: ModerationQueueManagerConfig): actionLoading, filters, pagination, - sort, queue, newItemsCount, pendingNewItems, diff --git a/src/hooks/moderation/useModerationSort.ts b/src/hooks/moderation/useModerationSort.ts deleted file mode 100644 index 35daef6e..00000000 --- a/src/hooks/moderation/useModerationSort.ts +++ /dev/null @@ -1,145 +0,0 @@ -/** - * Moderation Queue Sort Hook - * - * Manages sort configuration for the moderation queue with persistence. - */ - -import { useState, useCallback, useEffect } from 'react'; -import type { SortConfig, SortField, SortDirection } from '@/types/moderation'; -import { - getDefaultSortConfig, - loadSortConfig, - saveSortConfig, - toggleSortDirection as toggleDirection, - isDefaultSortConfig, -} from '@/lib/moderation/sorting'; - -export interface ModerationSortConfig { - /** Initial sort configuration */ - initialConfig?: SortConfig; - - /** Whether to persist sort config */ - persist?: boolean; - - /** localStorage key for persistence */ - storageKey?: string; - - /** Callback when sort config changes */ - onChange?: (config: SortConfig) => void; -} - -export interface ModerationSort { - /** Current sort configuration */ - config: SortConfig; - - /** Sort field */ - field: SortField; - - /** Sort direction */ - direction: SortDirection; - - /** Set sort field */ - setField: (field: SortField) => void; - - /** Set sort direction */ - setDirection: (direction: SortDirection) => void; - - /** Toggle sort direction */ - toggleDirection: () => void; - - /** Set both field and direction */ - setConfig: (config: SortConfig) => void; - - /** Reset to default */ - reset: () => void; - - /** Check if using default config */ - isDefault: boolean; -} - -/** - * Hook for managing moderation queue sort configuration - * - * @param config - Configuration options - * @returns Sort state and actions - * - * @example - * ```tsx - * const sort = useModerationSort({ - * persist: true, - * onChange: (config) => fetchItems(config) - * }); - * - * // Use in component - * - * ``` - */ -export function useModerationSort(config: ModerationSortConfig = {}): ModerationSort { - const { - initialConfig, - persist = true, - storageKey = 'moderationQueue_sortConfig', - onChange, - } = config; - - // Load persisted or use initial/default config - const [sortConfig, setSortConfig] = useState(() => { - if (initialConfig) return initialConfig; - if (persist) return loadSortConfig(storageKey); - return getDefaultSortConfig(); - }); - - // Persist changes - useEffect(() => { - if (persist) { - saveSortConfig(sortConfig, storageKey); - } - onChange?.(sortConfig); - }, [sortConfig, persist, storageKey, onChange]); - - // Set sort field (keep direction) - const setField = useCallback((field: SortField) => { - setSortConfig((prev) => ({ ...prev, field })); - }, []); - - // Set sort direction (keep field) - const setDirection = useCallback((direction: SortDirection) => { - setSortConfig((prev) => ({ ...prev, direction })); - }, []); - - // Toggle sort direction - const toggleSortDirection = useCallback(() => { - setSortConfig((prev) => ({ - ...prev, - direction: toggleDirection(prev.direction), - })); - }, []); - - // Set entire config - const setConfig = useCallback((newConfig: SortConfig) => { - setSortConfig(newConfig); - }, []); - - // Reset to default - const reset = useCallback(() => { - setSortConfig(getDefaultSortConfig()); - }, []); - - // Check if using default config - const isDefault = isDefaultSortConfig(sortConfig); - - return { - config: sortConfig, - field: sortConfig.field, - direction: sortConfig.direction, - setField, - setDirection, - toggleDirection: toggleSortDirection, - setConfig, - reset, - isDefault, - }; -} diff --git a/src/lib/moderation/index.ts b/src/lib/moderation/index.ts index d8a610e5..5e81e3de 100644 --- a/src/lib/moderation/index.ts +++ b/src/lib/moderation/index.ts @@ -43,18 +43,7 @@ export type { DeleteSubmissionConfig, } from './actions'; -// Sorting utilities -export { - sortModerationItems, - getDefaultSortConfig, - loadSortConfig, - saveSortConfig, - toggleSortDirection, - getSortFieldLabel, - isDefaultSortConfig, -} from './sorting'; - -export type { SortConfig, SortField, SortDirection } from '@/types/moderation'; +// Removed - sorting functionality deleted // Realtime subscription utilities export { diff --git a/src/lib/moderation/sorting.ts b/src/lib/moderation/sorting.ts deleted file mode 100644 index 31a15512..00000000 --- a/src/lib/moderation/sorting.ts +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Moderation Queue Sorting Utilities - * - * Provides sorting functions and utilities for moderation queue items. - */ - -import type { ModerationItem, SortField, SortDirection, SortConfig } from '@/types/moderation'; - -/** - * Sort moderation items based on configuration - * - * @param items - Array of moderation items to sort - * @param config - Sort configuration - * @returns Sorted array of items - */ -export function sortModerationItems( - items: ModerationItem[], - config: SortConfig -): ModerationItem[] { - const { field, direction } = config; - - return [...items].sort((a, b) => { - let comparison = 0; - - switch (field) { - case 'created_at': - 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; - - case 'status': - comparison = a.status.localeCompare(b.status); - break; - - case 'escalated': - const escalatedA = a.escalated ? 1 : 0; - const escalatedB = b.escalated ? 1 : 0; - comparison = escalatedB - escalatedA; // Escalated items first - break; - - default: - comparison = 0; - } - - return direction === 'asc' ? comparison : -comparison; - }); -} - -/** - * Get default sort configuration - * - * @returns Default sort config - */ -export function getDefaultSortConfig(): SortConfig { - return { - field: 'created_at', - direction: 'asc', - }; -} - -/** - * Load sort configuration from localStorage - * - * @param key - localStorage key - * @returns Saved sort config or default - */ -export function loadSortConfig(key: string = 'moderationQueue_sortConfig'): SortConfig { - try { - const saved = localStorage.getItem(key); - if (saved) { - return JSON.parse(saved); - } - } catch (error) { - console.error('Failed to load sort config:', error); - } - - return getDefaultSortConfig(); -} - -/** - * Save sort configuration to localStorage - * - * @param config - Sort configuration to save - * @param key - localStorage key - */ -export function saveSortConfig( - config: SortConfig, - key: string = 'moderationQueue_sortConfig' -): void { - try { - localStorage.setItem(key, JSON.stringify(config)); - } catch (error) { - console.error('Failed to save sort config:', error); - } -} - -/** - * Toggle sort direction - * - * @param currentDirection - Current sort direction - * @returns Toggled direction - */ -export function toggleSortDirection(currentDirection: SortDirection): SortDirection { - return currentDirection === 'asc' ? 'desc' : 'asc'; -} - -/** - * Get human-readable label for sort field - * - * @param field - Sort field - * @returns Human-readable label - */ -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': - return 'Status'; - case 'escalated': - return 'Escalated'; - default: - return field; - } -} - -/** - * Check if sort config is default - * - * @param config - Sort configuration to check - * @returns True if config matches default - */ -export function isDefaultSortConfig(config: SortConfig): boolean { - const defaultConfig = getDefaultSortConfig(); - return ( - config.field === defaultConfig.field && - config.direction === defaultConfig.direction - ); -} diff --git a/src/types/moderation.ts b/src/types/moderation.ts index 68a059bf..33b31b84 100644 --- a/src/types/moderation.ts +++ b/src/types/moderation.ts @@ -99,26 +99,7 @@ export type StatusFilter = 'all' | 'pending' | 'partially_approved' | 'flagged' */ 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'; - -/** - * Direction for sorting (ascending or descending) - */ -export type SortDirection = 'asc' | 'desc'; - -/** - * Configuration for sorting the moderation queue - */ -export interface SortConfig { - /** Field to sort by */ - field: SortField; - - /** Direction to sort */ - direction: SortDirection; -} +// Removed - sorting functionality deleted /** * Loading states for the moderation queue