import { useState, useMemo, useEffect } from 'react'; import { useLocation } from 'react-router-dom'; import { Plus, FolderKanban, Layers, PlayCircle, CheckCircle2, Search } from 'lucide-react'; import { useQuery } from '@tanstack/react-query'; import api from '@/lib/api'; import type { Project } from '@/types'; import { Button } from '@/components/ui/button'; import { Select } from '@/components/ui/select'; import { Input } from '@/components/ui/input'; import { Card, CardContent } from '@/components/ui/card'; import { GridSkeleton } from '@/components/ui/skeleton'; import { EmptyState } from '@/components/ui/empty-state'; import ProjectCard from './ProjectCard'; import ProjectForm from './ProjectForm'; const statusFilters = [ { value: '', label: 'All' }, { value: 'not_started', label: 'Not Started' }, { value: 'in_progress', label: 'In Progress' }, { value: 'completed', label: 'Completed' }, ] as const; export default function ProjectsPage() { const location = useLocation(); const [showForm, setShowForm] = useState(false); const [editingProject, setEditingProject] = useState(null); const [statusFilter, setStatusFilter] = useState(''); const [search, setSearch] = useState(''); // Handle navigation state from dashboard useEffect(() => { const state = location.state as { filter?: string } | null; if (state?.filter) { setStatusFilter(state.filter); window.history.replaceState({}, ''); } }, [location.state]); const { data: projects = [], isLoading } = useQuery({ queryKey: ['projects'], queryFn: async () => { const { data } = await api.get('/projects'); return data; }, }); const filteredProjects = useMemo(() => { let list = statusFilter ? projects.filter((p) => p.status === statusFilter) : projects; if (search) { const q = search.toLowerCase(); list = list.filter( (p) => p.name.toLowerCase().includes(q) || p.description?.toLowerCase().includes(q) ); } return list; }, [projects, statusFilter, search]); const inProgressCount = projects.filter((p) => p.status === 'in_progress').length; const completedCount = projects.filter((p) => p.status === 'completed').length; const handleEdit = (project: Project) => { setEditingProject(project); setShowForm(true); }; const handleCloseForm = () => { setShowForm(false); setEditingProject(null); }; return (
{/* Header */}

Projects

{statusFilters.map((sf) => ( ))}
setSearch(e.target.value)} className="w-32 sm:w-52 h-8 pl-8 text-sm" />
{/* Summary stats */} {!isLoading && projects.length > 0 && (

Total

{projects.length}

In Progress

{inProgressCount}

Completed

{completedCount}

)} {isLoading ? ( ) : filteredProjects.length === 0 ? ( setShowForm(true)} /> ) : (
{filteredProjects.map((project) => ( ))}
)}
{showForm && }
); }