import { ShoppingCartOutlined } from "@ant-design/icons"; import { Button, Form, message, Row } from "antd"; import { addItem } from "features/order/orderSlice"; import useBreakPoint from "hooks/useBreakPoint"; import { useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { useAppDispatch, useAppSelector } from "redux/hooks"; import { colors, ProBlack2 } from "ThemeConstants"; import { Extra, Product, Variant } from "utils/types/appTypes"; import styles from "../product.module.css"; import { useGetRestaurantDetailsQuery } from "redux/api/others"; import { useParams } from "react-router-dom"; import TextArea from "antd/es/input/TextArea"; import ProText from "components/ProText"; import ActionsButtons from "./ActionsButtons/ActionsButtons"; export default function ProductFooter({ product, isValid = true, selectedExtras, selectedVariant, selectedGroups, quantity, onClose, setQuantity, }: { product: Product; isValid?: boolean; selectedExtras: Extra[]; selectedVariant?: Variant; selectedGroups: Record; quantity: number; onClose?: () => void; setQuantity: (quantity: number) => void; }) { const { t } = useTranslation(); const dispatch = useAppDispatch(); const { themeName } = useAppSelector((state) => state.theme); const { isMobile, isDesktop } = useBreakPoint(); const { isRTL } = useAppSelector((state) => state.locale); const [specialRequest, setSpecialRequest] = useState(""); const { subdomain } = useParams(); const { data: restaurant } = useGetRestaurantDetailsQuery(subdomain, { skip: !subdomain, }); // Check if product has any customization options const hasCustomizationOptions = useMemo(() => { const hasVariants = product?.variants?.length > 0; const hasExtras = product.extras.length > 0; const hasExtraGroups = product?.theExtrasGroups?.length > 0; return hasVariants || hasExtras || hasExtraGroups; }, [ product?.variants?.length, product.extras.length, product?.theExtrasGroups?.length, ]); const isBottomSheetView = useMemo(() => { return window.location.href.includes("menu"); }, []); const handleAddToCart = () => { if (restaurant && !restaurant.isOpened) { message.warning(t("menu.restaurantIsClosed")); return; } if (!isValid) { message.error(t("menu.pleaseSelectRequiredOptions")); return; } if (product) { dispatch( addItem({ item: { id: product?.id, name: product?.name, price: (selectedVariant?.price || product?.price) + selectedExtras.reduce((acc, extra) => acc + extra.price, 0), // selectedGroups.reduce((acc, extra) => acc + extra.price, 0), image: product?.image, description: product?.description, comment: specialRequest, variant: selectedVariant, extras: selectedExtras, extrasgroupnew: Object.keys(selectedGroups).map((key) => ({ groupid: key, extrasid: selectedGroups[Number(key)], })), extrasgroup: Object.entries(selectedGroups).flatMap( ([groupId, extrasIds]) => { if (!extrasIds || extrasIds.length === 0) { return []; } const groupInfo = product.theExtrasGroups?.find( (g) => g.id.toString() === groupId, ); const groupName = groupInfo?.name ?? `Group${groupId}`; const [firstExtra, ...remainingExtras] = extrasIds; const remainingSuffix = remainingExtras.length > 0 ? `,${remainingExtras.join(",")}` : ""; return [ `${groupName}_${firstExtra}_${groupId}${remainingSuffix}`, `${groupName}_${extrasIds.join(",")}`, ]; }, ), isHasLoyalty: product?.isHasLoyalty, no_of_stamps_give: product?.no_of_stamps_give, }, quantity: quantity, }), ); // Navigate back to menu - scroll position will be restored automatically if (!isDesktop && !isBottomSheetView ) window.history.back(); else { onClose?.(); } } }; return ( <>
{t("cart.specialRequest")}