"use client"; import { BatteryFull, Bell, CloudSun, Tailscale } from "@/components/icons/platform-icons"; import { BatteryPopover } from "@/modules/system/components/status-bar/battery-popover"; import { DatePickerPopover } from "@/modules/system/components/status-bar/date-picker-popover"; import { NotificationPopover } from "@/modules/system/components/status-bar/notification-popover"; import type { StatusBarProps, StatusPopover, } from "@/modules/system/components/status-bar/types"; import { useStatusBarData } from "@/modules/system/components/status-bar/use-status-bar-data"; import { formatDate, formatTemperature, formatTime, } from "@/modules/system/components/status-bar/utils"; import { WeatherPopover } from "@/modules/system/components/status-bar/weather-popover"; import { TailscalePopover } from "@/modules/system/components/status-bar/tailscale-popover"; import { EthernetIcon, WifiStatusIcon, } from "@/modules/system/components/status-bar/wifi-icons"; import { WifiPopover } from "@/modules/system/components/status-bar/wifi-popover"; import { useCurrentWeather } from "@/modules/system/hooks/useCurrentWeather"; import { useNetworkEventsSse } from "@/modules/system/hooks/useNetworkEventsSse"; import Image from "next/image"; import { useEffect, useState } from "react"; function toTitleCaseUsername(value: string | null) { if (!value) return "User"; return value .trim() .split(/[\s_-]+/) .filter((part) => part.length > 0) .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase()) .join(" "); } export function StatusBar({ onLock: _onLock, onLogout: _onLogout, isLogoutPending: _isLogoutPending = false, onOpenNotifications, }: StatusBarProps) { const { metrics, networkStatus, username, isDemoMode, batteryText, isWifiConnected, isEthernet, isMetricsError, wifiIconClassName, notifications, unreadCount, markAllRead, clearNotifications, } = useStatusBarData(); const { data: weather } = useCurrentWeather(); useNetworkEventsSse(true); const weatherText = formatTemperature(weather?.current.temperatureC); const [now, setNow] = useState(null); const [selectedDate, setSelectedDate] = useState(new Date()); const [activePopover, setActivePopover] = useState( null, ); useEffect(() => { setNow(new Date()); const timer = setInterval(() => setNow(new Date()), 1000); return () => clearInterval(timer); }, []); function closePopovers() { setActivePopover(null); } function togglePopover(popover: StatusPopover) { setActivePopover((current) => (current === popover ? null : popover)); } return (
{/* Blur is on a separate element so it doesn't create a Firefox stacking context over the flyout popovers */}
); }