jingrow/context/Context.jsx
2025-06-17 15:23:37 +08:00

84 lines
2.1 KiB
JavaScript

"use client";
import React, { useEffect } from "react";
import { useContext, useState } from "react";
const dataContext = React.createContext();
export const useContextElement = () => {
return useContext(dataContext);
};
export default function Context({ children }) {
const [cartProducts, setCartProducts] = useState([]);
const [totalPrice, setTotalPrice] = useState(0);
useEffect(() => {
const subtotal = cartProducts.reduce((accumulator, product) => {
return accumulator + product.quantity * product.price;
}, 0);
setTotalPrice(subtotal);
}, [cartProducts]);
const isAddedToCartProducts = (id) => {
if (cartProducts.filter((elm) => elm.id == id)[0]) {
return true;
}
return false;
};
const addProductToCart = (id, qty) => {
if (!isAddedToCartProducts(id)) {
const item = {
...products.filter((elm) => elm.id == id)[0],
quantity: qty ? qty : 1,
};
setCartProducts((pre) => [...pre, item]);
}
};
const productQuantityInCart = (id) => {
if (!isAddedToCartProducts(id)) {
const item = {
...products.filter((elm) => elm.id == id)[0],
};
return item.quantity;
} else {
return 0;
}
};
const updateQuantity = (id, qty) => {
if (isAddedToCartProducts(id) && qty > 0) {
let item = cartProducts.filter((elm) => elm.id == id)[0];
let items = [...cartProducts];
const itemIndex = items.indexOf(item);
item.quantity = qty / 1;
items[itemIndex] = item;
setCartProducts(items);
}
};
useEffect(() => {
const items = JSON.parse(localStorage.getItem("cartList"));
if (items?.length) {
setCartProducts(items);
}
}, []);
useEffect(() => {
localStorage.setItem("cartList", JSON.stringify(cartProducts));
}, [cartProducts]);
const contextElement = {
cartProducts,
setCartProducts,
totalPrice,
addProductToCart,
isAddedToCartProducts,
productQuantityInCart,
updateQuantity,
};
return (
<dataContext.Provider value={contextElement}>
{children}
</dataContext.Provider>
);
}