mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-21 21:51:12 -05:00
152 lines
3.7 KiB
TypeScript
152 lines
3.7 KiB
TypeScript
/**
|
|
* 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
|
|
);
|
|
}
|