Files
59f443a7-116a-4bc5-bb20-5fd…/src/hooks/useCheckout.ts

76 lines
1.6 KiB
TypeScript

import { useState, useCallback } from "react";
interface CheckoutItem {
id: string;
name: string;
price: number;
quantity: number;
}
interface CheckoutState {
items: CheckoutItem[];
total: number;
loading: boolean;
error: string | null;
}
const useCheckout = () => {
const [state, setState] = useState<CheckoutState>({
items: [],
total: 0,
loading: false,
error: null,
});
const addItem = useCallback((item: CheckoutItem) => {
setState((prev) => ({
...prev,
items: [...prev.items, item],
total: prev.total + item.price * item.quantity,
}));
}, []);
const removeItem = useCallback((itemId: string) => {
setState((prev) => {
const item = prev.items.find((i) => i.id === itemId);
return {
...prev,
items: prev.items.filter((i) => i.id !== itemId),
total: prev.total - (item ? item.price * item.quantity : 0),
};
});
}, []);
const clearCart = useCallback(() => {
setState({
items: [],
total: 0,
loading: false,
error: null,
});
}, []);
const checkout = useCallback(async () => {
setState((prev) => ({ ...prev, loading: true, error: null }));
try {
console.log("Processing checkout with items:", state.items);
setState((prev) => ({ ...prev, loading: false }));
} catch (err) {
setState((prev) => ({
...prev,
loading: false,
error: err instanceof Error ? err.message : "Checkout failed"}));
}
}, [state.items]);
return {
...state,
addItem,
removeItem,
clearCart,
checkout,
};
};
export default useCheckout;