import React, { useEffect, useState } from 'react'; import { useMonitoring } from '../hooks/useMonitoring'; import { useVehicles } from '../hooks/useVehicles'; import { ClipboardCheck, Satellite, CheckCircle2, XCircle, Info, Calendar, User, Activity, Zap, Signal, SignalLow, Wifi, WifiOff, Search, ArrowRight, ShieldAlert } from 'lucide-react'; import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { cn } from '@/lib/utils'; import { motion, AnimatePresence } from 'framer-motion'; /** * QualityControlView V2. * Separates historical audit (Checklists) from active/real-time tracking (Monitoramento). */ export const QualityControlView = ({ initialTab = 'checklists' }) => { const { mokiData, fetchMokiData, loading } = useMonitoring(); const { vehicles, fetchVehicles } = useVehicles(); const [activeTab, setActiveTab] = useState(initialTab); // Sync activeTab with initialTab when it changes from outside useEffect(() => { setActiveTab(initialTab); }, [initialTab]); useEffect(() => { fetchMokiData(); fetchVehicles(); }, [fetchMokiData, fetchVehicles]); const stats = { online: vehicles.filter(v => v.statusTel === 'Ativo').length, total: vehicles.length, offline: vehicles.filter(v => v.statusTel !== 'Ativo').length }; const onlinePercentage = stats.total > 0 ? Math.round((stats.online / stats.total) * 100) : 0; return (
Gestão de inspeções técnicas e telemetria avançada
| Data / Unidade | Tipo de Inspeção | Autor / Inspetor | Aprovação % | Resultado |
|---|---|---|---|---|
| Nenhum checklist encontrado. | ||||
|
{c.unidade || c.nome_unidade}
{c.data}
|
|
{(c.autor || 'U').substring(0, 2)}
{c.autor}
|
= 80 ? "text-emerald-500" : "text-rose-500")}>
{c.aprovacao || 0}%
|
|
Sinal Online
Telemetria OK
Sem Comunicação
Alertas Ativos
Sincronização Sascar / Geotab / T4S