"use client"; import { useEffect, useState } from "react"; import { useParams, useRouter } from "next/navigation"; import { SignInButton, SignedIn, SignedOut, useAuth } from "@clerk/nextjs"; import { DashboardSidebar } from "@/components/organisms/DashboardSidebar"; import { DashboardShell } from "@/components/templates/DashboardShell"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { getApiBaseUrl } from "@/lib/api-base"; const apiBase = getApiBaseUrl(); type Board = { id: string; name: string; slug: string; gateway_url?: string | null; gateway_main_session_key?: string | null; gateway_workspace_root?: string | null; identity_template?: string | null; soul_template?: string | null; }; const slugify = (value: string) => value .toLowerCase() .trim() .replace(/[^a-z0-9]+/g, "-") .replace(/(^-|-$)/g, "") || "board"; export default function EditBoardPage() { const { getToken, isSignedIn } = useAuth(); const router = useRouter(); const params = useParams(); const boardIdParam = params?.boardId; const boardId = Array.isArray(boardIdParam) ? boardIdParam[0] : boardIdParam; const [board, setBoard] = useState(null); const [name, setName] = useState(""); const [slug, setSlug] = useState(""); const [gatewayUrl, setGatewayUrl] = useState(""); const [gatewayToken, setGatewayToken] = useState(""); const [gatewayMainSessionKey, setGatewayMainSessionKey] = useState(""); const [gatewayWorkspaceRoot, setGatewayWorkspaceRoot] = useState(""); const [identityTemplate, setIdentityTemplate] = useState(""); const [soulTemplate, setSoulTemplate] = useState(""); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const loadBoard = async () => { if (!isSignedIn || !boardId) return; setIsLoading(true); setError(null); try { const token = await getToken(); const response = await fetch(`${apiBase}/api/v1/boards/${boardId}`, { headers: { Authorization: token ? `Bearer ${token}` : "" }, }); if (!response.ok) { throw new Error("Unable to load board."); } const data = (await response.json()) as Board; setBoard(data); setName(data.name); setSlug(data.slug); setGatewayUrl(data.gateway_url ?? ""); setGatewayMainSessionKey(data.gateway_main_session_key ?? ""); setGatewayWorkspaceRoot(data.gateway_workspace_root ?? ""); setIdentityTemplate(data.identity_template ?? ""); setSoulTemplate(data.soul_template ?? ""); } catch (err) { setError(err instanceof Error ? err.message : "Something went wrong."); } finally { setIsLoading(false); } }; useEffect(() => { loadBoard(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [isSignedIn, boardId]); const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); if (!isSignedIn || !boardId) return; const trimmed = name.trim(); if (!trimmed) { setError("Board name is required."); return; } setIsLoading(true); setError(null); try { const token = await getToken(); const payload: Partial & { gateway_token?: string | null } = { name: trimmed, slug: slug.trim() || slugify(trimmed), gateway_url: gatewayUrl.trim() || null, gateway_main_session_key: gatewayMainSessionKey.trim() || null, gateway_workspace_root: gatewayWorkspaceRoot.trim() || null, identity_template: identityTemplate.trim() || null, soul_template: soulTemplate.trim() || null, }; if (gatewayToken.trim()) { payload.gateway_token = gatewayToken.trim(); } const response = await fetch(`${apiBase}/api/v1/boards/${boardId}`, { method: "PATCH", headers: { "Content-Type": "application/json", Authorization: token ? `Bearer ${token}` : "", }, body: JSON.stringify(payload), }); if (!response.ok) { throw new Error("Unable to update board."); } router.push(`/boards/${boardId}`); } catch (err) { setError(err instanceof Error ? err.message : "Something went wrong."); } finally { setIsLoading(false); } }; return (

Sign in to edit boards.

Edit board

{board?.name ?? "Board"}

Update the board identity and gateway connection.

setName(event.target.value)} placeholder="e.g. Product ops" disabled={isLoading} />
setSlug(event.target.value)} placeholder="product-ops" disabled={isLoading} />
setGatewayUrl(event.target.value)} placeholder="ws://gateway:18789" disabled={isLoading} />
setGatewayToken(event.target.value)} placeholder="Leave blank to keep current token" disabled={isLoading} />
setGatewayMainSessionKey(event.target.value)} placeholder="agent:main:main" disabled={isLoading} />
setGatewayWorkspaceRoot(event.target.value)} placeholder="~/.openclaw" disabled={isLoading} />