import React, { useRef, useEffect, useState } from "react"; import styles from "./Invoice.module.css"; import { useParams } from "react-router-dom"; // Changed from useSearchParams to useLocation import { ThreeDots, ColorRing } from "react-loader-spinner"; import ItemLister from "../components/ItemLister"; import { getCartDetails } from "../helpers/itemHelper"; import { handlePaymentFromClerk, handlePaymentFromGuestSide, handlePaymentFromGuestDevice, } from "../helpers/transactionHelpers"; import { getItemsByCafeId } from "../helpers/cartHelpers.js"; export default function Invoice({ table, sendParam, deviceType, socket }) { const { shopId, tableCode } = useParams(); sendParam({ shopId, tableCode }); const [cartItems, setCartItems] = useState([]); const [totalPrice, setTotalPrice] = useState(0); const [isPaymentLoading, setIsPaymentLoading] = useState(false); // State for payment button loading animation const textareaRef = useRef(null); const [orderType, setOrderType] = useState("pickup"); const [orderMethod, setOrderMethod] = useState("cash"); const [tableNumber, setTableNumber] = useState(""); const [email, setEmail] = useState(""); useEffect(() => { const fetchCartItems = async () => { try { const items = await getCartDetails(shopId); console.log(items); // Filter out unavailable items const filteredItems = items .map((itemType) => ({ ...itemType, itemList: itemType.itemList.filter((item) => item.availability), })) .filter((itemType) => itemType.itemList.length > 0); // Remove empty itemTypes setCartItems(filteredItems); console.log(filteredItems) // Update local storage by removing unavailable items const updatedLocalStorage = JSON.parse(localStorage.getItem("cart")) || []; const newLocalStorage = updatedLocalStorage.map((cafe) => { if (cafe.cafeId === shopId) { return { ...cafe, items: cafe.items.filter((item) => filteredItems.some((filtered) => filtered.itemList.some( (i) => i.itemId === item.itemId && i.availability ) ) ), }; } return cafe; }); localStorage.setItem("cart", JSON.stringify(newLocalStorage)); window.dispatchEvent(new Event("localStorageUpdated")); // Calculate total price based on filtered cart items const totalPrice = filteredItems.reduce((total, itemType) => { return ( total + itemType.itemList.reduce((subtotal, item) => { return subtotal + item.qty * item.price; }, 0) ); }, 0); setTotalPrice(totalPrice); } catch (error) { console.error("Error fetching cart items:", error); // Handle error if needed } }; fetchCartItems(); }, [shopId]); const handlePay = async (isCash) => { setIsPaymentLoading(true); console.log("tipe" + deviceType); if (deviceType == "clerk") { const pay = await handlePaymentFromClerk( shopId, email, isCash ? "cash" : "cashless", orderType, tableNumber ); } else if (deviceType == "guestSide") { const pay = await handlePaymentFromGuestSide( shopId, email, isCash ? "cash" : "cashless", orderType, tableNumber ); } else if (deviceType == "guestDevice") { const socketId = socket.id; const pay = await handlePaymentFromGuestDevice( shopId, isCash ? "cash" : "cashless", orderType, table.tableNo || tableNumber, textareaRef.current.value, socketId ); } console.log("transaction from " + deviceType + "success"); setIsPaymentLoading(false); }; useEffect(() => { const textarea = textareaRef.current; if (textarea) { const handleResize = () => { textarea.style.height = "auto"; textarea.style.height = `${textarea.scrollHeight}px`; }; handleResize(); // Initial resize textarea.addEventListener("input", handleResize); return () => textarea.removeEventListener("input", handleResize); } }, [textareaRef.current]); useEffect(() => { if (table?.tableId != undefined) setOrderType("serve"); console.log(table); }, [table]); useEffect(() => { console.log(localStorage.getItem('cart')) console.log(cartItems) if(localStorage.getItem('cart') == "[]") return; // Parse the local storage cart const localStorageCart = JSON.parse(localStorage.getItem('cart')); console.log(localStorageCart) // Create a set of itemIds from the local storage cart for quick lookup const localStorageItemIds = new Set(localStorageCart[0].items.map(item => item.itemId)); // Filter out items from cartItems that do not exist in the local storage cart const updatedCartItems = cartItems.map(itemType => ({ ...itemType, itemList: itemType.itemList.filter(item => localStorageItemIds.has(item.itemId)) })); setCartItems(updatedCartItems); const totalPrice = updatedCartItems.reduce((total, itemType) => { return ( total + itemType.itemList.reduce((subtotal, item) => { return subtotal + item.qty * item.price; }, 0) ); }, 0); setTotalPrice(totalPrice); }, [localStorage.getItem('cart')]); const handleOrderTypeChange = (event) => { setOrderType(event.target.value); }; const handleOrderMethodChange = (event) => { setOrderMethod(event.target.value); }; const handleTableNumberChange = (event) => { setTableNumber(event.target.value); }; const handleEmailChange = (event) => { setEmail(event.target.value); }; return (
0 ? '': 'calc(100vh - 75px)'), minHeight: (getItemsByCafeId(shopId).length > 0 ? 'calc(100vh - 210px)': '') }}>

Keranjang

{getItemsByCafeId(shopId) < 1 ?

Tidak ada item di keranjang

: <>
{cartItems.map((itemType) => ( ))} {table.tableNo != null && (
Diantar ke meja {table.tableNo} {/* */}
)} {orderType === "serve" && table.length < 1 && (
Serve to:
)}
Catatan :