diff --git a/frontend/src/app/providers/layout/sidebar/sidebar.tsx b/frontend/src/app/providers/layout/sidebar/sidebar.tsx index 724b885..d633c71 100644 --- a/frontend/src/app/providers/layout/sidebar/sidebar.tsx +++ b/frontend/src/app/providers/layout/sidebar/sidebar.tsx @@ -15,6 +15,7 @@ import { import { useAgentStore } from "@/app/providers/layout/store/agent.store"; import { useAuthStore } from "@/modules/auth/store/useAuthStore"; import { Graph, type GraphData } from "@/modules/graph"; +import { adminApi } from "@/modules/admin/api/admin.api"; interface SidebarProps { isOpen?: boolean; @@ -36,6 +37,12 @@ export const Sidebar: React.FC = ({ new Set(agents.map((a) => a.label)), ); + // Token generation state + const [tokenLabel, setTokenLabel] = useState(""); + const [generatedToken, setGeneratedToken] = useState(null); + const [tokenGenerating, setTokenGenerating] = useState(false); + const [tokenError, setTokenError] = useState(null); + const toggleAgent = (label: string) => { setExpandedAgents((prev) => { const next = new Set(prev); @@ -90,13 +97,38 @@ export const Sidebar: React.FC = ({ }, [agents]); const handleCopyToken = () => { - if (token) { - navigator.clipboard.writeText(token); + const tokenToCopy = generatedToken || token; + if (tokenToCopy) { + navigator.clipboard.writeText(tokenToCopy); setCopied(true); setTimeout(() => setCopied(false), 2000); } }; + const handleGenerateToken = async () => { + if (!tokenLabel.trim()) return; + setTokenGenerating(true); + setTokenError(null); + try { + const newToken = await adminApi.generateToken(tokenLabel.trim()); + setGeneratedToken(newToken); + } catch (e) { + setTokenError( + e instanceof Error ? e.message : "Failed to generate token", + ); + } finally { + setTokenGenerating(false); + } + }; + + const handleCloseTokenModal = () => { + setShowTokenModal(false); + setTokenLabel(""); + setGeneratedToken(null); + setTokenError(null); + setCopied(false); + }; + if (!isOpen) { return ( - )} + - + )} - + {/* Buttons */} +
+ {generatedToken && ( + + )} + +
diff --git a/frontend/src/modules/admin/api/admin.api.ts b/frontend/src/modules/admin/api/admin.api.ts index 3b7a697..3419ec9 100644 --- a/frontend/src/modules/admin/api/admin.api.ts +++ b/frontend/src/modules/admin/api/admin.api.ts @@ -85,4 +85,13 @@ export const adminApi = { headers: { Authorization: getAuthHeader() }, }); }, + + generateToken: async (label: string): Promise => { + const res = await apiClient.post<{ token: string }>( + "/agents/register-token", + { label }, + { headers: { Authorization: getAuthHeader() } }, + ); + return res.data.token; + }, };