import { Home, Inbox, Settings } 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 { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarRail, SidebarTrigger, } from "@/components/ui/sidebar"; import { ChatList } from "./ChatList"; import { AppList } from "./AppList"; // Menu items. const items = [ { title: "Apps", to: "/", icon: Home, }, { title: "Chat", to: "/chat", icon: Inbox, }, { title: "Settings", to: "/settings", icon: Settings, }, ]; // Hover state types type HoverState = | "start-hover:app" | "start-hover:chat" | "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); useEffect(() => { if ( (hoverState === "start-hover:app" || hoverState === "start-hover:chat") && state === "collapsed" ) { expandedByHover.current = true; toggleSidebar(); } if ( hoverState === "clear-hover" && state === "expanded" && expandedByHover.current ) { toggleSidebar(); expandedByHover.current = false; setHoverState("no-hover"); } }, [hoverState, toggleSidebar, state, setHoverState]); const routerState = useRouterState(); const isAppRoute = routerState.location.pathname === "/" || routerState.location.pathname.startsWith("/app-details"); const isChatRoute = routerState.location.pathname === "/chat"; let selectedItem: string | null = null; if (hoverState === "start-hover:app") { selectedItem = "Apps"; } else if (hoverState === "start-hover:chat") { selectedItem = "Chat"; } else if (state === "expanded") { if (isAppRoute) { selectedItem = "Apps"; } else if (isChatRoute) { selectedItem = "Chat"; } } return ( { setHoverState("clear-hover"); }} >
{/* Left Column: Menu items */}
{ setHoverState("clear-hover"); }} />
{/* Right Column: Chat List Section */}
); } 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"); } }} >
{item.title}
); })}
); }