Cart Component
Shopping cart functionality with full state management.
Setup
Wrap your app with CartProvider:
import { CartProvider } from '@meaple/react-headless-components'
function App() {
return (
<CartProvider>
<YourApp />
</CartProvider>
)
}Basic Usage
import { Cart } from '@meaple/react-headless-components'
function ShoppingCart() {
return (
<Cart>
{({ items, total, addItem, removeItem, updateQuantity, clear }) => (
<div>
<h2>Cart ({items.length} items)</h2>
{items.map(item => (
<div key={item.id}>
<span>{item.name}</span>
<span>${item.price}</span>
<input
type="number"
value={item.quantity}
onChange={(e) => updateQuantity(item.id, +e.target.value)}
/>
<button onClick={() => removeItem(item.id)}>Remove</button>
</div>
))}
<div>Total: ${total}</div>
<button onClick={clear}>Clear Cart</button>
</div>
)}
</Cart>
)
}Cart Props
interface CartRenderProps {
items: CartItem[];
total: number;
itemCount: number;
addItem: (item: CartItem) => void;
removeItem: (itemId: string) => void;
updateQuantity: (itemId: string, quantity: number) => void;
clear: () => void;
isEmpty: boolean;
}
interface CartItem {
id: string;
name: string;
price: number;
quantity: number;
ticketId?: string;
eventId?: string;
}Adding Items
function TicketSelector({ ticket }) {
return (
<Cart>
{({ addItem }) => (
<button
onClick={() => addItem({
id: ticket.id,
name: ticket.name,
price: ticket.price,
quantity: 1,
ticketId: ticket.id,
eventId: ticket.eventId
})}
>
Add to Cart
</button>
)}
</Cart>
)
}Cart Summary
function CartSummary() {
return (
<Cart>
{({ itemCount, total, isEmpty }) => (
<div>
{isEmpty ? (
<p>Your cart is empty</p>
) : (
<>
<p>{itemCount} items</p>
<p>Total: ${total.toFixed(2)}</p>
</>
)}
</div>
)}
</Cart>
)
}Persistent Cart
Save cart to localStorage:
import { CartProvider } from '@meaple/react-headless-components'
function App() {
return (
<CartProvider persistKey="meaple-cart">
<YourApp />
</CartProvider>
)
}Cart Badge
function CartBadge() {
return (
<Cart>
{({ itemCount }) => (
<div className="cart-icon">
<ShoppingCartIcon />
{itemCount > 0 && (
<span className="badge">{itemCount}</span>
)}
</div>
)}
</Cart>
)
}