@beyondcorp/beyond-ui 1.2.26 → 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/AllProductsView/AllProductsView.d.ts +0 -11
- package/dist/components/AllProductsView/AllProductsView.js +2 -9
- package/dist/components/AllProductsView/AllProductsView.js.map +1 -1
- package/dist/components/AllProductsView/ProductCard.js +4 -2
- package/dist/components/AllProductsView/ProductCard.js.map +1 -1
- package/dist/components/Card/Card.js +1 -1
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/DashboardGrid/DashboardGrid.d.ts +3 -22
- package/dist/components/DashboardGrid/DashboardGrid.js +10 -48
- package/dist/components/DashboardGrid/DashboardGrid.js.map +1 -1
- 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/components/MarketplaceLayout/MarketplaceLayout.d.ts +0 -10
- package/dist/components/MarketplaceLayout/MarketplaceLayout.js +3 -3
- package/dist/components/MarketplaceLayout/MarketplaceLayout.js.map +1 -1
- 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 @@
|
|
|
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":";;;;;;;;;;AAyBA,MAAM,eAAe,GAAe;AAClC,IAAA;AACE,QAAA,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;AAC1B,QAAA,QAAQ,EAAE,CAAC;AACZ,KAAA;AACD,IAAA;AACE,QAAA,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;AAC1B,QAAA,QAAQ,EAAE,CAAC;AACZ,KAAA;CACF;AAEM,MAAM,eAAe,GAAmC,CAAC,EAC9D,SAAS,GAAG,eAAe,EAC3B,OAAO,EACP,UAAU,EACV,SAAS,GAAG,EAAE,GACf,KAAI;IACH,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IACnD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAkC,MAAM,CAAC;IAC3F,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;AACvD,IAAA,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC;AACvC,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,UAAU,EAAE,EAAE;AACd,QAAA,UAAU,EAAE,EAAE;AACd,QAAA,GAAG,EAAE,EAAE;AACP,QAAA,IAAI,EAAE,EAAE;AACT,KAAA,CAAC;;AAGF,IAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC/F,IAAA,MAAM,QAAQ,GAAG,QAAQ,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI;AAC1C,IAAA,MAAM,GAAG,GAAG,QAAQ,GAAG,IAAI;AAC3B,IAAA,MAAM,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,GAAG;AAEvC,IAAA,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAE,KAAa,KAAI;AACzD,QAAA,WAAW,CAAC,IAAI,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC;AACpD,IAAA,CAAC;AAED,IAAA,MAAM,mBAAmB,GAAG,YAAW;QACrC,eAAe,CAAC,IAAI,CAAC;;AAGrB,QAAA,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAEvD,QAAA,UAAU,GAAG,SAAS,CAAC;AACvB,QAAA,SAAS,CAAC,OAAO,CAAC,4BAA4B,CAAC;QAC/C,eAAe,CAAC,KAAK,CAAC;AACxB,IAAA,CAAC;AAED,IAAA,MAAM,sBAAsB,GAAG,YAAW;QACxC,eAAe,CAAC,IAAI,CAAC;;AAGrB,QAAA,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAEvD,QAAA,UAAU,GAAG,SAAS,CAAC;AACvB,QAAA,SAAS,CAAC,OAAO,CAAC,yCAAyC,CAAC;QAC5D,eAAe,CAAC,KAAK,CAAC;AACxB,IAAA,CAAC;IAED,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAE,EAAA,QAAA,EAC5CC,IAAA,CAAC,IAAI,EAAA,EAAA,QAAA,EAAA,CAEHD,GAAA,CAAC,UAAU,EAAA,EAAC,SAAS,EAAC,MAAM,EAAA,QAAA,EAC1BC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAChDA,IAAA,CAAC,SAAS,EAAA,EAAC,SAAS,EAAC,2BAA2B,EAAA,QAAA,EAAA,CAC9CD,GAAA,CAAC,YAAY,EAAA,EAAC,SAAS,EAAC,cAAc,EAAA,CAAG,EAAA,YAAA,EAC9B,SAAS,CAAC,MAAM,EAAA,SAAA,CAAA,EAAA,CACjB,EACX,OAAO,KACNA,GAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,OAAO,EAAA,QAAA,EAChDA,IAAC,CAAC,EAAA,EAAC,SAAS,EAAC,SAAS,EAAA,CAAG,GAClB,CACV,CAAA,EAAA,CACG,EAAA,CACK,EAEbC,IAAA,CAAC,WAAW,IAAC,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CAEhCA,IAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CACEA,IAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,MAAM,aAAa,CAAC,CAAC,UAAU,CAAC,EACzC,SAAS,EAAC,wGAAwG,aAElHA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,CAC1CD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,2BAA2B,EAAA,QAAA,EAAA,eAAA,EAAA,CAAqB,EAChEC,IAAA,CAAC,KAAK,EAAA,EAAC,OAAO,EAAC,SAAS,EAAA,QAAA,EAAA,CAAA,GAAA,EAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,EAAA,CAAS,CAAA,EAAA,CAChD,EACL,UAAU,IACTD,GAAA,CAAC,SAAS,EAAA,EAAC,SAAS,EAAC,uBAAuB,EAAA,CAAG,KAE/CA,GAAA,CAAC,WAAW,EAAA,EAAC,SAAS,EAAC,uBAAuB,EAAA,CAAG,CAClD,CAAA,EAAA,CACM,EAGR,UAAU,KACTC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAA,CAC5B,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,MAClBA,IAAA,CAAA,KAAA,EAAA,EAA2B,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,CAChED,aACE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAC3B,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EACtB,SAAS,EAAC,gCAAgC,EAAA,CAC1C,EACFC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAA,CAC7BD,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,4CAA4C,EAAA,QAAA,EACtD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAA,CAChB,EACJC,IAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,CAAA,OAAA,EAAO,IAAI,CAAC,QAAQ,IAAK,CAAA,EAAA,CACzD,EACNA,IAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,mCAAmC,kBAC5C,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA,EAAA,CAC/C,CAAA,EAAA,EAdI,IAAI,CAAC,OAAO,CAAC,EAAE,CAenB,CACP,CAAC,EAEFA,cAAK,SAAS,EAAC,yCAAyC,EAAA,QAAA,EAAA,CACtDA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,8BAA8B,EAAA,QAAA,EAAA,CAC3CD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,eAAe,yBAAgB,EAC/CC,IAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,EAAA,CAAQ,CAAA,EAAA,CAC/B,EACNA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,8BAA8B,EAAA,QAAA,EAAA,CAC3CD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,eAAe,yBAAgB,EAC/CA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,GAAG,CAAA,CAAA,EAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAAE,GAAQ,CAAA,EAAA,CAC9D,EACNC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,8BAA8B,aAC3CD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,eAAe,EAAA,QAAA,EAAA,KAAA,EAAA,CAAW,EAC1CC,IAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,EAAA,CAAQ,IAC1B,EACNA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kEAAkE,EAAA,QAAA,EAAA,CAC/ED,kCAAkB,EAClBC,IAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAQ,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,EAAA,CAAQ,CAAA,EAAA,CAC5B,CAAA,EAAA,CACF,CAAA,EAAA,CACF,CACP,IACG,EAGNA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACxBD,YAAI,SAAS,EAAC,2BAA2B,EAAA,QAAA,EAAA,eAAA,EAAA,CAAmB,EAG5DC,IAAA,CAAC,MAAM,EAAA,EACL,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,sBAAsB,EAC/B,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAC,QAAQ,EAAA,QAAA,EAAA,CAElBD,GAAA,CAAC,GAAG,EAAA,EAAC,SAAS,EAAC,cAAc,EAAA,CAAG,EAC/B,YAAY,GAAG,eAAe,GAAG,kBAAkB,IAC7C,EAETC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,UAAU,EAAA,QAAA,EAAA,CACvBD,aAAK,SAAS,EAAC,oCAAoC,EAAA,QAAA,EACjDA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iCAAiC,EAAA,CAAG,EAAA,CAC/C,EACNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,sCAAsC,EAAA,QAAA,EACnDA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,6BAA6B,mBAAU,EAAA,CACnD,CAAA,EAAA,CACF,EAGNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EACxBA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAC5B;4CACC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;4CAC9C,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;4CAC5C,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE;AAClD,yCAAA,CAAC,GAAG,CAAC,CAAC,MAAM,MACXC,IAAA,CAAA,QAAA,EAAA,EAEE,OAAO,EAAE,MAAM,gBAAgB,CAAC,MAAM,CAAC,EAAS,CAAC,EACjD,SAAS,EAAE,CAAA,wFAAA,EACT,aAAa,KAAK,MAAM,CAAC;AACvB,kDAAE;AACF,kDAAE,uCACN,CAAA,CAAE,EAAA,QAAA,EAAA,CAEFD,IAAC,MAAM,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,cAAc,EAAA,CAAG,EACvC,MAAM,CAAC,IAAI,CAAA,EAAA,EATP,MAAM,CAAC,EAAE,CAUP,CACV,CAAC,EAAA,CACE,EAAA,CACF,EAGNC,cAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACxBD,IAAC,KAAK,EAAA,EACJ,IAAI,EAAC,OAAO,EACZ,WAAW,EAAC,eAAe,EAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK,EACrB,QAAQ,EAAE,CAAC,CAAC,KAAK,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC3D,QAAQ,EAAA,IAAA,EAAA,CACR,EAED,aAAa,KAAK,MAAM,KACvBC,IAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CACEF,GAAA,CAAC,KAAK,EAAA,EACJ,WAAW,EAAC,aAAa,EACzB,KAAK,EAAE,QAAQ,CAAC,UAAU,EAC1B,QAAQ,EAAE,CAAC,CAAC,KAAK,iBAAiB,CAAC,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAChE,QAAQ,SACR,EACFC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wBAAwB,EAAA,QAAA,EAAA,CACrCD,GAAA,CAAC,KAAK,IACJ,WAAW,EAAC,OAAO,EACnB,KAAK,EAAE,QAAQ,CAAC,UAAU,EAC1B,QAAQ,EAAE,CAAC,CAAC,KAAK,iBAAiB,CAAC,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAChE,QAAQ,EAAA,IAAA,EAAA,CACR,EACFA,GAAA,CAAC,KAAK,EAAA,EACJ,WAAW,EAAC,KAAK,EACjB,KAAK,EAAE,QAAQ,CAAC,GAAG,EACnB,QAAQ,EAAE,CAAC,CAAC,KAAK,iBAAiB,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzD,QAAQ,EAAA,IAAA,EAAA,CACR,CAAA,EAAA,CACE,EACNA,IAAC,KAAK,EAAA,EACJ,WAAW,EAAC,iBAAiB,EAC7B,KAAK,EAAE,QAAQ,CAAC,IAAI,EACpB,QAAQ,EAAE,CAAC,CAAC,KAAK,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC1D,QAAQ,EAAA,IAAA,EAAA,CACR,IACD,CACJ,CAAA,EAAA,CACG,EAGNA,GAAA,CAAC,MAAM,EAAA,EACL,OAAO,EAAC,WAAW,EACnB,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAC,QAAQ,EAAA,QAAA,EAEjB,YAAY,GAAG,eAAe,GAAG,CAAA,kBAAA,EAAqB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAA,CAClE,CAAA,EAAA,CACL,EAGNC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6DAA6D,EAAA,QAAA,EAAA,CAC1ED,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,cAAc,EAAA,CAAG,EAAA,+BAAA,CAAA,EAAA,CAE7B,EAGL,QAAQ,GAAG,GAAG,KACbC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6DAA6D,EAAA,QAAA,EAAA,CAAA,OAAA,EACpE,CAAC,GAAG,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,gCAC7B,CACP,CAAA,EAAA,CACW,CAAA,EAAA,CACT,EAAA,CACH;AAEV;;;;"}
|
|
@@ -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 {};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React__default, { useState } from 'react';
|
|
3
|
+
import { Truck, CreditCard, Check, ChevronRight, Tag, Lock, Shield, MapPin } from 'lucide-react';
|
|
4
|
+
import { Button } from '../Button/Button.js';
|
|
5
|
+
import { Input } from '../Input/Input.js';
|
|
6
|
+
import { Card, CardContent, CardHeader, CardTitle } from '../Card/Card.js';
|
|
7
|
+
import { showToast } from '../Toast/Toast.js';
|
|
8
|
+
import { sampleProducts } from './data/sampleData.js';
|
|
9
|
+
|
|
10
|
+
const sampleCartItems = [
|
|
11
|
+
{
|
|
12
|
+
product: sampleProducts[0],
|
|
13
|
+
quantity: 1,
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
product: sampleProducts[1],
|
|
17
|
+
quantity: 2,
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
const CheckoutComponent = ({ cartItems = sampleCartItems, onOrderComplete, }) => {
|
|
21
|
+
const [currentStep, setCurrentStep] = useState(1);
|
|
22
|
+
const [shippingAddress, setShippingAddress] = useState({});
|
|
23
|
+
const [paymentMethod, setPaymentMethod] = useState({});
|
|
24
|
+
const [couponCode, setCouponCode] = useState('');
|
|
25
|
+
const [appliedCoupon, setAppliedCoupon] = useState(null);
|
|
26
|
+
const [isProcessing, setIsProcessing] = useState(false);
|
|
27
|
+
const [errors, setErrors] = useState({});
|
|
28
|
+
// Calculate totals
|
|
29
|
+
const subtotal = cartItems.reduce((sum, item) => sum + (item.product.price * item.quantity), 0);
|
|
30
|
+
const shipping = subtotal > 100 ? 0 : 9.99;
|
|
31
|
+
const tax = subtotal * 0.08; // 8% tax
|
|
32
|
+
const discount = appliedCoupon ? subtotal * 0.1 : 0; // 10% discount
|
|
33
|
+
const total = subtotal + shipping + tax - discount;
|
|
34
|
+
const steps = [
|
|
35
|
+
{ id: 1, name: 'Shipping', icon: Truck },
|
|
36
|
+
{ id: 2, name: 'Payment', icon: CreditCard },
|
|
37
|
+
{ id: 3, name: 'Review', icon: Check },
|
|
38
|
+
];
|
|
39
|
+
const validateStep = (step) => {
|
|
40
|
+
const newErrors = {};
|
|
41
|
+
if (step === 1) {
|
|
42
|
+
// Validate shipping address
|
|
43
|
+
if (!shippingAddress.firstName)
|
|
44
|
+
newErrors.firstName = 'First name is required';
|
|
45
|
+
if (!shippingAddress.lastName)
|
|
46
|
+
newErrors.lastName = 'Last name is required';
|
|
47
|
+
if (!shippingAddress.email)
|
|
48
|
+
newErrors.email = 'Email is required';
|
|
49
|
+
if (!shippingAddress.address)
|
|
50
|
+
newErrors.address = 'Address is required';
|
|
51
|
+
if (!shippingAddress.city)
|
|
52
|
+
newErrors.city = 'City is required';
|
|
53
|
+
if (!shippingAddress.zipCode)
|
|
54
|
+
newErrors.zipCode = 'ZIP code is required';
|
|
55
|
+
}
|
|
56
|
+
else if (step === 2) {
|
|
57
|
+
// Validate payment method
|
|
58
|
+
if (!paymentMethod.type)
|
|
59
|
+
newErrors.paymentType = 'Payment method is required';
|
|
60
|
+
if (paymentMethod.type === 'card') {
|
|
61
|
+
if (!paymentMethod.name)
|
|
62
|
+
newErrors.cardName = 'Cardholder name is required';
|
|
63
|
+
// Add more card validation as needed
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
setErrors(newErrors);
|
|
67
|
+
return Object.keys(newErrors).length === 0;
|
|
68
|
+
};
|
|
69
|
+
const handleNextStep = () => {
|
|
70
|
+
if (validateStep(currentStep)) {
|
|
71
|
+
setCurrentStep(prev => Math.min(3, prev + 1));
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const handlePrevStep = () => {
|
|
75
|
+
setCurrentStep(prev => Math.max(1, prev - 1));
|
|
76
|
+
};
|
|
77
|
+
const handleApplyCoupon = () => {
|
|
78
|
+
if (couponCode.toLowerCase() === 'save10') {
|
|
79
|
+
setAppliedCoupon(couponCode);
|
|
80
|
+
showToast.success('Coupon applied! 10% discount added.');
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
showToast.error('Invalid coupon code');
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
const handlePlaceOrder = async () => {
|
|
87
|
+
if (!validateStep(3))
|
|
88
|
+
return;
|
|
89
|
+
setIsProcessing(true);
|
|
90
|
+
// Simulate order processing
|
|
91
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
92
|
+
const order = {
|
|
93
|
+
id: `ORD-${Date.now()}`,
|
|
94
|
+
items: cartItems,
|
|
95
|
+
shippingAddress: shippingAddress,
|
|
96
|
+
paymentMethod: paymentMethod,
|
|
97
|
+
subtotal,
|
|
98
|
+
shipping,
|
|
99
|
+
tax,
|
|
100
|
+
discount,
|
|
101
|
+
total,
|
|
102
|
+
status: 'pending',
|
|
103
|
+
createdAt: new Date().toISOString(),
|
|
104
|
+
};
|
|
105
|
+
onOrderComplete?.(order);
|
|
106
|
+
showToast.success('Order placed successfully!');
|
|
107
|
+
setIsProcessing(false);
|
|
108
|
+
};
|
|
109
|
+
const renderShippingStep = () => (jsx("div", { className: "space-y-6", children: jsxs("div", { children: [jsx("h2", { className: "text-xl font-semibold text-gray-900 mb-4", children: "Shipping Information" }), jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [jsxs("div", { children: [jsx("label", { className: "block text-sm font-medium text-gray-700 mb-1", children: "First Name *" }), jsx(Input, { value: shippingAddress.firstName || '', onChange: (e) => setShippingAddress(prev => ({ ...prev, firstName: e.target.value })), className: errors.firstName ? 'border-red-500' : '' }), errors.firstName && (jsx("p", { className: "text-red-500 text-sm mt-1", children: errors.firstName }))] }), jsxs("div", { children: [jsx("label", { className: "block text-sm font-medium text-gray-700 mb-1", children: "Last Name *" }), jsx(Input, { value: shippingAddress.lastName || '', onChange: (e) => setShippingAddress(prev => ({ ...prev, lastName: e.target.value })), className: errors.lastName ? 'border-red-500' : '' }), errors.lastName && (jsx("p", { className: "text-red-500 text-sm mt-1", children: errors.lastName }))] }), jsxs("div", { children: [jsx("label", { className: "block text-sm font-medium text-gray-700 mb-1", children: "Email *" }), jsx(Input, { type: "email", value: shippingAddress.email || '', onChange: (e) => setShippingAddress(prev => ({ ...prev, email: e.target.value })), className: errors.email ? 'border-red-500' : '' }), errors.email && (jsx("p", { className: "text-red-500 text-sm mt-1", children: errors.email }))] }), jsxs("div", { children: [jsx("label", { className: "block text-sm font-medium text-gray-700 mb-1", children: "Phone" }), jsx(Input, { type: "tel", value: shippingAddress.phone || '', onChange: (e) => setShippingAddress(prev => ({ ...prev, phone: e.target.value })) })] }), jsxs("div", { className: "md:col-span-2", children: [jsx("label", { className: "block text-sm font-medium text-gray-700 mb-1", children: "Address *" }), jsx(Input, { value: shippingAddress.address || '', onChange: (e) => setShippingAddress(prev => ({ ...prev, address: e.target.value })), className: errors.address ? 'border-red-500' : '' }), errors.address && (jsx("p", { className: "text-red-500 text-sm mt-1", children: errors.address }))] }), jsxs("div", { children: [jsx("label", { className: "block text-sm font-medium text-gray-700 mb-1", children: "City *" }), jsx(Input, { value: shippingAddress.city || '', onChange: (e) => setShippingAddress(prev => ({ ...prev, city: e.target.value })), className: errors.city ? 'border-red-500' : '' }), errors.city && (jsx("p", { className: "text-red-500 text-sm mt-1", children: errors.city }))] }), jsxs("div", { children: [jsx("label", { className: "block text-sm font-medium text-gray-700 mb-1", children: "State" }), jsx(Input, { value: shippingAddress.state || '', onChange: (e) => setShippingAddress(prev => ({ ...prev, state: e.target.value })) })] }), jsxs("div", { children: [jsx("label", { className: "block text-sm font-medium text-gray-700 mb-1", children: "ZIP Code *" }), jsx(Input, { value: shippingAddress.zipCode || '', onChange: (e) => setShippingAddress(prev => ({ ...prev, zipCode: e.target.value })), className: errors.zipCode ? 'border-red-500' : '' }), errors.zipCode && (jsx("p", { className: "text-red-500 text-sm mt-1", children: errors.zipCode }))] }), jsxs("div", { children: [jsx("label", { className: "block text-sm font-medium text-gray-700 mb-1", children: "Country" }), jsxs("select", { value: shippingAddress.country || 'US', onChange: (e) => setShippingAddress(prev => ({ ...prev, country: e.target.value })), className: "w-full border border-gray-300 rounded-lg px-3 py-2", children: [jsx("option", { value: "US", children: "United States" }), jsx("option", { value: "CA", children: "Canada" }), jsx("option", { value: "UK", children: "United Kingdom" })] })] })] })] }) }));
|
|
110
|
+
const renderPaymentStep = () => (jsx("div", { className: "space-y-6", children: jsxs("div", { children: [jsx("h2", { className: "text-xl font-semibold text-gray-900 mb-4", children: "Payment Method" }), jsx("div", { className: "space-y-3 mb-6", children: [
|
|
111
|
+
{ id: 'card', name: 'Credit/Debit Card', icon: CreditCard },
|
|
112
|
+
{ id: 'paypal', name: 'PayPal', icon: Shield },
|
|
113
|
+
].map((method) => (jsxs("label", { className: `flex items-center p-4 border rounded-lg cursor-pointer transition-colors ${paymentMethod.type === method.id
|
|
114
|
+
? 'border-primary-500 bg-primary-50'
|
|
115
|
+
: 'border-gray-200 hover:border-gray-300'}`, children: [jsx("input", { type: "radio", name: "paymentMethod", value: method.id, checked: paymentMethod.type === method.id, onChange: (e) => setPaymentMethod(prev => ({ ...prev, type: e.target.value })), className: "sr-only" }), jsx(method.icon, { className: "h-5 w-5 text-gray-600 mr-3" }), jsx("span", { className: "font-medium text-gray-900", children: method.name })] }, method.id))) }), paymentMethod.type === 'card' && (jsxs("div", { className: "space-y-4", children: [jsxs("div", { children: [jsx("label", { className: "block text-sm font-medium text-gray-700 mb-1", children: "Cardholder Name *" }), jsx(Input, { value: paymentMethod.name || '', onChange: (e) => setPaymentMethod(prev => ({ ...prev, name: e.target.value })), className: errors.cardName ? 'border-red-500' : '' }), errors.cardName && (jsx("p", { className: "text-red-500 text-sm mt-1", children: errors.cardName }))] }), jsxs("div", { children: [jsx("label", { className: "block text-sm font-medium text-gray-700 mb-1", children: "Card Number *" }), jsx(Input, { placeholder: "1234 5678 9012 3456", onChange: (e) => setPaymentMethod(prev => ({ ...prev, last4: e.target.value.slice(-4) })) })] }), jsxs("div", { className: "grid grid-cols-2 gap-4", children: [jsxs("div", { children: [jsx("label", { className: "block text-sm font-medium text-gray-700 mb-1", children: "Expiry Date *" }), jsx(Input, { placeholder: "MM/YY", onChange: (e) => setPaymentMethod(prev => ({ ...prev, expiryDate: e.target.value })) })] }), jsxs("div", { children: [jsx("label", { className: "block text-sm font-medium text-gray-700 mb-1", children: "CVV *" }), jsx(Input, { placeholder: "123" })] })] })] }))] }) }));
|
|
116
|
+
const renderReviewStep = () => (jsx("div", { className: "space-y-6", children: jsxs("div", { children: [jsx("h2", { className: "text-xl font-semibold text-gray-900 mb-4", children: "Order Review" }), jsxs(Card, { className: "mb-6", children: [jsx(CardHeader, { children: jsxs(CardTitle, { className: "flex items-center", children: [jsx(MapPin, { className: "h-5 w-5 mr-2" }), "Shipping Address"] }) }), jsx(CardContent, { children: jsxs("div", { className: "text-gray-600", children: [jsxs("p", { children: [shippingAddress.firstName, " ", shippingAddress.lastName] }), jsx("p", { children: shippingAddress.address }), jsxs("p", { children: [shippingAddress.city, ", ", shippingAddress.state, " ", shippingAddress.zipCode] }), jsx("p", { children: shippingAddress.email })] }) })] }), jsxs(Card, { className: "mb-6", children: [jsx(CardHeader, { children: jsxs(CardTitle, { className: "flex items-center", children: [jsx(CreditCard, { className: "h-5 w-5 mr-2" }), "Payment Method"] }) }), jsx(CardContent, { children: jsx("div", { className: "text-gray-600", children: paymentMethod.type === 'card' ? (jsxs("p", { children: ["Credit Card ending in ", paymentMethod.last4] })) : (jsx("p", { children: "PayPal" })) }) })] }), jsxs(Card, { children: [jsx(CardHeader, { children: jsx(CardTitle, { children: "Order Items" }) }), jsx(CardContent, { children: jsx("div", { className: "space-y-4", children: cartItems.map((item) => (jsxs("div", { className: "flex items-center space-x-4", children: [jsx("img", { src: item.product.images[0], alt: item.product.name, className: "w-16 h-16 object-cover rounded-lg" }), jsxs("div", { className: "flex-1", children: [jsx("h4", { className: "font-medium text-gray-900", children: item.product.name }), jsxs("p", { className: "text-gray-600", children: ["Quantity: ", item.quantity] })] }), jsx("div", { className: "text-right", children: jsxs("p", { className: "font-medium text-gray-900", children: ["$", (item.product.price * item.quantity).toFixed(2)] }) })] }, item.product.id))) }) })] })] }) }));
|
|
117
|
+
return (jsxs("div", { className: "max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 py-8", children: [jsx("div", { className: "mb-8", children: jsx("div", { className: "flex items-center justify-center", children: steps.map((step, index) => (jsxs(React__default.Fragment, { children: [jsxs("div", { className: "flex items-center", children: [jsx("div", { className: `flex items-center justify-center w-10 h-10 rounded-full border-2 ${currentStep >= step.id
|
|
118
|
+
? 'bg-primary-600 border-primary-600 text-white'
|
|
119
|
+
: 'border-gray-300 text-gray-400'}`, children: currentStep > step.id ? (jsx(Check, { className: "h-5 w-5" })) : (jsx(step.icon, { className: "h-5 w-5" })) }), jsx("span", { className: `ml-2 text-sm font-medium ${currentStep >= step.id ? 'text-primary-600' : 'text-gray-400'}`, children: step.name })] }), index < steps.length - 1 && (jsx(ChevronRight, { className: "h-5 w-5 text-gray-400 mx-4" }))] }, step.id))) }) }), jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-3 gap-8", children: [jsx("div", { className: "lg:col-span-2", children: jsx(Card, { children: jsxs(CardContent, { className: "p-8", children: [currentStep === 1 && renderShippingStep(), currentStep === 2 && renderPaymentStep(), currentStep === 3 && renderReviewStep(), jsxs("div", { className: "flex justify-between mt-8 pt-6 border-t border-gray-200", children: [jsx(Button, { variant: "outline", onClick: handlePrevStep, disabled: currentStep === 1, children: "Previous" }), currentStep < 3 ? (jsx(Button, { variant: "primary", onClick: handleNextStep, children: "Next" })) : (jsx(Button, { variant: "primary", onClick: handlePlaceOrder, disabled: isProcessing, children: isProcessing ? 'Processing...' : 'Place Order' }))] })] }) }) }), jsx("div", { children: jsxs(Card, { className: "sticky top-4", children: [jsx(CardHeader, { children: jsx(CardTitle, { children: "Order Summary" }) }), jsxs(CardContent, { children: [jsx("div", { className: "space-y-3 mb-4", 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-12 h-12 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-sm 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: "mb-4 pb-4 border-b border-gray-200", children: [jsxs("div", { className: "flex space-x-2", children: [jsx(Input, { placeholder: "Coupon code", value: couponCode, onChange: (e) => setCouponCode(e.target.value), disabled: !!appliedCoupon }), jsx(Button, { variant: "outline", onClick: handleApplyCoupon, disabled: !!appliedCoupon || !couponCode, children: "Apply" })] }), appliedCoupon && (jsxs("div", { className: "flex items-center mt-2", children: [jsx(Tag, { className: "h-4 w-4 text-green-600 mr-1" }), jsxs("span", { className: "text-sm text-green-600", children: ["Coupon \"", appliedCoupon, "\" applied"] })] }))] }), jsxs("div", { className: "space-y-2", children: [jsxs("div", { className: "flex justify-between text-sm", children: [jsx("span", { className: "text-gray-600", children: "Subtotal" }), jsxs("span", { className: "text-gray-900", children: ["$", subtotal.toFixed(2)] })] }), jsxs("div", { className: "flex justify-between text-sm", children: [jsx("span", { className: "text-gray-600", children: "Shipping" }), jsx("span", { className: "text-gray-900", 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", { className: "text-gray-900", children: ["$", tax.toFixed(2)] })] }), discount > 0 && (jsxs("div", { className: "flex justify-between text-sm", children: [jsx("span", { className: "text-gray-600", children: "Discount" }), jsxs("span", { className: "text-green-600", children: ["-$", discount.toFixed(2)] })] })), jsxs("div", { className: "flex justify-between text-lg font-semibold pt-2 border-t border-gray-200", children: [jsx("span", { className: "text-gray-900", children: "Total" }), jsxs("span", { className: "text-gray-900", children: ["$", total.toFixed(2)] })] })] }), jsxs("div", { className: "flex items-center justify-center mt-6 pt-4 border-t border-gray-200", children: [jsx(Lock, { className: "h-4 w-4 text-gray-400 mr-2" }), jsx("span", { className: "text-xs text-gray-600", children: "Secure checkout" })] })] })] }) })] })] }));
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
export { CheckoutComponent };
|
|
123
|
+
//# sourceMappingURL=CheckoutComponent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckoutComponent.js","sources":["../../../src/components/Marketplace/CheckoutComponent.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { \n CreditCard, \n Truck, \n Shield, \n Check, \n ChevronRight,\n MapPin,\n User,\n Mail,\n Phone,\n Tag,\n Lock\n} from 'lucide-react';\nimport { Button } from '../Button';\nimport { Input } from '../Input';\nimport { Card, CardHeader, CardTitle, CardContent } from '../Card';\nimport { Badge } from '../Badge';\nimport { Checkbox } from '../Checkbox';\nimport { showToast } from '../Toast';\nimport type { CartItem, ShippingAddress, PaymentMethod, Order } from './types';\nimport { sampleProducts } from './data/sampleData';\n\ninterface CheckoutComponentProps {\n cartItems?: CartItem[];\n onOrderComplete?: (order: Order) => void;\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 CheckoutComponent: React.FC<CheckoutComponentProps> = ({\n cartItems = sampleCartItems,\n onOrderComplete,\n}) => {\n const [currentStep, setCurrentStep] = useState(1);\n const [shippingAddress, setShippingAddress] = useState<Partial<ShippingAddress>>({});\n const [paymentMethod, setPaymentMethod] = useState<Partial<PaymentMethod>>({});\n const [couponCode, setCouponCode] = useState('');\n const [appliedCoupon, setAppliedCoupon] = useState<string | null>(null);\n const [isProcessing, setIsProcessing] = useState(false);\n const [errors, setErrors] = useState<Record<string, string>>({});\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; // 8% tax\n const discount = appliedCoupon ? subtotal * 0.1 : 0; // 10% discount\n const total = subtotal + shipping + tax - discount;\n\n const steps = [\n { id: 1, name: 'Shipping', icon: Truck },\n { id: 2, name: 'Payment', icon: CreditCard },\n { id: 3, name: 'Review', icon: Check },\n ];\n\n const validateStep = (step: number): boolean => {\n const newErrors: Record<string, string> = {};\n\n if (step === 1) {\n // Validate shipping address\n if (!shippingAddress.firstName) newErrors.firstName = 'First name is required';\n if (!shippingAddress.lastName) newErrors.lastName = 'Last name is required';\n if (!shippingAddress.email) newErrors.email = 'Email is required';\n if (!shippingAddress.address) newErrors.address = 'Address is required';\n if (!shippingAddress.city) newErrors.city = 'City is required';\n if (!shippingAddress.zipCode) newErrors.zipCode = 'ZIP code is required';\n } else if (step === 2) {\n // Validate payment method\n if (!paymentMethod.type) newErrors.paymentType = 'Payment method is required';\n if (paymentMethod.type === 'card') {\n if (!paymentMethod.name) newErrors.cardName = 'Cardholder name is required';\n // Add more card validation as needed\n }\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleNextStep = () => {\n if (validateStep(currentStep)) {\n setCurrentStep(prev => Math.min(3, prev + 1));\n }\n };\n\n const handlePrevStep = () => {\n setCurrentStep(prev => Math.max(1, prev - 1));\n };\n\n const handleApplyCoupon = () => {\n if (couponCode.toLowerCase() === 'save10') {\n setAppliedCoupon(couponCode);\n showToast.success('Coupon applied! 10% discount added.');\n } else {\n showToast.error('Invalid coupon code');\n }\n };\n\n const handlePlaceOrder = async () => {\n if (!validateStep(3)) return;\n\n setIsProcessing(true);\n \n // Simulate order processing\n await new Promise(resolve => setTimeout(resolve, 2000));\n\n const order: Order = {\n id: `ORD-${Date.now()}`,\n items: cartItems,\n shippingAddress: shippingAddress as ShippingAddress,\n paymentMethod: paymentMethod as PaymentMethod,\n subtotal,\n shipping,\n tax,\n discount,\n total,\n status: 'pending',\n createdAt: new Date().toISOString(),\n };\n\n onOrderComplete?.(order);\n showToast.success('Order placed successfully!');\n setIsProcessing(false);\n };\n\n const renderShippingStep = () => (\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"text-xl font-semibold text-gray-900 mb-4\">Shipping Information</h2>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n First Name *\n </label>\n <Input\n value={shippingAddress.firstName || ''}\n onChange={(e) => setShippingAddress(prev => ({ ...prev, firstName: e.target.value }))}\n className={errors.firstName ? 'border-red-500' : ''}\n />\n {errors.firstName && (\n <p className=\"text-red-500 text-sm mt-1\">{errors.firstName}</p>\n )}\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Last Name *\n </label>\n <Input\n value={shippingAddress.lastName || ''}\n onChange={(e) => setShippingAddress(prev => ({ ...prev, lastName: e.target.value }))}\n className={errors.lastName ? 'border-red-500' : ''}\n />\n {errors.lastName && (\n <p className=\"text-red-500 text-sm mt-1\">{errors.lastName}</p>\n )}\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Email *\n </label>\n <Input\n type=\"email\"\n value={shippingAddress.email || ''}\n onChange={(e) => setShippingAddress(prev => ({ ...prev, email: e.target.value }))}\n className={errors.email ? 'border-red-500' : ''}\n />\n {errors.email && (\n <p className=\"text-red-500 text-sm mt-1\">{errors.email}</p>\n )}\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Phone\n </label>\n <Input\n type=\"tel\"\n value={shippingAddress.phone || ''}\n onChange={(e) => setShippingAddress(prev => ({ ...prev, phone: e.target.value }))}\n />\n </div>\n <div className=\"md:col-span-2\">\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Address *\n </label>\n <Input\n value={shippingAddress.address || ''}\n onChange={(e) => setShippingAddress(prev => ({ ...prev, address: e.target.value }))}\n className={errors.address ? 'border-red-500' : ''}\n />\n {errors.address && (\n <p className=\"text-red-500 text-sm mt-1\">{errors.address}</p>\n )}\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n City *\n </label>\n <Input\n value={shippingAddress.city || ''}\n onChange={(e) => setShippingAddress(prev => ({ ...prev, city: e.target.value }))}\n className={errors.city ? 'border-red-500' : ''}\n />\n {errors.city && (\n <p className=\"text-red-500 text-sm mt-1\">{errors.city}</p>\n )}\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n State\n </label>\n <Input\n value={shippingAddress.state || ''}\n onChange={(e) => setShippingAddress(prev => ({ ...prev, state: e.target.value }))}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n ZIP Code *\n </label>\n <Input\n value={shippingAddress.zipCode || ''}\n onChange={(e) => setShippingAddress(prev => ({ ...prev, zipCode: e.target.value }))}\n className={errors.zipCode ? 'border-red-500' : ''}\n />\n {errors.zipCode && (\n <p className=\"text-red-500 text-sm mt-1\">{errors.zipCode}</p>\n )}\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Country\n </label>\n <select\n value={shippingAddress.country || 'US'}\n onChange={(e) => setShippingAddress(prev => ({ ...prev, country: e.target.value }))}\n className=\"w-full border border-gray-300 rounded-lg px-3 py-2\"\n >\n <option value=\"US\">United States</option>\n <option value=\"CA\">Canada</option>\n <option value=\"UK\">United Kingdom</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n );\n\n const renderPaymentStep = () => (\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"text-xl font-semibold text-gray-900 mb-4\">Payment Method</h2>\n \n {/* Payment Method Selection */}\n <div className=\"space-y-3 mb-6\">\n {[\n { id: 'card', name: 'Credit/Debit Card', icon: CreditCard },\n { id: 'paypal', name: 'PayPal', icon: Shield },\n ].map((method) => (\n <label\n key={method.id}\n className={`flex items-center p-4 border rounded-lg cursor-pointer transition-colors ${\n paymentMethod.type === method.id\n ? 'border-primary-500 bg-primary-50'\n : 'border-gray-200 hover:border-gray-300'\n }`}\n >\n <input\n type=\"radio\"\n name=\"paymentMethod\"\n value={method.id}\n checked={paymentMethod.type === method.id}\n onChange={(e) => setPaymentMethod(prev => ({ ...prev, type: e.target.value as any }))}\n className=\"sr-only\"\n />\n <method.icon className=\"h-5 w-5 text-gray-600 mr-3\" />\n <span className=\"font-medium text-gray-900\">{method.name}</span>\n </label>\n ))}\n </div>\n\n {/* Card Details */}\n {paymentMethod.type === 'card' && (\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Cardholder Name *\n </label>\n <Input\n value={paymentMethod.name || ''}\n onChange={(e) => setPaymentMethod(prev => ({ ...prev, name: e.target.value }))}\n className={errors.cardName ? 'border-red-500' : ''}\n />\n {errors.cardName && (\n <p className=\"text-red-500 text-sm mt-1\">{errors.cardName}</p>\n )}\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Card Number *\n </label>\n <Input\n placeholder=\"1234 5678 9012 3456\"\n onChange={(e) => setPaymentMethod(prev => ({ ...prev, last4: e.target.value.slice(-4) }))}\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Expiry Date *\n </label>\n <Input\n placeholder=\"MM/YY\"\n onChange={(e) => setPaymentMethod(prev => ({ ...prev, expiryDate: e.target.value }))}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n CVV *\n </label>\n <Input placeholder=\"123\" />\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n\n const renderReviewStep = () => (\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"text-xl font-semibold text-gray-900 mb-4\">Order Review</h2>\n \n {/* Shipping Address Review */}\n <Card className=\"mb-6\">\n <CardHeader>\n <CardTitle className=\"flex items-center\">\n <MapPin className=\"h-5 w-5 mr-2\" />\n Shipping Address\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-gray-600\">\n <p>{shippingAddress.firstName} {shippingAddress.lastName}</p>\n <p>{shippingAddress.address}</p>\n <p>{shippingAddress.city}, {shippingAddress.state} {shippingAddress.zipCode}</p>\n <p>{shippingAddress.email}</p>\n </div>\n </CardContent>\n </Card>\n\n {/* Payment Method Review */}\n <Card className=\"mb-6\">\n <CardHeader>\n <CardTitle className=\"flex items-center\">\n <CreditCard className=\"h-5 w-5 mr-2\" />\n Payment Method\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-gray-600\">\n {paymentMethod.type === 'card' ? (\n <p>Credit Card ending in {paymentMethod.last4}</p>\n ) : (\n <p>PayPal</p>\n )}\n </div>\n </CardContent>\n </Card>\n\n {/* Order Items Review */}\n <Card>\n <CardHeader>\n <CardTitle>Order Items</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-4\">\n {cartItems.map((item) => (\n <div key={item.product.id} className=\"flex items-center space-x-4\">\n <img\n src={item.product.images[0]}\n alt={item.product.name}\n className=\"w-16 h-16 object-cover rounded-lg\"\n />\n <div className=\"flex-1\">\n <h4 className=\"font-medium text-gray-900\">{item.product.name}</h4>\n <p className=\"text-gray-600\">Quantity: {item.quantity}</p>\n </div>\n <div className=\"text-right\">\n <p className=\"font-medium text-gray-900\">\n ${(item.product.price * item.quantity).toFixed(2)}\n </p>\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n );\n\n return (\n <div className=\"max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 py-8\">\n {/* Progress Indicator */}\n <div className=\"mb-8\">\n <div className=\"flex items-center justify-center\">\n {steps.map((step, index) => (\n <React.Fragment key={step.id}>\n <div className=\"flex items-center\">\n <div\n className={`flex items-center justify-center w-10 h-10 rounded-full border-2 ${\n currentStep >= step.id\n ? 'bg-primary-600 border-primary-600 text-white'\n : 'border-gray-300 text-gray-400'\n }`}\n >\n {currentStep > step.id ? (\n <Check className=\"h-5 w-5\" />\n ) : (\n <step.icon className=\"h-5 w-5\" />\n )}\n </div>\n <span\n className={`ml-2 text-sm font-medium ${\n currentStep >= step.id ? 'text-primary-600' : 'text-gray-400'\n }`}\n >\n {step.name}\n </span>\n </div>\n {index < steps.length - 1 && (\n <ChevronRight className=\"h-5 w-5 text-gray-400 mx-4\" />\n )}\n </React.Fragment>\n ))}\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-8\">\n {/* Main Content */}\n <div className=\"lg:col-span-2\">\n <Card>\n <CardContent className=\"p-8\">\n {currentStep === 1 && renderShippingStep()}\n {currentStep === 2 && renderPaymentStep()}\n {currentStep === 3 && renderReviewStep()}\n\n {/* Navigation Buttons */}\n <div className=\"flex justify-between mt-8 pt-6 border-t border-gray-200\">\n <Button\n variant=\"outline\"\n onClick={handlePrevStep}\n disabled={currentStep === 1}\n >\n Previous\n </Button>\n \n {currentStep < 3 ? (\n <Button variant=\"primary\" onClick={handleNextStep}>\n Next\n </Button>\n ) : (\n <Button\n variant=\"primary\"\n onClick={handlePlaceOrder}\n disabled={isProcessing}\n >\n {isProcessing ? 'Processing...' : 'Place Order'}\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Order Summary */}\n <div>\n <Card className=\"sticky top-4\">\n <CardHeader>\n <CardTitle>Order Summary</CardTitle>\n </CardHeader>\n <CardContent>\n {/* Cart Items */}\n <div className=\"space-y-3 mb-4\">\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-12 h-12 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-sm 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 </div>\n\n {/* Coupon Code */}\n <div className=\"mb-4 pb-4 border-b border-gray-200\">\n <div className=\"flex space-x-2\">\n <Input\n placeholder=\"Coupon code\"\n value={couponCode}\n onChange={(e) => setCouponCode(e.target.value)}\n disabled={!!appliedCoupon}\n />\n <Button\n variant=\"outline\"\n onClick={handleApplyCoupon}\n disabled={!!appliedCoupon || !couponCode}\n >\n Apply\n </Button>\n </div>\n {appliedCoupon && (\n <div className=\"flex items-center mt-2\">\n <Tag className=\"h-4 w-4 text-green-600 mr-1\" />\n <span className=\"text-sm text-green-600\">\n Coupon \"{appliedCoupon}\" applied\n </span>\n </div>\n )}\n </div>\n\n {/* Order Totals */}\n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-gray-600\">Subtotal</span>\n <span className=\"text-gray-900\">${subtotal.toFixed(2)}</span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-gray-600\">Shipping</span>\n <span className=\"text-gray-900\">\n {shipping === 0 ? 'Free' : `$${shipping.toFixed(2)}`}\n </span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-gray-600\">Tax</span>\n <span className=\"text-gray-900\">${tax.toFixed(2)}</span>\n </div>\n {discount > 0 && (\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-gray-600\">Discount</span>\n <span className=\"text-green-600\">-${discount.toFixed(2)}</span>\n </div>\n )}\n <div className=\"flex justify-between text-lg font-semibold pt-2 border-t border-gray-200\">\n <span className=\"text-gray-900\">Total</span>\n <span className=\"text-gray-900\">${total.toFixed(2)}</span>\n </div>\n </div>\n\n {/* Security Badge */}\n <div className=\"flex items-center justify-center mt-6 pt-4 border-t border-gray-200\">\n <Lock className=\"h-4 w-4 text-gray-400 mr-2\" />\n <span className=\"text-xs text-gray-600\">Secure checkout</span>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n};"],"names":["_jsx","_jsxs","React"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Product } from './types';
|
|
3
|
+
interface MarketplaceComponentProps {
|
|
4
|
+
userRole?: 'buyer' | 'seller' | 'admin';
|
|
5
|
+
onProductClick?: (product: Product) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const MarketplaceComponent: React.FC<MarketplaceComponentProps>;
|
|
8
|
+
export {};
|