import { useEffect, useState } from 'react'; import { ChevronDown, CloudSun, Globe, MapPin } from 'lucide-react'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { useTempoUi } from '@/components/tempo-brand'; import { getLanguages } from '@/translation/service'; import { withPortugueseFirst } from '@/translation/utils'; import type { TranslationLanguage } from '@/translation/types'; type Weather = { temp: number; description: string; humidity?: number }; export function TempoWeather() { const { language } = useTempoUi(); const [weather, setWeather] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { const controller = new AbortController(); const timer = setTimeout(() => controller.abort(), 8000); fetch(`https://teste-info.tempo.co.mz/api/weather?lang=${language}`, { signal: controller.signal, credentials: 'omit', }) .then((response) => (response.ok ? response.json() : null)) .then((data: { current?: Weather } | null) => { if (data?.current && Number.isFinite(data.current.temp)) setWeather(data.current); }) .catch(() => { /* No guessed temperatures when the source is unavailable. */ }) .finally(() => { clearTimeout(timer); setLoading(false); }); return () => { clearTimeout(timer); controller.abort(); }; }, [language]); return (

Maputo, Moçambique

{weather ? ( <>

{Math.round(weather.temp)}°C

{weather.description}

{weather.humidity !== undefined && (

Humidade: {weather.humidity}%

)} ) : (

{loading ? 'A consultar a temperatura…' : 'Temperatura temporariamente indisponível.'}

)}

Meteorologia · Tempo

); } export function TempoLanguageSelector() { const { language, setLanguage, t } = useTempoUi(); const [languages, setLanguages] = useState([ { code: 'pt', name: 'Português' }, { code: 'en', name: 'English' }, { code: 'fr', name: 'Français' }, { code: 'es', name: 'Español' }, ]); const [available, setAvailable] = useState(true); useEffect(() => { const controller = new AbortController(); getLanguages(controller.signal).then((items) => { const portuguese = items.find((item) => item.code === 'pt'); if (!portuguese) throw new Error('Portuguese model unavailable'); setLanguages(withPortugueseFirst(items.filter((item) => item.code === 'pt' || !portuguese.targets || portuguese.targets.includes(item.code)))); }).catch(() => { if (!controller.signal.aborted) setAvailable(false); }); return () => controller.abort(); }, []); return ( {t('Navegação institucional')} {!available && Tradução temporariamente indisponível} {languages.map(({ code, name }) => ( setLanguage(code)} className={`tempo-menu-item ${language === code ? 'bg-red-50 text-red-700' : ''}`} > {code} {name} ))} ); }