import { useState } from 'react'; import { Link } from 'react-router-dom'; import { useQuery } from '@tanstack/react-query'; import { PlusIcon, FolderIcon, EllipsisVerticalIcon, MagnifyingGlassIcon, FunnelIcon, ChartBarIcon, ClockIcon, TagIcon, Cog6ToothIcon } from '@heroicons/react/24/outline'; import { Menu, Transition } from '@headlessui/react'; import { Fragment } from 'react'; import { formatDistanceToNow } from 'date-fns'; import { projectApi } from '../../services/api'; // Project data will come from the API export default function ProjectList() { const [searchTerm, setSearchTerm] = useState(''); const [statusFilter, setStatusFilter] = useState<'all' | 'active' | 'inactive' | 'arcwhooshd'>('all'); const [bzzzFilter, setBzzzFilter] = useState<'all' | 'enabled' | 'disabled'>('all'); // Fetch real projects from API const { data: projects = [], isLoading, error } = useQuery({ queryKey: ['projects'], queryFn: async () => { return await projectApi.getProjects(); } }); const filteredProjects = projects.filter(project => { const matchesSearch = project.name.toLowerCase().includes(searchTerm.toLowerCase()) || project.description?.toLowerCase().includes(searchTerm.toLowerCase()); const matchesStatus = statusFilter === 'all' || project.status === statusFilter; const bzzzEnabled = (project as any).bzzz_config?.bzzz_enabled || false; const matchesBzzz = bzzzFilter === 'all' || (bzzzFilter === 'enabled' && bzzzEnabled) || (bzzzFilter === 'disabled' && !bzzzEnabled); return matchesSearch && matchesStatus && matchesBzzz; }); const getStatusBadge = (status: string) => { const baseClasses = 'inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium'; switch (status) { case 'active': return `${baseClasses} bg-green-100 text-green-800`; case 'inactive': return `${baseClasses} bg-gray-100 text-gray-800`; case 'arcwhooshd': return `${baseClasses} bg-red-100 text-red-800`; default: return `${baseClasses} bg-gray-100 text-gray-800`; } }; if (isLoading) { return (
{[1, 2, 3].map(i => (
))}
); } if (error) { return (

Error loading projects

{error instanceof Error ? error.message : 'Failed to load projects'}

); } return (
{/* Header */}

Projects

Manage your workflow projects and track their performance

New Project
{/* Filters */}
setSearchTerm(e.target.value)} className="block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:placeholder-gray-400 focus:ring-1 focus:ring-blue-500 focus:border-blue-500" />
🐝
{/* Projects Grid */} {filteredProjects.length === 0 ? (

No projects found

{searchTerm || statusFilter !== 'all' ? 'Try adjusting your search or filter criteria.' : 'Get started by creating your first project.' }

Create Project
) : (
{filteredProjects.map((project) => { // Real project data from API includes metrics directly return (
{/* Card Header */}
{project.name}

{project.description}

{({ active }) => ( Edit Project )} {({ active }) => ( Manage Workflows )} {({ active }) => ( 🐝 Bzzz Integration )} {({ active }) => ( )}
{/* Status and Tags */}
{project.status} {/* Bzzz Integration Status */} {(project as any).bzzz_config?.bzzz_enabled && ( 🐝 Bzzz {(project as any).bzzz_config?.ready_to_claim && ( )} )}
{project.tags?.slice(0, 2).map((tag) => ( {tag} ))} {project.tags && project.tags.length > 2 && ( +{project.tags.length - 2} )}
{/* GitHub Repository Info for Bzzz-enabled projects */} {(project as any).bzzz_config?.bzzz_enabled && (project as any).bzzz_config?.git_url && (
{(project as any).bzzz_config.git_owner}/{(project as any).bzzz_config.git_repository} {(project as any).bzzz_config.ready_to_claim && ( • Ready for tasks )}
)}
{/* Metrics */}

{(project as any).workflow_count || 0}

Workflows

{(project as any).file_count || 0}

Files

{(project as any).has_project_plan ? 'Yes' : 'No'}

Project Plan

{formatDistanceToNow(new Date(project.updated_at), { addSuffix: true })}

Last Update

{/* Quick Actions */}
View Workflows View Details →
); })}
)}
); }