setStates(prev => {
prev.map(data => {
if (data.id === Number(id)) {
(data.state === 2) ? data.state = 0 : ++data.state
}
})
})
Функция передаваемая в setStates не возвращает ничего, просто делает map и забывает результат, соотвественно в стейт ложится undefined, у которого метода .map нет, о чем и говорит ошибка
Нужно добавить:
return prev.map...
В map вы делаете похожу ошибку, плюс еще зачем-то мутируете данные.
if (data.id === Number(id)) {
(data.state === 2) ? data.state = 0 : ++data.state
}
Все что не попадет под это условие станет undefined, т.е. у вас массив будет такой структуры
[,,,{},]
Внутри map надо переписать так:
data => {
if (data.id === Number(id)) {
return (data.state === 2) ? {...data, state: 0} : {...data, state: data.state + 1}
}
return data
}
Посмотрите про синтакс стрелочных функций, если не знаете.
Без фигурных скобок
() => expression
C фигурными скобками
() => { return expression }
Возрат объекта
() => ({ someObjectField: ... })