import React, { useEffect, useState } from 'react'; import { Alert, AlertTitle, Box, Card, CardContent, CircularProgress, Link, Typography, } from '@mui/material'; import { Link as RouterLink } from 'react-router-dom'; import { vehiclesApi } from '../../services/vehicles'; import { equipmentApi } from '../../services/equipment'; import type { VehicleStats, InspectionAlert } from '../../types/vehicle.types'; import type { VehicleEquipmentWarning } from '../../types/equipment.types'; interface VehicleDashboardCardProps { hideWhenEmpty?: boolean; } const VehicleDashboardCard: React.FC = ({ hideWhenEmpty = false, }) => { const [stats, setStats] = useState(null); const [alerts, setAlerts] = useState([]); const [equipmentWarnings, setEquipmentWarnings] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { let mounted = true; const fetchData = async () => { try { setLoading(true); setError(null); const [statsData, alertsData, warningsData] = await Promise.all([ vehiclesApi.getStats(), vehiclesApi.getAlerts(30), equipmentApi.getVehicleWarnings(), ]); if (mounted) { setStats(statsData); setAlerts(alertsData); setEquipmentWarnings(warningsData); } } catch { if (mounted) setError('Fahrzeugstatus konnte nicht geladen werden.'); } finally { if (mounted) setLoading(false); } }; fetchData(); return () => { mounted = false; }; }, []); if (loading) { return ( Fahrzeugstatus wird geladen... ); } if (error) { return ( {error} ); } if (!stats) return null; const overdueAlerts = alerts.filter((a) => a.tage < 0); const upcomingAlerts = alerts.filter((a) => a.tage >= 0 && a.tage <= 30); const hasConcerns = overdueAlerts.length > 0 || upcomingAlerts.length > 0 || stats.ausserDienst > 0 || equipmentWarnings.length > 0; const allGood = stats.einsatzbereit === stats.total && !hasConcerns; // If hideWhenEmpty and everything is fine, render nothing if (hideWhenEmpty && allGood) return null; return ( Fahrzeuge {/* Main metric */} {stats.einsatzbereit}/{stats.total} einsatzbereit {/* Concerns list — using Alert components for consistent warning styling */} {hasConcerns && ( {overdueAlerts.length > 0 && ( Überfällig {overdueAlerts.length} Prüfung{overdueAlerts.length !== 1 ? 'en' : ''} überfällig )} {stats.ausserDienst > 0 && ( Außer Dienst {stats.ausserDienst} Fahrzeug{stats.ausserDienst !== 1 ? 'e' : ''} außer Dienst )} {upcomingAlerts.length > 0 && ( Bald fällig {upcomingAlerts.length} Prüfung{upcomingAlerts.length !== 1 ? 'en' : ''} bald fällig )} {equipmentWarnings.length > 0 && ( Ausrüstung nicht verfügbar {equipmentWarnings.length} Ausrüstungsgegenstand{equipmentWarnings.length !== 1 ? 'stände' : 'stand'} nicht einsatzbereit )} )} {/* All good message */} {allGood && ( Alle Fahrzeuge einsatzbereit )} {/* Link to management page */} Zur Verwaltung ); }; export default VehicleDashboardCard;