import { Button, Checkbox, Input, Select, Space } from '@arco-design/web-react'; import { IconDelete, IconPlus } from '@arco-design/web-react/icon'; import { useEffect, useState } from 'react'; export interface EnvPreset { key: string; label: string; type: 'select' | 'multiselect' | 'input'; required?: boolean; // 是否必填 options?: Array<{ label: string; value: string }>; } interface EnvPresetsEditorProps { value?: EnvPreset[]; onChange?: (value: EnvPreset[]) => void; } function EnvPresetsEditor({ value = [], onChange }: EnvPresetsEditorProps) { const [presets, setPresets] = useState(value); // 当外部 value 变化时同步到内部状态 useEffect(() => { setPresets(value); }, [value]); const handleAddPreset = () => { const newPreset: EnvPreset = { key: '', label: '', type: 'select', options: [{ label: '', value: '' }], }; const newPresets = [...presets, newPreset]; setPresets(newPresets); onChange?.(newPresets); }; const handleRemovePreset = (index: number) => { const newPresets = presets.filter((_, i) => i !== index); setPresets(newPresets); onChange?.(newPresets); }; const handlePresetChange = ( index: number, field: keyof EnvPreset, val: string | boolean | EnvPreset['type'] | EnvPreset['options'], ) => { const newPresets = [...presets]; newPresets[index] = { ...newPresets[index], [field]: val }; setPresets(newPresets); onChange?.(newPresets); }; const handleAddOption = (presetIndex: number) => { const newPresets = [...presets]; if (!newPresets[presetIndex].options) { newPresets[presetIndex].options = []; } newPresets[presetIndex].options?.push({ label: '', value: '' }); setPresets(newPresets); onChange?.(newPresets); }; const handleRemoveOption = (presetIndex: number, optionIndex: number) => { const newPresets = [...presets]; newPresets[presetIndex].options = newPresets[presetIndex].options?.filter( (_, i) => i !== optionIndex, ); setPresets(newPresets); onChange?.(newPresets); }; const handleOptionChange = ( presetIndex: number, optionIndex: number, field: 'label' | 'value', val: string, ) => { const newPresets = [...presets]; if (newPresets[presetIndex].options) { newPresets[presetIndex].options![optionIndex][field] = val; setPresets(newPresets); onChange?.(newPresets); } }; return (
{presets.map((preset, presetIndex) => (
预设项 #{presetIndex + 1}
handlePresetChange(presetIndex, 'key', val)} /> handlePresetChange(presetIndex, 'label', val) } />
handlePresetChange(presetIndex, 'required', checked) } > 必填项
{(preset.type === 'select' || preset.type === 'multiselect') && (
选项:
{preset.options?.map((option, optionIndex) => (
handleOptionChange( presetIndex, optionIndex, 'label', val, ) } /> handleOptionChange( presetIndex, optionIndex, 'value', val, ) } />
))}
)}
))}
); } export default EnvPresetsEditor;