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 (
);
}
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
Git URL
{project.gitUrl || Not configured}
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 (
);
}
return (
{showNewForm ? (
setShowNewForm(false)}
onSuccess={handleProjectCreated}
/>
) : selectedProject ? (
) : (
Select a project to view details
or create a new project to get started
)}
);
}