feat: Implement enhanced moderation system

This commit is contained in:
gpt-engineer-app[bot]
2025-09-30 13:41:19 +00:00
parent 04c5ef58ff
commit 083a4af08c
8 changed files with 1140 additions and 2 deletions

View File

@@ -1,5 +1,5 @@
import { useState, useEffect, useImperativeHandle, forwardRef } from 'react';
import { CheckCircle, XCircle, Eye, Calendar, User, Filter, MessageSquare, FileText, Image, X, Trash2 } from 'lucide-react';
import { CheckCircle, XCircle, Eye, Calendar, User, Filter, MessageSquare, FileText, Image, X, Trash2, ListTree } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { Card, CardContent, CardHeader } from '@/components/ui/card';
@@ -13,6 +13,7 @@ import { useUserRole } from '@/hooks/useUserRole';
import { useAuth } from '@/hooks/useAuth';
import { format } from 'date-fns';
import { PhotoModal } from './PhotoModal';
import { SubmissionReviewManager } from './SubmissionReviewManager';
interface ModerationItem {
id: string;
@@ -56,6 +57,8 @@ export const ModerationQueue = forwardRef<ModerationQueueRef>((props, ref) => {
const [photoModalOpen, setPhotoModalOpen] = useState(false);
const [selectedPhotos, setSelectedPhotos] = useState<any[]>([]);
const [selectedPhotoIndex, setSelectedPhotoIndex] = useState(0);
const [reviewManagerOpen, setReviewManagerOpen] = useState(false);
const [selectedSubmissionId, setSelectedSubmissionId] = useState<string | null>(null);
const { toast } = useToast();
const { isAdmin, isSuperuser } = useUserRole();
const { user } = useAuth();
@@ -1204,7 +1207,23 @@ export const ModerationQueue = forwardRef<ModerationQueueRef>((props, ref) => {
/>
</div>
<div className="flex gap-2 pt-2">
<div className="flex flex-col sm:flex-row gap-2 pt-2">
{/* Show Review Items button for content submissions */}
{item.type === 'content_submission' && (
<Button
onClick={() => {
setSelectedSubmissionId(item.id);
setReviewManagerOpen(true);
}}
disabled={actionLoading === item.id}
variant="outline"
className="flex-1"
>
<ListTree className="w-4 h-4 mr-2" />
Review Items
</Button>
)}
<Button
onClick={() => handleModerationAction(item, 'approved', notes[item.id])}
disabled={actionLoading === item.id}
@@ -1437,6 +1456,18 @@ export const ModerationQueue = forwardRef<ModerationQueueRef>((props, ref) => {
isOpen={photoModalOpen}
onClose={() => setPhotoModalOpen(false)}
/>
{/* Submission Review Manager for multi-entity submissions */}
{selectedSubmissionId && (
<SubmissionReviewManager
submissionId={selectedSubmissionId}
open={reviewManagerOpen}
onOpenChange={setReviewManagerOpen}
onComplete={() => {
fetchItems(activeEntityFilter, activeStatusFilter);
}}
/>
)}
</div>
);
});