import { useState, useEffect } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import type { User, Project } from '../lib/api'; import { projectApi } from '../lib/api'; interface ProjectManagerProps { user: User | null; } function NewProjectForm({ onCancel, onSuccess }: { onCancel: () => void; onSuccess: () => void }) { const [name, setName] = useState(''); const [slug, setSlug] = useState(''); const [gitUrl, setGitUrl] = useState(''); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(''); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!name || !slug) { setError('Name and slug are required'); return; } setSubmitting(true); setError(''); try { await projectApi.create({ name, slug, gitUrl: gitUrl || undefined }); onSuccess(); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to create project'); } finally { setSubmitting(false); } }; return (

Create New Project

setName(e.target.value)} className="w-full px-3 py-2 bg-bg-tertiary border border-border-default rounded text-text-primary focus:border-brand focus:outline-none" placeholder="My Project" />
setSlug(e.target.value)} className="w-full px-3 py-2 bg-bg-tertiary border border-border-default rounded text-text-primary focus:border-brand focus:outline-none" placeholder="my-project" />

Unique identifier for the project directory

setGitUrl(e.target.value)} className="w-full px-3 py-2 bg-bg-tertiary border border-border-default rounded text-text-primary focus:border-brand focus:outline-none" placeholder="https://github.com/user/repo.git" />
{error &&

{error}

}
); } function ProjectInspector({ project, onDelete }: { project: Project; onDelete: () => void }) { const [deleting, setDeleting] = useState(false); const handleDelete = async () => { if (!confirm('Are you sure you want to delete this project? This cannot be undone.')) { return; } setDeleting(true); try { await projectApi.delete(project._id); onDelete(); } catch (err) { console.error('Failed to delete project', err); } finally { setDeleting(false); } }; return (

Project Inspector

Name
{project.name}
Slug
{project.slug}
Git URL
{project.gitUrl || Not configured}
Status
{project.status}
Created
{new Date(project.createdAt).toLocaleDateString()}

Chat Sessions

No chat sessions yet. Open a chat to start working on this project.
); } export default function ProjectManager({ user }: ProjectManagerProps) { const navigate = useNavigate(); const { slug } = useParams(); const [projects, setProjects] = useState([]); const [selectedProject, setSelectedProject] = useState(null); const [loading, setLoading] = useState(true); const [showNewForm, setShowNewForm] = useState(false); useEffect(() => { loadProjects(); }, []); useEffect(() => { if (slug && projects.length > 0) { const found = projects.find((p) => p.slug === slug); setSelectedProject(found || null); } }, [slug, projects]); const loadProjects = async () => { try { const data = await projectApi.getAll(); setProjects(data); } catch (err) { console.error('Failed to load projects', err); } finally { setLoading(false); } }; const handleSelectProject = (project: Project) => { navigate(`/projects/${project.slug}`); }; const handleProjectCreated = () => { setShowNewForm(false); loadProjects(); }; const handleProjectDeleted = () => { navigate('/projects'); }; if (!user) { return (

Please sign in to view projects.

); } if (loading) { return (

Loading projects...

); } return (
{showNewForm ? ( setShowNewForm(false)} onSuccess={handleProjectCreated} /> ) : selectedProject ? ( ) : (

Select a project to view details

or create a new project to get started

)}
); }