import { useQuery } from "@tanstack/react-query"; import { Cloud, CloudRain, Sun, CloudSnow, CloudSun, 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; } // Fonction de traduction française côté client comme sécurité const translateToFrench = (condition: string): string => { const conditionLower = condition.toLowerCase(); if (conditionLower.includes('clear')) return 'Dégagé'; if (conditionLower.includes('sunny')) return 'Ensoleillé'; if (conditionLower.includes('fair')) return 'Beau temps'; if (conditionLower.includes('partly cloudy')) return 'Partiellement nuageux'; if (conditionLower.includes('cloudy')) return 'Nuageux'; if (conditionLower.includes('overcast')) return 'Couvert'; if (conditionLower.includes('rain')) { if (conditionLower.includes('heavy')) return 'Pluie forte'; if (conditionLower.includes('light')) return 'Pluie légère'; return 'Pluie'; } if (conditionLower.includes('shower')) return 'Averses'; if (conditionLower.includes('drizzle')) return 'Bruine'; if (conditionLower.includes('thunderstorm') || conditionLower.includes('thunder')) return 'Orage'; if (conditionLower.includes('snow')) { if (conditionLower.includes('heavy')) return 'Neige forte'; if (conditionLower.includes('light')) return 'Neige légère'; return 'Neige'; } if (conditionLower.includes('fog')) return 'Brouillard'; if (conditionLower.includes('mist')) return 'Brume'; if (conditionLower.includes('wind')) return 'Venteux'; return condition; // Si déjà en français ou inconnu }; const WeatherIcon = ({ condition, size = 20 }: { condition: string; size?: number }) => { // Utiliser des tailles fixes plutôt que dynamiques pour éviter les problèmes de Tailwind const getIconClass = (size: number) => { if (size <= 16) return "h-4 w-4"; if (size <= 20) return "h-5 w-5"; if (size <= 24) return "h-6 w-6"; return "h-8 w-8"; }; const iconClass = getIconClass(size); const conditionLower = condition.toLowerCase(); // Ensoleillé/Dégagé if (conditionLower.includes('clear') || conditionLower.includes('dégagé') || conditionLower.includes('sunny') || conditionLower.includes('ensoleillé') || conditionLower.includes('fair') || conditionLower.includes('beau')) { return ; } // Conditions pluvieuses if (conditionLower.includes('rain') || conditionLower.includes('pluie') || conditionLower.includes('shower') || conditionLower.includes('averses')) { if (conditionLower.includes('heavy') || conditionLower.includes('forte')) { return ; } return ; } // Bruine if (conditionLower.includes('drizzle') || conditionLower.includes('bruine')) { 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') || conditionLower.includes('brume')) { return ; } // Vent if (conditionLower.includes('wind') || conditionLower.includes('vent') || conditionLower.includes('venteux')) { return ; } // Nuageux if (conditionLower.includes('cloud') || conditionLower.includes('nuage') || conditionLower.includes('overcast') || conditionLower.includes('couvert')) { if (conditionLower.includes('partly') || conditionLower.includes('partial') || conditionLower.includes('partiellement')) { return ; } return ; } // Par défaut pour températures 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]} {translateToFrench(weather.currentYear?.condition || 'Inconnu')}
{/* Températures avec en-têtes */}
Aujourd'hui
{currentTemp !== undefined ? `${Math.round(currentTemp)}°` : '--°'}
{/* Comparaison avec l'an dernier */} {previousTemp !== undefined && ( <>
Année dernière
{Math.round(previousTemp)}°
)} {/* Différence */} {currentTemp !== undefined && previousTemp !== undefined && ( <>
Différence
{tempDifference > 0 ? (
↗ +{Math.round(tempDifference)}°
) : tempDifference < 0 ? (
↘ {Math.round(tempDifference)}°
) : (
= 0°
)}
)}
); }