/** * Moderation Queue Sort Hook * * Manages sort configuration for the moderation queue with persistence. */ import { useState, useCallback, useEffect, useMemo } 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 useMemo(() => ({ config: sortConfig, field: sortConfig.field, direction: sortConfig.direction, setField, setDirection, toggleDirection: toggleSortDirection, setConfig, reset, isDefault, }), [sortConfig, setField, setDirection, toggleSortDirection, setConfig, reset, isDefault]); }