CartContext.jsx 2.79 KB
import React, { createContext, useState, useContext, useEffect } from 'react';
import { cartService } from '../services/api/cartService';

const CartContext = createContext();

export const useCart = () => {
  const context = useContext(CartContext);
  if (!context) {
    throw new Error('useCart must be used within a CartProvider');
  }
  return context;
};

export const CartProvider = ({ children }) => {
  const [cartItems, setCartItems] = useState([]);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState('');

  useEffect(() => {
    loadCart();
  }, []);

  const loadCart = async () => {
    try {
      setLoading(true);
      const items = await cartService.getCart();
      setCartItems(items);
    } catch (error) {
      console.error('Failed to load cart:', error);
    } finally {
      setLoading(false);
    }
  };

  const addToCart = async (productId, quantity = 1) => {
    try {
      setError('');
      const updatedCart = await cartService.addToCart(productId, quantity);
      setCartItems(updatedCart.items);
      return { success: true };
    } catch (error) {
      setError(error.message || 'Failed to add item to cart');
      return { success: false, error: error.message };
    }
  };

  const updateCartItem = async (productId, quantity) => {
    try {
      setError('');
      const updatedCart = await cartService.updateCartItem(productId, quantity);
      setCartItems(updatedCart.items);
      return { success: true };
    } catch (error) {
      setError(error.message || 'Failed to update cart item');
      return { success: false, error: error.message };
    }
  };

  const removeFromCart = async (productId) => {
    try {
      setError('');
      const updatedCart = await cartService.removeFromCart(productId);
      setCartItems(updatedCart.items);
      return { success: true };
    } catch (error) {
      setError(error.message || 'Failed to remove item from cart');
      return { success: false, error: error.message };
    }
  };

  const clearCart = async () => {
    try {
      setError('');
      await cartService.clearCart();
      setCartItems([]);
      return { success: true };
    } catch (error) {
      setError(error.message || 'Failed to clear cart');
      return { success: false, error: error.message };
    }
  };

  const getCartTotal = () => {
    return cartItems.reduce((total, item) => total + (item.price * item.quantity), 0);
  };

  const getCartItemsCount = () => {
    return cartItems.reduce((count, item) => count + item.quantity, 0);
  };

  const value = {
    cartItems,
    loading,
    error,
    addToCart,
    updateCartItem,
    removeFromCart,
    clearCart,
    getCartTotal,
    getCartItemsCount,
    loadCart
  };

  return (
    <CartContext.Provider value={value}>
      {children}
    </CartContext.Provider>
  );
};