import { FormEvent, useMemo, useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { useCreateProjectMutation, useProjectsQuery } from '../query/projects'; function ProjectsPage() { const { data, isLoading, isError, error } = useProjectsQuery(); const createProjectMutation = useCreateProjectMutation(); const navigate = useNavigate(); const [newProjectName, setNewProjectName] = useState(''); const [createError, setCreateError] = useState(null); const projects = data?.data ?? []; const listError = isError ? (error as Error).message : null; const projectCountLabel = useMemo(() => { if (isLoading) { return 'Loading projects…'; } if (!projects.length) { return 'No projects yet – use the button below to create your first project.'; } return `${projects.length} project${projects.length === 1 ? '' : 's'} found.`; }, [isLoading, projects.length]); const handleCreateProjectSubmit = async (event: FormEvent) => { event.preventDefault(); const trimmedName = newProjectName.trim(); if (!trimmedName) { setCreateError('Project name is required.'); return; } setCreateError(null); try { const project = await createProjectMutation.mutateAsync({ name: trimmedName }); setNewProjectName(''); navigate(`/projects/${project.id}`); } catch (submitError) { setCreateError((submitError as Error).message); } }; return (

Create a new project

Enter a project name to start comparing items instantly.

{createError ? (

{createError}

) : null}

Projects

{projectCountLabel}

{listError ? (

{listError}

) : null}
{projects.map((project) => ( ))}
Name Status Attributes Updated
{project.name} {project.description ? (

{project.description}

) : null}
{project.status} {project.attributes.length ? project.attributes.join(', ') : } {new Date(project.updatedAt).toLocaleString()}
); } export default ProjectsPage;