Skip to content

Commit e8c65cb

Browse files
committed
add app context with cart, wishlist and auth state
1 parent ca72fd0 commit e8c65cb

1 file changed

Lines changed: 108 additions & 0 deletions

File tree

mobile/src/context/AppContext.js

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import React, { createContext, useContext, useState, useEffect } from 'react';
2+
import AsyncStorage from '@react-native-async-storage/async-storage';
3+
4+
const AppContext = createContext();
5+
6+
export const AppProvider = ({ children }) => {
7+
const [cartItems, setCartItems] = useState([]);
8+
const [wishlistItems, setWishlistItems] = useState([]);
9+
const [user, setUser] = useState(null);
10+
const [orders, setOrders] = useState([]);
11+
12+
useEffect(() => {
13+
const load = async () => {
14+
const cart = await AsyncStorage.getItem('zappify_cart');
15+
const wishlist = await AsyncStorage.getItem('zappify_wishlist');
16+
const savedUser = await AsyncStorage.getItem('zappify_user');
17+
if (cart) setCartItems(JSON.parse(cart));
18+
if (wishlist) setWishlistItems(JSON.parse(wishlist));
19+
if (savedUser) {
20+
const u = JSON.parse(savedUser);
21+
setUser(u);
22+
const userOrders = await AsyncStorage.getItem(`zappify_orders_${u.email}`);
23+
if (userOrders) setOrders(JSON.parse(userOrders));
24+
}
25+
};
26+
load();
27+
}, []);
28+
29+
const addToCart = (product, size) => {
30+
setCartItems(prev => {
31+
const exists = prev.find(i => i.id === product.id && i.size === size);
32+
const updated = exists
33+
? prev.map(i => i.id === product.id && i.size === size ? { ...i, qty: i.qty + 1 } : i)
34+
: [...prev, { ...product, size, qty: 1 }];
35+
AsyncStorage.setItem('zappify_cart', JSON.stringify(updated));
36+
return updated;
37+
});
38+
};
39+
40+
const removeFromCart = (id, size) => {
41+
setCartItems(prev => {
42+
const updated = prev.filter(i => !(i.id === id && i.size === size));
43+
AsyncStorage.setItem('zappify_cart', JSON.stringify(updated));
44+
return updated;
45+
});
46+
};
47+
48+
const toggleWishlist = (product) => {
49+
setWishlistItems(prev => {
50+
const updated = prev.find(i => i.id === product.id)
51+
? prev.filter(i => i.id !== product.id)
52+
: [...prev, product];
53+
AsyncStorage.setItem('zappify_wishlist', JSON.stringify(updated));
54+
return updated;
55+
});
56+
};
57+
58+
const isWishlisted = (id) => wishlistItems.some(i => i.id === id);
59+
60+
const login = async (userData) => {
61+
setUser(userData);
62+
await AsyncStorage.setItem('zappify_user', JSON.stringify(userData));
63+
const userOrders = await AsyncStorage.getItem(`zappify_orders_${userData.email}`);
64+
setOrders(userOrders ? JSON.parse(userOrders) : []);
65+
};
66+
67+
const logout = async () => {
68+
setUser(null);
69+
await AsyncStorage.removeItem('zappify_user');
70+
setOrders([]);
71+
};
72+
73+
const placeOrder = async (items) => {
74+
const newOrders = items.map(item => ({
75+
...item,
76+
orderId: Math.floor(10000000 + Math.random() * 90000000).toString(),
77+
placedAt: new Date().toISOString(),
78+
status: 'Placed',
79+
}));
80+
const updated = [...orders, ...newOrders];
81+
setOrders(updated);
82+
await AsyncStorage.setItem(`zappify_orders_${user.email}`, JSON.stringify(updated));
83+
setCartItems([]);
84+
await AsyncStorage.removeItem('zappify_cart');
85+
};
86+
87+
const cancelOrder = async (orderId) => {
88+
const updated = orders.map(o => o.orderId === orderId ? { ...o, status: 'Cancelled' } : o);
89+
setOrders(updated);
90+
await AsyncStorage.setItem(`zappify_orders_${user.email}`, JSON.stringify(updated));
91+
};
92+
93+
const cartTotal = cartItems.reduce((sum, i) => sum + i.price * i.qty, 0);
94+
const cartCount = cartItems.reduce((sum, i) => sum + i.qty, 0);
95+
96+
return (
97+
<AppContext.Provider value={{
98+
cartItems, wishlistItems, user, orders,
99+
addToCart, removeFromCart, toggleWishlist, isWishlisted,
100+
login, logout, placeOrder, cancelOrder,
101+
cartTotal, cartCount,
102+
}}>
103+
{children}
104+
</AppContext.Provider>
105+
);
106+
};
107+
108+
export const useApp = () => useContext(AppContext);

0 commit comments

Comments
 (0)