"use client"; import { useState, useEffect, type ReactNode } from "react"; import { DocsLayoutProps } from "fumadocs-ui/layouts/docs"; import Separator from "../ui/sidebar/separator"; import Page from "../ui/sidebar/page"; import Folder from "../ui/sidebar/folder"; import IntegrationLink from "../ui/sidebar/integration-link"; import IntegrationSelector, { Integration, } from "../ui/integrations-sidebar/integration-selector"; import { OpenedFoldersProvider } from "@/lib/hooks/use-opened-folders"; import { INTEGRATION_ORDER } from "@/lib/integrations"; type Node = DocsLayoutProps["tree"]["children"][number] & { url: string; index?: { url: string }; }; const NODE_COMPONENTS = { separator: Separator, page: Page, folder: Folder, integrationLink: IntegrationLink, }; const isIntegrationFolder = (node: Node): boolean => { if (node.type !== "folder") return false; const url = node.index?.url || node.url; if (!url) return false; // Integration landing pages are at /{integration} (e.g., /langgraph) // Check if the URL matches a known integration ID const integrationId = url.replace(/^\//, "").split("/")[0]; return INTEGRATION_ORDER.includes( integrationId as (typeof INTEGRATION_ORDER)[number], ); }; const Sidebar = ({ pageTree, showIntegrationSelector = true, headerSlot, }: { pageTree: DocsLayoutProps["tree"]; showIntegrationSelector?: boolean; headerSlot?: ReactNode; }) => { const pages = pageTree.children; const [selectedIntegration, setSelectedIntegration] = useState(null); // Dispatch pageTree update for OpenedFoldersProvider useEffect(() => { if (pages.length > 0) { const event = new CustomEvent("pageTreeUpdate", { detail: pages }); window.dispatchEvent(event); } }, [pages]); return ( ); }; export default Sidebar;