From a6d2009da7c3f25eb1593aef4711111b08efdbf8 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 12 Feb 2026 21:56:10 +0530 Subject: [PATCH] Used useBooking Context in services.jsx --- backend/src/models/appointment.model.js | 2 +- frontend/src/components/ui/Loader.jsx | 2 +- frontend/src/pages/Services.jsx | 169 +++++++++++++----------- frontend/src/pages/Shop.jsx | 29 ++-- 4 files changed, 114 insertions(+), 88 deletions(-) diff --git a/backend/src/models/appointment.model.js b/backend/src/models/appointment.model.js index e30b3db..389d519 100644 --- a/backend/src/models/appointment.model.js +++ b/backend/src/models/appointment.model.js @@ -14,7 +14,7 @@ const appointmentSchema = new mongoose.Schema({ ], products: [{ type: mongoose.Schema.Types.ObjectId, ref: "Product" }], staff: { type: mongoose.Schema.Types.ObjectId, ref: "Staff" }, - date: { type: String, required: true }, // Format: YYYY-MM-DD + date: { type: Date, required: true }, // Format: YYYY-MM-DD timeSlot: { type: String, required: true }, // Format: "10:00 AM" totalAmount: { type: Number, required: true }, // Server-Calculated paymentStatus: {type: String, enum: ["pending", "paid", "refunded"], default: "pending"}, diff --git a/frontend/src/components/ui/Loader.jsx b/frontend/src/components/ui/Loader.jsx index 4671f12..59e4f86 100644 --- a/frontend/src/components/ui/Loader.jsx +++ b/frontend/src/components/ui/Loader.jsx @@ -1,5 +1,5 @@ import { useState, useEffect } from "react"; -import { motion,AnimatePresence } from "framer-motion"; +import { motion , AnimatePresence } from "framer-motion"; import hairImg from "../../assets/hair_service.png"; import blowDryImg from "../../assets/blowout_service.png"; diff --git a/frontend/src/pages/Services.jsx b/frontend/src/pages/Services.jsx index 16611ff..1947063 100644 --- a/frontend/src/pages/Services.jsx +++ b/frontend/src/pages/Services.jsx @@ -2,19 +2,16 @@ import { useState, useEffect } from "react"; import { Check, Plus, Loader2 } from "lucide-react"; import Navbar from "../components/layout/Navbar"; import BookingModal from "../components/booking/BookingModal"; -import waxImage from "../assets/wax_service.png"; -import facialImage from "../assets/facial_service.png"; import api from "../../utils/api.js"; import { useNavigate } from "react-router-dom"; import { useBooking } from "../context/BookingContext"; const ServicesFull = () => { + const { cart, addToCart, removeFromCart, activeBooking } = useBooking(); const [activeCategory, setActiveCategory] = useState(""); - const [selectedServices, setSelectedServices] = useState([]); const [isBookingOpen, setIsBookingOpen] = useState(false); - const { activeBooking } = useBooking(); const navigate = useNavigate(); const [categoryImages, setCategoryImages] = useState({}); @@ -153,24 +150,23 @@ const ServicesFull = () => { // Toggle Service Selection const toggleService = (item, variant = null, priceOverride = null) => { const itemName = variant ? `${item.name} (${variant})` : item.name; + // const serviceId = item._id || item.id; - if (selectedServices.some((s) => s.name === itemName)) { - setSelectedServices(selectedServices.filter((s) => s.name !== itemName)); + if (cart.services.some((s) => s.name === itemName)) { + const itemToRemove = cart.services.find(s => s.name === itemName); + removeFromCart(itemToRemove._id || itemToRemove.id, "service"); } else { - setSelectedServices([ - ...selectedServices, - { - ...item, - name: itemName, - price: priceOverride || item.price, - }, - ]); + addToCart({ + ...item, + name: itemName, + price: priceOverride || item.price, + }, "service"); } }; const isSelected = (item, variant = null) => { const itemName = variant ? `${item.name} (${variant})` : item.name; - return selectedServices.some((s) => s.name === itemName); + return cart.services.some((s) => s.name === itemName); }; if (loading) { @@ -208,34 +204,43 @@ const ServicesFull = () => { setIsBookingOpen(false)} - selectedServices={selectedServices} + selectedServices={cart.services} + selectedProducts={cart.products} /> {/* Floating Action Bar */}
0 ? "translate-y-0" : "translate-y-full"}`} + className={`fixed bottom-0 left-0 right-0 z-40 bg-white border-t border-brown-900/10 p-4 md:p-6 shadow-[0_-10px_40px_-10px_rgba(0,0,0,0.1)] transition-transform duration-500 ease-in-out ${cart.services.length > 0 || cart.products.length > 0 ? "translate-y-0" : "translate-y-full"}`} >
- Your Selection + Your Selection ({cart.services.length + cart.products.length})
- {selectedServices.map((s, i) => ( + {cart.services.map((s, i) => ( {s.name} ))} + {cart.products.map((p, i) => ( + + {p.name} + + ))}
- {selectedServices.length} Services Selected + {cart.services.length + cart.products.length} Services Selected
@@ -334,10 +341,11 @@ const ServicesFull = () => { {item.price && item.price.includes("/") ? (
{/* Default Content: 'Add' */}
{ ); }} className={`flex-1 h-full flex items-center justify-center transition-colors hover:bg-brown-100 - ${isSelected( - item, - "M", - ) - ? "bg-brown-900 text-white hover:bg-brown-800" - : "bg-white text-brown-900" - }`} + ${ + isSelected( + item, + "M", + ) + ? "bg-brown-900 text-white hover:bg-brown-800" + : "bg-white text-brown-900" + }`} > M{" "} {isSelected(item, "M") && ( @@ -388,13 +397,14 @@ const ServicesFull = () => { ); }} className={`flex-1 h-full flex items-center justify-center transition-colors hover:bg-brown-100 - ${isSelected( - item, - "F", - ) - ? "bg-brown-900 text-white hover:bg-brown-800" - : "bg-white text-brown-900" - }`} + ${ + isSelected( + item, + "F", + ) + ? "bg-brown-900 text-white hover:bg-brown-800" + : "bg-white text-brown-900" + }`} > F{" "} {isSelected(item, "F") && ( @@ -407,12 +417,13 @@ const ServicesFull = () => { @@ -135,7 +140,10 @@ const Shop = () => { /> {/* Quick Add Button or Badge */}
-
@@ -157,10 +165,11 @@ const Shop = () => {

0 + className={`px-3 py-1 rounded-full text-[10px] font-bold uppercase tracking-wider ${ + product.stock > 0 ? "bg-brown-50 text-brown-800 border border-brown-100" : "bg-red-50 text-red-800 border border-red-100" - }`} + }`} > {product.stock > 0 ? "In Stock" : "Sold Out"} @@ -175,7 +184,9 @@ const Shop = () => {

- {products.length === 0 ? "Collection Coming Soon" : "No matches found"} + {products.length === 0 + ? "Collection Coming Soon" + : "No matches found"}

{products.length === 0