2025-08-08 11:53:47 +05:30

98 lines
2.5 KiB
JavaScript

import {
ADD_TO_CART,
DECREMENT_QUANTITY,
INCREMENT_QUANTITY,
REMOVE_FROM_CART,
} from "../actions/type";
import { minValueOne } from "../../utils";
const init = {
cart: [],
};
export const cartReducer = (state = init, action) => {
switch (action.type) {
case ADD_TO_CART:
const productId = action.product.id;
const productQty = action.qty ? action.qty : 1;
if (state.cart.findIndex((product) => product.id === productId) !== -1) {
const cart = state.cart.reduce((cartAcc, product) => {
if (product.id === productId) {
cartAcc.push({
...product,
selected_color: action.color,
selected_size: action.size,
qty: product.qty? product.qty + productQty :1,
sum:
((product.price * product.discount) / 100) *
(product.qty + productQty),
}); // Increment qty
} else {
cartAcc.push(product);
}
return cartAcc;
}, []);
return { ...state, cart };
}
return {
...state,
cart: [
...state.cart,
{
...action.product,
selected_color: action.color,
selected_size: action.size,
qty: action.qty,
sum:
((action.product.price * action.product.discount) / 100) *
action.qty,
},
],
};
case REMOVE_FROM_CART:
return {
cart: state.cart.filter((item) => item.id !== action.product_id),
};
case INCREMENT_QUANTITY:
const inc_productId = action.product_id.id;
const new_cart = state.cart.reduce((cartAcc, product) => {
if (product.id === inc_productId) {
cartAcc.push({
...product,
qty: product.qty + 1,
});
} else {
cartAcc.push(product);
}
return cartAcc;
}, []);
return { ...state, cart: new_cart };
case DECREMENT_QUANTITY:
const decProductId = action.product_id.id;
const decCart = state.cart.reduce((cartAcc, product) => {
if (product.id === decProductId) {
cartAcc.push({
...product,
qty: minValueOne(product.qty - 1),
});
} else {
cartAcc.push(product);
}
return cartAcc;
}, []);
return { ...state, cart: decCart };
default:
return state;
}
};
export default cartReducer;