import React, { useState } from 'react';
import { Head, router } from '@inertiajs/react';
import AdminLayout from '@/Layouts/AdminLayout';
import {
ShieldAlert,
AlertTriangle,
CheckCircle,
XCircle,
Filter,
Flag,
Eye,
Plus,
UserX,
Settings,
FileText,
MessageSquare,
Search,
ChevronDown,
MoreVertical,
Clock,
Shield
} from 'lucide-react';
import { Badge } from '@/components/ui/badge';
import {
Dialog,
DialogContent,
DialogHeader,
DialogTitle,
} from '@/components/ui/dialog';
export default function SafetyHub({ reports, rules, moderation_queue }) {
const [selectedReport, setSelectedReport] = useState(null);
const [isDialogOpen, setIsDialogOpen] = useState(false);
const [resolutionAction, setResolutionAction] = useState('warn');
const [adminNotes, setAdminNotes] = useState('');
// Tab and filter states
const [activeTab, setActiveTab] = useState('All Reports');
const [searchQuery, setSearchQuery] = useState('');
const [statusFilter, setStatusFilter] = useState('All Status');
const [typeFilter, setTypeFilter] = useState('All Types');
const handleResolve = (e) => {
e.preventDefault();
if (!selectedReport) return;
router.post(`/admin/safety/reports/${selectedReport.id}/resolve`, {
action: resolutionAction,
admin_notes: adminNotes
}, {
onSuccess: () => {
setIsDialogOpen(false);
setSelectedReport(null);
setAdminNotes('');
}
});
};
// Filter reports based on active tab, search query, type, and status
const filteredReports = (reports || []).filter(report => {
// Tab filter
if (activeTab !== 'All Reports') {
if (activeTab === 'Chats' && report.type !== 'Chat') return false;
if (activeTab === 'Reviews' && report.type !== 'Review') return false;
}
// Type filter dropdown
if (typeFilter !== 'All Types' && report.type !== typeFilter) return false;
// Status filter dropdown
if (statusFilter !== 'All Status' && report.status !== statusFilter) return false;
// Search query
if (searchQuery.trim() !== '') {
const query = searchQuery.toLowerCase();
return (
report.id.toLowerCase().includes(query) ||
report.reason.toLowerCase().includes(query) ||
report.reported_user_name.toLowerCase().includes(query) ||
report.reported_by_name.toLowerCase().includes(query)
);
}
return true;
});
return (
Review and take action on reported content, users and reviews.
| Report ID | Type | Reported User | Reported By | Reason | Status | Reported At | Actions | ||
|---|---|---|---|---|---|---|---|---|---|
| {report.id} | {report.type} |
{report.reported_user_name}
{report.reported_user_role}
|
{report.reported_by_name}
{report.reported_by_role}
|
{report.reason} | {report.status} | {report.reported_at} |
|
||
| No incident reports found matching your criteria. | |||||||||