import { useEffect, useState } from 'react'; import { Plus, Save, Trash2, X } from 'lucide-react'; import { DrawerShell } from '../../../components/DrawerShell'; import { PasswordInput } from '../../../components/PasswordInput'; import { LucentIconButton } from '../../../components/lucent/LucentIconButton'; import './DashboardManagementModals.css'; import './DashboardSupportModals.css'; interface CommonModalLabels { cancel: string; close: string; save: string; } interface EnvParamsModalLabels extends CommonModalLabels { addEnvParam: string; envDraftPlaceholderKey: string; envDraftPlaceholderValue: string; envParams: string; envParamsDesc: string; envParamsHint: string; envValue: string; hideEnvValue: string; noEnvParams: string; removeEnvParam: string; showEnvValue: string; } interface EnvParamsModalProps { open: boolean; envEntries: Array<[string, string]>; envDraftKey: string; envDraftValue: string; labels: EnvParamsModalLabels; onClose: () => void; onCreateEnvParam: (key: string, value: string) => Promise | boolean; onDeleteEnvParam: (key: string) => Promise | boolean; onEnvDraftKeyChange: (value: string) => void; onEnvDraftValueChange: (value: string) => void; onSaveEnvParam: (originalKey: string, nextKey: string, nextValue: string) => Promise | boolean; } export function EnvParamsModal({ open, envEntries, envDraftKey, envDraftValue, labels, onClose, onCreateEnvParam, onDeleteEnvParam, onEnvDraftKeyChange, onEnvDraftValueChange, onSaveEnvParam, }: EnvParamsModalProps) { const [createPanelOpen, setCreatePanelOpen] = useState(false); const [envEditDrafts, setEnvEditDrafts] = useState>({}); useEffect(() => { if (open) return; setCreatePanelOpen(false); }, [open]); useEffect(() => { if (!open) return; const nextDrafts: Record = {}; envEntries.forEach(([key, value]) => { nextDrafts[key] = { key, value }; }); setEnvEditDrafts(nextDrafts); }, [envEntries, open]); if (!open) return null; return ( {labels.envParamsHint} ) : undefined )} >
{envEntries.length === 0 ? (
{labels.noEnvParams}
) : ( envEntries.map(([key, value]) => { const draft = envEditDrafts[key] || { key, value }; return (
{draft.key || key}
{labels.envValue}
void onDeleteEnvParam(key)} tooltip={labels.removeEnvParam} aria-label={labels.removeEnvParam} >
{ const nextKey = e.target.value.toUpperCase(); setEnvEditDrafts((prev) => ({ ...prev, [key]: { ...(prev[key] || { key, value }), key: nextKey, }, })); }} placeholder={labels.envDraftPlaceholderKey} autoComplete="off" />
{ const nextValue = e.target.value; setEnvEditDrafts((prev) => ({ ...prev, [key]: { ...(prev[key] || { key, value }), value: nextValue, }, })); }} placeholder={labels.envValue} autoComplete="off" wrapperClassName="is-inline" toggleLabels={{ show: labels.showEnvValue, hide: labels.hideEnvValue, }} />
{labels.envParamsHint}
); }) )}
{createPanelOpen ? (
{labels.addEnvParam}
{labels.envParamsHint}
{ setCreatePanelOpen(false); onEnvDraftKeyChange(''); onEnvDraftValueChange(''); }} tooltip={labels.cancel} aria-label={labels.cancel} >
onEnvDraftKeyChange(e.target.value.toUpperCase())} placeholder={labels.envDraftPlaceholderKey} autoComplete="off" />
onEnvDraftValueChange(e.target.value)} placeholder={labels.envDraftPlaceholderValue} autoComplete="off" wrapperClassName="is-inline" toggleLabels={{ show: labels.showEnvValue, hide: labels.hideEnvValue, }} />
{labels.envParamsHint}
) : null}
); }