MCPcopy Index your code
hub / github.com/enowdev/enowX-Coder / ChatHeader

Function ChatHeader

src/components/layout/ChatHeader.tsx:19–308  ·  view source on GitHub ↗
({ onToggleLeftSidebar })

Source from the content-addressed store, hash-verified

17}
18
19export const ChatHeader: React.FC<ChatHeaderProps> = ({ onToggleLeftSidebar }) => {
20 const { activeSessionId, sessions, updateSessionTitle, setActiveSessionId, addSession, removeSession, setSessions } = useSessionStore();
21 const rightSidebarOpen = useUIStore((s) => s.rightSidebarOpen);
22 const toggleRightSidebar = useUIStore((s) => s.toggleRightSidebar);
23 const fluxEnabled = useUIStore((s) => s.fluxEnabled);
24 const toggleFlux = useUIStore((s) => s.toggleFlux);
25 const mainView = useUIStore((s) => s.mainView);
26 const setMainView = useUIStore((s) => s.setMainView);
27 const { activeProjectId } = useProjectStore();
28 const sessionUsage = useChatStore((s) => s.sessionUsage);
29
30 const { theme, toggleTheme } = useUIStore();
31 const activeSession = sessions.find(s => s.id === activeSessionId);
32 const currentUsage = activeSessionId ? sessionUsage[activeSessionId] : undefined;
33
34 const formatTokens = (n: number) =>
35 n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);
36
37 const [isRenaming, setIsRenaming] = useState(false);
38 const [renameValue, setRenameValue] = useState('');
39 const [menuOpen, setMenuOpen] = useState(false);
40 const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false);
41 const menuRef = useRef<HTMLDivElement>(null);
42 const renameInputRef = useRef<HTMLInputElement>(null);
43
44 // Close menu on outside click
45 useEffect(() => {
46 if (!menuOpen) return;
47 const handleClick = (e: MouseEvent) => {
48 if (menuRef.current && !menuRef.current.contains(e.target as Node)) {
49 setMenuOpen(false);
50 }
51 };
52 document.addEventListener('mousedown', handleClick);
53 return () => document.removeEventListener('mousedown', handleClick);
54 }, [menuOpen]);
55
56 // Focus rename input when entering rename mode
57 useEffect(() => {
58 if (isRenaming && renameInputRef.current) {
59 renameInputRef.current.focus();
60 renameInputRef.current.select();
61 }
62 }, [isRenaming]);
63
64 const handleStartRename = () => {
65 if (!activeSession) return;
66 setRenameValue(activeSession.title);
67 setIsRenaming(true);
68 };
69
70 const handleConfirmRename = async () => {
71 const trimmed = renameValue.trim();
72 if (!trimmed || !activeSessionId) {
73 setIsRenaming(false);
74 return;
75 }
76 updateSessionTitle(activeSessionId, trimmed);

Callers

nothing calls this directly

Calls 7

cnFunction · 0.90
handleConfirmRenameFunction · 0.85
handleCancelRenameFunction · 0.85
formatTokensFunction · 0.85
handleNewChatFunction · 0.85
handleDeleteChatFunction · 0.85
confirmDeleteFunction · 0.85

Tested by

no test coverage detected