'use client' import { useState, useEffect } from 'react' import { Cloud, Droplets, Wind } from 'lucide-react' interface WeatherData { temp: string desc: string humidity: string windSpeed: string feelsLike: string forecast?: { date: string; maxTemp: string; minTemp: string; desc: string }[] } interface SensorData { temperature: number humidity: number pm25: number } interface TopBarProps { weather: WeatherData | null sensors: SensorData | null } function getWeatherEmoji(desc: string): string { const d = desc?.toLowerCase() || '' if (d.includes('ясно') || d.includes('солнеч')) return '☀️' if (d.includes('облач')) return '⛅' if (d.includes('пасмурн')) return '☁️' if (d.includes('дождь') || d.includes('морос')) return '🌧️' if (d.includes('снег')) return '❄️' if (d.includes('гроз')) return '⛈️' return '🌤️' } function formatTime(date: Date): string { return date.toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit' }) } function formatDate(date: Date): string { return date.toLocaleDateString('ru-RU', { weekday: 'short', day: 'numeric', month: 'short' }) } export default function TopBar({ weather, sensors }: TopBarProps) { const [time, setTime] = useState(() => new Date()) const [showModal, setShowModal] = useState(false) useEffect(() => { const t = setInterval(() => setTime(new Date()), 1000) return () => clearInterval(t) }, []) return ( <>
{/* Left: time + date */}
{formatTime(time)} {formatDate(time)}
{/* Right: sensors + weather */}
{/* Room sensors */} {sensors && (
🌡️ {sensors.temperature}°
{sensors.humidity}%
{sensors.pm25 !== undefined && (
PM2.5: {sensors.pm25}
)}
)} {/* Divider */} {sensors && weather && (
)} {/* Weather widget */} {weather && ( )}
{/* Weather Modal */} {showModal && weather && (
setShowModal(false)} style={{ position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.7)', backdropFilter: 'blur(8px)', zIndex: 100, display: 'flex', alignItems: 'center', justifyContent: 'center', }} >
e.stopPropagation()} style={{ background: '#13131f', border: '1px solid rgba(255,255,255,0.1)', borderRadius: 20, padding: 28, minWidth: 320, maxWidth: 400, }} >
{getWeatherEmoji(weather.desc)}
{weather.temp}°C
{weather.desc}
Влажность: {weather.humidity}%
Ветер: {weather.windSpeed} км/ч
Ощущается: {weather.feelsLike}°
{weather.forecast && weather.forecast.length > 0 && (
Прогноз
{weather.forecast.map(day => { const d = new Date(day.date) const label = d.toLocaleDateString('ru-RU', { weekday: 'short', day: 'numeric', month: 'short' }) return (
{label} {getWeatherEmoji(day.desc)} {day.desc} {day.maxTemp}° / {day.minTemp}°
) })}
)}
)} ) }