diff --git a/src/app/[name]/(Dialogs)/cart/page.tsx b/src/app/[name]/(Dialogs)/cart/page.tsx index 1bc88b7..edd5bb9 100644 --- a/src/app/[name]/(Dialogs)/cart/page.tsx +++ b/src/app/[name]/(Dialogs)/cart/page.tsx @@ -1,131 +1,135 @@ 'use client'; import Button from '@/components/button/PrimaryButton'; +import MenuItem from '@/components/listview/MenuItem'; +import MenuItemRenderer from '@/components/listview/MenuItemRenderer'; import { useReceiptStore } from '@/zustand/receiptStore'; -import { motion } from 'framer-motion'; -import { ArrowLeft, Trash } from 'iconsax-react'; -import { PlusIcon, MinusIcon } from 'lucide-react'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; -import React from 'react' +import React from 'react'; import { useTranslation } from 'react-i18next'; +import { Add, ArrowLeft, Minus, Trash } from 'iconsax-react'; +import { useGetFoods } from '@/app/[name]/(Main)/hooks/useMenuData'; +import type { Food } from '@/app/[name]/(Main)/types/Types'; -type Props = object - -const CartIndex = ({ }: Props) => { - const { t } = useTranslation('parallels', { - keyPrefix: 'Cart' - }); +const CartIndex = () => { + const { data: foodsResponse, isFetching } = useGetFoods(); + const foods = React.useMemo(() => foodsResponse?.data ?? [], [foodsResponse?.data]); + const { t } = useTranslation('parallels', { keyPrefix: 'Cart' }); const router = useRouter(); - const quantity = useReceiptStore(state => state.items[0]?.quantity || 0); - const increment = useReceiptStore(state => state.increment); - const decrement = useReceiptStore(state => state.decrement); + const receiptItems = useReceiptStore((state) => state.items); + const clear = useReceiptStore((state) => state.clear); + const cartFoods = React.useMemo(() => { + if (!foods.length) return []; + return Object.entries(receiptItems) + .filter(([, detail]) => detail?.quantity) + .map(([id]) => + foods.find((foodItem) => String(foodItem.id) === String(id)) + ) + .filter((food): food is Food => Boolean(food)); + }, [foods, receiptItems]); + + const totalPrice = React.useMemo(() => { + return cartFoods.reduce((sum, food) => { + const qty = receiptItems[String(food.id)]?.quantity ?? 0; + return sum + (food.price ?? 0) * qty; + }, 0); + }, [cartFoods, receiptItems]); + + const isCartEmpty = cartFoods.length === 0; + const formatPrice = React.useCallback( + (value: number) => value.toLocaleString('fa-IR'), + [] + ); return (
-
+
{ router.back() }} + onClick={clear} /> -

{t("Heading")}

+

{t('Heading')}

{ router.back() }} + onClick={() => router.back()} />
-
- -
    -
  • -
    -
    کباب چوبی ژیوان (سیخ چوبی)
    -
    69.000 T
    +
    +
    + {isFetching && !foods.length ? ( +
    + +

    {t('LoadingCart', { defaultValue: 'در حال دریافت سبد خرید...' })}

    -
    - - {quantity <= 0 ? ( - - ) : ( - <> - - - {quantity} - - - - )} - + ) : isCartEmpty ? ( +
    +

    {t('EmptyStateTitle', { defaultValue: 'سبد خرید شما خالی است' })}

    +

    + {t('EmptyStateDescription', { + defaultValue: 'برای افزودن غذا، به منوی رستوران برگردید.', + })} +

    -
    - -
  • -
+ ) : ( + cartFoods.map((food) => ( + + + + )) + )} +
-

- {t('InputDescription.Label')} -

+

{t('InputDescription.Label')}

- - - +
-
-
-
{t('SumOfItemsLabel')}
-
{t('SumOfItemsValue').replace('{price}', '560.000')}
+
+
+
+ {`جمع خرید: ${formatPrice(totalPrice)} تومان`} +
- + href={'order/checkout/0'} + onClick={(event) => { + if (isCartEmpty) { + event.preventDefault(); + } + }} + className={isCartEmpty ? 'pointer-events-none opacity-60' : ''} + > +
+ + {!isCartEmpty && ( +
+ {t('CartControlsHint', { defaultValue: 'برای ویرایش تعداد، از دکمه‌های هر آیتم استفاده کنید.' })} +
+ + +
+
+ )}
-
- ) -} + ); +}; -export default CartIndex \ No newline at end of file +export default CartIndex; \ No newline at end of file