"use client"; import { useEffect, useState } from "react"; import { RefreshCw } from "lucide-react"; interface CurrentWeather { temp: number; feelsLike: number; humidity: number; windKmh: number; desc: string; icon: string; } interface DayForecast { date: string; maxTemp: number; minTemp: number; desc: string; icon: string; precipProb: number; } interface WeatherData { current: CurrentWeather; forecast: DayForecast[]; } const DAY_NAMES = ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"]; export function WeatherWidget() { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(false); const [selected, setSelected] = useState(0); const fetch_ = async () => { setLoading(true); setError(false); try { const res = await fetch("/api/weather"); if (!res.ok) throw new Error(); setData(await res.json()); } catch { setError(true); } finally { setLoading(false); } }; useEffect(() => { fetch_(); }, []); return (
{loading ? (
{[...Array(7)].map((_,i) =>
)}
) : error ? (
Нет данных о погоде
) : data && (
{/* Current */}

Санкт-Петербург

{selected === 0 ? data.current.temp : data.forecast[selected].maxTemp}°
{selected === 0 ? data.current.icon : data.forecast[selected].icon}

{selected === 0 ? data.current.desc : data.forecast[selected].desc}

{selected !== 0 && (

мин {data.forecast[selected].minTemp}°

)}
{selected === 0 && (
🌡️ Ощущ. {data.current.feelsLike}°
💧 {data.current.humidity}%
💨 {data.current.windKmh} км/ч
)}
{/* 7-day forecast */}
{data.forecast.map((day: DayForecast, i: number) => { const d = new Date(day.date + "T12:00:00"); return ( ); })}
)}
); }