import { useState, useEffect } from 'react'; import { Plus, Minus } from 'lucide-react'; import { Button, Select, Card, CardBody } from '../../components/ui'; import { Env, AddEvent, RemoveEvent, UpdateEvent } from '../../models/Env'; import { EnvParam } from '../../models/EnvParam'; import { EnvironmentParam } from './EnvironmentParam'; interface EnvironmentProps { envs: Env[]; onChanged: (env: Env) => void; onSelected: (envId: number) => void; onAdd: (env: Env) => number; onRemove: (envId: number) => void; } export function Environment({ envs, onChanged, onSelected, onAdd, onRemove }: EnvironmentProps) { const [currEnvId, setCurrEnvId] = useState(envs[0]?.id ?? 0); // Sync currEnvId when envs changes useEffect(() => { if (!envs.find(e => e.id === currEnvId)) { setCurrEnvId(envs[0]?.id ?? 0); } }, [envs, currEnvId]); const currEnv = envs.find(e => e.id === currEnvId) ?? envs[0]; function handleParamChanged(event: AddEvent | RemoveEvent | UpdateEvent) { let newEnv: Env = currEnv; let isChanged = false; if (event instanceof RemoveEvent) { newEnv = currEnv.delParam(event.payload); isChanged = true; } else if (event instanceof AddEvent) { newEnv = currEnv.addParams(event.payload); isChanged = true; } else if (event instanceof UpdateEvent) { newEnv = currEnv.updateParams(event.payload); isChanged = true; } if (isChanged) { onChanged(newEnv); setCurrEnvId(newEnv.id ?? 0); } } function handleAddEnv() { const name = prompt('Enter new environment name:'); if (!name || name.trim() === '') return; // Calculate next integer ID based on max existing ID const maxId = envs.reduce((max, e) => Math.max(max, e.id ?? 0), -1); const newId = maxId + 1; const newEnv = new Env(newId, name.trim(), [...currEnv.params]); const newIdx = onAdd(newEnv); setCurrEnvId(newEnv.id ?? 0); onSelected(newIdx); } function handleRemoveEnv() { if (currEnv.isDefault()) { alert('Cannot remove DEFAULT environment'); return; } if (!confirm(`Remove environment "${currEnv.name}"?`)) return; const idx = envs.findIndex(x => x.id === currEnv.id); if (idx > -1 && currEnv.id !== undefined) { onRemove(currEnv.id); const newIdx = Math.max(0, idx - 1); const newEnv = envs[newIdx]; if (newEnv?.id !== undefined) { setCurrEnvId(newEnv.id); } onSelected(newIdx); } } const selectOptions = envs.map((x) => ({ value: x.id ?? 0, label: x.name ?? 'Unknown', })); const paramCtrls = currEnv.params.map((x) => ( )); return ( {/* Environment Selector */}