import React, { useRef, useEffect, useState } from "react"; import styles from "./Cart.module.css"; import ItemLister from "../components/ItemLister"; import { ThreeDots, ColorRing } from "react-loader-spinner"; import { useParams } from "react-router-dom"; import { useNavigationHelpers } from "../helpers/navigationHelpers"; import { getTable } from "../helpers/tableHelper.js"; import { getCartDetails } from "../helpers/itemHelper.js"; import { getItemsByCafeId } from "../helpers/cartHelpers"; // Import getItemsByCafeId import Modal from "../components/Modal"; // Import the reusable Modal component export default function Cart({ sendParam, totalItemsCount, deviceType }) { const { shopId, tableId } = useParams(); sendParam({ shopId, tableId }); const { goToShop, goToInvoice } = useNavigationHelpers(shopId, tableId); const [cartItems, setCartItems] = useState([]); const [totalPrice, setTotalPrice] = useState(0); const [orderType, setOrderType] = useState("pickup"); const [tableNumber, setTableNumber] = useState(""); const [loading, setLoading] = useState(true); const [isModalOpen, setIsModalOpen] = useState(false); const [modalContent, setModalContent] = useState(null); const [isCheckoutLoading, setIsCheckoutLoading] = useState(false); // State for checkout button loading animation const [email, setEmail] = useState(""); const textareaRef = useRef(null); useEffect(() => { const fetchCartItems = async () => { try { setLoading(true); const items = await getCartDetails(shopId); setLoading(false); if (items) setCartItems(items); const initialTotalPrice = items.reduce((total, itemType) => { return ( total + itemType.itemList.reduce((subtotal, item) => { return subtotal + item.qty * item.price; }, 0) ); }, 0); setTotalPrice(initialTotalPrice); } catch (error) { console.error("Error fetching cart items:", error); } }; fetchCartItems(); const textarea = textareaRef.current; if (textarea) { const handleResize = () => { textarea.style.height = "auto"; textarea.style.height = `${textarea.scrollHeight}px`; }; textarea.addEventListener("input", handleResize); handleResize(); return () => textarea.removeEventListener("input", handleResize); } }, [shopId]); const refreshTotal = async () => { try { const items = await getItemsByCafeId(shopId); const updatedTotalPrice = items.reduce((total, localItem) => { const cartItem = cartItems.find((itemType) => itemType.itemList.some((item) => item.itemId === localItem.itemId), ); if (cartItem) { const itemDetails = cartItem.itemList.find( (item) => item.itemId === localItem.itemId, ); return total + localItem.qty * itemDetails.price; } return total; }, 0); setTotalPrice(updatedTotalPrice); } catch (error) { console.error("Error refreshing total price:", error); } }; const handleOrderTypeChange = (event) => { setOrderType(event.target.value); }; const handleTableNumberChange = (event) => { setTableNumber(event.target.value); }; const handleEmailChange = (event) => { setEmail(event.target.value); }; const handlCloseModal = () => { setIsModalOpen(false); setIsCheckoutLoading(false); }; const isValidEmail = (email) => { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); }; const handleCheckout = async () => { setIsCheckoutLoading(true); // Start loading animation if (email != "" && !isValidEmail(email)) { setModalContent(
Please enter a valid email address.
); setIsModalOpen(true); setIsCheckoutLoading(false); // Stop loading animation return; } if (orderType === "serve") { if (tableNumber !== "") { const table = await getTable(shopId, tableNumber); if (!table) { setModalContent(
Table not found. Please enter a valid table number.
, ); setIsModalOpen(true); } else { goToInvoice(orderType, tableNumber, email); } } else { setModalContent(
Please enter a table number.
); setIsModalOpen(true); } } else { goToInvoice(orderType, tableNumber, email); } setIsCheckoutLoading(false); // Stop loading animation }; if (loading) return (
); else return (

{totalItemsCount} {totalItemsCount !== 1 ? "items" : "item"} in Cart

{cartItems.map((itemType) => ( ))} {deviceType != "guestDevice" && (
)}
Order Type: {orderType === "serve" && tableId == null && ( )}
Note