import { Home, Inbox, Settings, HelpCircle, Store } from "lucide-react"; import { Link, useRouterState } from "@tanstack/react-router"; import { useSidebar } from "@/components/ui/sidebar"; // import useSidebar hook import { useEffect, useState, useRef } from "react"; import { useAtom } from "jotai"; import { dropdownOpenAtom } from "@/atoms/uiAtoms"; import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarRail, SidebarTrigger, } from "@/components/ui/sidebar"; import { ChatList } from "./ChatList"; import { AppList } from "./AppList"; import { HelpDialog } from "./HelpDialog"; // Import the new dialog import { SettingsList } from "./SettingsList"; // Menu items. const items = [ { title: "Apps", to: "/", icon: Home, }, { title: "Chat", to: "/chat", icon: Inbox, }, { title: "Settings", to: "/settings", icon: Settings, }, { title: "Hub", to: "/hub", icon: Store, }, ]; // Hover state types type HoverState = | "start-hover:app" | "start-hover:chat" | "start-hover:settings" | "clear-hover" | "no-hover"; export function AppSidebar() { const { state, toggleSidebar } = useSidebar(); // retrieve current sidebar state const [hoverState, setHoverState] = useState("no-hover"); const expandedByHover = useRef(false); const [isHelpDialogOpen, setIsHelpDialogOpen] = useState(false); // State for dialog const [isDropdownOpen] = useAtom(dropdownOpenAtom); useEffect(() => { if (hoverState.startsWith("start-hover") && state === "collapsed") { expandedByHover.current = true; toggleSidebar(); } if ( hoverState === "clear-hover" && state === "expanded" && expandedByHover.current && !isDropdownOpen ) { toggleSidebar(); expandedByHover.current = false; setHoverState("no-hover"); } }, [hoverState, toggleSidebar, state, setHoverState, isDropdownOpen]); const routerState = useRouterState(); const isAppRoute = routerState.location.pathname === "/" || routerState.location.pathname.startsWith("/app-details"); const isChatRoute = routerState.location.pathname === "/chat"; const isSettingsRoute = routerState.location.pathname.startsWith("/settings"); let selectedItem: string | null = null; if (hoverState === "start-hover:app") { selectedItem = "Apps"; } else if (hoverState === "start-hover:chat") { selectedItem = "Chat"; } else if (hoverState === "start-hover:settings") { selectedItem = "Settings"; } else if (state === "expanded") { if (isAppRoute) { selectedItem = "Apps"; } else if (isChatRoute) { selectedItem = "Chat"; } else if (isSettingsRoute) { selectedItem = "Settings"; } } return ( { if (!isDropdownOpen) { setHoverState("clear-hover"); } }} >
{/* Left Column: Menu items */}
{ setHoverState("clear-hover"); }} />
{/* Right Column: Chat List Section */}
{/* Change button to open dialog instead of linking */} setIsHelpDialogOpen(true)} // Open dialog on click > Help setIsHelpDialogOpen(false)} />
); } function AppIcons({ onHoverChange, }: { onHoverChange: (state: HoverState) => void; }) { const routerState = useRouterState(); const pathname = routerState.location.pathname; return ( // When collapsed: only show the main menu {/* Dyad */} {items.map((item) => { const isActive = (item.to === "/" && pathname === "/") || (item.to !== "/" && pathname.startsWith(item.to)); return ( { if (item.title === "Apps") { onHoverChange("start-hover:app"); } else if (item.title === "Chat") { onHoverChange("start-hover:chat"); } else if (item.title === "Settings") { onHoverChange("start-hover:settings"); } }} >
{item.title}
); })}
); }