"use client"; import { useTranslations } from "next-intl"; import { useState } from "react"; const FILE_TABS = ["SOUL.md", "AGENTS.md", "TOOLS.md"] as const; interface Props { tenantName: string; files: Record; /** Slice 5: when false, save button hidden and textarea is read-only. */ canEdit?: boolean; } export function WorkspaceEditor({ tenantName, files, canEdit = true }: Props) { const t = useTranslations("workspace"); const [activeTab, setActiveTab] = useState("SOUL.md"); const [localFiles, setLocalFiles] = useState>(files); const [saving, setSaving] = useState(false); const [dirty, setDirty] = useState(false); const [error, setError] = useState(null); function handleChange(content: string) { if (!canEdit) return; setLocalFiles((prev) => ({ ...prev, [activeTab]: content })); setDirty(true); } async function handleSave() { setSaving(true); setError(null); try { const res = await fetch(`/api/tenants/${tenantName}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ workspaceFiles: localFiles }), }); if (!res.ok) { const err = await res.json(); throw new Error(err.error || "Save failed"); } setDirty(false); } catch (e: any) { setError(e.message); } finally { setSaving(false); } } return (
{FILE_TABS.map((tab) => ( ))}
{canEdit && ( )}