import React, { useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { ArrowLeft, FolderPlus, ShieldCheck, Lock, Globe, Sparkles, CheckCircle2, AlertTriangle, Info, Scale, Activity, Code2, Users, FileCheck2, FileText } from 'lucide-react'; import { PARENT_CATEGORIES, TEMPLATES_CATALOG, getTemplateMeta } from '../data/templates'; const ICONS = { Scale, Activity, Code2, Users, ShieldCheck, FolderPlus }; export default function CreateWorkspacePage({ onCreateWorkspace, workspaces, currentUser }) { const navigate = useNavigate(); const username = currentUser?.username || currentUser?.email?.split('@')[0] || 'adhi'; const [wsName, setWsName] = useState(''); const [wsDesc, setWsDesc] = useState(''); const [selectedParent, setSelectedParent] = useState('legal_title'); const [starterTemplate, setStarterTemplate] = useState('title-insurance'); const [wsVisibility, setWsVisibility] = useState('private'); const [loading, setLoading] = useState(false); const [errorMsg, setErrorMsg] = useState(''); const suggestedName = `${starterTemplate}-vault-${Math.floor(100 + Math.random() * 900)}`; const handleSelectParent = (parentId) => { setSelectedParent(parentId); const firstChild = Object.values(TEMPLATES_CATALOG).find((c) => c.parentId === parentId); if (firstChild) { handleSelectChildTemplate(firstChild.id); } }; const handleSelectChildTemplate = (childId) => { setStarterTemplate(childId); const tmpl = TEMPLATES_CATALOG[childId] || TEMPLATES_CATALOG['empty']; if (tmpl.defaultVisibility) { setWsVisibility(tmpl.defaultVisibility); } if (!wsDesc) { setWsDesc(tmpl.description); } }; const handleSubmit = async (e) => { e.preventDefault(); setErrorMsg(''); const finalName = (wsName.trim() || suggestedName).trim(); if (!finalName) { setErrorMsg('Workspace name is required.'); return; } const isDuplicate = (workspaces || []).some( (w) => w.name && w.name.trim().toLowerCase() === finalName.toLowerCase() ); if (isDuplicate) { setErrorMsg(`A workspace named "${finalName}" already exists. Please choose a unique name.`); return; } setLoading(true); try { const currentTmpl = TEMPLATES_CATALOG[starterTemplate] || TEMPLATES_CATALOG['empty']; const finalDesc = wsDesc.trim() || currentTmpl.description || 'DiffWeave verified knowledge repository.'; await onCreateWorkspace(finalName, finalDesc, starterTemplate, wsVisibility); } catch (err) { setErrorMsg(err.message || 'Failed to create workspace. Please try again.'); setLoading(false); } }; const activeTemplateObj = TEMPLATES_CATALOG[starterTemplate] || TEMPLATES_CATALOG['empty']; return (
{/* Navigation Breadcrumb */}
Workspaces / New
{/* Page Header */}

Create a new workspace

A workspace contains tracked documents, 3-way semantic diffs, master truth facts, and automated policy CI quality gates.

{errorMsg && (
{errorMsg}
)} {/* Main Form */}
{/* SECTION 1: General Details */}
1 General Settings
{/* Owner Badge */}
{username[0]?.toUpperCase() || 'A'}
{username}
/
{/* Workspace Name Input */}
setWsName(e.target.value)} placeholder={suggestedName} className="w-full px-3.5 py-2 rounded-xl bg-[#161B22] border border-[#30363D] text-xs text-white placeholder-slate-500 focus:outline-none focus:border-emerald-500 font-mono transition" />

Suggested name:

{/* Description */}
{wsDesc.length} / 350 characters