"use client"; import { useState, useEffect } from "react"; import { motion, AnimatePresence } from "framer-motion"; import ThemeToggle from "./ThemeToggle"; function getWeatherEmoji(code: string): string { const c = parseInt(code); if (c === 113) return "☀️"; if (c === 116) return "⛅"; if (c === 119 || c === 122) return "☁️"; if (c >= 176 && c <= 300) return "🌧️"; if (c >= 200 && c <= 210) return "⛈️"; if (c >= 210 && c <= 260) return "❄️"; return "🌤️"; } function getDayName(dateStr: string): string { const d = new Date(dateStr + "T12:00:00"); const today = new Date(); const tomorrow = new Date(today); tomorrow.setDate(today.getDate() + 1); if (d.toDateString() === today.toDateString()) return "Сег"; if (d.toDateString() === tomorrow.toDateString()) return "Завт"; return d.toLocaleDateString("ru-RU", { weekday: "short" }); } interface Props { isDark: boolean; onToggleTheme: () => void; weather: any; isDemo?: boolean; } export default function TopBar({ isDark, onToggleTheme, weather, isDemo }: Props) { const [time, setTime] = useState(""); const [date, setDate] = useState(""); const [showModal, setShowModal] = useState(false); useEffect(() => { const update = () => { const now = new Date(); setTime(now.toLocaleTimeString("ru-RU", { hour: "2-digit", minute: "2-digit" })); setDate(now.toLocaleDateString("ru-RU", { weekday: "short", day: "numeric", month: "long" })); }; update(); const id = setInterval(update, 1000); return () => clearInterval(id); }, []); const hasWeather = weather && weather.temp && weather.temp !== "—"; return ( <> {/* Time & Date */}
{time} {date}
{/* Weather pill — clickable */} {hasWeather ? ( setShowModal(true)} > {getWeatherEmoji(weather.weatherCode)}
{weather.temp}°C
{weather.desc}
) : (
🌤️ {weather ? "Загрузка..." : "—"}
)} {/* Theme toggle + Demo badge */}
{isDemo && ( Demo )}
{/* Weather Modal */} {showModal && weather && ( setShowModal(false)} > e.stopPropagation()} > {/* Header */}

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

{/* Current */}
{getWeatherEmoji(weather.weatherCode)}
{weather.temp}°
{weather.desc}
{weather.feelsLike && weather.feelsLike !== "—" && Ощущается {weather.feelsLike}°} {weather.humidity && weather.humidity !== "—" && 💧 {weather.humidity}%} {weather.windSpeed && weather.windSpeed !== "—" && 💨 {weather.windSpeed} км/ч}
{/* Forecast */} {weather.forecast && weather.forecast.length > 0 && (
Прогноз
{weather.forecast.map((day: any, i: number) => (
{getDayName(day.date)} {getWeatherEmoji(day.weatherCode)} {day.desc} {day.maxTemp}° / {day.minTemp}°
))}
)}
)}
); }