From 2cf948624ce680a0d8f9b23cf11e9c43249ce403 Mon Sep 17 00:00:00 2001 From: jyoti yadav Date: Mon, 29 Jun 2026 21:05:01 +0530 Subject: [PATCH 1/5] Add product share functionality --- FRONTEND/src/pages/ProductPage.jsx | 55 ++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/FRONTEND/src/pages/ProductPage.jsx b/FRONTEND/src/pages/ProductPage.jsx index 823613c..672117d 100644 --- a/FRONTEND/src/pages/ProductPage.jsx +++ b/FRONTEND/src/pages/ProductPage.jsx @@ -1,11 +1,11 @@ import React, { useEffect, useState } from 'react'; import { useParams, Link as RouterLink } from 'react-router-dom'; import { - Box, Container, Flex, Image, Heading, Text, Button, + Box, Container, Flex, Image, Heading, Text, Button, IconButton, Spinner, Alert, AlertIcon, VStack, HStack, useColorModeValue, useToast, Badge, Divider, Icon, Grid, GridItem, SimpleGrid, Checkbox } from '@chakra-ui/react'; -import { FaArrowLeft, FaShoppingCart, FaCheckCircle, FaTruck, FaShieldAlt, FaUndo, FaInfoCircle, FaGift, FaChevronLeft, FaChevronRight } from 'react-icons/fa'; +import { FaArrowLeft, FaShoppingCart, FaCheckCircle, FaTruck, FaShieldAlt, FaUndo, FaInfoCircle, FaGift, FaChevronLeft, FaChevronRight, FaShareAlt } from 'react-icons/fa'; import { useCart } from '../store/cart.js'; import { useRecentlyViewed } from "../store/product"; import Breadcrumbs from "../components/ui/Breadcrumbs"; @@ -167,6 +167,28 @@ const ProductPage = () => { } }; + const handleShare = async () => { + try { + await navigator.clipboard.writeText(window.location.href); + + toast({ + title: "Product link copied!", + description: "Share it with anyone.", + status: "success", + duration: 3000, + isClosable: true, + }); + } catch (error) { + toast({ + title: "Failed to copy link", + description: "Please try again.", + status: "error", + duration: 3000, + isClosable: true, + }); + } +}; + const toggleBundleItem = (productId) => { setSelectedBundleItems(prev => prev.includes(productId) @@ -303,15 +325,26 @@ const allImages = [product?.image, ...(product?.images || [])].filter(Boolean); )} - - {product.name} - + + + {product.name} + + + } + aria-label="Share product" + variant="ghost" + size="sm" + mt={1} + onClick={handleShare} + _hover={{ color: "blue.500" }} + /> + {/* Average Rating */} {product.reviewCount > 0 && ( From 5ec0a19c15bbbffae60a2f3191c7162147026747 Mon Sep 17 00:00:00 2001 From: jyoti yadav Date: Mon, 6 Jul 2026 17:35:00 +0530 Subject: [PATCH 2/5] feat: add share button to product page --- FRONTEND/src/pages/ProductPage.jsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/FRONTEND/src/pages/ProductPage.jsx b/FRONTEND/src/pages/ProductPage.jsx index 619fd56..e80b5a2 100644 --- a/FRONTEND/src/pages/ProductPage.jsx +++ b/FRONTEND/src/pages/ProductPage.jsx @@ -40,7 +40,7 @@ import { } from 'react-icons/fa'; import axios from "axios"; import { getSocket } from "../socket"; -import { useCart } from '../store/cart.js'; +import { useCartStore} from '../store/cart.js'; import { useRecentlyViewed } from "../store/product"; import Breadcrumbs from "../components/ui/Breadcrumbs"; import RelatedProducts from "../components/ui/RelatedProducts"; @@ -49,6 +49,7 @@ import ProductReviews from "../components/ui/ProductReviews"; const ProductPage = () => { const { id } = useParams(); const toast = useToast(); + const [product, setProduct] = useState(null); const [selectedSize, setSelectedSize] = useState(''); const [selectedColor, setSelectedColor] = useState(''); const [displayPrice, setDisplayPrice] = useState(0); @@ -72,10 +73,12 @@ const ProductPage = () => { const fetchProduct = async () => { try { const { data } = await axios.get('/api/products/' + id); - setProduct(data); - if (!data.hasVariants) { - setDisplayPrice(data.basePrice); - setDisplayStock(data.baseStock); + + setProduct(data.data); + + if (!data.data.hasVariants) { + setDisplayPrice(data.data.basePrice); + setDisplayStock(data.data.baseStock); } } catch (err) { console.error(err); From f1e5ed2a8068cc79bc4f0972bb5b3e981d074785 Mon Sep 17 00:00:00 2001 From: jyoti yadav Date: Mon, 6 Jul 2026 18:20:26 +0530 Subject: [PATCH 3/5] fix: update cart store import --- FRONTEND/src/components/ui/QuickAddModal.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FRONTEND/src/components/ui/QuickAddModal.jsx b/FRONTEND/src/components/ui/QuickAddModal.jsx index e551f47..9d69145 100644 --- a/FRONTEND/src/components/ui/QuickAddModal.jsx +++ b/FRONTEND/src/components/ui/QuickAddModal.jsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from "react"; -import { useCart } from "../../store/cart"; +import { useCartStore } from "../../store/cart"; import { showSuccessToast, showWarningToast, @@ -25,7 +25,7 @@ import { const QuickAddModal = ({ product, isOpen, onClose }) => { const [quantity, setQuantity] = useState(1); - const { addToCart } = useCart(); + const { addToCart } = useCartStore(); const toast = useToast(); const isOutOfStock = From f68502c6a2bc0bc2f8903e10627884043a9f7804 Mon Sep 17 00:00:00 2001 From: jyoti yadav Date: Mon, 6 Jul 2026 18:41:13 +0530 Subject: [PATCH 4/5] fix: resolve lint issues --- FRONTEND/src/pages/ProductPage.jsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/FRONTEND/src/pages/ProductPage.jsx b/FRONTEND/src/pages/ProductPage.jsx index e80b5a2..784cad8 100644 --- a/FRONTEND/src/pages/ProductPage.jsx +++ b/FRONTEND/src/pages/ProductPage.jsx @@ -40,8 +40,6 @@ import { } from 'react-icons/fa'; import axios from "axios"; import { getSocket } from "../socket"; -import { useCartStore} from '../store/cart.js'; -import { useRecentlyViewed } from "../store/product"; import Breadcrumbs from "../components/ui/Breadcrumbs"; import RelatedProducts from "../components/ui/RelatedProducts"; import ProductReviews from "../components/ui/ProductReviews"; @@ -165,7 +163,7 @@ const ProductPage = () => { duration: 3000, isClosable: true, }); - } catch (error) { + } catch { toast({ title: "Failed to copy link", description: "Please try again.", From 7a4a9c4b7f8b4a39c732a41a612d161ec3cfed3d Mon Sep 17 00:00:00 2001 From: jyoti yadav Date: Mon, 6 Jul 2026 19:00:01 +0530 Subject: [PATCH 5/5] fix: remove invalid TypeScript annotation from return request validator --- BACKEND/models/returnRequest.model.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BACKEND/models/returnRequest.model.js b/BACKEND/models/returnRequest.model.js index 4e97c16..b9ff7bd 100644 --- a/BACKEND/models/returnRequest.model.js +++ b/BACKEND/models/returnRequest.model.js @@ -50,7 +50,7 @@ const returnRequestSchema = new mongoose.Schema({ type: [returnItemSchema], required: [true, "At least one return item is required"], validate: { - validator: function (v: any[]) { + validator: function (v) { return v && v.length > 0; }, message: "Items array cannot be empty",