import { useCollection, useIdentity } from '@deplixo/sdk'; import Header from './components/Header.jsx'; import Overview from './components/Overview.jsx'; import Deployments from './components/Deployments.jsx'; import Logs from './components/Logs.jsx'; import Config from './components/Config.jsx'; function App() { const [tab, setTab] = useState('overview'); const { user } = useIdentity(); const deploymentsCol = useCollection('deployments'); const logsCol = useCollection('logs'); const configCol = useCollection('config'); const allDeployments = deploymentsCol.items || []; const allLogs = logsCol.items || []; const allConfig = configCol.items || []; // Per-user filtering const deployments = allDeployments .filter((d) => d.author?.id === user?.id) .sort((a, b) => (b.createdAt || 0) - (a.createdAt || 0)); const logs = allLogs .filter((l) => l.author?.id === user?.id) .sort((a, b) => (b.createdAt || 0) - (a.createdAt || 0)); const userConfig = allConfig.find((c) => c.author?.id === user?.id); // Seed config on first load useEffect(() => { if (!user || configCol.loading) return; if (!userConfig) { configCol.add({ repoUrl: 'https://github.com/spring-projects/spring-petclinic', branch: 'main', buildCommand: 'mvn clean package -DskipTests', artifactPath: 'target/*.war', runtime: 'tomcat:10.1-jdk17', port: 8080, contextPath: '/', envVars: 'SPRING_PROFILES_ACTIVE=production\nJAVA_OPTS=-Xmx512m', autoDeploy: true, }); } }, [user, configCol.loading, userConfig]); const addLog = (deploymentId, level, message) => { logsCol.add({ deploymentId, level, message, ts: Date.now() }); }; const latestDeployment = deployments[0]; const activeDeployment = deployments.find((d) => ['queued', 'cloning', 'building', 'deploying', 'running'].includes(d.status) ); return (