CartContext.jsx
2.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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>
  );
};