import { motion } from "framer-motion"; import { Wifi, WifiOff } from "lucide-react"; import type { DashboardTab } from "../entities/ui/types"; import type { VoiceStatus } from "../shared/api/client"; import { fadeSlideUp } from "../shared/hooks/useFramerStagger"; import { cn } from "../shared/lib/utils"; import { Badge } from "../shared/ui"; import type { WsStatus } from "../shared/ws/socket"; const titles: Record = { live: "Voice & Media", messages: "Messages & Moderation", tuner: "Prompt Tuner", }; const subtitles: Record = { live: "Join voice channels, play media, stream audio, and browse recordings.", messages: "Capture, analyse, and moderate Discord messages.", tuner: "Monitor correction patterns and improve AI moderation accuracy.", }; interface HeaderProps { activeTab: DashboardTab; wsStatus: WsStatus; voiceStatus: VoiceStatus; } /** Dot indicator colour for WS badge */ function wsDotColor(status: WsStatus): string { switch (status) { case "connected": return "bg-emerald-400"; case "error": return "bg-red-400"; case "connecting": case "disconnected": return "bg-gray-400"; } } function WsIndicator({ status }: { status: WsStatus }) { const dot = wsDotColor(status); return (
{status}
); } /** Voice status indicator dot */ function VoiceIndicator({ voiceStatus }: { voiceStatus: VoiceStatus }) { const isConnected = voiceStatus.connected; const dot = isConnected ? "bg-primary" : "bg-gray-300"; const label = isConnected ? voiceStatus.activeChannelName || "connected" : "idle"; return (
{label}
); } export function Header({ activeTab, wsStatus, voiceStatus }: HeaderProps) { return (
{/* Left: IMPHNEN brand + tab title */}
IMPHNEN

IMPHNEN ยท {titles[activeTab]}

{subtitles[activeTab]}

{/* Right: status badges */}
{/* WS Badge */} {wsStatus === "connected" ? ( ) : ( )} {/* Voice Badge */}
); }