import { useQuery } from "@tanstack/react-query"; import { Cloud, CloudRain, Sun, CloudSnow, ThermometerSun, CloudDrizzle, Wind, Zap, Eye } from "lucide-react"; import { Card, CardContent } from "@/components/ui/card"; interface WeatherData { id: number; date: string; location: string; maxTemperature: number; minTemperature: number; condition: string; icon: string; isCurrentYear: boolean; createdAt: string; updatedAt: string; } interface WeatherResponse { currentYear: WeatherData | null; previousYear: WeatherData | null; location: string; } const WeatherIcon = ({ condition, size = 20 }: { condition: string; size?: number }) => { const iconClass = `h-${Math.floor(size/4)} w-${Math.floor(size/4)}`; const conditionLower = condition.toLowerCase(); // Conditions pluvieuses if (conditionLower.includes('rain') || conditionLower.includes('pluie') || conditionLower.includes('shower')) { if (conditionLower.includes('heavy') || conditionLower.includes('forte')) { return ; } return ; } // Conditions neigeuses if (conditionLower.includes('snow') || conditionLower.includes('neige') || conditionLower.includes('blizzard')) { return ; } // Orages if (conditionLower.includes('thunder') || conditionLower.includes('storm') || conditionLower.includes('orage')) { return ; } // Brouillard if (conditionLower.includes('fog') || conditionLower.includes('mist') || conditionLower.includes('brouillard')) { return ; } // Vent if (conditionLower.includes('wind') || conditionLower.includes('vent')) { return ; } // Nuageux if (conditionLower.includes('cloud') || conditionLower.includes('nuage') || conditionLower.includes('overcast')) { if (conditionLower.includes('partly') || conditionLower.includes('partial')) { return ; } return ; } // Ensoleillé if (conditionLower.includes('sun') || conditionLower.includes('soleil') || conditionLower.includes('clear') || conditionLower.includes('fair')) { return ; } // Par défaut return ; }; export default function WeatherWidget() { const { data: weather, isLoading, error } = useQuery({ queryKey: ['/api/weather/current'], refetchInterval: 30 * 60 * 1000, // Refetch every 30 minutes retry: 1, }); if (isLoading) { return (
Chargement météo...
); } if (error || !weather) { return null; // Don't show widget if weather service is not configured } const currentTemp = weather.currentYear?.maxTemperature; const previousTemp = weather.previousYear?.maxTemperature; const location = weather.location || "Nancy"; const tempDifference = currentTemp !== undefined && previousTemp !== undefined ? currentTemp - previousTemp : 0; return (
{/* Icône et localisation */}
{location.split(',')[0]} {weather.currentYear?.condition || 'Inconnu'}
{/* Températures actuelles */}
{currentTemp !== undefined ? `${Math.round(currentTemp)}°` : '--°'}
Aujourd'hui
{/* Comparaison avec l'an dernier */} {previousTemp !== undefined && ( <>
{Math.round(previousTemp)}°
Année dernière
{weather.previousYear?.condition || ''}
)} {/* Différence */} {currentTemp !== undefined && previousTemp !== undefined && ( <>
{tempDifference > 0 ? (
↗ +{Math.round(tempDifference)}°
) : tempDifference < 0 ? (
↘ {Math.round(tempDifference)}°
) : (
= 0°
)}
)}
); }