@beyondcorp/beyond-ui 1.2.47 → 1.2.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Marketplace/AllProductsView.js +2 -1
- package/dist/components/Marketplace/AllProductsView.js.map +1 -1
- package/dist/components/Marketplace/MarketplaceComponent.js +2 -1
- package/dist/components/Marketplace/MarketplaceComponent.js.map +1 -1
- package/dist/components/Marketplace/SingleProductView.js +3 -2
- package/dist/components/Marketplace/SingleProductView.js.map +1 -1
- package/dist/components/Marketplace/data/sampleData.js +38 -1
- package/dist/components/Marketplace/data/sampleData.js.map +1 -1
- package/dist/components/Marketplace/index.d.ts +1 -0
- package/dist/components/Marketplace/utils/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/package.json +1 -1
|
@@ -8,6 +8,7 @@ import { Badge } from '../Badge/Badge.js';
|
|
|
8
8
|
import { Modal, ModalHeader, ModalTitle, ModalContent, ModalFooter } from '../Modal/Modal.js';
|
|
9
9
|
import { Checkbox } from '../Checkbox/Checkbox.js';
|
|
10
10
|
import { showToast } from '../Toast/Toast.js';
|
|
11
|
+
import { sampleProducts } from './data/sampleData.js';
|
|
11
12
|
|
|
12
13
|
const sortOptions = [
|
|
13
14
|
{ value: 'relevance', label: 'Most Relevant' },
|
|
@@ -18,7 +19,7 @@ const sortOptions = [
|
|
|
18
19
|
{ value: 'popular', label: 'Most Popular' },
|
|
19
20
|
];
|
|
20
21
|
const AllProductsView = ({ products, filters: filtersProp, onProductClick, onAddToCart, }) => {
|
|
21
|
-
const productsData = products ??
|
|
22
|
+
const productsData = products ?? sampleProducts;
|
|
22
23
|
const [searchQuery, setSearchQuery] = useState('');
|
|
23
24
|
const [sortBy, setSortBy] = useState('relevance');
|
|
24
25
|
const [viewMode, setViewMode] = useState('grid');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AllProductsView.js","sources":["../../../src/components/Marketplace/AllProductsView.tsx"],"sourcesContent":["import React, { useState, useMemo } from 'react';\nimport { Search, Filter, Grid2x2 as Grid, List, Star, Heart, ShoppingCart, Eye, ChevronDown, X } from 'lucide-react';\nimport { Button } from '../Button';\nimport { Input } from '../Input';\nimport { Card, CardContent } from '../Card';\nimport { Badge } from '../Badge';\nimport { Modal, ModalHeader, ModalTitle, ModalContent, ModalFooter } from '../Modal';\nimport { Checkbox } from '../Checkbox';\nimport { showToast } from '../Toast';\nimport type { Product, FilterOptions, SortOption } from './types';\nimport { sampleProducts } from './data/sampleData';\n\ninterface AllProductsViewProps {\n products?: Product[];\n filters?: FilterOptions;\n onProductClick?: (product: Product) => void;\n onAddToCart?: (product: Product) => void;\n}\n\nconst sortOptions: SortOption[] = [\n { value: 'relevance', label: 'Most Relevant' },\n { value: 'price-low', label: 'Price: Low to High' },\n { value: 'price-high', label: 'Price: High to Low' },\n { value: 'rating', label: 'Highest Rated' },\n { value: 'newest', label: 'Newest First' },\n { value: 'popular', label: 'Most Popular' },\n];\n\nexport const AllProductsView: React.FC<AllProductsViewProps> = ({\n products,\n filters: filtersProp,\n onProductClick,\n onAddToCart,\n}) => {\n const productsData = products ?? require('./data/sampleData').sampleProducts;\n const [searchQuery, setSearchQuery] = useState('');\n const [sortBy, setSortBy] = useState('relevance');\n const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid');\n const [currentPage, setCurrentPage] = useState(1);\n const [showFilters, setShowFilters] = useState(false);\n const [quickViewProduct, setQuickViewProduct] = useState<Product | null>(null);\n const [wishlist, setWishlist] = useState<Set<string>>(new Set());\n\n // Use prop filters if provided, otherwise fallback to internal state\n const [filters, setFilters] = useState<FilterOptions>(\n filtersProp ?? {\n categories: [],\n brands: [],\n priceRange: [0, 1000],\n rating: 0,\n inStock: false,\n vendors: [],\n }\n );\n\n const itemsPerPage = 12;\n\n // Get unique filter options from products\n const filterOptions = useMemo(() => {\n const categories = [...new Set(productsData.map((p: Product) => p.category))];\n const brands = [...new Set(productsData.map((p: Product) => p.brand))];\n const vendors = [...new Set(productsData.map((p: Product) => p.vendor.name))];\n\n return { categories, brands, vendors };\n }, [productsData]);\n\n // Filter and sort products\n const filteredProducts = useMemo(() => {\n let filtered = productsData.filter((product: Product) => {\n // Search query\n if (searchQuery && !product.name.toLowerCase().includes(searchQuery.toLowerCase()) &&\n !product.description.toLowerCase().includes(searchQuery.toLowerCase())) {\n return false;\n }\n\n // Category filter\n if (filters.categories.length > 0 && !filters.categories.includes(product.category)) {\n return false;\n }\n\n // Brand filter\n if (filters.brands.length > 0 && !filters.brands.includes(product.brand)) {\n return false;\n }\n\n // Price range\n if (product.price < filters.priceRange[0] || product.price > filters.priceRange[1]) {\n return false;\n }\n\n // Rating filter\n if (filters.rating > 0 && product.rating < filters.rating) {\n return false;\n }\n\n // In stock filter\n if (filters.inStock && !product.inStock) {\n return false;\n }\n\n // Vendor filter\n if (filters.vendors.length > 0 && !filters.vendors.includes(product.vendor.name)) {\n return false;\n }\n\n return true;\n });\n\n // Sort products\n switch (sortBy) {\n case 'price-low':\n filtered.sort((a: Product, b: Product) => a.price - b.price);\n break;\n case 'price-high':\n filtered.sort((a: Product, b: Product) => b.price - a.price);\n break;\n case 'rating':\n filtered.sort((a: Product, b: Product) => b.rating - a.rating);\n break;\n case 'newest':\n // Assuming newer products have higher IDs\n filtered.sort((a: Product, b: Product) => parseInt(b.id) - parseInt(a.id));\n break;\n case 'popular':\n filtered.sort((a: Product, b: Product) => b.reviewCount - a.reviewCount);\n break;\n default:\n // Keep original order for relevance\n break;\n }\n\n return filtered;\n }, [productsData, searchQuery, filters, sortBy]);\n\n // Paginate products\n const paginatedProducts = useMemo(() => {\n const startIndex = (currentPage - 1) * itemsPerPage;\n return filteredProducts.slice(startIndex, startIndex + itemsPerPage);\n }, [filteredProducts, currentPage]);\n\n const totalPages = Math.ceil(filteredProducts.length / itemsPerPage);\n\n const handleFilterChange = (filterType: keyof FilterOptions, value: any) => {\n setFilters(prev => ({\n ...prev,\n [filterType]: value,\n }));\n setCurrentPage(1); // Reset to first page when filters change\n };\n\n const handleClearFilters = () => {\n setFilters({\n categories: [],\n brands: [],\n priceRange: [0, 1000],\n rating: 0,\n inStock: false,\n vendors: [],\n });\n setSearchQuery('');\n setCurrentPage(1);\n };\n\n const toggleWishlist = (productId: string) => {\n setWishlist(prev => {\n const newWishlist = new Set(prev);\n if (newWishlist.has(productId)) {\n newWishlist.delete(productId);\n showToast.info('Removed from wishlist');\n } else {\n newWishlist.add(productId);\n showToast.success('Added to wishlist');\n }\n return newWishlist;\n });\n };\n\n const handleAddToCart = (product: Product) => {\n onAddToCart?.(product);\n showToast.success(`${product.name} added to cart!`);\n };\n\n const ProductCard: React.FC<{ product: Product }> = ({ product }) => (\n <Card className=\"group hover:shadow-lg transition-all duration-300\">\n <div className=\"relative aspect-square bg-gray-100 rounded-t-lg overflow-hidden\">\n <img\n src={product.images[0]}\n alt={product.name}\n className=\"w-full h-full object-cover group-hover:scale-105 transition-transform duration-300\"\n />\n {product.discount && (\n <Badge variant=\"danger\" className=\"absolute top-2 left-2\">\n -{product.discount}%\n </Badge>\n )}\n <div className=\"absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation();\n toggleWishlist(product.id);\n }}\n className=\"bg-white/80 hover:bg-white\"\n >\n <Heart className={`h-4 w-4 ${wishlist.has(product.id) ? 'fill-current text-red-500' : ''}`} />\n </Button>\n </div>\n <div className=\"absolute bottom-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation();\n setQuickViewProduct(product);\n }}\n className=\"bg-white/80 hover:bg-white\"\n >\n <Eye className=\"h-4 w-4\" />\n </Button>\n </div>\n {!product.inStock && (\n <div className=\"absolute inset-0 bg-black/50 flex items-center justify-center\">\n <Badge variant=\"secondary\">Out of Stock</Badge>\n </div>\n )}\n </div>\n <CardContent className=\"p-4\">\n <div className=\"mb-2\">\n <h3 \n className=\"font-medium text-gray-900 line-clamp-2 cursor-pointer hover:text-primary-600\"\n onClick={() => onProductClick?.(product)}\n >\n {product.name}\n </h3>\n <p className=\"text-sm text-gray-600\">{product.brand}</p>\n </div>\n <div className=\"flex items-center space-x-1 mb-2\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">\n {product.rating} ({product.reviewCount})\n </span>\n </div>\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-lg font-bold text-gray-900\">\n ${product.price.toFixed(2)}\n </span>\n {product.originalPrice && (\n <span className=\"text-sm text-gray-500 line-through\">\n ${product.originalPrice.toFixed(2)}\n </span>\n )}\n </div>\n </div>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation();\n handleAddToCart(product);\n }}\n disabled={!product.inStock}\n className=\"w-full\"\n >\n <ShoppingCart className=\"mr-2 h-4 w-4\" />\n Add to Cart\n </Button>\n </CardContent>\n </Card>\n );\n\n return (\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8\">\n {/* Header */}\n <div className=\"flex flex-col lg:flex-row lg:items-center lg:justify-between mb-8\">\n <div>\n <h1 className=\"text-3xl font-bold text-gray-900 mb-2\">All Products</h1>\n <p className=\"text-gray-600\">\n Showing {filteredProducts.length} of {productsData.length} products\n </p>\n </div>\n \n {/* Search and Controls */}\n <div className=\"flex items-center space-x-4 mt-4 lg:mt-0\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400\" />\n <Input\n placeholder=\"Search products...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-10 w-64\"\n />\n </div>\n \n <select\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value)}\n className=\"border border-gray-300 rounded-lg px-3 py-2 bg-white\"\n >\n {sortOptions.map(option => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n\n <div className=\"flex items-center bg-gray-100 rounded-lg p-1\">\n <Button\n variant={viewMode === 'grid' ? 'primary' : 'ghost'}\n size=\"sm\"\n onClick={() => setViewMode('grid')}\n >\n <Grid className=\"h-4 w-4\" />\n </Button>\n <Button\n variant={viewMode === 'list' ? 'primary' : 'ghost'}\n size=\"sm\"\n onClick={() => setViewMode('list')}\n >\n <List className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <Button\n variant=\"outline\"\n onClick={() => setShowFilters(true)}\n className=\"lg:hidden\"\n >\n <Filter className=\"mr-2 h-4 w-4\" />\n Filters\n </Button>\n </div>\n </div>\n\n <div className=\"flex gap-8\">\n {/* Filters Sidebar - Desktop */}\n <div className=\"hidden lg:block w-64 flex-shrink-0\">\n <Card className=\"sticky top-4\">\n <CardContent className=\"p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"font-semibold text-gray-900\">Filters</h3>\n <Button variant=\"ghost\" size=\"sm\" onClick={handleClearFilters}>\n Clear All\n </Button>\n </div>\n\n {/* Categories */}\n <div className=\"mb-6\">\n <h4 className=\"font-medium text-gray-900 mb-3\">Categories</h4>\n <div className=\"space-y-2\">\n {(filterOptions.categories as string[]).map((category, idx) => (\n <label key={category} className=\"flex items-center space-x-2\">\n <Checkbox\n checked={filters.categories.includes(category)}\n onChange={(e) => {\n const newCategories = e.target.checked\n ? [...filters.categories, category]\n : filters.categories.filter((c: string) => c !== category);\n handleFilterChange('categories', newCategories);\n }}\n />\n <span className=\"text-sm text-gray-700\">{category}</span>\n </label>\n ))}\n </div>\n </div>\n\n {/* Brands */}\n <div className=\"mb-6\">\n <h4 className=\"font-medium text-gray-900 mb-3\">Brands</h4>\n <div className=\"space-y-2\">\n {(filterOptions.brands as string[]).map((brand, idx) => (\n <label key={brand} className=\"flex items-center space-x-2\">\n <Checkbox\n checked={filters.brands.includes(brand)}\n onChange={(e) => {\n const newBrands = e.target.checked\n ? [...filters.brands, brand]\n : filters.brands.filter((b: string) => b !== brand);\n handleFilterChange('brands', newBrands);\n }}\n />\n <span className=\"text-sm text-gray-700\">{brand}</span>\n </label>\n ))}\n </div>\n </div>\n\n {/* Price Range */}\n <div className=\"mb-6\">\n <h4 className=\"font-medium text-gray-900 mb-3\">Price Range</h4>\n <div className=\"space-y-2\">\n <div className=\"flex items-center space-x-2\">\n <Input\n type=\"number\"\n placeholder=\"Min\"\n value={filters.priceRange[0]}\n onChange={(e) => handleFilterChange('priceRange', [\n parseInt(e.target.value) || 0,\n filters.priceRange[1]\n ])}\n className=\"w-20\"\n />\n <span>-</span>\n <Input\n type=\"number\"\n placeholder=\"Max\"\n value={filters.priceRange[1]}\n onChange={(e) => handleFilterChange('priceRange', [\n filters.priceRange[0],\n parseInt(e.target.value) || 1000\n ])}\n className=\"w-20\"\n />\n </div>\n </div>\n </div>\n\n {/* Rating */}\n <div className=\"mb-6\">\n <h4 className=\"font-medium text-gray-900 mb-3\">Minimum Rating</h4>\n <div className=\"space-y-2\">\n {[4, 3, 2, 1].map(rating => (\n <label key={rating} className=\"flex items-center space-x-2\">\n <Checkbox\n checked={filters.rating === rating}\n onChange={(e) => {\n handleFilterChange('rating', e.target.checked ? rating : 0);\n }}\n />\n <div className=\"flex items-center space-x-1\">\n {[1, 2, 3, 4, 5].map(star => (\n <Star\n key={star}\n className={`h-4 w-4 ${\n star <= rating ? 'text-yellow-400 fill-current' : 'text-gray-300'\n }`}\n />\n ))}\n <span className=\"text-sm text-gray-700\">& up</span>\n </div>\n </label>\n ))}\n </div>\n </div>\n\n {/* In Stock */}\n <div className=\"mb-6\">\n <label className=\"flex items-center space-x-2\">\n <Checkbox\n checked={filters.inStock}\n onChange={(e) => handleFilterChange('inStock', e.target.checked)}\n />\n <span className=\"text-sm text-gray-700\">In Stock Only</span>\n </label>\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Products Grid */}\n <div className=\"flex-1\">\n {paginatedProducts.length === 0 ? (\n <div className=\"text-center py-12\">\n <div className=\"text-gray-400 mb-4\">\n <Search className=\"h-16 w-16 mx-auto\" />\n </div>\n <h3 className=\"text-lg font-medium text-gray-900 mb-2\">No products found</h3>\n <p className=\"text-gray-600 mb-4\">\n Try adjusting your search or filter criteria\n </p>\n <Button variant=\"outline\" onClick={handleClearFilters}>\n Clear Filters\n </Button>\n </div>\n ) : (\n <>\n <div className={`grid gap-6 ${\n viewMode === 'grid' \n ? 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4' \n : 'grid-cols-1'\n }`}>\n {paginatedProducts.map((product: Product) => (\n <ProductCard key={product.id} product={product} />\n ))}\n </div>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div className=\"flex items-center justify-center space-x-2 mt-12\">\n <Button\n variant=\"outline\"\n onClick={() => setCurrentPage(prev => Math.max(1, prev - 1))}\n disabled={currentPage === 1}\n >\n Previous\n </Button>\n \n {Array.from({ length: Math.min(5, totalPages) }, (_, i) => {\n const page = i + 1;\n return (\n <Button\n key={page}\n variant={currentPage === page ? 'primary' : 'outline'}\n onClick={() => setCurrentPage(page)}\n >\n {page}\n </Button>\n );\n })}\n \n <Button\n variant=\"outline\"\n onClick={() => setCurrentPage(prev => Math.min(totalPages, prev + 1))}\n disabled={currentPage === totalPages}\n >\n Next\n </Button>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n\n {/* Mobile Filters Modal */}\n <Modal open={showFilters} onOpenChange={setShowFilters}>\n <ModalHeader>\n <ModalTitle>Filters</ModalTitle>\n </ModalHeader>\n <ModalContent>\n {/* Same filter content as sidebar but in modal */}\n <div className=\"space-y-6\">\n {/* Categories */}\n <div>\n <h4 className=\"font-medium text-gray-900 mb-3\">Categories</h4>\n <div className=\"space-y-2\">\n {(filterOptions.categories as string[]).map((category, idx) => (\n <label key={category} className=\"flex items-center space-x-2\">\n <Checkbox\n checked={filters.categories.includes(category)}\n onChange={(e) => {\n const newCategories = e.target.checked\n ? [...filters.categories, category]\n : filters.categories.filter((c: string) => c !== category);\n handleFilterChange('categories', newCategories);\n }}\n />\n <span className=\"text-sm text-gray-700\">{category}</span>\n </label>\n ))}\n </div>\n </div>\n {/* Add other filter sections here */}\n </div>\n </ModalContent>\n <ModalFooter>\n <Button variant=\"outline\" onClick={handleClearFilters}>\n Clear All\n </Button>\n <Button variant=\"primary\" onClick={() => setShowFilters(false)}>\n Apply Filters\n </Button>\n </ModalFooter>\n </Modal>\n\n {/* Quick View Modal */}\n <Modal open={!!quickViewProduct} onOpenChange={() => setQuickViewProduct(null)} size=\"lg\">\n {quickViewProduct && (\n <>\n <ModalHeader>\n <ModalTitle>{quickViewProduct.name}</ModalTitle>\n </ModalHeader>\n <ModalContent>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div className=\"aspect-square bg-gray-100 rounded-lg overflow-hidden\">\n <img\n src={quickViewProduct.images[0]}\n alt={quickViewProduct.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n <div>\n <div className=\"flex items-center space-x-1 mb-2\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">\n {quickViewProduct.rating} ({quickViewProduct.reviewCount} reviews)\n </span>\n </div>\n <div className=\"flex items-center space-x-2 mb-4\">\n <span className=\"text-2xl font-bold text-gray-900\">\n ${quickViewProduct.price.toFixed(2)}\n </span>\n {quickViewProduct.originalPrice && (\n <span className=\"text-lg text-gray-500 line-through\">\n ${quickViewProduct.originalPrice.toFixed(2)}\n </span>\n )}\n </div>\n <p className=\"text-gray-600 mb-4\">{quickViewProduct.description}</p>\n <Badge variant={quickViewProduct.inStock ? 'success' : 'danger'} className=\"mb-4\">\n {quickViewProduct.inStock ? 'In Stock' : 'Out of Stock'}\n </Badge>\n </div>\n </div>\n </ModalContent>\n <ModalFooter>\n <Button variant=\"outline\" onClick={() => onProductClick?.(quickViewProduct)}>\n View Details\n </Button>\n <Button \n variant=\"primary\" \n onClick={() => handleAddToCart(quickViewProduct)}\n disabled={!quickViewProduct.inStock}\n >\n <ShoppingCart className=\"mr-2 h-4 w-4\" />\n Add to Cart\n </Button>\n </ModalFooter>\n </>\n )}\n </Modal>\n </div>\n );\n};"],"names":["_jsxs","_jsx","Grid","_Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AllProductsView.js","sources":["../../../src/components/Marketplace/AllProductsView.tsx"],"sourcesContent":["import React, { useState, useMemo } from 'react';\nimport { Search, Filter, Grid2x2 as Grid, List, Star, Heart, ShoppingCart, Eye, ChevronDown, X } from 'lucide-react';\nimport { Button } from '../Button';\nimport { Input } from '../Input';\nimport { Card, CardContent } from '../Card';\nimport { Badge } from '../Badge';\nimport { Modal, ModalHeader, ModalTitle, ModalContent, ModalFooter } from '../Modal';\nimport { Checkbox } from '../Checkbox';\nimport { showToast } from '../Toast';\nimport type { Product, FilterOptions, SortOption } from './types';\nimport { sampleProducts } from './data/sampleData';\n\ninterface AllProductsViewProps {\n products?: Product[];\n filters?: FilterOptions;\n onProductClick?: (product: Product) => void;\n onAddToCart?: (product: Product) => void;\n}\n\nconst sortOptions: SortOption[] = [\n { value: 'relevance', label: 'Most Relevant' },\n { value: 'price-low', label: 'Price: Low to High' },\n { value: 'price-high', label: 'Price: High to Low' },\n { value: 'rating', label: 'Highest Rated' },\n { value: 'newest', label: 'Newest First' },\n { value: 'popular', label: 'Most Popular' },\n];\n\nexport const AllProductsView: React.FC<AllProductsViewProps> = ({\n products,\n filters: filtersProp,\n onProductClick,\n onAddToCart,\n}) => {\n const productsData = products ?? sampleProducts;\n const [searchQuery, setSearchQuery] = useState('');\n const [sortBy, setSortBy] = useState('relevance');\n const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid');\n const [currentPage, setCurrentPage] = useState(1);\n const [showFilters, setShowFilters] = useState(false);\n const [quickViewProduct, setQuickViewProduct] = useState<Product | null>(null);\n const [wishlist, setWishlist] = useState<Set<string>>(new Set());\n\n // Use prop filters if provided, otherwise fallback to internal state\n const [filters, setFilters] = useState<FilterOptions>(\n filtersProp ?? {\n categories: [],\n brands: [],\n priceRange: [0, 1000],\n rating: 0,\n inStock: false,\n vendors: [],\n }\n );\n\n const itemsPerPage = 12;\n\n // Get unique filter options from products\n const filterOptions = useMemo(() => {\n const categories = [...new Set(productsData.map((p: Product) => p.category))];\n const brands = [...new Set(productsData.map((p: Product) => p.brand))];\n const vendors = [...new Set(productsData.map((p: Product) => p.vendor.name))];\n\n return { categories, brands, vendors };\n }, [productsData]);\n\n // Filter and sort products\n const filteredProducts = useMemo(() => {\n let filtered = productsData.filter((product: Product) => {\n // Search query\n if (searchQuery && !product.name.toLowerCase().includes(searchQuery.toLowerCase()) &&\n !product.description.toLowerCase().includes(searchQuery.toLowerCase())) {\n return false;\n }\n\n // Category filter\n if (filters.categories.length > 0 && !filters.categories.includes(product.category)) {\n return false;\n }\n\n // Brand filter\n if (filters.brands.length > 0 && !filters.brands.includes(product.brand)) {\n return false;\n }\n\n // Price range\n if (product.price < filters.priceRange[0] || product.price > filters.priceRange[1]) {\n return false;\n }\n\n // Rating filter\n if (filters.rating > 0 && product.rating < filters.rating) {\n return false;\n }\n\n // In stock filter\n if (filters.inStock && !product.inStock) {\n return false;\n }\n\n // Vendor filter\n if (filters.vendors.length > 0 && !filters.vendors.includes(product.vendor.name)) {\n return false;\n }\n\n return true;\n });\n\n // Sort products\n switch (sortBy) {\n case 'price-low':\n filtered.sort((a: Product, b: Product) => a.price - b.price);\n break;\n case 'price-high':\n filtered.sort((a: Product, b: Product) => b.price - a.price);\n break;\n case 'rating':\n filtered.sort((a: Product, b: Product) => b.rating - a.rating);\n break;\n case 'newest':\n // Assuming newer products have higher IDs\n filtered.sort((a: Product, b: Product) => parseInt(b.id) - parseInt(a.id));\n break;\n case 'popular':\n filtered.sort((a: Product, b: Product) => b.reviewCount - a.reviewCount);\n break;\n default:\n // Keep original order for relevance\n break;\n }\n\n return filtered;\n }, [productsData, searchQuery, filters, sortBy]);\n\n // Paginate products\n const paginatedProducts = useMemo(() => {\n const startIndex = (currentPage - 1) * itemsPerPage;\n return filteredProducts.slice(startIndex, startIndex + itemsPerPage);\n }, [filteredProducts, currentPage]);\n\n const totalPages = Math.ceil(filteredProducts.length / itemsPerPage);\n\n const handleFilterChange = (filterType: keyof FilterOptions, value: any) => {\n setFilters(prev => ({\n ...prev,\n [filterType]: value,\n }));\n setCurrentPage(1); // Reset to first page when filters change\n };\n\n const handleClearFilters = () => {\n setFilters({\n categories: [],\n brands: [],\n priceRange: [0, 1000],\n rating: 0,\n inStock: false,\n vendors: [],\n });\n setSearchQuery('');\n setCurrentPage(1);\n };\n\n const toggleWishlist = (productId: string) => {\n setWishlist(prev => {\n const newWishlist = new Set(prev);\n if (newWishlist.has(productId)) {\n newWishlist.delete(productId);\n showToast.info('Removed from wishlist');\n } else {\n newWishlist.add(productId);\n showToast.success('Added to wishlist');\n }\n return newWishlist;\n });\n };\n\n const handleAddToCart = (product: Product) => {\n onAddToCart?.(product);\n showToast.success(`${product.name} added to cart!`);\n };\n\n const ProductCard: React.FC<{ product: Product }> = ({ product }) => (\n <Card className=\"group hover:shadow-lg transition-all duration-300\">\n <div className=\"relative aspect-square bg-gray-100 rounded-t-lg overflow-hidden\">\n <img\n src={product.images[0]}\n alt={product.name}\n className=\"w-full h-full object-cover group-hover:scale-105 transition-transform duration-300\"\n />\n {product.discount && (\n <Badge variant=\"danger\" className=\"absolute top-2 left-2\">\n -{product.discount}%\n </Badge>\n )}\n <div className=\"absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation();\n toggleWishlist(product.id);\n }}\n className=\"bg-white/80 hover:bg-white\"\n >\n <Heart className={`h-4 w-4 ${wishlist.has(product.id) ? 'fill-current text-red-500' : ''}`} />\n </Button>\n </div>\n <div className=\"absolute bottom-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation();\n setQuickViewProduct(product);\n }}\n className=\"bg-white/80 hover:bg-white\"\n >\n <Eye className=\"h-4 w-4\" />\n </Button>\n </div>\n {!product.inStock && (\n <div className=\"absolute inset-0 bg-black/50 flex items-center justify-center\">\n <Badge variant=\"secondary\">Out of Stock</Badge>\n </div>\n )}\n </div>\n <CardContent className=\"p-4\">\n <div className=\"mb-2\">\n <h3 \n className=\"font-medium text-gray-900 line-clamp-2 cursor-pointer hover:text-primary-600\"\n onClick={() => onProductClick?.(product)}\n >\n {product.name}\n </h3>\n <p className=\"text-sm text-gray-600\">{product.brand}</p>\n </div>\n <div className=\"flex items-center space-x-1 mb-2\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">\n {product.rating} ({product.reviewCount})\n </span>\n </div>\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-lg font-bold text-gray-900\">\n ${product.price.toFixed(2)}\n </span>\n {product.originalPrice && (\n <span className=\"text-sm text-gray-500 line-through\">\n ${product.originalPrice.toFixed(2)}\n </span>\n )}\n </div>\n </div>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation();\n handleAddToCart(product);\n }}\n disabled={!product.inStock}\n className=\"w-full\"\n >\n <ShoppingCart className=\"mr-2 h-4 w-4\" />\n Add to Cart\n </Button>\n </CardContent>\n </Card>\n );\n\n return (\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8\">\n {/* Header */}\n <div className=\"flex flex-col lg:flex-row lg:items-center lg:justify-between mb-8\">\n <div>\n <h1 className=\"text-3xl font-bold text-gray-900 mb-2\">All Products</h1>\n <p className=\"text-gray-600\">\n Showing {filteredProducts.length} of {productsData.length} products\n </p>\n </div>\n \n {/* Search and Controls */}\n <div className=\"flex items-center space-x-4 mt-4 lg:mt-0\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400\" />\n <Input\n placeholder=\"Search products...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-10 w-64\"\n />\n </div>\n \n <select\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value)}\n className=\"border border-gray-300 rounded-lg px-3 py-2 bg-white\"\n >\n {sortOptions.map(option => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n\n <div className=\"flex items-center bg-gray-100 rounded-lg p-1\">\n <Button\n variant={viewMode === 'grid' ? 'primary' : 'ghost'}\n size=\"sm\"\n onClick={() => setViewMode('grid')}\n >\n <Grid className=\"h-4 w-4\" />\n </Button>\n <Button\n variant={viewMode === 'list' ? 'primary' : 'ghost'}\n size=\"sm\"\n onClick={() => setViewMode('list')}\n >\n <List className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <Button\n variant=\"outline\"\n onClick={() => setShowFilters(true)}\n className=\"lg:hidden\"\n >\n <Filter className=\"mr-2 h-4 w-4\" />\n Filters\n </Button>\n </div>\n </div>\n\n <div className=\"flex gap-8\">\n {/* Filters Sidebar - Desktop */}\n <div className=\"hidden lg:block w-64 flex-shrink-0\">\n <Card className=\"sticky top-4\">\n <CardContent className=\"p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"font-semibold text-gray-900\">Filters</h3>\n <Button variant=\"ghost\" size=\"sm\" onClick={handleClearFilters}>\n Clear All\n </Button>\n </div>\n\n {/* Categories */}\n <div className=\"mb-6\">\n <h4 className=\"font-medium text-gray-900 mb-3\">Categories</h4>\n <div className=\"space-y-2\">\n {(filterOptions.categories as string[]).map((category, idx) => (\n <label key={category} className=\"flex items-center space-x-2\">\n <Checkbox\n checked={filters.categories.includes(category)}\n onChange={(e) => {\n const newCategories = e.target.checked\n ? [...filters.categories, category]\n : filters.categories.filter((c: string) => c !== category);\n handleFilterChange('categories', newCategories);\n }}\n />\n <span className=\"text-sm text-gray-700\">{category}</span>\n </label>\n ))}\n </div>\n </div>\n\n {/* Brands */}\n <div className=\"mb-6\">\n <h4 className=\"font-medium text-gray-900 mb-3\">Brands</h4>\n <div className=\"space-y-2\">\n {(filterOptions.brands as string[]).map((brand, idx) => (\n <label key={brand} className=\"flex items-center space-x-2\">\n <Checkbox\n checked={filters.brands.includes(brand)}\n onChange={(e) => {\n const newBrands = e.target.checked\n ? [...filters.brands, brand]\n : filters.brands.filter((b: string) => b !== brand);\n handleFilterChange('brands', newBrands);\n }}\n />\n <span className=\"text-sm text-gray-700\">{brand}</span>\n </label>\n ))}\n </div>\n </div>\n\n {/* Price Range */}\n <div className=\"mb-6\">\n <h4 className=\"font-medium text-gray-900 mb-3\">Price Range</h4>\n <div className=\"space-y-2\">\n <div className=\"flex items-center space-x-2\">\n <Input\n type=\"number\"\n placeholder=\"Min\"\n value={filters.priceRange[0]}\n onChange={(e) => handleFilterChange('priceRange', [\n parseInt(e.target.value) || 0,\n filters.priceRange[1]\n ])}\n className=\"w-20\"\n />\n <span>-</span>\n <Input\n type=\"number\"\n placeholder=\"Max\"\n value={filters.priceRange[1]}\n onChange={(e) => handleFilterChange('priceRange', [\n filters.priceRange[0],\n parseInt(e.target.value) || 1000\n ])}\n className=\"w-20\"\n />\n </div>\n </div>\n </div>\n\n {/* Rating */}\n <div className=\"mb-6\">\n <h4 className=\"font-medium text-gray-900 mb-3\">Minimum Rating</h4>\n <div className=\"space-y-2\">\n {[4, 3, 2, 1].map(rating => (\n <label key={rating} className=\"flex items-center space-x-2\">\n <Checkbox\n checked={filters.rating === rating}\n onChange={(e) => {\n handleFilterChange('rating', e.target.checked ? rating : 0);\n }}\n />\n <div className=\"flex items-center space-x-1\">\n {[1, 2, 3, 4, 5].map(star => (\n <Star\n key={star}\n className={`h-4 w-4 ${\n star <= rating ? 'text-yellow-400 fill-current' : 'text-gray-300'\n }`}\n />\n ))}\n <span className=\"text-sm text-gray-700\">& up</span>\n </div>\n </label>\n ))}\n </div>\n </div>\n\n {/* In Stock */}\n <div className=\"mb-6\">\n <label className=\"flex items-center space-x-2\">\n <Checkbox\n checked={filters.inStock}\n onChange={(e) => handleFilterChange('inStock', e.target.checked)}\n />\n <span className=\"text-sm text-gray-700\">In Stock Only</span>\n </label>\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Products Grid */}\n <div className=\"flex-1\">\n {paginatedProducts.length === 0 ? (\n <div className=\"text-center py-12\">\n <div className=\"text-gray-400 mb-4\">\n <Search className=\"h-16 w-16 mx-auto\" />\n </div>\n <h3 className=\"text-lg font-medium text-gray-900 mb-2\">No products found</h3>\n <p className=\"text-gray-600 mb-4\">\n Try adjusting your search or filter criteria\n </p>\n <Button variant=\"outline\" onClick={handleClearFilters}>\n Clear Filters\n </Button>\n </div>\n ) : (\n <>\n <div className={`grid gap-6 ${\n viewMode === 'grid' \n ? 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4' \n : 'grid-cols-1'\n }`}>\n {paginatedProducts.map((product: Product) => (\n <ProductCard key={product.id} product={product} />\n ))}\n </div>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div className=\"flex items-center justify-center space-x-2 mt-12\">\n <Button\n variant=\"outline\"\n onClick={() => setCurrentPage(prev => Math.max(1, prev - 1))}\n disabled={currentPage === 1}\n >\n Previous\n </Button>\n \n {Array.from({ length: Math.min(5, totalPages) }, (_, i) => {\n const page = i + 1;\n return (\n <Button\n key={page}\n variant={currentPage === page ? 'primary' : 'outline'}\n onClick={() => setCurrentPage(page)}\n >\n {page}\n </Button>\n );\n })}\n \n <Button\n variant=\"outline\"\n onClick={() => setCurrentPage(prev => Math.min(totalPages, prev + 1))}\n disabled={currentPage === totalPages}\n >\n Next\n </Button>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n\n {/* Mobile Filters Modal */}\n <Modal open={showFilters} onOpenChange={setShowFilters}>\n <ModalHeader>\n <ModalTitle>Filters</ModalTitle>\n </ModalHeader>\n <ModalContent>\n {/* Same filter content as sidebar but in modal */}\n <div className=\"space-y-6\">\n {/* Categories */}\n <div>\n <h4 className=\"font-medium text-gray-900 mb-3\">Categories</h4>\n <div className=\"space-y-2\">\n {(filterOptions.categories as string[]).map((category, idx) => (\n <label key={category} className=\"flex items-center space-x-2\">\n <Checkbox\n checked={filters.categories.includes(category)}\n onChange={(e) => {\n const newCategories = e.target.checked\n ? [...filters.categories, category]\n : filters.categories.filter((c: string) => c !== category);\n handleFilterChange('categories', newCategories);\n }}\n />\n <span className=\"text-sm text-gray-700\">{category}</span>\n </label>\n ))}\n </div>\n </div>\n {/* Add other filter sections here */}\n </div>\n </ModalContent>\n <ModalFooter>\n <Button variant=\"outline\" onClick={handleClearFilters}>\n Clear All\n </Button>\n <Button variant=\"primary\" onClick={() => setShowFilters(false)}>\n Apply Filters\n </Button>\n </ModalFooter>\n </Modal>\n\n {/* Quick View Modal */}\n <Modal open={!!quickViewProduct} onOpenChange={() => setQuickViewProduct(null)} size=\"lg\">\n {quickViewProduct && (\n <>\n <ModalHeader>\n <ModalTitle>{quickViewProduct.name}</ModalTitle>\n </ModalHeader>\n <ModalContent>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div className=\"aspect-square bg-gray-100 rounded-lg overflow-hidden\">\n <img\n src={quickViewProduct.images[0]}\n alt={quickViewProduct.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n <div>\n <div className=\"flex items-center space-x-1 mb-2\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">\n {quickViewProduct.rating} ({quickViewProduct.reviewCount} reviews)\n </span>\n </div>\n <div className=\"flex items-center space-x-2 mb-4\">\n <span className=\"text-2xl font-bold text-gray-900\">\n ${quickViewProduct.price.toFixed(2)}\n </span>\n {quickViewProduct.originalPrice && (\n <span className=\"text-lg text-gray-500 line-through\">\n ${quickViewProduct.originalPrice.toFixed(2)}\n </span>\n )}\n </div>\n <p className=\"text-gray-600 mb-4\">{quickViewProduct.description}</p>\n <Badge variant={quickViewProduct.inStock ? 'success' : 'danger'} className=\"mb-4\">\n {quickViewProduct.inStock ? 'In Stock' : 'Out of Stock'}\n </Badge>\n </div>\n </div>\n </ModalContent>\n <ModalFooter>\n <Button variant=\"outline\" onClick={() => onProductClick?.(quickViewProduct)}>\n View Details\n </Button>\n <Button \n variant=\"primary\" \n onClick={() => handleAddToCart(quickViewProduct)}\n disabled={!quickViewProduct.inStock}\n >\n <ShoppingCart className=\"mr-2 h-4 w-4\" />\n Add to Cart\n </Button>\n </ModalFooter>\n </>\n )}\n </Modal>\n </div>\n );\n};"],"names":["_jsxs","_jsx","Grid","_Fragment"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { sampleProducts } from './data/sampleData.js';
|
|
2
3
|
import { MarketplaceHeader } from './components/MarketplaceHeader.js';
|
|
3
4
|
import { MarketplaceDashboard } from './components/MarketplaceDashboard.js';
|
|
4
5
|
import { MarketplaceSidebar } from './MarketplaceSidebar.js';
|
|
@@ -19,7 +20,7 @@ const MarketplaceComponent = ({ userRole = 'buyer', products, cartItems: cartIte
|
|
|
19
20
|
// State management hook (fallbacks for backward compatibility)
|
|
20
21
|
const { sidebarCollapsed, currentView, selectedProduct, searchQuery, cartItems: cartItemsState, showCheckout, filters: filtersState, setSidebarCollapsed, setCurrentView, setSelectedProduct, setSearchQuery, setCartItems, setShowCheckout, setFilters, toggleSidebar, clearCart, resetFilters, } = useMarketplaceState();
|
|
21
22
|
// Use props if provided, otherwise fallback to internal state/sample data
|
|
22
|
-
const rawProductsData = products ??
|
|
23
|
+
const rawProductsData = products ?? sampleProducts;
|
|
23
24
|
const productsData = Array.isArray(rawProductsData)
|
|
24
25
|
? rawProductsData.map(sanitizeProduct)
|
|
25
26
|
: [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceComponent.js","sources":["../../../src/components/Marketplace/MarketplaceComponent.tsx"],"sourcesContent":["import React from 'react';\nimport { sampleProducts } from './data/sampleData';\nimport { MarketplaceHeader } from './components/MarketplaceHeader';\nimport { MarketplaceDashboard } from './components/MarketplaceDashboard';\nimport { MarketplaceSidebar } from './MarketplaceSidebar';\nimport { AllProductsView } from './AllProductsView';\nimport { SingleProductView } from './SingleProductView';\nimport { CheckoutCompact } from './CheckoutCompact';\nimport { useMarketplaceState } from './hooks/useMarketplaceState';\nimport { useCart } from './hooks/useCart';\nimport { useProductNavigation } from './hooks/useProductNavigation';\nimport { useSearch } from './hooks/useSearch';\nimport type { Product, CartItem, FilterOptions } from './types';\nimport { sanitizeProduct } from \"./utils/sanitizeProduct\";\n\n\nexport interface MarketplaceComponentProps {\n userRole?: 'buyer' | 'seller' | 'admin';\n products?: Product[];\n cartItems?: CartItem[];\n filters?: FilterOptions;\n onProductClick?: (product: Product) => void;\n onAddToCart?: (product: Product, quantity?: number) => void;\n onRemoveFromCart?: (productId: string) => void;\n onFiltersChange?: (filters: FilterOptions) => void;\n onClearFilters?: () => void;\n className?: string;\n}\n\n/**\n * Main marketplace component orchestrating all marketplace functionality\n * Refactored to use modular components and custom hooks for better maintainability\n */\nexport const MarketplaceComponent: React.FC<MarketplaceComponentProps> = ({\n userRole = 'buyer',\n products,\n cartItems: cartItemsProp,\n filters: filtersProp,\n onProductClick,\n onAddToCart,\n onRemoveFromCart,\n onFiltersChange,\n onClearFilters,\n className = '',\n}) => {\n // State management hook (fallbacks for backward compatibility)\n const {\n sidebarCollapsed,\n currentView,\n selectedProduct,\n searchQuery,\n cartItems: cartItemsState,\n showCheckout,\n filters: filtersState,\n setSidebarCollapsed,\n setCurrentView,\n setSelectedProduct,\n setSearchQuery,\n setCartItems,\n setShowCheckout,\n setFilters,\n toggleSidebar,\n clearCart,\n resetFilters,\n } = useMarketplaceState();\n\n // Use props if provided, otherwise fallback to internal state/sample data\n \n const rawProductsData: Product[] = products ?? require('./data/sampleData').sampleProducts;\n const productsData: Product[] = Array.isArray(rawProductsData)\n ? rawProductsData.map(sanitizeProduct)\n : [];\n const cartItems = cartItemsProp ?? cartItemsState;\n const filters = filtersProp ?? filtersState;\n\n // Cart management hook\n const {\n addToCart,\n removeFromCart,\n updateQuantity,\n getCartTotal,\n getCartItemCount,\n isInCart,\n getCartItem,\n } = useCart({ cartItems, setCartItems });\n\n // Navigation hook\n const {\n navigateToProduct,\n navigateToProducts,\n navigateToDashboard,\n navigateToCheckout,\n } = useProductNavigation({\n setSelectedProduct,\n setCurrentView,\n onProductClick,\n });\n\n // Search hook\n const {\n searchResults,\n isSearching,\n handleSearch,\n clearSearch,\n } = useSearch({\n products: productsData,\n searchQuery,\n setSearchQuery,\n setCurrentView,\n });\n\n // Derived data\n const featuredProducts = productsData.slice(0, 4);\n const trendingProducts = productsData.slice(4, 8);\n const recentlyViewed = productsData.slice(8, 12);\n const cartItemCount = getCartItemCount();\n\n // Event handlers\n const handleCartClick = () => {\n setShowCheckout(!showCheckout);\n };\n\n const handleCheckoutComplete = (items: any[]) => {\n clearCart();\n setShowCheckout(false);\n };\n\n const handleBuyNow = (product: Product, quantity: number) => {\n (onAddToCart ?? addToCart)(product, quantity);\n setShowCheckout(true);\n };\n\n return (\n <div className={`min-h-screen bg-gray-50 ${className}`}>\n {/* Header */}\n <MarketplaceHeader\n searchQuery={searchQuery}\n onSearchChange={handleSearch}\n cartItemCount={cartItemCount}\n onCartClick={handleCartClick}\n onMenuToggle={toggleSidebar}\n userRole={userRole}\n />\n\n <div className=\"flex\">\n {/* Sidebar */}\n {(currentView === 'products' || currentView === 'dashboard') && (\n <MarketplaceSidebar\n filters={filters}\n onFiltersChange={onFiltersChange ?? setFilters}\n onClearFilters={onClearFilters ?? resetFilters}\n collapsed={sidebarCollapsed}\n onToggleCollapse={toggleSidebar}\n />\n )}\n\n {/* Main Content */}\n <main className=\"flex-1 p-6\">\n {currentView === 'dashboard' && (\n <MarketplaceDashboard\n featuredProducts={featuredProducts}\n trendingProducts={trendingProducts}\n recentlyViewed={recentlyViewed}\n onProductClick={navigateToProduct}\n onAddToCart={onAddToCart ?? addToCart}\n onViewAllProducts={navigateToProducts}\n />\n )}\n \n {currentView === 'products' && (\n <AllProductsView\n onProductClick={navigateToProduct}\n onAddToCart={onAddToCart ?? addToCart}\n products={productsData}\n filters={filters}\n />\n )}\n \n {currentView === 'product' && selectedProduct && (\n <SingleProductView\n product={\n (() => {\n const found = productsData.find((p: Product) => String(p.id).trim() === String(selectedProduct.id).trim());\n if (!found) {\n console.error(\n \"MarketplaceComponent: No product found for selectedProduct.id:\",\n selectedProduct.id,\n \"Available ids:\",\n productsData.map((p: Product) => p.id)\n );\n }\n return found;\n })()\n }\n onAddToCart={onAddToCart ?? addToCart}\n onBuyNow={handleBuyNow}\n />\n )}\n </main>\n\n {/* Checkout Sidebar */}\n {showCheckout && (\n <div className=\"fixed right-4 top-20 z-50\">\n <CheckoutCompact\n cartItems={cartItems}\n onClose={() => setShowCheckout(false)}\n onCheckout={handleCheckoutComplete}\n />\n </div>\n )}\n </div>\n </div>\n );\n};"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MarketplaceComponent.js","sources":["../../../src/components/Marketplace/MarketplaceComponent.tsx"],"sourcesContent":["import React from 'react';\nimport { sampleProducts } from './data/sampleData';\nimport { MarketplaceHeader } from './components/MarketplaceHeader';\nimport { MarketplaceDashboard } from './components/MarketplaceDashboard';\nimport { MarketplaceSidebar } from './MarketplaceSidebar';\nimport { AllProductsView } from './AllProductsView';\nimport { SingleProductView } from './SingleProductView';\nimport { CheckoutCompact } from './CheckoutCompact';\nimport { useMarketplaceState } from './hooks/useMarketplaceState';\nimport { useCart } from './hooks/useCart';\nimport { useProductNavigation } from './hooks/useProductNavigation';\nimport { useSearch } from './hooks/useSearch';\nimport type { Product, CartItem, FilterOptions } from './types';\nimport { sanitizeProduct } from \"./utils/sanitizeProduct\";\n\n\nexport interface MarketplaceComponentProps {\n userRole?: 'buyer' | 'seller' | 'admin';\n products?: Product[];\n cartItems?: CartItem[];\n filters?: FilterOptions;\n onProductClick?: (product: Product) => void;\n onAddToCart?: (product: Product, quantity?: number) => void;\n onRemoveFromCart?: (productId: string) => void;\n onFiltersChange?: (filters: FilterOptions) => void;\n onClearFilters?: () => void;\n className?: string;\n}\n\n/**\n * Main marketplace component orchestrating all marketplace functionality\n * Refactored to use modular components and custom hooks for better maintainability\n */\nexport const MarketplaceComponent: React.FC<MarketplaceComponentProps> = ({\n userRole = 'buyer',\n products,\n cartItems: cartItemsProp,\n filters: filtersProp,\n onProductClick,\n onAddToCart,\n onRemoveFromCart,\n onFiltersChange,\n onClearFilters,\n className = '',\n}) => {\n // State management hook (fallbacks for backward compatibility)\n const {\n sidebarCollapsed,\n currentView,\n selectedProduct,\n searchQuery,\n cartItems: cartItemsState,\n showCheckout,\n filters: filtersState,\n setSidebarCollapsed,\n setCurrentView,\n setSelectedProduct,\n setSearchQuery,\n setCartItems,\n setShowCheckout,\n setFilters,\n toggleSidebar,\n clearCart,\n resetFilters,\n } = useMarketplaceState();\n\n // Use props if provided, otherwise fallback to internal state/sample data\n \n const rawProductsData: Product[] = products ?? sampleProducts;\n const productsData: Product[] = Array.isArray(rawProductsData)\n ? rawProductsData.map(sanitizeProduct)\n : [];\n const cartItems = cartItemsProp ?? cartItemsState;\n const filters = filtersProp ?? filtersState;\n\n // Cart management hook\n const {\n addToCart,\n removeFromCart,\n updateQuantity,\n getCartTotal,\n getCartItemCount,\n isInCart,\n getCartItem,\n } = useCart({ cartItems, setCartItems });\n\n // Navigation hook\n const {\n navigateToProduct,\n navigateToProducts,\n navigateToDashboard,\n navigateToCheckout,\n } = useProductNavigation({\n setSelectedProduct,\n setCurrentView,\n onProductClick,\n });\n\n // Search hook\n const {\n searchResults,\n isSearching,\n handleSearch,\n clearSearch,\n } = useSearch({\n products: productsData,\n searchQuery,\n setSearchQuery,\n setCurrentView,\n });\n\n // Derived data\n const featuredProducts = productsData.slice(0, 4);\n const trendingProducts = productsData.slice(4, 8);\n const recentlyViewed = productsData.slice(8, 12);\n const cartItemCount = getCartItemCount();\n\n // Event handlers\n const handleCartClick = () => {\n setShowCheckout(!showCheckout);\n };\n\n const handleCheckoutComplete = (items: any[]) => {\n clearCart();\n setShowCheckout(false);\n };\n\n const handleBuyNow = (product: Product, quantity: number) => {\n (onAddToCart ?? addToCart)(product, quantity);\n setShowCheckout(true);\n };\n\n return (\n <div className={`min-h-screen bg-gray-50 ${className}`}>\n {/* Header */}\n <MarketplaceHeader\n searchQuery={searchQuery}\n onSearchChange={handleSearch}\n cartItemCount={cartItemCount}\n onCartClick={handleCartClick}\n onMenuToggle={toggleSidebar}\n userRole={userRole}\n />\n\n <div className=\"flex\">\n {/* Sidebar */}\n {(currentView === 'products' || currentView === 'dashboard') && (\n <MarketplaceSidebar\n filters={filters}\n onFiltersChange={onFiltersChange ?? setFilters}\n onClearFilters={onClearFilters ?? resetFilters}\n collapsed={sidebarCollapsed}\n onToggleCollapse={toggleSidebar}\n />\n )}\n\n {/* Main Content */}\n <main className=\"flex-1 p-6\">\n {currentView === 'dashboard' && (\n <MarketplaceDashboard\n featuredProducts={featuredProducts}\n trendingProducts={trendingProducts}\n recentlyViewed={recentlyViewed}\n onProductClick={navigateToProduct}\n onAddToCart={onAddToCart ?? addToCart}\n onViewAllProducts={navigateToProducts}\n />\n )}\n \n {currentView === 'products' && (\n <AllProductsView\n onProductClick={navigateToProduct}\n onAddToCart={onAddToCart ?? addToCart}\n products={productsData}\n filters={filters}\n />\n )}\n \n {currentView === 'product' && selectedProduct && (\n <SingleProductView\n product={\n (() => {\n const found = productsData.find((p: Product) => String(p.id).trim() === String(selectedProduct.id).trim());\n if (!found) {\n console.error(\n \"MarketplaceComponent: No product found for selectedProduct.id:\",\n selectedProduct.id,\n \"Available ids:\",\n productsData.map((p: Product) => p.id)\n );\n }\n return found;\n })()\n }\n onAddToCart={onAddToCart ?? addToCart}\n onBuyNow={handleBuyNow}\n />\n )}\n </main>\n\n {/* Checkout Sidebar */}\n {showCheckout && (\n <div className=\"fixed right-4 top-20 z-50\">\n <CheckoutCompact\n cartItems={cartItems}\n onClose={() => setShowCheckout(false)}\n onCheckout={handleCheckoutComplete}\n />\n </div>\n )}\n </div>\n </div>\n );\n};"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -8,10 +8,11 @@ import { Avatar, AvatarImage, AvatarFallback } from '../Avatar/Avatar.js';
|
|
|
8
8
|
import { Input } from '../Input/Input.js';
|
|
9
9
|
import { Tabs, TabsList, TabsTrigger, TabsContent } from '../Tabs/Tabs.js';
|
|
10
10
|
import { showToast } from '../Toast/Toast.js';
|
|
11
|
+
import { sampleProducts, sampleReviews } from './data/sampleData.js';
|
|
11
12
|
|
|
12
13
|
const SingleProductView = ({ product, reviews, relatedProducts, onAddToCart, onBuyNow, }) => {
|
|
13
|
-
const productsData =
|
|
14
|
-
const reviewsData =
|
|
14
|
+
const productsData = sampleProducts;
|
|
15
|
+
const reviewsData = sampleReviews;
|
|
15
16
|
// Fallbacks for backward compatibility
|
|
16
17
|
// Defensive: If product is undefined, show a fallback UI instead of crashing
|
|
17
18
|
if (!product && (!productsData || productsData.length === 0)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SingleProductView.js","sources":["../../../src/components/Marketplace/SingleProductView.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { \n Star, \n Heart, \n Share2, \n ShoppingCart, \n Zap, \n Shield, \n Truck, \n RotateCcw,\n ChevronLeft,\n ChevronRight,\n Plus,\n Minus,\n Check,\n ThumbsUp\n} from 'lucide-react';\nimport { Button } from '../Button';\nimport { Card, CardHeader, CardTitle, CardContent } from '../Card';\nimport { Badge } from '../Badge';\nimport { Avatar, AvatarImage, AvatarFallback } from '../Avatar';\nimport { Input } from '../Input';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '../Tabs';\nimport { showToast } from '../Toast';\nimport type { Product, Review } from './types';\nimport { sampleProducts, sampleReviews } from './data/sampleData';\n\ninterface SingleProductViewProps {\n product?: Product;\n reviews?: Review[];\n relatedProducts?: Product[];\n onAddToCart?: (product: Product, quantity: number) => void;\n onBuyNow?: (product: Product, quantity: number) => void;\n}\n\nexport const SingleProductView: React.FC<SingleProductViewProps> = ({\n product,\n reviews,\n relatedProducts,\n onAddToCart,\n onBuyNow,\n}) => {\n const productsData = require('./data/sampleData').sampleProducts;\n const reviewsData = require('./data/sampleData').sampleReviews;\n\n // Fallbacks for backward compatibility\n // Defensive: If product is undefined, show a fallback UI instead of crashing\n if (!product && (!productsData || productsData.length === 0)) {\n return <div className=\"text-red-600\">Product not found.</div>;\n }\n const productData = product ?? productsData[0];\n const reviewsList = reviews ?? reviewsData;\n const relatedProductsList = relatedProducts ?? productsData.slice(1, 5);\n \n // Defensive guards and fallbacks\n const images = Array.isArray(productData.images) && productData.images.length > 0\n ? productData.images\n : [\"/images/placeholder-product.png\"];\n const specifications = productData.specifications && Object.keys(productData.specifications).length > 0\n ? productData.specifications\n : { \"Info\": \"No specifications available\" };\n const vendor = productData.vendor && productData.vendor.name\n ? productData.vendor\n : { id: \"unknown\", name: \"Unknown Vendor\", rating: 0, logo: undefined };\n\n const [selectedImageIndex, setSelectedImageIndex] = useState(0);\n const [quantity, setQuantity] = useState(1);\n const [isWishlisted, setIsWishlisted] = useState(false);\n const [selectedTab, setSelectedTab] = useState('description');\n\n const handleAddToCart = () => {\n onAddToCart?.(productData, quantity);\n showToast.success(`Added ${quantity} item(s) to cart!`);\n };\n\n const handleBuyNow = () => {\n onBuyNow?.(productData, quantity);\n showToast.info('Redirecting to checkout...');\n };\n\n const handleShare = () => {\n navigator.clipboard.writeText(window.location.href);\n showToast.success('Product link copied to clipboard!');\n };\n\n const nextImage = () => {\n setSelectedImageIndex((prev) =>\n prev === productData.images.length - 1 ? 0 : prev + 1\n );\n };\n\n const prevImage = () => {\n setSelectedImageIndex((prev) =>\n prev === 0 ? productData.images.length - 1 : prev - 1\n );\n };\n\n return (\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8\">\n {/* Breadcrumb */}\n <nav className=\"flex items-center space-x-2 text-sm text-gray-600 mb-8\">\n <a href=\"/\" className=\"hover:text-primary-600\">Home</a>\n <span>/</span>\n <a href=\"/products\" className=\"hover:text-primary-600\">Products</a>\n <span>/</span>\n <a href={`/category/${productData.category.toLowerCase()}`} className=\"hover:text-primary-600\">\n {productData.category}\n </a>\n <span>/</span>\n <span className=\"text-gray-900\">{productData.name}</span>\n </nav>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-12\">\n {/* Product Images */}\n <div>\n {/* Main Image */}\n <div className=\"relative aspect-square bg-gray-100 rounded-lg overflow-hidden mb-4\">\n <img\n src={images[selectedImageIndex] ?? \"/images/placeholder-product.png\"}\n alt={productData.name}\n className=\"w-full h-full object-cover\"\n />\n {images.length > 1 && (\n <>\n <button\n onClick={prevImage}\n className=\"absolute left-4 top-1/2 transform -translate-y-1/2 bg-white/80 hover:bg-white rounded-full p-2 shadow-lg transition-colors\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </button>\n <button\n onClick={nextImage}\n className=\"absolute right-4 top-1/2 transform -translate-y-1/2 bg-white/80 hover:bg-white rounded-full p-2 shadow-lg transition-colors\"\n >\n <ChevronRight className=\"h-5 w-5\" />\n </button>\n </>\n )}\n {productData.discount && (\n <Badge variant=\"danger\" className=\"absolute top-4 left-4\">\n -{productData.discount}%\n </Badge>\n )}\n </div>\n\n {/* Thumbnail Images */}\n {images.length > 1 && (\n <div className=\"flex space-x-2 overflow-x-auto\">\n {images.map((image: string, index: number) => (\n <button\n key={index}\n onClick={() => setSelectedImageIndex(index)}\n className={`flex-shrink-0 w-20 h-20 rounded-lg overflow-hidden border-2 transition-colors ${\n selectedImageIndex === index\n ? 'border-primary-500'\n : 'border-gray-200 hover:border-gray-300'\n }`}\n >\n <img\n src={image}\n alt={`${productData.name} ${index + 1}`}\n className=\"w-full h-full object-cover\"\n />\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Product Details */}\n <div>\n {/* Vendor */}\n <div className=\"flex items-center space-x-2 mb-4\">\n <span className=\"text-sm text-gray-600\">Sold by</span>\n <div className=\"flex items-center space-x-2\">\n {vendor.logo ? (\n <Avatar size=\"sm\">\n <AvatarImage src={vendor.logo} />\n <AvatarFallback>{vendor.name[0]}</AvatarFallback>\n </Avatar>\n ) : (\n <Avatar size=\"sm\">\n <AvatarFallback>{vendor.name[0]}</AvatarFallback>\n </Avatar>\n )}\n <span className=\"font-medium text-primary-600\">{vendor.name}</span>\n <div className=\"flex items-center space-x-1\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">{vendor.rating}</span>\n </div>\n </div>\n </div>\n\n {/* Product Title */}\n <h1 className=\"text-3xl font-bold text-gray-900 mb-4\">{productData.name}</h1>\n\n {/* Rating and Reviews */}\n <div className=\"flex items-center space-x-4 mb-6\">\n <div className=\"flex items-center space-x-1\">\n {[1, 2, 3, 4, 5].map((star) => (\n <Star\n key={star}\n className={`h-5 w-5 ${\n star <= Math.floor(productData.rating)\n ? 'text-yellow-400 fill-current'\n : 'text-gray-300'\n }`}\n />\n ))}\n <span className=\"text-lg font-medium text-gray-900 ml-2\">\n {productData.rating}\n </span>\n </div>\n <span className=\"text-gray-600\">({productData.reviewCount} reviews)</span>\n <Badge variant={productData.inStock ? 'success' : 'danger'}>\n {productData.inStock ? 'In Stock' : 'Out of Stock'}\n </Badge>\n </div>\n\n {/* Price */}\n <div className=\"mb-6\">\n <div className=\"flex items-center space-x-3\">\n <span className=\"text-3xl font-bold text-gray-900\">\n ${productData.price.toFixed(2)}\n </span>\n {productData.originalPrice && (\n <span className=\"text-xl text-gray-500 line-through\">\n ${productData.originalPrice.toFixed(2)}\n </span>\n )}\n {productData.discount && (\n <Badge variant=\"danger\">Save {productData.discount}%</Badge>\n )}\n </div>\n </div>\n\n {/* Description */}\n <p className=\"text-gray-600 mb-6 leading-relaxed\">{productData.description}</p>\n\n {/* Quantity and Actions */}\n <div className=\"space-y-4 mb-8\">\n <div className=\"flex items-center space-x-4\">\n <span className=\"font-medium text-gray-900\">Quantity:</span>\n <div className=\"flex items-center border border-gray-300 rounded-lg\">\n <button\n onClick={() => setQuantity(Math.max(1, quantity - 1))}\n className=\"p-2 hover:bg-gray-50 transition-colors\"\n disabled={quantity <= 1}\n >\n <Minus className=\"h-4 w-4\" />\n </button>\n <Input\n type=\"number\"\n value={quantity}\n onChange={(e) => setQuantity(Math.max(1, parseInt(e.target.value) || 1))}\n className=\"w-16 text-center border-0 focus:ring-0\"\n min=\"1\"\n />\n <button\n onClick={() => setQuantity(quantity + 1)}\n className=\"p-2 hover:bg-gray-50 transition-colors\"\n >\n <Plus className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n <div className=\"flex space-x-4\">\n <Button\n variant=\"primary\"\n size=\"lg\"\n onClick={handleAddToCart}\n disabled={!productData.inStock}\n className=\"flex-1\"\n >\n <ShoppingCart className=\"mr-2 h-5 w-5\" />\n Add to Cart\n </Button>\n <Button\n variant=\"secondary\"\n size=\"lg\"\n onClick={handleBuyNow}\n disabled={!productData.inStock}\n className=\"flex-1\"\n >\n <Zap className=\"mr-2 h-5 w-5\" />\n Buy Now\n </Button>\n </div>\n\n <div className=\"flex space-x-2\">\n <Button\n variant=\"outline\"\n onClick={() => setIsWishlisted(!isWishlisted)}\n className=\"flex-1\"\n >\n <Heart className={`mr-2 h-5 w-5 ${isWishlisted ? 'fill-current text-red-500' : ''}`} />\n {isWishlisted ? 'Wishlisted' : 'Add to Wishlist'}\n </Button>\n <Button variant=\"outline\" onClick={handleShare}>\n <Share2 className=\"h-5 w-5\" />\n </Button>\n </div>\n </div>\n\n {/* Features */}\n <div className=\"grid grid-cols-2 gap-4 mb-8\">\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n <Truck className=\"h-4 w-4 text-green-600\" />\n <span>Free shipping</span>\n </div>\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n <RotateCcw className=\"h-4 w-4 text-blue-600\" />\n <span>30-day returns</span>\n </div>\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n <Shield className=\"h-4 w-4 text-purple-600\" />\n <span>2-year warranty</span>\n </div>\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n <Check className=\"h-4 w-4 text-green-600\" />\n <span>Authentic product</span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Product Details Tabs */}\n <div className=\"mt-16\">\n <Tabs value={selectedTab} onValueChange={setSelectedTab}>\n <TabsList>\n <TabsTrigger value=\"description\">Description</TabsTrigger>\n <TabsTrigger value=\"specifications\">Specifications</TabsTrigger>\n <TabsTrigger value=\"reviews\">Reviews ({reviewsList.length})</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"description\" className=\"mt-8\">\n <Card>\n <CardContent className=\"p-8\">\n <h3 className=\"text-xl font-semibold mb-4\">Product Description</h3>\n <div className=\"prose max-w-none\">\n <p className=\"text-gray-600 leading-relaxed mb-4\">\n {productData.description}\n </p>\n <p className=\"text-gray-600 leading-relaxed\">\n This premium product offers exceptional quality and performance, \n designed to meet the highest standards. With advanced features and \n reliable construction, it's perfect for both professional and personal use.\n </p>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"specifications\" className=\"mt-8\">\n <Card>\n <CardContent className=\"p-8\">\n <h3 className=\"text-xl font-semibold mb-4\">Technical Specifications</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {Object.entries(specifications).map(([key, value]) => (\n <div key={key} className=\"flex justify-between py-2 border-b border-gray-100\">\n <span className=\"font-medium text-gray-900\">{key}:</span>\n <span className=\"text-gray-600\">{String(value)}</span>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"reviews\" className=\"mt-8\">\n <div className=\"space-y-6\">\n {/* Reviews Summary */}\n <Card>\n <CardContent className=\"p-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-8\">\n <div>\n <h3 className=\"text-xl font-semibold mb-4\">Customer Reviews</h3>\n <div className=\"flex items-center space-x-4 mb-4\">\n <span className=\"text-4xl font-bold text-gray-900\">\n {productData.rating}\n </span>\n <div>\n <div className=\"flex items-center space-x-1 mb-1\">\n {[1, 2, 3, 4, 5].map((star) => (\n <Star\n key={star}\n className={`h-5 w-5 ${\n star <= Math.floor(productData.rating)\n ? 'text-yellow-400 fill-current'\n : 'text-gray-300'\n }`}\n />\n ))}\n </div>\n <span className=\"text-gray-600\">\n Based on {productData.reviewCount} reviews\n </span>\n </div>\n </div>\n </div>\n <div>\n <Button variant=\"primary\" className=\"w-full\">\n Write a Review\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Individual Reviews */}\n {reviewsList.map((review: Review) => (\n <Card key={review.id}>\n <CardContent className=\"p-6\">\n <div className=\"flex items-start space-x-4\">\n <Avatar>\n <AvatarImage src={review.userAvatar} />\n <AvatarFallback>{review.userName[0]}</AvatarFallback>\n </Avatar>\n <div className=\"flex-1\">\n <div className=\"flex items-center space-x-2 mb-2\">\n <span className=\"font-medium text-gray-900\">{review.userName}</span>\n {review.verified && (\n <Badge variant=\"success\" className=\"text-xs\">\n Verified Purchase\n </Badge>\n )}\n </div>\n <div className=\"flex items-center space-x-2 mb-2\">\n <div className=\"flex items-center space-x-1\">\n {[1, 2, 3, 4, 5].map((star: number) => (\n <Star\n key={star}\n className={`h-4 w-4 ${\n star <= review.rating\n ? 'text-yellow-400 fill-current'\n : 'text-gray-300'\n }`}\n />\n ))}\n </div>\n <span className=\"text-sm text-gray-600\">{review.date}</span>\n </div>\n <h4 className=\"font-medium text-gray-900 mb-2\">{review.title}</h4>\n <p className=\"text-gray-600 mb-4\">{review.comment}</p>\n <div className=\"flex items-center space-x-4\">\n <button className=\"flex items-center space-x-1 text-sm text-gray-600 hover:text-gray-900\">\n <ThumbsUp className=\"h-4 w-4\" />\n <span>Helpful ({review.helpful})</span>\n </button>\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </TabsContent>\n </Tabs>\n </div>\n\n {/* Related Products */}\n <div className=\"mt-16\">\n <h2 className=\"text-2xl font-bold text-gray-900 mb-8\">Related Products</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6\">\n {relatedProductsList.map((relatedProduct: Product) => (\n <Card key={relatedProduct.id} className=\"hover:shadow-lg transition-shadow\">\n <div className=\"aspect-square bg-gray-100 rounded-t-lg overflow-hidden\">\n <img\n src={Array.isArray(relatedProduct.images) && relatedProduct.images.length > 0\n ? relatedProduct.images[0]\n : \"/images/placeholder-product.png\"}\n alt={relatedProduct.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n <CardContent className=\"p-4\">\n <h3 className=\"font-medium text-gray-900 mb-2 line-clamp-2\">\n {relatedProduct.name}\n </h3>\n <div className=\"flex items-center space-x-1 mb-2\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">\n {relatedProduct.rating} ({relatedProduct.reviewCount})\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-lg font-bold text-gray-900\">\n ${relatedProduct.price.toFixed(2)}\n </span>\n <Button size=\"sm\" variant=\"outline\">\n View\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n </div>\n );\n};"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;;;;AAmCO,MAAM,iBAAiB,GAAqC,CAAC,EAClE,OAAO,EACP,OAAO,EACP,eAAe,EACf,WAAW,EACX,QAAQ,GACT,KAAI;IACH,MAAM,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,cAAc;IAChE,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,aAAa;;;AAI9D,IAAA,IAAI,CAAC,OAAO,KAAK,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE;AAC5D,QAAA,OAAOA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,cAAc,mCAAyB;IAC/D;IACA,MAAM,WAAW,GAAG,OAAO,IAAI,YAAY,CAAC,CAAC,CAAC;AAC9C,IAAA,MAAM,WAAW,GAAG,OAAO,IAAI,WAAW;AAC1C,IAAA,MAAM,mBAAmB,GAAG,eAAe,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;;AAGvE,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG;UAC5E,WAAW,CAAC;AACd,UAAE,CAAC,iCAAiC,CAAC;AACvC,IAAA,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG;UAClG,WAAW,CAAC;AACd,UAAE,EAAE,MAAM,EAAE,6BAA6B,EAAE;IAC7C,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC;UACpD,WAAW,CAAC;AACd,UAAE,EAAiB,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;IAEzE,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC/D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC3C,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IACvD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC;IAE7D,MAAM,eAAe,GAAG,MAAK;AAC3B,QAAA,WAAW,GAAG,WAAW,EAAE,QAAQ,CAAC;AACpC,QAAA,SAAS,CAAC,OAAO,CAAC,SAAS,QAAQ,CAAA,iBAAA,CAAmB,CAAC;AACzD,IAAA,CAAC;IAED,MAAM,YAAY,GAAG,MAAK;AACxB,QAAA,QAAQ,GAAG,WAAW,EAAE,QAAQ,CAAC;AACjC,QAAA,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC;AAC9C,IAAA,CAAC;IAED,MAAM,WAAW,GAAG,MAAK;QACvB,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;AACnD,QAAA,SAAS,CAAC,OAAO,CAAC,mCAAmC,CAAC;AACxD,IAAA,CAAC;IAED,MAAM,SAAS,GAAG,MAAK;QACrB,qBAAqB,CAAC,CAAC,IAAI,KACzB,IAAI,KAAK,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CACtD;AACH,IAAA,CAAC;IAED,MAAM,SAAS,GAAG,MAAK;QACrB,qBAAqB,CAAC,CAAC,IAAI,KACzB,IAAI,KAAK,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CACtD;AACH,IAAA,CAAC;IAED,QACEC,cAAK,SAAS,EAAC,6CAA6C,EAAA,QAAA,EAAA,CAE1DA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wDAAwD,EAAA,QAAA,EAAA,CACrED,WAAG,IAAI,EAAC,GAAG,EAAC,SAAS,EAAC,wBAAwB,EAAA,QAAA,EAAA,MAAA,EAAA,CAAS,EACvDA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,GAAA,EAAA,CAAc,EACdA,GAAA,CAAA,GAAA,EAAA,EAAG,IAAI,EAAC,WAAW,EAAC,SAAS,EAAC,wBAAwB,EAAA,QAAA,EAAA,UAAA,EAAA,CAAa,EACnEA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,GAAA,EAAA,CAAc,EACdA,GAAA,CAAA,GAAA,EAAA,EAAG,IAAI,EAAE,CAAA,UAAA,EAAa,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAA,CAAE,EAAE,SAAS,EAAC,wBAAwB,EAAA,QAAA,EAC3F,WAAW,CAAC,QAAQ,GACnB,EACJA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,GAAA,EAAA,CAAc,EACdA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,eAAe,EAAA,QAAA,EAAE,WAAW,CAAC,IAAI,EAAA,CAAQ,CAAA,EAAA,CACrD,EAENC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wCAAwC,EAAA,QAAA,EAAA,CAErDA,IAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CAEEA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oEAAoE,EAAA,QAAA,EAAA,CACjFD,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,MAAM,CAAC,kBAAkB,CAAC,IAAI,iCAAiC,EACpE,GAAG,EAAE,WAAW,CAAC,IAAI,EACrB,SAAS,EAAC,4BAA4B,EAAA,CACtC,EACD,MAAM,CAAC,MAAM,GAAG,CAAC,KAChBC,4BACED,GAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,SAAS,EAClB,SAAS,EAAC,4HAA4H,EAAA,QAAA,EAEtIA,IAAC,WAAW,EAAA,EAAC,SAAS,EAAC,SAAS,GAAG,EAAA,CAC5B,EACTA,GAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,SAAS,EAClB,SAAS,EAAC,6HAA6H,EAAA,QAAA,EAEvIA,GAAA,CAAC,YAAY,EAAA,EAAC,SAAS,EAAC,SAAS,EAAA,CAAG,EAAA,CAC7B,IACR,CACJ,EACA,WAAW,CAAC,QAAQ,KACnBC,IAAA,CAAC,KAAK,EAAA,EAAC,OAAO,EAAC,QAAQ,EAAC,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,CAAA,GAAA,EACrD,WAAW,CAAC,QAAQ,EAAA,GAAA,CAAA,EAAA,CAChB,CACT,CAAA,EAAA,CACG,EAGL,MAAM,CAAC,MAAM,GAAG,CAAC,KAChBD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAa,EAAE,KAAa,MACvCA,GAAA,CAAA,QAAA,EAAA,EAEE,OAAO,EAAE,MAAM,qBAAqB,CAAC,KAAK,CAAC,EAC3C,SAAS,EAAE,CAAA,8EAAA,EACT,kBAAkB,KAAK;AACrB,0CAAE;0CACA,uCACN,CAAA,CAAE,EAAA,QAAA,EAEFA,aACE,GAAG,EAAE,KAAK,EACV,GAAG,EAAE,CAAA,EAAG,WAAW,CAAC,IAAI,CAAA,CAAA,EAAI,KAAK,GAAG,CAAC,CAAA,CAAE,EACvC,SAAS,EAAC,4BAA4B,EAAA,CACtC,EAAA,EAZG,KAAK,CAaH,CACV,CAAC,EAAA,CACE,CACP,CAAA,EAAA,CACG,EAGNC,IAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CAEEA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kCAAkC,aAC/CD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,SAAA,EAAA,CAAe,EACtDC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,CACzC,MAAM,CAAC,IAAI,IACVA,IAAA,CAAC,MAAM,EAAA,EAAC,IAAI,EAAC,IAAI,EAAA,QAAA,EAAA,CACfD,IAAC,WAAW,EAAA,EAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAA,CAAI,EACjCA,IAAC,cAAc,EAAA,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAA,CAAkB,CAAA,EAAA,CAC1C,KAETA,IAAC,MAAM,EAAA,EAAC,IAAI,EAAC,IAAI,EAAA,QAAA,EACfA,GAAA,CAAC,cAAc,EAAA,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAkB,EAAA,CAC1C,CACV,EACDA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,8BAA8B,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,GAAQ,EACnEC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,CAC1CD,IAAC,IAAI,EAAA,EAAC,SAAS,EAAC,sCAAsC,GAAG,EACzDA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAE,MAAM,CAAC,MAAM,GAAQ,CAAA,EAAA,CAC1D,CAAA,EAAA,CACF,IACF,EAGNA,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,uCAAuC,EAAA,QAAA,EAAE,WAAW,CAAC,IAAI,GAAM,EAG7EC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAA,CAC/CA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,CACzC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,MACxBD,GAAA,CAAC,IAAI,EAAA,EAEH,SAAS,EAAE,CAAA,QAAA,EACT,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM;AACnC,sDAAE;sDACA,eACN,CAAA,CAAE,EAAA,EALG,IAAI,CAMT,CACH,CAAC,EACFA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,wCAAwC,YACrD,WAAW,CAAC,MAAM,EAAA,CACd,CAAA,EAAA,CACH,EACNC,IAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,eAAe,EAAA,QAAA,EAAA,CAAA,GAAA,EAAG,WAAW,CAAC,WAAW,iBAAiB,EAC1ED,GAAA,CAAC,KAAK,EAAA,EAAC,OAAO,EAAE,WAAW,CAAC,OAAO,GAAG,SAAS,GAAG,QAAQ,YACvD,WAAW,CAAC,OAAO,GAAG,UAAU,GAAG,cAAc,GAC5C,CAAA,EAAA,CACJ,EAGNA,aAAK,SAAS,EAAC,MAAM,EAAA,QAAA,EACnBC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,aAC1CA,IAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAA,CAAA,GAAA,EAC9C,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,EAAA,CACzB,EACN,WAAW,CAAC,aAAa,KACxBA,IAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,oCAAoC,kBAChD,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IACjC,CACR,EACA,WAAW,CAAC,QAAQ,KACnBA,IAAA,CAAC,KAAK,EAAA,EAAC,OAAO,EAAC,QAAQ,EAAA,QAAA,EAAA,CAAA,OAAA,EAAO,WAAW,CAAC,QAAQ,SAAU,CAC7D,CAAA,EAAA,CACG,GACF,EAGND,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,oCAAoC,YAAE,WAAW,CAAC,WAAW,EAAA,CAAK,EAG/EC,cAAK,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAA,CAC7BA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,CAC1CD,cAAM,SAAS,EAAC,2BAA2B,EAAA,QAAA,EAAA,WAAA,EAAA,CAAiB,EAC5DC,cAAK,SAAS,EAAC,qDAAqD,EAAA,QAAA,EAAA,CAClED,GAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,EACrD,SAAS,EAAC,wCAAwC,EAClD,QAAQ,EAAE,QAAQ,IAAI,CAAC,EAAA,QAAA,EAEvBA,GAAA,CAAC,KAAK,EAAA,EAAC,SAAS,EAAC,SAAS,EAAA,CAAG,EAAA,CACtB,EACTA,GAAA,CAAC,KAAK,IACJ,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EACxE,SAAS,EAAC,wCAAwC,EAClD,GAAG,EAAC,GAAG,EAAA,CACP,EACFA,GAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,MAAM,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC,EACxC,SAAS,EAAC,wCAAwC,EAAA,QAAA,EAElDA,IAAC,IAAI,EAAA,EAAC,SAAS,EAAC,SAAS,GAAG,EAAA,CACrB,CAAA,EAAA,CACL,IACF,EAENC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gBAAgB,aAC7BA,IAAA,CAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,CAAC,WAAW,CAAC,OAAO,EAC9B,SAAS,EAAC,QAAQ,EAAA,QAAA,EAAA,CAElBD,GAAA,CAAC,YAAY,EAAA,EAAC,SAAS,EAAC,cAAc,EAAA,CAAG,mBAElC,EACTC,IAAA,CAAC,MAAM,EAAA,EACL,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,CAAC,WAAW,CAAC,OAAO,EAC9B,SAAS,EAAC,QAAQ,EAAA,QAAA,EAAA,CAElBD,IAAC,GAAG,EAAA,EAAC,SAAS,EAAC,cAAc,GAAG,EAAA,SAAA,CAAA,EAAA,CAEzB,CAAA,EAAA,CACL,EAENC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAA,CAC7BA,KAAC,MAAM,EAAA,EACL,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,MAAM,eAAe,CAAC,CAAC,YAAY,CAAC,EAC7C,SAAS,EAAC,QAAQ,aAElBD,GAAA,CAAC,KAAK,IAAC,SAAS,EAAE,gBAAgB,YAAY,GAAG,2BAA2B,GAAG,EAAE,EAAE,EAAA,CAAI,EACtF,YAAY,GAAG,YAAY,GAAG,iBAAiB,IACzC,EACTA,GAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,WAAW,YAC5CA,GAAA,CAAC,MAAM,IAAC,SAAS,EAAC,SAAS,EAAA,CAAG,EAAA,CACvB,IACL,CAAA,EAAA,CACF,EAGNC,cAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,CAC1CA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mDAAmD,aAChED,GAAA,CAAC,KAAK,IAAC,SAAS,EAAC,wBAAwB,EAAA,CAAG,EAC5CA,0CAA0B,CAAA,EAAA,CACtB,EACNC,cAAK,SAAS,EAAC,mDAAmD,EAAA,QAAA,EAAA,CAChED,GAAA,CAAC,SAAS,EAAA,EAAC,SAAS,EAAC,uBAAuB,EAAA,CAAG,EAC/CA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,CAA2B,CAAA,EAAA,CACvB,EACNC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mDAAmD,EAAA,QAAA,EAAA,CAChED,IAAC,MAAM,EAAA,EAAC,SAAS,EAAC,yBAAyB,GAAG,EAC9CA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,CAA4B,IACxB,EACNC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mDAAmD,EAAA,QAAA,EAAA,CAChED,IAAC,KAAK,EAAA,EAAC,SAAS,EAAC,wBAAwB,GAAG,EAC5CA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,CAA8B,IAC1B,CAAA,EAAA,CACF,CAAA,EAAA,CACF,IACF,EAGNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,OAAO,YACpBC,IAAA,CAAC,IAAI,IAAC,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAA,QAAA,EAAA,CACrDA,KAAC,QAAQ,EAAA,EAAA,QAAA,EAAA,CACPD,IAAC,WAAW,EAAA,EAAC,KAAK,EAAC,aAAa,4BAA0B,EAC1DA,GAAA,CAAC,WAAW,EAAA,EAAC,KAAK,EAAC,gBAAgB,EAAA,QAAA,EAAA,gBAAA,EAAA,CAA6B,EAChEC,KAAC,WAAW,EAAA,EAAC,KAAK,EAAC,SAAS,0BAAW,WAAW,CAAC,MAAM,EAAA,GAAA,CAAA,EAAA,CAAgB,CAAA,EAAA,CAChE,EAEXD,GAAA,CAAC,WAAW,IAAC,KAAK,EAAC,aAAa,EAAC,SAAS,EAAC,MAAM,EAAA,QAAA,EAC/CA,IAAC,IAAI,EAAA,EAAA,QAAA,EACHC,KAAC,WAAW,EAAA,EAAC,SAAS,EAAC,KAAK,aAC1BD,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,qBAAA,EAAA,CAAyB,EACnEC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kBAAkB,EAAA,QAAA,EAAA,CAC/BD,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,oCAAoC,YAC9C,WAAW,CAAC,WAAW,EAAA,CACtB,EACJA,WAAG,SAAS,EAAC,+BAA+B,EAAA,QAAA,EAAA,iNAAA,EAAA,CAIxC,CAAA,EAAA,CACA,IACM,EAAA,CACT,EAAA,CACK,EAEdA,GAAA,CAAC,WAAW,IAAC,KAAK,EAAC,gBAAgB,EAAC,SAAS,EAAC,MAAM,EAAA,QAAA,EAClDA,IAAC,IAAI,EAAA,EAAA,QAAA,EACHC,KAAC,WAAW,EAAA,EAAC,SAAS,EAAC,KAAK,aAC1BD,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,0BAAA,EAAA,CAA8B,EACxEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uCAAuC,EAAA,QAAA,EACnD,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAC/CC,cAAe,SAAS,EAAC,oDAAoD,EAAA,QAAA,EAAA,CAC3EA,IAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,2BAA2B,aAAE,GAAG,EAAA,GAAA,CAAA,EAAA,CAAS,EACzDD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,eAAe,EAAA,QAAA,EAAE,MAAM,CAAC,KAAK,CAAC,EAAA,CAAQ,CAAA,EAAA,EAF9C,GAAG,CAGP,CACP,CAAC,EAAA,CACE,CAAA,EAAA,CACM,EAAA,CACT,GACK,EAEdA,GAAA,CAAC,WAAW,EAAA,EAAC,KAAK,EAAC,SAAS,EAAC,SAAS,EAAC,MAAM,YAC3CC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CAExBD,IAAC,IAAI,EAAA,EAAA,QAAA,EACHA,IAAC,WAAW,EAAA,EAAC,SAAS,EAAC,KAAK,YAC1BC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uCAAuC,EAAA,QAAA,EAAA,CACpDA,yBACED,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,kBAAA,EAAA,CAAsB,EAChEC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAA,CAC/CD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,kCAAkC,YAC/C,WAAW,CAAC,MAAM,EAAA,CACd,EACPC,yBACED,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAC9C,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,MACxBA,GAAA,CAAC,IAAI,EAAA,EAEH,SAAS,EAAE,CAAA,QAAA,EACT,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM;AACnC,0FAAE;AACF,0FAAE,eACN,CAAA,CAAE,EAAA,EALG,IAAI,CAMT,CACH,CAAC,EAAA,CACE,EACNC,eAAM,SAAS,EAAC,eAAe,EAAA,QAAA,EAAA,CAAA,WAAA,EACnB,WAAW,CAAC,WAAW,EAAA,UAAA,CAAA,EAAA,CAC5B,CAAA,EAAA,CACH,CAAA,EAAA,CACF,IACF,EACND,GAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EACEA,IAAC,MAAM,EAAA,EAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,QAAQ,EAAA,QAAA,EAAA,gBAAA,EAAA,CAEnC,GACL,CAAA,EAAA,CACF,EAAA,CACM,GACT,EAGN,WAAW,CAAC,GAAG,CAAC,CAAC,MAAc,MAC9BA,GAAA,CAAC,IAAI,EAAA,EAAA,QAAA,EACHA,IAAC,WAAW,EAAA,EAAC,SAAS,EAAC,KAAK,YAC1BC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,aACzCA,IAAA,CAAC,MAAM,eACLD,GAAA,CAAC,WAAW,IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAA,CAAI,EACvCA,IAAC,cAAc,EAAA,EAAA,QAAA,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAA,CAAkB,CAAA,EAAA,CAC9C,EACTC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,QAAQ,EAAA,QAAA,EAAA,CACrBA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kCAAkC,aAC/CD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,2BAA2B,EAAA,QAAA,EAAE,MAAM,CAAC,QAAQ,EAAA,CAAQ,EACnE,MAAM,CAAC,QAAQ,KACdA,GAAA,CAAC,KAAK,EAAA,EAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAA,QAAA,EAAA,mBAAA,EAAA,CAEpC,CACT,CAAA,EAAA,CACG,EACNC,cAAK,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAA,CAC/CD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EACzC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAY,MAChCA,GAAA,CAAC,IAAI,EAAA,EAEH,SAAS,EAAE,CAAA,QAAA,EACT,IAAI,IAAI,MAAM,CAAC;AACb,kFAAE;AACF,kFAAE,eACN,CAAA,CAAE,EAAA,EALG,IAAI,CAMT,CACH,CAAC,EAAA,CACE,EACNA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,EAAA,CAAQ,CAAA,EAAA,CACxD,EACNA,YAAI,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAAE,MAAM,CAAC,KAAK,EAAA,CAAM,EAClEA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAAE,MAAM,CAAC,OAAO,EAAA,CAAK,EACtDA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAC1CC,IAAA,CAAA,QAAA,EAAA,EAAQ,SAAS,EAAC,uEAAuE,EAAA,QAAA,EAAA,CACvFD,GAAA,CAAC,QAAQ,EAAA,EAAC,SAAS,EAAC,SAAS,EAAA,CAAG,EAChCC,IAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAgB,MAAM,CAAC,OAAO,EAAA,GAAA,CAAA,EAAA,CAAS,CAAA,EAAA,CAChC,GACL,CAAA,EAAA,CACF,CAAA,EAAA,CACF,EAAA,CACM,EAAA,EAzCL,MAAM,CAAC,EAAE,CA0Cb,CACR,CAAC,CAAA,EAAA,CACE,EAAA,CACM,CAAA,EAAA,CACT,EAAA,CACH,EAGNA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,OAAO,EAAA,QAAA,EAAA,CACpBD,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,uCAAuC,EAAA,QAAA,EAAA,kBAAA,EAAA,CAAsB,EAC3EA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,sDAAsD,EAAA,QAAA,EAClE,mBAAmB,CAAC,GAAG,CAAC,CAAC,cAAuB,MAC/CC,IAAA,CAAC,IAAI,IAAyB,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CACzED,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wDAAwD,YACrEA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,GAAG;AAC1E,8CAAE,cAAc,CAAC,MAAM,CAAC,CAAC;8CACvB,iCAAiC,EACrC,GAAG,EAAE,cAAc,CAAC,IAAI,EACxB,SAAS,EAAC,4BAA4B,EAAA,CACtC,EAAA,CACE,EACNC,IAAA,CAAC,WAAW,EAAA,EAAC,SAAS,EAAC,KAAK,EAAA,QAAA,EAAA,CAC1BD,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,6CAA6C,EAAA,QAAA,EACxD,cAAc,CAAC,IAAI,EAAA,CACjB,EACLC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAA,CAC/CD,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,sCAAsC,EAAA,CAAG,EACzDC,eAAM,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,CACpC,cAAc,CAAC,MAAM,EAAA,IAAA,EAAI,cAAc,CAAC,WAAW,EAAA,GAAA,CAAA,EAAA,CAC/C,IACH,EACNA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAChDA,eAAM,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAAA,CAAA,GAAA,EAC7C,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,EAAA,CAC5B,EACPD,GAAA,CAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,SAAS,EAAA,QAAA,EAAA,MAAA,EAAA,CAE1B,CAAA,EAAA,CACL,IACM,CAAA,EAAA,EA5BL,cAAc,CAAC,EAAE,CA6BrB,CACR,CAAC,EAAA,CACE,CAAA,EAAA,CACF,CAAA,EAAA,CACF;AAEV;;;;"}
|
|
1
|
+
{"version":3,"file":"SingleProductView.js","sources":["../../../src/components/Marketplace/SingleProductView.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { \n Star, \n Heart, \n Share2, \n ShoppingCart, \n Zap, \n Shield, \n Truck, \n RotateCcw,\n ChevronLeft,\n ChevronRight,\n Plus,\n Minus,\n Check,\n ThumbsUp\n} from 'lucide-react';\nimport { Button } from '../Button';\nimport { Card, CardHeader, CardTitle, CardContent } from '../Card';\nimport { Badge } from '../Badge';\nimport { Avatar, AvatarImage, AvatarFallback } from '../Avatar';\nimport { Input } from '../Input';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '../Tabs';\nimport { showToast } from '../Toast';\nimport type { Product, Review } from './types';\nimport { sampleProducts, sampleReviews } from './data/sampleData';\n\ninterface SingleProductViewProps {\n product?: Product;\n reviews?: Review[];\n relatedProducts?: Product[];\n onAddToCart?: (product: Product, quantity: number) => void;\n onBuyNow?: (product: Product, quantity: number) => void;\n}\n\nexport const SingleProductView: React.FC<SingleProductViewProps> = ({\n product,\n reviews,\n relatedProducts,\n onAddToCart,\n onBuyNow,\n}) => {\n const productsData = sampleProducts;\n const reviewsData = sampleReviews;\n\n // Fallbacks for backward compatibility\n // Defensive: If product is undefined, show a fallback UI instead of crashing\n if (!product && (!productsData || productsData.length === 0)) {\n return <div className=\"text-red-600\">Product not found.</div>;\n }\n const productData = product ?? productsData[0];\n const reviewsList = reviews ?? reviewsData;\n const relatedProductsList = relatedProducts ?? productsData.slice(1, 5);\n \n // Defensive guards and fallbacks\n const images = Array.isArray(productData.images) && productData.images.length > 0\n ? productData.images\n : [\"/images/placeholder-product.png\"];\n const specifications = productData.specifications && Object.keys(productData.specifications).length > 0\n ? productData.specifications\n : { \"Info\": \"No specifications available\" };\n const vendor = productData.vendor && productData.vendor.name\n ? productData.vendor\n : { id: \"unknown\", name: \"Unknown Vendor\", rating: 0, logo: undefined };\n\n const [selectedImageIndex, setSelectedImageIndex] = useState(0);\n const [quantity, setQuantity] = useState(1);\n const [isWishlisted, setIsWishlisted] = useState(false);\n const [selectedTab, setSelectedTab] = useState('description');\n\n const handleAddToCart = () => {\n onAddToCart?.(productData, quantity);\n showToast.success(`Added ${quantity} item(s) to cart!`);\n };\n\n const handleBuyNow = () => {\n onBuyNow?.(productData, quantity);\n showToast.info('Redirecting to checkout...');\n };\n\n const handleShare = () => {\n navigator.clipboard.writeText(window.location.href);\n showToast.success('Product link copied to clipboard!');\n };\n\n const nextImage = () => {\n setSelectedImageIndex((prev) =>\n prev === productData.images.length - 1 ? 0 : prev + 1\n );\n };\n\n const prevImage = () => {\n setSelectedImageIndex((prev) =>\n prev === 0 ? productData.images.length - 1 : prev - 1\n );\n };\n\n return (\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8\">\n {/* Breadcrumb */}\n <nav className=\"flex items-center space-x-2 text-sm text-gray-600 mb-8\">\n <a href=\"/\" className=\"hover:text-primary-600\">Home</a>\n <span>/</span>\n <a href=\"/products\" className=\"hover:text-primary-600\">Products</a>\n <span>/</span>\n <a href={`/category/${productData.category.toLowerCase()}`} className=\"hover:text-primary-600\">\n {productData.category}\n </a>\n <span>/</span>\n <span className=\"text-gray-900\">{productData.name}</span>\n </nav>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-12\">\n {/* Product Images */}\n <div>\n {/* Main Image */}\n <div className=\"relative aspect-square bg-gray-100 rounded-lg overflow-hidden mb-4\">\n <img\n src={images[selectedImageIndex] ?? \"/images/placeholder-product.png\"}\n alt={productData.name}\n className=\"w-full h-full object-cover\"\n />\n {images.length > 1 && (\n <>\n <button\n onClick={prevImage}\n className=\"absolute left-4 top-1/2 transform -translate-y-1/2 bg-white/80 hover:bg-white rounded-full p-2 shadow-lg transition-colors\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </button>\n <button\n onClick={nextImage}\n className=\"absolute right-4 top-1/2 transform -translate-y-1/2 bg-white/80 hover:bg-white rounded-full p-2 shadow-lg transition-colors\"\n >\n <ChevronRight className=\"h-5 w-5\" />\n </button>\n </>\n )}\n {productData.discount && (\n <Badge variant=\"danger\" className=\"absolute top-4 left-4\">\n -{productData.discount}%\n </Badge>\n )}\n </div>\n\n {/* Thumbnail Images */}\n {images.length > 1 && (\n <div className=\"flex space-x-2 overflow-x-auto\">\n {images.map((image: string, index: number) => (\n <button\n key={index}\n onClick={() => setSelectedImageIndex(index)}\n className={`flex-shrink-0 w-20 h-20 rounded-lg overflow-hidden border-2 transition-colors ${\n selectedImageIndex === index\n ? 'border-primary-500'\n : 'border-gray-200 hover:border-gray-300'\n }`}\n >\n <img\n src={image}\n alt={`${productData.name} ${index + 1}`}\n className=\"w-full h-full object-cover\"\n />\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Product Details */}\n <div>\n {/* Vendor */}\n <div className=\"flex items-center space-x-2 mb-4\">\n <span className=\"text-sm text-gray-600\">Sold by</span>\n <div className=\"flex items-center space-x-2\">\n {vendor.logo ? (\n <Avatar size=\"sm\">\n <AvatarImage src={vendor.logo} />\n <AvatarFallback>{vendor.name[0]}</AvatarFallback>\n </Avatar>\n ) : (\n <Avatar size=\"sm\">\n <AvatarFallback>{vendor.name[0]}</AvatarFallback>\n </Avatar>\n )}\n <span className=\"font-medium text-primary-600\">{vendor.name}</span>\n <div className=\"flex items-center space-x-1\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">{vendor.rating}</span>\n </div>\n </div>\n </div>\n\n {/* Product Title */}\n <h1 className=\"text-3xl font-bold text-gray-900 mb-4\">{productData.name}</h1>\n\n {/* Rating and Reviews */}\n <div className=\"flex items-center space-x-4 mb-6\">\n <div className=\"flex items-center space-x-1\">\n {[1, 2, 3, 4, 5].map((star) => (\n <Star\n key={star}\n className={`h-5 w-5 ${\n star <= Math.floor(productData.rating)\n ? 'text-yellow-400 fill-current'\n : 'text-gray-300'\n }`}\n />\n ))}\n <span className=\"text-lg font-medium text-gray-900 ml-2\">\n {productData.rating}\n </span>\n </div>\n <span className=\"text-gray-600\">({productData.reviewCount} reviews)</span>\n <Badge variant={productData.inStock ? 'success' : 'danger'}>\n {productData.inStock ? 'In Stock' : 'Out of Stock'}\n </Badge>\n </div>\n\n {/* Price */}\n <div className=\"mb-6\">\n <div className=\"flex items-center space-x-3\">\n <span className=\"text-3xl font-bold text-gray-900\">\n ${productData.price.toFixed(2)}\n </span>\n {productData.originalPrice && (\n <span className=\"text-xl text-gray-500 line-through\">\n ${productData.originalPrice.toFixed(2)}\n </span>\n )}\n {productData.discount && (\n <Badge variant=\"danger\">Save {productData.discount}%</Badge>\n )}\n </div>\n </div>\n\n {/* Description */}\n <p className=\"text-gray-600 mb-6 leading-relaxed\">{productData.description}</p>\n\n {/* Quantity and Actions */}\n <div className=\"space-y-4 mb-8\">\n <div className=\"flex items-center space-x-4\">\n <span className=\"font-medium text-gray-900\">Quantity:</span>\n <div className=\"flex items-center border border-gray-300 rounded-lg\">\n <button\n onClick={() => setQuantity(Math.max(1, quantity - 1))}\n className=\"p-2 hover:bg-gray-50 transition-colors\"\n disabled={quantity <= 1}\n >\n <Minus className=\"h-4 w-4\" />\n </button>\n <Input\n type=\"number\"\n value={quantity}\n onChange={(e) => setQuantity(Math.max(1, parseInt(e.target.value) || 1))}\n className=\"w-16 text-center border-0 focus:ring-0\"\n min=\"1\"\n />\n <button\n onClick={() => setQuantity(quantity + 1)}\n className=\"p-2 hover:bg-gray-50 transition-colors\"\n >\n <Plus className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n <div className=\"flex space-x-4\">\n <Button\n variant=\"primary\"\n size=\"lg\"\n onClick={handleAddToCart}\n disabled={!productData.inStock}\n className=\"flex-1\"\n >\n <ShoppingCart className=\"mr-2 h-5 w-5\" />\n Add to Cart\n </Button>\n <Button\n variant=\"secondary\"\n size=\"lg\"\n onClick={handleBuyNow}\n disabled={!productData.inStock}\n className=\"flex-1\"\n >\n <Zap className=\"mr-2 h-5 w-5\" />\n Buy Now\n </Button>\n </div>\n\n <div className=\"flex space-x-2\">\n <Button\n variant=\"outline\"\n onClick={() => setIsWishlisted(!isWishlisted)}\n className=\"flex-1\"\n >\n <Heart className={`mr-2 h-5 w-5 ${isWishlisted ? 'fill-current text-red-500' : ''}`} />\n {isWishlisted ? 'Wishlisted' : 'Add to Wishlist'}\n </Button>\n <Button variant=\"outline\" onClick={handleShare}>\n <Share2 className=\"h-5 w-5\" />\n </Button>\n </div>\n </div>\n\n {/* Features */}\n <div className=\"grid grid-cols-2 gap-4 mb-8\">\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n <Truck className=\"h-4 w-4 text-green-600\" />\n <span>Free shipping</span>\n </div>\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n <RotateCcw className=\"h-4 w-4 text-blue-600\" />\n <span>30-day returns</span>\n </div>\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n <Shield className=\"h-4 w-4 text-purple-600\" />\n <span>2-year warranty</span>\n </div>\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n <Check className=\"h-4 w-4 text-green-600\" />\n <span>Authentic product</span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Product Details Tabs */}\n <div className=\"mt-16\">\n <Tabs value={selectedTab} onValueChange={setSelectedTab}>\n <TabsList>\n <TabsTrigger value=\"description\">Description</TabsTrigger>\n <TabsTrigger value=\"specifications\">Specifications</TabsTrigger>\n <TabsTrigger value=\"reviews\">Reviews ({reviewsList.length})</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"description\" className=\"mt-8\">\n <Card>\n <CardContent className=\"p-8\">\n <h3 className=\"text-xl font-semibold mb-4\">Product Description</h3>\n <div className=\"prose max-w-none\">\n <p className=\"text-gray-600 leading-relaxed mb-4\">\n {productData.description}\n </p>\n <p className=\"text-gray-600 leading-relaxed\">\n This premium product offers exceptional quality and performance, \n designed to meet the highest standards. With advanced features and \n reliable construction, it's perfect for both professional and personal use.\n </p>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"specifications\" className=\"mt-8\">\n <Card>\n <CardContent className=\"p-8\">\n <h3 className=\"text-xl font-semibold mb-4\">Technical Specifications</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {Object.entries(specifications).map(([key, value]) => (\n <div key={key} className=\"flex justify-between py-2 border-b border-gray-100\">\n <span className=\"font-medium text-gray-900\">{key}:</span>\n <span className=\"text-gray-600\">{String(value)}</span>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"reviews\" className=\"mt-8\">\n <div className=\"space-y-6\">\n {/* Reviews Summary */}\n <Card>\n <CardContent className=\"p-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-8\">\n <div>\n <h3 className=\"text-xl font-semibold mb-4\">Customer Reviews</h3>\n <div className=\"flex items-center space-x-4 mb-4\">\n <span className=\"text-4xl font-bold text-gray-900\">\n {productData.rating}\n </span>\n <div>\n <div className=\"flex items-center space-x-1 mb-1\">\n {[1, 2, 3, 4, 5].map((star) => (\n <Star\n key={star}\n className={`h-5 w-5 ${\n star <= Math.floor(productData.rating)\n ? 'text-yellow-400 fill-current'\n : 'text-gray-300'\n }`}\n />\n ))}\n </div>\n <span className=\"text-gray-600\">\n Based on {productData.reviewCount} reviews\n </span>\n </div>\n </div>\n </div>\n <div>\n <Button variant=\"primary\" className=\"w-full\">\n Write a Review\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Individual Reviews */}\n {reviewsList.map((review: Review) => (\n <Card key={review.id}>\n <CardContent className=\"p-6\">\n <div className=\"flex items-start space-x-4\">\n <Avatar>\n <AvatarImage src={review.userAvatar} />\n <AvatarFallback>{review.userName[0]}</AvatarFallback>\n </Avatar>\n <div className=\"flex-1\">\n <div className=\"flex items-center space-x-2 mb-2\">\n <span className=\"font-medium text-gray-900\">{review.userName}</span>\n {review.verified && (\n <Badge variant=\"success\" className=\"text-xs\">\n Verified Purchase\n </Badge>\n )}\n </div>\n <div className=\"flex items-center space-x-2 mb-2\">\n <div className=\"flex items-center space-x-1\">\n {[1, 2, 3, 4, 5].map((star: number) => (\n <Star\n key={star}\n className={`h-4 w-4 ${\n star <= review.rating\n ? 'text-yellow-400 fill-current'\n : 'text-gray-300'\n }`}\n />\n ))}\n </div>\n <span className=\"text-sm text-gray-600\">{review.date}</span>\n </div>\n <h4 className=\"font-medium text-gray-900 mb-2\">{review.title}</h4>\n <p className=\"text-gray-600 mb-4\">{review.comment}</p>\n <div className=\"flex items-center space-x-4\">\n <button className=\"flex items-center space-x-1 text-sm text-gray-600 hover:text-gray-900\">\n <ThumbsUp className=\"h-4 w-4\" />\n <span>Helpful ({review.helpful})</span>\n </button>\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </TabsContent>\n </Tabs>\n </div>\n\n {/* Related Products */}\n <div className=\"mt-16\">\n <h2 className=\"text-2xl font-bold text-gray-900 mb-8\">Related Products</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6\">\n {relatedProductsList.map((relatedProduct: Product) => (\n <Card key={relatedProduct.id} className=\"hover:shadow-lg transition-shadow\">\n <div className=\"aspect-square bg-gray-100 rounded-t-lg overflow-hidden\">\n <img\n src={Array.isArray(relatedProduct.images) && relatedProduct.images.length > 0\n ? relatedProduct.images[0]\n : \"/images/placeholder-product.png\"}\n alt={relatedProduct.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n <CardContent className=\"p-4\">\n <h3 className=\"font-medium text-gray-900 mb-2 line-clamp-2\">\n {relatedProduct.name}\n </h3>\n <div className=\"flex items-center space-x-1 mb-2\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">\n {relatedProduct.rating} ({relatedProduct.reviewCount})\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-lg font-bold text-gray-900\">\n ${relatedProduct.price.toFixed(2)}\n </span>\n <Button size=\"sm\" variant=\"outline\">\n View\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n </div>\n );\n};"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -111,6 +111,43 @@ const sampleProducts = [
|
|
|
111
111
|
},
|
|
112
112
|
})),
|
|
113
113
|
];
|
|
114
|
+
const sampleReviews = [
|
|
115
|
+
{
|
|
116
|
+
id: '1',
|
|
117
|
+
userId: 'u1',
|
|
118
|
+
userName: 'John Smith',
|
|
119
|
+
userAvatar: 'https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64',
|
|
120
|
+
rating: 5,
|
|
121
|
+
title: 'Excellent quality!',
|
|
122
|
+
comment: 'These headphones exceeded my expectations. The sound quality is amazing and the noise cancellation works perfectly.',
|
|
123
|
+
date: '2024-01-15',
|
|
124
|
+
helpful: 12,
|
|
125
|
+
verified: true,
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
id: '2',
|
|
129
|
+
userId: 'u2',
|
|
130
|
+
userName: 'Sarah Johnson',
|
|
131
|
+
userAvatar: 'https://images.pexels.com/photos/415829/pexels-photo-415829.jpeg?auto=compress&cs=tinysrgb&w=64',
|
|
132
|
+
rating: 4,
|
|
133
|
+
title: 'Great value for money',
|
|
134
|
+
comment: 'Good headphones for the price. Battery life is as advertised and they are comfortable to wear.',
|
|
135
|
+
date: '2024-01-10',
|
|
136
|
+
helpful: 8,
|
|
137
|
+
verified: true,
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
id: '3',
|
|
141
|
+
userId: 'u3',
|
|
142
|
+
userName: 'Mike Wilson',
|
|
143
|
+
rating: 5,
|
|
144
|
+
title: 'Perfect for work',
|
|
145
|
+
comment: 'Use these daily for work calls and music. The noise cancellation is a game changer in the office.',
|
|
146
|
+
date: '2024-01-05',
|
|
147
|
+
helpful: 15,
|
|
148
|
+
verified: false,
|
|
149
|
+
},
|
|
150
|
+
];
|
|
114
151
|
|
|
115
|
-
export { sampleProducts };
|
|
152
|
+
export { sampleProducts, sampleReviews };
|
|
116
153
|
//# sourceMappingURL=sampleData.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sampleData.js","sources":["../../../../src/components/Marketplace/data/sampleData.ts"],"sourcesContent":["import { Product, Review } from '../types';\n\n// Sample product data for demonstration\nexport const sampleProducts: Product[] = [\n {\n id: '1',\n name: 'Premium Wireless Headphones',\n description: 'High-quality wireless headphones with active noise cancellation and 30-hour battery life.',\n price: 299.99,\n originalPrice: 399.99,\n discount: 25,\n images: [\n 'https://images.pexels.com/photos/3394650/pexels-photo-3394650.jpeg?auto=compress&cs=tinysrgb&w=800',\n 'https://images.pexels.com/photos/1649771/pexels-photo-1649771.jpeg?auto=compress&cs=tinysrgb&w=800',\n 'https://images.pexels.com/photos/1649772/pexels-photo-1649772.jpeg?auto=compress&cs=tinysrgb&w=800',\n ],\n category: 'Electronics',\n brand: 'AudioTech',\n rating: 4.5,\n reviewCount: 128,\n inStock: true,\n specifications: {\n 'Battery Life': '30 hours',\n 'Connectivity': 'Bluetooth 5.0',\n 'Weight': '250g',\n 'Noise Cancellation': 'Active',\n 'Warranty': '2 years',\n },\n tags: ['wireless', 'noise-cancelling', 'premium'],\n vendor: {\n id: 'v1',\n name: 'AudioTech Store',\n rating: 4.8,\n logo: 'https://images.pexels.com/photos/1649771/pexels-photo-1649771.jpeg?auto=compress&cs=tinysrgb&w=64',\n },\n },\n {\n id: '2',\n name: 'Smart Fitness Watch',\n description: 'Advanced fitness tracking with heart rate monitoring, GPS, and 7-day battery life.',\n price: 199.99,\n images: [\n 'https://images.pexels.com/photos/437037/pexels-photo-437037.jpeg?auto=compress&cs=tinysrgb&w=800',\n 'https://images.pexels.com/photos/437038/pexels-photo-437038.jpeg?auto=compress&cs=tinysrgb&w=800',\n ],\n category: 'Wearables',\n brand: 'FitTech',\n rating: 4.3,\n reviewCount: 89,\n inStock: true,\n specifications: {\n 'Battery Life': '7 days',\n 'Display': '1.4\" AMOLED',\n 'Water Resistance': '5ATM',\n 'GPS': 'Built-in',\n 'Sensors': 'Heart Rate, SpO2, Accelerometer',\n },\n tags: ['fitness', 'smartwatch', 'gps'],\n vendor: {\n id: 'v2',\n name: 'FitTech Official',\n rating: 4.6,\n },\n },\n {\n id: '3',\n name: 'Professional Camera Lens',\n description: '85mm f/1.4 portrait lens with exceptional image quality and beautiful bokeh.',\n price: 899.99,\n images: [\n 'https://images.pexels.com/photos/90946/pexels-photo-90946.jpeg?auto=compress&cs=tinysrgb&w=800',\n ],\n category: 'Photography',\n brand: 'LensMaster',\n rating: 4.8,\n reviewCount: 45,\n inStock: false,\n specifications: {\n 'Focal Length': '85mm',\n 'Aperture': 'f/1.4',\n 'Mount': 'Canon EF',\n 'Weight': '950g',\n 'Filter Size': '77mm',\n },\n tags: ['portrait', 'professional', 'bokeh'],\n vendor: {\n id: 'v3',\n name: 'Camera World',\n rating: 4.9,\n },\n },\n // Add more sample products...\n ...Array.from({ length: 20 }, (_, i) => ({\n id: `${i + 4}`,\n name: `Product ${i + 4}`,\n description: `Description for product ${i + 4}`,\n price: Math.floor(Math.random() * 500) + 50,\n images: [`https://images.pexels.com/photos/${1000000 + i}/pexels-photo-${1000000 + i}.jpeg?auto=compress&cs=tinysrgb&w=800`],\n category: ['Electronics', 'Clothing', 'Home', 'Sports'][Math.floor(Math.random() * 4)],\n brand: ['Brand A', 'Brand B', 'Brand C'][Math.floor(Math.random() * 3)],\n rating: Math.round((Math.random() * 2 + 3) * 10) / 10,\n reviewCount: Math.floor(Math.random() * 200) + 10,\n inStock: Math.random() > 0.2,\n specifications: {\n 'Feature 1': 'Value 1',\n 'Feature 2': 'Value 2',\n },\n tags: ['tag1', 'tag2'],\n vendor: {\n id: `v${i + 4}`,\n name: `Vendor ${i + 4}`,\n rating: Math.round((Math.random() * 1 + 4) * 10) / 10,\n },\n })),\n];\n\nexport const sampleReviews: Review[] = [\n {\n id: '1',\n userId: 'u1',\n userName: 'John Smith',\n userAvatar: 'https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64',\n rating: 5,\n title: 'Excellent quality!',\n comment: 'These headphones exceeded my expectations. The sound quality is amazing and the noise cancellation works perfectly.',\n date: '2024-01-15',\n helpful: 12,\n verified: true,\n },\n {\n id: '2',\n userId: 'u2',\n userName: 'Sarah Johnson',\n userAvatar: 'https://images.pexels.com/photos/415829/pexels-photo-415829.jpeg?auto=compress&cs=tinysrgb&w=64',\n rating: 4,\n title: 'Great value for money',\n comment: 'Good headphones for the price. Battery life is as advertised and they are comfortable to wear.',\n date: '2024-01-10',\n helpful: 8,\n verified: true,\n },\n {\n id: '3',\n userId: 'u3',\n userName: 'Mike Wilson',\n rating: 5,\n title: 'Perfect for work',\n comment: 'Use these daily for work calls and music. The noise cancellation is a game changer in the office.',\n date: '2024-01-05',\n helpful: 15,\n verified: false,\n },\n];"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sampleData.js","sources":["../../../../src/components/Marketplace/data/sampleData.ts"],"sourcesContent":["import { Product, Review } from '../types';\n\n// Sample product data for demonstration\nexport const sampleProducts: Product[] = [\n {\n id: '1',\n name: 'Premium Wireless Headphones',\n description: 'High-quality wireless headphones with active noise cancellation and 30-hour battery life.',\n price: 299.99,\n originalPrice: 399.99,\n discount: 25,\n images: [\n 'https://images.pexels.com/photos/3394650/pexels-photo-3394650.jpeg?auto=compress&cs=tinysrgb&w=800',\n 'https://images.pexels.com/photos/1649771/pexels-photo-1649771.jpeg?auto=compress&cs=tinysrgb&w=800',\n 'https://images.pexels.com/photos/1649772/pexels-photo-1649772.jpeg?auto=compress&cs=tinysrgb&w=800',\n ],\n category: 'Electronics',\n brand: 'AudioTech',\n rating: 4.5,\n reviewCount: 128,\n inStock: true,\n specifications: {\n 'Battery Life': '30 hours',\n 'Connectivity': 'Bluetooth 5.0',\n 'Weight': '250g',\n 'Noise Cancellation': 'Active',\n 'Warranty': '2 years',\n },\n tags: ['wireless', 'noise-cancelling', 'premium'],\n vendor: {\n id: 'v1',\n name: 'AudioTech Store',\n rating: 4.8,\n logo: 'https://images.pexels.com/photos/1649771/pexels-photo-1649771.jpeg?auto=compress&cs=tinysrgb&w=64',\n },\n },\n {\n id: '2',\n name: 'Smart Fitness Watch',\n description: 'Advanced fitness tracking with heart rate monitoring, GPS, and 7-day battery life.',\n price: 199.99,\n images: [\n 'https://images.pexels.com/photos/437037/pexels-photo-437037.jpeg?auto=compress&cs=tinysrgb&w=800',\n 'https://images.pexels.com/photos/437038/pexels-photo-437038.jpeg?auto=compress&cs=tinysrgb&w=800',\n ],\n category: 'Wearables',\n brand: 'FitTech',\n rating: 4.3,\n reviewCount: 89,\n inStock: true,\n specifications: {\n 'Battery Life': '7 days',\n 'Display': '1.4\" AMOLED',\n 'Water Resistance': '5ATM',\n 'GPS': 'Built-in',\n 'Sensors': 'Heart Rate, SpO2, Accelerometer',\n },\n tags: ['fitness', 'smartwatch', 'gps'],\n vendor: {\n id: 'v2',\n name: 'FitTech Official',\n rating: 4.6,\n },\n },\n {\n id: '3',\n name: 'Professional Camera Lens',\n description: '85mm f/1.4 portrait lens with exceptional image quality and beautiful bokeh.',\n price: 899.99,\n images: [\n 'https://images.pexels.com/photos/90946/pexels-photo-90946.jpeg?auto=compress&cs=tinysrgb&w=800',\n ],\n category: 'Photography',\n brand: 'LensMaster',\n rating: 4.8,\n reviewCount: 45,\n inStock: false,\n specifications: {\n 'Focal Length': '85mm',\n 'Aperture': 'f/1.4',\n 'Mount': 'Canon EF',\n 'Weight': '950g',\n 'Filter Size': '77mm',\n },\n tags: ['portrait', 'professional', 'bokeh'],\n vendor: {\n id: 'v3',\n name: 'Camera World',\n rating: 4.9,\n },\n },\n // Add more sample products...\n ...Array.from({ length: 20 }, (_, i) => ({\n id: `${i + 4}`,\n name: `Product ${i + 4}`,\n description: `Description for product ${i + 4}`,\n price: Math.floor(Math.random() * 500) + 50,\n images: [`https://images.pexels.com/photos/${1000000 + i}/pexels-photo-${1000000 + i}.jpeg?auto=compress&cs=tinysrgb&w=800`],\n category: ['Electronics', 'Clothing', 'Home', 'Sports'][Math.floor(Math.random() * 4)],\n brand: ['Brand A', 'Brand B', 'Brand C'][Math.floor(Math.random() * 3)],\n rating: Math.round((Math.random() * 2 + 3) * 10) / 10,\n reviewCount: Math.floor(Math.random() * 200) + 10,\n inStock: Math.random() > 0.2,\n specifications: {\n 'Feature 1': 'Value 1',\n 'Feature 2': 'Value 2',\n },\n tags: ['tag1', 'tag2'],\n vendor: {\n id: `v${i + 4}`,\n name: `Vendor ${i + 4}`,\n rating: Math.round((Math.random() * 1 + 4) * 10) / 10,\n },\n })),\n];\n\nexport const sampleReviews: Review[] = [\n {\n id: '1',\n userId: 'u1',\n userName: 'John Smith',\n userAvatar: 'https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64',\n rating: 5,\n title: 'Excellent quality!',\n comment: 'These headphones exceeded my expectations. The sound quality is amazing and the noise cancellation works perfectly.',\n date: '2024-01-15',\n helpful: 12,\n verified: true,\n },\n {\n id: '2',\n userId: 'u2',\n userName: 'Sarah Johnson',\n userAvatar: 'https://images.pexels.com/photos/415829/pexels-photo-415829.jpeg?auto=compress&cs=tinysrgb&w=64',\n rating: 4,\n title: 'Great value for money',\n comment: 'Good headphones for the price. Battery life is as advertised and they are comfortable to wear.',\n date: '2024-01-10',\n helpful: 8,\n verified: true,\n },\n {\n id: '3',\n userId: 'u3',\n userName: 'Mike Wilson',\n rating: 5,\n title: 'Perfect for work',\n comment: 'Use these daily for work calls and music. The noise cancellation is a game changer in the office.',\n date: '2024-01-05',\n helpful: 15,\n verified: false,\n },\n];"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './sanitizeProduct';
|
package/dist/index.js
CHANGED
|
@@ -51,6 +51,7 @@ export { useMarketplaceState } from './components/Marketplace/hooks/useMarketpla
|
|
|
51
51
|
export { useCart } from './components/Marketplace/hooks/useCart.js';
|
|
52
52
|
export { useProductNavigation } from './components/Marketplace/hooks/useProductNavigation.js';
|
|
53
53
|
export { useSearch } from './components/Marketplace/hooks/useSearch.js';
|
|
54
|
+
export { sanitizeProduct } from './components/Marketplace/utils/sanitizeProduct.js';
|
|
54
55
|
export { useDarkMode } from './hooks/useDarkMode.js';
|
|
55
56
|
export { useDebounce } from './hooks/useDebounce.js';
|
|
56
57
|
export { useLocalStorage } from './hooks/useLocalStorage.js';
|