import { useEffect, useMemo, useState } from 'react'; import type { SpaceScene, StarObject, PlanetObject, SpaceObjectBase } from '../types/space'; import { CosmosView } from './CosmosView'; interface StarSystemViewProps { scene: SpaceScene; onSelect?: (entity: SpaceObjectBase) => void; } export function StarSystemView({ scene, onSelect }: StarSystemViewProps) { const [selectedStarId, setSelectedStarId] = useState(null); const [selectedPlanetId, setSelectedPlanetId] = useState(null); const stars = scene.stars ?? []; useEffect(() => { if (!selectedStarId && stars.length > 0) { setSelectedStarId(stars[0].id); } }, [stars, selectedStarId]); const selectedStar: StarObject | null = useMemo( () => stars.find((star) => star.id === selectedStarId) ?? stars[0] ?? null, [stars, selectedStarId], ); const systemPlanets: PlanetObject[] = useMemo(() => { if (!selectedStar) return []; return (scene.planets ?? []).filter((planet) => planet.starId === selectedStar.id); }, [scene.planets, selectedStar]); useEffect(() => { if (systemPlanets.length === 0) { setSelectedPlanetId(null); return; } if (!selectedPlanetId || !systemPlanets.some((p) => p.id === selectedPlanetId)) { setSelectedPlanetId(systemPlanets[0].id); } }, [systemPlanets, selectedPlanetId]); const selectedPlanet = useMemo( () => systemPlanets.find((planet) => planet.id === selectedPlanetId) ?? null, [systemPlanets, selectedPlanetId], ); const planetMoons = useMemo( () => (scene.moons ?? []).filter((moon) => selectedPlanet ? moon.planetId === selectedPlanet.id : systemPlanets.some((p) => p.id === moon.planetId), ), [scene.moons, selectedPlanet, systemPlanets], ); const filteredScene = useMemo( () => ({ clusters: [], stars: selectedStar ? [selectedStar] : [], planets: systemPlanets, moons: planetMoons, gateways: scene.gateways ?? [], anomalies: scene.anomalies ?? [], }), [selectedStar, systemPlanets, planetMoons, scene.gateways, scene.anomalies], ); const systemMetrics = useMemo(() => { if (!selectedStar) { return { health: 0, microDaos: 0, agents: 0, alerts: 0, }; } const alerts = scene.anomalies?.filter((anomaly) => { // поки немає прив'язки до конкретної ноди, показуємо всі return anomaly.status !== 'stable'; }).length ?? 0; return { health: selectedStar.health, microDaos: systemPlanets.length, agents: systemPlanets.reduce((acc, planet) => acc + planet.agents, 0), alerts, }; }, [selectedStar, systemPlanets, scene.anomalies]); const starButtonClass = (star: StarObject) => `rounded-full border px-4 py-2 text-sm font-semibold transition-colors ${ selectedStar && selectedStar.id === star.id ? 'border-indigo-400 bg-indigo-500/20 text-white' : 'border-white/20 text-white/70 hover:border-white/40' }`; const planetButtonClass = (planet: PlanetObject) => `flex items-center justify-between rounded-2xl border px-4 py-3 text-left transition ${ selectedPlanet && selectedPlanet.id === planet.id ? 'border-cyan-400/60 bg-cyan-500/10 text-white' : 'border-white/10 bg-white/5 text-white/80 hover:border-white/30' }`; return (

Режим

Star System View

{selectedStar && (

Центральна нода: {selectedStar.name}

)}
{[ { label: 'Health', value: `${Math.round(systemMetrics.health)}%` }, { label: 'microDAO', value: systemMetrics.microDaos }, { label: 'Агенти', value: systemMetrics.agents }, { label: 'Alerts', value: systemMetrics.alerts }, ].map((metric) => (

{metric.label}

{metric.value}

))}
{stars.map((star) => ( ))}
{ setSelectedPlanetId(entity.type === 'planet' ? entity.id : selectedPlanetId); onSelect?.(entity); }} />

Орбіти microDAO

{systemPlanets.length === 0 && (

Для цієї ноди ще не під’єднано microDAO.

)} {systemPlanets.map((planet) => ( ))}
{selectedPlanet && (

Супутники / агенти

{planetMoons.length === 0 ? (

Немає активних агентів на цій орбіті.

) : (
{planetMoons.map((moon) => ( ))}
)}
)}
); }