update cart

This commit is contained in:
hamid zarghami
2026-02-10 11:37:26 +03:30
parent 8670e811b0
commit 6996c4fd21
9 changed files with 22 additions and 57 deletions
@@ -53,7 +53,7 @@ export const useCart = () => {
return {}; return {};
} }
return cartItems.data.items.reduce((acc, item) => { return cartItems.data.items.reduce((acc, item) => {
acc[item.foodId] = { quantity: item.quantity }; acc[item.productId] = { quantity: item.quantity };
return acc; return acc;
}, {} as Record<string | number, { quantity: number }>); }, {} as Record<string | number, { quantity: number }>);
} else { } else {
@@ -65,16 +65,14 @@ export const useCart = () => {
return false; return false;
}; };
// برای کاربران لاگین شده، slug از API می‌آید (در cartItems.data.restaurantId) // برای کاربران لاگین شده، slug از API می‌آید (در cartItems.data.shopId)
// برای کاربران لاگین نشده، slug از receiptStore می‌آید // برای کاربران لاگین نشده، slug از receiptStore می‌آید
const cartSlug = useMemo(() => { const cartSlug = useMemo(() => {
if (isSuccess && cartItems?.data?.restaurantId) { if (isSuccess && cartItems?.data?.shopId) {
// اگر از API آمده، می‌توانیم restaurantId را برگردانیم
// اما بهتر است slug را از URL بگیریم چون API ممکن است restaurantId را برگرداند نه slug
return currentSlug; return currentSlug;
} }
return slug; return slug;
}, [isSuccess, cartItems?.data?.restaurantId, currentSlug, slug]); }, [isSuccess, cartItems?.data?.shopId, currentSlug, slug]);
return { return {
items: cartItemsMap, items: cartItemsMap,
@@ -28,7 +28,7 @@ export const useIncrementCart = () => {
if (previousCart?.data && productsData?.data) { if (previousCart?.data && productsData?.data) {
const existingItem = previousCart.data.items.find( const existingItem = previousCart.data.items.find(
(item) => item.foodId === String(id) (item) => item.productId === String(id)
); );
let updatedItems: CartItem[]; let updatedItems: CartItem[];
@@ -36,7 +36,7 @@ export const useIncrementCart = () => {
if (existingItem) { if (existingItem) {
updatedItems = previousCart.data.items.map((item) => { updatedItems = previousCart.data.items.map((item) => {
if (item.foodId === String(id)) { if (item.productId === String(id)) {
return { return {
...item, ...item,
quantity: item.quantity + 1, quantity: item.quantity + 1,
@@ -50,8 +50,8 @@ export const useIncrementCart = () => {
const product = productsData.data.find((f) => String(f.id) === String(id)); const product = productsData.data.find((f) => String(f.id) === String(id));
if (product) { if (product) {
const newItem: CartItem = { const newItem: CartItem = {
foodId: String(id), productId: String(id),
foodTitle: product.title || product.name || "", productTitle: product.title || product.name || "",
quantity: 1, quantity: 1,
price: product.price, price: product.price,
discount: product.discount || 0, discount: product.discount || 0,
@@ -116,7 +116,7 @@ export const useDecrementCart = () => {
if (previousCart?.data) { if (previousCart?.data) {
const updatedItems = previousCart.data.items const updatedItems = previousCart.data.items
.map((item: CartItem) => { .map((item: CartItem) => {
if (item.foodId === String(id)) { if (item.productId === String(id)) {
const newQuantity = item.quantity - 1; const newQuantity = item.quantity - 1;
if (newQuantity <= 0) { if (newQuantity <= 0) {
return null; return null;
+1 -34
View File
@@ -12,20 +12,13 @@ import { useGetProducts } from '@/app/[name]/(Main)/hooks/useMenuData';
import MenuItem from '@/components/listview/MenuItem'; import MenuItem from '@/components/listview/MenuItem';
import MenuItemRenderer from '@/components/listview/MenuItemRenderer'; import MenuItemRenderer from '@/components/listview/MenuItemRenderer';
import type { Product } from '@/app/[name]/(Main)/types/Types'; import type { Product } from '@/app/[name]/(Main)/types/Types';
import { useGetAbout } from '../../(Main)/about/hooks/useAboutData';
import PagerModal from '@/components/pager/PagerModal';
import Button from '@/components/button/PrimaryButton';
import NotificationBellIcon from '@/components/icons/NotificationBellIcon';
const CartIndex = () => { const CartIndex = () => {
const { t } = useTranslation('parallels', { keyPrefix: 'Cart' }); const { t } = useTranslation('parallels', { keyPrefix: 'Cart' });
const router = useRouter(); const router = useRouter();
const { clearCart, items } = useCart(); const { clearCart, items } = useCart();
const [showClearConfirm, setShowClearConfirm] = React.useState(false); const [showClearConfirm, setShowClearConfirm] = React.useState(false);
const [showPagerModal, setShowPagerModal] = React.useState(false);
const { data: productsResponse, isFetching } = useGetProducts(); const { data: productsResponse, isFetching } = useGetProducts();
const { data: aboutData } = useGetAbout();
const isPremium = aboutData?.data?.plan === 'premium';
const products = React.useMemo(() => productsResponse?.data ?? [], [productsResponse?.data]); const products = React.useMemo(() => productsResponse?.data ?? [], [productsResponse?.data]);
const isLoading = isFetching && !products.length; const isLoading = isFetching && !products.length;
@@ -102,36 +95,12 @@ const CartIndex = () => {
</div> </div>
) : ( ) : (
<div className="flex flex-col gap-4 pb-24"> <div className="flex flex-col gap-4 pb-24">
{!isPremium && (
<div className='bg-container rounded-container p-4 border border-border shadow-sm'>
<div className='flex items-start gap-3 mb-4'>
<div className='shrink-0 mt-0.5'>
<NotificationBellIcon width={24} height={24} className="currentColor" />
</div>
<div className='flex-1'>
<p className='text-sm font-medium text-foreground mb-1'>
ثبت سفارش
</p>
<p className='text-xs text-muted-foreground leading-5'>
برای ثبت سفارش، لطفاً گارسون را صدا کنید
</p>
</div>
</div>
<Button
onClick={() => setShowPagerModal(true)}
className='w-full dark:bg-white! dark:text-black! flex items-center justify-center gap-2'
>
<NotificationBellIcon width={18} height={18} className="text-white dark:text-black!" />
<span>صدا کردن گارسون</span>
</Button>
</div>
)}
{cartProducts.map((product) => ( {cartProducts.map((product) => (
<MenuItemRenderer key={product.id}> <MenuItemRenderer key={product.id}>
<MenuItem product={product} /> <MenuItem product={product} />
</MenuItemRenderer> </MenuItemRenderer>
))} ))}
<CartSummary isPremium={isPremium} /> <CartSummary isPremium />
</div> </div>
)} )}
</div> </div>
@@ -148,8 +117,6 @@ const CartIndex = () => {
onClick={toggleClearConfirm} onClick={toggleClearConfirm}
/> />
</div> </div>
<PagerModal visible={showPagerModal} onClose={() => setShowPagerModal(false)} />
</div> </div>
); );
}; };
@@ -7,12 +7,12 @@ export const bulkCart = async (params: BulkCartItem) => {
}; };
export const increment = async (id: string | number) => { export const increment = async (id: string | number) => {
const { data } = await api.post(`/public/cart/items/${id}/increment`); const { data } = await api.post(`/public/cart/product/${id}/increment`);
return data; return data;
}; };
export const decrement = async (id: string | number) => { export const decrement = async (id: string | number) => {
const { data } = await api.post(`/public/cart/items/${id}/decrement`); const { data } = await api.post(`/public/cart/product/${id}/decrement`);
return data; return data;
}; };
+5 -5
View File
@@ -2,14 +2,14 @@ import { BaseResponse } from "@/app/[name]/(Main)/types/Types";
export type BulkCartItem = { export type BulkCartItem = {
items: { items: {
foodId: string; productId: string;
quantity: number; quantity: number;
}[]; }[];
}; };
export interface CartItem { export interface CartItem {
foodId: string; productId: string;
foodTitle: string; productTitle: string;
quantity: number; quantity: number;
price: number; price: number;
discount: number; discount: number;
@@ -24,8 +24,8 @@ export interface Coupon {
export interface CartData { export interface CartData {
userId: string; userId: string;
restaurantId: string; shopId: string;
restaurantName: string; shopName: string;
items: CartItem[]; items: CartItem[];
deliveryFee: number; deliveryFee: number;
subTotal: number; subTotal: number;
+1 -1
View File
@@ -289,7 +289,7 @@ const CustomMap: React.FC<CustomMapProps> = ({
</button> </button>
</div> </div>
{isMapLoading && ( {isMapLoading && (
<div className="absolute inset-0 bg-zinc-50/80 backdrop-blur-sm z-[400]"> <div className="absolute inset-0 bg-zinc-50/80 backdrop-blur-sm z-400">
<div className="grid grid-cols-3 gap-4 p-8 h-full"> <div className="grid grid-cols-3 gap-4 p-8 h-full">
<Skeleton className="h-full" /> <Skeleton className="h-full" />
<Skeleton className="h-full" /> <Skeleton className="h-full" />
+1 -1
View File
@@ -33,7 +33,7 @@ export default function SplashScreen({
initial={{ opacity: 1 }} initial={{ opacity: 1 }}
exit={{ opacity: 0 }} exit={{ opacity: 0 }}
transition={{ duration: 0.5 }} transition={{ duration: 0.5 }}
className="fixed inset-0 z-[9999] flex flex-col items-center justify-center" className="fixed inset-0 z-9999 flex flex-col items-center justify-center"
> >
{/* دایره‌های تزئینی پس‌زمینه */} {/* دایره‌های تزئینی پس‌زمینه */}
<div className="absolute inset-0 overflow-hidden"> <div className="absolute inset-0 overflow-hidden">
+1 -1
View File
@@ -1,6 +1,6 @@
// export const API_BASE_URL = "https://dmenuplus-api.dev.danakcorp.com"; // export const API_BASE_URL = "https://dmenuplus-api.dev.danakcorp.com";
// export const API_BASE_URL = // export const API_BASE_URL =
// "https://dmenuplus-api-production.dev.danakcorp.com"; // "https://dmenuplus-api-production.dev.danakcorp.com";
export const API_BASE_URL = "http://192.168.99.209:4000"; export const API_BASE_URL = "http://10.86.60.88:4000";
export const TOKEN_NAME = "dmenu-t"; export const TOKEN_NAME = "dmenu-t";
export const REFRESH_TOKEN_NAME = "dmenu-rt"; export const REFRESH_TOKEN_NAME = "dmenu-rt";
+2 -2
View File
@@ -55,12 +55,12 @@ const StepOtp = ({ phone, slug }: Props) => {
const bulkCartItems = Object.entries(items).map(([key, value]) => { const bulkCartItems = Object.entries(items).map(([key, value]) => {
if (value.quantity > 0) { if (value.quantity > 0) {
return { return {
foodId: key, productId: key,
quantity: value.quantity quantity: value.quantity
} }
} }
return undefined return undefined
}).filter((item): item is { foodId: string; quantity: number } => item !== undefined) }).filter((item): item is { productId: string; quantity: number } => item !== undefined)
if (!!bulkCartItems.length) { if (!!bulkCartItems.length) {
mutateBulkCart({ items: bulkCartItems }, { mutateBulkCart({ items: bulkCartItems }, {
onSuccess: () => { onSuccess: () => {