"use client" import { useEffect, useState } from "react" import { ArrowUpRight, Link as LinkIcon, MoreHorizontal, Trash2, StarOff, Plus, MessagesSquare, } from "lucide-react" import { toast } from "sonner" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { SidebarGroup, SidebarGroupLabel, SidebarMenu, SidebarMenuAction, SidebarMenuButton, SidebarMenuItem, useSidebar, } from "@/components/ui/sidebar" import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip" import { getProjects, getThreads } from "@/lib/api" import Link from "next/link" // Define a type to handle potential database schema/API response differences type ProjectResponse = { id: string; project_id?: string; name: string; [key: string]: any; // Allow other properties } export function NavAgents() { const { isMobile, state } = useSidebar() const [agents, setAgents] = useState<{name: string, url: string}[]>([]) const [isLoading, setIsLoading] = useState(true) // Load agents dynamically from the API useEffect(() => { async function loadAgents() { try { // Get all projects const projectsData = await getProjects() as ProjectResponse[] console.log("Projects data:", projectsData) const agentsList = [] // Get all threads at once const allThreads = await getThreads() console.log("All threads:", allThreads) // For each project, find its matching threads for (const project of projectsData) { console.log("Processing project:", project) // Get the project ID (handle potential different field names) const projectId = project.id || project.project_id // Match threads that belong to this project const projectThreads = allThreads.filter(thread => thread.project_id === projectId ) console.log(`Found ${projectThreads.length} threads for project ${project.name}:`, projectThreads) if (projectThreads.length > 0) { // For each thread in this project, create an agent entry for (const thread of projectThreads) { agentsList.push({ name: project.name || 'Unnamed Project', url: `/dashboard/agents/${thread.thread_id}` }) console.log(`Added agent with name: ${project.name} and thread: ${thread.thread_id}`) } } } setAgents(agentsList) } catch (err) { console.error("Error loading agents for sidebar:", err) } finally { setIsLoading(false) } } loadAgents() }, []) return (
Agents New Agent New Agent
{isLoading ? ( // Show skeleton loaders while loading Array.from({length: 3}).map((_, index) => (
)) ) : agents.length > 0 ? ( // Show all agents <> {agents.map((item, index) => ( {state === "collapsed" ? ( {item.name} {item.name} ) : ( {item.name} )} {state !== "collapsed" && ( More { navigator.clipboard.writeText(window.location.origin + item.url) toast.success("Link copied to clipboard") }}> Copy Link Open in New Tab Delete )} ))} ) : ( // Empty state No agents yet )}
) }