diff --git a/public/icons/shop-marker.svg b/public/icons/shop-marker.svg
new file mode 100644
index 0000000..b769ed9
--- /dev/null
+++ b/public/icons/shop-marker.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/app/[name]/(Dialogs)/cart/components/CartItemsList.tsx b/src/app/[name]/(Dialogs)/cart/components/CartItemsList.tsx
index 47401d7..cc52a3d 100644
--- a/src/app/[name]/(Dialogs)/cart/components/CartItemsList.tsx
+++ b/src/app/[name]/(Dialogs)/cart/components/CartItemsList.tsx
@@ -3,33 +3,33 @@
import React from 'react';
import MenuItem from '@/components/listview/MenuItem';
import MenuItemRenderer from '@/components/listview/MenuItemRenderer';
-import { useGetFoods } from '@/app/[name]/(Main)/hooks/useMenuData';
-import type { Food } from '@/app/[name]/(Main)/types/Types';
+import { useGetProducts } from '@/app/[name]/(Main)/hooks/useMenuData';
+import type { Product } from '@/app/[name]/(Main)/types/Types';
import { useCart } from '../hook/useCart';
import { useTranslation } from 'react-i18next';
import { CartItemsSkeleton } from './CartSkeleton';
const CartItemsList = () => {
- const { data: foodsResponse, isFetching } = useGetFoods();
- const foods = React.useMemo(() => foodsResponse?.data ?? [], [foodsResponse?.data]);
+ const { data: productsResponse, isFetching } = useGetProducts();
+ const products = React.useMemo(() => productsResponse?.data ?? [], [productsResponse?.data]);
const { items } = useCart();
const { t } = useTranslation('parallels', { keyPrefix: 'Cart' });
- const cartFoods = React.useMemo(() => {
- if (!foods.length) return [];
+ const cartProducts = React.useMemo(() => {
+ if (!products.length) return [];
return Object.entries(items)
.filter(([, detail]) => detail?.quantity && detail.quantity > 0)
.map(([id]) =>
- foods.find((foodItem) => String(foodItem.id) === String(id))
+ products.find((productItem) => String(productItem.id) === String(id))
)
- .filter((food): food is Food => Boolean(food));
- }, [foods, items]);
+ .filter((product): product is Product => Boolean(product));
+ }, [products, items]);
- if (isFetching && !foods.length) {
+ if (isFetching && !products.length) {
return ;
}
- if (cartFoods.length === 0) {
+ if (cartProducts.length === 0) {
return (
{t('EmptyStateTitle', { defaultValue: 'سبد خرید شما خالی است' })}
@@ -44,9 +44,9 @@ const CartItemsList = () => {
return (
- {cartFoods.map((food) => (
-
-
+ {cartProducts.map((product) => (
+
+
))}
diff --git a/src/app/[name]/(Dialogs)/cart/components/CartSummary.tsx b/src/app/[name]/(Dialogs)/cart/components/CartSummary.tsx
index 1121a27..ea5dd89 100644
--- a/src/app/[name]/(Dialogs)/cart/components/CartSummary.tsx
+++ b/src/app/[name]/(Dialogs)/cart/components/CartSummary.tsx
@@ -4,8 +4,8 @@ import React from 'react';
import Link from 'next/link';
import { useParams, useRouter, usePathname } from 'next/navigation';
import Button from '@/components/button/PrimaryButton';
-import { useGetFoods } from '@/app/[name]/(Main)/hooks/useMenuData';
-import type { Food } from '@/app/[name]/(Main)/types/Types';
+import { useGetProducts } from '@/app/[name]/(Main)/hooks/useMenuData';
+import type { Product } from '@/app/[name]/(Main)/types/Types';
import { useCart } from '../hook/useCart';
import { useTranslation } from 'react-i18next';
import { useGetProfile } from '@/app/[name]/(Profile)/profile/hooks/userProfileData';
@@ -22,22 +22,22 @@ const CartSummary = ({ isPremium }: CartSummaryProps) => {
const pathname = usePathname();
const name = params.name as string;
const { isSuccess } = useGetProfile();
- const { data: foodsResponse } = useGetFoods();
- const foods = React.useMemo(() => foodsResponse?.data ?? [], [foodsResponse?.data]);
+ const { data: productsResponse } = useGetProducts();
+ const products = React.useMemo(() => productsResponse?.data ?? [], [productsResponse?.data]);
const { items } = useCart();
const { data: cartData } = useGetCartItems(isSuccess);
const { t } = useTranslation('parallels', { keyPrefix: 'Cart' });
const { description, setDescription } = useCartStore();
- const cartFoods = React.useMemo(() => {
- if (!foods.length) return [];
+ const cartProducts = React.useMemo(() => {
+ if (!products.length) return [];
return Object.entries(items)
.filter(([, detail]) => detail?.quantity && detail.quantity > 0)
.map(([id]) =>
- foods.find((foodItem) => String(foodItem.id) === String(id))
+ products.find((productItem) => String(productItem.id) === String(id))
)
- .filter((food): food is Food => Boolean(food));
- }, [foods, items]);
+ .filter((product): product is Product => Boolean(product));
+ }, [products, items]);
const totalPrice = React.useMemo(() => {
// اگر داده از API آمده و total وجود دارد، از آن استفاده میکنیم
@@ -46,16 +46,16 @@ const CartSummary = ({ isPremium }: CartSummaryProps) => {
}
// در غیر این صورت، محاسبه محلی با در نظر گرفتن تخفیف
- return cartFoods.reduce((sum, food) => {
- const qty = items[String(food.id)]?.quantity ?? 0;
- const basePrice = food.price ?? 0;
- const discount = food.discount ?? 0;
+ return cartProducts.reduce((sum, product) => {
+ const qty = items[String(product.id)]?.quantity ?? 0;
+ const basePrice = product.price ?? 0;
+ const discount = product.discount ?? 0;
const priceAfterDiscount = basePrice * (1 - discount / 100);
return sum + priceAfterDiscount * qty;
}, 0);
- }, [cartFoods, items, isSuccess, cartData?.data?.total]);
+ }, [cartProducts, items, isSuccess, cartData?.data?.total]);
- const isCartEmpty = cartFoods.length === 0;
+ const isCartEmpty = cartProducts.length === 0;
const formatPrice = React.useCallback(
(value: number) => value.toLocaleString('fa-IR'),
diff --git a/src/app/[name]/(Dialogs)/cart/hooks/useCartData.ts b/src/app/[name]/(Dialogs)/cart/hooks/useCartData.ts
index 20c4d7c..21f459f 100644
--- a/src/app/[name]/(Dialogs)/cart/hooks/useCartData.ts
+++ b/src/app/[name]/(Dialogs)/cart/hooks/useCartData.ts
@@ -1,7 +1,7 @@
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import * as api from "../service/CartService";
import type { CartResponse, CartItem } from "../types/Types";
-import type { FoodsResponse } from "@/app/[name]/(Main)/types/Types";
+import type { ProductsResponse } from "@/app/[name]/(Main)/types/Types";
export const useBulkCart = () => {
const queryClient = useQueryClient();
@@ -24,9 +24,9 @@ export const useIncrementCart = () => {
const previousCart = queryClient.getQueryData
([
"cart-items",
]);
- const foodsData = queryClient.getQueryData(["menu"]);
+ const productsData = queryClient.getQueryData(["menu"]);
- if (previousCart?.data && foodsData?.data) {
+ if (previousCart?.data && productsData?.data) {
const existingItem = previousCart.data.items.find(
(item) => item.foodId === String(id)
);
@@ -47,15 +47,15 @@ export const useIncrementCart = () => {
});
newTotalItems = previousCart.data.totalItems + 1;
} else {
- const food = foodsData.data.find((f) => String(f.id) === String(id));
- if (food) {
+ const product = productsData.data.find((f) => String(f.id) === String(id));
+ if (product) {
const newItem: CartItem = {
foodId: String(id),
- foodTitle: food.title || food.name || "",
+ foodTitle: product.title || product.name || "",
quantity: 1,
- price: food.price,
- discount: food.discount || 0,
- totalPrice: food.price * (1 - (food.discount || 0) / 100),
+ price: product.price,
+ discount: product.discount || 0,
+ totalPrice: product.price * (1 - (product.discount || 0) / 100),
};
updatedItems = [...previousCart.data.items, newItem];
newTotalItems = previousCart.data.totalItems + 1;
diff --git a/src/app/[name]/(Dialogs)/cart/page.tsx b/src/app/[name]/(Dialogs)/cart/page.tsx
index 218102d..5b43ace 100644
--- a/src/app/[name]/(Dialogs)/cart/page.tsx
+++ b/src/app/[name]/(Dialogs)/cart/page.tsx
@@ -8,10 +8,10 @@ import Image from 'next/image';
import { useCart } from './hook/useCart';
import CartSummary from './components/CartSummary';
import Prompt from '@/components/utils/Prompt';
-import { useGetFoods } from '@/app/[name]/(Main)/hooks/useMenuData';
+import { useGetProducts } from '@/app/[name]/(Main)/hooks/useMenuData';
import MenuItem from '@/components/listview/MenuItem';
import MenuItemRenderer from '@/components/listview/MenuItemRenderer';
-import type { Food } 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';
@@ -23,23 +23,23 @@ const CartIndex = () => {
const { clearCart, items } = useCart();
const [showClearConfirm, setShowClearConfirm] = React.useState(false);
const [showPagerModal, setShowPagerModal] = React.useState(false);
- const { data: foodsResponse, isFetching } = useGetFoods();
+ const { data: productsResponse, isFetching } = useGetProducts();
const { data: aboutData } = useGetAbout();
const isPremium = aboutData?.data?.plan === 'premium';
- const foods = React.useMemo(() => foodsResponse?.data ?? [], [foodsResponse?.data]);
- const isLoading = isFetching && !foods.length;
+ const products = React.useMemo(() => productsResponse?.data ?? [], [productsResponse?.data]);
+ const isLoading = isFetching && !products.length;
- const cartFoods = React.useMemo(() => {
- if (!foods.length) return [];
+ const cartProducts = React.useMemo(() => {
+ if (!products.length) return [];
return Object.entries(items)
.filter(([, detail]) => detail?.quantity && detail.quantity > 0)
.map(([id]) =>
- foods.find((foodItem) => String(foodItem.id) === String(id))
+ products.find((productItem) => String(productItem.id) === String(id))
)
- .filter((food): food is Food => Boolean(food));
- }, [foods, items]);
+ .filter((product): product is Product => Boolean(product));
+ }, [products, items]);
- const isCartEmpty = cartFoods.length === 0;
+ const isCartEmpty = cartProducts.length === 0;
const handleClearCart = (e: React.MouseEvent) => {
e?.preventDefault();
@@ -126,9 +126,9 @@ const CartIndex = () => {
)}
- {cartFoods.map((food) => (
-