1. Зачем каждое добавление проверять существование корзины в localStorage? Добавьте экшен initBasket и вызывайте его один раз во время инициализации приложения:
let cart = [];
// сумму тут хранить не надо
const initCart = () => {/* ... */};
const addProduct = (product, quantity) => {/* ... */};
const deleteProduct = id => {/* ... */};
const changeQuantity = (id, quantity) => {/* ... */};
2. Сумму надо пересчитывать после каждой операции заново. Никаких вычислений на основе предыдущих результатов.
3. Обновление количества:
const addProduct = (product, quantity) => {
const index = cart.indexOf(item => item.product.id = product.id);
if (index !== -1) {
cart = cart.map((item, i) =>
i === index ? { ...item, quantity: item.quantity + quantity } : item);
} else {
cart = [ ...cart, { product, quantity} ];
}
const sum = cart.reduce((sum, item) => sum + item.price * item.quantity, 0);
localStorage.setItem('cart', JSON.stringify(cart));
localStorage.setItem('sum', JSON.stringify(sum));
return dispatch => {
dispatch({
type: ADD_PRODUCT,
payload: {
cart,
sum,
},
});
};
}
Заметьте обновление иммутабельное. Если вы уверены, что вам тут не нужна иммутабельность, то замените обноление на:
if (index !== -1) {
cart[index].quantity += quantity;
} else {
cart.push({ product, quantity });
}
Cтруктура cartItem:
{
product,
quantity,
}