import React, { useState } from 'react';
import { Head, router } from '@inertiajs/react';
import AdminLayout from '@/Layouts/AdminLayout';
import {
Scale,
MessageSquare,
Download,
BadgeDollarSign,
AlertCircle,
CheckCircle,
FileText,
ArrowRight,
ArrowUpRight,
User,
ShieldCheck,
Send,
Search,
ChevronDown,
MoreVertical,
Clock,
Eye,
Plus,
X,
Folder,
AlertTriangle,
Hourglass
} from 'lucide-react';
import { Badge } from '@/components/ui/badge';
export default function DisputesHub({ tickets }) {
const [selectedTicket, setSelectedTicket] = useState(null);
const [isWorkspaceOpen, setIsWorkspaceOpen] = useState(false);
// Notes / Resolution states
const [internalNote, setInternalNote] = useState('');
const [resolutionAction, setResolutionAction] = useState('refund_employer');
const [resolutionSummary, setResolutionSummary] = useState('');
// Filters
const [searchQuery, setSearchQuery] = useState('');
const [statusFilter, setStatusFilter] = useState('All Status');
const [priorityFilter, setPriorityFilter] = useState('All Priority');
const [typeFilter, setTypeFilter] = useState('All Types');
const [sortBy, setSortBy] = useState('Newest First');
const handleAddNote = (e) => {
e.preventDefault();
if (!internalNote.trim() || !selectedTicket) return;
router.post(`/admin/disputes/${selectedTicket.id}/add-note`, { note: internalNote }, {
onSuccess: () => {
selectedTicket.admin_notes += "\n• " + internalNote;
setInternalNote('');
}
});
};
const handleResolve = (e) => {
if (e) e.preventDefault();
if (!selectedTicket) return;
router.post(`/admin/disputes/${selectedTicket.id}/resolve`, {
resolution: internalNote || 'Resolved by mediator',
action_taken: 'close_ticket'
}, {
onSuccess: () => {
selectedTicket.status = 'Resolved';
setIsWorkspaceOpen(false);
setSelectedTicket(null);
setInternalNote('');
}
});
};
// Filter tickets
const filteredTickets = (tickets || []).filter(ticket => {
// Status filter
if (statusFilter !== 'All Status' && ticket.status !== statusFilter) return false;
// Priority filter
if (priorityFilter !== 'All Priority' && ticket.priority !== priorityFilter) return false;
// Type filter
if (typeFilter !== 'All Types' && ticket.type !== typeFilter) return false;
// Search query
if (searchQuery.trim() !== '') {
const query = searchQuery.toLowerCase();
return (
ticket.id.toLowerCase().includes(query) ||
ticket.party_one_name.toLowerCase().includes(query) ||
ticket.party_two_name.toLowerCase().includes(query) ||
ticket.reason.toLowerCase().includes(query)
);
}
return true;
});
return (
Handle complaints and resolve disputes between workers and employers.
| Dispute ID | Raised By | Type | Reason | Status | Created At | Actions | ||
|---|---|---|---|---|---|---|---|---|
| {ticket.id} |
{ticket.party_one_name}
{ticket.party_one_role}
|
{ticket.type} | {ticket.reason} | {ticket.status} | {ticket.created_at} |
|
||
| No active disputes found matching your criteria. | ||||||||
Assigned Mediator: {selectedTicket.assigned_to}
Official authenticated conversation history audits
{log.message}
Send a message to both parties or resolve the dispute.