From e90ff42511a174e95d1a567f361bede5be1af581 Mon Sep 17 00:00:00 2001 From: Saurabh Kumar Bajpai <157192462+saurabhhhcodes@users.noreply.github.com> Date: Thu, 4 Jun 2026 16:45:09 +0530 Subject: [PATCH] fix: Isolate orders by signed-in user. --- js/invoice.js | 19 +++++++- js/main.js | 129 ++++++++++++++++++++++---------------------------- 2 files changed, 74 insertions(+), 74 deletions(-) diff --git a/js/invoice.js b/js/invoice.js index 162fdc1..7cd10a7 100644 --- a/js/invoice.js +++ b/js/invoice.js @@ -21,11 +21,28 @@ window.invoiceGenerator = (() => { }); } + function getLoggedInUserEmail() { + try { + const user = JSON.parse(localStorage.getItem('loggedInUser')); + return String(user?.email || "").trim().toLowerCase(); + } catch (error) { + return ""; + } + } + + function isOrderOwnedByCurrentUser(order) { + const activeEmail = getLoggedInUserEmail(); + if (!activeEmail) { + return !order.ownerEmail; + } + return String(order.ownerEmail || "").trim().toLowerCase() === activeEmail; + } + // Retrieve order details from localStorage function getOrderById(orderId) { try { const orders = JSON.parse(localStorage.getItem('chaatOrders')) || []; - return orders.find(o => o.id === orderId); + return orders.find(o => o.id === orderId && isOrderOwnedByCurrentUser(o)); } catch (error) { console.error("Error loading order for invoice:", error); return null; diff --git a/js/main.js b/js/main.js index 0db96c1..6bf79d9 100644 --- a/js/main.js +++ b/js/main.js @@ -1,11 +1,51 @@ // ===== Global State ===== let menuItems = []; let currentCategory = "All"; -let orders = JSON.parse(localStorage.getItem('chaatOrders')) || []; +const ORDER_STORAGE_KEY = 'chaatOrders'; +const SESSION_STORAGE_KEY = 'loggedInUser'; +let orders = readStoredOrders(); // Initialize cart from cart manager (will be set after DOM loads) let cart = []; let loyaltyPointsApplied = false; + +function readStoredOrders() { + try { + return JSON.parse(localStorage.getItem(ORDER_STORAGE_KEY)) || []; + } catch (error) { + console.warn("Failed to parse stored orders:", error); + return []; + } +} + +function getLoggedInUserEmail() { + try { + const user = JSON.parse(localStorage.getItem(SESSION_STORAGE_KEY)); + return String(user?.email || "").trim().toLowerCase(); + } catch (error) { + return ""; + } +} + +function orderBelongsToCurrentUser(order) { + const activeEmail = getLoggedInUserEmail(); + if (!activeEmail) { + return !order.ownerEmail; + } + return String(order.ownerEmail || "").trim().toLowerCase() === activeEmail; +} + +function getCurrentUserOrders() { + return orders.filter(orderBelongsToCurrentUser); +} + +function findCurrentUserOrder(orderId) { + return getCurrentUserOrders().find(order => order.id === orderId); +} + +function persistOrders() { + localStorage.setItem(ORDER_STORAGE_KEY, JSON.stringify(orders)); +} // Will be initialized in setupCartManager() after document loads function setupCartManager() { @@ -710,7 +750,7 @@ function updateOrderStatuses() { let changed = false; const now = Date.now(); - orders.forEach(order => { + getCurrentUserOrders().forEach(order => { if (order.status === "Delivered") return; const elapsedSeconds = (now - order.timestamp) / 1000; @@ -727,7 +767,7 @@ function updateOrderStatuses() { }); if (changed) { - localStorage.setItem('chaatOrders', JSON.stringify(orders)); + persistOrders(); renderOrdersList(); } } @@ -736,7 +776,8 @@ function renderOrdersList() { const container = document.getElementById("orders-container"); if (!container) return; - if (orders.length === 0) { + const visibleOrders = getCurrentUserOrders(); + if (visibleOrders.length === 0) { container.innerHTML = `

No Orders Found

@@ -749,7 +790,7 @@ function renderOrdersList() { container.innerHTML = ""; - orders.forEach(order => { + visibleOrders.forEach(order => { const card = document.createElement("article"); card.className = "order-card"; @@ -903,6 +944,7 @@ window.checkout = async function () { pointsEarned, total: finalTotal, status: "Pending", + ownerEmail: getLoggedInUserEmail(), deliveryAddress: { latitude: validationResult.userLocation.latitude, longitude: validationResult.userLocation.longitude, @@ -913,7 +955,7 @@ window.checkout = async function () { }; orders.unshift(newOrder); - localStorage.setItem('chaatOrders', JSON.stringify(orders)); + persistOrders(); loyaltyPointsApplied = false; activeCoupon = null; @@ -934,7 +976,7 @@ window.checkout = async function () { }; window.reorderOrder = function (orderId) { - const pastOrder = orders.find(o => o.id === orderId); + const pastOrder = findCurrentUserOrder(orderId); if (!pastOrder) return; pastOrder.items.forEach(orderItem => { @@ -1009,7 +1051,6 @@ function removeFromCart(id) { const cartIndex = cart.findIndex(ci => ci.item.id === id); if (cartIndex === -1) return; - const removedItem = cart[cartIndex].item; cartManager.decreaseQuantity(id); const cartItem = cart.find( (ci) => ci.item.id === id @@ -1073,6 +1114,7 @@ window.placeOrderFromCheckout = function (customerDetails, pricingInfo) { pointsRedeemed: pointsRedeemed, pointsEarned: pointsEarned, status: "Pending", + ownerEmail: getLoggedInUserEmail(), customerDetails: { name: customerDetails.name, phone: customerDetails.phone, @@ -1089,7 +1131,7 @@ window.placeOrderFromCheckout = function (customerDetails, pricingInfo) { }; orders.unshift(newOrder); - localStorage.setItem('chaatOrders', JSON.stringify(orders)); + persistOrders(); // Reset points applied state loyaltyPointsApplied = false; @@ -1112,7 +1154,7 @@ window.placeOrderFromCheckout = function (customerDetails, pricingInfo) { window.reorderOrder = function (orderId) { - const pastOrder = orders.find(o => o.id === orderId); + const pastOrder = findCurrentUserOrder(orderId); if (!pastOrder) return; pastOrder.items.forEach(orderItem => { @@ -1122,7 +1164,9 @@ window.reorderOrder = function (orderId) { updateCartCount(); updateFavCount(); renderCart(); - showToast(`🗑️ ${removedItem.name} removed from cart`); + if (typeof showToast === "function") { + showToast("Order items added back to your cart."); + } } // ===== Event Listeners ===== @@ -1236,7 +1280,7 @@ function setupSearchSuggestions() { if (!searchInput.contains(e.target) && !suggestionsContainer.contains(e.target)) { suggestionsContainer.style.display = "none"; } - ); + }); } function setupSearch() { @@ -1536,67 +1580,6 @@ async function init() { window.location.href = `orders.html?delivery=${result.deliveryAvailable}`; } }); - ); - - recognition.onresult = ( - event - ) => { - const transcript = - event.results[0][0].transcript; - - searchInput.value = transcript; - - applyAllFilters(); - - voiceBtn.innerHTML = "🎤"; - - // Bind interactive UI listeners immediately for instant input responsiveness (high INP) - setupCartToggle(); - setupFilterButtons(); - setupCouponListeners(); - setupOrderNowScroll(); - setupSearchSuggestions(); - setupSearch(); - setupAdvancedFilters(); - setupContactForm(); - setupNewsletterForm(); - setupActiveNavbar(); - setupDropdownFilterLinks(); - - if (checkoutBtn) { - checkoutBtn.addEventListener("click", (e) => { - e.preventDefault(); - if (cart.length === 0) { - alert("Your cart is empty!"); - return; - } - window.location.href = "orders.html"; - }); - } - voiceBtn.classList.remove( - "listening" - ); - }; - - recognition.onerror = () => { - voiceBtn.innerHTML = "🎤"; - - voiceBtn.classList.remove( - "listening" - ); - - alert( - "Voice recognition failed." - ); - }; - - recognition.onend = () => { - voiceBtn.innerHTML = "🎤"; - - voiceBtn.classList.remove( - "listening" - ); - }; } // Load menu data, then render