"use client"; import { useState, FormEvent } from 'react'; import { checkTicketStatus, SupportTicket } from '@/lib/api/supportService'; const TicketStatusCheck = () => { const [ticketNumber, setTicketNumber] = useState(''); const [isSearching, setIsSearching] = useState(false); const [searchError, setSearchError] = useState(null); const [ticket, setTicket] = useState(null); const handleSubmit = async (e: FormEvent) => { e.preventDefault(); setIsSearching(true); setSearchError(null); setTicket(null); try { const response = await checkTicketStatus(ticketNumber); setTicket(response); } catch (error: any) { if (error.message === 'Ticket not found') { setSearchError('Ticket not found. Please check your ticket number and try again.'); } else { setSearchError('An error occurred while searching. Please try again.'); } } finally { setIsSearching(false); } }; const formatDate = (dateString: string) => { const date = new Date(dateString); return date.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' }); }; const getRelativeTime = (dateString: string) => { const date = new Date(dateString); const now = new Date(); const diffMs = now.getTime() - date.getTime(); const diffMins = Math.floor(diffMs / 60000); const diffHours = Math.floor(diffMins / 60); const diffDays = Math.floor(diffHours / 24); if (diffMins < 60) return `${diffMins} minute${diffMins !== 1 ? 's' : ''} ago`; if (diffHours < 24) return `${diffHours} hour${diffHours !== 1 ? 's' : ''} ago`; if (diffDays < 7) return `${diffDays} day${diffDays !== 1 ? 's' : ''} ago`; return formatDate(dateString); }; const getStatusIcon = (statusName: string) => { const status = statusName.toLowerCase(); if (status.includes('open') || status.includes('new')) return 'fa-inbox'; if (status.includes('progress') || status.includes('working')) return 'fa-spinner'; if (status.includes('pending') || status.includes('waiting')) return 'fa-clock'; if (status.includes('resolved') || status.includes('closed')) return 'fa-check-circle'; return 'fa-ticket'; }; const getPriorityIcon = (priorityName: string) => { const priority = priorityName.toLowerCase(); if (priority.includes('urgent') || priority.includes('critical')) return 'fa-exclamation-triangle'; if (priority.includes('high')) return 'fa-arrow-up'; if (priority.includes('medium')) return 'fa-minus'; if (priority.includes('low')) return 'fa-arrow-down'; return 'fa-flag'; }; return (

Check Ticket Status

Track your support request in real-time with instant status updates

setTicketNumber(e.target.value.toUpperCase())} placeholder="TKT-YYYYMMDD-XXXXX" required className="search-input-enterprise" pattern="TKT-\d{8}-[A-Z0-9]{5}" title="Please enter a valid ticket number (e.g., TKT-20231015-ABCDE)" /> {ticketNumber && ( )}

Enter your ticket number exactly as it appears in your confirmation email

{searchError && (
Ticket Not Found

{searchError}

)} {ticket && (
{/* Header Section */}
Ticket Number
{ticket.ticket_number}
{ticket.status_name}
{/* Info Cards Section */}
Created {getRelativeTime(ticket.created_at)}
Last Updated {getRelativeTime(ticket.updated_at)}
{ticket.priority_name && (
Priority {ticket.priority_name}
)} {ticket.category_name && (
Category {ticket.category_name}
)}
{/* Main Content */}

{ticket.title}

{ticket.user_name} {ticket.company && ( {ticket.company} )}

Description

{ticket.description}

{/* Messages Section */} {ticket.messages && ticket.messages.filter(msg => !msg.is_internal).length > 0 && (

Conversation {ticket.messages.filter(msg => !msg.is_internal).length}

{ticket.messages .filter(msg => !msg.is_internal) .map((message) => (
{message.author_name || message.author_email} {getRelativeTime(message.created_at)}
{message.content}
))}
)} {/* Activity Timeline */} {ticket.activities && ticket.activities.length > 0 && (

Activity Timeline

{ticket.activities.slice(0, 5).map((activity, index) => (
{activity.description}
{getRelativeTime(activity.created_at)}
))}
)}
{/* Footer Actions */}
This ticket is securely tracked and monitored by our support team
)}
); }; export default TicketStatusCheck;