feat: add customer cart with expiry, shipping addresses with USPS validation, and multi-item PayPal checkout
SonarQube Analysis / sonarqube (pull_request) Failing after 59s
Tests / backend-unit (pull_request) Successful in 34s
Tests / backend-integration (pull_request) Failing after 1m33s
Tests / frontend-e2e (pull_request) Failing after 1m5s

This commit is contained in:
2026-08-14 14:02:25 -05:00
parent 433d7e1db5
commit 9ab689e624
18 changed files with 1242 additions and 189 deletions
+35
View File
@@ -0,0 +1,35 @@
import React, { createContext, useContext, useEffect, useState, useCallback } from 'react';
import { CartItem, fetchCart } from './cartApi';
import { useCustomerAuth } from '../customer/CustomerAuthContext';
interface CartContextValue {
items: CartItem[];
itemIds: Set<number>;
refresh: () => void;
}
const CartContext = createContext<CartContextValue>({ items: [], itemIds: new Set(), refresh: () => {} });
export function useCart() {
return useContext(CartContext);
}
export function CartProvider({ children }: { children: React.ReactNode }) {
const [items, setItems] = useState<CartItem[]>([]);
const { customer } = useCustomerAuth();
const refresh = useCallback(() => {
if (!customer) { setItems([]); return; }
fetchCart().then(data => setItems(data.items)).catch(() => setItems([]));
}, [customer]);
useEffect(() => { refresh(); }, [refresh]);
const itemIds = new Set(items.map(i => i.item_id));
return (
<CartContext.Provider value={{ items, itemIds, refresh }}>
{children}
</CartContext.Provider>
);
}