From b536e0dd2db240f4cfdf8ee229afef0c0d4e06b0 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Mon, 1 Dec 2025 11:44:58 +0330 Subject: [PATCH] Create hook useCart --- src/app/[name]/(Dialogs)/cart/hook/useCart.ts | 59 +++++++++++++++++++ .../(Dialogs)/cart/hooks/useCartData.ts | 27 ++++++++- .../(Dialogs)/cart/service/CartService.ts | 20 +++++++ src/components/listview/MenuItem.tsx | 2 +- 4 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 src/app/[name]/(Dialogs)/cart/hook/useCart.ts diff --git a/src/app/[name]/(Dialogs)/cart/hook/useCart.ts b/src/app/[name]/(Dialogs)/cart/hook/useCart.ts new file mode 100644 index 0000000..0740c81 --- /dev/null +++ b/src/app/[name]/(Dialogs)/cart/hook/useCart.ts @@ -0,0 +1,59 @@ +import { useGetProfile } from "@/app/[name]/(Profile)/profile/hooks/userProfileData"; +import { useReceiptStore } from "@/zustand/receiptStore"; +import { + useClearCart, + useDecrementCart, + useGetCartItems, + useIncrementCart, +} from "../hooks/useCartData"; + +export const useCart = () => { + const { isSuccess } = useGetProfile(); + const { clear, increment, decrement, items } = useReceiptStore(); + const { mutate: mutateIncrementCart } = useIncrementCart(); + const { mutate: mutateDecrementCart } = useDecrementCart(); + const { mutate: mutateClearCart } = useClearCart(); + const { data: cartItems } = useGetCartItems(); + + const addToCart = (id: string | number) => { + if (isSuccess) { + mutateIncrementCart(id); + } else { + increment(id); + } + }; + + const removeFromCart = (id: string | number) => { + if (isSuccess) { + mutateDecrementCart(id); + } else { + decrement(id); + } + }; + + const clearCart = () => { + if (isSuccess) { + mutateClearCart(); + } else { + clear(); + } + }; + + const getCartItems = () => { + if (isSuccess) { + return cartItems; + } else { + return items; + } + }; + + return { + items: getCartItems(), + increment, + decrement, + clear, + addToCart, + removeFromCart, + clearCart, + }; +}; diff --git a/src/app/[name]/(Dialogs)/cart/hooks/useCartData.ts b/src/app/[name]/(Dialogs)/cart/hooks/useCartData.ts index eed45d5..80dfe00 100644 --- a/src/app/[name]/(Dialogs)/cart/hooks/useCartData.ts +++ b/src/app/[name]/(Dialogs)/cart/hooks/useCartData.ts @@ -1,4 +1,4 @@ -import { useMutation } from "@tanstack/react-query"; +import { useMutation, useQuery } from "@tanstack/react-query"; import * as api from "../service/CartService"; export const useBulkCart = () => { @@ -6,3 +6,28 @@ export const useBulkCart = () => { mutationFn: api.bulkCart, }); }; + +export const useIncrementCart = () => { + return useMutation({ + mutationFn: api.increment, + }); +}; + +export const useDecrementCart = () => { + return useMutation({ + mutationFn: api.decrement, + }); +}; + +export const useClearCart = () => { + return useMutation({ + mutationFn: api.clear, + }); +}; + +export const useGetCartItems = () => { + return useQuery({ + queryKey: ["cart-items"], + queryFn: api.getCartItems, + }); +}; diff --git a/src/app/[name]/(Dialogs)/cart/service/CartService.ts b/src/app/[name]/(Dialogs)/cart/service/CartService.ts index aaac41b..72f0ebc 100644 --- a/src/app/[name]/(Dialogs)/cart/service/CartService.ts +++ b/src/app/[name]/(Dialogs)/cart/service/CartService.ts @@ -5,3 +5,23 @@ export const bulkCart = async (params: BulkCartItem) => { const { data } = await api.post("/public/cart/items/bulk", params); return data; }; + +export const increment = async (id: string | number) => { + const { data } = await api.post(`/public/cart/items/${id}/increment`); + return data; +}; + +export const decrement = async (id: string | number) => { + const { data } = await api.post(`/public/cart/items/${id}/decrement`); + return data; +}; + +export const clear = async () => { + const { data } = await api.delete("/public/cart/items"); + return data; +}; + +export const getCartItems = async () => { + const { data } = await api.get("/public/cart"); + return data; +}; diff --git a/src/components/listview/MenuItem.tsx b/src/components/listview/MenuItem.tsx index f784998..6a0b630 100644 --- a/src/components/listview/MenuItem.tsx +++ b/src/components/listview/MenuItem.tsx @@ -12,8 +12,8 @@ interface MenuItemProps { } const MenuItem = ({ food }: MenuItemProps) => { - const quantity = useReceiptStore(state => state.items[food.id]?.quantity || 0); + const quantity = useReceiptStore(state => state.items[food.id]?.quantity || 0); const increment = useReceiptStore(state => state.increment); const decrement = useReceiptStore(state => state.decrement);