"use client" import React, { Suspense, useEffect, useState } from "react"; import { useParams, useSearchParams } from "next/navigation"; import Link from "next/link"; import MasterLayout from "@/masterLayout/MasterLayout"; import client from "../../../../Auth"; import { gradientClasses } from "../../../../utils/constant.utils"; import { Icon } from "@iconify/react"; import PageLoader from "@/components/common-component/PageLoader"; import PageNoData from "@/components/common-component/PageNoData"; import Breadcrumb from "@/components/Breadcrumb"; const MenuItemsCategoryInner = () => { const params = useParams(); // const menuName = params.name; const searchParams = useSearchParams(); const tableName = searchParams.get('table'); const seats = searchParams.get('seats'); const time = searchParams.get('time'); const menuName = searchParams.get('menuname'); const [menuData, setMenuData] = useState(null); const [menuItems, setMenuItems] = useState(null); // const [sections, setSections] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [activeCategory, setActiveCategory] = useState(null); const [cart, setCart] = useState([]); const [showOrderModal, setShowOrderModal] = useState(false); const [orderStatus, setOrderStatus] = useState('pending'); const HST_TAX_RATE = 0.13; // 13% HST tax rate const [catMenu, setCatMenu] = useState(null); const [catMenuActive, setCatMenuActive] = useState(null) const [selectedItem, setSelectedItem] = useState(null); const [showItemModal, setShowItemModal] = useState(false); const [selectedExtras, setSelectedExtras] = useState([]); const [selectedDrink, setSelectedDrink] = useState(null); const [orderItems, setOrderItems] = useState([]) useEffect(() => { getMenuItem(); }, []); const getMenuItem = async () => { try { const res = await client?.get(`/Dine360 Menu?fields=["*"]&limit_page_length=100`); setCatMenu(res?.data?.data || []); setCatMenuActive(res?.data?.data[0]?.name || []) } catch (error) { console.error("Error fetching menu list:", error); } }; useEffect(() => { if (catMenu?.length > 0) { getMenuItems(catMenu[0]?.menuname); // auto-load first menu's categories } }, [catMenu]); useEffect(() => { if (menuData?.length > 0) { getMenuFoodItems(menuData[0]); setActiveCategory(menuData[0]?.name); } }, [menuData]); const getMenuItems = async (menuname) => { try { setLoading(true); setError(null); const menuRes = await client.get( `/Dine360%20Menu%20Category%20Link?fields=["*"]&limit_page_length=100&filters=[["menu","=","${menuname}"]]` ); const menuLinks = menuRes?.data?.data || []; const menuCategoryPromises = menuLinks.map(async (menuItem) => { const res = await client.get( `/Dine360%20Menu%20Category?fields=["*"]&limit_page_length=100&filters=[["name","=","${menuItem.menucategory}"]]` ); return res?.data?.data?.[0] || null; }); const categories = await Promise.all(menuCategoryPromises); const validCategories = categories.filter(Boolean); setMenuData(validCategories); } catch (error) { console.error("Error fetching menu categories:", error); setError(error?.message || "Failed to fetch menu categories"); } finally { setLoading(false); } }; const getMenuFoodItems = async (category) => { if (!category?.name) return; try { const res = await client.get( `/Dine360%20Menu%20Category/${category.name}?fields=["*"]&limit_page_length=100` ); setMenuItems(res?.data?.data || []); } catch (error) { console.error("Error fetching menu items:", error); } }; // Fetch sides linked to a specific food item const getLinkedSides = async (foodItemName) => { try { const res = await client.get( `/Dine360 FoodItem Sides Link?fields=["*"]&filters=[["menuitemname","=","${foodItemName}"]]` ); return res.data.data; // Sides linked to this menu item } catch (error) { console.error(`Error fetching linked sides for item: ${foodItemName}`, error); return []; } }; // Fetch and group all sides by their category const getAllSidesGroupedByCategory = async (foodItemName) => { try { const res = await client.get(`/Dine360 FoodItem Sides Link?fields=["*"]&filters=[["menuitemname","=","${foodItemName}"]]`); console.log("Grouped Sides:", res.data.data); const SliderLink = res?.data?.data || []; const SidesList = SliderLink.map(async (sideItem) => { const res = await client.get( `/Dine360 Food Sides?fields=["*"]&filters=[["name","=","${sideItem.menucategory}"]]` ); return res?.data?.data?.[0] || null; }); const categories = await Promise.all(SidesList); const validSides = categories.filter(Boolean); console.log("validSides", validSides) } catch (err) { console.error("Error fetching grouped sides:", err); return []; } }; const handleAddToOrder = () => { const cartItem = cart.find(item => item.name === selectedItem.name); if (!cartItem) { alert("Please add the item to cart before adding to order."); return; } setOrderItems(cart); setShowItemModal(false); }; // For user clicking category from catMenu const handleCatMenuClick = async (menuname) => { await getMenuItems(menuname); setCatMenuActive(menuname) }; // For user clicking individual menu category const handleMenuClick = async (menu) => { try { const res = await client.get( `/Dine360%20Menu%20Category/${menu.name}?fields=["*"]&limit_page_length=100` ); setMenuItems(res?.data?.data || []); setActiveCategory(menu?.name); } catch (error) { console.error("Error fetching menu data:", error); setError(error?.message || "Failed to fetch menu data"); } }; console.log("menuItems", menuItems); const addToCart = (item) => { const existingItem = cart.find(cartItem => cartItem.name === item.name); if (existingItem) { setCart(cart.map(cartItem => cartItem.name === item.name ? { ...cartItem, quantity: cartItem.quantity + 1 } : cartItem )); } else { setCart([...cart, { ...item, quantity: 1 }]); } }; const removeFromCart = (itemName) => { setCart(prev => prev.filter(item => item.name !== itemName)); setOrderItems(prev => prev.filter(item => item.name !== itemName)); }; const updateQuantity = (itemName, newQuantity) => { if (newQuantity < 1) { removeItem(itemName); return; } // Update cart setCart(prev => prev.map(item => item.name === itemName ? { ...item, quantity: newQuantity } : item ) ); // Update orderItems setOrderItems(prev => prev.map(item => item.name === itemName ? { ...item, quantity: newQuantity } : item ) ); }; const calculateSubtotal = () => { return cart.reduce((total, item) => total + (item.price * item.quantity), 0); }; const calculateTax = () => { return calculateSubtotal() * HST_TAX_RATE; }; const calculateTotal = () => { return calculateSubtotal() + calculateTax(); }; const handlePlaceOrder = () => { setShowOrderModal(true); }; // Toggle extras like checkbox buttons const toggleExtra = (extra) => { setSelectedExtras(prev => prev.includes(extra) ? prev.filter(item => item !== extra) : [...prev, extra] ); }; // Select one drink at a time const selectDrink = (drink) => { setSelectedDrink(drink === selectedDrink ? null : drink); }; const confirmOrder = async () => { // Get current time in YYYY-MM-DD HH:mm:ss format (Canada Eastern Time) const now = new Date(); const year = now.getFullYear(); const month = String(now.getMonth() + 1).padStart(2, '0'); // month is 0-based const day = String(now.getDate()).padStart(2, '0'); const hour = String(now.getHours()).padStart(2, '0'); const minute = String(now.getMinutes()).padStart(2, '0'); const second = String(now.getSeconds()).padStart(2, '0'); const orderStartTime = `${year}-${month}-${day} ${hour}:${minute}:${second}`; console.log(orderStartTime); // Prepare formatted order data const formattedOrder = orderItems.map((item) => ({ menuitem: item.name, quantity: item.quantity, rate: item.price, amount: item.price * item.quantity, menu: menuName, menucategory: item.parent, status: "Avaialble" })); const Body = { customer: "kadeeja", ordertaker: "surya", phone: "+91-8220348218", table: tableName, partysize: seats, orderstatus: "Cooking", tableoccupiedtime: time, orderstarttime: orderStartTime, // dynamically set here orderendtime: null, // optional: update later durationintable: null, orderamount: calculateSubtotal().toFixed(2), hstpercentage: 13, hstamount: calculateTax().toFixed(2), totalamount: calculateTotal().toFixed(2), orderinstructions: null, order_items: formattedOrder }; console.log("Body", Body); try { const res = await client.post('/Dine360 Order', Body, { headers: { 'Content-Type': 'application/json' } }); } catch (error) { console.log("error", error) } // Clear and reset alert('Order placed successfully!'); setCart([]); setShowOrderModal(false); setOrderStatus('pending'); }; const renderMenuItem = (menu) => { console.log("menu", menu) const cartItem = cart.find(item => item.name === menu.name); const isInCart = !!cartItem; return (
{ setSelectedItem(menu); getAllSidesGroupedByCategory(menu?.name) setShowItemModal(true); }} >
{/*
*/}
{menu.menuitemname}
{menu.parent}
${menu.price.toFixed(2)}
{/* {isInCart ? (
{cartItem.quantity}
) : ( )} */}
); }; const cartItem = cart.find(item => item.name === selectedItem.name); const isInCart = !!cartItem; const quantity = cartItem?.quantity || 1; console.log("catMenuActive", catMenuActive) console.log("cartItem?.quantity", cartItem) return ( <>
{ loading ? ( ) : menuData?.length == 0 ? ( ) : (
{/* Menu Category - Always col-xxl-2 */}
    {catMenu.map((menu) => (
  • handleCatMenuClick(menu?.name)} style={{ cursor: "pointer" }} > all menu {menu?.menuname}
  • ))}
{/* Menu Items - col-xxl-10 if cart is empty, else col-xxl-7 */}
    {menuData.map((menu) => (
  • handleMenuClick(menu)} style={{ cursor: "pointer" }} > all menu {menu?.menucategoryname}
  • ))}
{menuItems?.menuitems_child?.map(renderMenuItem)}
{/* Cart - Show only if cart has items */} {/* {cart.length > 0 && ( */}
POS Dine-in
  • Contact Number
    Show
  • Customer Info
    Show
{orderItems.length === 0 ? (

Your cart is empty.

) : ( <> {orderItems.map((item) => (
{item.menuitemname}
{item.menuitemname}

${item.price.toFixed(2)}

{item.quantity}
))}
)}
{/* )} */}
) }
{showItemModal && selectedItem && ( <>
setShowItemModal(false)} />
{selectedItem.menuitemname}
{/* Col 1 - Image */}
{selectedItem.menuitemname}
{/* Col 2 - Size + Quantity */}
Choose Size
Quantity
{isInCart ? (
{cartItem.quantity}
) : ( )}
{/* Col 3 - Extras */} {/* Col 3 - Extras + Order Button + Total */}
Add Extras
Drinks
Total: $12.99
{/*
*/}
)} {/* Order Confirmation Modal */} { showOrderModal && ( <>
setShowOrderModal(false)} />
Confirm Your Order

Order Items:

{cart.map((item) => (
{item.name}
{item.menuitemname}

Quantity: {item.quantity}

${(item.price * item.quantity).toFixed(2)}

${item.price.toFixed(2)} each

))}
Subtotal: ${calculateSubtotal().toFixed(2)}
HST Tax (13%): ${calculateTax().toFixed(2)}
Total: ${calculateTotal().toFixed(2)}
) } ); }; const MenuItemsCategory = (() => { return ( }> ) }) export default MenuItemsCategory;