import React from "react";
function ConfigEditor({config, setConfig}) {
const handleValueChange = (key, value) => {
setConfig((prev) => ({...prev, [key]: value}));
};
const handleAddToList = (key) => {
setConfig((prev) => ({
...prev,
[key]: [...prev[key], {}], // Add an empty object
}));
};
const handleRemoveFromList = (key, index) => {
setConfig((prev) => ({
...prev,
[key]: prev[key].filter((_, i) => i !== index),
}));
};
const handleNestedChange = (key, nestedKey, value) => {
setConfig((prev) => ({
...prev,
[key]: {...prev[key], [nestedKey]: value},
}));
};
const handleObjectInListChange = (listKey, index, fieldKey, value) => {
setConfig((prev) => ({
...prev,
[listKey]: prev[listKey].map((item, i) =>
i === index ? {...item, [fieldKey]: value} : item
),
}));
};
const renderField = (key, value) => {
if (Array.isArray(value)) {
// Render a list editor
return (
{value.map((item, index) => (
{typeof item === "object" && item !== null ? (
// Render object fields
{Object.entries(item).map(([fieldKey, fieldValue]: [string, any]) => (
handleObjectInListChange(
key,
index,
fieldKey,
e.target.value
)
}
/>
))}
) : (
// Render primitive values in the list
handleValueChange(key, [
...value.slice(0, index),
e.target.value,
...value.slice(index + 1),
])
}
/>
)}
))}
);
} else if (typeof value === "object" && value !== null) {
// Render nested objects
return (
{Object.entries(value).map(([nestedKey, nestedValue]) =>
renderField(nestedKey, nestedValue)
)}
);
} else {
// Render a single value editor
return (
handleValueChange(key, e.target.value)}
/>
);
}
};
return {Object.entries(config).map(([key, value]) => renderField(key, value))}
;
}
export default ConfigEditor;