import React, { useEffect, useState, useRef } from 'react'; import { useNavigate, useLocation } from 'react-router-dom'; import { Activity, CheckCircle2, ShieldCheck, User, Clock, ArrowRight, Loader2, FileText, Zap } from 'lucide-react'; import useTicketStore from "../../store/ticketStore"; import useAuthStore from "../../store/authStore"; import { Card, CardContent } from "../../components/ui/card"; import TicketTimeline from "../components/TicketTimeline"; import axios from 'axios'; import { API_CONFIG } from '../../config'; const TicketTracking = () => { const navigate = useNavigate(); const location = useLocation(); const { aiTicket, addTicket } = useTicketStore(); const { user, profile } = useAuthStore(); const [isCreating, setIsCreating] = useState(true); const [error, setError] = useState(null); const [createdTicket, setCreatedTicket] = useState(null); const hasCreated = useRef(false); useEffect(() => { if (!aiTicket) { navigate('/create-ticket'); return; } const resolutionSteps = location.state?.resolutionSteps || []; const finalizeTracking = async () => { if (hasCreated.current) return; hasCreated.current = true; try { // Determine the correct status const isAutoResolved = aiTicket.auto_resolve || false; const status = isAutoResolved ? 'auto_resolved' : 'pending_human'; // Map AI Analysis into the TicketSaveRequest format const savePayload = { user_id: user?.id, subject: aiTicket.summary, description: aiTicket.originalIssue || aiTicket.summary, category: aiTicket.category, subcategory: aiTicket.subcategory, priority: aiTicket.priority, assigned_team: aiTicket.assigned_team, status: status, auto_resolve: isAutoResolved, is_duplicate: aiTicket.duplicate_ticket?.is_duplicate || false, confidence: aiTicket.confidence, image_url: aiTicket.image_url || null, company: profile?.company || "System", company_id: profile?.company_id || null, sla_breach_at: aiTicket.sla_breach_at, metadata: { confidence: aiTicket.confidence, entities: aiTicket.entities, decision_factors: aiTicket.decision_factors, ocr_text: aiTicket.ocr_text, image_description: aiTicket.image_description }, entities: aiTicket.entities, solution_steps: resolutionSteps, ocr_text: aiTicket.ocr_text || "", needs_review: aiTicket.needs_review, routing_confidence: aiTicket.confidence }; const res = await axios.post(`${API_CONFIG.BACKEND_URL}/tickets/save`, savePayload); if (res.data?.ticket_id) { const newTicket = { ...aiTicket, id: res.data.ticket_id, ticket_id: res.data.ticket_id, status }; addTicket(newTicket); setCreatedTicket(newTicket); setIsCreating(false); // Redirect to the detail page after a short confirmation pause setTimeout(() => { navigate(`/ticket/${res.data.ticket_id}`); }, 2500); } else { throw new Error("Failed to retrieve ID from backend."); } } catch (err) { console.error("Tracking Error:", err); setError(err.message || "Failed to create ticket."); setIsCreating(false); } }; finalizeTracking(); }, [aiTicket, addTicket, navigate, user, profile?.company, location.state]); if (!aiTicket) return null; return (
{/* Animation Section */}
{isCreating ? ( ) : error ? ( ) : ( )}

{isCreating ? "Escalating to Specialists" : error ? "Something went wrong" : "Successfully Escalated"}

{isCreating ? `We're assigning your ${aiTicket.category || 'support'} request to the right team.` : error ? error : "Your ticket has been created and assigned. Redirecting to tracking..." }

{/* Dynamic Status Steps — shows real AI data */}
AI Analysis Complete {aiTicket.category || 'General'}
{isCreating ? : error ? : } {error ? 'Failed to create ticket' : 'Creating Support Ticket'}
{createdTicket ? : } {createdTicket ? `Assigned → ${createdTicket.assigned_team}` : 'Agent Assignment Pending'}
{/* Dynamic Ticket Timeline — passes the REAL ticket with Supabase data */} {createdTicket && }
); }; export default TicketTracking;