/** * @file ChatOverlay.tsx * @description Persistent chat overlay component that is accessible from any view */ "use client"; import { useEffect, useRef } from "react"; import { useChatOverlay } from "@/hooks/useChatOverlay"; import { Chat } from "./Chat"; import type { ChatRef } from "./Chat"; export function ChatOverlay(): React.JSX.Element { const { isOpen, isMinimized, open, close, minimize, expand, toggle } = useChatOverlay(); const chatRef = useRef(null); // Global keyboard shortcuts useEffect(() => { const handleKeyDown = (e: KeyboardEvent): void => { // Cmd/Ctrl + Shift + J: Toggle chat panel if ((e.ctrlKey || e.metaKey) && e.shiftKey && (e.key === "j" || e.key === "J")) { e.preventDefault(); toggle(); return; } // Cmd/Ctrl + K: Open chat and focus input if ((e.ctrlKey || e.metaKey) && (e.key === "k" || e.key === "K")) { e.preventDefault(); if (!isOpen) { open(); } return; } // Escape: Minimize chat (if open and not minimized) if (e.key === "Escape" && isOpen && !isMinimized) { e.preventDefault(); minimize(); return; } }; document.addEventListener("keydown", handleKeyDown); return (): void => { document.removeEventListener("keydown", handleKeyDown); }; }, [isOpen, isMinimized, open, minimize, toggle]); // Render floating button when closed if (!isOpen) { return ( ); } // Render minimized header when minimized if (isMinimized) { return (
); } // Render full chat overlay when open and expanded return ( <> {/* Backdrop for mobile */}