50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
"use client";
|
|
import { useState, useEffect } from "react";
|
|
import { Product } from "@/lib/data";
|
|
|
|
type CartItem = Product & { quantity: number };
|
|
|
|
export function useCart() {
|
|
const [cart, setCart] = useState<CartItem[]>([]);
|
|
|
|
useEffect(() => {
|
|
const savedCart = localStorage.getItem("cart");
|
|
if (savedCart) setCart(JSON.parse(savedCart));
|
|
}, []);
|
|
|
|
const saveCart = (newCart: CartItem[]) => {
|
|
setCart(newCart);
|
|
localStorage.setItem("cart", JSON.stringify(newCart));
|
|
};
|
|
|
|
const addToCart = (product: Product) => {
|
|
const existing = cart.find((item) => item.id === product.id);
|
|
if (existing) {
|
|
saveCart(
|
|
cart.map((item) =>
|
|
item.id === product.id ? { ...item, quantity: item.quantity + 1 } : item
|
|
)
|
|
);
|
|
} else {
|
|
saveCart([...cart, { ...product, quantity: 1 }]);
|
|
}
|
|
};
|
|
|
|
const removeFromCart = (id: string) => {
|
|
saveCart(cart.filter((item) => item.id !== id));
|
|
};
|
|
|
|
const updateQuantity = (id: string, quantity: number) => {
|
|
if (quantity < 1) return removeFromCart(id);
|
|
saveCart(
|
|
cart.map((item) => (item.id === id ? { ...item, quantity } : item))
|
|
);
|
|
};
|
|
|
|
const clearCart = () => saveCart([]);
|
|
|
|
const total = cart.reduce((sum, item) => sum + item.price * item.quantity, 0);
|
|
|
|
return { cart, addToCart, removeFromCart, updateQuantity, clearCart, total };
|
|
}
|