76 lines
1.6 KiB
TypeScript
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;
|