const [data, setData] = useState<any[]>([]);
const [kvp, setFetchedData] = useState<any>();
const [value, setValue] = useState();
const [localDefaultValues, setLocalDefaultValues] = useState([
...defaultValues,
]);
const handleChange = (event: { target: { value: any; name: string } }) => {
const newValue = event.target.value;
const key = event.target.name;
const newData = [...kvp];
const elementToChange = newData.filter(x => x.key === key)[0];
elementToChange.value = newValue;
setFetchedData(mergeDefaultWithFetchedKvp(newData));
};
const handleSelectChange = (event: any) => {
const yearsKey = event.target.name;
const prefixYears = yearsKey.split('-')[0];
const newYearsKey = event.target.value;
const newData = [...kvp];
const elementToChange = newData.filter(x => x.key === yearsKey)[0];
elementToChange.key = prefixYears + '-' + newYearsKey;
const newLocalDefaultValues = [...localDefaultValues];
const index = newLocalDefaultValues.indexOf(yearsKey);
newLocalDefaultValues[index] = elementToChange.key;
setLocalDefaultValues(newLocalDefaultValues);
setFetchedData(newData);
};
async function fetchOperatingAreas() {
let result = await WssoService.getQualityContracts(
operatorsId,
type,
category
);
if (result?.data) {
if (
!result.data.key &&
(result.data.json === undefined || result.data.json === null)
) {
result = await WssoService.createQualityContracts(
operatorsId,
type,
category
);
}
if (result.data.json !== null && result.data.json !== undefined) {
if (result.data.json === '') {
result.data.json = '{}';
}
setFetchedData(
mergeDefaultWithFetchedKvp(JSON.parse(result.data.json))
);
}
setQualityContracts(result?.data || []);
}
setValue(result.data);
}
useEffect(() => {
if (operatorsId) {
fetchOperatingAreas();
}
}, [operatorsId]);
const mergeDefaultWithFetchedKvp = (fetchedKvp: any) => {
const totalKvp = new Array<any>();
const defaultKvp = new Array<any>();
localDefaultValues.forEach((x: any) => {
defaultKvp.push({ key: x });
});
defaultKvp.forEach((x: any) => {
const fieldKey = x.key;
let fetchedKvpPair = null;
if (fetchedKvp.length > 0) {
fetchedKvpPair = fetchedKvp.filter((y: any) => y.key === fieldKey)[0];
}
if (fetchedKvpPair) {
totalKvp.push({ key: fieldKey, value: fetchedKvpPair.value });
} else {
totalKvp.push({ key: fieldKey, value: null });
}
});
if (fetchedKvp.length > 0) {
fetchedKvp.forEach((x: any) => {
if (
totalKvp.filter((y: any) => y.key === x.key).length === 0 &&
x.key &&
x.value
) {
if (x.key.startsWith('years')) {
const leftPart = x.key.split('-')[0];
const itemToRemove = totalKvp.filter(
(y: any) => y.key === leftPart
)[0];
const indexOfItemToRemove = totalKvp.indexOf(itemToRemove);
totalKvp.splice(indexOfItemToRemove, 1);
totalKvp.splice(indexOfItemToRemove, 0, {
key: x.key,
value: x.value,
});
return;
}
totalKvp.push({ key: x.key, value: x.value });
}
});
}
return totalKvp;
};
useEffect(() => {
if (value) {
setData(value?.data ?? []);
}
}, [value]);
console.log(data);<pre><pre>