hey-pharmacist-ecommerce 1.0.9 → 1.1.1
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 +49 -39
- package/dist/index.d.ts +49 -39
- package/dist/index.js +581 -24
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +578 -25
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +4 -0
- package/src/providers/EcommerceProvider.tsx +3 -2
- package/styles/base.css +34 -0
package/dist/index.js
CHANGED
|
@@ -10,7 +10,7 @@ var lucideReact = require('lucide-react');
|
|
|
10
10
|
var Image3 = require('next/image');
|
|
11
11
|
var navigation = require('next/navigation');
|
|
12
12
|
var dynamic = require('next/dynamic');
|
|
13
|
-
var
|
|
13
|
+
var Link8 = require('next/link');
|
|
14
14
|
var reactHookForm = require('react-hook-form');
|
|
15
15
|
var zod$1 = require('@hookform/resolvers/zod');
|
|
16
16
|
var zod = require('zod');
|
|
@@ -21,7 +21,7 @@ var React19__default = /*#__PURE__*/_interopDefault(React19);
|
|
|
21
21
|
var globalAxios4__default = /*#__PURE__*/_interopDefault(globalAxios4);
|
|
22
22
|
var Image3__default = /*#__PURE__*/_interopDefault(Image3);
|
|
23
23
|
var dynamic__default = /*#__PURE__*/_interopDefault(dynamic);
|
|
24
|
-
var
|
|
24
|
+
var Link8__default = /*#__PURE__*/_interopDefault(Link8);
|
|
25
25
|
|
|
26
26
|
// src/providers/EcommerceProvider.tsx
|
|
27
27
|
|
|
@@ -6950,14 +6950,14 @@ var useWishlist = () => {
|
|
|
6950
6950
|
}
|
|
6951
6951
|
return context;
|
|
6952
6952
|
};
|
|
6953
|
-
function EcommerceProvider({ config, children }) {
|
|
6953
|
+
function EcommerceProvider({ config, children, withToaster = true }) {
|
|
6954
6954
|
React19.useEffect(() => {
|
|
6955
6955
|
initializeApiAdapter(config);
|
|
6956
6956
|
}, [config]);
|
|
6957
6957
|
const [client] = React19__default.default.useState(
|
|
6958
6958
|
new reactQuery.QueryClient({ defaultOptions: { queries: { staleTime: 5e3 } } })
|
|
6959
6959
|
);
|
|
6960
|
-
return /* @__PURE__ */ React19__default.default.createElement(reactQuery.QueryClientProvider, { client }, /* @__PURE__ */ React19__default.default.createElement(ThemeProvider, { config }, /* @__PURE__ */ React19__default.default.createElement(AuthProvider, null, /* @__PURE__ */ React19__default.default.createElement(CartProvider, null, /* @__PURE__ */ React19__default.default.createElement(WishlistProvider, null, children, /* @__PURE__ */ React19__default.default.createElement(sonner.Toaster, { position: "top-right", richColors: true }))))));
|
|
6960
|
+
return /* @__PURE__ */ React19__default.default.createElement(reactQuery.QueryClientProvider, { client }, /* @__PURE__ */ React19__default.default.createElement(ThemeProvider, { config }, /* @__PURE__ */ React19__default.default.createElement(AuthProvider, null, /* @__PURE__ */ React19__default.default.createElement(CartProvider, null, /* @__PURE__ */ React19__default.default.createElement(WishlistProvider, null, children, withToaster && /* @__PURE__ */ React19__default.default.createElement(sonner.Toaster, { position: "top-right", richColors: true }))))));
|
|
6961
6961
|
}
|
|
6962
6962
|
|
|
6963
6963
|
// src/lib/utils/format.ts
|
|
@@ -8322,7 +8322,7 @@ function ProductDetailScreen({ productId }) {
|
|
|
8322
8322
|
return /* @__PURE__ */ React19__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "container mx-auto px-4 py-16" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "grid gap-10 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "h-[520px] animate-pulse rounded-3xl bg-slate-200" }), /* @__PURE__ */ React19__default.default.createElement("div", { className: "grid grid-cols-3 gap-4" }, Array.from({ length: 3 }).map((_, index) => /* @__PURE__ */ React19__default.default.createElement("div", { key: index, className: "h-32 animate-pulse rounded-2xl bg-slate-200" })))), /* @__PURE__ */ React19__default.default.createElement("div", { className: "space-y-4 rounded-3xl bg-white p-6 shadow-sm" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "h-8 w-32 animate-pulse rounded-full bg-slate-200" }), /* @__PURE__ */ React19__default.default.createElement("div", { className: "h-10 w-48 animate-pulse rounded-full bg-slate-200" }), /* @__PURE__ */ React19__default.default.createElement("div", { className: "h-6 w-full animate-pulse rounded-full bg-slate-200" }), /* @__PURE__ */ React19__default.default.createElement("div", { className: "h-12 w-full animate-pulse rounded-2xl bg-slate-200" }), /* @__PURE__ */ React19__default.default.createElement("div", { className: "h-12 w-full animate-pulse rounded-2xl bg-slate-200" })))));
|
|
8323
8323
|
}
|
|
8324
8324
|
if (!product) {
|
|
8325
|
-
return /* @__PURE__ */ React19__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "container mx-auto px-4 py-16" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "rounded-3xl bg-white p-10 text-center shadow-sm" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.Sparkles, { className: "mx-auto h-10 w-10 text-primary-500" }), /* @__PURE__ */ React19__default.default.createElement("h1", { className: "mt-6 text-2xl font-semibold text-gray-900" }, "Product not found"), /* @__PURE__ */ React19__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__ */ React19__default.default.createElement("div", { className: "mt-6" }, /* @__PURE__ */ React19__default.default.createElement(
|
|
8325
|
+
return /* @__PURE__ */ React19__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "container mx-auto px-4 py-16" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "rounded-3xl bg-white p-10 text-center shadow-sm" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.Sparkles, { className: "mx-auto h-10 w-10 text-primary-500" }), /* @__PURE__ */ React19__default.default.createElement("h1", { className: "mt-6 text-2xl font-semibold text-gray-900" }, "Product not found"), /* @__PURE__ */ React19__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__ */ React19__default.default.createElement("div", { className: "mt-6" }, /* @__PURE__ */ React19__default.default.createElement(Link8__default.default, { href: "/shop", className: "inline-block" }, /* @__PURE__ */ React19__default.default.createElement(Button, null, "Browse products"))))));
|
|
8326
8326
|
}
|
|
8327
8327
|
product.tags && product.tags.length > 0 ? product.tags.slice(0, 6) : ["Pharmacist approved", "Gentle on daily routines", "Backed by real customers"];
|
|
8328
8328
|
const highlightCards = [
|
|
@@ -8357,7 +8357,7 @@ function ProductDetailScreen({ productId }) {
|
|
|
8357
8357
|
},
|
|
8358
8358
|
/* @__PURE__ */ React19__default.default.createElement(lucideReact.ArrowLeft, { className: "h-5 w-5" }),
|
|
8359
8359
|
"Continue shopping"
|
|
8360
|
-
), /* @__PURE__ */ React19__default.default.createElement("div", { className: "hidden items-center gap-3 text-sm text-white/80 md:flex" }, /* @__PURE__ */ React19__default.default.createElement(
|
|
8360
|
+
), /* @__PURE__ */ React19__default.default.createElement("div", { className: "hidden items-center gap-3 text-sm text-white/80 md:flex" }, /* @__PURE__ */ React19__default.default.createElement(Link8__default.default, { href: "/", className: "transition hover:text-white" }, "Home"), /* @__PURE__ */ React19__default.default.createElement(lucideReact.ChevronRight, { className: "h-4 w-4" }), /* @__PURE__ */ React19__default.default.createElement(Link8__default.default, { href: "/shop", className: "transition hover:text-white" }, "Shop"), /* @__PURE__ */ React19__default.default.createElement(lucideReact.ChevronRight, { className: "h-4 w-4" }), /* @__PURE__ */ React19__default.default.createElement("span", { className: "truncate font-medium text-white" }, product.name))), /* @__PURE__ */ React19__default.default.createElement(
|
|
8361
8361
|
framerMotion.motion.div,
|
|
8362
8362
|
{
|
|
8363
8363
|
initial: { opacity: 0, y: 24 },
|
|
@@ -8495,7 +8495,7 @@ function ProductDetailScreen({ productId }) {
|
|
|
8495
8495
|
}
|
|
8496
8496
|
),
|
|
8497
8497
|
isFavorited ? "Saved" : "Save for later"
|
|
8498
|
-
))), /* @__PURE__ */ React19__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__ */ React19__default.default.createElement("p", { className: "font-semibold uppercase tracking-[0.25em]" }, "Need advice?"), /* @__PURE__ */ React19__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__ */ React19__default.default.createElement("section", { className: "mt-20" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React19__default.default.createElement("div", null, /* @__PURE__ */ React19__default.default.createElement("h2", { className: "text-2xl font-semibold text-slate-900" }, "You may also like"), /* @__PURE__ */ React19__default.default.createElement("p", { className: "mt-1 text-sm text-slate-500" }, "Hand-picked recommendations that pair nicely with this product.")), /* @__PURE__ */ React19__default.default.createElement(
|
|
8498
|
+
))), /* @__PURE__ */ React19__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__ */ React19__default.default.createElement("p", { className: "font-semibold uppercase tracking-[0.25em]" }, "Need advice?"), /* @__PURE__ */ React19__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__ */ React19__default.default.createElement("section", { className: "mt-20" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React19__default.default.createElement("div", null, /* @__PURE__ */ React19__default.default.createElement("h2", { className: "text-2xl font-semibold text-slate-900" }, "You may also like"), /* @__PURE__ */ React19__default.default.createElement("p", { className: "mt-1 text-sm text-slate-500" }, "Hand-picked recommendations that pair nicely with this product.")), /* @__PURE__ */ React19__default.default.createElement(Link8__default.default, { href: "/shop", className: "hidden md:inline-flex" }, /* @__PURE__ */ React19__default.default.createElement(Button, { variant: "ghost", className: "text-primary-600" }, "View all products"))), /* @__PURE__ */ React19__default.default.createElement("div", { className: "mt-6 grid gap-6 sm:grid-cols-2 lg:grid-cols-4" }, relatedProducts?.map((relatedProduct) => /* @__PURE__ */ React19__default.default.createElement(ProductCard, { key: relatedProduct.id, product: relatedProduct })))))));
|
|
8499
8499
|
}
|
|
8500
8500
|
function CartItem({ item }) {
|
|
8501
8501
|
const { updateQuantity, removeFromCart } = useCart();
|
|
@@ -9493,7 +9493,7 @@ function LoginScreen() {
|
|
|
9493
9493
|
/* @__PURE__ */ React19__default.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React19__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__ */ React19__default.default.createElement(lucideReact.HeartPulse, { className: "h-4 w-4" }), "Hey Pharmacist"), /* @__PURE__ */ React19__default.default.createElement("h1", { className: "text-4xl font-bold leading-tight lg:text-5xl" }, "Pharmacy-grade care for your household"), /* @__PURE__ */ React19__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.")),
|
|
9494
9494
|
/* @__PURE__ */ React19__default.default.createElement("div", { className: "grid gap-4 rounded-3xl bg-white/10 p-6 backdrop-blur" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.ShieldCheck, { className: "h-5 w-5 text-white" }), /* @__PURE__ */ React19__default.default.createElement("p", { className: "text-sm text-white/80" }, "HIPAA-compliant security keeps your health information protected.")), /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.Sparkles, { className: "h-5 w-5 text-white" }), /* @__PURE__ */ React19__default.default.createElement("p", { className: "text-sm text-white/80" }, "Pharmacists ready to chat in under 10 minutes for medication support."))),
|
|
9495
9495
|
/* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-center gap-6 text-sm text-white/80" }, /* @__PURE__ */ React19__default.default.createElement("span", null, "Need an account?"), /* @__PURE__ */ React19__default.default.createElement(
|
|
9496
|
-
|
|
9496
|
+
Link8__default.default,
|
|
9497
9497
|
{
|
|
9498
9498
|
href: "/register",
|
|
9499
9499
|
className: "inline-flex items-center gap-2 rounded-full bg-white/15 px-4 py-2 font-semibold transition hover:bg-white/25"
|
|
@@ -9542,7 +9542,7 @@ function LoginScreen() {
|
|
|
9542
9542
|
className: "h-4 w-4 rounded border-slate-300 text-primary-600 focus:ring-primary-500"
|
|
9543
9543
|
}
|
|
9544
9544
|
), "Remember me"), /* @__PURE__ */ React19__default.default.createElement(
|
|
9545
|
-
|
|
9545
|
+
Link8__default.default,
|
|
9546
9546
|
{
|
|
9547
9547
|
href: "/forgot-password",
|
|
9548
9548
|
className: "font-medium text-primary-600 transition hover:text-primary-700"
|
|
@@ -9618,7 +9618,7 @@ function RegisterScreen() {
|
|
|
9618
9618
|
/* @__PURE__ */ React19__default.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React19__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__ */ React19__default.default.createElement(lucideReact.HeartPulse, { className: "h-4 w-4" }), "Join Hey Pharmacist"), /* @__PURE__ */ React19__default.default.createElement("h1", { className: "text-4xl font-bold leading-tight lg:text-5xl" }, "Create your wellness account"), /* @__PURE__ */ React19__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.")),
|
|
9619
9619
|
/* @__PURE__ */ React19__default.default.createElement("div", { className: "space-y-4 rounded-3xl bg-white/10 p-6 backdrop-blur" }, BENEFITS.map((benefit) => /* @__PURE__ */ React19__default.default.createElement("div", { key: benefit, className: "flex items-center gap-3" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.CheckCircle2, { className: "h-5 w-5 text-white" }), /* @__PURE__ */ React19__default.default.createElement("p", { className: "text-sm text-white/85" }, benefit)))),
|
|
9620
9620
|
/* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-center gap-6 text-sm text-white/80" }, /* @__PURE__ */ React19__default.default.createElement("span", null, "Already part of the community?"), /* @__PURE__ */ React19__default.default.createElement(
|
|
9621
|
-
|
|
9621
|
+
Link8__default.default,
|
|
9622
9622
|
{
|
|
9623
9623
|
href: "/login",
|
|
9624
9624
|
className: "inline-flex items-center gap-2 rounded-full bg-white/15 px-4 py-2 font-semibold transition hover:bg-white/25"
|
|
@@ -9712,8 +9712,8 @@ function RegisterScreen() {
|
|
|
9712
9712
|
},
|
|
9713
9713
|
showConfirmPassword ? /* @__PURE__ */ React19__default.default.createElement(lucideReact.EyeOff, { className: "h-5 w-5" }) : /* @__PURE__ */ React19__default.default.createElement(lucideReact.Eye, { className: "h-5 w-5" })
|
|
9714
9714
|
)),
|
|
9715
|
-
/* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-start gap-3 rounded-2xl bg-slate-50 p-4 text-sm text-slate-600" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.Shield, { className: "mt-0.5 h-5 w-5 text-primary-500" }), /* @__PURE__ */ React19__default.default.createElement("span", null, "By creating an account, you agree to our", " ", /* @__PURE__ */ React19__default.default.createElement(
|
|
9716
|
-
|
|
9715
|
+
/* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-start gap-3 rounded-2xl bg-slate-50 p-4 text-sm text-slate-600" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.Shield, { className: "mt-0.5 h-5 w-5 text-primary-500" }), /* @__PURE__ */ React19__default.default.createElement("span", null, "By creating an account, you agree to our", " ", /* @__PURE__ */ React19__default.default.createElement(Link8__default.default, { href: "/terms", className: "font-semibold text-primary-600 hover:text-primary-700" }, "Terms of Service"), " ", "and", " ", /* @__PURE__ */ React19__default.default.createElement(
|
|
9716
|
+
Link8__default.default,
|
|
9717
9717
|
{
|
|
9718
9718
|
href: "/privacy",
|
|
9719
9719
|
className: "font-semibold text-primary-600 hover:text-primary-700"
|
|
@@ -9876,7 +9876,7 @@ function ProfileScreen() {
|
|
|
9876
9876
|
"View recent orders"
|
|
9877
9877
|
)))),
|
|
9878
9878
|
/* @__PURE__ */ React19__default.default.createElement("section", { className: "grid gap-4 md:grid-cols-2" }, quickLinks.map((item) => /* @__PURE__ */ React19__default.default.createElement(
|
|
9879
|
-
|
|
9879
|
+
Link8__default.default,
|
|
9880
9880
|
{
|
|
9881
9881
|
key: item.href,
|
|
9882
9882
|
href: item.href,
|
|
@@ -10297,7 +10297,7 @@ function CurrentOrdersScreen() {
|
|
|
10297
10297
|
},
|
|
10298
10298
|
/* @__PURE__ */ React19__default.default.createElement("p", { className: "text-sm font-semibold uppercase tracking-[0.35em] text-white/70" }, "Quick actions"),
|
|
10299
10299
|
/* @__PURE__ */ React19__default.default.createElement("div", { className: "mt-4 space-y-3 text-sm text-white/80" }, /* @__PURE__ */ React19__default.default.createElement(
|
|
10300
|
-
|
|
10300
|
+
Link8__default.default,
|
|
10301
10301
|
{
|
|
10302
10302
|
href: "/orders",
|
|
10303
10303
|
className: "flex items-center justify-between rounded-2xl bg-white/10 px-4 py-3 transition hover:bg-white/20"
|
|
@@ -10672,6 +10672,559 @@ You can add it back at any time.`
|
|
|
10672
10672
|
))), /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-center justify-end gap-3" }, /* @__PURE__ */ React19__default.default.createElement(Button, { type: "button", variant: "outline", onClick: closeModal }, "Cancel"), /* @__PURE__ */ React19__default.default.createElement(Button, { type: "submit", isLoading: isSubmitting }, editingAddress ? "Save changes" : "Save address")))
|
|
10673
10673
|
));
|
|
10674
10674
|
}
|
|
10675
|
+
function useWishlistProducts(productIds = []) {
|
|
10676
|
+
const [products, setProducts] = React19.useState([]);
|
|
10677
|
+
const [isLoading, setIsLoading] = React19.useState(false);
|
|
10678
|
+
const [error, setError] = React19.useState(null);
|
|
10679
|
+
const [cache] = React19.useState(() => /* @__PURE__ */ new Map());
|
|
10680
|
+
const uniqueIds = React19.useMemo(
|
|
10681
|
+
() => Array.from(new Set((productIds || []).filter(Boolean))),
|
|
10682
|
+
[productIds]
|
|
10683
|
+
);
|
|
10684
|
+
const fetchProducts = React19.useCallback(async () => {
|
|
10685
|
+
if (uniqueIds.length === 0) {
|
|
10686
|
+
setProducts([]);
|
|
10687
|
+
setIsLoading(false);
|
|
10688
|
+
setError(null);
|
|
10689
|
+
return;
|
|
10690
|
+
}
|
|
10691
|
+
setIsLoading(true);
|
|
10692
|
+
setError(null);
|
|
10693
|
+
try {
|
|
10694
|
+
const api = new ProductsApi(AXIOS_CONFIG);
|
|
10695
|
+
const results = await Promise.all(
|
|
10696
|
+
uniqueIds.map(async (id) => {
|
|
10697
|
+
if (cache.has(id)) return cache.get(id);
|
|
10698
|
+
const response = await api.getSingleProduct(id?._id || id || "");
|
|
10699
|
+
const product = response.data;
|
|
10700
|
+
cache.set(id, product);
|
|
10701
|
+
return product;
|
|
10702
|
+
})
|
|
10703
|
+
);
|
|
10704
|
+
setProducts(results);
|
|
10705
|
+
} catch (err) {
|
|
10706
|
+
setError(err);
|
|
10707
|
+
console.error("Failed to load wishlist products", err);
|
|
10708
|
+
} finally {
|
|
10709
|
+
setIsLoading(false);
|
|
10710
|
+
}
|
|
10711
|
+
}, [cache, uniqueIds]);
|
|
10712
|
+
React19.useEffect(() => {
|
|
10713
|
+
fetchProducts();
|
|
10714
|
+
}, [fetchProducts]);
|
|
10715
|
+
return {
|
|
10716
|
+
products,
|
|
10717
|
+
isLoading,
|
|
10718
|
+
error,
|
|
10719
|
+
refetch: fetchProducts
|
|
10720
|
+
};
|
|
10721
|
+
}
|
|
10722
|
+
var SORT_OPTIONS = [
|
|
10723
|
+
{ value: "featured", label: "Most loved" },
|
|
10724
|
+
{ value: "price-low", label: "Price: Low to High" },
|
|
10725
|
+
{ value: "price-high", label: "Price: High to Low" },
|
|
10726
|
+
{ value: "name", label: "Name A-Z" },
|
|
10727
|
+
{ value: "availability", label: "Availability" }
|
|
10728
|
+
];
|
|
10729
|
+
function WishlistScreen() {
|
|
10730
|
+
const router = navigation.useRouter();
|
|
10731
|
+
const { isAuthenticated } = useAuth() || {};
|
|
10732
|
+
const {
|
|
10733
|
+
products: wishlistItems,
|
|
10734
|
+
removeFromWishlist,
|
|
10735
|
+
getWishlistCount,
|
|
10736
|
+
clearWishlist,
|
|
10737
|
+
refreshWishlist
|
|
10738
|
+
} = useWishlist();
|
|
10739
|
+
const wishlistCount = getWishlistCount?.() ?? 0;
|
|
10740
|
+
const { products: wishlistProducts, isLoading, error } = useWishlistProducts(
|
|
10741
|
+
wishlistItems
|
|
10742
|
+
);
|
|
10743
|
+
const [onlyInStock, setOnlyInStock] = React19.useState(false);
|
|
10744
|
+
const [viewMode, setViewMode] = React19.useState("list");
|
|
10745
|
+
const [sortOption, setSortOption] = React19.useState("featured");
|
|
10746
|
+
React19.useEffect(() => {
|
|
10747
|
+
if (error) {
|
|
10748
|
+
sonner.toast.error("We had trouble loading your saved products. Please try again.");
|
|
10749
|
+
}
|
|
10750
|
+
}, [error]);
|
|
10751
|
+
const handleRemoveFromWishlist = async (productId) => {
|
|
10752
|
+
try {
|
|
10753
|
+
await removeFromWishlist(productId);
|
|
10754
|
+
} catch (err) {
|
|
10755
|
+
console.error("Error removing from wishlist:", err);
|
|
10756
|
+
}
|
|
10757
|
+
};
|
|
10758
|
+
const handleClearWishlist = async () => {
|
|
10759
|
+
const confirmed = window.confirm("Clear all items from your wishlist?");
|
|
10760
|
+
if (!confirmed) return;
|
|
10761
|
+
try {
|
|
10762
|
+
await clearWishlist();
|
|
10763
|
+
await refreshWishlist();
|
|
10764
|
+
} catch (err) {
|
|
10765
|
+
console.error("Error clearing wishlist:", err);
|
|
10766
|
+
}
|
|
10767
|
+
};
|
|
10768
|
+
const totalValue = React19.useMemo(
|
|
10769
|
+
() => wishlistProducts.reduce((sum, product) => sum + (product.finalPrice ?? 0), 0),
|
|
10770
|
+
[wishlistProducts]
|
|
10771
|
+
);
|
|
10772
|
+
React19.useMemo(
|
|
10773
|
+
() => wishlistProducts.reduce((sum, product) => {
|
|
10774
|
+
const before = product.priceBeforeDiscount ?? product.finalPrice ?? 0;
|
|
10775
|
+
const after = product.finalPrice ?? 0;
|
|
10776
|
+
const savings = Math.max(before - after, 0);
|
|
10777
|
+
return sum + savings;
|
|
10778
|
+
}, 0),
|
|
10779
|
+
[wishlistProducts]
|
|
10780
|
+
);
|
|
10781
|
+
React19.useMemo(
|
|
10782
|
+
() => wishlistProducts.filter((product) => (product.inventoryCount ?? 0) > 0).length,
|
|
10783
|
+
[wishlistProducts]
|
|
10784
|
+
);
|
|
10785
|
+
const processedProducts = React19.useMemo(() => {
|
|
10786
|
+
let list = [...wishlistProducts];
|
|
10787
|
+
if (onlyInStock) {
|
|
10788
|
+
list = list.filter((product) => (product.inventoryCount ?? 0) > 0);
|
|
10789
|
+
}
|
|
10790
|
+
switch (sortOption) {
|
|
10791
|
+
case "price-low":
|
|
10792
|
+
list.sort((a, b) => (a.finalPrice ?? 0) - (b.finalPrice ?? 0));
|
|
10793
|
+
break;
|
|
10794
|
+
case "price-high":
|
|
10795
|
+
list.sort((a, b) => (b.finalPrice ?? 0) - (a.finalPrice ?? 0));
|
|
10796
|
+
break;
|
|
10797
|
+
case "name":
|
|
10798
|
+
list.sort((a, b) => (a.name || "").localeCompare(b.name || ""));
|
|
10799
|
+
break;
|
|
10800
|
+
case "availability":
|
|
10801
|
+
list.sort((a, b) => (b.inventoryCount ?? 0) - (a.inventoryCount ?? 0));
|
|
10802
|
+
break;
|
|
10803
|
+
case "featured":
|
|
10804
|
+
default:
|
|
10805
|
+
list.sort((a, b) => (b.totalSold ?? 0) - (a.totalSold ?? 0));
|
|
10806
|
+
break;
|
|
10807
|
+
}
|
|
10808
|
+
return list;
|
|
10809
|
+
}, [wishlistProducts, onlyInStock, sortOption]);
|
|
10810
|
+
const emptyAfterFiltering = !isLoading && wishlistProducts.length > 0 && processedProducts.length === 0;
|
|
10811
|
+
return /* @__PURE__ */ React19__default.default.createElement("div", { className: "min-h-screen bg-slate-50 pb-16" }, /* @__PURE__ */ React19__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))] pb-32 pt-16 text-white" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "absolute inset-0 opacity-40 mix-blend-soft-light", "aria-hidden": "true" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "absolute -top-1/2 right-1/2 h-[40rem] w-[40rem] rounded-full bg-white/10 blur-3xl" }), /* @__PURE__ */ React19__default.default.createElement("div", { className: "absolute left-1/4 top-1/4 h-48 w-48 rounded-full bg-white/20 blur-2xl" })), /* @__PURE__ */ React19__default.default.createElement("div", { className: "relative container mx-auto px-4" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "max-w-3xl space-y-6" }, /* @__PURE__ */ React19__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full bg-white/15 px-4 py-1 text-sm font-semibold uppercase tracking-[0.35em] text-white/70 backdrop-blur" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.Heart, { className: "h-4 w-4" }), "Wishlist"), /* @__PURE__ */ React19__default.default.createElement("h1", { className: "text-4xl font-bold leading-tight md:text-5xl" }, "Curate your pharmacy must-haves in one calming space"), /* @__PURE__ */ React19__default.default.createElement("p", { className: "max-w-2xl text-white/80 md:text-lg" }, "We keep your favourite products ready for reorder, refill reminders, and quick checkout\u2014exactly when you need them.")))), /* @__PURE__ */ React19__default.default.createElement("div", { className: "relative -mt-20" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React19__default.default.createElement(
|
|
10812
|
+
framerMotion.motion.div,
|
|
10813
|
+
{
|
|
10814
|
+
initial: { opacity: 0, y: 24 },
|
|
10815
|
+
animate: { opacity: 1, y: 0 },
|
|
10816
|
+
className: "rounded-3xl border border-slate-100 bg-white p-6 shadow-xl shadow-primary-50"
|
|
10817
|
+
},
|
|
10818
|
+
/* @__PURE__ */ React19__default.default.createElement("div", { className: "flex flex-col gap-6" }, !isAuthenticated && /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex min-h-[40vh] items-center justify-center" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "max-w-lg rounded-3xl border border-slate-100 bg-white p-10 text-center shadow-lg shadow-primary-50" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "mx-auto flex h-16 w-16 items-center justify-center rounded-full bg-primary-50 text-primary-600" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.Heart, { className: "h-8 w-8" })), /* @__PURE__ */ React19__default.default.createElement("h2", { className: "mt-6 text-3xl font-bold text-slate-900" }, "Sign in to see your favourites"), /* @__PURE__ */ React19__default.default.createElement("p", { className: "mt-3 text-slate-500" }, "Create your curated shelf of products and we'll keep them ready whenever you return."), /* @__PURE__ */ React19__default.default.createElement(Button, { className: "mt-6", onClick: () => router.push("/login") }, "Sign In"))), isAuthenticated && /* @__PURE__ */ React19__default.default.createElement(React19__default.default.Fragment, null, /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React19__default.default.createElement("h2", { className: "text-2xl font-semibold text-slate-900" }, "Your saved collection"), /* @__PURE__ */ React19__default.default.createElement("p", { className: "text-sm text-slate-500" }, "Total value: ", /* @__PURE__ */ React19__default.default.createElement("span", { className: "font-semibold text-primary-600" }, formatPrice(totalValue)), onlyInStock && " \u2022 Showing items ready to ship")), /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex flex-wrap items-center gap-3" }, /* @__PURE__ */ React19__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__ */ React19__default.default.createElement(
|
|
10819
|
+
"input",
|
|
10820
|
+
{
|
|
10821
|
+
type: "checkbox",
|
|
10822
|
+
checked: onlyInStock,
|
|
10823
|
+
onChange: (event) => setOnlyInStock(event.target.checked),
|
|
10824
|
+
className: "h-4 w-4 rounded border-slate-300 text-primary-600 focus:ring-primary-500"
|
|
10825
|
+
}
|
|
10826
|
+
), "Only show in-stock"), /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-center gap-2 rounded-full border border-slate-200 bg-slate-50 px-3 py-1.5 text-sm text-slate-600" }, /* @__PURE__ */ React19__default.default.createElement("span", null, "Sort"), /* @__PURE__ */ React19__default.default.createElement(
|
|
10827
|
+
"select",
|
|
10828
|
+
{
|
|
10829
|
+
value: sortOption,
|
|
10830
|
+
onChange: (event) => setSortOption(event.target.value),
|
|
10831
|
+
className: "bg-transparent text-sm font-medium text-slate-700 outline-none"
|
|
10832
|
+
},
|
|
10833
|
+
SORT_OPTIONS.map((option) => /* @__PURE__ */ React19__default.default.createElement("option", { key: option.value, value: option.value }, option.label))
|
|
10834
|
+
)), /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex overflow-hidden rounded-full border border-slate-200 bg-slate-50" }, /* @__PURE__ */ React19__default.default.createElement(
|
|
10835
|
+
"button",
|
|
10836
|
+
{
|
|
10837
|
+
type: "button",
|
|
10838
|
+
onClick: () => setViewMode("grid"),
|
|
10839
|
+
className: `flex items-center gap-1 px-3 py-1.5 text-sm font-medium transition ${viewMode === "grid" ? "bg-primary-600 text-white shadow-lg shadow-primary-500/30" : "text-slate-600 hover:bg-white"}`
|
|
10840
|
+
},
|
|
10841
|
+
/* @__PURE__ */ React19__default.default.createElement(lucideReact.Grid, { className: "h-4 w-4" }),
|
|
10842
|
+
"Grid"
|
|
10843
|
+
), /* @__PURE__ */ React19__default.default.createElement(
|
|
10844
|
+
"button",
|
|
10845
|
+
{
|
|
10846
|
+
type: "button",
|
|
10847
|
+
onClick: () => setViewMode("list"),
|
|
10848
|
+
className: `flex items-center gap-1 px-3 py-1.5 text-sm font-medium transition ${viewMode === "list" ? "bg-primary-600 text-white shadow-lg shadow-primary-500/30" : "text-slate-600 hover:bg-white"}`
|
|
10849
|
+
},
|
|
10850
|
+
/* @__PURE__ */ React19__default.default.createElement(lucideReact.List, { className: "h-4 w-4" }),
|
|
10851
|
+
"List"
|
|
10852
|
+
)), wishlistCount > 0 && /* @__PURE__ */ React19__default.default.createElement(
|
|
10853
|
+
Button,
|
|
10854
|
+
{
|
|
10855
|
+
variant: "ghost",
|
|
10856
|
+
className: "text-sm font-semibold text-slate-500 hover:text-red-500",
|
|
10857
|
+
onClick: handleClearWishlist
|
|
10858
|
+
},
|
|
10859
|
+
/* @__PURE__ */ React19__default.default.createElement(lucideReact.Trash2, { className: "h-4 w-4" }),
|
|
10860
|
+
"Clear all"
|
|
10861
|
+
))), isLoading && /* @__PURE__ */ React19__default.default.createElement("div", { className: "grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3" }, Array.from({ length: Math.min(wishlistCount || 3, 6) }).map((_, index) => /* @__PURE__ */ React19__default.default.createElement(
|
|
10862
|
+
"div",
|
|
10863
|
+
{
|
|
10864
|
+
key: index,
|
|
10865
|
+
className: "h-72 animate-pulse rounded-2xl border border-slate-200 bg-slate-100"
|
|
10866
|
+
}
|
|
10867
|
+
))), !isLoading && wishlistCount === 0 && /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex min-h-[30vh] items-center justify-center" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "max-w-2xl rounded-3xl border border-slate-100 bg-white p-12 text-center shadow-xl shadow-primary-50" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "mx-auto flex h-20 w-20 items-center justify-center rounded-full bg-primary-100 text-primary-600" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.Sparkles, { className: "h-10 w-10" })), /* @__PURE__ */ React19__default.default.createElement("h2", { className: "mt-6 text-4xl font-bold text-slate-900" }, "Start your wellness wishlist"), /* @__PURE__ */ React19__default.default.createElement("p", { className: "mt-4 text-lg text-slate-500" }, "Bookmark pharmacy essentials, supplements, or skincare picks and we'll keep them safe until you're ready to checkout."), /* @__PURE__ */ React19__default.default.createElement("div", { className: "mt-8 flex flex-wrap justify-center gap-3" }, /* @__PURE__ */ React19__default.default.createElement(Button, { onClick: () => router.push("/shop") }, "Discover products"), /* @__PURE__ */ React19__default.default.createElement(Button, { variant: "outline", onClick: () => router.push("/categories") }, "Browse categories")))), !isLoading && processedProducts.length > 0 && /* @__PURE__ */ React19__default.default.createElement(React19__default.default.Fragment, null, viewMode === "grid" ? /* @__PURE__ */ React19__default.default.createElement(
|
|
10868
|
+
framerMotion.motion.div,
|
|
10869
|
+
{
|
|
10870
|
+
layout: true,
|
|
10871
|
+
className: "grid grid-cols-1 gap-5 sm:grid-cols-2 xl:grid-cols-3"
|
|
10872
|
+
},
|
|
10873
|
+
/* @__PURE__ */ React19__default.default.createElement(framerMotion.AnimatePresence, null, processedProducts.map((product) => /* @__PURE__ */ React19__default.default.createElement(
|
|
10874
|
+
framerMotion.motion.div,
|
|
10875
|
+
{
|
|
10876
|
+
key: product.id,
|
|
10877
|
+
layout: true,
|
|
10878
|
+
initial: { opacity: 0, y: 20 },
|
|
10879
|
+
animate: { opacity: 1, y: 0 },
|
|
10880
|
+
exit: { opacity: 0, y: -20 },
|
|
10881
|
+
transition: { duration: 0.2 }
|
|
10882
|
+
},
|
|
10883
|
+
/* @__PURE__ */ React19__default.default.createElement(
|
|
10884
|
+
ProductCard,
|
|
10885
|
+
{
|
|
10886
|
+
product,
|
|
10887
|
+
onClickProduct: (p) => router.push(`/products/${p.id}`),
|
|
10888
|
+
onFavorite: () => handleRemoveFromWishlist(product.id),
|
|
10889
|
+
isFavorited: true
|
|
10890
|
+
}
|
|
10891
|
+
)
|
|
10892
|
+
)))
|
|
10893
|
+
) : /* @__PURE__ */ React19__default.default.createElement(framerMotion.motion.div, { layout: true, className: "space-y-4" }, /* @__PURE__ */ React19__default.default.createElement(framerMotion.AnimatePresence, null, processedProducts.map((product) => /* @__PURE__ */ React19__default.default.createElement(
|
|
10894
|
+
framerMotion.motion.div,
|
|
10895
|
+
{
|
|
10896
|
+
key: product.id,
|
|
10897
|
+
layout: true,
|
|
10898
|
+
initial: { opacity: 0, y: 20 },
|
|
10899
|
+
animate: { opacity: 1, y: 0 },
|
|
10900
|
+
exit: { opacity: 0, y: -20 },
|
|
10901
|
+
transition: { duration: 0.2 },
|
|
10902
|
+
className: "flex flex-col gap-4 rounded-2xl border border-slate-100 bg-slate-50 p-4 shadow-sm shadow-primary-50 sm:flex-row sm:items-center"
|
|
10903
|
+
},
|
|
10904
|
+
/* @__PURE__ */ React19__default.default.createElement("div", { className: "relative h-28 w-full overflow-hidden rounded-2xl bg-white sm:w-40" }, /* @__PURE__ */ React19__default.default.createElement(
|
|
10905
|
+
Image3__default.default,
|
|
10906
|
+
{
|
|
10907
|
+
fill: true,
|
|
10908
|
+
src: product.productMedia?.[0]?.file || "/placeholder-product.jpg",
|
|
10909
|
+
alt: product.name || "Wishlist item",
|
|
10910
|
+
className: "h-full w-full object-cover"
|
|
10911
|
+
}
|
|
10912
|
+
)),
|
|
10913
|
+
/* @__PURE__ */ React19__default.default.createElement("div", { className: "flex flex-1 flex-col gap-2" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex flex-wrap items-center justify-between gap-3" }, /* @__PURE__ */ React19__default.default.createElement("div", null, /* @__PURE__ */ React19__default.default.createElement("h3", { className: "text-lg font-semibold text-slate-900" }, product.name), /* @__PURE__ */ React19__default.default.createElement("p", { className: "text-sm text-slate-500" }, product.parentCategories?.map((category) => category?.name).join(", ") || "General wellness")), /* @__PURE__ */ React19__default.default.createElement("div", { className: "text-right" }, /* @__PURE__ */ React19__default.default.createElement("p", { className: "text-lg font-bold text-primary-600" }, formatPrice(product.finalPrice ?? 0)), product.isDiscounted && /* @__PURE__ */ React19__default.default.createElement("p", { className: "text-xs text-emerald-500" }, "You save ", formatPrice(Math.max((product.priceBeforeDiscount ?? 0) - (product.finalPrice ?? 0), 0))))), /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex flex-wrap items-center gap-3 text-xs text-slate-500" }, /* @__PURE__ */ React19__default.default.createElement("span", { className: `inline-flex items-center gap-1 rounded-full px-2.5 py-1 font-medium ${product.inventoryCount > 0 ? "bg-emerald-100 text-emerald-700" : "bg-rose-100 text-rose-700"}` }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.Package, { className: "h-3.5 w-3.5" }), product.inventoryCount > 0 ? "In stock" : "Backordered"), product.totalSold > 0 && /* @__PURE__ */ React19__default.default.createElement("span", { className: "inline-flex items-center gap-1 rounded-full bg-slate-200 px-2.5 py-1 font-medium text-slate-700" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.Sparkles, { className: "h-3.5 w-3.5" }), product.totalSold, "+ purchased")), /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex flex-wrap gap-2" }, /* @__PURE__ */ React19__default.default.createElement(
|
|
10914
|
+
Button,
|
|
10915
|
+
{
|
|
10916
|
+
size: "sm",
|
|
10917
|
+
onClick: () => router.push(`/products/${product.id}`)
|
|
10918
|
+
},
|
|
10919
|
+
"View details"
|
|
10920
|
+
), /* @__PURE__ */ React19__default.default.createElement(
|
|
10921
|
+
Button,
|
|
10922
|
+
{
|
|
10923
|
+
size: "sm",
|
|
10924
|
+
variant: "outline",
|
|
10925
|
+
onClick: () => handleRemoveFromWishlist(product.id),
|
|
10926
|
+
className: "text-primary-600"
|
|
10927
|
+
},
|
|
10928
|
+
"Remove"
|
|
10929
|
+
)))
|
|
10930
|
+
))))), isAuthenticated && emptyAfterFiltering && /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex flex-col items-center justify-center rounded-2xl border border-dashed border-slate-200 bg-slate-50 p-12 text-center" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex h-16 w-16 items-center justify-center rounded-full bg-slate-200 text-slate-500" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.Package, { className: "h-8 w-8" })), /* @__PURE__ */ React19__default.default.createElement("h3", { className: "mt-6 text-2xl font-semibold text-slate-900" }, "Nothing matches those filters"), /* @__PURE__ */ React19__default.default.createElement("p", { className: "mt-2 max-w-md text-sm text-slate-500" }, "Try showing out-of-stock items or adjust your sort order to revisit everything you\u2019ve saved."), /* @__PURE__ */ React19__default.default.createElement(Button, { className: "mt-6", variant: "outline", onClick: () => setOnlyInStock(false) }, "Show all saved products"))))
|
|
10931
|
+
))));
|
|
10932
|
+
}
|
|
10933
|
+
function SearchPage() {
|
|
10934
|
+
const router = navigation.useRouter();
|
|
10935
|
+
const searchParams = navigation.useSearchParams();
|
|
10936
|
+
const searchQuery = searchParams.get("q") || "";
|
|
10937
|
+
const [products, setProducts] = React19.useState([]);
|
|
10938
|
+
const [isLoading, setIsLoading] = React19.useState(true);
|
|
10939
|
+
const [searchInput, setSearchInput] = React19.useState(searchQuery);
|
|
10940
|
+
const [hasSearched, setHasSearched] = React19.useState(false);
|
|
10941
|
+
const { isInWishlist } = useWishlist();
|
|
10942
|
+
React19.useEffect(() => {
|
|
10943
|
+
const fetchSearchResults = async () => {
|
|
10944
|
+
if (!searchQuery.trim()) {
|
|
10945
|
+
setProducts([]);
|
|
10946
|
+
setIsLoading(false);
|
|
10947
|
+
return;
|
|
10948
|
+
}
|
|
10949
|
+
try {
|
|
10950
|
+
setIsLoading(true);
|
|
10951
|
+
console.log(searchQuery);
|
|
10952
|
+
const api = new ProductsApi(AXIOS_CONFIG);
|
|
10953
|
+
const response = await api.getAllProductsForStore(
|
|
10954
|
+
searchQuery,
|
|
10955
|
+
void 0,
|
|
10956
|
+
// productType
|
|
10957
|
+
void 0,
|
|
10958
|
+
// categoryId
|
|
10959
|
+
void 0,
|
|
10960
|
+
// maxPrice
|
|
10961
|
+
void 0,
|
|
10962
|
+
// minPrice
|
|
10963
|
+
void 0,
|
|
10964
|
+
// brandFilter
|
|
10965
|
+
"in-stock",
|
|
10966
|
+
// availability
|
|
10967
|
+
"relevance",
|
|
10968
|
+
// sort
|
|
10969
|
+
true,
|
|
10970
|
+
// includeNoVariantProducts
|
|
10971
|
+
true,
|
|
10972
|
+
// isActive
|
|
10973
|
+
20,
|
|
10974
|
+
// limit
|
|
10975
|
+
1
|
|
10976
|
+
// page
|
|
10977
|
+
);
|
|
10978
|
+
if (response.data?.data) {
|
|
10979
|
+
const transformedProducts = response.data.data.map((item) => ({
|
|
10980
|
+
...item,
|
|
10981
|
+
id: item._id || ""
|
|
10982
|
+
}));
|
|
10983
|
+
setProducts(transformedProducts);
|
|
10984
|
+
} else {
|
|
10985
|
+
setProducts([]);
|
|
10986
|
+
}
|
|
10987
|
+
setHasSearched(true);
|
|
10988
|
+
} catch (error) {
|
|
10989
|
+
console.error("Error fetching search results:", error);
|
|
10990
|
+
setProducts([]);
|
|
10991
|
+
} finally {
|
|
10992
|
+
setIsLoading(false);
|
|
10993
|
+
}
|
|
10994
|
+
};
|
|
10995
|
+
fetchSearchResults();
|
|
10996
|
+
}, [searchQuery]);
|
|
10997
|
+
const handleSearch = (e) => {
|
|
10998
|
+
e.preventDefault();
|
|
10999
|
+
if (searchInput.trim()) {
|
|
11000
|
+
window.location.href = `/search?q=${encodeURIComponent(searchInput.trim())}`;
|
|
11001
|
+
}
|
|
11002
|
+
};
|
|
11003
|
+
const clearSearch = () => {
|
|
11004
|
+
setSearchInput("");
|
|
11005
|
+
};
|
|
11006
|
+
return /* @__PURE__ */ React.createElement("div", { className: "container mx-auto px-4 py-8" }, /* @__PURE__ */ React.createElement("div", { className: "max-w-2xl mx-auto mb-8" }, /* @__PURE__ */ React.createElement("form", { onSubmit: handleSearch, className: "relative" }, /* @__PURE__ */ React.createElement("div", { className: "relative" }, /* @__PURE__ */ React.createElement(lucideReact.Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 h-5 w-5 text-gray-400" }), /* @__PURE__ */ React.createElement(
|
|
11007
|
+
Input,
|
|
11008
|
+
{
|
|
11009
|
+
type: "text",
|
|
11010
|
+
value: searchInput,
|
|
11011
|
+
onChange: (e) => setSearchInput(e.target.value),
|
|
11012
|
+
placeholder: "Search for products...",
|
|
11013
|
+
className: "pl-10 pr-10 py-6 text-base rounded-lg border-gray-300 focus:ring-2 focus:ring-primary-500 focus:border-primary-500"
|
|
11014
|
+
}
|
|
11015
|
+
), searchInput && /* @__PURE__ */ React.createElement(
|
|
11016
|
+
"button",
|
|
11017
|
+
{
|
|
11018
|
+
type: "button",
|
|
11019
|
+
onClick: clearSearch,
|
|
11020
|
+
className: "absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600"
|
|
11021
|
+
},
|
|
11022
|
+
/* @__PURE__ */ React.createElement(lucideReact.X, { className: "h-5 w-5" })
|
|
11023
|
+
)), /* @__PURE__ */ React.createElement(
|
|
11024
|
+
"button",
|
|
11025
|
+
{
|
|
11026
|
+
type: "submit",
|
|
11027
|
+
className: "mt-4 w-full bg-primary-600 hover:bg-primary-700 text-white font-medium py-2 px-4 rounded-lg transition-colors"
|
|
11028
|
+
},
|
|
11029
|
+
"Search"
|
|
11030
|
+
))), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("h1", { className: "text-2xl font-bold text-gray-900 mb-6" }, searchQuery ? `Search results for "${searchQuery}"` : "Search Products"), isLoading ? /* @__PURE__ */ React.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6" }, [...Array(8)].map((_, i) => /* @__PURE__ */ React.createElement("div", { key: i, className: "space-y-3" }, /* @__PURE__ */ React.createElement(Skeleton, { className: "h-48 w-full rounded-lg" }), /* @__PURE__ */ React.createElement(Skeleton, { className: "h-4 w-3/4" }), /* @__PURE__ */ React.createElement(Skeleton, { className: "h-4 w-1/2" })))) : products.length > 0 ? /* @__PURE__ */ React.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6" }, products.map((product) => /* @__PURE__ */ React.createElement(
|
|
11031
|
+
ProductCard,
|
|
11032
|
+
{
|
|
11033
|
+
product,
|
|
11034
|
+
isFavorited: isInWishlist(product.id),
|
|
11035
|
+
onClickProduct: (p) => router.push(`/products/${p.id}`)
|
|
11036
|
+
}
|
|
11037
|
+
))) : hasSearched ? /* @__PURE__ */ React.createElement("div", { className: "text-center py-12" }, /* @__PURE__ */ React.createElement("div", { className: "text-gray-500 text-lg mb-4" }, 'No products found for "', searchQuery, '"'), /* @__PURE__ */ React.createElement("p", { className: "text-gray-500 mb-6" }, "Try different keywords or check out our", " ", /* @__PURE__ */ React.createElement(Link8__default.default, { href: "/shop", className: "text-primary-600 hover:underline ml-1 font-medium" }, "featured products"))) : /* @__PURE__ */ React.createElement("div", { className: "text-center py-12" }, /* @__PURE__ */ React.createElement("p", { className: "text-gray-500" }, "Enter a search term to find products"))));
|
|
11038
|
+
}
|
|
11039
|
+
function CategoriesScreen() {
|
|
11040
|
+
const { categories, isLoading } = useCategories();
|
|
11041
|
+
const router = navigation.useRouter();
|
|
11042
|
+
return /* @__PURE__ */ React19__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React19__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__ */ React19__default.default.createElement("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_top_left,_rgba(255,255,255,0.35),_transparent_60%)]" }), /* @__PURE__ */ React19__default.default.createElement("div", { className: "relative container mx-auto px-4 py-16" }, /* @__PURE__ */ React19__default.default.createElement(
|
|
11043
|
+
framerMotion.motion.div,
|
|
11044
|
+
{
|
|
11045
|
+
initial: { opacity: 0, y: 24 },
|
|
11046
|
+
animate: { opacity: 1, y: 0 },
|
|
11047
|
+
className: "space-y-6"
|
|
11048
|
+
},
|
|
11049
|
+
/* @__PURE__ */ React19__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__ */ React19__default.default.createElement(lucideReact.Package, { className: "h-4 w-4" }), "Product Categories"),
|
|
11050
|
+
/* @__PURE__ */ React19__default.default.createElement("div", { className: "flex flex-col gap-4 md:flex-row md:items-center md:justify-between" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React19__default.default.createElement("h1", { className: "text-4xl font-bold md:text-5xl" }, "Browse Our Product Range"), /* @__PURE__ */ React19__default.default.createElement("p", { className: "max-w-2xl text-white/80 md:text-lg" }, "Explore our comprehensive selection of healthcare products, carefully curated by our pharmacists to meet all your wellness needs.")), /* @__PURE__ */ React19__default.default.createElement("div", { className: "rounded-3xl bg-white/15 p-6 backdrop-blur" }, /* @__PURE__ */ React19__default.default.createElement("p", { className: "text-sm font-semibold uppercase tracking-[0.35em] text-white/70" }, "Quick tip"), /* @__PURE__ */ React19__default.default.createElement("p", { className: "mt-3 text-sm text-white/80" }, "Use the categories below to quickly find the products you're looking for, or use the search function for specific items.")))
|
|
11051
|
+
))), /* @__PURE__ */ React19__default.default.createElement("div", { className: "relative -mt-16 pb-16" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React19__default.default.createElement(
|
|
11052
|
+
framerMotion.motion.div,
|
|
11053
|
+
{
|
|
11054
|
+
initial: { opacity: 0, y: 24 },
|
|
11055
|
+
animate: { opacity: 1, y: 0 },
|
|
11056
|
+
className: "rounded-3xl border border-slate-100 bg-white p-6 shadow-lg shadow-primary-50"
|
|
11057
|
+
},
|
|
11058
|
+
/* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-center gap-3 text-sm text-slate-500 mb-6" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.Sparkles, { className: "h-4 w-4 text-primary-500" }), /* @__PURE__ */ React19__default.default.createElement("span", null, "Browse our complete product catalog organized by categories.")),
|
|
11059
|
+
isLoading ? /* @__PURE__ */ React19__default.default.createElement("div", { className: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6" }, [...Array(8)].map((_, i) => /* @__PURE__ */ React19__default.default.createElement("div", { key: i, className: "animate-pulse" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "bg-gray-200 rounded-lg aspect-square mb-2" }), /* @__PURE__ */ React19__default.default.createElement("div", { className: "h-4 bg-gray-200 rounded w-3/4 mb-1" }), /* @__PURE__ */ React19__default.default.createElement("div", { className: "h-3 bg-gray-200 rounded w-1/2" })))) : categories.length > 0 ? /* @__PURE__ */ React19__default.default.createElement("div", { className: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6" }, categories.map((category) => /* @__PURE__ */ React19__default.default.createElement(
|
|
11060
|
+
Link8__default.default,
|
|
11061
|
+
{
|
|
11062
|
+
key: category.id,
|
|
11063
|
+
href: `/shop?category=${category.name}`,
|
|
11064
|
+
className: "group block overflow-hidden rounded-xl border border-gray-100 bg-white p-4 text-center transition hover:shadow-lg hover:border-primary-500"
|
|
11065
|
+
},
|
|
11066
|
+
/* @__PURE__ */ React19__default.default.createElement("div", { className: "relative aspect-square w-full overflow-hidden rounded-lg bg-gray-50 mb-3" }, category.image ? /* @__PURE__ */ React19__default.default.createElement(
|
|
11067
|
+
Image3__default.default,
|
|
11068
|
+
{
|
|
11069
|
+
src: category.image,
|
|
11070
|
+
alt: category.name || "Category Image",
|
|
11071
|
+
fill: true,
|
|
11072
|
+
className: "object-cover transition-transform group-hover:scale-105",
|
|
11073
|
+
sizes: "(max-width: 768px) 50vw, (max-width: 1200px) 33vw, 25vw"
|
|
11074
|
+
}
|
|
11075
|
+
) : /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex h-full w-full items-center justify-center bg-gray-100 text-gray-400" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.Package, { className: "h-12 w-12" }))),
|
|
11076
|
+
/* @__PURE__ */ React19__default.default.createElement("h3", { className: "text-lg font-semibold text-gray-900 group-hover:text-primary-600 transition-colors" }, category.name),
|
|
11077
|
+
category.productCount > 0 && /* @__PURE__ */ React19__default.default.createElement("p", { className: "mt-1 text-sm text-gray-500" }, category.productCount, " ", category.productCount === 1 ? "product" : "products")
|
|
11078
|
+
))) : /* @__PURE__ */ React19__default.default.createElement(
|
|
11079
|
+
EmptyState,
|
|
11080
|
+
{
|
|
11081
|
+
title: "No categories found",
|
|
11082
|
+
description: "There are currently no product categories available.",
|
|
11083
|
+
icon: lucideReact.Package,
|
|
11084
|
+
actionLabel: "Shop products",
|
|
11085
|
+
onAction: () => router.push("/shop")
|
|
11086
|
+
}
|
|
11087
|
+
)
|
|
11088
|
+
))));
|
|
11089
|
+
}
|
|
11090
|
+
function NewAddressPage() {
|
|
11091
|
+
const router = navigation.useRouter();
|
|
11092
|
+
const [isSubmitting, setIsSubmitting] = React19.useState(false);
|
|
11093
|
+
const {
|
|
11094
|
+
register,
|
|
11095
|
+
handleSubmit,
|
|
11096
|
+
formState: { errors }
|
|
11097
|
+
} = reactHookForm.useForm({
|
|
11098
|
+
resolver: zod$1.zodResolver(addressSchema),
|
|
11099
|
+
defaultValues: {
|
|
11100
|
+
country: "United States"
|
|
11101
|
+
}
|
|
11102
|
+
});
|
|
11103
|
+
const onSubmit = async (data) => {
|
|
11104
|
+
setIsSubmitting(true);
|
|
11105
|
+
try {
|
|
11106
|
+
console.log("Submitting address data:", data);
|
|
11107
|
+
const api = new AddressesApi(AXIOS_CONFIG);
|
|
11108
|
+
const response = await api.createAddressForUser({
|
|
11109
|
+
name: data.name,
|
|
11110
|
+
street1: data.street1,
|
|
11111
|
+
street2: data.street2,
|
|
11112
|
+
city: data.city,
|
|
11113
|
+
state: data.state,
|
|
11114
|
+
zip: data.zip,
|
|
11115
|
+
country: data.country,
|
|
11116
|
+
phone: data.phone
|
|
11117
|
+
});
|
|
11118
|
+
sonner.toast.success("Address added successfully");
|
|
11119
|
+
router.back();
|
|
11120
|
+
} catch (error) {
|
|
11121
|
+
let errorMessage = "An unexpected error occurred";
|
|
11122
|
+
if (error.response?.data?.message) {
|
|
11123
|
+
errorMessage = error.response.data.message;
|
|
11124
|
+
} else if (error.message) {
|
|
11125
|
+
errorMessage = error.message;
|
|
11126
|
+
}
|
|
11127
|
+
if (error.response?.status === 400) {
|
|
11128
|
+
errorMessage = error.response.data?.message || "Please check your address details and try again";
|
|
11129
|
+
}
|
|
11130
|
+
if (error.message === "Network Error") {
|
|
11131
|
+
errorMessage = "Unable to connect to the server. Please check your internet connection.";
|
|
11132
|
+
}
|
|
11133
|
+
sonner.toast.error("Unable to save address", {
|
|
11134
|
+
description: errorMessage,
|
|
11135
|
+
duration: 5e3
|
|
11136
|
+
});
|
|
11137
|
+
if (error.response?.status === 422) {
|
|
11138
|
+
sonner.toast.info("Address validation failed", {
|
|
11139
|
+
description: "Make sure your address is complete and formatted correctly.",
|
|
11140
|
+
duration: 6e3
|
|
11141
|
+
});
|
|
11142
|
+
}
|
|
11143
|
+
} finally {
|
|
11144
|
+
setIsSubmitting(false);
|
|
11145
|
+
}
|
|
11146
|
+
};
|
|
11147
|
+
return /* @__PURE__ */ React.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React.createElement("div", { className: "relative bg-gradient-to-br from-[rgb(var(--header-from))] via-[rgb(var(--header-via))] to-[rgb(var(--header-to))] text-white" }, /* @__PURE__ */ React.createElement("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_top_left,_rgba(255,255,255,0.35),_transparent_60%)]" }), /* @__PURE__ */ React.createElement("div", { className: "relative container mx-auto px-4 py-8" }, /* @__PURE__ */ React.createElement(
|
|
11148
|
+
"button",
|
|
11149
|
+
{
|
|
11150
|
+
onClick: () => router.back(),
|
|
11151
|
+
className: "inline-flex items-center gap-2 rounded-lg bg-white/10 px-4 py-2 text-sm font-medium text-white hover:bg-white/20 transition-colors"
|
|
11152
|
+
},
|
|
11153
|
+
/* @__PURE__ */ React.createElement(lucideReact.ArrowLeft, { className: "h-4 w-4" }),
|
|
11154
|
+
"Back"
|
|
11155
|
+
), /* @__PURE__ */ React.createElement("div", { className: "mt-6 flex items-center gap-4" }, /* @__PURE__ */ React.createElement("div", { className: "rounded-full bg-white/10 p-3" }, /* @__PURE__ */ React.createElement(lucideReact.MapPin, { className: "h-6 w-6" })), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("h1", { className: "text-3xl font-bold" }, "Add New Address"), /* @__PURE__ */ React.createElement("p", { className: "mt-1 text-white/75" }, "Enter your delivery address details below."))))), /* @__PURE__ */ React.createElement("div", { className: "container mx-auto px-4 py-8" }, /* @__PURE__ */ React.createElement("div", { className: "max-w-2xl mx-auto" }, /* @__PURE__ */ React.createElement("div", { className: "bg-white rounded-2xl shadow-xl p-6" }, /* @__PURE__ */ React.createElement("form", { onSubmit: handleSubmit(onSubmit), className: "space-y-6" }, /* @__PURE__ */ React.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React.createElement(
|
|
11156
|
+
Input,
|
|
11157
|
+
{
|
|
11158
|
+
label: "Full name",
|
|
11159
|
+
placeholder: "John Doe",
|
|
11160
|
+
...register("name"),
|
|
11161
|
+
error: errors.name?.message
|
|
11162
|
+
}
|
|
11163
|
+
), /* @__PURE__ */ React.createElement(
|
|
11164
|
+
Input,
|
|
11165
|
+
{
|
|
11166
|
+
label: "Phone number",
|
|
11167
|
+
placeholder: "+1 (555) 123-4567",
|
|
11168
|
+
...register("phone"),
|
|
11169
|
+
error: errors.phone?.message
|
|
11170
|
+
}
|
|
11171
|
+
), /* @__PURE__ */ React.createElement("div", { className: "md:col-span-2" }, /* @__PURE__ */ React.createElement(
|
|
11172
|
+
Input,
|
|
11173
|
+
{
|
|
11174
|
+
label: "Address line 1",
|
|
11175
|
+
placeholder: "123 Main St",
|
|
11176
|
+
...register("street1"),
|
|
11177
|
+
error: errors.street1?.message
|
|
11178
|
+
}
|
|
11179
|
+
)), /* @__PURE__ */ React.createElement("div", { className: "md:col-span-2" }, /* @__PURE__ */ React.createElement(
|
|
11180
|
+
Input,
|
|
11181
|
+
{
|
|
11182
|
+
label: "Address line 2 (optional)",
|
|
11183
|
+
placeholder: "Apt 4B",
|
|
11184
|
+
...register("street2")
|
|
11185
|
+
}
|
|
11186
|
+
)), /* @__PURE__ */ React.createElement(
|
|
11187
|
+
Input,
|
|
11188
|
+
{
|
|
11189
|
+
label: "City",
|
|
11190
|
+
placeholder: "New York",
|
|
11191
|
+
...register("city"),
|
|
11192
|
+
error: errors.city?.message
|
|
11193
|
+
}
|
|
11194
|
+
), /* @__PURE__ */ React.createElement(
|
|
11195
|
+
Input,
|
|
11196
|
+
{
|
|
11197
|
+
label: "State",
|
|
11198
|
+
placeholder: "NY",
|
|
11199
|
+
...register("state"),
|
|
11200
|
+
error: errors.state?.message
|
|
11201
|
+
}
|
|
11202
|
+
), /* @__PURE__ */ React.createElement(
|
|
11203
|
+
Input,
|
|
11204
|
+
{
|
|
11205
|
+
label: "ZIP code",
|
|
11206
|
+
placeholder: "10001",
|
|
11207
|
+
...register("zip"),
|
|
11208
|
+
error: errors.zip?.message
|
|
11209
|
+
}
|
|
11210
|
+
), /* @__PURE__ */ React.createElement(
|
|
11211
|
+
Input,
|
|
11212
|
+
{
|
|
11213
|
+
label: "Country",
|
|
11214
|
+
placeholder: "United States",
|
|
11215
|
+
...register("country"),
|
|
11216
|
+
error: errors.country?.message
|
|
11217
|
+
}
|
|
11218
|
+
)), /* @__PURE__ */ React.createElement("div", { className: "flex justify-end gap-4" }, /* @__PURE__ */ React.createElement(
|
|
11219
|
+
Button,
|
|
11220
|
+
{
|
|
11221
|
+
type: "button",
|
|
11222
|
+
variant: "outline",
|
|
11223
|
+
onClick: () => router.back()
|
|
11224
|
+
},
|
|
11225
|
+
"Cancel"
|
|
11226
|
+
), /* @__PURE__ */ React.createElement(Button, { type: "submit", disabled: isSubmitting }, isSubmitting ? "Adding Address..." : "Add Address")))))));
|
|
11227
|
+
}
|
|
10675
11228
|
function Header() {
|
|
10676
11229
|
const { config } = useTheme();
|
|
10677
11230
|
const { user, isAuthenticated } = useAuth();
|
|
@@ -10688,7 +11241,7 @@ function Header() {
|
|
|
10688
11241
|
{ href: "/about", label: "About" },
|
|
10689
11242
|
{ href: "/contact", label: "Contact" }
|
|
10690
11243
|
];
|
|
10691
|
-
return /* @__PURE__ */ React19__default.default.createElement("header", { className: "sticky top-0 z-40 bg-white/80 backdrop-blur-xl border-b border-gray-200 shadow-sm" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-center justify-between h-20" }, /* @__PURE__ */ React19__default.default.createElement(
|
|
11244
|
+
return /* @__PURE__ */ React19__default.default.createElement("header", { className: "sticky top-0 z-40 bg-white/80 backdrop-blur-xl border-b border-gray-200 shadow-sm" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-center justify-between h-20" }, /* @__PURE__ */ React19__default.default.createElement(Link8__default.default, { href: "/", className: "flex items-center gap-3" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "relative w-12 h-12" }, /* @__PURE__ */ React19__default.default.createElement(
|
|
10692
11245
|
Image3__default.default,
|
|
10693
11246
|
{
|
|
10694
11247
|
src: config.logo,
|
|
@@ -10697,7 +11250,7 @@ function Header() {
|
|
|
10697
11250
|
className: "object-contain"
|
|
10698
11251
|
}
|
|
10699
11252
|
)), /* @__PURE__ */ React19__default.default.createElement("span", { className: "text-2xl font-bold text-gray-900 hidden sm:block" }, config.storeName)), /* @__PURE__ */ React19__default.default.createElement("nav", { className: "hidden lg:flex items-center gap-8" }, navLinks.map((link) => /* @__PURE__ */ React19__default.default.createElement(
|
|
10700
|
-
|
|
11253
|
+
Link8__default.default,
|
|
10701
11254
|
{
|
|
10702
11255
|
key: link.href,
|
|
10703
11256
|
href: link.href,
|
|
@@ -10744,15 +11297,15 @@ function Header() {
|
|
|
10744
11297
|
},
|
|
10745
11298
|
/* @__PURE__ */ React19__default.default.createElement(lucideReact.X, { className: "w-4 h-4" })
|
|
10746
11299
|
))
|
|
10747
|
-
))), /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ React19__default.default.createElement(
|
|
10748
|
-
|
|
11300
|
+
))), /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ React19__default.default.createElement(Link8__default.default, { href: "/wishlist", className: "relative p-2 text-gray-700 hover:text-red-500 transition-colors" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.Heart, { className: "w-6 h-6" }), wishlistCount > 0 && /* @__PURE__ */ React19__default.default.createElement("span", { className: "absolute -top-1 -right-1 bg-red-500 text-white text-xs font-bold rounded-full w-5 h-5 flex items-center justify-center" }, wishlistCount)), /* @__PURE__ */ React19__default.default.createElement(Link8__default.default, { href: "/cart", className: "relative p-2 text-gray-700 hover:text-primary-600 transition-colors" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.ShoppingCart, { className: "w-6 h-6" }), cart?.cartBody?.items?.length && cart.cartBody?.items?.length > 0 ? /* @__PURE__ */ React19__default.default.createElement("span", { className: "absolute -top-1 -right-1 bg-red-500 text-white text-xs font-bold rounded-full w-5 h-5 flex items-center justify-center" }, cart.cartBody?.items?.length) : null), isAuthenticated ? /* @__PURE__ */ React19__default.default.createElement(
|
|
11301
|
+
Link8__default.default,
|
|
10749
11302
|
{
|
|
10750
11303
|
href: "/account",
|
|
10751
11304
|
className: "p-2 hover:bg-gray-100 rounded-lg transition-colors"
|
|
10752
11305
|
},
|
|
10753
11306
|
/* @__PURE__ */ React19__default.default.createElement(lucideReact.User, { className: "w-6 h-6 text-gray-700" })
|
|
10754
11307
|
) : /* @__PURE__ */ React19__default.default.createElement(
|
|
10755
|
-
|
|
11308
|
+
Link8__default.default,
|
|
10756
11309
|
{
|
|
10757
11310
|
href: "/login",
|
|
10758
11311
|
className: "hidden sm:block px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors font-medium"
|
|
@@ -10774,7 +11327,7 @@ function Header() {
|
|
|
10774
11327
|
className: "lg:hidden overflow-hidden border-t border-gray-200"
|
|
10775
11328
|
},
|
|
10776
11329
|
/* @__PURE__ */ React19__default.default.createElement("nav", { className: "flex flex-col gap-1 py-2" }, navLinks.map((link) => /* @__PURE__ */ React19__default.default.createElement(
|
|
10777
|
-
|
|
11330
|
+
Link8__default.default,
|
|
10778
11331
|
{
|
|
10779
11332
|
key: link.href,
|
|
10780
11333
|
href: link.href,
|
|
@@ -10783,7 +11336,7 @@ function Header() {
|
|
|
10783
11336
|
},
|
|
10784
11337
|
link.label
|
|
10785
11338
|
)), !isAuthenticated && /* @__PURE__ */ React19__default.default.createElement(
|
|
10786
|
-
|
|
11339
|
+
Link8__default.default,
|
|
10787
11340
|
{
|
|
10788
11341
|
href: "/login",
|
|
10789
11342
|
onClick: () => setIsMobileMenuOpen(false),
|
|
@@ -10815,21 +11368,21 @@ function Footer() {
|
|
|
10815
11368
|
{ label: "Returns", href: "/returns" }
|
|
10816
11369
|
]};
|
|
10817
11370
|
return /* @__PURE__ */ React19__default.default.createElement("footer", { className: "bg-gray-900 text-gray-300" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "container mx-auto px-4 py-16" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-12" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "lg:col-span-2" }, /* @__PURE__ */ React19__default.default.createElement("h3", { className: "text-2xl font-bold text-white mb-4" }, config.storeName), /* @__PURE__ */ React19__default.default.createElement("p", { className: "text-gray-400 mb-6 max-w-md" }, "Your trusted online store for quality products. We deliver excellence with every order."), /* @__PURE__ */ React19__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.Mail, { className: "w-5 h-5 text-primary-500" }), /* @__PURE__ */ React19__default.default.createElement("span", null, "support@", config.storeName.toLowerCase().replace(/\s+/g, ""), ".com")), /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.Phone, { className: "w-5 h-5 text-primary-500" }), /* @__PURE__ */ React19__default.default.createElement("span", null, "+1 (555) 123-4567")), /* @__PURE__ */ React19__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React19__default.default.createElement(lucideReact.MapPin, { className: "w-5 h-5 text-primary-500" }), /* @__PURE__ */ React19__default.default.createElement("span", null, "123 Store Street, City, Country")))), /* @__PURE__ */ React19__default.default.createElement("div", null, /* @__PURE__ */ React19__default.default.createElement("h4", { className: "text-lg font-semibold text-white mb-4" }, "Shop"), /* @__PURE__ */ React19__default.default.createElement("ul", { className: "space-y-2" }, footerLinks.shop.map((link) => /* @__PURE__ */ React19__default.default.createElement("li", { key: link.href }, /* @__PURE__ */ React19__default.default.createElement(
|
|
10818
|
-
|
|
11371
|
+
Link8__default.default,
|
|
10819
11372
|
{
|
|
10820
11373
|
href: link.href,
|
|
10821
11374
|
className: "hover:text-primary-500 transition-colors"
|
|
10822
11375
|
},
|
|
10823
11376
|
link.label
|
|
10824
11377
|
))))), /* @__PURE__ */ React19__default.default.createElement("div", null, /* @__PURE__ */ React19__default.default.createElement("h4", { className: "text-lg font-semibold text-white mb-4" }, "Account"), /* @__PURE__ */ React19__default.default.createElement("ul", { className: "space-y-2" }, footerLinks.account.map((link) => /* @__PURE__ */ React19__default.default.createElement("li", { key: link.href }, /* @__PURE__ */ React19__default.default.createElement(
|
|
10825
|
-
|
|
11378
|
+
Link8__default.default,
|
|
10826
11379
|
{
|
|
10827
11380
|
href: link.href,
|
|
10828
11381
|
className: "hover:text-primary-500 transition-colors"
|
|
10829
11382
|
},
|
|
10830
11383
|
link.label
|
|
10831
11384
|
))))), /* @__PURE__ */ React19__default.default.createElement("div", null, /* @__PURE__ */ React19__default.default.createElement("h4", { className: "text-lg font-semibold text-white mb-4" }, "Support"), /* @__PURE__ */ React19__default.default.createElement("ul", { className: "space-y-2" }, footerLinks.support.map((link) => /* @__PURE__ */ React19__default.default.createElement("li", { key: link.href }, /* @__PURE__ */ React19__default.default.createElement(
|
|
10832
|
-
|
|
11385
|
+
Link8__default.default,
|
|
10833
11386
|
{
|
|
10834
11387
|
href: link.href,
|
|
10835
11388
|
className: "hover:text-primary-500 transition-colors"
|
|
@@ -10866,6 +11419,7 @@ exports.Button = Button;
|
|
|
10866
11419
|
exports.CartItem = CartItem;
|
|
10867
11420
|
exports.CartProvider = CartProvider;
|
|
10868
11421
|
exports.CartScreen = CartScreen;
|
|
11422
|
+
exports.CategoriesScreen = CategoriesScreen;
|
|
10869
11423
|
exports.CheckoutScreen = CheckoutScreen;
|
|
10870
11424
|
exports.CurrentOrdersScreen = CurrentOrdersScreen;
|
|
10871
11425
|
exports.EcommerceProvider = EcommerceProvider;
|
|
@@ -10875,6 +11429,7 @@ exports.Header = Header;
|
|
|
10875
11429
|
exports.Input = Input;
|
|
10876
11430
|
exports.LoginScreen = LoginScreen;
|
|
10877
11431
|
exports.Modal = Modal;
|
|
11432
|
+
exports.NewAddressScreen = NewAddressPage;
|
|
10878
11433
|
exports.OrderCard = OrderCard;
|
|
10879
11434
|
exports.OrderCardSkeleton = OrderCardSkeleton;
|
|
10880
11435
|
exports.OrdersScreen = OrdersScreen;
|
|
@@ -10883,10 +11438,12 @@ exports.ProductCardSkeleton = ProductCardSkeleton;
|
|
|
10883
11438
|
exports.ProductDetailScreen = ProductDetailScreen;
|
|
10884
11439
|
exports.ProfileScreen = ProfileScreen;
|
|
10885
11440
|
exports.RegisterScreen = RegisterScreen;
|
|
11441
|
+
exports.SearchResultsScreen = SearchPage;
|
|
10886
11442
|
exports.ShopScreen = ShopScreen;
|
|
10887
11443
|
exports.Skeleton = Skeleton;
|
|
10888
11444
|
exports.ThemeProvider = ThemeProvider;
|
|
10889
11445
|
exports.WishlistProvider = WishlistProvider;
|
|
11446
|
+
exports.WishlistScreen = WishlistScreen;
|
|
10890
11447
|
exports.formatDate = formatDate;
|
|
10891
11448
|
exports.formatPrice = formatPrice;
|
|
10892
11449
|
exports.generateColorShades = generateColorShades;
|