import React, { useState } from 'react';
import { Head, router } from '@inertiajs/react';
import AdminLayout from '@/Layouts/AdminLayout';
import {
Plus,
Search,
GripVertical,
Edit2,
Trash2,
Info,
ShieldAlert
} from 'lucide-react';
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from '@/components/ui/table';
import {
Dialog,
DialogContent,
DialogHeader,
DialogTitle,
DialogFooter,
} from "@/components/ui/dialog";
export default function ReportReasons({ reasons }) {
const [searchTerm, setSearchTerm] = useState('');
const [isDialogOpen, setIsDialogOpen] = useState(false);
const [editingReason, setEditingReason] = useState(null);
const [reasonName, setReasonName] = useState('');
const [reasonStatus, setReasonStatus] = useState('Active');
const [reasonType, setReasonType] = useState('Chat');
const [error, setError] = useState('');
const handleOpenAdd = () => {
setEditingReason(null);
setReasonName('');
setReasonStatus('Active');
setReasonType('Chat');
setError('');
setIsDialogOpen(true);
};
const handleOpenEdit = (reason) => {
setEditingReason(reason);
setReasonName(reason.reason);
setReasonStatus(reason.status);
setReasonType(reason.type || 'Chat');
setError('');
setIsDialogOpen(true);
};
const handleSubmit = (e) => {
e.preventDefault();
if (!reasonName.trim()) {
setError('Reason description is required.');
return;
}
if (editingReason) {
router.post(`/admin/master-data/reasons/${editingReason.id}/update`, {
reason: reasonName.trim(),
status: reasonStatus,
type: reasonType
}, {
onSuccess: () => {
setIsDialogOpen(false);
},
onError: (err) => {
setError(err.reason || 'Failed to update reason.');
}
});
} else {
router.post('/master-data/reasons', {
reason: reasonName.trim(),
type: reasonType
}, {
onSuccess: () => {
setIsDialogOpen(false);
},
onError: (err) => {
setError(err.reason || 'Failed to add reason.');
}
});
}
};
const handleDelete = (id) => {
if (confirm('Are you sure you want to delete this report reason?')) {
router.delete(`/admin/master-data/reasons/${id}`);
}
};
const filteredReasons = reasons.filter(reason =>
reason.reason.toLowerCase().includes(searchTerm.toLowerCase()) ||
reason.type.toLowerCase().includes(searchTerm.toLowerCase())
);
const getTypeBadgeClass = (type) => {
switch (type) {
case 'Chat':
return 'bg-blue-50 text-blue-700 border border-blue-200';
case 'Review':
return 'bg-purple-50 text-purple-700 border border-purple-200';
case 'Support':
return 'bg-amber-50 text-amber-700 border border-amber-200';
default:
return 'bg-teal-50 text-teal-700 border border-teal-200';
}
};
return (
Manage safety & moderation report reasons
Tip: Scoping reasons to "Chat Only" or "Support Ticket Only" helps filter options correctly on the client and admin UIs.