import React, { useState, useEffect } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { Scale, Plus, Search, Filter, Calendar, Users, FileText, Clock, CheckCircle, AlertCircle, MoreHorizontal, Eye, Edit, Trash2 } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Card } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { useToast } from '@/hooks/use-toast'; import { CreateCaseModal } from './CreateCaseModal'; import { CaseDetailsModal } from './CaseDetailsModal'; interface LegalCase { id: string; caseNumber: string; caseType: string; jurisdiction: string; status: 'PENDING' | 'ACTIVE' | 'DISCOVERY' | 'TRIAL' | 'CLOSED' | 'SETTLED'; filingDate: string; petitioner: string; respondent: string; judge: string; artifactCount: number; lastActivity: string; nextHearing?: string; priority: 'low' | 'medium' | 'high' | 'urgent'; tags: string[]; } export function CaseManagement() { const [cases, setCases] = useState([]); const [filteredCases, setFilteredCases] = useState([]); const [selectedCase, setSelectedCase] = useState(null); const [showCreateModal, setShowCreateModal] = useState(false); const [showDetailsModal, setShowDetailsModal] = useState(false); const [searchTerm, setSearchTerm] = useState(''); const [statusFilter, setStatusFilter] = useState('all'); const [typeFilter, setTypeFilter] = useState('all'); const [isLoading, setIsLoading] = useState(true); const { toast } = useToast(); const statusColors = { PENDING: 'bg-yellow-500/20 text-yellow-400 border-yellow-500/30', ACTIVE: 'bg-blue-500/20 text-blue-400 border-blue-500/30', DISCOVERY: 'bg-purple-500/20 text-purple-400 border-purple-500/30', TRIAL: 'bg-orange-500/20 text-orange-400 border-orange-500/30', CLOSED: 'bg-gray-500/20 text-gray-400 border-gray-500/30', SETTLED: 'bg-green-500/20 text-green-400 border-green-500/30', }; const priorityColors = { low: 'bg-gray-500/20 text-gray-400', medium: 'bg-blue-500/20 text-blue-400', high: 'bg-orange-500/20 text-orange-400', urgent: 'bg-red-500/20 text-red-400', }; useEffect(() => { fetchCases(); }, []); useEffect(() => { filterCases(); }, [searchTerm, statusFilter, typeFilter, cases]); const fetchCases = async () => { try { const response = await fetch('/api/v1/cases', { headers: { 'Authorization': `Bearer ${localStorage.getItem('chittychain_token')}`, }, }); if (!response.ok) { throw new Error('Failed to fetch cases'); } const data = await response.json(); setCases(data.cases || []); } catch (error) { console.error('Error fetching cases:', error); toast({ title: "Error", description: "Failed to load cases", variant: "destructive", }); } finally { setIsLoading(false); } }; const filterCases = () => { let filtered = cases; if (searchTerm) { filtered = filtered.filter(c => c.caseNumber.toLowerCase().includes(searchTerm.toLowerCase()) || c.petitioner.toLowerCase().includes(searchTerm.toLowerCase()) || c.respondent.toLowerCase().includes(searchTerm.toLowerCase()) || c.judge.toLowerCase().includes(searchTerm.toLowerCase()) ); } if (statusFilter !== 'all') { filtered = filtered.filter(c => c.status === statusFilter); } if (typeFilter !== 'all') { filtered = filtered.filter(c => c.caseType === typeFilter); } setFilteredCases(filtered); }; const handleCaseCreated = (newCase: LegalCase) => { setCases(prev => [newCase, ...prev]); setShowCreateModal(false); toast({ title: "Case Created", description: `Case ${newCase.caseNumber} has been created successfully`, }); }; const handleViewCase = (caseItem: LegalCase) => { setSelectedCase(caseItem); setShowDetailsModal(true); }; const handleDeleteCase = async (caseId: string) => { try { const response = await fetch(`/api/v1/cases/${caseId}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${localStorage.getItem('chittychain_token')}`, }, }); if (!response.ok) { throw new Error('Failed to delete case'); } setCases(prev => prev.filter(c => c.id !== caseId)); toast({ title: "Case Deleted", description: "Case has been permanently deleted", }); } catch (error) { toast({ title: "Error", description: "Failed to delete case", variant: "destructive", }); } }; const getStatusIcon = (status: string) => { switch (status) { case 'PENDING': return ; case 'ACTIVE': return ; case 'DISCOVERY': return ; case 'TRIAL': return ; case 'CLOSED': return ; case 'SETTLED': return ; default: return ; } }; if (isLoading) { return (
{Array.from({ length: 5 }).map((_, i) => (
))}
); } return (
{/* Header */}

Case Management

Manage legal cases with blockchain-verified evidence chains

{/* Filters */}
setSearchTerm(e.target.value)} className="pl-10 bg-gray-900/50 border-gray-800 text-white" />
{filteredCases.length} of {cases.length} cases
{/* Cases Grid */}
{filteredCases.map((caseItem, index) => ( handleViewCase(caseItem)}>
{/* Case Header */}

{caseItem.caseNumber}

{caseItem.caseType}

{getStatusIcon(caseItem.status)} {caseItem.status} {caseItem.priority}
{/* Case Details */}
Petitioner:

{caseItem.petitioner}

Respondent:

{caseItem.respondent || 'N/A'}

Judge:

{caseItem.judge || 'Unassigned'}

{/* Case Stats */}
{caseItem.artifactCount} artifacts
Filed {new Date(caseItem.filingDate).toLocaleDateString()}
Updated {new Date(caseItem.lastActivity).toLocaleDateString()}
{/* Tags */} {caseItem.tags.length > 0 && (
{caseItem.tags.slice(0, 3).map((tag, i) => ( {tag} ))} {caseItem.tags.length > 3 && ( +{caseItem.tags.length - 3} more )}
)}
{/* Actions */} e.stopPropagation()}> handleViewCase(caseItem)}> View Details Edit Case handleDeleteCase(caseItem.id)} className="text-red-400 focus:text-red-300" > Delete Case
))}
{filteredCases.length === 0 && !isLoading && (

No cases found

{searchTerm || statusFilter !== 'all' || typeFilter !== 'all' ? 'Try adjusting your filters to see more cases' : 'Get started by creating your first case' }

{!searchTerm && statusFilter === 'all' && typeFilter === 'all' && ( )}
)}
{/* Modals */} setShowCreateModal(false)} onCaseCreated={handleCaseCreated} /> {selectedCase && ( setShowDetailsModal(false)} caseData={selectedCase} /> )}
); }