import { PlusOutlined } from "@ant-design/icons"; import ArabicPrice from "components/ArabicPrice"; import BackIcon from "components/Icons/BackIcon"; import NextIcon from "components/Icons/NextIcon"; import ImageWithFallback from "components/ImageWithFallback"; import ProText from "components/ProText.tsx"; import { menuItems } from "data/menuItems.ts"; import { addItem } from "features/order/orderSlice.ts"; import useBreakPoint from "hooks/useBreakPoint"; import { useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { useAppDispatch, useAppSelector } from "redux/hooks.ts"; import { default_image } from "utils/constants.ts"; import { Product } from "utils/types/appTypes.ts"; import styles from "./YouMayAlsoLike.module.css"; import ProInputCard from "components/ProInputCard/ProInputCard"; export default function YouMightAlsoLike() { const { t } = useTranslation(); const dispatch = useAppDispatch(); const { isRTL } = useAppSelector((state) => state.locale); const { isMobile, isTablet, isDesktop } = useBreakPoint(); const [currentIndex, setCurrentIndex] = useState(0); const containerRef = useRef(null); // Check if scrolling is needed based on container width const [containerWidth, setContainerWidth] = useState(0); useEffect(() => { const updateContainerWidth = () => { if (containerRef.current) { setContainerWidth(containerRef.current.offsetWidth); } }; updateContainerWidth(); window.addEventListener("resize", updateContainerWidth); return () => window.removeEventListener("resize", updateContainerWidth); }, []); // Calculate actual visible items based on container width const itemWidth = isMobile ? 95 + 16 : isTablet ? 120 + 16 : 140 + 16; const totalItemsWidth = menuItems.length * itemWidth; const needsScrolling = totalItemsWidth > containerWidth; const canNavigateLeft = currentIndex > 0; const canNavigateRight = needsScrolling && currentIndex * itemWidth + containerWidth < totalItemsWidth; const scrollToIndex = (index: number) => { if (containerRef.current) { const scrollLeft = isRTL ? -(index * itemWidth) : index * itemWidth; containerRef.current.scrollTo({ left: scrollLeft, behavior: "smooth", }); } }; const handlePrevious = () => { if (canNavigateLeft) { const newIndex = Math.max(0, currentIndex - 1); setCurrentIndex(newIndex); scrollToIndex(newIndex); } }; const handleNext = () => { if (canNavigateRight) { const maxPossibleIndex = Math.floor( (totalItemsWidth - containerWidth) / itemWidth, ); const newIndex = Math.min(maxPossibleIndex, currentIndex + 1); setCurrentIndex(newIndex); scrollToIndex(newIndex); } }; // RTL-specific handlers const handleRTLPrevious = () => { if (canNavigateRight) { const maxPossibleIndex = Math.floor( (totalItemsWidth - containerWidth) / itemWidth, ); const newIndex = Math.min(maxPossibleIndex, currentIndex + 1); setCurrentIndex(newIndex); scrollToIndex(newIndex); } }; const handleRTLNext = () => { if (canNavigateLeft) { const newIndex = Math.max(0, currentIndex - 1); setCurrentIndex(newIndex); scrollToIndex(newIndex); } }; const handleQuickAdd = (item: Product) => { dispatch( addItem({ item: { id: Number(item.id), name: item.name, price: item.price, image: item.image, description: item.description, variant: "None", isHasLoyalty: item.isHasLoyalty, no_of_stamps_give: item.no_of_stamps_give, }, quantity: 1, }), ); }; return ( <>
{/* Left Arrow - Tablet and Desktop only */} {(isTablet || isDesktop) && ( )} {/* Right Arrow - Tablet and Desktop only */} {(isTablet || isDesktop) && ( )}
{menuItems.map((item: Product) => (
{ e.stopPropagation(); handleQuickAdd(item); }} style={{ color: "#302E3E", fontSize: isMobile ? 14 : 16, }} />
{item.name}
))}
); }