hey-pharmacist-ecommerce 1.1.11 → 1.1.13
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/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +632 -511
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +633 -512
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/CartItem.tsx +63 -42
- package/src/components/FilterChips.tsx +54 -80
- package/src/components/OrderCard.tsx +89 -56
- package/src/components/ProductCard.tsx +131 -55
- package/src/hooks/useOrders.ts +1 -0
- package/src/lib/types/index.ts +1 -0
- package/src/providers/CartProvider.tsx +47 -3
- package/src/screens/CartScreen.tsx +146 -231
- package/src/screens/CheckoutScreen.tsx +30 -61
- package/src/screens/LoginScreen.tsx +1 -1
- package/src/screens/OrdersScreen.tsx +91 -148
- package/src/screens/ProductDetailScreen.tsx +355 -362
- package/src/screens/RegisterScreen.tsx +1 -1
- package/src/screens/ShopScreen.tsx +439 -268
- package/src/screens/WishlistScreen.tsx +80 -76
package/dist/index.js
CHANGED
|
@@ -6799,7 +6799,24 @@ function CartProvider({ children }) {
|
|
|
6799
6799
|
const addToCart = async (productId, quantity = 1, variantId) => {
|
|
6800
6800
|
setIsLoading(true);
|
|
6801
6801
|
try {
|
|
6802
|
-
const
|
|
6802
|
+
const currentItems = cart?.cartBody?.items || [];
|
|
6803
|
+
const targetVariantId = variantId || productId;
|
|
6804
|
+
const existingItemIndex = currentItems.findIndex(
|
|
6805
|
+
(item) => item.productVariantId === targetVariantId
|
|
6806
|
+
);
|
|
6807
|
+
const items = [...currentItems];
|
|
6808
|
+
if (existingItemIndex >= 0) {
|
|
6809
|
+
items[existingItemIndex] = {
|
|
6810
|
+
...items[existingItemIndex],
|
|
6811
|
+
quantity: (items[existingItemIndex].quantity || 0) + quantity
|
|
6812
|
+
};
|
|
6813
|
+
} else {
|
|
6814
|
+
items.push({
|
|
6815
|
+
productVariantId: targetVariantId,
|
|
6816
|
+
quantity
|
|
6817
|
+
});
|
|
6818
|
+
}
|
|
6819
|
+
const response = await new CartApi(getApiConfiguration()).handleUserCart({ items });
|
|
6803
6820
|
setCart(response.data);
|
|
6804
6821
|
sonner.toast.success("Added to cart!");
|
|
6805
6822
|
} catch (error) {
|
|
@@ -6812,7 +6829,17 @@ function CartProvider({ children }) {
|
|
|
6812
6829
|
const updateQuantity = async (productId, quantity) => {
|
|
6813
6830
|
setIsLoading(true);
|
|
6814
6831
|
try {
|
|
6815
|
-
const
|
|
6832
|
+
const currentItems = cart?.cartBody?.items || [];
|
|
6833
|
+
const items = currentItems.map((item) => {
|
|
6834
|
+
if (item.productVariantId === productId) {
|
|
6835
|
+
return {
|
|
6836
|
+
...item,
|
|
6837
|
+
quantity
|
|
6838
|
+
};
|
|
6839
|
+
}
|
|
6840
|
+
return item;
|
|
6841
|
+
});
|
|
6842
|
+
const response = await new CartApi(getApiConfiguration()).handleUserCart({ items });
|
|
6816
6843
|
setCart(response.data);
|
|
6817
6844
|
} catch (error) {
|
|
6818
6845
|
sonner.toast.error(error.response?.data?.message || "Failed to update cart");
|
|
@@ -6824,7 +6851,9 @@ function CartProvider({ children }) {
|
|
|
6824
6851
|
const removeFromCart = async (productId) => {
|
|
6825
6852
|
setIsLoading(true);
|
|
6826
6853
|
try {
|
|
6827
|
-
const
|
|
6854
|
+
const currentItems = cart?.cartBody?.items || [];
|
|
6855
|
+
const items = currentItems.filter((item) => item.productVariantId !== productId);
|
|
6856
|
+
const response = await new CartApi(getApiConfiguration()).handleUserCart({ items });
|
|
6828
6857
|
setCart(response.data);
|
|
6829
6858
|
} catch (error) {
|
|
6830
6859
|
sonner.toast.error(error.response?.data?.message || "Failed to remove from cart");
|
|
@@ -7090,8 +7119,11 @@ function ProductCard({
|
|
|
7090
7119
|
const { buildPath } = useBasePath();
|
|
7091
7120
|
const [isFavorite, setIsFavorite] = React21.useState(isFavorited);
|
|
7092
7121
|
const { addToWishlist, removeFromWishlist, isInWishlist } = useWishlist();
|
|
7122
|
+
const { addToCart, isLoading: isAddingToCart } = useCart();
|
|
7093
7123
|
const [isHovered, setIsHovered] = React21.useState(false);
|
|
7094
7124
|
const [isImageLoaded, setIsImageLoaded] = React21.useState(false);
|
|
7125
|
+
const [selectedVariantImage, setSelectedVariantImage] = React21.useState(null);
|
|
7126
|
+
const [selectedVariantId, setSelectedVariantId] = React21.useState(null);
|
|
7095
7127
|
const handleImageLoad = React21.useCallback(() => {
|
|
7096
7128
|
setIsImageLoaded(true);
|
|
7097
7129
|
}, []);
|
|
@@ -7122,22 +7154,51 @@ function ProductCard({
|
|
|
7122
7154
|
React21.useEffect(() => {
|
|
7123
7155
|
setIsFavorite(isInWishlist(product?._id || "") || isFavorited);
|
|
7124
7156
|
}, [isFavorited, isInWishlist, product?._id]);
|
|
7157
|
+
React21.useEffect(() => {
|
|
7158
|
+
setSelectedVariantImage(null);
|
|
7159
|
+
setSelectedVariantId(null);
|
|
7160
|
+
setIsImageLoaded(false);
|
|
7161
|
+
}, [product._id]);
|
|
7125
7162
|
const handleKeyDown = (e) => {
|
|
7126
7163
|
if (e.key === "Enter" || e.key === " ") {
|
|
7127
7164
|
e.preventDefault();
|
|
7128
7165
|
handleCardClick(e);
|
|
7129
7166
|
}
|
|
7130
7167
|
};
|
|
7131
|
-
React21.useMemo(() => {
|
|
7168
|
+
const variantImages = React21.useMemo(() => {
|
|
7169
|
+
if (!product.productVariants || product.productVariants.length === 0) {
|
|
7170
|
+
return [];
|
|
7171
|
+
}
|
|
7172
|
+
return product.productVariants.filter((variant) => variant.productMedia && variant.productMedia.length > 0).map((variant) => ({
|
|
7173
|
+
variantId: variant.id || variant._id,
|
|
7174
|
+
variantName: variant.name,
|
|
7175
|
+
image: variant.productMedia[0].file,
|
|
7176
|
+
color: variant.attribute?.color || variant.attribute?.Color || null
|
|
7177
|
+
}));
|
|
7178
|
+
}, [product.productVariants]);
|
|
7179
|
+
const selectedVariant = React21.useMemo(() => {
|
|
7180
|
+
if (!selectedVariantId || !product.productVariants) return null;
|
|
7181
|
+
return product.productVariants.find(
|
|
7182
|
+
(variant) => (variant.id || variant._id) === selectedVariantId
|
|
7183
|
+
);
|
|
7184
|
+
}, [selectedVariantId, product.productVariants]);
|
|
7185
|
+
const displayName = React21.useMemo(() => {
|
|
7186
|
+
return selectedVariant?.name || product.name;
|
|
7187
|
+
}, [selectedVariant, product.name]);
|
|
7188
|
+
const imageSource = React21.useMemo(() => {
|
|
7189
|
+
const src = selectedVariantImage || product.productMedia?.[0]?.file || "/placeholder-product.jpg";
|
|
7132
7190
|
return {
|
|
7133
|
-
src
|
|
7191
|
+
src,
|
|
7134
7192
|
alt: product.name || "Product image"
|
|
7135
7193
|
};
|
|
7136
|
-
}, [product.productMedia, product.name]);
|
|
7194
|
+
}, [product.productMedia, product.name, selectedVariantImage]);
|
|
7195
|
+
React21.useEffect(() => {
|
|
7196
|
+
setIsImageLoaded(false);
|
|
7197
|
+
}, [imageSource.src]);
|
|
7137
7198
|
return /* @__PURE__ */ React21__default.default.createElement(
|
|
7138
7199
|
framerMotion.motion.article,
|
|
7139
7200
|
{
|
|
7140
|
-
className: "relative group bg-white rounded-xl overflow-hidden shadow-sm hover:shadow-md transition-all duration-300 border border-gray-100 hover:border-gray-200 flex
|
|
7201
|
+
className: "relative group bg-white rounded-xl overflow-hidden shadow-sm hover:shadow-md transition-all duration-300 border border-gray-100 hover:border-gray-200 flex flex-col",
|
|
7141
7202
|
whileHover: { y: -4 },
|
|
7142
7203
|
onMouseEnter: () => setIsHovered(true),
|
|
7143
7204
|
onMouseLeave: () => setIsHovered(false),
|
|
@@ -7147,7 +7208,7 @@ function ProductCard({
|
|
|
7147
7208
|
onClick: handleCardClick,
|
|
7148
7209
|
onKeyDown: handleKeyDown
|
|
7149
7210
|
},
|
|
7150
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "relative
|
|
7211
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "relative aspect-square w-full overflow-hidden bg-gray-50" }, /* @__PURE__ */ React21__default.default.createElement(framerMotion.AnimatePresence, null, !isImageLoaded && /* @__PURE__ */ React21__default.default.createElement(
|
|
7151
7212
|
framerMotion.motion.div,
|
|
7152
7213
|
{
|
|
7153
7214
|
className: "absolute inset-0 bg-gray-200 animate-pulse",
|
|
@@ -7155,16 +7216,18 @@ function ProductCard({
|
|
|
7155
7216
|
exit: { opacity: 0 },
|
|
7156
7217
|
transition: { duration: 0.2 }
|
|
7157
7218
|
}
|
|
7158
|
-
)),
|
|
7219
|
+
)), /* @__PURE__ */ React21__default.default.createElement(
|
|
7159
7220
|
Image3__default.default,
|
|
7160
7221
|
{
|
|
7161
|
-
src:
|
|
7162
|
-
alt:
|
|
7222
|
+
src: imageSource.src,
|
|
7223
|
+
alt: imageSource.alt,
|
|
7163
7224
|
fill: true,
|
|
7164
7225
|
className: `h-full w-full object-cover object-center transition-opacity duration-300 ${product.inventoryCount === 0 ? "opacity-60" : ""} ${isImageLoaded ? "opacity-100" : "opacity-0"}`,
|
|
7165
7226
|
sizes: "(max-width: 640px) 100vw, (max-width: 768px) 50vw, 33vw",
|
|
7166
7227
|
priority: false,
|
|
7167
|
-
onLoad: handleImageLoad
|
|
7228
|
+
onLoad: handleImageLoad,
|
|
7229
|
+
onError: () => setIsImageLoaded(true),
|
|
7230
|
+
key: imageSource.src
|
|
7168
7231
|
}
|
|
7169
7232
|
), /* @__PURE__ */ React21__default.default.createElement("div", { className: "absolute top-3 left-3 flex flex-col gap-2 z-10" }, product.isDiscounted && /* @__PURE__ */ React21__default.default.createElement(
|
|
7170
7233
|
framerMotion.motion.span,
|
|
@@ -7189,51 +7252,80 @@ function ProductCard({
|
|
|
7189
7252
|
{
|
|
7190
7253
|
type: "button",
|
|
7191
7254
|
onClick: handleFavorite,
|
|
7192
|
-
className:
|
|
7255
|
+
className: "absolute top-2 right-2 p-2 rounded-full z-10 transition-colors bg-white shadow-md hover:shadow-lg text-primary-600 hover:text-red-500",
|
|
7193
7256
|
whileHover: { scale: 1.1 },
|
|
7194
7257
|
whileTap: { scale: 0.95 },
|
|
7195
7258
|
"aria-label": isFavorite ? "Remove from wishlist" : "Add to wishlist"
|
|
7196
7259
|
},
|
|
7197
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Heart, { className: `w-5 h-5 ${isFavorite ? "fill-
|
|
7260
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Heart, { className: `w-5 h-5 ${isFavorite ? "fill-red-500 text-red-500" : ""}` })
|
|
7198
7261
|
)),
|
|
7199
7262
|
/* @__PURE__ */ React21__default.default.createElement("div", { className: "absolute top-4 left-4 flex flex-col gap-2" }, product.inventoryCount === 0 && /* @__PURE__ */ React21__default.default.createElement("span", { className: "px-3 py-1 rounded-full text-sm font-bold bg-red-100 text-red-800" }, "Out of Stock")),
|
|
7200
|
-
|
|
7263
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "p-4" }, product.parentCategories && product.parentCategories?.length > 0 && /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xs text-gray-500 uppercase tracking-wider mb-1" }, product.parentCategories?.map((category) => category?.name).join(", ") || "No categories"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-2" }, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "text-lg font-semibold text-gray-900 line-clamp-1 group-hover:text-primary-600 transition-colors" }, displayName)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-baseline gap-2" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-2xl font-bold text-gray-900" }, formatPrice(product.finalPrice)), product.inventoryCount > 0 && /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-xs text-gray-500" }, product.inventoryCount > 0 ? "In Stock" : "Out of Stock")), product.priceBeforeDiscount && product.priceBeforeDiscount > product.finalPrice && /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-sm text-gray-500 line-through" }, formatPrice(product.priceBeforeDiscount))), variantImages.length > 0 && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-2 mt-3" }, variantImages.map((variant, index) => /* @__PURE__ */ React21__default.default.createElement(
|
|
7201
7264
|
"button",
|
|
7202
7265
|
{
|
|
7266
|
+
key: variant.variantId || index,
|
|
7203
7267
|
type: "button",
|
|
7204
|
-
onClick:
|
|
7205
|
-
|
|
7206
|
-
|
|
7268
|
+
onClick: (e) => {
|
|
7269
|
+
e.stopPropagation();
|
|
7270
|
+
if (selectedVariantId === variant.variantId) {
|
|
7271
|
+
setSelectedVariantImage(null);
|
|
7272
|
+
setSelectedVariantId(null);
|
|
7273
|
+
} else {
|
|
7274
|
+
setSelectedVariantImage(variant.image);
|
|
7275
|
+
setSelectedVariantId(variant.variantId || null);
|
|
7276
|
+
}
|
|
7277
|
+
setIsImageLoaded(false);
|
|
7278
|
+
},
|
|
7279
|
+
className: `relative w-8 h-8 rounded-full overflow-hidden border-2 transition-all ${selectedVariantId === variant.variantId ? "border-primary-500 ring-2 ring-primary-200" : "border-gray-200 hover:border-primary-300"}`,
|
|
7280
|
+
"aria-label": `Select ${variant.color || "variant"} color`
|
|
7207
7281
|
},
|
|
7208
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
7209
|
-
|
|
7210
|
-
|
|
7282
|
+
/* @__PURE__ */ React21__default.default.createElement(
|
|
7283
|
+
Image3__default.default,
|
|
7284
|
+
{
|
|
7285
|
+
src: variant.image,
|
|
7286
|
+
alt: variant.color || `Variant ${index + 1}`,
|
|
7287
|
+
fill: true,
|
|
7288
|
+
className: "object-cover",
|
|
7289
|
+
sizes: "32px"
|
|
7290
|
+
}
|
|
7291
|
+
)
|
|
7292
|
+
)))),
|
|
7211
7293
|
/* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-auto p-4 pt-0" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
7212
7294
|
"button",
|
|
7213
7295
|
{
|
|
7214
7296
|
type: "button",
|
|
7215
|
-
onClick: (e) => {
|
|
7297
|
+
onClick: async (e) => {
|
|
7216
7298
|
e.stopPropagation();
|
|
7217
|
-
|
|
7299
|
+
if (!selectedVariantId && variantImages.length > 0) {
|
|
7300
|
+
sonner.toast.error("Please select a variant");
|
|
7301
|
+
return;
|
|
7302
|
+
}
|
|
7303
|
+
try {
|
|
7304
|
+
await addToCart(
|
|
7305
|
+
product._id || product.id,
|
|
7306
|
+
1,
|
|
7307
|
+
selectedVariantId || void 0
|
|
7308
|
+
);
|
|
7309
|
+
} catch (error) {
|
|
7310
|
+
console.error("Failed to add to cart", error);
|
|
7311
|
+
}
|
|
7218
7312
|
},
|
|
7219
|
-
|
|
7313
|
+
disabled: isAddingToCart || variantImages.length > 0 && !selectedVariantId,
|
|
7314
|
+
className: "w-full flex items-center justify-center gap-2 rounded-full px-3 py-2.5 text-sm font-medium bg-primary-400 hover:bg-primary-500 text-white transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
7220
7315
|
},
|
|
7221
|
-
"
|
|
7222
|
-
|
|
7316
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ShoppingCart, { className: "h-4 w-4" }),
|
|
7317
|
+
"Add to Cart"
|
|
7318
|
+
), /* @__PURE__ */ React21__default.default.createElement(
|
|
7223
7319
|
"button",
|
|
7224
7320
|
{
|
|
7225
7321
|
type: "button",
|
|
7226
|
-
onClick:
|
|
7227
|
-
|
|
7228
|
-
|
|
7322
|
+
onClick: (e) => {
|
|
7323
|
+
e.stopPropagation();
|
|
7324
|
+
router.push(buildPath(`/products/${product._id}`));
|
|
7325
|
+
},
|
|
7326
|
+
className: "mt-2 w-full flex items-center justify-center rounded-full border border-gray-300 bg-white px-3 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 transition-colors"
|
|
7229
7327
|
},
|
|
7230
|
-
|
|
7231
|
-
lucideReact.Heart,
|
|
7232
|
-
{
|
|
7233
|
-
className: `mr-2 h-4 w-4 ${isFavorite ? "fill-red-500 text-red-500" : "text-primary-600"}`
|
|
7234
|
-
}
|
|
7235
|
-
),
|
|
7236
|
-
isFavorite ? "Saved" : "Save for later"
|
|
7328
|
+
"View More"
|
|
7237
7329
|
))
|
|
7238
7330
|
);
|
|
7239
7331
|
}
|
|
@@ -7445,8 +7537,12 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7445
7537
|
max: ""
|
|
7446
7538
|
});
|
|
7447
7539
|
const [expandedCategories, setExpandedCategories] = React21.useState({});
|
|
7540
|
+
const [expandedFilterSections, setExpandedFilterSections] = React21.useState({
|
|
7541
|
+
category: true
|
|
7542
|
+
// Category section starts expanded
|
|
7543
|
+
});
|
|
7448
7544
|
const { products, isLoading, pagination } = useProducts(filters, page, 20);
|
|
7449
|
-
const { categories } = useCategories();
|
|
7545
|
+
const { categories, isLoading: isLoadingCategories } = useCategories();
|
|
7450
7546
|
const handleSearch = (e) => {
|
|
7451
7547
|
e.preventDefault();
|
|
7452
7548
|
if (searchQuery.trim()) {
|
|
@@ -7516,7 +7612,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7516
7612
|
});
|
|
7517
7613
|
return { newArrivals: newArrivals2, inStockCount };
|
|
7518
7614
|
}, [products]);
|
|
7519
|
-
|
|
7615
|
+
React21.useMemo(
|
|
7520
7616
|
() => [
|
|
7521
7617
|
{
|
|
7522
7618
|
id: "new",
|
|
@@ -7559,8 +7655,11 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7559
7655
|
const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1e3;
|
|
7560
7656
|
items = items.filter((p) => new Date(p.createdAt).getTime() >= thirtyDaysAgo);
|
|
7561
7657
|
}
|
|
7658
|
+
if (filters.brand) {
|
|
7659
|
+
items = items.filter((p) => p.brand && p.brand.trim().toLowerCase() === filters.brand.toLowerCase());
|
|
7660
|
+
}
|
|
7562
7661
|
return items;
|
|
7563
|
-
}, [isLoading, products, filters.tags, filters.newArrivals]);
|
|
7662
|
+
}, [isLoading, products, filters.tags, filters.newArrivals, filters.brand]);
|
|
7564
7663
|
const sortedProducts = React21.useMemo(() => {
|
|
7565
7664
|
if (isLoading) {
|
|
7566
7665
|
return filteredProducts;
|
|
@@ -7580,14 +7679,23 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7580
7679
|
}
|
|
7581
7680
|
}, [isLoading, filteredProducts, sortOption]);
|
|
7582
7681
|
const displayedProducts = sortedProducts;
|
|
7583
|
-
const
|
|
7682
|
+
const availableBrands = React21.useMemo(() => {
|
|
7683
|
+
const brandSet = /* @__PURE__ */ new Set();
|
|
7684
|
+
products.forEach((product) => {
|
|
7685
|
+
if (product.brand && product.brand.trim()) {
|
|
7686
|
+
brandSet.add(product.brand.trim());
|
|
7687
|
+
}
|
|
7688
|
+
});
|
|
7689
|
+
return Array.from(brandSet).sort();
|
|
7690
|
+
}, [products]);
|
|
7691
|
+
React21.useMemo(() => {
|
|
7584
7692
|
const counts = /* @__PURE__ */ new Map();
|
|
7585
7693
|
products.forEach((p) => {
|
|
7586
7694
|
(p.tags || []).forEach((t) => counts.set(t, (counts.get(t) || 0) + 1));
|
|
7587
7695
|
});
|
|
7588
7696
|
return Array.from(counts.entries()).sort((a, b) => b[1] - a[1]).slice(0, 4).map(([tag]) => tag);
|
|
7589
7697
|
}, [products]);
|
|
7590
|
-
|
|
7698
|
+
React21.useCallback((term) => {
|
|
7591
7699
|
setSearchQuery("");
|
|
7592
7700
|
setFilters((current) => ({
|
|
7593
7701
|
...current,
|
|
@@ -7643,6 +7751,13 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7643
7751
|
});
|
|
7644
7752
|
setPage(1);
|
|
7645
7753
|
}, []);
|
|
7754
|
+
const handleClearCategory = React21.useCallback(() => {
|
|
7755
|
+
setFilters((current) => {
|
|
7756
|
+
const { category, subCategory, ...rest } = current;
|
|
7757
|
+
return rest;
|
|
7758
|
+
});
|
|
7759
|
+
setPage(1);
|
|
7760
|
+
}, []);
|
|
7646
7761
|
const handleClearFilters = React21.useCallback(() => {
|
|
7647
7762
|
setFilters({});
|
|
7648
7763
|
setSearchQuery("");
|
|
@@ -7705,6 +7820,23 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7705
7820
|
});
|
|
7706
7821
|
setPage(1);
|
|
7707
7822
|
}, []);
|
|
7823
|
+
const handleBrandChange = React21.useCallback((brand) => {
|
|
7824
|
+
setFilters((current) => {
|
|
7825
|
+
if (current.brand === brand) {
|
|
7826
|
+
const { brand: _, ...rest } = current;
|
|
7827
|
+
return rest;
|
|
7828
|
+
}
|
|
7829
|
+
return { ...current, brand };
|
|
7830
|
+
});
|
|
7831
|
+
setPage(1);
|
|
7832
|
+
}, []);
|
|
7833
|
+
const handleRemoveBrand = React21.useCallback(() => {
|
|
7834
|
+
setFilters((current) => {
|
|
7835
|
+
const { brand, ...rest } = current;
|
|
7836
|
+
return rest;
|
|
7837
|
+
});
|
|
7838
|
+
setPage(1);
|
|
7839
|
+
}, []);
|
|
7708
7840
|
const handlePriceRangeSelect = React21.useCallback(
|
|
7709
7841
|
(value) => {
|
|
7710
7842
|
const range = priceRanges.find((item) => item.value === value);
|
|
@@ -7779,7 +7911,8 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7779
7911
|
minPrice,
|
|
7780
7912
|
maxPrice,
|
|
7781
7913
|
tags,
|
|
7782
|
-
newArrivals
|
|
7914
|
+
newArrivals,
|
|
7915
|
+
brand: brandFilter
|
|
7783
7916
|
} = filters;
|
|
7784
7917
|
const activeFilterChips = React21.useMemo(() => {
|
|
7785
7918
|
const chips = [];
|
|
@@ -7853,6 +7986,13 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7853
7986
|
onRemove: handleToggleNewArrivals
|
|
7854
7987
|
});
|
|
7855
7988
|
}
|
|
7989
|
+
if (brandFilter) {
|
|
7990
|
+
chips.push({
|
|
7991
|
+
key: "brand",
|
|
7992
|
+
label: `Brand: ${brandFilter}`,
|
|
7993
|
+
onRemove: handleRemoveBrand
|
|
7994
|
+
});
|
|
7995
|
+
}
|
|
7856
7996
|
return chips;
|
|
7857
7997
|
}, [
|
|
7858
7998
|
categories,
|
|
@@ -7864,53 +8004,87 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7864
8004
|
handleRemovePrice,
|
|
7865
8005
|
handleRemoveSearch,
|
|
7866
8006
|
handleRemoveTag,
|
|
8007
|
+
handleRemoveBrand,
|
|
7867
8008
|
inStockOnly,
|
|
7868
8009
|
maxPrice,
|
|
7869
8010
|
minPrice,
|
|
7870
8011
|
searchFilter,
|
|
7871
8012
|
tags,
|
|
7872
|
-
newArrivals
|
|
8013
|
+
newArrivals,
|
|
8014
|
+
brandFilter
|
|
7873
8015
|
]);
|
|
7874
8016
|
const hasActiveFilters = activeFilterChips.length > 0;
|
|
7875
8017
|
const isCustomPriceDirty = customPrice.min.trim() !== "" || customPrice.max.trim() !== "";
|
|
7876
|
-
const
|
|
8018
|
+
const toggleFilterSection = React21.useCallback((section) => {
|
|
8019
|
+
setExpandedFilterSections((prev) => ({
|
|
8020
|
+
...prev,
|
|
8021
|
+
[section]: !prev[section]
|
|
8022
|
+
}));
|
|
8023
|
+
}, []);
|
|
8024
|
+
const getCategoryIconForFilter = (categoryName2) => {
|
|
8025
|
+
const name = categoryName2.toLowerCase();
|
|
8026
|
+
if (name.includes("scrub") || name.includes("uniform")) return lucideReact.Shirt;
|
|
8027
|
+
if (name.includes("vitamin") || name.includes("supplement")) return lucideReact.Pill;
|
|
8028
|
+
if (name.includes("medicine") || name.includes("medication")) return lucideReact.Box;
|
|
8029
|
+
if (name.includes("care") || name.includes("personal")) return lucideReact.Heart;
|
|
8030
|
+
return lucideReact.Package;
|
|
8031
|
+
};
|
|
8032
|
+
const renderFiltersPanel = () => /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "text-lg font-bold text-slate-900" }, "Filters"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React21__default.default.createElement("label", { className: "text-sm font-medium text-slate-600" }, "Search Products"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-slate-400" }), /* @__PURE__ */ React21__default.default.createElement(
|
|
8033
|
+
"input",
|
|
8034
|
+
{
|
|
8035
|
+
type: "text",
|
|
8036
|
+
placeholder: "Search...",
|
|
8037
|
+
value: searchQuery,
|
|
8038
|
+
onChange: handleInputChange,
|
|
8039
|
+
className: "w-full rounded-lg border border-slate-200 bg-white pl-10 pr-4 py-2 text-sm text-slate-900 placeholder-slate-400 focus:border-primary-500 focus:outline-none focus:ring-2 focus:ring-primary-500/20"
|
|
8040
|
+
}
|
|
8041
|
+
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
7877
8042
|
"button",
|
|
7878
8043
|
{
|
|
7879
8044
|
type: "button",
|
|
7880
|
-
onClick:
|
|
7881
|
-
className: "text-sm font-
|
|
8045
|
+
onClick: () => toggleFilterSection("category"),
|
|
8046
|
+
className: "flex w-full items-center justify-between text-sm font-medium text-slate-600"
|
|
8047
|
+
},
|
|
8048
|
+
/* @__PURE__ */ React21__default.default.createElement("span", null, "Category"),
|
|
8049
|
+
expandedFilterSections.category ? /* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronUp, { className: "h-4 w-4" }) : /* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronDown, { className: "h-4 w-4" })
|
|
8050
|
+
), expandedFilterSections.category && /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8051
|
+
"button",
|
|
8052
|
+
{
|
|
8053
|
+
type: "button",
|
|
8054
|
+
onClick: handleClearCategory,
|
|
8055
|
+
className: `flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-medium transition ${!categoryFilter ? "bg-primary-600 text-white" : "bg-white text-slate-700 border border-slate-200 hover:border-primary-300"}`
|
|
7882
8056
|
},
|
|
7883
|
-
"
|
|
7884
|
-
|
|
8057
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: `flex h-6 w-6 items-center justify-center rounded ${!categoryFilter ? "bg-white/20" : "bg-slate-100"}` }, !categoryFilter ? /* @__PURE__ */ React21__default.default.createElement(lucideReact.Check, { className: "h-4 w-4 text-white" }) : /* @__PURE__ */ React21__default.default.createElement(lucideReact.ShoppingBag, { className: "h-4 w-4 text-slate-600" })),
|
|
8058
|
+
/* @__PURE__ */ React21__default.default.createElement("span", null, "All Products")
|
|
8059
|
+
), sortedCategories.map((category) => {
|
|
7885
8060
|
const isCategoryActive = categoryFilter === category.id;
|
|
7886
8061
|
const isExpanded = !!expandedCategories[category.id];
|
|
7887
|
-
|
|
7888
|
-
|
|
8062
|
+
const Icon = getCategoryIconForFilter(category.name ?? "");
|
|
8063
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { key: category.id, className: "space-y-1" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8064
|
+
"button",
|
|
7889
8065
|
{
|
|
7890
|
-
|
|
7891
|
-
tabIndex: 0,
|
|
8066
|
+
type: "button",
|
|
7892
8067
|
onClick: () => {
|
|
7893
8068
|
if (!isExpanded) toggleCategoryExpand(category.id ?? "");
|
|
7894
8069
|
handleCategoryChange(category.id ?? "");
|
|
7895
8070
|
},
|
|
7896
|
-
className: `flex w-full items-center
|
|
8071
|
+
className: `flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-medium transition ${isCategoryActive ? "bg-primary-600 text-white" : "bg-white text-slate-700 border border-slate-200 hover:border-primary-300"}`
|
|
7897
8072
|
},
|
|
7898
|
-
/* @__PURE__ */ React21__default.default.createElement("
|
|
7899
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
8073
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: `flex h-6 w-6 items-center justify-center rounded ${isCategoryActive ? "bg-white/20" : "bg-slate-100"}` }, /* @__PURE__ */ React21__default.default.createElement(Icon, { className: `h-4 w-4 ${isCategoryActive ? "text-white" : "text-slate-600"}` })),
|
|
8074
|
+
/* @__PURE__ */ React21__default.default.createElement("span", { className: "flex-1 text-left" }, category.name),
|
|
8075
|
+
Array.isArray(category.categorySubCategories) && category.categorySubCategories.length > 0 && /* @__PURE__ */ React21__default.default.createElement(
|
|
7900
8076
|
"button",
|
|
7901
8077
|
{
|
|
7902
8078
|
type: "button",
|
|
7903
8079
|
onClick: (e) => {
|
|
7904
|
-
e.preventDefault();
|
|
7905
8080
|
e.stopPropagation();
|
|
7906
8081
|
toggleCategoryExpand(category.id ?? "");
|
|
7907
8082
|
},
|
|
7908
|
-
className: "
|
|
7909
|
-
"aria-label": isExpanded ? "Collapse" : "Expand"
|
|
8083
|
+
className: "p-1"
|
|
7910
8084
|
},
|
|
7911
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronDown, { className: `h-4 w-4 transition-transform ${isExpanded ? "rotate-180 text-
|
|
8085
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronDown, { className: `h-4 w-4 transition-transform ${isExpanded ? "rotate-180" : ""} ${isCategoryActive ? "text-white" : "text-slate-400"}` })
|
|
7912
8086
|
)
|
|
7913
|
-
), isExpanded && Array.isArray(category.categorySubCategories) && category.categorySubCategories.length > 0 && /* @__PURE__ */ React21__default.default.createElement("div", { className: "
|
|
8087
|
+
), isExpanded && Array.isArray(category.categorySubCategories) && category.categorySubCategories.length > 0 && /* @__PURE__ */ React21__default.default.createElement("div", { className: "ml-9 space-y-1" }, category.categorySubCategories.map((sub) => {
|
|
7914
8088
|
const isSubActive = subCategoryFilter === sub.id;
|
|
7915
8089
|
return /* @__PURE__ */ React21__default.default.createElement(
|
|
7916
8090
|
"button",
|
|
@@ -7918,12 +8092,61 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7918
8092
|
key: sub.id,
|
|
7919
8093
|
type: "button",
|
|
7920
8094
|
onClick: () => handleSubCategoryChange(category.id ?? "", sub.id),
|
|
7921
|
-
className: `block w-full px-
|
|
8095
|
+
className: `block w-full rounded-lg px-3 py-2 text-sm text-left transition ${isSubActive ? "bg-primary-50 text-primary-700 font-medium" : "text-slate-600 hover:bg-slate-50"}`
|
|
7922
8096
|
},
|
|
7923
8097
|
sub.name
|
|
7924
8098
|
);
|
|
7925
|
-
})))
|
|
7926
|
-
})))
|
|
8099
|
+
})));
|
|
8100
|
+
}))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8101
|
+
"button",
|
|
8102
|
+
{
|
|
8103
|
+
type: "button",
|
|
8104
|
+
onClick: () => toggleFilterSection("brand"),
|
|
8105
|
+
className: "flex w-full items-center justify-between text-sm font-medium text-slate-600"
|
|
8106
|
+
},
|
|
8107
|
+
/* @__PURE__ */ React21__default.default.createElement("span", null, "Brand"),
|
|
8108
|
+
expandedFilterSections.brand ? /* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronUp, { className: "h-4 w-4" }) : /* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronDown, { className: "h-4 w-4" })
|
|
8109
|
+
), expandedFilterSections.brand && /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-1.5 max-h-64 overflow-y-auto" }, availableBrands.length === 0 ? /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-xs text-slate-500" }, "No brands available") : availableBrands.map((brand) => {
|
|
8110
|
+
const isSelected = brandFilter === brand;
|
|
8111
|
+
return /* @__PURE__ */ React21__default.default.createElement(
|
|
8112
|
+
"button",
|
|
8113
|
+
{
|
|
8114
|
+
key: brand,
|
|
8115
|
+
type: "button",
|
|
8116
|
+
onClick: () => handleBrandChange(brand),
|
|
8117
|
+
className: `flex w-full items-center justify-between rounded-md border px-2.5 py-1.5 text-xs font-medium transition ${isSelected ? "border-primary-500 bg-primary-50 text-primary-700" : "border-slate-200 bg-white text-slate-600 hover:border-primary-300"}`
|
|
8118
|
+
},
|
|
8119
|
+
/* @__PURE__ */ React21__default.default.createElement("span", { className: "truncate" }, brand),
|
|
8120
|
+
isSelected && /* @__PURE__ */ React21__default.default.createElement(lucideReact.Check, { className: "h-3 w-3 text-primary-600 flex-shrink-0 ml-2" })
|
|
8121
|
+
);
|
|
8122
|
+
}))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8123
|
+
"button",
|
|
8124
|
+
{
|
|
8125
|
+
type: "button",
|
|
8126
|
+
onClick: () => toggleFilterSection("availability"),
|
|
8127
|
+
className: "flex w-full items-center justify-between text-sm font-medium text-slate-600"
|
|
8128
|
+
},
|
|
8129
|
+
/* @__PURE__ */ React21__default.default.createElement("span", null, "Availability"),
|
|
8130
|
+
expandedFilterSections.availability ? /* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronUp, { className: "h-4 w-4" }) : /* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronDown, { className: "h-4 w-4" })
|
|
8131
|
+
), expandedFilterSections.availability && /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8132
|
+
"button",
|
|
8133
|
+
{
|
|
8134
|
+
type: "button",
|
|
8135
|
+
onClick: handleToggleStock,
|
|
8136
|
+
className: `flex w-full items-center justify-between rounded-lg border px-3 py-2.5 text-sm font-medium transition ${inStockOnly ? "border-primary-500 bg-primary-50 text-primary-700" : "border-slate-200 bg-white text-slate-600 hover:border-primary-300"}`
|
|
8137
|
+
},
|
|
8138
|
+
/* @__PURE__ */ React21__default.default.createElement("span", null, "In stock only"),
|
|
8139
|
+
inStockOnly && /* @__PURE__ */ React21__default.default.createElement(lucideReact.Check, { className: "h-4 w-4 text-primary-600" })
|
|
8140
|
+
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8141
|
+
"button",
|
|
8142
|
+
{
|
|
8143
|
+
type: "button",
|
|
8144
|
+
onClick: () => toggleFilterSection("price"),
|
|
8145
|
+
className: "flex w-full items-center justify-between text-sm font-medium text-slate-600"
|
|
8146
|
+
},
|
|
8147
|
+
/* @__PURE__ */ React21__default.default.createElement("span", null, "Price Range"),
|
|
8148
|
+
expandedFilterSections.price ? /* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronUp, { className: "h-4 w-4" }) : /* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronDown, { className: "h-4 w-4" })
|
|
8149
|
+
), expandedFilterSections.price && /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap gap-2" }, priceRanges.map((range) => {
|
|
7927
8150
|
const isActive = selectedPriceRange === range.value;
|
|
7928
8151
|
return /* @__PURE__ */ React21__default.default.createElement(
|
|
7929
8152
|
"button",
|
|
@@ -7931,27 +8154,29 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7931
8154
|
type: "button",
|
|
7932
8155
|
key: range.value,
|
|
7933
8156
|
onClick: () => handlePriceRangeSelect(range.value),
|
|
7934
|
-
className: `rounded-
|
|
8157
|
+
className: `rounded-lg border px-3 py-1.5 text-sm font-medium transition ${isActive ? "border-primary-600 bg-primary-600 text-white" : "border-slate-200 bg-white text-slate-600 hover:border-primary-300"}`
|
|
7935
8158
|
},
|
|
7936
8159
|
range.label
|
|
7937
8160
|
);
|
|
7938
|
-
})), /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-2 gap-
|
|
8161
|
+
})), /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-2 gap-2" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
7939
8162
|
Input,
|
|
7940
8163
|
{
|
|
7941
8164
|
type: "number",
|
|
7942
8165
|
min: "0",
|
|
7943
|
-
placeholder: "
|
|
8166
|
+
placeholder: "Min",
|
|
7944
8167
|
value: customPrice.min,
|
|
7945
|
-
onChange: (event) => setCustomPrice((current) => ({ ...current, min: event.target.value }))
|
|
8168
|
+
onChange: (event) => setCustomPrice((current) => ({ ...current, min: event.target.value })),
|
|
8169
|
+
className: "text-sm"
|
|
7946
8170
|
}
|
|
7947
8171
|
), /* @__PURE__ */ React21__default.default.createElement(
|
|
7948
8172
|
Input,
|
|
7949
8173
|
{
|
|
7950
8174
|
type: "number",
|
|
7951
8175
|
min: "0",
|
|
7952
|
-
placeholder: "
|
|
8176
|
+
placeholder: "Max",
|
|
7953
8177
|
value: customPrice.max,
|
|
7954
|
-
onChange: (event) => setCustomPrice((current) => ({ ...current, max: event.target.value }))
|
|
8178
|
+
onChange: (event) => setCustomPrice((current) => ({ ...current, max: event.target.value })),
|
|
8179
|
+
className: "text-sm"
|
|
7955
8180
|
}
|
|
7956
8181
|
)), /* @__PURE__ */ React21__default.default.createElement(
|
|
7957
8182
|
"button",
|
|
@@ -7959,118 +8184,91 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7959
8184
|
type: "button",
|
|
7960
8185
|
onClick: applyCustomPrice,
|
|
7961
8186
|
disabled: !isCustomPriceDirty,
|
|
7962
|
-
className: "w-full rounded-
|
|
7963
|
-
},
|
|
7964
|
-
"Apply price range"
|
|
7965
|
-
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React21__default.default.createElement("h4", { className: "text-xs font-semibold uppercase tracking-[0.2em] text-gray-500" }, "Availability"), /* @__PURE__ */ React21__default.default.createElement(
|
|
7966
|
-
"button",
|
|
7967
|
-
{
|
|
7968
|
-
type: "button",
|
|
7969
|
-
onClick: handleToggleStock,
|
|
7970
|
-
className: `flex w-full items-center justify-between rounded-xl border px-4 py-3 text-sm font-medium transition ${inStockOnly ? "border-primary-500 bg-primary-50 text-primary-700" : "border-gray-200 bg-white text-gray-600 hover:border-primary-300 hover:text-primary-600"}`
|
|
7971
|
-
},
|
|
7972
|
-
/* @__PURE__ */ React21__default.default.createElement("span", null, "In stock only"),
|
|
7973
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Sparkles, { className: "h-4 w-4 text-primary-500" })
|
|
7974
|
-
), /* @__PURE__ */ React21__default.default.createElement(
|
|
7975
|
-
"button",
|
|
7976
|
-
{
|
|
7977
|
-
type: "button",
|
|
7978
|
-
onClick: handleToggleNewArrivals,
|
|
7979
|
-
className: `mt-2 flex w-full items-center justify-between rounded-xl border px-4 py-3 text-sm font-medium transition ${newArrivals ? "border-secondary-500 bg-secondary-50 text-secondary-700" : "border-gray-200 bg-white text-gray-600 hover:border-secondary-300 hover:text-secondary-600"}`
|
|
8187
|
+
className: "w-full rounded-lg border border-primary-500 bg-primary-500/10 px-4 py-2 text-sm font-medium text-primary-700 transition hover:bg-primary-500/20 disabled:cursor-not-allowed disabled:border-slate-200 disabled:text-slate-400"
|
|
7980
8188
|
},
|
|
7981
|
-
|
|
7982
|
-
|
|
7983
|
-
)
|
|
7984
|
-
|
|
7985
|
-
|
|
7986
|
-
|
|
7987
|
-
|
|
7988
|
-
|
|
7989
|
-
|
|
7990
|
-
|
|
8189
|
+
"Apply"
|
|
8190
|
+
)))));
|
|
8191
|
+
const displayCategories = React21.useMemo(() => {
|
|
8192
|
+
return topCategories.slice(0, 5);
|
|
8193
|
+
}, [topCategories]);
|
|
8194
|
+
const getCategoryIcon = (categoryName2) => {
|
|
8195
|
+
const name = categoryName2.toLowerCase();
|
|
8196
|
+
if (name.includes("scrub") || name.includes("uniform")) return lucideReact.Shirt;
|
|
8197
|
+
if (name.includes("vitamin") || name.includes("supplement")) return lucideReact.Pill;
|
|
8198
|
+
if (name.includes("medicine") || name.includes("medication")) return lucideReact.Box;
|
|
8199
|
+
if (name.includes("care") || name.includes("personal")) return lucideReact.Heart;
|
|
8200
|
+
return lucideReact.Package;
|
|
8201
|
+
};
|
|
8202
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-[#F9FAFB]" }, /* @__PURE__ */ React21__default.default.createElement("section", { className: "relative overflow-hidden bg-[#E6EBF0] py-16 md:py-24" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
7991
8203
|
framerMotion.motion.div,
|
|
7992
8204
|
{
|
|
7993
8205
|
initial: { opacity: 0, y: 24 },
|
|
7994
8206
|
animate: { opacity: 1, y: 0 },
|
|
7995
|
-
className: "max-w-
|
|
8207
|
+
className: "max-w-4xl mx-auto space-y-6 text-center"
|
|
7996
8208
|
},
|
|
7997
|
-
/* @__PURE__ */ React21__default.default.createElement("
|
|
7998
|
-
/* @__PURE__ */ React21__default.default.createElement("h1", { className: "text-4xl font-bold leading-tight
|
|
7999
|
-
/* @__PURE__ */ React21__default.default.createElement("p", { className: "text-
|
|
8209
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-center gap-2 mb-4" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Star, { className: "h-5 w-5 text-orange-500 fill-orange-500" }), /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-sm font-semibold uppercase tracking-wider text-orange-500" }, "COMPLETE PHARMACY SHOP")),
|
|
8210
|
+
/* @__PURE__ */ React21__default.default.createElement("h1", { className: "text-3xl md:text-4xl font-bold text-slate-900 leading-tight" }, "Medical Supplies & Wellness Products"),
|
|
8211
|
+
/* @__PURE__ */ React21__default.default.createElement("p", { className: "text-base md:text-lg text-slate-600 max-w-2xl mx-auto" }, "From professional scrubs to vitamins, medicines to personal care - everything you need for health and wellness."),
|
|
8000
8212
|
/* @__PURE__ */ React21__default.default.createElement(
|
|
8001
8213
|
"form",
|
|
8002
8214
|
{
|
|
8003
8215
|
onSubmit: handleSearch,
|
|
8004
|
-
className: "
|
|
8216
|
+
className: "max-w-2xl mx-auto mt-8"
|
|
8005
8217
|
},
|
|
8006
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "relative w-full" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8218
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "relative w-full" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Search, { className: "absolute left-5 top-1/2 -translate-y-1/2 h-5 w-5 text-slate-400 pointer-events-none" }), /* @__PURE__ */ React21__default.default.createElement(
|
|
8007
8219
|
"input",
|
|
8008
8220
|
{
|
|
8009
8221
|
type: "search",
|
|
8010
|
-
placeholder: "Search for products,
|
|
8222
|
+
placeholder: "Search for products, brands, or categories...",
|
|
8011
8223
|
value: searchQuery,
|
|
8012
8224
|
onChange: handleInputChange,
|
|
8013
8225
|
onKeyDown: handleKeyDown,
|
|
8014
|
-
className: "flex h-
|
|
8226
|
+
className: "flex h-16 w-full rounded-full border-0 bg-white px-5 pl-14 pr-5 text-base text-slate-900 placeholder-slate-400 shadow-lg focus:outline-none focus:ring-2 focus:ring-primary-500/30 disabled:opacity-50",
|
|
8015
8227
|
disabled: isSearching
|
|
8016
8228
|
}
|
|
8017
|
-
), /* @__PURE__ */ React21__default.default.createElement(
|
|
8018
|
-
"button",
|
|
8019
|
-
{
|
|
8020
|
-
type: "submit",
|
|
8021
|
-
className: "absolute right-2 top-1/2 -translate-y-1/2 rounded-xl bg-white/20 p-3 text-white transition hover:bg-white/30 disabled:opacity-50",
|
|
8022
|
-
disabled: !searchQuery.trim() || isSearching
|
|
8023
|
-
},
|
|
8024
|
-
isSearching ? /* @__PURE__ */ React21__default.default.createElement("div", { className: "h-5 w-5 animate-spin rounded-full border-2 border-white border-t-transparent" }) : /* @__PURE__ */ React21__default.default.createElement(lucideReact.Search, { className: "h-5 w-5" })
|
|
8025
8229
|
))
|
|
8026
8230
|
)
|
|
8027
|
-
), /* @__PURE__ */ React21__default.default.createElement(
|
|
8028
|
-
|
|
8029
|
-
{
|
|
8030
|
-
|
|
8031
|
-
animate: { opacity: 1, y: 0 },
|
|
8032
|
-
transition: { delay: 0.15 },
|
|
8033
|
-
className: "mt-12 flex flex-col gap-6 rounded-3xl border border-white/20 bg-white/10 p-6 backdrop-blur md:flex-row md:items-center md:justify-between"
|
|
8034
|
-
},
|
|
8035
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm font-semibold uppercase tracking-[0.3em] text-white/60" }, "Explore popular searches"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap gap-2" }, quickSearches.map((term) => /* @__PURE__ */ React21__default.default.createElement(
|
|
8036
|
-
"button",
|
|
8037
|
-
{
|
|
8038
|
-
key: term,
|
|
8039
|
-
type: "button",
|
|
8040
|
-
onClick: () => handleQuickSearch(term),
|
|
8041
|
-
className: "rounded-full border border-white/30 bg-white/10 px-4 py-2 text-sm font-medium text-white transition hover:border-white/50 hover:bg-white/20"
|
|
8042
|
-
},
|
|
8043
|
-
term
|
|
8044
|
-
)))),
|
|
8045
|
-
topCategories.length > 0 && /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-3 md:text-right" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm font-semibold uppercase tracking-[0.3em] text-white/60" }, "Trending categories"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap justify-start gap-2 md:justify-end" }, topCategories.map((category) => /* @__PURE__ */ React21__default.default.createElement(
|
|
8046
|
-
"button",
|
|
8231
|
+
))), /* @__PURE__ */ React21__default.default.createElement("section", { className: "bg-white py-8 " }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-2xl md:text-3xl font-bold text-slate-900 mb-8" }, "Shop by Category"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5 gap-6" }, isLoadingCategories ? (
|
|
8232
|
+
// Skeleton loaders
|
|
8233
|
+
/* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, Array.from({ length: 6 }).map((_, index) => /* @__PURE__ */ React21__default.default.createElement(
|
|
8234
|
+
"div",
|
|
8047
8235
|
{
|
|
8048
|
-
key:
|
|
8049
|
-
|
|
8050
|
-
onClick: () => handleCategoryChange(category.id ?? ""),
|
|
8051
|
-
className: "rounded-full bg-white/15 px-3 py-1.5 text-sm font-medium text-white transition hover:bg-white/25"
|
|
8236
|
+
key: index,
|
|
8237
|
+
className: "rounded-xl border border-slate-200 bg-white p-8"
|
|
8052
8238
|
},
|
|
8053
|
-
|
|
8054
|
-
|
|
8055
|
-
|
|
8056
|
-
|
|
8239
|
+
/* @__PURE__ */ React21__default.default.createElement(Skeleton, { className: "h-10 w-10 mb-4 rounded-lg" }),
|
|
8240
|
+
/* @__PURE__ */ React21__default.default.createElement(Skeleton, { className: "h-6 w-3/4 mb-2 rounded" }),
|
|
8241
|
+
/* @__PURE__ */ React21__default.default.createElement(Skeleton, { className: "h-4 w-1/2 rounded" })
|
|
8242
|
+
)))
|
|
8243
|
+
) : /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement(
|
|
8244
|
+
framerMotion.motion.button,
|
|
8245
|
+
{
|
|
8246
|
+
initial: { opacity: 0, y: 20 },
|
|
8247
|
+
animate: { opacity: 1, y: 0 },
|
|
8248
|
+
onClick: handleClearCategory,
|
|
8249
|
+
className: `group relative overflow-hidden rounded-xl p-8 text-left transition ${!categoryFilter ? "bg-gradient-to-b from-primary-500 to-primary-300 text-white shadow-lg scale-105" : "border border-slate-200 bg-white hover:border-primary-300 hover:shadow-md"}`
|
|
8250
|
+
},
|
|
8251
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ShoppingBag, { className: `h-10 w-10 mb-4 ${!categoryFilter ? "text-white" : "text-primary-500"}` }),
|
|
8252
|
+
/* @__PURE__ */ React21__default.default.createElement("h3", { className: `text-xl font-bold mb-2 ${!categoryFilter ? "text-white" : "text-slate-900 group-hover:text-primary-600"}` }, "All Products"),
|
|
8253
|
+
/* @__PURE__ */ React21__default.default.createElement("p", { className: `text-sm ${!categoryFilter ? "text-white/90" : "text-slate-500"}` }, "Browse everything")
|
|
8254
|
+
), displayCategories.map((category, index) => {
|
|
8255
|
+
const Icon = getCategoryIcon(category.name ?? "");
|
|
8256
|
+
const isSelected = categoryFilter === category.id;
|
|
8057
8257
|
return /* @__PURE__ */ React21__default.default.createElement(
|
|
8058
|
-
framerMotion.motion.
|
|
8258
|
+
framerMotion.motion.button,
|
|
8059
8259
|
{
|
|
8060
|
-
key:
|
|
8260
|
+
key: category.id,
|
|
8061
8261
|
initial: { opacity: 0, y: 20 },
|
|
8062
8262
|
animate: { opacity: 1, y: 0 },
|
|
8063
|
-
transition: { delay:
|
|
8064
|
-
|
|
8065
|
-
|
|
8066
|
-
role: card.id === "new" ? "button" : void 0,
|
|
8067
|
-
"aria-pressed": card.id === "new" ? newArrivals ? "true" : "false" : void 0,
|
|
8068
|
-
title: card.id === "new" ? newArrivals ? "Filter active: showing products from the last 30 days" : "Click to filter products from the last 30 days" : void 0
|
|
8263
|
+
transition: { delay: index * 0.1 },
|
|
8264
|
+
onClick: () => handleCategoryChange(category.id ?? ""),
|
|
8265
|
+
className: `group rounded-xl p-8 text-left transition ${isSelected ? "bg-gradient-to-b from-primary-500 to-primary-300 text-white shadow-lg" : "border border-slate-200 bg-white hover:border-primary-300 hover:shadow-md"}`
|
|
8069
8266
|
},
|
|
8070
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
8071
|
-
/* @__PURE__ */ React21__default.default.createElement("
|
|
8267
|
+
/* @__PURE__ */ React21__default.default.createElement(Icon, { className: `h-10 w-10 mb-4 ${isSelected ? "text-white" : "text-primary-500"}` }),
|
|
8268
|
+
/* @__PURE__ */ React21__default.default.createElement("h3", { className: `text-xl font-bold mb-2 transition-colors ${isSelected ? "text-white" : "text-slate-900 group-hover:text-primary-600"}` }, category.name),
|
|
8269
|
+
/* @__PURE__ */ React21__default.default.createElement("p", { className: `text-sm ${isSelected ? "text-white/90" : "text-slate-500"}` }, category.name?.toLowerCase().includes("scrub") ? "Professional uniforms" : category.name?.toLowerCase().includes("vitamin") ? "Health supplements" : category.name?.toLowerCase().includes("medicine") ? "OTC medications" : category.name?.toLowerCase().includes("care") ? "Daily essentials" : "Shop now")
|
|
8072
8270
|
);
|
|
8073
|
-
})))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative z-10
|
|
8271
|
+
}))))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative z-10 pb-16 mt-8" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-col gap-8 lg:flex-row" }, /* @__PURE__ */ React21__default.default.createElement("aside", { className: "hidden w-72 flex-shrink-0 lg:block" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "sticky top-24 rounded-lg bg-white p-6" }, renderFiltersPanel())), /* @__PURE__ */ React21__default.default.createElement("main", { className: "flex-1 space-y-6" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-3xl border border-gray-100 bg-white p-6 shadow-sm" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-col gap-6 md:flex-row md:items-center md:justify-between" }, /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-base font-medium text-gray-700" }, isLoading ? "Loading products..." : `Showing ${displayedProducts.length} of ${pagination.total || displayedProducts.length} products`)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-col gap-3 md:flex-row md:items-center" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.ArrowUpDown, { className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), /* @__PURE__ */ React21__default.default.createElement(
|
|
8074
8272
|
"select",
|
|
8075
8273
|
{
|
|
8076
8274
|
value: sortOption,
|
|
@@ -8131,7 +8329,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8131
8329
|
className: "text-sm font-semibold text-gray-500 hover:text-gray-700"
|
|
8132
8330
|
},
|
|
8133
8331
|
"Reset all"
|
|
8134
|
-
))), /* @__PURE__ */ React21__default.default.createElement("div",
|
|
8332
|
+
))), /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-6" }, isLoading ? /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5" }, Array.from({ length: 6 }).map((_, index) => /* @__PURE__ */ React21__default.default.createElement(ProductCardSkeleton, { key: index }))) : displayedProducts.length > 0 ? viewMode === "grid" ? /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5" }, displayedProducts.map((product) => /* @__PURE__ */ React21__default.default.createElement("div", { key: product.id, className: "h-full" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8135
8333
|
ProductCard,
|
|
8136
8334
|
{
|
|
8137
8335
|
product,
|
|
@@ -8303,6 +8501,16 @@ function ProductDetailScreen({ productId }) {
|
|
|
8303
8501
|
url: media.file
|
|
8304
8502
|
}));
|
|
8305
8503
|
}
|
|
8504
|
+
if (product?.productMedia?.length) {
|
|
8505
|
+
return product.productMedia.map((media) => ({
|
|
8506
|
+
src: media.file,
|
|
8507
|
+
width: 800,
|
|
8508
|
+
height: 1e3,
|
|
8509
|
+
alt: product?.name || "Product image",
|
|
8510
|
+
...media,
|
|
8511
|
+
url: media.file
|
|
8512
|
+
}));
|
|
8513
|
+
}
|
|
8306
8514
|
if (product?.images?.length) {
|
|
8307
8515
|
return product.images.map((image) => ({
|
|
8308
8516
|
src: image,
|
|
@@ -8365,6 +8573,7 @@ function ProductDetailScreen({ productId }) {
|
|
|
8365
8573
|
}, [product?.id]);
|
|
8366
8574
|
const handleVariantSelect = async (variant) => {
|
|
8367
8575
|
setSelectedVariant(variant);
|
|
8576
|
+
setActiveImageIndex(0);
|
|
8368
8577
|
};
|
|
8369
8578
|
const handleAddToCart = async () => {
|
|
8370
8579
|
if (!product || !selectedVariant) return;
|
|
@@ -8413,76 +8622,45 @@ function ProductDetailScreen({ productId }) {
|
|
|
8413
8622
|
if (!product) {
|
|
8414
8623
|
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4 py-16" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-3xl bg-white p-10 text-center shadow-sm" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Sparkles, { className: "mx-auto h-10 w-10 text-primary-500" }), /* @__PURE__ */ React21__default.default.createElement("h1", { className: "mt-6 text-2xl font-semibold text-gray-900" }, "Product not found"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-2 text-gray-600" }, "It may have been removed or is temporarily unavailable. Discover other pharmacy essentials in our catalogue."), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-6" }, /* @__PURE__ */ React21__default.default.createElement(Link8__default.default, { href: "/shop", className: "inline-block" }, /* @__PURE__ */ React21__default.default.createElement(Button, null, "Browse products"))))));
|
|
8415
8624
|
}
|
|
8416
|
-
|
|
8417
|
-
const highlightCards = [
|
|
8418
|
-
{
|
|
8419
|
-
icon: lucideReact.ShieldCheck,
|
|
8420
|
-
title: "Pharmacy grade assurance",
|
|
8421
|
-
description: "Sourced from trusted suppliers and reviewed by licensed professionals."
|
|
8422
|
-
},
|
|
8423
|
-
{
|
|
8424
|
-
icon: lucideReact.Truck,
|
|
8425
|
-
title: "Fast, cold-chain ready shipping",
|
|
8426
|
-
description: "Carefully packed and dispatched within 24 hours on business days."
|
|
8427
|
-
},
|
|
8428
|
-
{
|
|
8429
|
-
icon: lucideReact.Award,
|
|
8430
|
-
title: "Loved by patients",
|
|
8431
|
-
description: "Average rating 4.8/5 with over 120 verified customer experiences."
|
|
8432
|
-
}
|
|
8433
|
-
];
|
|
8434
|
-
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React21__default.default.createElement("section", { className: "relative overflow-hidden bg-gradient-to-br from-[rgb(var(--header-from))] via-[rgb(var(--header-via))] to-[rgb(var(--header-to))] text-white mb-8" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8435
|
-
"div",
|
|
8436
|
-
{
|
|
8437
|
-
className: "absolute inset-0 bg-[radial-gradient(circle_at_top_left,_rgba(255,255,255,0.35),_transparent_60%)]",
|
|
8438
|
-
"aria-hidden": "true"
|
|
8439
|
-
}
|
|
8440
|
-
), /* @__PURE__ */ React21__default.default.createElement("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_bottom_right,_rgba(255,255,255,0.25),_transparent_55%)] opacity-70" }), /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative container mx-auto px-4 py-16" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8625
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-white" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-white max-w-7xl mx-auto" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative pb-20 pt-8" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8441
8626
|
Button,
|
|
8442
8627
|
{
|
|
8443
8628
|
variant: "ghost",
|
|
8444
|
-
className: "text-
|
|
8629
|
+
className: "text-slate-600 hover:text-slate-900 hover:bg-slate-100",
|
|
8445
8630
|
onClick: () => router.push(buildPath("/shop"))
|
|
8446
8631
|
},
|
|
8447
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ArrowLeft, { className: "h-
|
|
8448
|
-
"
|
|
8449
|
-
), /* @__PURE__ */ React21__default.default.createElement("div", { className: "
|
|
8450
|
-
framerMotion.motion.div,
|
|
8451
|
-
{
|
|
8452
|
-
initial: { opacity: 0, y: 24 },
|
|
8453
|
-
animate: { opacity: 1, y: 0 },
|
|
8454
|
-
className: "max-w-3xl space-y-4"
|
|
8455
|
-
},
|
|
8456
|
-
product.category && /* @__PURE__ */ React21__default.default.createElement(
|
|
8457
|
-
Badge,
|
|
8458
|
-
{
|
|
8459
|
-
variant: "secondary",
|
|
8460
|
-
className: "bg-white/15 text-white backdrop-blur-sm"
|
|
8461
|
-
},
|
|
8462
|
-
product.category
|
|
8463
|
-
),
|
|
8464
|
-
/* @__PURE__ */ React21__default.default.createElement("h1", { className: "text-4xl font-bold leading-tight md:text-5xl" }, product.name),
|
|
8465
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap items-center gap-3 text-sm text-white/80" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full bg-white/10 px-3 py-1 font-medium text-white" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Sparkles, { className: "h-4 w-4" }), "Ready to ship today"), /* @__PURE__ */ React21__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full bg-white/10 px-3 py-1 font-medium text-white" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Shield, { className: "h-4 w-4" }), "30-day happiness guarantee"))
|
|
8466
|
-
)))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative -mt-16 pb-20" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid gap-10 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-10" }, /* @__PURE__ */ React21__default.default.createElement("section", { className: "rounded-3xl border border-white bg-white/70 p-6 shadow-xl shadow-primary-100/40 backdrop-blur" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid gap-6 lg:grid-cols-[minmax(0,1fr)_220px]" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8632
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ArrowLeft, { className: "h-4 w-4 mr-2" }),
|
|
8633
|
+
"Back to Shop"
|
|
8634
|
+
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid gap-10 lg:grid-cols-[minmax(0,50fr)_minmax(0,50fr)]" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-10" }, /* @__PURE__ */ React21__default.default.createElement("section", { className: "rounded-3xl " }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8467
8635
|
framerMotion.motion.div,
|
|
8468
8636
|
{
|
|
8469
|
-
key:
|
|
8637
|
+
key: selectedVariant?.id || "default",
|
|
8470
8638
|
initial: { opacity: 0.4, scale: 0.98 },
|
|
8471
8639
|
animate: { opacity: 1, scale: 1 },
|
|
8472
8640
|
transition: { duration: 0.35 },
|
|
8473
8641
|
className: "relative overflow-hidden rounded-3xl bg-slate-100 h-[420px] md:h-[560px]"
|
|
8474
8642
|
},
|
|
8475
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
8643
|
+
variantImages.length > 0 && variantImages[activeImageIndex] ? /* @__PURE__ */ React21__default.default.createElement(
|
|
8476
8644
|
Image3__default.default,
|
|
8477
8645
|
{
|
|
8478
|
-
src: variantImages[activeImageIndex],
|
|
8646
|
+
src: variantImages[activeImageIndex].src || variantImages[activeImageIndex].url || variantImages[activeImageIndex].file,
|
|
8479
8647
|
alt: currentVariant.name || product.name,
|
|
8480
8648
|
fill: true,
|
|
8481
8649
|
priority: true,
|
|
8482
8650
|
sizes: "(max-width: 1024px) 100vw, 800px",
|
|
8483
8651
|
className: "object-contain"
|
|
8484
8652
|
}
|
|
8485
|
-
)
|
|
8653
|
+
) : product?.productMedia?.[0]?.file ? /* @__PURE__ */ React21__default.default.createElement(
|
|
8654
|
+
Image3__default.default,
|
|
8655
|
+
{
|
|
8656
|
+
src: product.productMedia[0].file,
|
|
8657
|
+
alt: product.name,
|
|
8658
|
+
fill: true,
|
|
8659
|
+
priority: true,
|
|
8660
|
+
sizes: "(max-width: 1024px) 100vw, 800px",
|
|
8661
|
+
className: "object-contain"
|
|
8662
|
+
}
|
|
8663
|
+
) : null,
|
|
8486
8664
|
discount > 0 && /* @__PURE__ */ React21__default.default.createElement(
|
|
8487
8665
|
Badge,
|
|
8488
8666
|
{
|
|
@@ -8501,90 +8679,106 @@ function ProductDetailScreen({ productId }) {
|
|
|
8501
8679
|
},
|
|
8502
8680
|
"Out of Stock"
|
|
8503
8681
|
)
|
|
8504
|
-
),
|
|
8505
|
-
"button",
|
|
8506
|
-
{
|
|
8507
|
-
key: variant.id,
|
|
8508
|
-
type: "button",
|
|
8509
|
-
onClick: () => handleVariantSelect(variant),
|
|
8510
|
-
className: `rounded-full px-4 py-2 text-sm font-medium transition ${selectedVariant?.id === variant.id ? "bg-primary-600 text-white" : "bg-slate-100 text-slate-700 hover:bg-slate-200"}`
|
|
8511
|
-
},
|
|
8512
|
-
variant.name
|
|
8513
|
-
)))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-3 gap-3" }, variantImages.map((image, index) => /* @__PURE__ */ React21__default.default.createElement(
|
|
8682
|
+
), variantImages.length > 0 && /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-8 gap-2" }, variantImages.map((image, index) => /* @__PURE__ */ React21__default.default.createElement(
|
|
8514
8683
|
"button",
|
|
8515
8684
|
{
|
|
8516
8685
|
key: image.src + index,
|
|
8517
8686
|
type: "button",
|
|
8518
8687
|
onClick: () => setActiveImageIndex(index),
|
|
8519
|
-
className: `relative aspect-square overflow-hidden rounded-
|
|
8688
|
+
className: `relative aspect-square overflow-hidden rounded-lg border-2 transition-all ${activeImageIndex === index ? "border-primary-500 ring-2 ring-primary-200 ring-offset-2 shadow-md" : "border-slate-200 hover:border-primary-300"}`
|
|
8520
8689
|
},
|
|
8521
8690
|
/* @__PURE__ */ React21__default.default.createElement(
|
|
8522
8691
|
Image3__default.default,
|
|
8523
8692
|
{
|
|
8524
|
-
src: image
|
|
8693
|
+
src: image?.src,
|
|
8525
8694
|
alt: image.alt || `Product image ${index + 1}`,
|
|
8526
8695
|
className: "h-full w-full object-cover object-center",
|
|
8527
|
-
width:
|
|
8528
|
-
height:
|
|
8696
|
+
width: 80,
|
|
8697
|
+
height: 80,
|
|
8529
8698
|
unoptimized: true
|
|
8530
8699
|
}
|
|
8531
8700
|
)
|
|
8532
|
-
)))))), /* @__PURE__ */ React21__default.default.createElement("
|
|
8533
|
-
const
|
|
8701
|
+
)))))), /* @__PURE__ */ React21__default.default.createElement("aside", { className: "space-y-6 lg:sticky lg:top-24" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "" }, product.parentCategories && product.parentCategories.length > 0 && /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-4 text-sm text-slate-600" }, product.parentCategories.map((cat, index) => /* @__PURE__ */ React21__default.default.createElement("span", { key: cat.id || index }, cat.name, index < product.parentCategories.length - 1 && " \u2022 ")), product.parentSubCategories && product.parentSubCategories.length > 0 && /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, " \u2022 ", product.parentSubCategories.map((subCat, index) => /* @__PURE__ */ React21__default.default.createElement("span", { key: subCat.id || index }, subCat.name, index < product.parentSubCategories.length - 1 && " \u2022 ")))), /* @__PURE__ */ React21__default.default.createElement("h1", { className: "text-2xl font-bold text-slate-900 mb-6" }, product.name), product?.productVariants && product.productVariants.length > 0 && /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React21__default.default.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-3" }, "Select Variant"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-3" }, product.productVariants.map((variant) => {
|
|
8702
|
+
const isSelected = selectedVariant?.id === variant.id;
|
|
8703
|
+
const variantImage = variant.productMedia?.[0]?.file || product.productMedia?.[0]?.file || product.images?.[0] || "/placeholder-product.jpg";
|
|
8534
8704
|
return /* @__PURE__ */ React21__default.default.createElement(
|
|
8535
|
-
"
|
|
8705
|
+
"button",
|
|
8536
8706
|
{
|
|
8537
|
-
key:
|
|
8538
|
-
|
|
8707
|
+
key: variant.id,
|
|
8708
|
+
type: "button",
|
|
8709
|
+
onClick: () => handleVariantSelect(variant),
|
|
8710
|
+
className: `flex w-full items-center gap-3 rounded-lg border-2 px-4 py-3 text-left transition ${isSelected ? "border-primary-500 bg-primary-50" : "border-slate-200 bg-white hover:border-primary-300"}`
|
|
8539
8711
|
},
|
|
8540
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className:
|
|
8541
|
-
|
|
8712
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: `relative h-12 w-12 flex-shrink-0 overflow-hidden rounded-full border-2 ${isSelected ? "border-primary-500" : "border-slate-200"}` }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8713
|
+
Image3__default.default,
|
|
8714
|
+
{
|
|
8715
|
+
src: variantImage,
|
|
8716
|
+
alt: variant.name || "Variant image",
|
|
8717
|
+
fill: true,
|
|
8718
|
+
className: "object-cover",
|
|
8719
|
+
sizes: "48px"
|
|
8720
|
+
}
|
|
8721
|
+
)),
|
|
8722
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex-1" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: `text-sm font-medium ${isSelected ? "text-primary-700" : "text-slate-900"}` }, variant.name), variant.sku && /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xs text-slate-500 mt-0.5" }, "SKU: ", variant.sku)),
|
|
8723
|
+
isSelected && /* @__PURE__ */ React21__default.default.createElement(lucideReact.Check, { className: "h-5 w-5 text-primary-600 flex-shrink-0" })
|
|
8542
8724
|
);
|
|
8543
|
-
}))
|
|
8725
|
+
}))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-baseline gap-3 mb-6" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-3xl font-bold text-orange-600" }, selectedVariant ? formatPrice(selectedVariant.finalPrice) : formatPrice(product.finalPrice || product.price || 0)), variantComparePrice && variantComparePrice > variantPrice && /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-base text-slate-400 line-through" }, formatPrice(variantComparePrice)), discount > 0 && /* @__PURE__ */ React21__default.default.createElement(Badge, { variant: "danger", size: "sm" }, "-", discount, "%")), selectedVariant && /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-4 text-sm" }, selectedVariant.inventoryStatus === "OUT_OF_STOCK" /* OUTOFSTOCK */ || selectedVariant.inventoryStatus === "LOW_STOCK" /* LOWSTOCK */ ? /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-red-600 font-medium" }, "Out of Stock") : /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-orange-600 font-medium" }, "Only ", selectedVariant.inventoryCount || product.inventoryCount || 0, " left in stock - Order soon!")), variantSku !== "N/A" && /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-4 text-sm text-slate-600" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-medium" }, "SKU:"), " ", variantSku), product.description && /* @__PURE__ */ React21__default.default.createElement("p", { className: "mb-6 text-sm text-slate-600" }, product.description.replace(/<[^>]*>/g, "").substring(0, 150), product.description.length > 150 && "..."), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React21__default.default.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-2" }, "Quantity"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center rounded-lg border border-slate-200 bg-white" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8544
8726
|
"button",
|
|
8545
8727
|
{
|
|
8546
8728
|
type: "button",
|
|
8547
8729
|
onClick: () => setQuantity((current) => Math.max(1, current - 1)),
|
|
8548
|
-
className: "
|
|
8730
|
+
className: "px-3 py-2 hover:bg-slate-50",
|
|
8549
8731
|
"aria-label": "Decrease quantity"
|
|
8550
8732
|
},
|
|
8551
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Minus, { className: "h-4 w-4" })
|
|
8552
|
-
), /* @__PURE__ */ React21__default.default.createElement("span", { className: "w-12 text-center text-sm font-semibold text-slate-
|
|
8733
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Minus, { className: "h-4 w-4 text-slate-600" })
|
|
8734
|
+
), /* @__PURE__ */ React21__default.default.createElement("span", { className: "w-12 text-center text-sm font-semibold text-slate-900" }, quantity), /* @__PURE__ */ React21__default.default.createElement(
|
|
8553
8735
|
"button",
|
|
8554
8736
|
{
|
|
8555
8737
|
type: "button",
|
|
8556
|
-
onClick: () => setQuantity((current) =>
|
|
8557
|
-
|
|
8738
|
+
onClick: () => setQuantity((current) => {
|
|
8739
|
+
const maxQty = selectedVariant?.inventoryCount || product.inventoryCount || 999;
|
|
8740
|
+
return Math.min(maxQty, current + 1);
|
|
8741
|
+
}),
|
|
8742
|
+
className: "px-3 py-2 hover:bg-slate-50",
|
|
8558
8743
|
"aria-label": "Increase quantity"
|
|
8559
8744
|
},
|
|
8560
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Plus, { className: "h-4 w-4" })
|
|
8561
|
-
))
|
|
8745
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Plus, { className: "h-4 w-4 text-slate-600" })
|
|
8746
|
+
)), selectedVariant && /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-sm text-slate-500" }, selectedVariant.inventoryCount || product.inventoryCount || 0, " available"))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8562
8747
|
Button,
|
|
8563
8748
|
{
|
|
8564
|
-
size: "
|
|
8565
|
-
className: "w-full",
|
|
8749
|
+
size: "md",
|
|
8750
|
+
className: "w-full bg-orange-500 hover:bg-orange-600 text-white py-2.5",
|
|
8566
8751
|
onClick: handleAddToCart,
|
|
8567
8752
|
isLoading: isAddingToCart,
|
|
8568
8753
|
disabled: !selectedVariant || selectedVariant.inventoryStatus === "OUT_OF_STOCK" /* OUTOFSTOCK */
|
|
8569
8754
|
},
|
|
8570
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ShoppingCart, { className: "h-
|
|
8571
|
-
!selectedVariant ? "Select a variant" : selectedVariant.inventoryStatus === "OUT_OF_STOCK" /* OUTOFSTOCK */ ? "Out of Stock" :
|
|
8755
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ShoppingCart, { className: "h-4 w-4" }),
|
|
8756
|
+
!selectedVariant ? "Select a variant" : selectedVariant.inventoryStatus === "OUT_OF_STOCK" /* OUTOFSTOCK */ ? "Out of Stock" : "Add to Cart"
|
|
8572
8757
|
), /* @__PURE__ */ React21__default.default.createElement(
|
|
8573
8758
|
Button,
|
|
8574
8759
|
{
|
|
8575
|
-
size: "
|
|
8760
|
+
size: "md",
|
|
8576
8761
|
variant: "outline",
|
|
8577
|
-
className: "w-full",
|
|
8762
|
+
className: "w-full py-2.5",
|
|
8578
8763
|
onClick: handleToggleFavorite
|
|
8579
8764
|
},
|
|
8580
8765
|
/* @__PURE__ */ React21__default.default.createElement(
|
|
8581
8766
|
lucideReact.Heart,
|
|
8582
8767
|
{
|
|
8583
|
-
className: `h-
|
|
8768
|
+
className: `h-4 w-4 mr-2 ${isFavorited ? "fill-red-500 text-red-500" : "text-slate-500"}`
|
|
8584
8769
|
}
|
|
8585
8770
|
),
|
|
8586
8771
|
isFavorited ? "Saved" : "Save for later"
|
|
8587
|
-
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-3xl border border-primary-100 bg-primary-50/70 p-6 text-sm text-primary-700 shadow-sm" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-semibold uppercase tracking-[0.25em]" }, "Need advice?"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-2 leading-relaxed" }, "Chat with a pharmacist in real time before completing your purchase. We will help you choose supporting supplements and answer dosing questions.")))), relatedProducts.length > 0 && /* @__PURE__ */ React21__default.default.createElement("section", { className: "mt-20" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-2xl font-semibold text-slate-900" }, "You may also like"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-1 text-sm text-slate-500" }, "Hand-picked recommendations that pair nicely with this product.")), /* @__PURE__ */ React21__default.default.createElement(Link8__default.default, { href: "/shop", className: "hidden md:inline-flex" }, /* @__PURE__ */ React21__default.default.createElement(Button, { variant: "ghost", className: "text-primary-600" }, "View all products"))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-6 grid gap-
|
|
8772
|
+
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-3xl border border-primary-100 bg-primary-50/70 p-6 text-sm text-primary-700 shadow-sm" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-semibold uppercase tracking-[0.25em]" }, "Need advice?"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-2 leading-relaxed" }, "Chat with a pharmacist in real time before completing your purchase. We will help you choose supporting supplements and answer dosing questions.")))), /* @__PURE__ */ React21__default.default.createElement("section", { className: "mt-10" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-3xl border border-slate-100 bg-white p-8 shadow-sm" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap items-center gap-4 pb-6" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-1 text-amber-500" }, Array.from({ length: 5 }).map((_, index) => /* @__PURE__ */ React21__default.default.createElement(lucideReact.Star, { key: index, className: "h-4 w-4 fill-current" }))), /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-sm font-medium text-slate-500" }, "Rated 4.8 \u2022 Patients love the results")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-8" }, product.description && /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "text-lg font-semibold text-slate-900" }, "Description"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-base leading-relaxed text-slate-600", dangerouslySetInnerHTML: { __html: product.description } }))))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-2xl border border-slate-200 bg-slate-50/60 p-5 mt-10" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text- font-semibold uppercase tracking-[0.3em] text-slate-500" }, "Product details"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-3 space-y-2 text-sm text-slate-600" }, /* @__PURE__ */ React21__default.default.createElement("p", null, /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-medium text-slate-700" }, "Variant:"), " ", currentVariant.name), /* @__PURE__ */ React21__default.default.createElement("p", null, /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-medium text-slate-700" }, "SKU:"), " ", variantSku), /* @__PURE__ */ React21__default.default.createElement("p", null, /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-medium text-slate-700" }, "Status:"), " ", /* @__PURE__ */ React21__default.default.createElement("span", { className: variantInStock ? "text-green-600" : "text-amber-600" }, variantInStock ? "In Stock" : "Out of Stock")), /* @__PURE__ */ React21__default.default.createElement("p", null, /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-medium text-slate-700" }, "Last updated:"), " ", lastUpdatedLabel), /* @__PURE__ */ React21__default.default.createElement("p", null, /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-medium text-slate-700" }, "Ships from:"), " Local pharmacy distribution center"))), relatedProducts.length > 0 && /* @__PURE__ */ React21__default.default.createElement("section", { className: "mt-20" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-2xl font-semibold text-slate-900" }, "You may also like"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-1 text-sm text-slate-500" }, "Hand-picked recommendations that pair nicely with this product.")), /* @__PURE__ */ React21__default.default.createElement(Link8__default.default, { href: buildPath("/shop"), className: "hidden md:inline-flex" }, /* @__PURE__ */ React21__default.default.createElement(Button, { variant: "ghost", className: "text-primary-600" }, "View all products"))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-6 grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5" }, relatedProducts?.map((relatedProduct) => /* @__PURE__ */ React21__default.default.createElement(
|
|
8773
|
+
ProductCard,
|
|
8774
|
+
{
|
|
8775
|
+
key: relatedProduct.id || relatedProduct._id,
|
|
8776
|
+
product: relatedProduct,
|
|
8777
|
+
onClickProduct: (item) => {
|
|
8778
|
+
router.push(buildPath(`/products/${item._id || item.id}`));
|
|
8779
|
+
}
|
|
8780
|
+
}
|
|
8781
|
+
))))))));
|
|
8588
8782
|
}
|
|
8589
8783
|
function CartItem({ item }) {
|
|
8590
8784
|
const { updateQuantity, removeFromCart } = useCart();
|
|
@@ -8602,6 +8796,16 @@ function CartItem({ item }) {
|
|
|
8602
8796
|
await removeFromCart(item.productVariantId);
|
|
8603
8797
|
};
|
|
8604
8798
|
const itemTotal = item.productVariantData.finalPrice * item.quantity;
|
|
8799
|
+
const unitPrice = item.productVariantData.finalPrice;
|
|
8800
|
+
const attributes = [];
|
|
8801
|
+
if (item.productVariantData.attribute) {
|
|
8802
|
+
if (item.productVariantData.attribute.color) {
|
|
8803
|
+
attributes.push(`Color: ${item.productVariantData.attribute.color}`);
|
|
8804
|
+
}
|
|
8805
|
+
if (item.productVariantData.attribute.size) {
|
|
8806
|
+
attributes.push(`Size: ${item.productVariantData.attribute.size}`);
|
|
8807
|
+
}
|
|
8808
|
+
}
|
|
8605
8809
|
return /* @__PURE__ */ React21__default.default.createElement(
|
|
8606
8810
|
framerMotion.motion.div,
|
|
8607
8811
|
{
|
|
@@ -8609,43 +8813,43 @@ function CartItem({ item }) {
|
|
|
8609
8813
|
initial: { opacity: 0, y: 20 },
|
|
8610
8814
|
animate: { opacity: 1, y: 0 },
|
|
8611
8815
|
exit: { opacity: 0, x: -100 },
|
|
8612
|
-
className: "
|
|
8816
|
+
className: "relative bg-white rounded-lg shadow-sm border border-gray-200 p-4"
|
|
8613
8817
|
},
|
|
8614
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
8818
|
+
/* @__PURE__ */ React21__default.default.createElement(
|
|
8819
|
+
"button",
|
|
8820
|
+
{
|
|
8821
|
+
onClick: handleRemove,
|
|
8822
|
+
className: "absolute top-4 right-4 p-1 text-gray-400 hover:text-red-600 transition-colors",
|
|
8823
|
+
"aria-label": "Remove item"
|
|
8824
|
+
},
|
|
8825
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Trash2, { className: "w-5 h-5" })
|
|
8826
|
+
),
|
|
8827
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex gap-4 pr-8" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative w-20 h-24 rounded-md overflow-hidden flex-shrink-0 bg-gray-100" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8615
8828
|
Image3__default.default,
|
|
8616
8829
|
{
|
|
8617
8830
|
src: item.productVariantData.productMedia[0]?.file || "/placeholder-product.jpg",
|
|
8618
8831
|
alt: item.productVariantData.name,
|
|
8619
8832
|
fill: true,
|
|
8620
|
-
className: "object-cover"
|
|
8833
|
+
className: "object-cover",
|
|
8834
|
+
sizes: "80px"
|
|
8621
8835
|
}
|
|
8622
|
-
)),
|
|
8623
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "text-lg font-semibold text-gray-900 truncate" }, item.productVariantData.name), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-gray-500 mt-1" }, formatPrice(item.productVariantData.finalPrice), " each"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3 mt-3" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center border-2 border-gray-200 rounded-lg" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8836
|
+
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "text-base font-bold text-gray-900" }, item.productVariantData.name), attributes.length > 0 && /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-gray-500 mt-1" }, attributes.join(" ")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-2 mt-3" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8624
8837
|
"button",
|
|
8625
8838
|
{
|
|
8626
8839
|
onClick: () => handleUpdateQuantity(item.quantity - 1),
|
|
8627
|
-
disabled: isUpdating || item.quantity <=
|
|
8628
|
-
className: "p-
|
|
8840
|
+
disabled: isUpdating || item.quantity <= 1,
|
|
8841
|
+
className: "p-1 hover:bg-gray-100 disabled:opacity-50 disabled:cursor-not-allowed transition-colors rounded"
|
|
8629
8842
|
},
|
|
8630
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Minus, { className: "w-4 h-4" })
|
|
8631
|
-
), /* @__PURE__ */ React21__default.default.createElement("span", { className: "px-
|
|
8843
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Minus, { className: "w-4 h-4 text-gray-600" })
|
|
8844
|
+
), /* @__PURE__ */ React21__default.default.createElement("span", { className: "px-3 font-medium min-w-[2rem] text-center text-gray-900" }, isUpdating ? /* @__PURE__ */ React21__default.default.createElement("span", { className: "inline-block h-4 w-4 align-middle animate-spin rounded-full border-2 border-gray-300 border-t-gray-600" }) : item.quantity), /* @__PURE__ */ React21__default.default.createElement(
|
|
8632
8845
|
"button",
|
|
8633
8846
|
{
|
|
8634
8847
|
onClick: () => handleUpdateQuantity(item.quantity + 1),
|
|
8635
|
-
disabled: isUpdating || item.quantity >= item.productVariantData.inventoryCount,
|
|
8636
|
-
className: "p-
|
|
8637
|
-
},
|
|
8638
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Plus, { className: "w-4 h-4" })
|
|
8639
|
-
)), /* @__PURE__ */ React21__default.default.createElement(
|
|
8640
|
-
"button",
|
|
8641
|
-
{
|
|
8642
|
-
onClick: handleRemove,
|
|
8643
|
-
className: "p-2 text-red-600 hover:bg-red-50 rounded-lg transition-colors",
|
|
8644
|
-
"aria-label": "Remove item"
|
|
8848
|
+
disabled: isUpdating || item.quantity >= (item.productVariantData.inventoryCount || 999),
|
|
8849
|
+
className: "p-1 hover:bg-gray-100 disabled:opacity-50 disabled:cursor-not-allowed transition-colors rounded"
|
|
8645
8850
|
},
|
|
8646
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.
|
|
8647
|
-
))),
|
|
8648
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "text-right" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xl font-bold text-gray-900" }, formatPrice(itemTotal)))
|
|
8851
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Plus, { className: "w-4 h-4 text-gray-600" })
|
|
8852
|
+
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-right flex-shrink-0" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-lg font-bold text-orange-600" }, formatPrice(itemTotal)), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-gray-500 mt-1" }, formatPrice(unitPrice), " each")))
|
|
8649
8853
|
);
|
|
8650
8854
|
}
|
|
8651
8855
|
function CartScreen() {
|
|
@@ -8653,137 +8857,68 @@ function CartScreen() {
|
|
|
8653
8857
|
const { cart, isLoading } = useCart();
|
|
8654
8858
|
const { buildPath } = useBasePath();
|
|
8655
8859
|
if (!cart || cart.cartBody.items.length === 0) {
|
|
8656
|
-
|
|
8657
|
-
{
|
|
8658
|
-
icon: lucideReact.ShieldCheck,
|
|
8659
|
-
title: "Pharmacist approved",
|
|
8660
|
-
description: "Every product passes pharmacist review and cold-chain handling standards."
|
|
8661
|
-
},
|
|
8662
|
-
{
|
|
8663
|
-
icon: lucideReact.BadgePercent,
|
|
8664
|
-
title: "Bundle savings",
|
|
8665
|
-
description: "Unlock tiered discounts when you combine vitamins, OTC, and wellness kits."
|
|
8666
|
-
},
|
|
8667
|
-
{
|
|
8668
|
-
icon: lucideReact.HeartPulse,
|
|
8669
|
-
title: "Personalized guidance",
|
|
8670
|
-
description: "Follow curated collections tailored to your health goals and routines."
|
|
8671
|
-
}
|
|
8672
|
-
];
|
|
8673
|
-
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative min-h-screen overflow-hidden bg-slate-950" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "absolute inset-0 bg-gradient-to-br from-[rgb(var(--header-from))] via-[rgb(var(--header-via))] to-[rgb(var(--header-to))]" }), /* @__PURE__ */ React21__default.default.createElement("div", { className: "absolute inset-0" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "pointer-events-none absolute -top-24 -left-20 h-96 w-96 rounded-full bg-white/20 blur-3xl opacity-60" }), /* @__PURE__ */ React21__default.default.createElement("div", { className: "pointer-events-none absolute bottom-0 right-0 h-[28rem] w-[28rem] rounded-full bg-secondary-500/40 blur-[220px] opacity-70" })), /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative z-10 flex min-h-screen items-center px-6 py-20" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "mx-auto grid w-full max-w-6xl gap-12 lg:grid-cols-[minmax(0,1.25fr)_minmax(0,1fr)] lg:items-center" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8860
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-white" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-white max-w-6xl mx-auto" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4 py-8" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React21__default.default.createElement("h1", { className: "text-2xl font-bold text-slate-900" }, "Shopping Cart"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-gray-500 mt-1" }, "0 items in your cart")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-col items-center justify-center py-20" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8674
8861
|
framerMotion.motion.div,
|
|
8675
8862
|
{
|
|
8676
8863
|
initial: { opacity: 0, y: 24 },
|
|
8677
8864
|
animate: { opacity: 1, y: 0 },
|
|
8678
|
-
|
|
8679
|
-
className: "space-y-8 text-white"
|
|
8865
|
+
className: "text-center space-y-6 max-w-md"
|
|
8680
8866
|
},
|
|
8681
|
-
/* @__PURE__ */ React21__default.default.createElement("
|
|
8682
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-
|
|
8683
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap gap-
|
|
8684
|
-
Button,
|
|
8685
|
-
{
|
|
8686
|
-
size: "lg",
|
|
8687
|
-
className: "bg-white text-primary-700 shadow-xl shadow-white/30 hover:bg-white/90 hover:text-primary-700",
|
|
8688
|
-
onClick: () => router.push(buildPath("/shop"))
|
|
8689
|
-
},
|
|
8690
|
-
"Discover products",
|
|
8691
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ArrowRight, { className: "h-5 w-5" })
|
|
8692
|
-
), /* @__PURE__ */ React21__default.default.createElement(
|
|
8867
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-full bg-gray-100 p-6" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.ShoppingBag, { className: "h-12 w-12 text-gray-400" }))),
|
|
8868
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-2xl font-bold text-slate-900" }, "Your cart is empty"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-gray-500" }, "Start adding products to your cart to see them here.")),
|
|
8869
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap gap-3 justify-center" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8693
8870
|
"button",
|
|
8694
8871
|
{
|
|
8695
8872
|
type: "button",
|
|
8696
|
-
onClick: () => router.push(buildPath("/
|
|
8697
|
-
className: "
|
|
8698
|
-
},
|
|
8699
|
-
"Browse categories",
|
|
8700
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ArrowRight, { className: "h-4 w-4" })
|
|
8701
|
-
)),
|
|
8702
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "grid gap-4 sm:grid-cols-2" }, highlights.map(({ icon: Icon, title, description }) => /* @__PURE__ */ React21__default.default.createElement(
|
|
8703
|
-
"div",
|
|
8704
|
-
{
|
|
8705
|
-
key: title,
|
|
8706
|
-
className: "rounded-2xl border border-white/15 bg-white/10 p-5 backdrop-blur transition hover:border-white/25 hover:bg-white/15"
|
|
8707
|
-
},
|
|
8708
|
-
/* @__PURE__ */ React21__default.default.createElement(Icon, { className: "h-6 w-6 text-white/90" }),
|
|
8709
|
-
/* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-3 text-sm font-semibold text-white" }, title),
|
|
8710
|
-
/* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-1 text-xs text-white/70" }, description)
|
|
8711
|
-
)))
|
|
8712
|
-
), /* @__PURE__ */ React21__default.default.createElement(
|
|
8713
|
-
framerMotion.motion.div,
|
|
8714
|
-
{
|
|
8715
|
-
initial: { opacity: 0, y: 24 },
|
|
8716
|
-
animate: { opacity: 1, y: 0 },
|
|
8717
|
-
transition: { delay: 0.1, duration: 0.4 },
|
|
8718
|
-
className: "rounded-[32px] border border-white/10 bg-white/10 p-10 backdrop-blur-2xl shadow-[0_40px_120px_-45px_rgba(12,5,40,0.6)]"
|
|
8719
|
-
},
|
|
8720
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex h-16 w-16 items-center justify-center rounded-2xl bg-white/20" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.ShoppingBag, { className: "h-8 w-8 text-white" })),
|
|
8721
|
-
/* @__PURE__ */ React21__default.default.createElement("h2", { className: "mt-6 text-3xl font-semibold text-white" }, "Still building your bag?"),
|
|
8722
|
-
/* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-3 text-sm text-white/80" }, "Add supplements, wellness tools, and everyday pharmacy favorites to personalize your routine. We'll keep them chilled, curated, and ready for doorstep delivery."),
|
|
8723
|
-
/* @__PURE__ */ React21__default.default.createElement("ul", { className: "mt-6 space-y-3 text-sm text-white/80" }, /* @__PURE__ */ React21__default.default.createElement("li", { className: "flex items-center gap-2 rounded-xl bg-white/10 px-4 py-3" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.ShieldCheck, { className: "h-5 w-5 text-white" }), "Pharmacist oversight on every order"), /* @__PURE__ */ React21__default.default.createElement("li", { className: "flex items-center gap-2 rounded-xl bg-white/10 px-4 py-3" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.BadgePercent, { className: "h-5 w-5 text-white" }), "Member-only savings unlock at checkout"), /* @__PURE__ */ React21__default.default.createElement("li", { className: "flex items-center gap-2 rounded-xl bg-white/10 px-4 py-3" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.HeartPulse, { className: "h-5 w-5 text-white" }), "Personalized care plans for each purchase")),
|
|
8724
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
8725
|
-
Button,
|
|
8726
|
-
{
|
|
8727
|
-
size: "lg",
|
|
8728
|
-
variant: "outline",
|
|
8729
|
-
className: "mt-8 w-full border-white/40 text-white hover:border-white hover:bg-white/10",
|
|
8730
|
-
onClick: () => router.push(buildPath("/shop"))
|
|
8873
|
+
onClick: () => router.push(buildPath("/shop")),
|
|
8874
|
+
className: "rounded-full border-2 border-primary-500 bg-primary-500 hover:bg-primary-600 text-white px-6 py-3 text-sm font-medium transition-colors flex items-center justify-center gap-2"
|
|
8731
8875
|
},
|
|
8732
|
-
"
|
|
8876
|
+
"Discover products",
|
|
8733
8877
|
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ArrowRight, { className: "h-5 w-5" })
|
|
8734
|
-
)
|
|
8735
|
-
|
|
8878
|
+
)),
|
|
8879
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-8 space-y-3 pt-6 border-t border-gray-200" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-start gap-3 text-sm text-slate-600" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.CheckCircle2, { className: "h-5 w-5 text-primary-600 flex-shrink-0 mt-0.5" }), /* @__PURE__ */ React21__default.default.createElement("span", null, "Free shipping on all orders")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-start gap-3 text-sm text-slate-600" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.CheckCircle2, { className: "h-5 w-5 text-primary-600 flex-shrink-0 mt-0.5" }), /* @__PURE__ */ React21__default.default.createElement("span", null, "Easy returns within 30 days")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-start gap-3 text-sm text-slate-600" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.CheckCircle2, { className: "h-5 w-5 text-primary-600 flex-shrink-0 mt-0.5" }), /* @__PURE__ */ React21__default.default.createElement("span", null, "Secure checkout process")))
|
|
8880
|
+
)))));
|
|
8736
8881
|
}
|
|
8737
8882
|
const subtotal = cart.total;
|
|
8738
8883
|
const shipping = 0;
|
|
8739
8884
|
const tax = 0;
|
|
8740
8885
|
const total = subtotal + shipping + tax;
|
|
8741
|
-
|
|
8742
|
-
|
|
8743
|
-
{
|
|
8744
|
-
initial: { opacity: 0, y: 24 },
|
|
8745
|
-
animate: { opacity: 1, y: 0 },
|
|
8746
|
-
className: "flex flex-col gap-6 md:flex-row md:items-center md:justify-between"
|
|
8747
|
-
},
|
|
8748
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "max-w-2xl space-y-4" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1 text-sm font-semibold tracking-wide text-white/80 backdrop-blur" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.HeartPulse, { className: "h-4 w-4" }), "Wellness essentials, ready when you are"), /* @__PURE__ */ React21__default.default.createElement("h1", { className: "text-4xl font-bold md:text-5xl" }, "Your curated cart"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-white/75 md:text-lg" }, "Review your selections, unlock exclusive perks, and check out with pharmacist-backed confidence.")),
|
|
8749
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-3xl bg-white/15 p-6 backdrop-blur-md" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm font-semibold uppercase tracking-[0.35em] text-white/70" }, "Cart summary"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-4 text-4xl font-semibold" }, formatPrice(total)), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-white/70" }, "Taxes and shipping calculated below"))
|
|
8750
|
-
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative -mt-16 pb-20" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid gap-10 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8886
|
+
const itemCount = cart.cartBody.items.length;
|
|
8887
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-white" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-white max-w-6xl mx-auto" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4 py-8" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React21__default.default.createElement("h1", { className: "text-2xl font-bold text-slate-900" }, "Shopping Cart"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-gray-500 mt-1" }, itemCount, " ", itemCount === 1 ? "item" : "items", " in your cart")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid gap-8 lg:grid-cols-[1.5fr_1fr]" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8751
8888
|
framerMotion.motion.section,
|
|
8752
8889
|
{
|
|
8753
8890
|
initial: { opacity: 0, y: 24 },
|
|
8754
8891
|
animate: { opacity: 1, y: 0 },
|
|
8755
|
-
|
|
8756
|
-
className: "space-y-6 rounded-3xl border border-slate-100 bg-white p-6 shadow-lg shadow-primary-50"
|
|
8892
|
+
className: "space-y-6"
|
|
8757
8893
|
},
|
|
8758
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex
|
|
8759
|
-
|
|
8760
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-5" }, cart.cartBody.items.map((item) => /* @__PURE__ */ React21__default.default.createElement(CartItem, { key: item.productVariantId, item })))
|
|
8894
|
+
isLoading && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-2 rounded-xl border border-slate-200 bg-white px-4 py-3 text-sm text-slate-600" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "inline-block h-4 w-4 animate-spin rounded-full border-2 border-slate-300 border-t-slate-600" }), "Updating cart\u2026"),
|
|
8895
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-4" }, cart.cartBody.items.map((item) => /* @__PURE__ */ React21__default.default.createElement(CartItem, { key: item.productVariantId, item })))
|
|
8761
8896
|
), /* @__PURE__ */ React21__default.default.createElement(
|
|
8762
8897
|
framerMotion.motion.aside,
|
|
8763
8898
|
{
|
|
8764
8899
|
initial: { opacity: 0, y: 24 },
|
|
8765
8900
|
animate: { opacity: 1, y: 0 },
|
|
8766
8901
|
transition: { delay: 0.1 },
|
|
8767
|
-
className: "space-y-6 lg:sticky lg:top-
|
|
8902
|
+
className: "space-y-6 lg:sticky lg:top-8 h-fit"
|
|
8768
8903
|
},
|
|
8769
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-
|
|
8770
|
-
|
|
8904
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-xl border-2 border-primary-200 bg-white p-6 shadow-md" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-xl font-bold text-slate-900 mb-6" }, "Order Summary"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-4 mb-6" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between text-sm" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-gray-600" }, "Subtotal (", itemCount, " ", itemCount === 1 ? "item" : "items", ")"), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-semibold text-slate-900" }, formatPrice(subtotal))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between text-sm" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-gray-600" }, "Shipping"), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-semibold text-green-600" }, "Will be calculated at checkout")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "border-t border-gray-200 pt-4 mt-4" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-lg font-bold text-slate-900" }, "Total"), /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-2xl font-bold text-orange-600" }, formatPrice(total))))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8905
|
+
"button",
|
|
8771
8906
|
{
|
|
8772
|
-
|
|
8773
|
-
|
|
8774
|
-
|
|
8907
|
+
type: "button",
|
|
8908
|
+
onClick: () => router.push(buildPath("/checkout")),
|
|
8909
|
+
className: "w-full rounded-full border-2 border-primary-500 bg-primary-500 hover:bg-primary-600 text-white px-4 py-3 text-sm font-medium transition-colors flex items-center justify-center gap-2"
|
|
8775
8910
|
},
|
|
8776
|
-
"
|
|
8911
|
+
"Proceed to Checkout",
|
|
8777
8912
|
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ArrowRight, { className: "h-5 w-5" })
|
|
8778
8913
|
), /* @__PURE__ */ React21__default.default.createElement(
|
|
8779
8914
|
"button",
|
|
8780
8915
|
{
|
|
8781
8916
|
type: "button",
|
|
8782
8917
|
onClick: () => router.push(buildPath("/shop")),
|
|
8783
|
-
className: "
|
|
8918
|
+
className: "w-full rounded-full border-2 border-primary-300 bg-white px-4 py-3 text-sm font-medium text-slate-700 hover:bg-gray-50 transition-colors"
|
|
8784
8919
|
},
|
|
8785
|
-
"Continue
|
|
8786
|
-
)),
|
|
8920
|
+
"Continue Shopping"
|
|
8921
|
+
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-6 space-y-3 pt-6 border-t border-gray-200" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-start gap-3 text-sm text-slate-600" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.CheckCircle2, { className: "h-5 w-5 text-primary-600 flex-shrink-0 mt-0.5" }), /* @__PURE__ */ React21__default.default.createElement("span", null, "Easy returns within 30 days")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-start gap-3 text-sm text-slate-600" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.CheckCircle2, { className: "h-5 w-5 text-primary-600 flex-shrink-0 mt-0.5" }), /* @__PURE__ */ React21__default.default.createElement("span", null, "Secure checkout process")))),
|
|
8787
8922
|
/* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-3xl border border-primary-100 bg-primary-50/70 p-6 text-sm text-primary-700 shadow-sm" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-semibold uppercase tracking-[0.3em]" }, "Need help?"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-2 leading-relaxed" }, "Chat with a pharmacist to optimize your regimen or discuss substitutions before you check out."))
|
|
8788
8923
|
)))));
|
|
8789
8924
|
}
|
|
@@ -9182,9 +9317,12 @@ function CheckoutScreen() {
|
|
|
9182
9317
|
}
|
|
9183
9318
|
const rates = response.data.rates || [];
|
|
9184
9319
|
if (rates.length > 0) {
|
|
9320
|
+
const sortedRates = [...rates].sort((a, b) => parseFloat(a.amount) - parseFloat(b.amount));
|
|
9321
|
+
const cheapestRate = sortedRates[0];
|
|
9185
9322
|
setShippingRates(rates);
|
|
9186
9323
|
setShippingRatesError(null);
|
|
9187
|
-
setSelectedShippingRateId(
|
|
9324
|
+
setSelectedShippingRateId(cheapestRate.objectId);
|
|
9325
|
+
setShippingPrice(parseFloat(cheapestRate.amount));
|
|
9188
9326
|
return;
|
|
9189
9327
|
}
|
|
9190
9328
|
const messages = response.data.messages || [];
|
|
@@ -9238,11 +9376,6 @@ function CheckoutScreen() {
|
|
|
9238
9376
|
setSelectedStoreAddressId(null);
|
|
9239
9377
|
}
|
|
9240
9378
|
}, [isDelivery]);
|
|
9241
|
-
const checkoutSteps = [
|
|
9242
|
-
{ id: 1, label: "Cart", status: "complete" },
|
|
9243
|
-
{ id: 2, label: "Details", status: "current" },
|
|
9244
|
-
{ id: 3, label: "Payment", status: "upcoming" }
|
|
9245
|
-
];
|
|
9246
9379
|
const onSubmit = async (data) => {
|
|
9247
9380
|
setError(null);
|
|
9248
9381
|
if (!isAuthenticated) {
|
|
@@ -9336,8 +9469,20 @@ function CheckoutScreen() {
|
|
|
9336
9469
|
if (paymentMethod === "Card") {
|
|
9337
9470
|
const paymentUrl = response?.data?.payment?.hostedInvoiceUrl;
|
|
9338
9471
|
if (paymentUrl && paymentUrl !== "INSUFFICIENT_CREDIT") {
|
|
9339
|
-
window.open(
|
|
9340
|
-
|
|
9472
|
+
const newWindow = window.open("", "_blank");
|
|
9473
|
+
if (newWindow) {
|
|
9474
|
+
newWindow.location.href = paymentUrl;
|
|
9475
|
+
await clearCart();
|
|
9476
|
+
return;
|
|
9477
|
+
} else {
|
|
9478
|
+
window.location.href = paymentUrl;
|
|
9479
|
+
await clearCart();
|
|
9480
|
+
return;
|
|
9481
|
+
}
|
|
9482
|
+
} else if (!paymentUrl) {
|
|
9483
|
+
console.error("No payment URL received in response:", response.data);
|
|
9484
|
+
setError("Failed to initiate payment. Please try again or contact support.");
|
|
9485
|
+
sonner.toast.error("Failed to initiate payment");
|
|
9341
9486
|
return;
|
|
9342
9487
|
}
|
|
9343
9488
|
sonner.toast.success("Order placed successfully!");
|
|
@@ -9363,26 +9508,7 @@ function CheckoutScreen() {
|
|
|
9363
9508
|
const subtotal = cart.total;
|
|
9364
9509
|
const tax = 0;
|
|
9365
9510
|
const total = subtotal + shippingPrice + tax;
|
|
9366
|
-
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React21__default.default.createElement("
|
|
9367
|
-
framerMotion.motion.div,
|
|
9368
|
-
{
|
|
9369
|
-
initial: { opacity: 0, y: 24 },
|
|
9370
|
-
animate: { opacity: 1, y: 0 },
|
|
9371
|
-
className: "space-y-6"
|
|
9372
|
-
},
|
|
9373
|
-
/* @__PURE__ */ React21__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1 text-sm font-semibold uppercase tracking-[0.35em] text-white/70 backdrop-blur" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.ShieldCheck, { className: "h-4 w-4" }), "Secure checkout"),
|
|
9374
|
-
/* @__PURE__ */ React21__default.default.createElement("h1", { className: "text-4xl font-bold md:text-5xl" }, "Provide delivery details"),
|
|
9375
|
-
/* @__PURE__ */ React21__default.default.createElement("p", { className: "text-white/75 md:text-lg" }, "Our pharmacists handle every package with care. Share your shipping and billing information so we can dispatch your order within the next 12 hours."),
|
|
9376
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap gap-3" }, checkoutSteps.map((step) => /* @__PURE__ */ React21__default.default.createElement(
|
|
9377
|
-
"div",
|
|
9378
|
-
{
|
|
9379
|
-
key: step.id,
|
|
9380
|
-
className: `flex items-center gap-3 rounded-2xl px-4 py-2 text-sm font-semibold ${step.status === "complete" ? "bg-white/20 text-white" : step.status === "current" ? "bg-white text-primary-700" : "bg-white/10 text-white/60"}`
|
|
9381
|
-
},
|
|
9382
|
-
/* @__PURE__ */ React21__default.default.createElement("span", { className: "flex h-7 w-7 items-center justify-center rounded-full bg-white/20 text-xs font-bold" }, step.id),
|
|
9383
|
-
step.label
|
|
9384
|
-
)))
|
|
9385
|
-
)))), /* @__PURE__ */ React21__default.default.createElement("form", { onSubmit: handleSubmit(onSubmit) }, error && /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-4 text-red-600 font-semibold" }, error), /* @__PURE__ */ React21__default.default.createElement("div", { className: "pt-12 container mx-auto grid gap-10 px-4 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
9511
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-slate-50 mb-16" }, /* @__PURE__ */ React21__default.default.createElement("form", { onSubmit: handleSubmit(onSubmit) }, error && /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-4 text-red-600 font-semibold" }, error), /* @__PURE__ */ React21__default.default.createElement("div", { className: "pt-12 container mx-auto grid gap-10 px-4 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
9386
9512
|
framerMotion.motion.div,
|
|
9387
9513
|
{
|
|
9388
9514
|
initial: { opacity: 0, y: 24 },
|
|
@@ -9480,9 +9606,10 @@ function CheckoutScreen() {
|
|
|
9480
9606
|
"div",
|
|
9481
9607
|
{
|
|
9482
9608
|
key: rate.objectId,
|
|
9483
|
-
onClick: () =>
|
|
9484
|
-
|
|
9485
|
-
|
|
9609
|
+
onClick: () => {
|
|
9610
|
+
setSelectedShippingRateId(rate.objectId);
|
|
9611
|
+
setShippingPrice(parseFloat(rate.amount));
|
|
9612
|
+
},
|
|
9486
9613
|
className: `relative p-5 border-2 rounded-xl cursor-pointer transition-all duration-200 hover:shadow-md ${isSelected ? "border-primary-500 bg-primary-50 ring-2 ring-primary-200" : "border-gray-200 hover:border-gray-300"}`
|
|
9487
9614
|
},
|
|
9488
9615
|
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-start justify-between" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-start gap-4 flex-1" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex-shrink-0" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
@@ -9569,7 +9696,7 @@ function CheckoutScreen() {
|
|
|
9569
9696
|
), /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-sm font-medium text-slate-900" }, pm.label)),
|
|
9570
9697
|
active && /* @__PURE__ */ React21__default.default.createElement("div", { className: "w-4 h-4 rounded-full bg-primary-500 flex items-center justify-center text-white shadow-sm" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Check, { className: "w-2.5 h-2.5" }))
|
|
9571
9698
|
);
|
|
9572
|
-
})), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xs text-slate-500 mt-2 pl-1 leading-relaxed" }, paymentMethod === "Card" && "You will be redirected to a secure payment page.", paymentMethod === "Cash" && "Pay with cash at the time of delivery or pickup.", paymentMethod === "Credit" && "Use your available account credit for this order.")), /* @__PURE__ */ React21__default.default.createElement("section", { className: "mt-8 pt-6 border-t border-slate-100" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "max-h-60 space-y-4 overflow-y-auto pr-2 scrollbar-thin scrollbar-thumb-slate-200 hover:scrollbar-thumb-slate-300" }, cart?.cartBody?.items?.map((item) => /* @__PURE__ */ React21__default.default.createElement(
|
|
9699
|
+
})), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xs text-slate-500 mt-2 pl-1 leading-relaxed" }, paymentMethod === "Card" && "You will be redirected to a secure payment page.", paymentMethod === "Cash" && "Pay with cash at the time of delivery or pickup.", paymentMethod === "Credit" && "Use your available account credit for this order.")), /* @__PURE__ */ React21__default.default.createElement("section", { className: "mt-8 pt-6 border-t border-slate-100" }, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "text-xs font-semibold text-slate-700 uppercase tracking-wider" }, "Cart Summary"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "max-h-60 space-y-4 overflow-y-auto pr-2 scrollbar-thin scrollbar-thumb-slate-200 hover:scrollbar-thumb-slate-300" }, cart?.cartBody?.items?.map((item) => /* @__PURE__ */ React21__default.default.createElement(
|
|
9573
9700
|
"div",
|
|
9574
9701
|
{
|
|
9575
9702
|
key: item.productId,
|
|
@@ -9661,7 +9788,7 @@ function LoginScreen() {
|
|
|
9661
9788
|
initial: { opacity: 0, x: -24 },
|
|
9662
9789
|
animate: { opacity: 1, x: 0 },
|
|
9663
9790
|
transition: { duration: 0.4 },
|
|
9664
|
-
className: "relative flex flex-col justify-between bg-gradient-to-br from-
|
|
9791
|
+
className: "relative flex flex-col justify-between bg-gradient-to-br from-slate-700 via-slate-600 to-slate-700 px-10 py-14 text-white"
|
|
9665
9792
|
},
|
|
9666
9793
|
/* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1 text-sm font-semibold uppercase tracking-[0.35em] text-white/70 backdrop-blur" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.HeartPulse, { className: "h-4 w-4" }), "Hey Pharmacist"), /* @__PURE__ */ React21__default.default.createElement("h1", { className: "text-4xl font-bold leading-tight lg:text-5xl" }, "Pharmacy-grade care for your household"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "max-w-xl text-white/80" }, "Log in to unlock personalized regimens, pharmacist support, and fast delivery on wellness essentials curated just for you.")),
|
|
9667
9794
|
/* @__PURE__ */ React21__default.default.createElement("div", { className: "grid gap-4 rounded-3xl bg-white/10 p-6 backdrop-blur" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.ShieldCheck, { className: "h-5 w-5 text-white" }), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-white/80" }, "HIPAA-compliant security keeps your health information protected.")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Sparkles, { className: "h-5 w-5 text-white" }), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-white/80" }, "Pharmacists ready to chat in under 10 minutes for medication support."))),
|
|
@@ -9787,7 +9914,7 @@ function RegisterScreen() {
|
|
|
9787
9914
|
initial: { opacity: 0, x: -24 },
|
|
9788
9915
|
animate: { opacity: 1, x: 0 },
|
|
9789
9916
|
transition: { duration: 0.4 },
|
|
9790
|
-
className: "flex flex-col justify-between bg-gradient-to-br from-
|
|
9917
|
+
className: "flex flex-col justify-between bg-gradient-to-br from-slate-700 via-slate-600 to-slate-700 px-10 py-14 text-white"
|
|
9791
9918
|
},
|
|
9792
9919
|
/* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1 text-sm font-semibold uppercase tracking-[0.35em] text-white/70 backdrop-blur" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.HeartPulse, { className: "h-4 w-4" }), "Join Hey Pharmacist"), /* @__PURE__ */ React21__default.default.createElement("h1", { className: "text-4xl font-bold leading-tight lg:text-5xl" }, "Create your wellness account"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "max-w-xl text-white/80" }, "Unlock concierge-level pharmacy support, curated product recommendations, and smarter refills designed for busy families.")),
|
|
9793
9920
|
/* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-4 rounded-3xl bg-white/10 p-6 backdrop-blur" }, BENEFITS.map((benefit) => /* @__PURE__ */ React21__default.default.createElement("div", { key: benefit, className: "flex items-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.CheckCircle2, { className: "h-5 w-5 text-white" }), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-white/85" }, benefit)))),
|
|
@@ -10089,29 +10216,43 @@ function ProfileScreen() {
|
|
|
10089
10216
|
)))));
|
|
10090
10217
|
}
|
|
10091
10218
|
function OrderCard({ order }) {
|
|
10092
|
-
const { buildPath } = useBasePath();
|
|
10093
10219
|
const config = order.orderStatus;
|
|
10220
|
+
const itemCount = order.items?.length || 0;
|
|
10221
|
+
const showPriceBreakdown = order.shippingCost && order.shippingCost > 0 || order.tax && order.tax > 0 || order.discountedAmount && order.discountedAmount > 0;
|
|
10094
10222
|
return /* @__PURE__ */ React21__default.default.createElement(
|
|
10095
10223
|
framerMotion.motion.div,
|
|
10096
10224
|
{
|
|
10097
10225
|
initial: { opacity: 0, y: 20 },
|
|
10098
10226
|
animate: { opacity: 1, y: 0 },
|
|
10099
|
-
|
|
10100
|
-
className: "bg-white rounded-2xl p-6 shadow-sm hover:shadow-xl transition-all duration-300 border border-gray-100"
|
|
10227
|
+
className: "rounded-lg border border-slate-200 bg-white p-4 shadow-sm hover:shadow-md transition-shadow"
|
|
10101
10228
|
},
|
|
10102
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex justify-between
|
|
10103
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2 mb-4" }, order.items
|
|
10104
|
-
|
|
10105
|
-
|
|
10229
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between mb-4 pb-4 border-b border-gray-200" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "text-base font-bold text-slate-900" }, "Order #", order?._id?.slice(0, 8) || ""), /* @__PURE__ */ React21__default.default.createElement(Badge, { variant: config }, config), /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-xs text-gray-500" }, formatDate(order.createdAt || /* @__PURE__ */ new Date(), "short"))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-right" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-lg font-bold text-slate-900" }, formatPrice(order.grandTotal || 0)), itemCount > 0 && /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xs text-gray-500" }, itemCount, " ", itemCount === 1 ? "item" : "items"))),
|
|
10230
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2 mb-4" }, order.items && order.items.length > 0 ? order.items.slice(0, 3).map((item) => {
|
|
10231
|
+
const itemPrice = item.productVariantData?.finalPrice || 0;
|
|
10232
|
+
const itemTotal = itemPrice * item.quantity;
|
|
10233
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { key: item.productVariantId || item._id, className: "flex items-center gap-2 text-sm" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative w-12 h-12 rounded bg-gray-100 flex-shrink-0 overflow-hidden" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10234
|
+
Image3__default.default,
|
|
10235
|
+
{
|
|
10236
|
+
src: item?.productVariantData?.productMedia?.[0]?.file || "/placeholder-product.jpg",
|
|
10237
|
+
alt: item?.productVariantData?.name || "Product image",
|
|
10238
|
+
fill: true,
|
|
10239
|
+
className: "object-cover",
|
|
10240
|
+
sizes: "48px"
|
|
10241
|
+
}
|
|
10242
|
+
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-medium text-slate-900 truncate text-sm" }, item.productVariantData?.name || "Unknown Product"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xs text-gray-500" }, "Qty: ", item.quantity)), /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-semibold text-slate-900 text-sm" }, formatPrice(itemTotal)));
|
|
10243
|
+
}) : /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-gray-500 text-center py-2" }, "No items found"), order.items && order.items.length > 3 && /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xs text-gray-500 text-center pt-1" }, "+", order.items.length - 3, " more ", order.items.length - 3 === 1 ? "item" : "items")),
|
|
10244
|
+
showPriceBreakdown && /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-4 pb-4 border-b border-gray-200 space-y-1 text-xs" }, order.shippingCost !== void 0 && order.shippingCost > 0 && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex justify-between text-gray-600" }, /* @__PURE__ */ React21__default.default.createElement("span", null, "Shipping"), /* @__PURE__ */ React21__default.default.createElement("span", null, formatPrice(order.shippingCost))), order.tax !== void 0 && order.tax > 0 && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex justify-between text-gray-600" }, /* @__PURE__ */ React21__default.default.createElement("span", null, "Tax"), /* @__PURE__ */ React21__default.default.createElement("span", null, formatPrice(order.tax))), order.discountedAmount !== void 0 && order.discountedAmount > 0 && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex justify-between text-green-600" }, /* @__PURE__ */ React21__default.default.createElement("span", null, "Discount"), /* @__PURE__ */ React21__default.default.createElement("span", null, "-", formatPrice(order.discountedAmount)))),
|
|
10245
|
+
order.payment?.paymentStatus !== "Paid" /* Paid */ && order.payment?.paymentMethod === "Card" /* Card */ && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex justify-end" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10246
|
+
"button",
|
|
10106
10247
|
{
|
|
10107
|
-
|
|
10108
|
-
|
|
10109
|
-
|
|
10110
|
-
className: "inline-flex items-center gap-2
|
|
10248
|
+
onClick: () => {
|
|
10249
|
+
window.open(order?.payment?.hostedInvoiceUrl || "", "_blank");
|
|
10250
|
+
},
|
|
10251
|
+
className: "inline-flex items-center gap-2 rounded-full border-2 border-primary-500 bg-primary-500 hover:bg-primary-600 text-white px-4 py-2 text-sm font-medium transition-colors"
|
|
10111
10252
|
},
|
|
10112
10253
|
/* @__PURE__ */ React21__default.default.createElement(lucideReact.CreditCard, { className: "w-4 h-4" }),
|
|
10113
10254
|
"Pay Now"
|
|
10114
|
-
))
|
|
10255
|
+
))
|
|
10115
10256
|
);
|
|
10116
10257
|
}
|
|
10117
10258
|
function useOrders(page = 1, limit = 10, orderStatus, paymentStatus) {
|
|
@@ -10141,6 +10282,7 @@ function useOrders(page = 1, limit = 10, orderStatus, paymentStatus) {
|
|
|
10141
10282
|
resolvedUserId
|
|
10142
10283
|
);
|
|
10143
10284
|
setOrders(response.data.data || []);
|
|
10285
|
+
console.log(response.data);
|
|
10144
10286
|
setPagination({
|
|
10145
10287
|
page: response.data.page || page,
|
|
10146
10288
|
limit: response.data.limit || limit,
|
|
@@ -10218,9 +10360,7 @@ function FilterChips({
|
|
|
10218
10360
|
variant = "primary"
|
|
10219
10361
|
}) {
|
|
10220
10362
|
const [isOverflowOpen, setIsOverflowOpen] = React21.useState(false);
|
|
10221
|
-
const [filterSearchTerm, setFilterSearchTerm] = React21.useState("");
|
|
10222
10363
|
const overflowMenuRef = React21.useRef(null);
|
|
10223
|
-
const color = variant === "primary" ? "primary" : "secondary";
|
|
10224
10364
|
const { visibleFilters, overflowFilters } = React21.useMemo(() => {
|
|
10225
10365
|
const basePrimary = filters.slice(0, maxVisible);
|
|
10226
10366
|
if (basePrimary.includes(selected)) {
|
|
@@ -10241,17 +10381,6 @@ function FilterChips({
|
|
|
10241
10381
|
overflowFilters: filters.filter((filter) => !uniquePrimary.includes(filter))
|
|
10242
10382
|
};
|
|
10243
10383
|
}, [filters, maxVisible, selected]);
|
|
10244
|
-
const filteredOverflowFilters = React21.useMemo(() => {
|
|
10245
|
-
if (!filterSearchTerm.trim()) return overflowFilters;
|
|
10246
|
-
return overflowFilters.filter(
|
|
10247
|
-
(filter) => filter.toLowerCase().includes(filterSearchTerm.toLowerCase())
|
|
10248
|
-
);
|
|
10249
|
-
}, [filterSearchTerm, overflowFilters]);
|
|
10250
|
-
React21.useEffect(() => {
|
|
10251
|
-
if (!isOverflowOpen) {
|
|
10252
|
-
setFilterSearchTerm("");
|
|
10253
|
-
}
|
|
10254
|
-
}, [isOverflowOpen]);
|
|
10255
10384
|
React21.useEffect(() => {
|
|
10256
10385
|
function handleClickOutside(event) {
|
|
10257
10386
|
if (overflowMenuRef.current && !overflowMenuRef.current.contains(event.target)) {
|
|
@@ -10265,69 +10394,63 @@ function FilterChips({
|
|
|
10265
10394
|
document.removeEventListener("mousedown", handleClickOutside);
|
|
10266
10395
|
};
|
|
10267
10396
|
}, [isOverflowOpen]);
|
|
10268
|
-
|
|
10397
|
+
const isPrimary = variant === "primary";
|
|
10398
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React21__default.default.createElement(Icon, { className: "h-4 w-4 text-slate-500" }), /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-sm font-medium text-slate-700" }, label), selected !== "All" && /* @__PURE__ */ React21__default.default.createElement(
|
|
10269
10399
|
"button",
|
|
10270
10400
|
{
|
|
10271
|
-
key: filter,
|
|
10272
10401
|
type: "button",
|
|
10273
|
-
onClick: () => onSelect(
|
|
10274
|
-
className:
|
|
10402
|
+
onClick: () => onSelect("All"),
|
|
10403
|
+
className: "ml-auto text-xs text-primary-600 hover:text-primary-700 font-medium"
|
|
10275
10404
|
},
|
|
10276
|
-
|
|
10277
|
-
))
|
|
10405
|
+
"Clear"
|
|
10406
|
+
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap items-center gap-2" }, visibleFilters.map((filter) => {
|
|
10407
|
+
const isSelected = selected === filter;
|
|
10408
|
+
return /* @__PURE__ */ React21__default.default.createElement(
|
|
10409
|
+
"button",
|
|
10410
|
+
{
|
|
10411
|
+
key: filter,
|
|
10412
|
+
type: "button",
|
|
10413
|
+
onClick: () => onSelect(filter),
|
|
10414
|
+
className: `inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-all whitespace-nowrap ${isSelected ? isPrimary ? "border-primary-500 bg-primary-500 text-white shadow-sm" : "border-secondary-500 bg-secondary-500 text-white shadow-sm" : "border-slate-200 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50"}`
|
|
10415
|
+
},
|
|
10416
|
+
filter,
|
|
10417
|
+
isSelected && /* @__PURE__ */ React21__default.default.createElement(lucideReact.X, { className: "h-3.5 w-3.5" })
|
|
10418
|
+
);
|
|
10419
|
+
}), overflowFilters.length > 0 && /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative", ref: overflowMenuRef }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10278
10420
|
"button",
|
|
10279
10421
|
{
|
|
10280
10422
|
type: "button",
|
|
10281
10423
|
onClick: () => setIsOverflowOpen((prev) => !prev),
|
|
10282
|
-
className: `flex items-center gap-
|
|
10424
|
+
className: `inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-all whitespace-nowrap ${overflowFilters.includes(selected) ? isPrimary ? "border-primary-500 bg-primary-50 text-primary-700" : "border-secondary-500 bg-secondary-50 text-secondary-700" : "border-slate-200 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50"}`
|
|
10283
10425
|
},
|
|
10284
10426
|
/* @__PURE__ */ React21__default.default.createElement("span", null, overflowFilters.includes(selected) ? selected : "More"),
|
|
10285
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
10427
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronDown, { className: `h-3.5 w-3.5 transition-transform ${isOverflowOpen ? "rotate-180" : ""}` })
|
|
10286
10428
|
), /* @__PURE__ */ React21__default.default.createElement(framerMotion.AnimatePresence, null, isOverflowOpen && /* @__PURE__ */ React21__default.default.createElement(
|
|
10287
10429
|
framerMotion.motion.div,
|
|
10288
10430
|
{
|
|
10289
|
-
initial: { opacity: 0, y: 8 },
|
|
10290
|
-
animate: { opacity: 1, y: 0 },
|
|
10291
|
-
exit: { opacity: 0, y: 8 },
|
|
10431
|
+
initial: { opacity: 0, y: 8, scale: 0.95 },
|
|
10432
|
+
animate: { opacity: 1, y: 0, scale: 1 },
|
|
10433
|
+
exit: { opacity: 0, y: 8, scale: 0.95 },
|
|
10292
10434
|
transition: { duration: 0.15 },
|
|
10293
|
-
className: "absolute
|
|
10435
|
+
className: "absolute left-0 top-full z-50 mt-2 w-56 rounded-lg border border-slate-200 bg-white shadow-lg"
|
|
10294
10436
|
},
|
|
10295
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "
|
|
10296
|
-
|
|
10297
|
-
|
|
10298
|
-
|
|
10299
|
-
|
|
10300
|
-
|
|
10301
|
-
|
|
10302
|
-
|
|
10303
|
-
|
|
10304
|
-
|
|
10305
|
-
|
|
10306
|
-
|
|
10307
|
-
{
|
|
10308
|
-
key: filter,
|
|
10309
|
-
type: "button",
|
|
10310
|
-
onClick: () => {
|
|
10311
|
-
onSelect(filter);
|
|
10312
|
-
setIsOverflowOpen(false);
|
|
10313
|
-
},
|
|
10314
|
-
className: `flex w-full items-center justify-between rounded-xl px-3 py-2 text-sm font-medium transition ${selected === filter ? `bg-${color}-600 text-white shadow-lg shadow-${color}-500/30` : "text-slate-600 hover:bg-slate-100"}`
|
|
10315
|
-
},
|
|
10316
|
-
/* @__PURE__ */ React21__default.default.createElement("span", null, filter),
|
|
10317
|
-
selected === filter && /* @__PURE__ */ React21__default.default.createElement(lucideReact.Check, { className: "h-4 w-4" })
|
|
10318
|
-
)) : /* @__PURE__ */ React21__default.default.createElement("p", { className: "px-3 py-4 text-sm text-slate-500" }, "No items found.")),
|
|
10319
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between gap-2 border-t border-slate-100 px-4 py-3" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-xs font-semibold uppercase tracking-wide text-slate-400" }, "Quick actions"), /* @__PURE__ */ React21__default.default.createElement(
|
|
10320
|
-
"button",
|
|
10321
|
-
{
|
|
10322
|
-
type: "button",
|
|
10323
|
-
onClick: () => {
|
|
10324
|
-
onSelect("All");
|
|
10325
|
-
setIsOverflowOpen(false);
|
|
10437
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "max-h-64 overflow-y-auto p-1.5" }, overflowFilters.map((filter) => {
|
|
10438
|
+
const isSelected = selected === filter;
|
|
10439
|
+
return /* @__PURE__ */ React21__default.default.createElement(
|
|
10440
|
+
"button",
|
|
10441
|
+
{
|
|
10442
|
+
key: filter,
|
|
10443
|
+
type: "button",
|
|
10444
|
+
onClick: () => {
|
|
10445
|
+
onSelect(filter);
|
|
10446
|
+
setIsOverflowOpen(false);
|
|
10447
|
+
},
|
|
10448
|
+
className: `flex w-full items-center justify-between rounded-md px-3 py-2 text-sm font-medium transition ${isSelected ? isPrimary ? "bg-primary-500 text-white" : "bg-secondary-500 text-white" : "text-slate-700 hover:bg-slate-100"}`
|
|
10326
10449
|
},
|
|
10327
|
-
|
|
10328
|
-
|
|
10329
|
-
|
|
10330
|
-
))
|
|
10450
|
+
/* @__PURE__ */ React21__default.default.createElement("span", null, filter),
|
|
10451
|
+
isSelected && /* @__PURE__ */ React21__default.default.createElement(lucideReact.Check, { className: "h-4 w-4" })
|
|
10452
|
+
);
|
|
10453
|
+
}))
|
|
10331
10454
|
)))));
|
|
10332
10455
|
}
|
|
10333
10456
|
var STATUS_FILTERS = ["All", ...Object.values(ManualOrderDTOOrderStatusEnum)];
|
|
@@ -10344,9 +10467,6 @@ function OrdersScreen() {
|
|
|
10344
10467
|
selectedFilter,
|
|
10345
10468
|
selectedPaymentFilter
|
|
10346
10469
|
);
|
|
10347
|
-
const [isOverflowOpen, setIsOverflowOpen] = React21.useState(false);
|
|
10348
|
-
const [filterSearchTerm, setFilterSearchTerm] = React21.useState("");
|
|
10349
|
-
const overflowMenuRef = React21.useRef(null);
|
|
10350
10470
|
const filteredOrders = React21.useMemo(() => {
|
|
10351
10471
|
return orders.filter((order) => {
|
|
10352
10472
|
const matchesStatus = selectedFilter === "All" || order?.orderStatus?.toLowerCase() === selectedFilter.toLowerCase();
|
|
@@ -10356,44 +10476,18 @@ function OrdersScreen() {
|
|
|
10356
10476
|
}, [orders, selectedFilter, selectedPaymentFilter]);
|
|
10357
10477
|
const hasOrders = filteredOrders.length > 0;
|
|
10358
10478
|
const MAX_VISIBLE_FILTERS = 4;
|
|
10359
|
-
|
|
10360
|
-
if (!isOverflowOpen) {
|
|
10361
|
-
setFilterSearchTerm("");
|
|
10362
|
-
}
|
|
10363
|
-
}, [isOverflowOpen]);
|
|
10364
|
-
React21.useEffect(() => {
|
|
10365
|
-
function handleClickOutside(event) {
|
|
10366
|
-
if (overflowMenuRef.current && !overflowMenuRef.current.contains(event.target)) {
|
|
10367
|
-
setIsOverflowOpen(false);
|
|
10368
|
-
}
|
|
10369
|
-
}
|
|
10370
|
-
if (isOverflowOpen) {
|
|
10371
|
-
document.addEventListener("mousedown", handleClickOutside);
|
|
10372
|
-
}
|
|
10373
|
-
return () => {
|
|
10374
|
-
document.removeEventListener("mousedown", handleClickOutside);
|
|
10375
|
-
};
|
|
10376
|
-
}, [isOverflowOpen]);
|
|
10377
|
-
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React21__default.default.createElement("section", { className: "relative overflow-hidden bg-gradient-to-br from-[rgb(var(--header-from))] via-[rgb(var(--header-via))] to-[rgb(var(--header-to))] text-white mb-8" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_top_left,_rgba(255,255,255,0.35),_transparent_60%)]" }), /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative container mx-auto px-4 py-16" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10479
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-white" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4 py-8 max-w-6xl" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10378
10480
|
framerMotion.motion.div,
|
|
10379
10481
|
{
|
|
10380
10482
|
initial: { opacity: 0, y: 24 },
|
|
10381
10483
|
animate: { opacity: 1, y: 0 },
|
|
10382
10484
|
className: "space-y-6"
|
|
10383
10485
|
},
|
|
10384
|
-
/* @__PURE__ */ React21__default.default.createElement("
|
|
10385
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "
|
|
10386
|
-
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative -mt-16 pb-16 container mx-auto px-4" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10387
|
-
framerMotion.motion.div,
|
|
10388
|
-
{
|
|
10389
|
-
initial: { opacity: 0, y: 24 },
|
|
10390
|
-
animate: { opacity: 1, y: 0 },
|
|
10391
|
-
className: "rounded-3xl border border-slate-100 bg-white p-6 shadow-lg shadow-primary-50"
|
|
10392
|
-
},
|
|
10393
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-col gap-4 md:flex-row md:items-center md:justify-between" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3 text-sm text-slate-500" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Sparkles, { className: "h-4 w-4 text-primary-500" }), /* @__PURE__ */ React21__default.default.createElement("span", null, "Explore your complete order archive with pharmacist notes.")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-col gap-4 md:items-end" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10486
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React21__default.default.createElement("h1", { className: "text-2xl font-bold text-slate-900" }, "Orders"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-gray-500 mt-1" }, filteredOrders.length, " ", filteredOrders.length === 1 ? "order" : "orders")),
|
|
10487
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-6" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10394
10488
|
FilterChips,
|
|
10395
10489
|
{
|
|
10396
|
-
label: "Status
|
|
10490
|
+
label: "Order Status",
|
|
10397
10491
|
icon: lucideReact.Filter,
|
|
10398
10492
|
filters: STATUS_FILTERS,
|
|
10399
10493
|
selected: selectedFilter,
|
|
@@ -10407,7 +10501,7 @@ function OrdersScreen() {
|
|
|
10407
10501
|
), /* @__PURE__ */ React21__default.default.createElement(
|
|
10408
10502
|
FilterChips,
|
|
10409
10503
|
{
|
|
10410
|
-
label: "Payment
|
|
10504
|
+
label: "Payment Status",
|
|
10411
10505
|
icon: lucideReact.CreditCard,
|
|
10412
10506
|
filters: PAYMENT_FILTERS,
|
|
10413
10507
|
selected: selectedPaymentFilter,
|
|
@@ -10418,8 +10512,8 @@ function OrdersScreen() {
|
|
|
10418
10512
|
maxVisible: MAX_VISIBLE_FILTERS,
|
|
10419
10513
|
variant: "primary"
|
|
10420
10514
|
}
|
|
10421
|
-
))
|
|
10422
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "
|
|
10515
|
+
)),
|
|
10516
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-4" }, isLoading ? Array.from({ length: 3 }).map((_, index) => /* @__PURE__ */ React21__default.default.createElement(OrderCardSkeleton, { key: index })) : hasOrders ? filteredOrders.map((order) => /* @__PURE__ */ React21__default.default.createElement(OrderCard, { key: order.id, order })) : /* @__PURE__ */ React21__default.default.createElement(
|
|
10423
10517
|
EmptyState,
|
|
10424
10518
|
{
|
|
10425
10519
|
icon: lucideReact.Package,
|
|
@@ -10429,26 +10523,28 @@ function OrdersScreen() {
|
|
|
10429
10523
|
onAction: () => router.push(buildPath("/shop"))
|
|
10430
10524
|
}
|
|
10431
10525
|
)),
|
|
10432
|
-
!isLoading && pagination.totalPages > 1 && hasOrders && /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-
|
|
10526
|
+
!isLoading && pagination.totalPages > 1 && hasOrders && /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-8 flex flex-wrap items-center justify-center gap-4 pt-6 border-t border-gray-200" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10433
10527
|
Button,
|
|
10434
10528
|
{
|
|
10435
10529
|
variant: "outline",
|
|
10436
10530
|
onClick: () => setPage((current) => Math.max(1, current - 1)),
|
|
10437
|
-
disabled: page === 1
|
|
10531
|
+
disabled: page === 1,
|
|
10532
|
+
className: "rounded-full border-2 border-slate-200 bg-white px-4 py-2 text-sm font-medium text-slate-700 hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
10438
10533
|
},
|
|
10439
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronLeft, { className: "h-
|
|
10534
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronLeft, { className: "h-4 w-4 mr-2" }),
|
|
10440
10535
|
"Previous"
|
|
10441
|
-
), /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-sm font-
|
|
10536
|
+
), /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-sm font-medium text-slate-600" }, "Page ", page, " of ", pagination.totalPages), /* @__PURE__ */ React21__default.default.createElement(
|
|
10442
10537
|
Button,
|
|
10443
10538
|
{
|
|
10444
10539
|
variant: "outline",
|
|
10445
10540
|
onClick: () => setPage((current) => Math.min(pagination.totalPages, current + 1)),
|
|
10446
|
-
disabled: page === pagination.totalPages
|
|
10541
|
+
disabled: page === pagination.totalPages,
|
|
10542
|
+
className: "rounded-full border-2 border-slate-200 bg-white px-4 py-2 text-sm font-medium text-slate-700 hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
10447
10543
|
},
|
|
10448
10544
|
"Next",
|
|
10449
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronRight, { className: "h-
|
|
10545
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronRight, { className: "h-4 w-4 ml-2" })
|
|
10450
10546
|
))
|
|
10451
|
-
)))
|
|
10547
|
+
)));
|
|
10452
10548
|
}
|
|
10453
10549
|
function CurrentOrdersScreen() {
|
|
10454
10550
|
const router = navigation.useRouter();
|
|
@@ -10987,14 +11083,23 @@ function WishlistScreen() {
|
|
|
10987
11083
|
return list;
|
|
10988
11084
|
}, [wishlistProducts, onlyInStock, sortOption]);
|
|
10989
11085
|
const emptyAfterFiltering = !isLoading && wishlistProducts.length > 0 && processedProducts.length === 0;
|
|
10990
|
-
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "
|
|
11086
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-white" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-white max-w-6xl mx-auto" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4 py-8" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10991
11087
|
framerMotion.motion.div,
|
|
10992
11088
|
{
|
|
10993
11089
|
initial: { opacity: 0, y: 24 },
|
|
10994
11090
|
animate: { opacity: 1, y: 0 },
|
|
10995
|
-
className: "
|
|
11091
|
+
className: "space-y-6"
|
|
10996
11092
|
},
|
|
10997
|
-
|
|
11093
|
+
!isAuthenticated && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex min-h-[40vh] items-center justify-center" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "max-w-lg text-center space-y-6" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-full bg-gray-100 p-6" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Heart, { className: "h-12 w-12 text-gray-400" }))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-2xl font-bold text-slate-900" }, "Sign in to see your favourites"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-gray-500" }, "Create your curated shelf of products and we'll keep them ready whenever you return.")), /* @__PURE__ */ React21__default.default.createElement(
|
|
11094
|
+
"button",
|
|
11095
|
+
{
|
|
11096
|
+
type: "button",
|
|
11097
|
+
onClick: () => router.push(buildPath("/login")),
|
|
11098
|
+
className: "rounded-full border-2 border-primary-500 bg-primary-500 hover:bg-primary-600 text-white px-6 py-3 text-sm font-medium transition-colors"
|
|
11099
|
+
},
|
|
11100
|
+
"Sign In"
|
|
11101
|
+
))),
|
|
11102
|
+
isAuthenticated && /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React21__default.default.createElement("h1", { className: "text-2xl font-bold text-slate-900" }, "Wishlist"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-gray-500 mt-1" }, wishlistCount, " ", wishlistCount === 1 ? "item" : "items", " saved", wishlistCount > 0 && ` \u2022 Total value: ${formatPrice(totalValue)}`)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between mb-6" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-1" }, onlyInStock && /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-gray-500" }, "Showing items ready to ship")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap items-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement("label", { className: "inline-flex cursor-pointer items-center gap-2 rounded-full border border-slate-200 bg-slate-50 px-3 py-1.5 text-sm font-medium text-slate-600 transition hover:border-primary-200 hover:text-primary-600" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10998
11103
|
"input",
|
|
10999
11104
|
{
|
|
11000
11105
|
type: "checkbox",
|
|
@@ -11043,7 +11148,15 @@ function WishlistScreen() {
|
|
|
11043
11148
|
key: index,
|
|
11044
11149
|
className: "h-72 animate-pulse rounded-2xl border border-slate-200 bg-slate-100"
|
|
11045
11150
|
}
|
|
11046
|
-
))), !isLoading && wishlistCount === 0 && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex min-h-[30vh] items-center justify-center" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "
|
|
11151
|
+
))), !isLoading && wishlistCount === 0 && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex min-h-[30vh] items-center justify-center" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-center space-y-6 max-w-md" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-full bg-gray-100 p-6" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Heart, { className: "h-12 w-12 text-gray-400" }))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-2xl font-bold text-slate-900" }, "Your wishlist is empty"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-gray-500" }, "Start adding products to your wishlist to see them here.")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap justify-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
11152
|
+
"button",
|
|
11153
|
+
{
|
|
11154
|
+
type: "button",
|
|
11155
|
+
onClick: () => router.push(buildPath("/shop")),
|
|
11156
|
+
className: "rounded-full border-2 border-primary-500 bg-primary-500 hover:bg-primary-600 text-white px-6 py-3 text-sm font-medium transition-colors flex items-center justify-center gap-2"
|
|
11157
|
+
},
|
|
11158
|
+
"Discover products"
|
|
11159
|
+
)))), !isLoading && processedProducts.length > 0 && /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, viewMode === "grid" ? /* @__PURE__ */ React21__default.default.createElement(
|
|
11047
11160
|
framerMotion.motion.div,
|
|
11048
11161
|
{
|
|
11049
11162
|
layout: true,
|
|
@@ -11106,7 +11219,15 @@ function WishlistScreen() {
|
|
|
11106
11219
|
},
|
|
11107
11220
|
"Remove"
|
|
11108
11221
|
)))
|
|
11109
|
-
))))), isAuthenticated && emptyAfterFiltering && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-col items-center justify-center rounded-
|
|
11222
|
+
))))), isAuthenticated && emptyAfterFiltering && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-col items-center justify-center rounded-lg border border-dashed border-gray-200 bg-gray-50 p-12 text-center" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex h-16 w-16 items-center justify-center rounded-full bg-gray-200 text-gray-500" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Package, { className: "h-8 w-8" })), /* @__PURE__ */ React21__default.default.createElement("h3", { className: "mt-6 text-xl font-semibold text-slate-900" }, "Nothing matches those filters"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-2 max-w-md text-sm text-gray-500" }, "Try showing out-of-stock items or adjust your sort order to revisit everything you've saved."), /* @__PURE__ */ React21__default.default.createElement(
|
|
11223
|
+
"button",
|
|
11224
|
+
{
|
|
11225
|
+
type: "button",
|
|
11226
|
+
className: "mt-6 rounded-full border-2 border-primary-300 bg-white px-6 py-3 text-sm font-medium text-slate-700 hover:bg-gray-50 transition-colors",
|
|
11227
|
+
onClick: () => setOnlyInStock(false)
|
|
11228
|
+
},
|
|
11229
|
+
"Show all saved products"
|
|
11230
|
+
)))
|
|
11110
11231
|
))));
|
|
11111
11232
|
}
|
|
11112
11233
|
function SearchPage() {
|