import React, { useState } from 'react'; import { Headphones, MessageCircle, FileText, Search, Plus, Edit, Trash2, Eye, EyeOff, Settings, CheckCircle, Clock, AlertCircle, Star, Filter, Download, Send, User, Calendar, Tag, BarChart3, TrendingUp, Users, Award, X, Save, Upload } from 'lucide-react'; interface SupportTicket { id: string; title: string; description: string; status: 'open' | 'in_progress' | 'resolved' | 'closed'; priority: 'low' | 'medium' | 'high' | 'urgent'; category: 'technical' | 'billing' | 'account' | 'general'; submittedBy: string; assignedTo: string; createdAt: string; updatedAt: string; messages: TicketMessage[]; } interface TicketMessage { id: string; content: string; sender: string; timestamp: string; isInternal: boolean; } interface FAQ { id: string; question: string; answer: string; category: string; tags: string[]; helpful: number; notHelpful: number; } interface SupportResource { id: string; title: string; description: string; type: 'documentation' | 'video' | 'guide' | 'tutorial'; url: string; category: string; tags: string[]; } interface SupportAdminProps { tickets: SupportTicket[]; faqs: FAQ[]; resources: SupportResource[]; onTicketUpdate: (id: string, updates: Partial) => void; onTicketDelete: (id: string) => void; onFAQAdd: (faq: Omit) => void; onFAQUpdate: (id: string, updates: Partial) => void; onFAQDelete: (id: string) => void; onResourceAdd: (resource: Omit) => void; onResourceUpdate: (id: string, updates: Partial) => void; onResourceDelete: (id: string) => void; onExportReport: (type: 'pdf' | 'excel' | 'csv') => void; } const SupportAdmin: React.FC = ({ tickets, faqs, resources, onTicketUpdate, onTicketDelete, onFAQAdd, onFAQUpdate, onFAQDelete, onResourceAdd, onResourceUpdate, onResourceDelete, onExportReport }) => { const [currentView, setCurrentView] = useState<'tickets' | 'faqs' | 'resources' | 'analytics'>('tickets'); const [selectedTicket, setSelectedTicket] = useState(null); const [editingFAQ, setEditingFAQ] = useState(null); const [editingResource, setEditingResource] = useState(null); const [showAddFAQ, setShowAddFAQ] = useState(false); const [showAddResource, setShowAddResource] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const [filterStatus, setFilterStatus] = useState('all'); const [filterPriority, setFilterPriority] = useState('all'); const [filterCategory, setFilterCategory] = useState('all'); const getStatusColor = (status: string) => { switch (status) { case 'open': return 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300'; case 'in_progress': return 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300'; case 'resolved': return 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300'; case 'closed': return 'bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-300'; default: return 'bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-300'; } }; const getPriorityColor = (priority: string) => { switch (priority) { case 'urgent': return 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300'; case 'high': return 'bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-300'; case 'medium': return 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300'; case 'low': return 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300'; default: return 'bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-300'; } }; const filteredTickets = tickets.filter(ticket => { const matchesSearch = ticket.title.toLowerCase().includes(searchQuery.toLowerCase()) || ticket.description.toLowerCase().includes(searchQuery.toLowerCase()); const matchesStatus = filterStatus === 'all' || ticket.status === filterStatus; const matchesPriority = filterPriority === 'all' || ticket.priority === filterPriority; const matchesCategory = filterCategory === 'all' || ticket.category === filterCategory; return matchesSearch && matchesStatus && matchesPriority && matchesCategory; }); const handleFAQSubmit = (e: React.FormEvent) => { e.preventDefault(); const formData = new FormData(e.target as HTMLFormElement); const newFAQ: Omit = { question: formData.get('question') as string, answer: formData.get('answer') as string, category: formData.get('category') as string, tags: (formData.get('tags') as string).split(',').map(tag => tag.trim()), helpful: 0, notHelpful: 0 }; onFAQAdd(newFAQ); setShowAddFAQ(false); (e.target as HTMLFormElement).reset(); }; const handleResourceSubmit = (e: React.FormEvent) => { e.preventDefault(); const formData = new FormData(e.target as HTMLFormElement); const newResource: Omit = { title: formData.get('title') as string, description: formData.get('description') as string, type: formData.get('type') as 'documentation' | 'video' | 'guide' | 'tutorial', url: formData.get('url') as string, category: formData.get('category') as string, tags: (formData.get('tags') as string).split(',').map(tag => tag.trim()) }; onResourceAdd(newResource); setShowAddResource(false); (e.target as HTMLFormElement).reset(); }; return (
{/* Header */}

Support Administration

Manage tickets, FAQs, and resources

{/* View Toggle Buttons */}
{/* Content Based on Current View */} {currentView === 'tickets' && (
{/* Search and Filters */}
setSearchQuery(e.target.value)} className="input pl-10 w-full" />
{/* Tickets List */}
{filteredTickets.map((ticket) => (

{ticket.title}

{ticket.status.replace('_', ' ')} {ticket.priority}

{ticket.description}

{ticket.submittedBy}
{new Date(ticket.createdAt).toLocaleDateString()}
{ticket.messages.length} messages
))}
)} {currentView === 'faqs' && (

Manage FAQs

{faqs.map((faq) => (

{faq.question}

{faq.answer}

Category: {faq.category} Helpful: {faq.helpful} Not Helpful: {faq.notHelpful}
))}
)} {currentView === 'resources' && (

Manage Resources

{resources.map((resource) => (

{resource.title}

{resource.type}

{resource.description}

{resource.tags.slice(0, 2).map((tag) => ( {tag} ))}
))}
)} {currentView === 'analytics' && (

Support Analytics

Total Tickets

{tickets.length}

Open Tickets

{tickets.filter(t => t.status === 'open').length}

Resolved

{tickets.filter(t => t.status === 'resolved').length}

FAQs

{faqs.length}

Quick Actions

)} {/* Add FAQ Modal */} {showAddFAQ && (

Add New FAQ

)} {/* Add Resource Modal */} {showAddResource && (

Add New Resource

)}
); }; export default SupportAdmin;