Initial commit from agent-native create
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
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/");
|
||||
}
|
||||
Reference in New Issue
Block a user