forked from CopilotKit/CopilotKit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconditional-sidebar.tsx
More file actions
138 lines (116 loc) · 4.43 KB
/
Copy pathconditional-sidebar.tsx
File metadata and controls
138 lines (116 loc) · 4.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
"use client";
import { usePathname } from "next/navigation";
import { DocsLayoutProps } from "fumadocs-ui/layouts/docs";
import Sidebar from "./sidebar";
import IntegrationsSidebar from "./integrations-sidebar";
import { INTEGRATION_ORDER } from "@/lib/integrations";
const DEPLOY_ROUTES = ["agentcore"];
import { normalizeUrl } from "@/lib/analytics-utils";
import { useMemo } from "react";
import VersionSelector, {
getVersionFromPathname,
} from "@/components/ui/reference-sidebar/version-selector";
import LearnHeader from "@/components/ui/learn-sidebar/learn-header";
interface ConditionalSidebarProps {
pageTree: DocsLayoutProps["tree"];
}
type Node = DocsLayoutProps["tree"]["children"][number];
export default function ConditionalSidebar({
pageTree,
}: ConditionalSidebarProps) {
const pathname = usePathname();
// Normalize the pathname to handle /integrations/... paths
const normalizedPathname = normalizeUrl(pathname);
// Check if this is an integration landing page (e.g., /langgraph)
// Use the first segment of the normalized pathname to ensure correct matching
const firstSegment = normalizedPathname.replace(/^\//, "").split("/")[0];
const isIntegrationRoute =
INTEGRATION_ORDER.includes(
firstSegment as (typeof INTEGRATION_ORDER)[number],
) || DEPLOY_ROUTES.includes(firstSegment);
// Check if this is a reference route (e.g., /reference)
const isReferenceRoute = firstSegment === "reference";
// Check if this is a learn route (e.g., /learn)
const isLearnRoute = firstSegment === "learn";
const currentVersion = getVersionFromPathname(pathname);
// Find the learn folder and use its children
const learnPageTree = useMemo(() => {
if (!isLearnRoute) return null;
const learnFolder = pageTree.children.find((node) => {
if (node.type !== "folder") return false;
const folderNode = node as any;
const url = folderNode.index?.url || folderNode.url;
const name =
typeof folderNode.name === "string" ? folderNode.name : undefined;
return url === "/learn" || name?.toLowerCase() === "learn";
}) as Node | undefined;
if (learnFolder && "children" in learnFolder) {
return {
...pageTree,
children: (learnFolder as any).children || [],
};
}
return null;
}, [isLearnRoute, pageTree]);
// Find the reference folder and drill into the active version
const referencePageTree = useMemo(() => {
if (!isReferenceRoute) return null;
// Find the reference folder
const referenceFolder = pageTree.children.find((node) => {
if (node.type !== "folder") return false;
const folderNode = node as any;
const url = folderNode.index?.url || folderNode.url;
const name =
typeof folderNode.name === "string" ? folderNode.name : undefined;
return url === "/reference" || name?.toLowerCase() === "reference";
}) as Node | undefined;
if (referenceFolder && "children" in referenceFolder) {
const referenceChildren = (referenceFolder as any).children || [];
// Find the version folder (v1 or v2) within the reference folder
const versionFolder = referenceChildren.find((node: any) => {
if (node.type !== "folder") return false;
const url = node.index?.url || node.url;
const name = typeof node.name === "string" ? node.name : undefined;
return (
url === `/reference/${currentVersion}` ||
name?.toLowerCase() === currentVersion
);
});
if (versionFolder && "children" in versionFolder) {
// Return a pageTree with only the version folder's children
return {
...pageTree,
children: (versionFolder as any).children || [],
};
}
// Fallback: return the reference folder's children directly
return {
...pageTree,
children: referenceChildren,
};
}
return null;
}, [isReferenceRoute, pageTree, currentVersion]);
if (isIntegrationRoute) {
return <IntegrationsSidebar pageTree={pageTree} />;
}
if (isLearnRoute && learnPageTree) {
return (
<Sidebar
pageTree={learnPageTree}
showIntegrationSelector={false}
headerSlot={<LearnHeader />}
/>
);
}
if (isReferenceRoute && referencePageTree) {
return (
<Sidebar
pageTree={referencePageTree}
showIntegrationSelector={false}
headerSlot={<VersionSelector />}
/>
);
}
return <Sidebar pageTree={pageTree} />;
}