import React, { useState, useEffect } from 'react'; import { Head, router, Link } from '@inertiajs/react'; import AdminLayout from '@/Layouts/AdminLayout'; import { Search, Filter, Download, Users, Mail, MapPin, Calendar, CheckCircle, Clock, XCircle, ExternalLink, MoreVertical, BadgeDollarSign, ShieldAlert, TrendingUp, AlertOctagon, Award, Edit2, Trash2, Check, Phone, ShieldCheck, Building } from 'lucide-react'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Badge } from '@/components/ui/badge'; export default function CharitiesIndex({ sponsors, filters = {}, nationalities = [], stats = {} }) { const [searchTerm, setSearchTerm] = useState(filters.search || ''); const [statusFilter, setStatusFilter] = useState(filters.status || 'All'); const [verificationFilter, setVerificationFilter] = useState(filters.verification || 'All'); const [licenseFilter, setLicenseFilter] = useState(filters.license || 'All'); const [nationalityFilter, setNationalityFilter] = useState(filters.nationality || 'All'); const [sortField, setSortField] = useState(filters.sort_field || 'created_at'); const [sortOrder, setSortOrder] = useState(filters.sort_order || 'desc'); const [selectedSponsor, setSelectedSponsor] = useState(null); const [isDetailsOpen, setIsDetailsOpen] = useState(false); const [isEditOpen, setIsEditOpen] = useState(false); const [editForm, setEditForm] = useState({ id: '', full_name: '', organization_name: '', email: '', mobile: '', city: '', nationality: '', address: '' }); // Handle search/filter queries const triggerSearch = (searchVal, statusVal, verificationVal, licenseVal, nationalityVal, sortF, sortO) => { router.get('/admin/charity-organizations', { search: searchVal, status: statusVal, verification: verificationVal, license: licenseVal, nationality: nationalityVal, sort_field: sortF, sort_order: sortO }, { preserveState: true, preserveScroll: true, replace: true }); }; useEffect(() => { const delayDebounceFn = setTimeout(() => { if (searchTerm !== (filters.search || '')) { triggerSearch(searchTerm, statusFilter, verificationFilter, licenseFilter, nationalityFilter, sortField, sortOrder); } }, 500); return () => clearTimeout(delayDebounceFn); }, [searchTerm]); const handleFilterChange = (status, verification, license, nationality) => { setStatusFilter(status); setVerificationFilter(verification); setLicenseFilter(license); setNationalityFilter(nationality); triggerSearch(searchTerm, status, verification, license, nationality, sortField, sortOrder); }; const handleSort = (field) => { const order = sortField === field && sortOrder === 'desc' ? 'asc' : 'desc'; setSortField(field); setSortOrder(order); triggerSearch(searchTerm, statusFilter, verificationFilter, licenseFilter, nationalityFilter, field, order); }; const handleApprove = (id) => { router.post(`/admin/charity-organizations/${id}/verify`, {}, { onSuccess: () => { setIsDetailsOpen(false); } }); }; const handleSuspend = (id) => { router.post(`/admin/charity-organizations/${id}/suspend`, {}, { onSuccess: () => { setIsDetailsOpen(false); } }); }; const handleActivate = (id) => { router.post(`/admin/charity-organizations/${id}/activate`, {}, { onSuccess: () => { setIsDetailsOpen(false); } }); }; const handleDelete = (id) => { if (confirm('Are you absolutely sure you want to permanently delete this charity organization?')) { router.delete(`/admin/charity-organizations/${id}`); } }; const handleEditClick = (sponsor) => { setEditForm({ id: sponsor.id, full_name: sponsor.full_name, organization_name: sponsor.organization_name || '', email: sponsor.email, mobile: sponsor.mobile, city: sponsor.city || 'Dubai', nationality: sponsor.nationality || '', address: sponsor.address || '' }); setIsEditOpen(true); }; const handleEditSubmit = (e) => { e.preventDefault(); router.post(`/admin/charity-organizations/${editForm.id}/update`, editForm, { onSuccess: () => { setIsEditOpen(false); } }); }; const handleExport = () => { const params = new URLSearchParams({ search: searchTerm, status: statusFilter, verification: verificationFilter, license: licenseFilter, nationality: nationalityFilter, sort_field: sortField, sort_order: sortOrder }); window.location.href = `/admin/charity-organizations/export?${params.toString()}`; }; const viewDetails = (sponsor) => { setSelectedSponsor(sponsor); setIsDetailsOpen(true); }; return (
{/* Statistics Ribbons */}
Total Charities

{stats.total || 0}

Verified

{stats.verified || 0}

Suspended

{stats.suspended || 0}

{/* Search and Filters */}
setSearchTerm(e.target.value)} />
{/* Table */}
handleSort('organization_name')} className="font-bold text-slate-500 text-[10px] uppercase tracking-widest h-14 pl-8 cursor-pointer select-none"> Organization {sortField === 'organization_name' && (sortOrder === 'desc' ? '↓' : '↑')} handleSort('full_name')} className="font-bold text-slate-500 text-[10px] uppercase tracking-widest h-14 cursor-pointer select-none"> Representative {sortField === 'full_name' && (sortOrder === 'desc' ? '↓' : '↑')} handleSort('city')} className="font-bold text-slate-500 text-[10px] uppercase tracking-widest h-14 cursor-pointer select-none"> Location {sortField === 'city' && (sortOrder === 'desc' ? '↓' : '↑')} Verification License Expiry Status Action {sponsors.data.length > 0 ? ( sponsors.data.map((sponsor) => (
{sponsor.organization_name || 'N/A'} ID: ORG-{sponsor.id}

{sponsor.full_name}

{sponsor.email}

{sponsor.city || 'Dubai'}
{sponsor.is_verified ? 'Verified' : 'Pending'}
{sponsor.license_expiry ? new Date(sponsor.license_expiry).toLocaleDateString() : 'N/A'}
{sponsor.status}
Quick Actions handleEditClick(sponsor)} >
Edit Details
{sponsor.status === 'active' ? ( handleSuspend(sponsor.id)} className="p-3 rounded-lg focus:bg-rose-50 cursor-pointer text-rose-600 font-bold" >
Suspend Org
) : ( handleActivate(sponsor.id)} className="p-3 rounded-lg focus:bg-emerald-50 cursor-pointer text-emerald-600 font-bold" >
Activate Org
)} handleDelete(sponsor.id)} className="p-3 rounded-lg focus:bg-red-50 cursor-pointer text-red-600 font-bold" >
Delete Org
)) ) : ( No charity organizations found. )}
{/* Pagination */}
{sponsors.total > 0 ? ( `Showing ${sponsors.from || 0} to ${sponsors.to || 0} of ${sponsors.total} organizations` ) : ( 'No charity organizations found' )} {sponsors.last_page > 1 && (
Previous Next
)}
{/* Details Modal */}
{selectedSponsor?.organization_name?.charAt(0) || 'C'}

{selectedSponsor?.organization_name || 'Charity Details'}

📍 {selectedSponsor?.city || 'Dubai'} • Registered {selectedSponsor?.created_at ? new Date(selectedSponsor.created_at).toLocaleDateString() : ''}

Organization Details

Representative{selectedSponsor?.full_name}
Email Address{selectedSponsor?.email}
Mobile Number{selectedSponsor?.mobile}
Nationality{selectedSponsor?.nationality || 'N/A'}
City / Location{selectedSponsor?.city || 'N/A'}
License Expiry{selectedSponsor?.license_expiry ? new Date(selectedSponsor.license_expiry).toLocaleDateString() : 'N/A'}
Status{selectedSponsor?.status}
Verification{selectedSponsor?.is_verified ? 'Verified' : 'Pending Verification'}
{selectedSponsor?.address &&
Physical Address{selectedSponsor?.address}
}

Uploaded Documents

{selectedSponsor?.license_file ? (
Trade License View Trade License
) : (
Trade License Not Uploaded
)} {selectedSponsor?.emirates_id_file ? (
Emirates ID Document View Emirates ID
) : (
Emirates ID Document Not Uploaded
)}
{selectedSponsor && !selectedSponsor.is_verified && ( )} {selectedSponsor && selectedSponsor.is_verified && selectedSponsor.status === 'active' && ( )} {selectedSponsor && selectedSponsor.is_verified && selectedSponsor.status === 'suspended' && ( )}
{/* Edit Dialog */} Edit Charity Details
setEditForm({ ...editForm, organization_name: e.target.value })} required />
setEditForm({ ...editForm, full_name: e.target.value })} required />
setEditForm({ ...editForm, email: e.target.value })} required />
setEditForm({ ...editForm, mobile: e.target.value })} required />
setEditForm({ ...editForm, nationality: e.target.value })} />
setEditForm({ ...editForm, address: e.target.value })} />
); }