AB

const [val, setVal] = useState({});
В value лежит одно значение (которое соответствует тому, что отображается на экране), а в val лежит значение, которое на 1 изменение отстаёт. Соответственно, весь стор отстаёт на 1 изменение (там список кликаемых объектов, изначально нет выбранных, после 1-го тапа в value лежит 1 значение, а в val по-прежнему пусто, и первое значение там будет только после 2-го тапа. Как такое может быть? Разве setVal не должен гарантировать консистентность?
Пробовал даже в setTimeout() оборачивать, не важно.