"use client"; import { useEffect, useState } from "react"; import { RefreshCw, Wind, Droplets, Thermometer } 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 = ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"]; const MONTH_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 fetchData = 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(() => { fetchData(); }, []); const c = data?.current; const day = data?.forecast?.[selected]; const formatDate = (dateStr: string) => { const d = new Date(dateStr + "T12:00:00"); return `${DAY_NAMES[d.getDay()]}, ${d.getDate()} ${MONTH_NAMES[d.getMonth()]}`; }; return (
Погода · Санкт-Петербург
{error ? (
Нет данных
) : loading ? (
{[...Array(7)].map((_,i)=>
)}
) : c && day ? ( <>
{selected === 0 ? c.icon : day.icon}
{selected === 0 ? c.temp : day.maxTemp}° {selected !== 0 && ( {day.minTemp}° )}
{selected === 0 ? c.desc : day.desc}
{selected === 0 ? "Сейчас" : formatDate(day.date)}
{selected === 0 && (
Ощущ. {c.feelsLike}° {c.humidity}% {c.windKmh} км/ч
)}
{data.forecast.map((f, i) => { const d = new Date(f.date + "T12:00:00"); const isToday = i === 0; return ( ); })}
) : null}
); }