'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}°
)
})}
)}
)}
>
)
}