diff --git a/src/components/Admin/dashboardContent/ForumReportsContent.tsx b/src/components/Admin/dashboardContent/ForumReportsContent.tsx index 3ddce00..661882c 100644 --- a/src/components/Admin/dashboardContent/ForumReportsContent.tsx +++ b/src/components/Admin/dashboardContent/ForumReportsContent.tsx @@ -22,6 +22,9 @@ import { MessageSquare, User, Calendar, + Copy, + History, + Layers, } from 'lucide-react'; interface ForumPostReport { @@ -92,6 +95,7 @@ const ForumReportsContent: React.FC = () => { const [statusFilter, setStatusFilter] = useState('all'); const [priorityFilter, setPriorityFilter] = useState('all'); const [aiResultFilter, setAiResultFilter] = useState('all'); + const [multiReportFilter, setMultiReportFilter] = useState('all'); const [searchQuery, setSearchQuery] = useState(''); // Pagination @@ -99,6 +103,44 @@ const ForumReportsContent: React.FC = () => { const [totalPages, setTotalPages] = useState(1); const [totalCount, setTotalCount] = useState(0); + // Helper functions for multiple reports detection + const getPostReportsCount = useCallback((postId: string) => { + if (!postId) return { total: 0, pending: 0, resolved: 0 }; + + const postReports = reports.filter(report => + report.postId?._id === postId || + report.postSnapshot.authorId === postId // fallback in case postId is null + ); + + const pending = postReports.filter(r => + r.status === 'pending' || r.status === 'under_review' + ).length; + + const resolved = postReports.filter(r => + r.status === 'resolved' || r.status === 'dismissed' || r.status === 'auto_resolved' + ).length; + + return { total: postReports.length, pending, resolved }; + }, [reports]); + + const hasMultipleReports = useCallback((report: ForumPostReport) => { + const postId = report.postId?._id; + if (!postId) return false; + + const counts = getPostReportsCount(postId); + return counts.total > 1; + }, [getPostReportsCount]); + + const getRelatedReports = useCallback((report: ForumPostReport) => { + const postId = report.postId?._id; + if (!postId) return []; + + return reports.filter(r => + r._id !== report._id && + (r.postId?._id === postId || r.postSnapshot.authorId === postId) + ); + }, [reports]); + // Load reports const fetchReports = useCallback(async () => { try { @@ -136,18 +178,30 @@ const ForumReportsContent: React.FC = () => { // Filter reports by search query const filteredReports = useMemo(() => { - if (!searchQuery.trim()) return reports; + let filtered = reports; - const query = searchQuery.toLowerCase(); - return reports.filter(report => - report.postSnapshot.title.toLowerCase().includes(query) || - report.postSnapshot.content.toLowerCase().includes(query) || - report.postSnapshot.authorName.toLowerCase().includes(query) || - report.reportedBy.firstName.toLowerCase().includes(query) || - report.reportedBy.lastName.toLowerCase().includes(query) || - report.description.toLowerCase().includes(query) - ); - }, [reports, searchQuery]); + // Apply search filter + if (searchQuery.trim()) { + const query = searchQuery.toLowerCase(); + filtered = filtered.filter(report => + report.postSnapshot.title.toLowerCase().includes(query) || + report.postSnapshot.content.toLowerCase().includes(query) || + report.postSnapshot.authorName.toLowerCase().includes(query) || + report.reportedBy.firstName.toLowerCase().includes(query) || + report.reportedBy.lastName.toLowerCase().includes(query) || + report.description.toLowerCase().includes(query) + ); + } + + // Apply multiple reports filter + if (multiReportFilter === 'multiple') { + filtered = filtered.filter(report => hasMultipleReports(report)); + } else if (multiReportFilter === 'single') { + filtered = filtered.filter(report => !hasMultipleReports(report)); + } + + return filtered; + }, [reports, searchQuery, multiReportFilter, hasMultipleReports]); // Handle admin actions const handleAction = async (reportId: string, action: string, adminResponse: string = '') => { @@ -379,7 +433,7 @@ const ForumReportsContent: React.FC = () => { {/* Stats Cards */} -
+
@@ -404,6 +458,35 @@ const ForumReportsContent: React.FC = () => {
+ + +
+ +
+

Multi-Reported Posts

+

+ {(() => { + const postIds = new Set(); + const multiReportedPosts = new Set(); + + reports.forEach(report => { + const postId = report.postId?._id; + if (postId) { + if (postIds.has(postId)) { + multiReportedPosts.add(postId); + } else { + postIds.add(postId); + } + } + }); + + return multiReportedPosts.size; + })()} +

+
+
+
+
@@ -451,7 +534,7 @@ const ForumReportsContent: React.FC = () => {
{/* Filters */} -
+
+ +