'use client'; import { useEffect, useMemo, useState } from 'react'; import { usePathname, useRouter, useSearchParams } from 'next/navigation'; import { Component, ListChecks } from 'lucide-react'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent } from '@/components/ui/card'; import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { DEFECT_CLASS_STATUS_CONFIG } from '@/constants/defectClassStatus'; import { cn } from '@/lib/utils'; import type { TicketOverviewDetail } from '@/types'; import { useTicketDefectClassesQuery } from '../../hooks/useTicketQueries'; import { TicketClassDetectionPreview } from './TicketClassDetectionPreview'; interface TicketDefectClassTabsProps { ticketId: string; ticket?: TicketOverviewDetail; } export function TicketDefectClassTabs({ ticketId, ticket, }: TicketDefectClassTabsProps) { const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); const defectClassParam = searchParams.get('defect_class'); const defectClassesQuery = useTicketDefectClassesQuery(ticketId); const defectClasses = useMemo( () => defectClassesQuery.data?.defect_classes ?? [], [defectClassesQuery.data?.defect_classes], ); const [selectedClass, setSelectedClass] = useState(); useEffect(() => { if (!defectClasses.length) return; const hasUrlClass = defectClasses.some( (item) => item.class_name === defectClassParam, ); if (hasUrlClass) { setSelectedClass(defectClassParam ?? undefined); return; } const firstClass = defectClasses[0].class_name; const nextParams = new URLSearchParams(searchParams.toString()); nextParams.set('defect_class', firstClass); setSelectedClass(firstClass); router.replace(`${pathname}?${nextParams.toString()}`, { scroll: false }); }, [defectClassParam, defectClasses, pathname, router, searchParams]); const handleClassChange = (className: string) => { const nextParams = new URLSearchParams(searchParams.toString()); nextParams.set('defect_class', className); setSelectedClass(className); router.replace(`${pathname}?${nextParams.toString()}`, { scroll: false }); }; const selectedIssue = ticket?.ai_result.detections_by_class.find( (item) => item.class_name === selectedClass, ); const selectedClassItem = defectClasses.find( (item) => item.class_name === selectedClass, ); const previewDisplayName = selectedIssue?.display_name ?? selectedClassItem?.display_name ?? selectedClass ?? 'Detection'; const previewVideoId = ticket?.video_id ?? defectClassesQuery.data?.video_id; if (defectClassesQuery.isLoading) { return (
{Array.from({ length: 3 }).map((_, index) => (
))}
); } if (defectClassesQuery.isError || !defectClasses.length || !selectedClass) { return null; } return (

Detected Issues

{defectClasses.length}
{defectClasses.map((item) => { const statusConfig = DEFECT_CLASS_STATUS_CONFIG[item.assignment_status]; return ( {item.display_name} {statusConfig.label} ); })}
); }