"use client"; import { useEffect, useRef, useState, useCallback } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { MessageSquare, FolderOpen, Settings, ChevronLeft, ChevronRight } from "lucide-react"; import { useChatStore } from "@/lib/store"; import { cn } from "@/lib/utils"; import { ChatHistory } from "./ChatHistory"; import { FileExplorer } from "./FileExplorer"; import { QuickActions } from "./QuickActions"; const MIN_WIDTH = 200; const MAX_WIDTH = 480; const COLLAPSED_WIDTH = 60; type SidebarTab = "chats" | "history" | "files" | "settings"; const TABS: Array<{ id: SidebarTab; icon: React.ElementType; label: string }> = [ { id: "chats", icon: MessageSquare, label: "Chats" }, { id: "files", icon: FolderOpen, label: "Files" }, { id: "settings", icon: Settings, label: "Settings" }, ]; export function Sidebar() { const { sidebarOpen, sidebarWidth, sidebarTab, toggleSidebar, setSidebarWidth, setSidebarTab, openSettings, } = useChatStore(); const [isResizing, setIsResizing] = useState(false); const resizeRef = useRef<{ startX: number; startWidth: number } | null>(null); const startResize = useCallback( (e: React.MouseEvent) => { e.preventDefault(); resizeRef.current = { startX: e.clientX, startWidth: sidebarWidth }; setIsResizing(true); }, [sidebarWidth] ); useEffect(() => { if (!isResizing) return; const onMove = (e: MouseEvent) => { if (!resizeRef.current) return; const delta = e.clientX - resizeRef.current.startX; const next = Math.max(MIN_WIDTH, Math.min(MAX_WIDTH, resizeRef.current.startWidth + delta)); setSidebarWidth(next); }; const onUp = () => setIsResizing(false); window.addEventListener("mousemove", onMove); window.addEventListener("mouseup", onUp); return () => { window.removeEventListener("mousemove", onMove); window.removeEventListener("mouseup", onUp); }; }, [isResizing, setSidebarWidth]); // Global keyboard shortcut: Cmd/Ctrl+B useEffect(() => { const handler = (e: KeyboardEvent) => { if ((e.metaKey || e.ctrlKey) && e.key === "b") { e.preventDefault(); toggleSidebar(); } }; window.addEventListener("keydown", handler); return () => window.removeEventListener("keydown", handler); }, [toggleSidebar]); const handleTabClick = (id: SidebarTab) => { if (id === "settings") { openSettings(); return; } if (!sidebarOpen) toggleSidebar(); setSidebarTab(id); }; return ( {/* Top bar: app name + tabs + collapse toggle */}
{sidebarOpen && ( Claude Code )}
{TABS.map(({ id, icon: Icon, label }) => ( ))}
{/* Tab content */} {sidebarOpen && ( {(sidebarTab === "chats" || sidebarTab === "history") && } {sidebarTab === "files" && } )} {sidebarOpen && } {/* Drag-to-resize handle */} {sidebarOpen && (
)} ); }