94 lines
2.5 KiB
TypeScript
94 lines
2.5 KiB
TypeScript
import { appBasePath, appPath } from "@agent-native/core/client/api-path";
|
|
import { useAgentRouteState } from "@agent-native/core/client/navigation";
|
|
|
|
import { TAB_ID } from "@/lib/tab-id";
|
|
|
|
export interface NavigationState {
|
|
view: string;
|
|
path?: string;
|
|
threadId?: string;
|
|
}
|
|
|
|
export function useNavigationState() {
|
|
useAgentRouteState<NavigationState>({
|
|
browserTabId: TAB_ID,
|
|
requestSource: TAB_ID,
|
|
getNavigationState: ({ pathname }) => {
|
|
const threadId = threadIdFromPath(pathname);
|
|
return {
|
|
view: viewForPath(pathname),
|
|
path: appPath(pathname),
|
|
...(threadId ? { threadId } : {}),
|
|
};
|
|
},
|
|
getCommandPath: (command) =>
|
|
routerPath(command.path || pathForCommand(command)),
|
|
});
|
|
}
|
|
|
|
function threadIdFromPath(pathname: string): string | null {
|
|
const match = pathname.match(/^\/chat\/([^/]+)/);
|
|
if (!match) return null;
|
|
try {
|
|
const value = decodeURIComponent(match[1]).trim();
|
|
return value || null;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function viewForPath(pathname: string): string {
|
|
if (isChatPath(pathname)) return "chat";
|
|
if (pathname.startsWith("/database")) return "database";
|
|
if (pathname.startsWith("/extensions")) return "extensions";
|
|
if (pathname.startsWith("/observability")) return "observability";
|
|
if (pathname.startsWith("/agent")) return "agent";
|
|
if (pathname.startsWith("/team")) return "settings";
|
|
return "chat";
|
|
}
|
|
|
|
function pathForView(view?: string): string {
|
|
switch (view) {
|
|
case "chat":
|
|
case "home":
|
|
case "ask":
|
|
return "/";
|
|
case "database":
|
|
return "/database";
|
|
case "extensions":
|
|
return "/extensions";
|
|
case "observability":
|
|
return "/observability";
|
|
case "agent":
|
|
return "/agent";
|
|
case "settings":
|
|
return "/settings";
|
|
case "team":
|
|
return "/settings#organization";
|
|
default:
|
|
return "/";
|
|
}
|
|
}
|
|
|
|
function pathForCommand(command: any): string {
|
|
const path = pathForView(command?.view);
|
|
if (path !== "/") return path;
|
|
const threadId =
|
|
typeof command?.threadId === "string" ? command.threadId.trim() : "";
|
|
return threadId ? `/chat/${encodeURIComponent(threadId)}` : "/";
|
|
}
|
|
|
|
function routerPath(path: string): string {
|
|
const basePath = appBasePath();
|
|
if (!basePath) return path;
|
|
if (path === basePath) return "/";
|
|
if (path.startsWith(`${basePath}/`)) {
|
|
return path.slice(basePath.length) || "/";
|
|
}
|
|
return path;
|
|
}
|
|
|
|
function isChatPath(pathname: string): boolean {
|
|
return pathname === "/" || pathname.startsWith("/chat/");
|
|
}
|