import { useState, useEffect } from 'react'; import { Entity } from '@esengine/ecs-framework'; import { ComponentRegistry, ComponentTypeInfo } from '@esengine/editor-core'; import './AddComponent.css'; interface AddComponentProps { entity: Entity; componentRegistry: ComponentRegistry; onAdd: (componentName: string) => void; onCancel: () => void; } export function AddComponent({ entity, componentRegistry, onAdd, onCancel }: AddComponentProps) { const [components, setComponents] = useState([]); const [selectedComponent, setSelectedComponent] = useState(null); const [filter, setFilter] = useState(''); useEffect(() => { if (!componentRegistry) { console.error('ComponentRegistry is null'); return; } const allComponents = componentRegistry.getAllComponents(); console.log('All registered components:', allComponents); allComponents.forEach(comp => { console.log(`Component ${comp.name}: has type = ${!!comp.type}`); }); const existingComponentNames = entity.components.map(c => c.constructor.name); const availableComponents = allComponents.filter( comp => comp.type && !existingComponentNames.includes(comp.name) ); console.log('Available components to add:', availableComponents); console.log('Components filtered out:', allComponents.filter(comp => !comp.type).map(c => c.name)); setComponents(availableComponents); }, [entity, componentRegistry]); const filteredComponents = components.filter(comp => comp.name.toLowerCase().includes(filter.toLowerCase()) || comp.category?.toLowerCase().includes(filter.toLowerCase()) ); const handleAdd = () => { if (selectedComponent) { onAdd(selectedComponent); } }; const groupedComponents = filteredComponents.reduce((groups, comp) => { const category = comp.category || 'Other'; if (!groups[category]) { groups[category] = []; } groups[category].push(comp); return groups; }, {} as Record); return (
e.stopPropagation()}>

Add Component

setFilter(e.target.value)} autoFocus />
{Object.keys(groupedComponents).length === 0 ? (
No available components
) : ( Object.entries(groupedComponents).map(([category, comps]) => (
{category}
{comps.map(comp => (
setSelectedComponent(comp.name)} onDoubleClick={handleAdd} >
{comp.name}
{comp.description && (
{comp.description}
)}
))}
)) )}
); }