import { useState, useEffect } from 'react'; import { Entity } from '@esengine/ecs-framework'; import { EntityStoreService, MessageHub } from '@esengine/editor-core'; import { useLocale } from '../hooks/useLocale'; import { Box, Layers, Wifi } from 'lucide-react'; import { ProfilerService, RemoteEntity } from '../services/ProfilerService'; import '../styles/SceneHierarchy.css'; interface SceneHierarchyProps { entityStore: EntityStoreService; messageHub: MessageHub; } export function SceneHierarchy({ entityStore, messageHub }: SceneHierarchyProps) { const [entities, setEntities] = useState([]); const [remoteEntities, setRemoteEntities] = useState([]); const [isRemoteConnected, setIsRemoteConnected] = useState(false); const [selectedId, setSelectedId] = useState(null); const { t } = useLocale(); // Subscribe to local entity changes useEffect(() => { const updateEntities = () => { setEntities(entityStore.getRootEntities()); }; const handleSelection = (data: { entity: Entity | null }) => { setSelectedId(data.entity?.id ?? null); }; updateEntities(); const unsubAdd = messageHub.subscribe('entity:added', updateEntities); const unsubRemove = messageHub.subscribe('entity:removed', updateEntities); const unsubClear = messageHub.subscribe('entities:cleared', updateEntities); const unsubSelect = messageHub.subscribe('entity:selected', handleSelection); return () => { unsubAdd(); unsubRemove(); unsubClear(); unsubSelect(); }; }, [entityStore, messageHub]); // Subscribe to remote entity data from ProfilerService useEffect(() => { const profilerService = (window as any).__PROFILER_SERVICE__ as ProfilerService | undefined; if (!profilerService) { console.warn('[SceneHierarchy] ProfilerService not available'); return; } console.log('[SceneHierarchy] Subscribing to ProfilerService'); const unsubscribe = profilerService.subscribe((data) => { const connected = profilerService.isConnected(); console.log('[SceneHierarchy] Received data, connected:', connected, 'entities:', data.entities?.length || 0); setIsRemoteConnected(connected); if (connected && data.entities && data.entities.length > 0) { console.log('[SceneHierarchy] Setting remote entities:', data.entities); setRemoteEntities(data.entities); } else { setRemoteEntities([]); } }); return () => unsubscribe(); }, []); const handleEntityClick = (entity: Entity) => { entityStore.selectEntity(entity); }; // Determine which entities to display const displayEntities = isRemoteConnected ? remoteEntities : entities; const showRemoteIndicator = isRemoteConnected && remoteEntities.length > 0; return (

{t('hierarchy.title')}

{showRemoteIndicator && (
)}
{displayEntities.length === 0 ? (
{t('hierarchy.empty')}
{isRemoteConnected ? 'No entities in remote game' : 'Create an entity to get started'}
) : isRemoteConnected ? (
    {remoteEntities.map(entity => (
  • {entity.name} {entity.components.length > 0 && ( {entity.components.length} )}
  • ))}
) : (
    {entities.map(entity => (
  • handleEntityClick(entity)} > Entity {entity.id}
  • ))}
)}
); }