@beyondcorp/beyond-ui 1.2.28 → 1.2.30
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.d.ts +8 -0
- package/dist/components/Marketplace/AllProductsView.js +185 -0
- package/dist/components/Marketplace/AllProductsView.js.map +1 -0
- package/dist/components/Marketplace/CheckoutCompact.d.ts +10 -0
- package/dist/components/Marketplace/CheckoutCompact.js +66 -0
- package/dist/components/Marketplace/CheckoutCompact.js.map +1 -0
- package/dist/components/Marketplace/CheckoutComponent.d.ts +8 -0
- package/dist/components/Marketplace/CheckoutComponent.js +123 -0
- package/dist/components/Marketplace/CheckoutComponent.js.map +1 -0
- package/dist/components/Marketplace/MarketplaceComponent.d.ts +8 -0
- package/dist/components/Marketplace/MarketplaceComponent.js +108 -0
- package/dist/components/Marketplace/MarketplaceComponent.js.map +1 -0
- package/dist/components/Marketplace/MarketplaceSidebar.d.ts +12 -0
- package/dist/components/Marketplace/MarketplaceSidebar.js +167 -0
- package/dist/components/Marketplace/MarketplaceSidebar.js.map +1 -0
- package/dist/components/Marketplace/SingleProductView.d.ts +9 -0
- package/dist/components/Marketplace/SingleProductView.js +52 -0
- package/dist/components/Marketplace/SingleProductView.js.map +1 -0
- package/dist/components/Marketplace/data/sampleData.d.ts +3 -0
- package/dist/components/Marketplace/data/sampleData.js +153 -0
- package/dist/components/Marketplace/data/sampleData.js.map +1 -0
- package/dist/components/Marketplace/index.d.ts +7 -0
- package/dist/components/Marketplace/types.d.ts +82 -0
- package/dist/index.d.ts +1 -3
- package/dist/index.js +6 -5
- package/dist/styles.css +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Product } from './types';
|
|
3
|
+
interface AllProductsViewProps {
|
|
4
|
+
onProductClick?: (product: Product) => void;
|
|
5
|
+
onAddToCart?: (product: Product) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const AllProductsView: React.FC<AllProductsViewProps>;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useMemo } from 'react';
|
|
3
|
+
import { Search, Grid2x2, List, Filter, Star, ShoppingCart, Heart, Eye } from 'lucide-react';
|
|
4
|
+
import { Button } from '../Button/Button.js';
|
|
5
|
+
import { Input } from '../Input/Input.js';
|
|
6
|
+
import { Card, CardContent } from '../Card/Card.js';
|
|
7
|
+
import { Badge } from '../Badge/Badge.js';
|
|
8
|
+
import { Modal, ModalHeader, ModalTitle, ModalContent, ModalFooter } from '../Modal/Modal.js';
|
|
9
|
+
import { Checkbox } from '../Checkbox/Checkbox.js';
|
|
10
|
+
import { showToast } from '../Toast/Toast.js';
|
|
11
|
+
import { sampleProducts } from './data/sampleData.js';
|
|
12
|
+
|
|
13
|
+
const sortOptions = [
|
|
14
|
+
{ value: 'relevance', label: 'Most Relevant' },
|
|
15
|
+
{ value: 'price-low', label: 'Price: Low to High' },
|
|
16
|
+
{ value: 'price-high', label: 'Price: High to Low' },
|
|
17
|
+
{ value: 'rating', label: 'Highest Rated' },
|
|
18
|
+
{ value: 'newest', label: 'Newest First' },
|
|
19
|
+
{ value: 'popular', label: 'Most Popular' },
|
|
20
|
+
];
|
|
21
|
+
const AllProductsView = ({ onProductClick, onAddToCart, }) => {
|
|
22
|
+
const [searchQuery, setSearchQuery] = useState('');
|
|
23
|
+
const [sortBy, setSortBy] = useState('relevance');
|
|
24
|
+
const [viewMode, setViewMode] = useState('grid');
|
|
25
|
+
const [currentPage, setCurrentPage] = useState(1);
|
|
26
|
+
const [showFilters, setShowFilters] = useState(false);
|
|
27
|
+
const [quickViewProduct, setQuickViewProduct] = useState(null);
|
|
28
|
+
const [wishlist, setWishlist] = useState(new Set());
|
|
29
|
+
const [filters, setFilters] = useState({
|
|
30
|
+
categories: [],
|
|
31
|
+
brands: [],
|
|
32
|
+
priceRange: [0, 1000],
|
|
33
|
+
rating: 0,
|
|
34
|
+
inStock: false,
|
|
35
|
+
vendors: [],
|
|
36
|
+
});
|
|
37
|
+
const itemsPerPage = 12;
|
|
38
|
+
// Get unique filter options from products
|
|
39
|
+
const filterOptions = useMemo(() => {
|
|
40
|
+
const categories = [...new Set(sampleProducts.map(p => p.category))];
|
|
41
|
+
const brands = [...new Set(sampleProducts.map(p => p.brand))];
|
|
42
|
+
const vendors = [...new Set(sampleProducts.map(p => p.vendor.name))];
|
|
43
|
+
return { categories, brands, vendors };
|
|
44
|
+
}, []);
|
|
45
|
+
// Filter and sort products
|
|
46
|
+
const filteredProducts = useMemo(() => {
|
|
47
|
+
let filtered = sampleProducts.filter(product => {
|
|
48
|
+
// Search query
|
|
49
|
+
if (searchQuery && !product.name.toLowerCase().includes(searchQuery.toLowerCase()) &&
|
|
50
|
+
!product.description.toLowerCase().includes(searchQuery.toLowerCase())) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
// Category filter
|
|
54
|
+
if (filters.categories.length > 0 && !filters.categories.includes(product.category)) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
// Brand filter
|
|
58
|
+
if (filters.brands.length > 0 && !filters.brands.includes(product.brand)) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
// Price range
|
|
62
|
+
if (product.price < filters.priceRange[0] || product.price > filters.priceRange[1]) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
// Rating filter
|
|
66
|
+
if (filters.rating > 0 && product.rating < filters.rating) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
// In stock filter
|
|
70
|
+
if (filters.inStock && !product.inStock) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
// Vendor filter
|
|
74
|
+
if (filters.vendors.length > 0 && !filters.vendors.includes(product.vendor.name)) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
return true;
|
|
78
|
+
});
|
|
79
|
+
// Sort products
|
|
80
|
+
switch (sortBy) {
|
|
81
|
+
case 'price-low':
|
|
82
|
+
filtered.sort((a, b) => a.price - b.price);
|
|
83
|
+
break;
|
|
84
|
+
case 'price-high':
|
|
85
|
+
filtered.sort((a, b) => b.price - a.price);
|
|
86
|
+
break;
|
|
87
|
+
case 'rating':
|
|
88
|
+
filtered.sort((a, b) => b.rating - a.rating);
|
|
89
|
+
break;
|
|
90
|
+
case 'newest':
|
|
91
|
+
// Assuming newer products have higher IDs
|
|
92
|
+
filtered.sort((a, b) => parseInt(b.id) - parseInt(a.id));
|
|
93
|
+
break;
|
|
94
|
+
case 'popular':
|
|
95
|
+
filtered.sort((a, b) => b.reviewCount - a.reviewCount);
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
return filtered;
|
|
99
|
+
}, [searchQuery, filters, sortBy]);
|
|
100
|
+
// Paginate products
|
|
101
|
+
const paginatedProducts = useMemo(() => {
|
|
102
|
+
const startIndex = (currentPage - 1) * itemsPerPage;
|
|
103
|
+
return filteredProducts.slice(startIndex, startIndex + itemsPerPage);
|
|
104
|
+
}, [filteredProducts, currentPage]);
|
|
105
|
+
const totalPages = Math.ceil(filteredProducts.length / itemsPerPage);
|
|
106
|
+
const handleFilterChange = (filterType, value) => {
|
|
107
|
+
setFilters(prev => ({
|
|
108
|
+
...prev,
|
|
109
|
+
[filterType]: value,
|
|
110
|
+
}));
|
|
111
|
+
setCurrentPage(1); // Reset to first page when filters change
|
|
112
|
+
};
|
|
113
|
+
const handleClearFilters = () => {
|
|
114
|
+
setFilters({
|
|
115
|
+
categories: [],
|
|
116
|
+
brands: [],
|
|
117
|
+
priceRange: [0, 1000],
|
|
118
|
+
rating: 0,
|
|
119
|
+
inStock: false,
|
|
120
|
+
vendors: [],
|
|
121
|
+
});
|
|
122
|
+
setSearchQuery('');
|
|
123
|
+
setCurrentPage(1);
|
|
124
|
+
};
|
|
125
|
+
const toggleWishlist = (productId) => {
|
|
126
|
+
setWishlist(prev => {
|
|
127
|
+
const newWishlist = new Set(prev);
|
|
128
|
+
if (newWishlist.has(productId)) {
|
|
129
|
+
newWishlist.delete(productId);
|
|
130
|
+
showToast.info('Removed from wishlist');
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
newWishlist.add(productId);
|
|
134
|
+
showToast.success('Added to wishlist');
|
|
135
|
+
}
|
|
136
|
+
return newWishlist;
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
const handleAddToCart = (product) => {
|
|
140
|
+
onAddToCart?.(product);
|
|
141
|
+
showToast.success(`${product.name} added to cart!`);
|
|
142
|
+
};
|
|
143
|
+
const ProductCard = ({ product }) => (jsxs(Card, { className: "group hover:shadow-lg transition-all duration-300", children: [jsxs("div", { className: "relative aspect-square bg-gray-100 rounded-t-lg overflow-hidden", children: [jsx("img", { src: product.images[0], alt: product.name, className: "w-full h-full object-cover group-hover:scale-105 transition-transform duration-300" }), product.discount && (jsxs(Badge, { variant: "danger", className: "absolute top-2 left-2", children: ["-", product.discount, "%"] })), jsx("div", { className: "absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity", children: jsx(Button, { variant: "ghost", size: "sm", onClick: (e) => {
|
|
144
|
+
e.stopPropagation();
|
|
145
|
+
toggleWishlist(product.id);
|
|
146
|
+
}, className: "bg-white/80 hover:bg-white", children: jsx(Heart, { className: `h-4 w-4 ${wishlist.has(product.id) ? 'fill-current text-red-500' : ''}` }) }) }), jsx("div", { className: "absolute bottom-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity", children: jsx(Button, { variant: "ghost", size: "sm", onClick: (e) => {
|
|
147
|
+
e.stopPropagation();
|
|
148
|
+
setQuickViewProduct(product);
|
|
149
|
+
}, className: "bg-white/80 hover:bg-white", children: jsx(Eye, { className: "h-4 w-4" }) }) }), !product.inStock && (jsx("div", { className: "absolute inset-0 bg-black/50 flex items-center justify-center", children: jsx(Badge, { variant: "secondary", children: "Out of Stock" }) }))] }), jsxs(CardContent, { className: "p-4", children: [jsxs("div", { className: "mb-2", children: [jsx("h3", { className: "font-medium text-gray-900 line-clamp-2 cursor-pointer hover:text-primary-600", onClick: () => onProductClick?.(product), children: product.name }), jsx("p", { className: "text-sm text-gray-600", children: product.brand })] }), jsxs("div", { className: "flex items-center space-x-1 mb-2", children: [jsx(Star, { className: "h-4 w-4 text-yellow-400 fill-current" }), jsxs("span", { className: "text-sm text-gray-600", children: [product.rating, " (", product.reviewCount, ")"] })] }), jsx("div", { className: "flex items-center justify-between mb-3", children: jsxs("div", { className: "flex items-center space-x-2", children: [jsxs("span", { className: "text-lg font-bold text-gray-900", children: ["$", product.price.toFixed(2)] }), product.originalPrice && (jsxs("span", { className: "text-sm text-gray-500 line-through", children: ["$", product.originalPrice.toFixed(2)] }))] }) }), jsxs(Button, { variant: "primary", size: "sm", onClick: (e) => {
|
|
150
|
+
e.stopPropagation();
|
|
151
|
+
handleAddToCart(product);
|
|
152
|
+
}, disabled: !product.inStock, className: "w-full", children: [jsx(ShoppingCart, { className: "mr-2 h-4 w-4" }), "Add to Cart"] })] })] }));
|
|
153
|
+
return (jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8", children: [jsxs("div", { className: "flex flex-col lg:flex-row lg:items-center lg:justify-between mb-8", children: [jsxs("div", { children: [jsx("h1", { className: "text-3xl font-bold text-gray-900 mb-2", children: "All Products" }), jsxs("p", { className: "text-gray-600", children: ["Showing ", filteredProducts.length, " of ", sampleProducts.length, " products"] })] }), jsxs("div", { className: "flex items-center space-x-4 mt-4 lg:mt-0", children: [jsxs("div", { className: "relative", children: [jsx(Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { placeholder: "Search products...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), className: "pl-10 w-64" })] }), jsx("select", { value: sortBy, onChange: (e) => setSortBy(e.target.value), className: "border border-gray-300 rounded-lg px-3 py-2 bg-white", children: sortOptions.map(option => (jsx("option", { value: option.value, children: option.label }, option.value))) }), jsxs("div", { className: "flex items-center bg-gray-100 rounded-lg p-1", children: [jsx(Button, { variant: viewMode === 'grid' ? 'primary' : 'ghost', size: "sm", onClick: () => setViewMode('grid'), children: jsx(Grid2x2, { className: "h-4 w-4" }) }), jsx(Button, { variant: viewMode === 'list' ? 'primary' : 'ghost', size: "sm", onClick: () => setViewMode('list'), children: jsx(List, { className: "h-4 w-4" }) })] }), jsxs(Button, { variant: "outline", onClick: () => setShowFilters(true), className: "lg:hidden", children: [jsx(Filter, { className: "mr-2 h-4 w-4" }), "Filters"] })] })] }), jsxs("div", { className: "flex gap-8", children: [jsx("div", { className: "hidden lg:block w-64 flex-shrink-0", children: jsx(Card, { className: "sticky top-4", children: jsxs(CardContent, { className: "p-6", children: [jsxs("div", { className: "flex items-center justify-between mb-4", children: [jsx("h3", { className: "font-semibold text-gray-900", children: "Filters" }), jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearFilters, children: "Clear All" })] }), jsxs("div", { className: "mb-6", children: [jsx("h4", { className: "font-medium text-gray-900 mb-3", children: "Categories" }), jsx("div", { className: "space-y-2", children: filterOptions.categories.map(category => (jsxs("label", { className: "flex items-center space-x-2", children: [jsx(Checkbox, { checked: filters.categories.includes(category), onChange: (e) => {
|
|
154
|
+
const newCategories = e.target.checked
|
|
155
|
+
? [...filters.categories, category]
|
|
156
|
+
: filters.categories.filter(c => c !== category);
|
|
157
|
+
handleFilterChange('categories', newCategories);
|
|
158
|
+
} }), jsx("span", { className: "text-sm text-gray-700", children: category })] }, category))) })] }), jsxs("div", { className: "mb-6", children: [jsx("h4", { className: "font-medium text-gray-900 mb-3", children: "Brands" }), jsx("div", { className: "space-y-2", children: filterOptions.brands.map(brand => (jsxs("label", { className: "flex items-center space-x-2", children: [jsx(Checkbox, { checked: filters.brands.includes(brand), onChange: (e) => {
|
|
159
|
+
const newBrands = e.target.checked
|
|
160
|
+
? [...filters.brands, brand]
|
|
161
|
+
: filters.brands.filter(b => b !== brand);
|
|
162
|
+
handleFilterChange('brands', newBrands);
|
|
163
|
+
} }), jsx("span", { className: "text-sm text-gray-700", children: brand })] }, brand))) })] }), jsxs("div", { className: "mb-6", children: [jsx("h4", { className: "font-medium text-gray-900 mb-3", children: "Price Range" }), jsx("div", { className: "space-y-2", children: jsxs("div", { className: "flex items-center space-x-2", children: [jsx(Input, { type: "number", placeholder: "Min", value: filters.priceRange[0], onChange: (e) => handleFilterChange('priceRange', [
|
|
164
|
+
parseInt(e.target.value) || 0,
|
|
165
|
+
filters.priceRange[1]
|
|
166
|
+
]), className: "w-20" }), jsx("span", { children: "-" }), jsx(Input, { type: "number", placeholder: "Max", value: filters.priceRange[1], onChange: (e) => handleFilterChange('priceRange', [
|
|
167
|
+
filters.priceRange[0],
|
|
168
|
+
parseInt(e.target.value) || 1000
|
|
169
|
+
]), className: "w-20" })] }) })] }), jsxs("div", { className: "mb-6", children: [jsx("h4", { className: "font-medium text-gray-900 mb-3", children: "Minimum Rating" }), jsx("div", { className: "space-y-2", children: [4, 3, 2, 1].map(rating => (jsxs("label", { className: "flex items-center space-x-2", children: [jsx(Checkbox, { checked: filters.rating === rating, onChange: (e) => {
|
|
170
|
+
handleFilterChange('rating', e.target.checked ? rating : 0);
|
|
171
|
+
} }), jsxs("div", { className: "flex items-center space-x-1", children: [[1, 2, 3, 4, 5].map(star => (jsx(Star, { className: `h-4 w-4 ${star <= rating ? 'text-yellow-400 fill-current' : 'text-gray-300'}` }, star))), jsx("span", { className: "text-sm text-gray-700", children: "& up" })] })] }, rating))) })] }), jsx("div", { className: "mb-6", children: jsxs("label", { className: "flex items-center space-x-2", children: [jsx(Checkbox, { checked: filters.inStock, onChange: (e) => handleFilterChange('inStock', e.target.checked) }), jsx("span", { className: "text-sm text-gray-700", children: "In Stock Only" })] }) })] }) }) }), jsx("div", { className: "flex-1", children: paginatedProducts.length === 0 ? (jsxs("div", { className: "text-center py-12", children: [jsx("div", { className: "text-gray-400 mb-4", children: jsx(Search, { className: "h-16 w-16 mx-auto" }) }), jsx("h3", { className: "text-lg font-medium text-gray-900 mb-2", children: "No products found" }), jsx("p", { className: "text-gray-600 mb-4", children: "Try adjusting your search or filter criteria" }), jsx(Button, { variant: "outline", onClick: handleClearFilters, children: "Clear Filters" })] })) : (jsxs(Fragment, { children: [jsx("div", { className: `grid gap-6 ${viewMode === 'grid'
|
|
172
|
+
? 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4'
|
|
173
|
+
: 'grid-cols-1'}`, children: paginatedProducts.map(product => (jsx(ProductCard, { product: product }, product.id))) }), totalPages > 1 && (jsxs("div", { className: "flex items-center justify-center space-x-2 mt-12", children: [jsx(Button, { variant: "outline", onClick: () => setCurrentPage(prev => Math.max(1, prev - 1)), disabled: currentPage === 1, children: "Previous" }), Array.from({ length: Math.min(5, totalPages) }, (_, i) => {
|
|
174
|
+
const page = i + 1;
|
|
175
|
+
return (jsx(Button, { variant: currentPage === page ? 'primary' : 'outline', onClick: () => setCurrentPage(page), children: page }, page));
|
|
176
|
+
}), jsx(Button, { variant: "outline", onClick: () => setCurrentPage(prev => Math.min(totalPages, prev + 1)), disabled: currentPage === totalPages, children: "Next" })] }))] })) })] }), jsxs(Modal, { open: showFilters, onOpenChange: setShowFilters, children: [jsx(ModalHeader, { children: jsx(ModalTitle, { children: "Filters" }) }), jsx(ModalContent, { children: jsx("div", { className: "space-y-6", children: jsxs("div", { children: [jsx("h4", { className: "font-medium text-gray-900 mb-3", children: "Categories" }), jsx("div", { className: "space-y-2", children: filterOptions.categories.map(category => (jsxs("label", { className: "flex items-center space-x-2", children: [jsx(Checkbox, { checked: filters.categories.includes(category), onChange: (e) => {
|
|
177
|
+
const newCategories = e.target.checked
|
|
178
|
+
? [...filters.categories, category]
|
|
179
|
+
: filters.categories.filter(c => c !== category);
|
|
180
|
+
handleFilterChange('categories', newCategories);
|
|
181
|
+
} }), jsx("span", { className: "text-sm text-gray-700", children: category })] }, category))) })] }) }) }), jsxs(ModalFooter, { children: [jsx(Button, { variant: "outline", onClick: handleClearFilters, children: "Clear All" }), jsx(Button, { variant: "primary", onClick: () => setShowFilters(false), children: "Apply Filters" })] })] }), jsx(Modal, { open: !!quickViewProduct, onOpenChange: () => setQuickViewProduct(null), size: "lg", children: quickViewProduct && (jsxs(Fragment, { children: [jsx(ModalHeader, { children: jsx(ModalTitle, { children: quickViewProduct.name }) }), jsx(ModalContent, { children: jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [jsx("div", { className: "aspect-square bg-gray-100 rounded-lg overflow-hidden", children: jsx("img", { src: quickViewProduct.images[0], alt: quickViewProduct.name, className: "w-full h-full object-cover" }) }), jsxs("div", { children: [jsxs("div", { className: "flex items-center space-x-1 mb-2", children: [jsx(Star, { className: "h-4 w-4 text-yellow-400 fill-current" }), jsxs("span", { className: "text-sm text-gray-600", children: [quickViewProduct.rating, " (", quickViewProduct.reviewCount, " reviews)"] })] }), jsxs("div", { className: "flex items-center space-x-2 mb-4", children: [jsxs("span", { className: "text-2xl font-bold text-gray-900", children: ["$", quickViewProduct.price.toFixed(2)] }), quickViewProduct.originalPrice && (jsxs("span", { className: "text-lg text-gray-500 line-through", children: ["$", quickViewProduct.originalPrice.toFixed(2)] }))] }), jsx("p", { className: "text-gray-600 mb-4", children: quickViewProduct.description }), jsx(Badge, { variant: quickViewProduct.inStock ? 'success' : 'danger', className: "mb-4", children: quickViewProduct.inStock ? 'In Stock' : 'Out of Stock' })] })] }) }), jsxs(ModalFooter, { children: [jsx(Button, { variant: "outline", onClick: () => onProductClick?.(quickViewProduct), children: "View Details" }), jsxs(Button, { variant: "primary", onClick: () => handleAddToCart(quickViewProduct), disabled: !quickViewProduct.inStock, children: [jsx(ShoppingCart, { className: "mr-2 h-4 w-4" }), "Add to Cart"] })] })] })) })] }));
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
export { AllProductsView };
|
|
185
|
+
//# sourceMappingURL=AllProductsView.js.map
|
|
@@ -0,0 +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 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 onProductClick,\n onAddToCart,\n}) => {\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 const [filters, setFilters] = useState<FilterOptions>({\n categories: [],\n brands: [],\n priceRange: [0, 1000],\n rating: 0,\n inStock: false,\n vendors: [],\n });\n\n const itemsPerPage = 12;\n\n // Get unique filter options from products\n const filterOptions = useMemo(() => {\n const categories = [...new Set(sampleProducts.map(p => p.category))];\n const brands = [...new Set(sampleProducts.map(p => p.brand))];\n const vendors = [...new Set(sampleProducts.map(p => p.vendor.name))];\n \n return { categories, brands, vendors };\n }, []);\n\n // Filter and sort products\n const filteredProducts = useMemo(() => {\n let filtered = sampleProducts.filter(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, b) => a.price - b.price);\n break;\n case 'price-high':\n filtered.sort((a, b) => b.price - a.price);\n break;\n case 'rating':\n filtered.sort((a, b) => b.rating - a.rating);\n break;\n case 'newest':\n // Assuming newer products have higher IDs\n filtered.sort((a, b) => parseInt(b.id) - parseInt(a.id));\n break;\n case 'popular':\n filtered.sort((a, b) => b.reviewCount - a.reviewCount);\n break;\n default:\n // Keep original order for relevance\n break;\n }\n\n return filtered;\n }, [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 {sampleProducts.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.map(category => (\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 => 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.map(brand => (\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 => 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 => (\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.map(category => (\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 => 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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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { CartItem } from './types';
|
|
3
|
+
interface CheckoutCompactProps {
|
|
4
|
+
cartItems?: CartItem[];
|
|
5
|
+
onClose?: () => void;
|
|
6
|
+
onCheckout?: (items: CartItem[]) => void;
|
|
7
|
+
className?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const CheckoutCompact: React.FC<CheckoutCompactProps>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { ShoppingCart, X, ChevronUp, ChevronDown, Zap, CreditCard, Lock } from 'lucide-react';
|
|
4
|
+
import { Button } from '../Button/Button.js';
|
|
5
|
+
import { Input } from '../Input/Input.js';
|
|
6
|
+
import { Card, CardHeader, CardTitle, CardContent } from '../Card/Card.js';
|
|
7
|
+
import { Badge } from '../Badge/Badge.js';
|
|
8
|
+
import { showToast } from '../Toast/Toast.js';
|
|
9
|
+
import { sampleProducts } from './data/sampleData.js';
|
|
10
|
+
|
|
11
|
+
const sampleCartItems = [
|
|
12
|
+
{
|
|
13
|
+
product: sampleProducts[0],
|
|
14
|
+
quantity: 1,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
product: sampleProducts[1],
|
|
18
|
+
quantity: 2,
|
|
19
|
+
},
|
|
20
|
+
];
|
|
21
|
+
const CheckoutCompact = ({ cartItems = sampleCartItems, onClose, onCheckout, className = '', }) => {
|
|
22
|
+
const [isExpanded, setIsExpanded] = useState(false);
|
|
23
|
+
const [paymentMethod, setPaymentMethod] = useState('card');
|
|
24
|
+
const [isProcessing, setIsProcessing] = useState(false);
|
|
25
|
+
const [formData, setFormData] = useState({
|
|
26
|
+
email: '',
|
|
27
|
+
cardNumber: '',
|
|
28
|
+
expiryDate: '',
|
|
29
|
+
cvv: '',
|
|
30
|
+
name: '',
|
|
31
|
+
});
|
|
32
|
+
// Calculate totals
|
|
33
|
+
const subtotal = cartItems.reduce((sum, item) => sum + (item.product.price * item.quantity), 0);
|
|
34
|
+
const shipping = subtotal > 100 ? 0 : 9.99;
|
|
35
|
+
const tax = subtotal * 0.08;
|
|
36
|
+
const total = subtotal + shipping + tax;
|
|
37
|
+
const handleInputChange = (field, value) => {
|
|
38
|
+
setFormData(prev => ({ ...prev, [field]: value }));
|
|
39
|
+
};
|
|
40
|
+
const handleQuickCheckout = async () => {
|
|
41
|
+
setIsProcessing(true);
|
|
42
|
+
// Simulate processing
|
|
43
|
+
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
44
|
+
onCheckout?.(cartItems);
|
|
45
|
+
showToast.success('Order placed successfully!');
|
|
46
|
+
setIsProcessing(false);
|
|
47
|
+
};
|
|
48
|
+
const handleOneClickCheckout = async () => {
|
|
49
|
+
setIsProcessing(true);
|
|
50
|
+
// Simulate one-click processing
|
|
51
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
52
|
+
onCheckout?.(cartItems);
|
|
53
|
+
showToast.success('Order placed with saved payment method!');
|
|
54
|
+
setIsProcessing(false);
|
|
55
|
+
};
|
|
56
|
+
return (jsx("div", { className: `w-full max-w-md ${className}`, children: jsxs(Card, { children: [jsx(CardHeader, { className: "pb-3", children: jsxs("div", { className: "flex items-center justify-between", children: [jsxs(CardTitle, { className: "flex items-center text-lg", children: [jsx(ShoppingCart, { className: "h-5 w-5 mr-2" }), "Checkout (", cartItems.length, " items)"] }), onClose && (jsx(Button, { variant: "ghost", size: "sm", onClick: onClose, children: jsx(X, { className: "h-4 w-4" }) }))] }) }), jsxs(CardContent, { className: "space-y-4", children: [jsxs("div", { children: [jsxs("button", { onClick: () => setIsExpanded(!isExpanded), className: "flex items-center justify-between w-full p-3 bg-gray-50 rounded-lg hover:bg-gray-100 transition-colors", children: [jsxs("div", { className: "flex items-center space-x-2", children: [jsx("span", { className: "font-medium text-gray-900", children: "Order Summary" }), jsxs(Badge, { variant: "outline", children: ["$", total.toFixed(2)] })] }), isExpanded ? (jsx(ChevronUp, { className: "h-4 w-4 text-gray-600" })) : (jsx(ChevronDown, { className: "h-4 w-4 text-gray-600" }))] }), isExpanded && (jsxs("div", { className: "mt-3 space-y-3", children: [cartItems.map((item) => (jsxs("div", { className: "flex items-center space-x-3", children: [jsx("img", { src: item.product.images[0], alt: item.product.name, className: "w-10 h-10 object-cover rounded" }), jsxs("div", { className: "flex-1 min-w-0", children: [jsx("p", { className: "text-sm font-medium text-gray-900 truncate", children: item.product.name }), jsxs("p", { className: "text-xs text-gray-600", children: ["Qty: ", item.quantity] })] }), jsxs("p", { className: "text-sm font-medium text-gray-900", children: ["$", (item.product.price * item.quantity).toFixed(2)] })] }, item.product.id))), jsxs("div", { className: "pt-3 border-t border-gray-200 space-y-1", children: [jsxs("div", { className: "flex justify-between text-sm", children: [jsx("span", { className: "text-gray-600", children: "Subtotal" }), jsxs("span", { children: ["$", subtotal.toFixed(2)] })] }), jsxs("div", { className: "flex justify-between text-sm", children: [jsx("span", { className: "text-gray-600", children: "Shipping" }), jsx("span", { children: shipping === 0 ? 'Free' : `$${shipping.toFixed(2)}` })] }), jsxs("div", { className: "flex justify-between text-sm", children: [jsx("span", { className: "text-gray-600", children: "Tax" }), jsxs("span", { children: ["$", tax.toFixed(2)] })] }), jsxs("div", { className: "flex justify-between font-semibold pt-1 border-t border-gray-200", children: [jsx("span", { children: "Total" }), jsxs("span", { children: ["$", total.toFixed(2)] })] })] })] }))] }), jsxs("div", { className: "space-y-3", children: [jsx("h3", { className: "font-medium text-gray-900", children: "Quick Payment" }), jsxs(Button, { variant: "primary", onClick: handleOneClickCheckout, disabled: isProcessing, className: "w-full", children: [jsx(Zap, { className: "mr-2 h-4 w-4" }), isProcessing ? 'Processing...' : 'Buy with 1-Click'] }), jsxs("div", { className: "relative", children: [jsx("div", { className: "absolute inset-0 flex items-center", children: jsx("div", { className: "w-full border-t border-gray-300" }) }), jsx("div", { className: "relative flex justify-center text-sm", children: jsx("span", { className: "px-2 bg-white text-gray-500", children: "or" }) })] }), jsx("div", { className: "space-y-2", children: jsx("div", { className: "flex space-x-2", children: [
|
|
57
|
+
{ id: 'card', name: 'Card', icon: CreditCard },
|
|
58
|
+
{ id: 'paypal', name: 'PayPal', icon: Lock },
|
|
59
|
+
{ id: 'apple_pay', name: 'Apple Pay', icon: Zap },
|
|
60
|
+
].map((method) => (jsxs("button", { onClick: () => setPaymentMethod(method.id), className: `flex-1 flex items-center justify-center p-2 border rounded-lg text-sm transition-colors ${paymentMethod === method.id
|
|
61
|
+
? 'border-primary-500 bg-primary-50 text-primary-700'
|
|
62
|
+
: 'border-gray-300 hover:border-gray-400'}`, children: [jsx(method.icon, { className: "h-4 w-4 mr-1" }), method.name] }, method.id))) }) }), jsxs("div", { className: "space-y-3", children: [jsx(Input, { type: "email", placeholder: "Email address", value: formData.email, onChange: (e) => handleInputChange('email', e.target.value), required: true }), paymentMethod === 'card' && (jsxs(Fragment, { children: [jsx(Input, { placeholder: "Card number", value: formData.cardNumber, onChange: (e) => handleInputChange('cardNumber', e.target.value), required: true }), jsxs("div", { className: "grid grid-cols-2 gap-2", children: [jsx(Input, { placeholder: "MM/YY", value: formData.expiryDate, onChange: (e) => handleInputChange('expiryDate', e.target.value), required: true }), jsx(Input, { placeholder: "CVV", value: formData.cvv, onChange: (e) => handleInputChange('cvv', e.target.value), required: true })] }), jsx(Input, { placeholder: "Cardholder name", value: formData.name, onChange: (e) => handleInputChange('name', e.target.value), required: true })] }))] }), jsx(Button, { variant: "secondary", onClick: handleQuickCheckout, disabled: isProcessing, className: "w-full", children: isProcessing ? 'Processing...' : `Complete Order - $${total.toFixed(2)}` })] }), jsxs("div", { className: "flex items-center justify-center text-xs text-gray-500 pt-2", children: [jsx(Lock, { className: "h-3 w-3 mr-1" }), "Secure 256-bit SSL encryption"] }), subtotal < 100 && (jsxs("div", { className: "text-center text-sm text-gray-600 bg-blue-50 p-2 rounded-lg", children: ["Add $", (100 - subtotal).toFixed(2), " more for free shipping!"] }))] })] }) }));
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export { CheckoutCompact };
|
|
66
|
+
//# sourceMappingURL=CheckoutCompact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckoutCompact.js","sources":["../../../src/components/Marketplace/CheckoutCompact.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { \n CreditCard, \n ChevronDown, \n ChevronUp, \n Lock, \n Zap,\n ShoppingCart,\n X\n} from 'lucide-react';\nimport { Button } from '../Button';\nimport { Input } from '../Input';\nimport { Card, CardHeader, CardTitle, CardContent } from '../Card';\nimport { Badge } from '../Badge';\nimport { showToast } from '../Toast';\nimport type { CartItem, PaymentMethod } from './types';\nimport { sampleProducts } from './data/sampleData';\n\ninterface CheckoutCompactProps {\n cartItems?: CartItem[];\n onClose?: () => void;\n onCheckout?: (items: CartItem[]) => void;\n className?: string;\n}\n\nconst sampleCartItems: CartItem[] = [\n {\n product: sampleProducts[0],\n quantity: 1,\n },\n {\n product: sampleProducts[1],\n quantity: 2,\n },\n];\n\nexport const CheckoutCompact: React.FC<CheckoutCompactProps> = ({\n cartItems = sampleCartItems,\n onClose,\n onCheckout,\n className = '',\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const [paymentMethod, setPaymentMethod] = useState<'card' | 'paypal' | 'apple_pay'>('card');\n const [isProcessing, setIsProcessing] = useState(false);\n const [formData, setFormData] = useState({\n email: '',\n cardNumber: '',\n expiryDate: '',\n cvv: '',\n name: '',\n });\n\n // Calculate totals\n const subtotal = cartItems.reduce((sum, item) => sum + (item.product.price * item.quantity), 0);\n const shipping = subtotal > 100 ? 0 : 9.99;\n const tax = subtotal * 0.08;\n const total = subtotal + shipping + tax;\n\n const handleInputChange = (field: string, value: string) => {\n setFormData(prev => ({ ...prev, [field]: value }));\n };\n\n const handleQuickCheckout = async () => {\n setIsProcessing(true);\n \n // Simulate processing\n await new Promise(resolve => setTimeout(resolve, 1500));\n \n onCheckout?.(cartItems);\n showToast.success('Order placed successfully!');\n setIsProcessing(false);\n };\n\n const handleOneClickCheckout = async () => {\n setIsProcessing(true);\n \n // Simulate one-click processing\n await new Promise(resolve => setTimeout(resolve, 1000));\n \n onCheckout?.(cartItems);\n showToast.success('Order placed with saved payment method!');\n setIsProcessing(false);\n };\n\n return (\n <div className={`w-full max-w-md ${className}`}>\n <Card>\n {/* Header */}\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"flex items-center text-lg\">\n <ShoppingCart className=\"h-5 w-5 mr-2\" />\n Checkout ({cartItems.length} items)\n </CardTitle>\n {onClose && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onClose}>\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </CardHeader>\n\n <CardContent className=\"space-y-4\">\n {/* Order Summary Toggle */}\n <div>\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"flex items-center justify-between w-full p-3 bg-gray-50 rounded-lg hover:bg-gray-100 transition-colors\"\n >\n <div className=\"flex items-center space-x-2\">\n <span className=\"font-medium text-gray-900\">Order Summary</span>\n <Badge variant=\"outline\">${total.toFixed(2)}</Badge>\n </div>\n {isExpanded ? (\n <ChevronUp className=\"h-4 w-4 text-gray-600\" />\n ) : (\n <ChevronDown className=\"h-4 w-4 text-gray-600\" />\n )}\n </button>\n\n {/* Expanded Order Details */}\n {isExpanded && (\n <div className=\"mt-3 space-y-3\">\n {cartItems.map((item) => (\n <div key={item.product.id} className=\"flex items-center space-x-3\">\n <img\n src={item.product.images[0]}\n alt={item.product.name}\n className=\"w-10 h-10 object-cover rounded\"\n />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-900 truncate\">\n {item.product.name}\n </p>\n <p className=\"text-xs text-gray-600\">Qty: {item.quantity}</p>\n </div>\n <p className=\"text-sm font-medium text-gray-900\">\n ${(item.product.price * item.quantity).toFixed(2)}\n </p>\n </div>\n ))}\n \n <div className=\"pt-3 border-t border-gray-200 space-y-1\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-gray-600\">Subtotal</span>\n <span>${subtotal.toFixed(2)}</span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-gray-600\">Shipping</span>\n <span>{shipping === 0 ? 'Free' : `$${shipping.toFixed(2)}`}</span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-gray-600\">Tax</span>\n <span>${tax.toFixed(2)}</span>\n </div>\n <div className=\"flex justify-between font-semibold pt-1 border-t border-gray-200\">\n <span>Total</span>\n <span>${total.toFixed(2)}</span>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Quick Payment Options */}\n <div className=\"space-y-3\">\n <h3 className=\"font-medium text-gray-900\">Quick Payment</h3>\n \n {/* One-Click Checkout */}\n <Button\n variant=\"primary\"\n onClick={handleOneClickCheckout}\n disabled={isProcessing}\n className=\"w-full\"\n >\n <Zap className=\"mr-2 h-4 w-4\" />\n {isProcessing ? 'Processing...' : 'Buy with 1-Click'}\n </Button>\n\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-gray-300\" />\n </div>\n <div className=\"relative flex justify-center text-sm\">\n <span className=\"px-2 bg-white text-gray-500\">or</span>\n </div>\n </div>\n\n {/* Payment Method Selection */}\n <div className=\"space-y-2\">\n <div className=\"flex space-x-2\">\n {[\n { id: 'card', name: 'Card', icon: CreditCard },\n { id: 'paypal', name: 'PayPal', icon: Lock },\n { id: 'apple_pay', name: 'Apple Pay', icon: Zap },\n ].map((method) => (\n <button\n key={method.id}\n onClick={() => setPaymentMethod(method.id as any)}\n className={`flex-1 flex items-center justify-center p-2 border rounded-lg text-sm transition-colors ${\n paymentMethod === method.id\n ? 'border-primary-500 bg-primary-50 text-primary-700'\n : 'border-gray-300 hover:border-gray-400'\n }`}\n >\n <method.icon className=\"h-4 w-4 mr-1\" />\n {method.name}\n </button>\n ))}\n </div>\n </div>\n\n {/* Essential Form Fields */}\n <div className=\"space-y-3\">\n <Input\n type=\"email\"\n placeholder=\"Email address\"\n value={formData.email}\n onChange={(e) => handleInputChange('email', e.target.value)}\n required\n />\n\n {paymentMethod === 'card' && (\n <>\n <Input\n placeholder=\"Card number\"\n value={formData.cardNumber}\n onChange={(e) => handleInputChange('cardNumber', e.target.value)}\n required\n />\n <div className=\"grid grid-cols-2 gap-2\">\n <Input\n placeholder=\"MM/YY\"\n value={formData.expiryDate}\n onChange={(e) => handleInputChange('expiryDate', e.target.value)}\n required\n />\n <Input\n placeholder=\"CVV\"\n value={formData.cvv}\n onChange={(e) => handleInputChange('cvv', e.target.value)}\n required\n />\n </div>\n <Input\n placeholder=\"Cardholder name\"\n value={formData.name}\n onChange={(e) => handleInputChange('name', e.target.value)}\n required\n />\n </>\n )}\n </div>\n\n {/* Checkout Button */}\n <Button\n variant=\"secondary\"\n onClick={handleQuickCheckout}\n disabled={isProcessing}\n className=\"w-full\"\n >\n {isProcessing ? 'Processing...' : `Complete Order - $${total.toFixed(2)}`}\n </Button>\n </div>\n\n {/* Security Notice */}\n <div className=\"flex items-center justify-center text-xs text-gray-500 pt-2\">\n <Lock className=\"h-3 w-3 mr-1\" />\n Secure 256-bit SSL encryption\n </div>\n\n {/* Free Shipping Notice */}\n {subtotal < 100 && (\n <div className=\"text-center text-sm text-gray-600 bg-blue-50 p-2 rounded-lg\">\n Add ${(100 - subtotal).toFixed(2)} more for free shipping!\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n );\n};"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { CartItem, Order } from './types';
|
|
3
|
+
interface CheckoutComponentProps {
|
|
4
|
+
cartItems?: CartItem[];
|
|
5
|
+
onOrderComplete?: (order: Order) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const CheckoutComponent: React.FC<CheckoutComponentProps>;
|
|
8
|
+
export {};
|