hey-pharmacist-ecommerce 1.1.13 → 1.1.14
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 +2 -4
- package/dist/index.d.ts +2 -4
- package/dist/index.js +1039 -857
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1039 -856
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/components/AccountAddressesTab.tsx +209 -0
- package/src/components/AccountOrdersTab.tsx +151 -0
- package/src/components/AccountOverviewTab.tsx +209 -0
- package/src/components/AccountPaymentTab.tsx +116 -0
- package/src/components/AccountSavedItemsTab.tsx +76 -0
- package/src/components/AccountSettingsTab.tsx +116 -0
- package/src/components/AddressFormModal.tsx +23 -10
- package/src/components/CartItem.tsx +60 -56
- package/src/components/Header.tsx +69 -16
- package/src/components/Notification.tsx +148 -0
- package/src/components/ProductCard.tsx +215 -178
- package/src/components/QuickViewModal.tsx +314 -0
- package/src/components/TabNavigation.tsx +48 -0
- package/src/components/ui/Button.tsx +1 -1
- package/src/components/ui/ConfirmModal.tsx +84 -0
- package/src/hooks/usePaymentMethods.ts +58 -0
- package/src/index.ts +0 -1
- package/src/providers/CartProvider.tsx +22 -6
- package/src/providers/EcommerceProvider.tsx +8 -7
- package/src/providers/FavoritesProvider.tsx +10 -3
- package/src/providers/NotificationProvider.tsx +79 -0
- package/src/providers/WishlistProvider.tsx +34 -9
- package/src/screens/AddressesScreen.tsx +72 -61
- package/src/screens/CartScreen.tsx +48 -32
- package/src/screens/ChangePasswordScreen.tsx +155 -0
- package/src/screens/CheckoutScreen.tsx +162 -125
- package/src/screens/EditProfileScreen.tsx +165 -0
- package/src/screens/LoginScreen.tsx +59 -72
- package/src/screens/NewAddressScreen.tsx +16 -10
- package/src/screens/ProductDetailScreen.tsx +334 -234
- package/src/screens/ProfileScreen.tsx +190 -200
- package/src/screens/RegisterScreen.tsx +51 -70
- package/src/screens/SearchResultsScreen.tsx +2 -1
- package/src/screens/ShopScreen.tsx +260 -384
- package/src/screens/WishlistScreen.tsx +226 -224
- package/src/styles/globals.css +9 -0
- package/src/screens/CategoriesScreen.tsx +0 -122
- package/src/screens/HomeScreen.tsx +0 -211
package/dist/index.js
CHANGED
|
@@ -3,14 +3,13 @@
|
|
|
3
3
|
|
|
4
4
|
var React21 = require('react');
|
|
5
5
|
var globalAxios4 = require('axios');
|
|
6
|
-
var sonner = require('sonner');
|
|
7
|
-
var reactQuery = require('@tanstack/react-query');
|
|
8
6
|
var framerMotion = require('framer-motion');
|
|
9
7
|
var lucideReact = require('lucide-react');
|
|
10
|
-
var
|
|
8
|
+
var reactQuery = require('@tanstack/react-query');
|
|
11
9
|
var navigation = require('next/navigation');
|
|
10
|
+
var Image4 = require('next/image');
|
|
12
11
|
var dynamic = require('next/dynamic');
|
|
13
|
-
var
|
|
12
|
+
var Link7 = require('next/link');
|
|
14
13
|
var reactHookForm = require('react-hook-form');
|
|
15
14
|
var zod$1 = require('@hookform/resolvers/zod');
|
|
16
15
|
var zod = require('zod');
|
|
@@ -19,9 +18,9 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
19
18
|
|
|
20
19
|
var React21__default = /*#__PURE__*/_interopDefault(React21);
|
|
21
20
|
var globalAxios4__default = /*#__PURE__*/_interopDefault(globalAxios4);
|
|
22
|
-
var
|
|
21
|
+
var Image4__default = /*#__PURE__*/_interopDefault(Image4);
|
|
23
22
|
var dynamic__default = /*#__PURE__*/_interopDefault(dynamic);
|
|
24
|
-
var
|
|
23
|
+
var Link7__default = /*#__PURE__*/_interopDefault(Link7);
|
|
25
24
|
|
|
26
25
|
var __defProp = Object.defineProperty;
|
|
27
26
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -6767,6 +6766,144 @@ var PaymentPaymentStatusEnum = /* @__PURE__ */ ((PaymentPaymentStatusEnum2) => {
|
|
|
6767
6766
|
|
|
6768
6767
|
// src/lib/api-adapter/index.ts
|
|
6769
6768
|
init_config();
|
|
6769
|
+
var notificationConfig = {
|
|
6770
|
+
success: {
|
|
6771
|
+
icon: lucideReact.CheckCircle2,
|
|
6772
|
+
gradient: "from-emerald-500 to-green-600",
|
|
6773
|
+
iconColor: "text-emerald-600",
|
|
6774
|
+
bgColor: "bg-emerald-50",
|
|
6775
|
+
borderColor: "border-emerald-200"
|
|
6776
|
+
},
|
|
6777
|
+
error: {
|
|
6778
|
+
icon: lucideReact.XCircle,
|
|
6779
|
+
gradient: "from-red-500 to-rose-600",
|
|
6780
|
+
iconColor: "text-red-600",
|
|
6781
|
+
bgColor: "bg-red-50",
|
|
6782
|
+
borderColor: "border-red-200"
|
|
6783
|
+
},
|
|
6784
|
+
warning: {
|
|
6785
|
+
icon: lucideReact.AlertCircle,
|
|
6786
|
+
gradient: "from-orange-500 to-amber-600",
|
|
6787
|
+
iconColor: "text-orange-600",
|
|
6788
|
+
bgColor: "bg-orange-50",
|
|
6789
|
+
borderColor: "border-orange-200"
|
|
6790
|
+
},
|
|
6791
|
+
info: {
|
|
6792
|
+
icon: lucideReact.Info,
|
|
6793
|
+
gradient: "from-blue-500 to-indigo-600",
|
|
6794
|
+
iconColor: "text-blue-600",
|
|
6795
|
+
bgColor: "bg-blue-50",
|
|
6796
|
+
borderColor: "border-blue-200"
|
|
6797
|
+
}
|
|
6798
|
+
};
|
|
6799
|
+
function Notification({ notification, onDismiss }) {
|
|
6800
|
+
const [progress, setProgress] = React21.useState(100);
|
|
6801
|
+
const config = notificationConfig[notification.type];
|
|
6802
|
+
const Icon = config.icon;
|
|
6803
|
+
const duration = notification.duration || 4e3;
|
|
6804
|
+
React21.useEffect(() => {
|
|
6805
|
+
const startTime = Date.now();
|
|
6806
|
+
const timer = setInterval(() => {
|
|
6807
|
+
const elapsed = Date.now() - startTime;
|
|
6808
|
+
const remaining = Math.max(0, 100 - elapsed / duration * 100);
|
|
6809
|
+
setProgress(remaining);
|
|
6810
|
+
if (remaining === 0) {
|
|
6811
|
+
clearInterval(timer);
|
|
6812
|
+
onDismiss(notification.id);
|
|
6813
|
+
}
|
|
6814
|
+
}, 16);
|
|
6815
|
+
return () => clearInterval(timer);
|
|
6816
|
+
}, [notification.id, duration, onDismiss]);
|
|
6817
|
+
return /* @__PURE__ */ React21__default.default.createElement(
|
|
6818
|
+
framerMotion.motion.div,
|
|
6819
|
+
{
|
|
6820
|
+
initial: { opacity: 0, y: -20, scale: 0.95 },
|
|
6821
|
+
animate: { opacity: 1, y: 0, scale: 1 },
|
|
6822
|
+
exit: { opacity: 0, x: 100, scale: 0.95 },
|
|
6823
|
+
transition: { type: "spring", stiffness: 500, damping: 30 },
|
|
6824
|
+
className: `relative bg-white rounded-2xl border-2 ${config.borderColor} shadow-xl overflow-hidden min-w-[320px] max-w-[420px]`
|
|
6825
|
+
},
|
|
6826
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: `h-1 bg-gradient-to-r ${config.gradient}` }),
|
|
6827
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "p-4 flex items-start gap-3" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
6828
|
+
framerMotion.motion.div,
|
|
6829
|
+
{
|
|
6830
|
+
initial: { scale: 0, rotate: -180 },
|
|
6831
|
+
animate: { scale: 1, rotate: 0 },
|
|
6832
|
+
transition: { delay: 0.1, type: "spring", stiffness: 500 },
|
|
6833
|
+
className: `size-10 rounded-full ${config.bgColor} flex items-center justify-center shrink-0`
|
|
6834
|
+
},
|
|
6835
|
+
/* @__PURE__ */ React21__default.default.createElement(Icon, { className: `size-5 ${config.iconColor}` })
|
|
6836
|
+
), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] font-semibold text-[14px] text-[#2B4B7C] mb-1" }, notification.message), notification.description && /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[12px] text-[#676c80] leading-relaxed" }, notification.description)), /* @__PURE__ */ React21__default.default.createElement(
|
|
6837
|
+
"button",
|
|
6838
|
+
{
|
|
6839
|
+
onClick: () => onDismiss(notification.id),
|
|
6840
|
+
className: "p-1.5 hover:bg-gray-100 rounded-full transition-colors shrink-0",
|
|
6841
|
+
"aria-label": "Dismiss notification"
|
|
6842
|
+
},
|
|
6843
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.X, { className: "size-4 text-[#676c80]" })
|
|
6844
|
+
)),
|
|
6845
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "h-1 bg-gray-100" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
6846
|
+
framerMotion.motion.div,
|
|
6847
|
+
{
|
|
6848
|
+
className: `h-full bg-gradient-to-r ${config.gradient}`,
|
|
6849
|
+
style: { width: `${progress}%` },
|
|
6850
|
+
transition: { duration: 0.016, ease: "linear" }
|
|
6851
|
+
}
|
|
6852
|
+
))
|
|
6853
|
+
);
|
|
6854
|
+
}
|
|
6855
|
+
function NotificationContainer({ notifications, onDismiss }) {
|
|
6856
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "fixed top-4 right-4 z-[9999] flex flex-col gap-3 pointer-events-none" }, /* @__PURE__ */ React21__default.default.createElement(framerMotion.AnimatePresence, { mode: "popLayout" }, notifications.map((notification) => /* @__PURE__ */ React21__default.default.createElement("div", { key: notification.id, className: "pointer-events-auto" }, /* @__PURE__ */ React21__default.default.createElement(Notification, { notification, onDismiss })))));
|
|
6857
|
+
}
|
|
6858
|
+
|
|
6859
|
+
// src/providers/NotificationProvider.tsx
|
|
6860
|
+
var NotificationContext = React21.createContext(void 0);
|
|
6861
|
+
function useNotification() {
|
|
6862
|
+
const context = React21.useContext(NotificationContext);
|
|
6863
|
+
if (!context) {
|
|
6864
|
+
throw new Error("useNotification must be used within NotificationProvider");
|
|
6865
|
+
}
|
|
6866
|
+
return context;
|
|
6867
|
+
}
|
|
6868
|
+
function NotificationProvider({ children }) {
|
|
6869
|
+
const [notifications, setNotifications] = React21.useState([]);
|
|
6870
|
+
const addNotification = React21.useCallback(
|
|
6871
|
+
(type, message, description, duration) => {
|
|
6872
|
+
const id = Math.random().toString(36).substring(2, 9);
|
|
6873
|
+
const notification = {
|
|
6874
|
+
id,
|
|
6875
|
+
type,
|
|
6876
|
+
message,
|
|
6877
|
+
description,
|
|
6878
|
+
duration: duration || 4e3
|
|
6879
|
+
};
|
|
6880
|
+
setNotifications((prev) => [...prev, notification]);
|
|
6881
|
+
},
|
|
6882
|
+
[]
|
|
6883
|
+
);
|
|
6884
|
+
const dismissNotification = React21.useCallback((id) => {
|
|
6885
|
+
setNotifications((prev) => prev.filter((n) => n.id !== id));
|
|
6886
|
+
}, []);
|
|
6887
|
+
const value = {
|
|
6888
|
+
success: React21.useCallback(
|
|
6889
|
+
(message, description, duration) => addNotification("success", message, description, duration),
|
|
6890
|
+
[addNotification]
|
|
6891
|
+
),
|
|
6892
|
+
error: React21.useCallback(
|
|
6893
|
+
(message, description, duration) => addNotification("error", message, description, duration),
|
|
6894
|
+
[addNotification]
|
|
6895
|
+
),
|
|
6896
|
+
warning: React21.useCallback(
|
|
6897
|
+
(message, description, duration) => addNotification("warning", message, description, duration),
|
|
6898
|
+
[addNotification]
|
|
6899
|
+
),
|
|
6900
|
+
info: React21.useCallback(
|
|
6901
|
+
(message, description, duration) => addNotification("info", message, description, duration),
|
|
6902
|
+
[addNotification]
|
|
6903
|
+
)
|
|
6904
|
+
};
|
|
6905
|
+
return /* @__PURE__ */ React21__default.default.createElement(NotificationContext.Provider, { value }, children, /* @__PURE__ */ React21__default.default.createElement(NotificationContainer, { notifications, onDismiss: dismissNotification }));
|
|
6906
|
+
}
|
|
6770
6907
|
|
|
6771
6908
|
// src/providers/CartProvider.tsx
|
|
6772
6909
|
var CartContext = React21.createContext(void 0);
|
|
@@ -6781,6 +6918,7 @@ function CartProvider({ children }) {
|
|
|
6781
6918
|
const [cart, setCart] = React21.useState(null);
|
|
6782
6919
|
const [isLoading, setIsLoading] = React21.useState(false);
|
|
6783
6920
|
const { isAuthenticated } = useAuth();
|
|
6921
|
+
const notification = useNotification();
|
|
6784
6922
|
const refreshCart = React21.useCallback(async () => {
|
|
6785
6923
|
if (!isAuthenticated) {
|
|
6786
6924
|
setCart(null);
|
|
@@ -6818,9 +6956,15 @@ function CartProvider({ children }) {
|
|
|
6818
6956
|
}
|
|
6819
6957
|
const response = await new CartApi(getApiConfiguration()).handleUserCart({ items });
|
|
6820
6958
|
setCart(response.data);
|
|
6821
|
-
|
|
6959
|
+
notification.success(
|
|
6960
|
+
"Added to cart",
|
|
6961
|
+
"The item was added to your cart."
|
|
6962
|
+
);
|
|
6822
6963
|
} catch (error) {
|
|
6823
|
-
|
|
6964
|
+
notification.error(
|
|
6965
|
+
"Could not add to cart",
|
|
6966
|
+
error.response?.data?.message || "Something went wrong while adding this item to your cart."
|
|
6967
|
+
);
|
|
6824
6968
|
throw error;
|
|
6825
6969
|
} finally {
|
|
6826
6970
|
setIsLoading(false);
|
|
@@ -6842,7 +6986,10 @@ function CartProvider({ children }) {
|
|
|
6842
6986
|
const response = await new CartApi(getApiConfiguration()).handleUserCart({ items });
|
|
6843
6987
|
setCart(response.data);
|
|
6844
6988
|
} catch (error) {
|
|
6845
|
-
|
|
6989
|
+
notification.error(
|
|
6990
|
+
"Could not update cart",
|
|
6991
|
+
error.response?.data?.message || "There was a problem updating the item quantity. Please try again."
|
|
6992
|
+
);
|
|
6846
6993
|
throw error;
|
|
6847
6994
|
} finally {
|
|
6848
6995
|
setIsLoading(false);
|
|
@@ -6856,7 +7003,10 @@ function CartProvider({ children }) {
|
|
|
6856
7003
|
const response = await new CartApi(getApiConfiguration()).handleUserCart({ items });
|
|
6857
7004
|
setCart(response.data);
|
|
6858
7005
|
} catch (error) {
|
|
6859
|
-
|
|
7006
|
+
notification.error(
|
|
7007
|
+
"Could not remove item",
|
|
7008
|
+
error.response?.data?.message || "There was a problem removing this item from your cart."
|
|
7009
|
+
);
|
|
6860
7010
|
throw error;
|
|
6861
7011
|
} finally {
|
|
6862
7012
|
setIsLoading(false);
|
|
@@ -6868,7 +7018,10 @@ function CartProvider({ children }) {
|
|
|
6868
7018
|
const response = await new CartApi(getApiConfiguration()).clearCart();
|
|
6869
7019
|
setCart(null);
|
|
6870
7020
|
} catch (error) {
|
|
6871
|
-
|
|
7021
|
+
notification.error(
|
|
7022
|
+
"Could not clear cart",
|
|
7023
|
+
error.response?.data?.message || "We could not clear your cart. Please try again."
|
|
7024
|
+
);
|
|
6872
7025
|
throw error;
|
|
6873
7026
|
} finally {
|
|
6874
7027
|
setIsLoading(false);
|
|
@@ -6934,6 +7087,7 @@ function WishlistProvider({ children }) {
|
|
|
6934
7087
|
products: []
|
|
6935
7088
|
});
|
|
6936
7089
|
const { isAuthenticated } = useAuth() || {};
|
|
7090
|
+
const notification = useNotification();
|
|
6937
7091
|
const wishlistApi = React21.useMemo(() => new WishlistApi(AXIOS_CONFIG), []);
|
|
6938
7092
|
const fetchWishlist = React21.useCallback(async () => {
|
|
6939
7093
|
if (!isAuthenticated) {
|
|
@@ -6969,20 +7123,32 @@ function WishlistProvider({ children }) {
|
|
|
6969
7123
|
}, [fetchWishlist]);
|
|
6970
7124
|
const addToWishlist = async (product) => {
|
|
6971
7125
|
if (!isAuthenticated) {
|
|
6972
|
-
|
|
7126
|
+
notification.error(
|
|
7127
|
+
"Sign-in required",
|
|
7128
|
+
"Please sign in to add items to your wishlist."
|
|
7129
|
+
);
|
|
6973
7130
|
return;
|
|
6974
7131
|
}
|
|
6975
7132
|
try {
|
|
6976
7133
|
if (isInWishlist(product?._id || "")) {
|
|
6977
|
-
|
|
7134
|
+
notification.info(
|
|
7135
|
+
"Already saved",
|
|
7136
|
+
"This item is already in your wishlist."
|
|
7137
|
+
);
|
|
6978
7138
|
return;
|
|
6979
7139
|
}
|
|
6980
7140
|
await wishlistApi.addToWishlist(product?._id || "");
|
|
6981
7141
|
await fetchWishlist();
|
|
6982
|
-
|
|
7142
|
+
notification.success(
|
|
7143
|
+
"Added to wishlist",
|
|
7144
|
+
`${product?.name || "Item"} was added to your wishlist.`
|
|
7145
|
+
);
|
|
6983
7146
|
} catch (error) {
|
|
6984
7147
|
console.error("Error adding to wishlist:", error);
|
|
6985
|
-
|
|
7148
|
+
notification.error(
|
|
7149
|
+
"Could not add to wishlist",
|
|
7150
|
+
"Something went wrong while adding this item. Please try again."
|
|
7151
|
+
);
|
|
6986
7152
|
throw error;
|
|
6987
7153
|
}
|
|
6988
7154
|
};
|
|
@@ -6996,10 +7162,16 @@ function WishlistProvider({ children }) {
|
|
|
6996
7162
|
products: newProducts
|
|
6997
7163
|
};
|
|
6998
7164
|
});
|
|
6999
|
-
|
|
7165
|
+
notification.success(
|
|
7166
|
+
"Removed from wishlist",
|
|
7167
|
+
"The item has been removed from your wishlist."
|
|
7168
|
+
);
|
|
7000
7169
|
} catch (error) {
|
|
7001
7170
|
console.error("Error removing from wishlist:", error);
|
|
7002
|
-
|
|
7171
|
+
notification.error(
|
|
7172
|
+
"Could not remove item",
|
|
7173
|
+
"Something went wrong while removing this item. Please try again."
|
|
7174
|
+
);
|
|
7003
7175
|
throw error;
|
|
7004
7176
|
}
|
|
7005
7177
|
};
|
|
@@ -7010,10 +7182,16 @@ function WishlistProvider({ children }) {
|
|
|
7010
7182
|
...prev,
|
|
7011
7183
|
products: []
|
|
7012
7184
|
}));
|
|
7013
|
-
|
|
7185
|
+
notification.success(
|
|
7186
|
+
"Wishlist cleared",
|
|
7187
|
+
"All items have been removed from your wishlist."
|
|
7188
|
+
);
|
|
7014
7189
|
} catch (error) {
|
|
7015
7190
|
console.error("Error clearing wishlist:", error);
|
|
7016
|
-
|
|
7191
|
+
notification.error(
|
|
7192
|
+
"Could not clear wishlist",
|
|
7193
|
+
"We could not clear your wishlist. Please try again."
|
|
7194
|
+
);
|
|
7017
7195
|
throw error;
|
|
7018
7196
|
}
|
|
7019
7197
|
};
|
|
@@ -7073,7 +7251,7 @@ function EcommerceProvider({ config, children, withToaster = true, basePath = ""
|
|
|
7073
7251
|
const [client] = React21__default.default.useState(
|
|
7074
7252
|
new reactQuery.QueryClient({ defaultOptions: { queries: { staleTime: 5e3 } } })
|
|
7075
7253
|
);
|
|
7076
|
-
return /* @__PURE__ */ React21__default.default.createElement(reactQuery.QueryClientProvider, { client }, /* @__PURE__ */ React21__default.default.createElement(ThemeProvider, { config }, /* @__PURE__ */ React21__default.default.createElement(BasePathProvider, { basePath }, /* @__PURE__ */ React21__default.default.createElement(AuthProvider, null, /* @__PURE__ */ React21__default.default.createElement(
|
|
7254
|
+
return /* @__PURE__ */ React21__default.default.createElement(reactQuery.QueryClientProvider, { client }, /* @__PURE__ */ React21__default.default.createElement(ThemeProvider, { config }, /* @__PURE__ */ React21__default.default.createElement(BasePathProvider, { basePath }, /* @__PURE__ */ React21__default.default.createElement(AuthProvider, null, /* @__PURE__ */ React21__default.default.createElement(NotificationProvider, null, /* @__PURE__ */ React21__default.default.createElement(CartProvider, null, /* @__PURE__ */ React21__default.default.createElement(WishlistProvider, null, children)))))));
|
|
7077
7255
|
}
|
|
7078
7256
|
|
|
7079
7257
|
// src/lib/utils/format.ts
|
|
@@ -7107,6 +7285,158 @@ function truncate(text, maxLength) {
|
|
|
7107
7285
|
function getInitials(firstName, lastName) {
|
|
7108
7286
|
return `${firstName?.charAt(0)}${lastName?.charAt(0)}`.toUpperCase();
|
|
7109
7287
|
}
|
|
7288
|
+
function QuickViewModal({ product, onClose, onNavigateToProduct }) {
|
|
7289
|
+
const [selectedVariantIndex, setSelectedVariantIndex] = React21.useState(0);
|
|
7290
|
+
const [selectedSizeIndex, setSelectedSizeIndex] = React21.useState(0);
|
|
7291
|
+
const [selectedImageIndex, setSelectedImageIndex] = React21.useState(0);
|
|
7292
|
+
const [addedToCart, setAddedToCart] = React21.useState(false);
|
|
7293
|
+
const [quantity, setQuantity] = React21.useState(1);
|
|
7294
|
+
const { addToCart } = useCart();
|
|
7295
|
+
const [isAddingToCart, setIsAddingToCart] = React21.useState(false);
|
|
7296
|
+
const notification = useNotification();
|
|
7297
|
+
const handleQuantityChange = (newQuantity) => {
|
|
7298
|
+
if (newQuantity >= 1 && newQuantity <= (selectedVariant.inventoryCount || 10)) {
|
|
7299
|
+
setQuantity(newQuantity);
|
|
7300
|
+
}
|
|
7301
|
+
};
|
|
7302
|
+
const selectedVariant = product.productVariants[selectedVariantIndex];
|
|
7303
|
+
selectedVariant.productMedia[selectedSizeIndex];
|
|
7304
|
+
const displayPrice = product.finalPrice;
|
|
7305
|
+
const handleAddToCart = async () => {
|
|
7306
|
+
if (!product || !selectedVariant) return;
|
|
7307
|
+
setIsAddingToCart(true);
|
|
7308
|
+
try {
|
|
7309
|
+
console.log(selectedVariant);
|
|
7310
|
+
await addToCart(
|
|
7311
|
+
product.id,
|
|
7312
|
+
quantity,
|
|
7313
|
+
selectedVariant._id
|
|
7314
|
+
);
|
|
7315
|
+
notification.success(
|
|
7316
|
+
"Added to cart",
|
|
7317
|
+
`${quantity} \xD7 ${product.name}${selectedVariant.name ? ` (${selectedVariant.name})` : ""} added to your cart.`
|
|
7318
|
+
);
|
|
7319
|
+
} catch (error) {
|
|
7320
|
+
console.error("Failed to add to cart", error);
|
|
7321
|
+
notification.error(
|
|
7322
|
+
"Could not add to cart",
|
|
7323
|
+
"Something went wrong while adding this item. Please try again."
|
|
7324
|
+
);
|
|
7325
|
+
} finally {
|
|
7326
|
+
setIsAddingToCart(false);
|
|
7327
|
+
}
|
|
7328
|
+
};
|
|
7329
|
+
return /* @__PURE__ */ React.createElement(
|
|
7330
|
+
"div",
|
|
7331
|
+
{
|
|
7332
|
+
className: "fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm",
|
|
7333
|
+
onClick: onClose
|
|
7334
|
+
},
|
|
7335
|
+
/* @__PURE__ */ React.createElement(
|
|
7336
|
+
"div",
|
|
7337
|
+
{
|
|
7338
|
+
className: "bg-white rounded-[32px] max-w-5xl w-full max-h-[90vh] overflow-y-auto",
|
|
7339
|
+
onClick: (e) => e.stopPropagation()
|
|
7340
|
+
},
|
|
7341
|
+
/* @__PURE__ */ React.createElement("div", { className: "p-8" }, /* @__PURE__ */ React.createElement("div", { className: "flex items-start justify-between mb-6" }, /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("p", { className: "font-['Poppins',sans-serif] text-[11px] text-primary uppercase tracking-wide font-medium mb-2" }, product.brand, " \u2022 ", product.parentCategories[0].name), /* @__PURE__ */ React.createElement("h2", { className: "font-['Poppins',sans-serif] font-semibold text-secondary tracking-[-1px]" }, product.name), /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-2 mt-2" }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-0.5" }, [...Array(5)].map((_, i) => /* @__PURE__ */ React.createElement(
|
|
7342
|
+
lucideReact.Star,
|
|
7343
|
+
{
|
|
7344
|
+
key: i,
|
|
7345
|
+
className: `size-4 ${i < Math.floor(product.rating ? product.rating : 0) ? "text-accent fill-accent" : "text-gray-300"}`
|
|
7346
|
+
}
|
|
7347
|
+
))), /* @__PURE__ */ React.createElement("span", { className: "font-['Poppins',sans-serif] text-[13px] text-muted" }, product.rating, " (", product.reviews ? product.reviews.length : 0, " reviews)"))), /* @__PURE__ */ React.createElement(
|
|
7348
|
+
"button",
|
|
7349
|
+
{
|
|
7350
|
+
onClick: onClose,
|
|
7351
|
+
className: "p-2 hover:bg-gray-100 rounded-full transition-colors"
|
|
7352
|
+
},
|
|
7353
|
+
/* @__PURE__ */ React.createElement(lucideReact.X, { className: "size-6 text-muted" })
|
|
7354
|
+
)), /* @__PURE__ */ React.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-8" }, /* @__PURE__ */ React.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React.createElement("div", { className: "relative aspect-[3/4] rounded-[24px] overflow-hidden bg-gray-50" }, /* @__PURE__ */ React.createElement(
|
|
7355
|
+
"img",
|
|
7356
|
+
{
|
|
7357
|
+
src: selectedVariant.productMedia[selectedImageIndex]?.file || selectedVariant.productMedia[0]?.file,
|
|
7358
|
+
alt: product.name,
|
|
7359
|
+
className: "w-full h-full object-cover"
|
|
7360
|
+
}
|
|
7361
|
+
), /* @__PURE__ */ React.createElement("div", { className: "absolute top-4 left-4 flex flex-col gap-2" }, product.finalPrice && /* @__PURE__ */ React.createElement("div", { className: "bg-accent text-white rounded-full px-3 py-1.5" }, /* @__PURE__ */ React.createElement("span", { className: "font-['Poppins',sans-serif] font-bold text-[11px] uppercase" }, "-", product.discountAmount, "%")))), selectedVariant.productMedia.length > 1 && /* @__PURE__ */ React.createElement("div", { className: "grid grid-cols-4 gap-3" }, selectedVariant.productMedia.map((image, index) => /* @__PURE__ */ React.createElement(
|
|
7362
|
+
"div",
|
|
7363
|
+
{
|
|
7364
|
+
key: index,
|
|
7365
|
+
className: `aspect-square rounded-xl overflow-hidden cursor-pointer transition-opacity ${selectedImageIndex === index ? "ring-2 ring-primary" : "bg-gray-50 hover:opacity-75"}`,
|
|
7366
|
+
onClick: () => setSelectedImageIndex(index)
|
|
7367
|
+
},
|
|
7368
|
+
/* @__PURE__ */ React.createElement(
|
|
7369
|
+
"img",
|
|
7370
|
+
{
|
|
7371
|
+
src: image.file,
|
|
7372
|
+
alt: `${product.name} ${index + 1}`,
|
|
7373
|
+
className: "w-full h-full object-cover"
|
|
7374
|
+
}
|
|
7375
|
+
)
|
|
7376
|
+
)))), /* @__PURE__ */ React.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-3 mb-4" }, /* @__PURE__ */ React.createElement("span", { className: "font-['Poppins',sans-serif] font-bold text-[32px] text-accent" }, "$", displayPrice.toFixed(2)), product.isDiscounted && /* @__PURE__ */ React.createElement("span", { className: "font-['Poppins',sans-serif] text-[20px] text-muted line-through" }, "$", product.finalPrice.toFixed(2))), /* @__PURE__ */ React.createElement("div", { className: "mb-6" }, selectedVariant.inventoryCount === 0 ? /* @__PURE__ */ React.createElement("span", { className: "font-['Poppins',sans-serif] text-[12px] text-red-500 font-medium" }, "Out of Stock") : selectedVariant.inventoryCount <= 10 ? /* @__PURE__ */ React.createElement("span", { className: "font-['Poppins',sans-serif] text-[12px] text-orange-500 font-medium flex items-center gap-1" }, /* @__PURE__ */ React.createElement(lucideReact.Package, { className: "size-3" }), "Only ", selectedVariant.inventoryCount, " left in stock") : /* @__PURE__ */ React.createElement("span", { className: "font-['Poppins',sans-serif] text-[12px] text-green-600 font-medium flex items-center gap-1" }, /* @__PURE__ */ React.createElement(lucideReact.Package, { className: "size-3" }), "In Stock")), /* @__PURE__ */ React.createElement("p", { className: "font-['Poppins',sans-serif] text-[14px] text-muted leading-[1.7] mb-6" }, /* @__PURE__ */ React.createElement("div", { dangerouslySetInnerHTML: { __html: product.description } })), /* @__PURE__ */ React.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React.createElement("h3", { className: "font-['Poppins',sans-serif] font-semibold text-[13px] text-secondary mb-3" }, "Selected Variant: ", /* @__PURE__ */ React.createElement("span", { className: "font-normal text-muted" }, product.productVariants[selectedVariantIndex].name)), /* @__PURE__ */ React.createElement("div", { className: "flex flex-wrap gap-3" }, product.productVariants.map((variant, index) => /* @__PURE__ */ React.createElement(
|
|
7377
|
+
"button",
|
|
7378
|
+
{
|
|
7379
|
+
key: variant.id,
|
|
7380
|
+
onClick: () => {
|
|
7381
|
+
setSelectedVariantIndex(index);
|
|
7382
|
+
setSelectedSizeIndex(0);
|
|
7383
|
+
setSelectedImageIndex(0);
|
|
7384
|
+
},
|
|
7385
|
+
className: `size-10 rounded-full border-2 transition-all ${selectedVariantIndex === index ? "border-primary scale-110" : "border-gray-200 hover:border-primary/50"}`,
|
|
7386
|
+
style: { backgroundColor: variant.colorHex },
|
|
7387
|
+
title: variant.color
|
|
7388
|
+
},
|
|
7389
|
+
/* @__PURE__ */ React.createElement(
|
|
7390
|
+
Image4__default.default,
|
|
7391
|
+
{
|
|
7392
|
+
src: variant.productMedia?.[0]?.file || "",
|
|
7393
|
+
alt: variant.color || `Variant ${index + 1}`,
|
|
7394
|
+
className: "object-cover",
|
|
7395
|
+
height: 32,
|
|
7396
|
+
width: 32
|
|
7397
|
+
}
|
|
7398
|
+
)
|
|
7399
|
+
)))), /* @__PURE__ */ React.createElement("div", { className: "mb-6 p-4 bg-gray-50 rounded-xl" }, /* @__PURE__ */ React.createElement("ul", { className: "space-y-2" }, product.tags.slice(0, 3).map((feature, index) => /* @__PURE__ */ React.createElement("li", { key: index, className: "flex items-start gap-2" }, /* @__PURE__ */ React.createElement(lucideReact.Check, { className: "size-4 text-primary shrink-0 mt-0.5" }), /* @__PURE__ */ React.createElement("span", { className: "font-['Poppins',sans-serif] text-[12px] text-muted" }, feature))))), /* @__PURE__ */ React.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React.createElement("h3", { className: "font-['Poppins',sans-serif] font-semibold text-[13px] text-secondary mb-3" }, "Quantity"), /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ React.createElement(
|
|
7400
|
+
"button",
|
|
7401
|
+
{
|
|
7402
|
+
onClick: () => handleQuantityChange(quantity - 1),
|
|
7403
|
+
disabled: quantity <= 1,
|
|
7404
|
+
className: "p-2 rounded-full border border-gray-200 hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed"
|
|
7405
|
+
},
|
|
7406
|
+
/* @__PURE__ */ React.createElement(lucideReact.Minus, { className: "size-4 text-secondary" })
|
|
7407
|
+
), /* @__PURE__ */ React.createElement("span", { className: "w-8 text-center font-medium" }, quantity), /* @__PURE__ */ React.createElement(
|
|
7408
|
+
"button",
|
|
7409
|
+
{
|
|
7410
|
+
onClick: () => handleQuantityChange(quantity + 1),
|
|
7411
|
+
disabled: quantity >= (selectedVariant.inventoryCount || 10),
|
|
7412
|
+
className: "p-2 rounded-full border border-gray-200 hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed"
|
|
7413
|
+
},
|
|
7414
|
+
/* @__PURE__ */ React.createElement(lucideReact.Plus, { className: "size-4 text-secondary" })
|
|
7415
|
+
))), /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-3 mt-auto" }, /* @__PURE__ */ React.createElement(
|
|
7416
|
+
"button",
|
|
7417
|
+
{
|
|
7418
|
+
onClick: handleAddToCart,
|
|
7419
|
+
disabled: addedToCart || selectedVariant.inventoryCount === 0,
|
|
7420
|
+
className: `w-full font-['Poppins',sans-serif] font-medium text-[14px] px-6 py-4 rounded-full transition-all duration-300 flex items-center justify-center gap-3 ${addedToCart ? "bg-green-500 text-white" : "bg-accent text-white hover:bg-[#d66f45] hover:shadow-lg disabled:opacity-50 disabled:cursor-not-allowed"}`
|
|
7421
|
+
},
|
|
7422
|
+
isAddingToCart ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("svg", { className: "animate-spin h-5 w-5", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ React.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })), "Loading...") : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(lucideReact.ShoppingCart, { className: "h-4 w-4" }), !selectedVariant ? "Select a variant" : selectedVariant.inventoryStatus === "OUT_OF_STOCK" /* OUTOFSTOCK */ ? "Out of Stock" : "Add to Cart")
|
|
7423
|
+
), /* @__PURE__ */ React.createElement(
|
|
7424
|
+
"button",
|
|
7425
|
+
{
|
|
7426
|
+
onClick: () => {
|
|
7427
|
+
onClose();
|
|
7428
|
+
onNavigateToProduct?.(product.id);
|
|
7429
|
+
},
|
|
7430
|
+
className: "w-full font-['Poppins',sans-serif] font-medium text-[13px] px-6 py-3 rounded-full bg-white text-secondary border-2 border-primary hover:bg-gray-50 transition-all flex items-center justify-center gap-2"
|
|
7431
|
+
},
|
|
7432
|
+
"View Full Details",
|
|
7433
|
+
/* @__PURE__ */ React.createElement(lucideReact.ExternalLink, { className: "size-4" })
|
|
7434
|
+
)))))
|
|
7435
|
+
)
|
|
7436
|
+
);
|
|
7437
|
+
}
|
|
7438
|
+
|
|
7439
|
+
// src/components/ProductCard.tsx
|
|
7110
7440
|
function ProductCard({
|
|
7111
7441
|
product,
|
|
7112
7442
|
onClickProduct,
|
|
@@ -7115,7 +7445,7 @@ function ProductCard({
|
|
|
7115
7445
|
showFavoriteButton = true,
|
|
7116
7446
|
className
|
|
7117
7447
|
}) {
|
|
7118
|
-
|
|
7448
|
+
navigation.useRouter();
|
|
7119
7449
|
const { buildPath } = useBasePath();
|
|
7120
7450
|
const [isFavorite, setIsFavorite] = React21.useState(isFavorited);
|
|
7121
7451
|
const { addToWishlist, removeFromWishlist, isInWishlist } = useWishlist();
|
|
@@ -7124,6 +7454,8 @@ function ProductCard({
|
|
|
7124
7454
|
const [isImageLoaded, setIsImageLoaded] = React21.useState(false);
|
|
7125
7455
|
const [selectedVariantImage, setSelectedVariantImage] = React21.useState(null);
|
|
7126
7456
|
const [selectedVariantId, setSelectedVariantId] = React21.useState(null);
|
|
7457
|
+
const [showQuickView, setShowQuickView] = React21.useState(false);
|
|
7458
|
+
const notification = useNotification();
|
|
7127
7459
|
const handleImageLoad = React21.useCallback(() => {
|
|
7128
7460
|
setIsImageLoaded(true);
|
|
7129
7461
|
}, []);
|
|
@@ -7133,24 +7465,6 @@ function ProductCard({
|
|
|
7133
7465
|
onClickProduct(product);
|
|
7134
7466
|
}
|
|
7135
7467
|
}, [onClickProduct, product]);
|
|
7136
|
-
const handleFavorite = async (e) => {
|
|
7137
|
-
e.stopPropagation();
|
|
7138
|
-
try {
|
|
7139
|
-
if (isInWishlist(product?._id || "")) {
|
|
7140
|
-
await removeFromWishlist(product?._id || "");
|
|
7141
|
-
setIsFavorite(false);
|
|
7142
|
-
sonner.toast.success("Removed from wishlist");
|
|
7143
|
-
} else {
|
|
7144
|
-
await addToWishlist(product);
|
|
7145
|
-
setIsFavorite(true);
|
|
7146
|
-
sonner.toast.success("Added to wishlist");
|
|
7147
|
-
}
|
|
7148
|
-
onFavorite?.(product);
|
|
7149
|
-
} catch (error) {
|
|
7150
|
-
console.error("Error updating wishlist:", error);
|
|
7151
|
-
sonner.toast.error("Failed to update wishlist");
|
|
7152
|
-
}
|
|
7153
|
-
};
|
|
7154
7468
|
React21.useEffect(() => {
|
|
7155
7469
|
setIsFavorite(isInWishlist(product?._id || "") || isFavorited);
|
|
7156
7470
|
}, [isFavorited, isInWishlist, product?._id]);
|
|
@@ -7158,7 +7472,14 @@ function ProductCard({
|
|
|
7158
7472
|
setSelectedVariantImage(null);
|
|
7159
7473
|
setSelectedVariantId(null);
|
|
7160
7474
|
setIsImageLoaded(false);
|
|
7161
|
-
|
|
7475
|
+
if (product.productVariants && product.productVariants.length > 0) {
|
|
7476
|
+
const firstVariant = product.productVariants[0];
|
|
7477
|
+
if (firstVariant.productMedia && firstVariant.productMedia.length > 0) {
|
|
7478
|
+
setSelectedVariantImage(firstVariant.productMedia[0].file);
|
|
7479
|
+
setSelectedVariantId(firstVariant.id || firstVariant._id || null);
|
|
7480
|
+
}
|
|
7481
|
+
}
|
|
7482
|
+
}, [product._id, product.productVariants]);
|
|
7162
7483
|
const handleKeyDown = (e) => {
|
|
7163
7484
|
if (e.key === "Enter" || e.key === " ") {
|
|
7164
7485
|
e.preventDefault();
|
|
@@ -7195,10 +7516,10 @@ function ProductCard({
|
|
|
7195
7516
|
React21.useEffect(() => {
|
|
7196
7517
|
setIsImageLoaded(false);
|
|
7197
7518
|
}, [imageSource.src]);
|
|
7198
|
-
return /* @__PURE__ */ React21__default.default.createElement(
|
|
7199
|
-
framerMotion.motion.
|
|
7519
|
+
return /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement(
|
|
7520
|
+
framerMotion.motion.div,
|
|
7200
7521
|
{
|
|
7201
|
-
className: "
|
|
7522
|
+
className: "bg-white rounded-[16px] overflow-hidden border-2 border-gray-100 hover:border-[#5B9BD5] hover:shadow-lg transition-all duration-300 group h-full flex flex-col",
|
|
7202
7523
|
whileHover: { y: -4 },
|
|
7203
7524
|
onMouseEnter: () => setIsHovered(true),
|
|
7204
7525
|
onMouseLeave: () => setIsHovered(false),
|
|
@@ -7208,59 +7529,46 @@ function ProductCard({
|
|
|
7208
7529
|
onClick: handleCardClick,
|
|
7209
7530
|
onKeyDown: handleKeyDown
|
|
7210
7531
|
},
|
|
7211
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
7212
|
-
|
|
7213
|
-
{
|
|
7214
|
-
className: "absolute inset-0 bg-gray-200 animate-pulse",
|
|
7215
|
-
initial: { opacity: 1 },
|
|
7216
|
-
exit: { opacity: 0 },
|
|
7217
|
-
transition: { duration: 0.2 }
|
|
7218
|
-
}
|
|
7219
|
-
)), /* @__PURE__ */ React21__default.default.createElement(
|
|
7220
|
-
Image3__default.default,
|
|
7221
|
-
{
|
|
7222
|
-
src: imageSource.src,
|
|
7223
|
-
alt: imageSource.alt,
|
|
7224
|
-
fill: true,
|
|
7225
|
-
className: `h-full w-full object-cover object-center transition-opacity duration-300 ${product.inventoryCount === 0 ? "opacity-60" : ""} ${isImageLoaded ? "opacity-100" : "opacity-0"}`,
|
|
7226
|
-
sizes: "(max-width: 640px) 100vw, (max-width: 768px) 50vw, 33vw",
|
|
7227
|
-
priority: false,
|
|
7228
|
-
onLoad: handleImageLoad,
|
|
7229
|
-
onError: () => setIsImageLoaded(true),
|
|
7230
|
-
key: imageSource.src
|
|
7231
|
-
}
|
|
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(
|
|
7233
|
-
framerMotion.motion.span,
|
|
7234
|
-
{
|
|
7235
|
-
initial: { scale: 0.9, opacity: 0 },
|
|
7236
|
-
animate: { scale: 1, opacity: 1 },
|
|
7237
|
-
className: "inline-flex items-center justify-center px-2.5 py-1 rounded-full text-xs font-bold text-white bg-green-600 shadow-md"
|
|
7238
|
-
},
|
|
7239
|
-
"-",
|
|
7240
|
-
product.discountAmount,
|
|
7241
|
-
"%"
|
|
7242
|
-
), product.inventoryCount === 0 && /* @__PURE__ */ React21__default.default.createElement(
|
|
7243
|
-
framerMotion.motion.span,
|
|
7532
|
+
/* @__PURE__ */ React21__default.default.createElement(
|
|
7533
|
+
"div",
|
|
7244
7534
|
{
|
|
7245
|
-
|
|
7246
|
-
|
|
7247
|
-
className: "inline-flex items-center justify-center px-2.5 py-1 rounded-full text-xs font-bold text-white bg-red-600"
|
|
7535
|
+
onClick: handleCardClick,
|
|
7536
|
+
className: "relative aspect-square overflow-hidden bg-gray-50 cursor-pointer flex-shrink-0"
|
|
7248
7537
|
},
|
|
7249
|
-
|
|
7250
|
-
|
|
7251
|
-
|
|
7538
|
+
/* @__PURE__ */ React21__default.default.createElement(
|
|
7539
|
+
Image4__default.default,
|
|
7540
|
+
{
|
|
7541
|
+
src: imageSource.src,
|
|
7542
|
+
alt: imageSource.alt,
|
|
7543
|
+
className: "w-full h-full object-cover group-hover:scale-105 transition-transform duration-300",
|
|
7544
|
+
height: 300,
|
|
7545
|
+
width: 300,
|
|
7546
|
+
priority: false,
|
|
7547
|
+
onLoad: handleImageLoad,
|
|
7548
|
+
onError: () => setIsImageLoaded(true),
|
|
7549
|
+
key: imageSource.src
|
|
7550
|
+
}
|
|
7551
|
+
),
|
|
7552
|
+
/* @__PURE__ */ React21__default.default.createElement(
|
|
7553
|
+
"button",
|
|
7554
|
+
{
|
|
7555
|
+
onClick: (e) => {
|
|
7556
|
+
e.stopPropagation();
|
|
7557
|
+
setShowQuickView(true);
|
|
7558
|
+
},
|
|
7559
|
+
className: "absolute top-2 left-2 p-2 rounded-full bg-white/90 backdrop-blur-sm hover:bg-white shadow-md opacity-0 group-hover:opacity-100 transition-all"
|
|
7560
|
+
},
|
|
7561
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Eye, { className: "size-4 text-[#2B4B7C]" })
|
|
7562
|
+
),
|
|
7563
|
+
product.inventoryCount === 0 && /* @__PURE__ */ React21__default.default.createElement("div", { className: "absolute inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-white rounded-full px-4 py-2" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] font-bold text-[11px] text-[#2B4B7C] uppercase" }, "Out of Stock")))
|
|
7564
|
+
),
|
|
7565
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "p-4 flex-1 flex flex-col" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "p-0 flex-1 flex flex-col" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-1 mb-2 flex-wrap" }, product.isDiscounted && /* @__PURE__ */ React21__default.default.createElement("span", { className: "bg-[#E67E50] text-white rounded-full px-2 py-0.5 flex items-center gap-1" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] font-bold text-[8px] uppercase" }, "-", product.discountAmount, "%"))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-1" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-xs text-[#5B9BD5] uppercase tracking-wide font-medium" }, product.brand)), /* @__PURE__ */ React21__default.default.createElement("h3", { className: "text-sm font-['Poppins',sans-serif] font-semibold text-[#2B4B7C] mb-3" }, displayName), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-1.5 mb-2" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-0.5" }, [...Array(5)].map((_, i) => /* @__PURE__ */ React21__default.default.createElement(
|
|
7566
|
+
lucideReact.Star,
|
|
7252
7567
|
{
|
|
7253
|
-
|
|
7254
|
-
|
|
7255
|
-
|
|
7256
|
-
|
|
7257
|
-
whileTap: { scale: 0.95 },
|
|
7258
|
-
"aria-label": isFavorite ? "Remove from wishlist" : "Add to wishlist"
|
|
7259
|
-
},
|
|
7260
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Heart, { className: `w-5 h-5 ${isFavorite ? "fill-red-500 text-red-500" : ""}` })
|
|
7261
|
-
)),
|
|
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")),
|
|
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(
|
|
7568
|
+
key: i,
|
|
7569
|
+
className: `size-4 ${i < Math.floor(product.rating ? product.rating : 0) ? "text-[#E67E50] fill-[#E67E50]" : "text-gray-300"}`
|
|
7570
|
+
}
|
|
7571
|
+
))), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] text-[10px] text-[#676c80]" }, "(", product.reviews?.length || 0, ")")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-1.5 mb-3" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] font-bold text-md text-primary-600" }, "$", product.finalPrice.toFixed(2)), product.isDiscounted && /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] text-sm text-[#676c80] line-through" }, "$", formatPrice(product.priceBeforeDiscount))), variantImages.length > 0 && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-1.5 mb-3" }, variantImages.map((variant, index) => /* @__PURE__ */ React21__default.default.createElement(
|
|
7264
7572
|
"button",
|
|
7265
7573
|
{
|
|
7266
7574
|
key: variant.variantId || index,
|
|
@@ -7280,7 +7588,7 @@ function ProductCard({
|
|
|
7280
7588
|
"aria-label": `Select ${variant.color || "variant"} color`
|
|
7281
7589
|
},
|
|
7282
7590
|
/* @__PURE__ */ React21__default.default.createElement(
|
|
7283
|
-
|
|
7591
|
+
Image4__default.default,
|
|
7284
7592
|
{
|
|
7285
7593
|
src: variant.image,
|
|
7286
7594
|
alt: variant.color || `Variant ${index + 1}`,
|
|
@@ -7289,15 +7597,17 @@ function ProductCard({
|
|
|
7289
7597
|
sizes: "32px"
|
|
7290
7598
|
}
|
|
7291
7599
|
)
|
|
7292
|
-
)))),
|
|
7293
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-auto p-4 pt-0" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
7600
|
+
)))), /* @__PURE__ */ React21__default.default.createElement(
|
|
7294
7601
|
"button",
|
|
7295
7602
|
{
|
|
7296
7603
|
type: "button",
|
|
7297
7604
|
onClick: async (e) => {
|
|
7298
7605
|
e.stopPropagation();
|
|
7299
7606
|
if (!selectedVariantId && variantImages.length > 0) {
|
|
7300
|
-
|
|
7607
|
+
notification.error(
|
|
7608
|
+
"Select a variant",
|
|
7609
|
+
"Please choose a variant before adding this item to your cart."
|
|
7610
|
+
);
|
|
7301
7611
|
return;
|
|
7302
7612
|
}
|
|
7303
7613
|
try {
|
|
@@ -7311,23 +7621,19 @@ function ProductCard({
|
|
|
7311
7621
|
}
|
|
7312
7622
|
},
|
|
7313
7623
|
disabled: isAddingToCart || variantImages.length > 0 && !selectedVariantId,
|
|
7314
|
-
className: "w-full
|
|
7624
|
+
className: "w-full font-['Poppins',sans-serif] font-medium text-[11px] px-3 py-2 rounded-full bg-[#5B9BD5] text-white hover:bg-[#4a8ac4] hover:shadow-lg transition-all duration-300 flex items-center justify-center gap-1.5 disabled:opacity-50 disabled:cursor-not-allowed"
|
|
7315
7625
|
},
|
|
7316
7626
|
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ShoppingCart, { className: "h-4 w-4" }),
|
|
7317
|
-
"Add to Cart"
|
|
7318
|
-
), /* @__PURE__ */ React21__default.default.createElement(
|
|
7319
|
-
"button",
|
|
7320
|
-
{
|
|
7321
|
-
type: "button",
|
|
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"
|
|
7327
|
-
},
|
|
7328
|
-
"View More"
|
|
7627
|
+
selectedVariant?.inventoryCount === 0 ? "Out of Stock" : "Add to Cart"
|
|
7329
7628
|
))
|
|
7330
|
-
)
|
|
7629
|
+
), showQuickView && /* @__PURE__ */ React21__default.default.createElement(
|
|
7630
|
+
QuickViewModal,
|
|
7631
|
+
{
|
|
7632
|
+
product,
|
|
7633
|
+
onClose: () => setShowQuickView(false),
|
|
7634
|
+
onNavigateToProduct: () => handleCardClick
|
|
7635
|
+
}
|
|
7636
|
+
));
|
|
7331
7637
|
}
|
|
7332
7638
|
function Skeleton({ className = "" }) {
|
|
7333
7639
|
return /* @__PURE__ */ React21__default.default.createElement("div", { className: `animate-pulse bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 bg-[length:200%_100%] rounded ${className}` });
|
|
@@ -7350,7 +7656,7 @@ function Button({
|
|
|
7350
7656
|
children,
|
|
7351
7657
|
...props
|
|
7352
7658
|
}) {
|
|
7353
|
-
const baseStyles = "font-medium rounded-
|
|
7659
|
+
const baseStyles = "font-medium rounded-full transition-all duration-200 inline-flex items-center justify-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-primary-500";
|
|
7354
7660
|
const variants = {
|
|
7355
7661
|
primary: "bg-primary-600 text-white hover:bg-primary-700 shadow-lg shadow-primary-500/30 hover:shadow-xl hover:shadow-primary-500/40",
|
|
7356
7662
|
secondary: "bg-secondary-600 text-white hover:bg-secondary-700 shadow-lg shadow-secondary-500/30 hover:shadow-xl hover:shadow-secondary-500/40",
|
|
@@ -7519,8 +7825,6 @@ function useCategories() {
|
|
|
7519
7825
|
}, []);
|
|
7520
7826
|
return { categories, isLoading, error };
|
|
7521
7827
|
}
|
|
7522
|
-
|
|
7523
|
-
// src/screens/ShopScreen.tsx
|
|
7524
7828
|
function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
7525
7829
|
const router = navigation.useRouter();
|
|
7526
7830
|
const { buildPath } = useBasePath();
|
|
@@ -7721,7 +8025,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7721
8025
|
},
|
|
7722
8026
|
[]
|
|
7723
8027
|
);
|
|
7724
|
-
|
|
8028
|
+
React21.useCallback((parentCategoryId, subCategoryId) => {
|
|
7725
8029
|
setFilters((current) => {
|
|
7726
8030
|
if (current.subCategory === subCategoryId) {
|
|
7727
8031
|
const { subCategory, ...rest } = current;
|
|
@@ -8029,124 +8333,83 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8029
8333
|
if (name.includes("care") || name.includes("personal")) return lucideReact.Heart;
|
|
8030
8334
|
return lucideReact.Package;
|
|
8031
8335
|
};
|
|
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("
|
|
8336
|
+
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("div", { className: `lg:w-72 ${showFilters ? "block rounded-full" : "hidden lg:block"}` }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-white rounded-[24px] p-6 border-2 border-gray-100 sticky top-24" }, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "font-['Poppins',sans-serif] font-semibold text-secondary" }, "Filters"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React21__default.default.createElement("label", { className: "font-['Poppins',sans-serif] text-[12px] text-muted mb-2 block font-medium" }, "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 size-4 text-muted" }), /* @__PURE__ */ React21__default.default.createElement(
|
|
8033
8337
|
"input",
|
|
8034
8338
|
{
|
|
8035
8339
|
type: "text",
|
|
8036
8340
|
placeholder: "Search...",
|
|
8037
8341
|
value: searchQuery,
|
|
8038
8342
|
onChange: handleInputChange,
|
|
8039
|
-
className: "w-full
|
|
8343
|
+
className: "w-full pl-10 pr-4 py-2.5 rounded-xl border-2 border-gray-200 focus:border-primary focus:outline-none font-['Poppins',sans-serif] text-[13px] text-secondary"
|
|
8040
8344
|
}
|
|
8041
|
-
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "
|
|
8345
|
+
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8042
8346
|
"button",
|
|
8043
8347
|
{
|
|
8044
|
-
type: "button",
|
|
8045
8348
|
onClick: () => toggleFilterSection("category"),
|
|
8046
|
-
className: "
|
|
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"}`
|
|
8349
|
+
className: "w-full flex items-center justify-between mb-3"
|
|
8056
8350
|
},
|
|
8057
|
-
/* @__PURE__ */ React21__default.default.createElement("
|
|
8058
|
-
/* @__PURE__ */ React21__default.default.createElement("
|
|
8059
|
-
), sortedCategories.map((category) => {
|
|
8351
|
+
/* @__PURE__ */ React21__default.default.createElement("label", { className: "font-['Poppins',sans-serif] text-[12px] text-muted font-medium cursor-pointer" }, "Category"),
|
|
8352
|
+
expandedFilterSections.category ? /* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronDown, { className: `size-4 text-muted transition-transform ${expandedFilterSections.category ? "rotate-180" : ""}` }) : /* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronDown, { className: `size-4 text-muted transition-transform ${expandedFilterSections.category ? "rotate-180" : ""}` })
|
|
8353
|
+
), expandedFilterSections.category && /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, sortedCategories.map((category) => {
|
|
8060
8354
|
const isCategoryActive = categoryFilter === category.id;
|
|
8061
8355
|
const isExpanded = !!expandedCategories[category.id];
|
|
8062
8356
|
const Icon = getCategoryIconForFilter(category.name ?? "");
|
|
8063
|
-
return /* @__PURE__ */ React21__default.default.createElement(
|
|
8357
|
+
return /* @__PURE__ */ React21__default.default.createElement(
|
|
8064
8358
|
"button",
|
|
8065
8359
|
{
|
|
8066
|
-
|
|
8360
|
+
key: category.id,
|
|
8067
8361
|
onClick: () => {
|
|
8068
8362
|
if (!isExpanded) toggleCategoryExpand(category.id ?? "");
|
|
8069
8363
|
handleCategoryChange(category.id ?? "");
|
|
8070
8364
|
},
|
|
8071
|
-
className: `
|
|
8365
|
+
className: `w-full text-left px-4 py-3 rounded-xl font-['Poppins',sans-serif] text-[13px] transition-all flex items-center gap-3 ${isCategoryActive ? "bg-primary text-white shadow-lg" : "text-secondary hover:bg-gray-50 border-2 border-gray-100"}`
|
|
8072
8366
|
},
|
|
8073
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
8074
|
-
|
|
8075
|
-
|
|
8076
|
-
|
|
8077
|
-
{
|
|
8078
|
-
type: "button",
|
|
8079
|
-
onClick: (e) => {
|
|
8080
|
-
e.stopPropagation();
|
|
8081
|
-
toggleCategoryExpand(category.id ?? "");
|
|
8082
|
-
},
|
|
8083
|
-
className: "p-1"
|
|
8084
|
-
},
|
|
8085
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronDown, { className: `h-4 w-4 transition-transform ${isExpanded ? "rotate-180" : ""} ${isCategoryActive ? "text-white" : "text-slate-400"}` })
|
|
8086
|
-
)
|
|
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) => {
|
|
8088
|
-
const isSubActive = subCategoryFilter === sub.id;
|
|
8089
|
-
return /* @__PURE__ */ React21__default.default.createElement(
|
|
8090
|
-
"button",
|
|
8091
|
-
{
|
|
8092
|
-
key: sub.id,
|
|
8093
|
-
type: "button",
|
|
8094
|
-
onClick: () => handleSubCategoryChange(category.id ?? "", sub.id),
|
|
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"}`
|
|
8096
|
-
},
|
|
8097
|
-
sub.name
|
|
8098
|
-
);
|
|
8099
|
-
})));
|
|
8100
|
-
}))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8367
|
+
/* @__PURE__ */ React21__default.default.createElement(Icon, { className: "size-4" }),
|
|
8368
|
+
category.name
|
|
8369
|
+
);
|
|
8370
|
+
}))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8101
8371
|
"button",
|
|
8102
8372
|
{
|
|
8103
|
-
type: "button",
|
|
8104
8373
|
onClick: () => toggleFilterSection("brand"),
|
|
8105
|
-
className: "
|
|
8374
|
+
className: "w-full flex items-center justify-between mb-3"
|
|
8106
8375
|
},
|
|
8107
|
-
/* @__PURE__ */ React21__default.default.createElement("
|
|
8108
|
-
|
|
8109
|
-
), expandedFilterSections.brand && /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-
|
|
8376
|
+
/* @__PURE__ */ React21__default.default.createElement("label", { className: "font-['Poppins',sans-serif] text-[12px] text-muted font-medium cursor-pointer" }, "Brand"),
|
|
8377
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronDown, { className: `size-4 text-muted transition-transform ${expandedFilterSections.brand ? "rotate-180" : ""}` })
|
|
8378
|
+
), expandedFilterSections.brand && /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, availableBrands.length === 0 ? /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-xs text-slate-500" }, "No brands available") : availableBrands.map((brand) => {
|
|
8110
8379
|
const isSelected = brandFilter === brand;
|
|
8111
8380
|
return /* @__PURE__ */ React21__default.default.createElement(
|
|
8112
8381
|
"button",
|
|
8113
8382
|
{
|
|
8114
8383
|
key: brand,
|
|
8115
|
-
type: "button",
|
|
8116
8384
|
onClick: () => handleBrandChange(brand),
|
|
8117
|
-
className: `
|
|
8385
|
+
className: `w-full text-left px-4 py-3 rounded-xl font-['Poppins',sans-serif] text-[13px] transition-all ${isSelected ? "bg-primary text-white shadow-lg" : "text-secondary hover:bg-gray-50 border-2 border-gray-100"}`
|
|
8118
8386
|
},
|
|
8119
|
-
|
|
8120
|
-
isSelected && /* @__PURE__ */ React21__default.default.createElement(lucideReact.Check, { className: "h-3 w-3 text-primary-600 flex-shrink-0 ml-2" })
|
|
8387
|
+
brand
|
|
8121
8388
|
);
|
|
8122
|
-
}))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "
|
|
8389
|
+
}))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8123
8390
|
"button",
|
|
8124
8391
|
{
|
|
8125
|
-
type: "button",
|
|
8126
8392
|
onClick: () => toggleFilterSection("availability"),
|
|
8127
|
-
className: "
|
|
8393
|
+
className: "w-full flex items-center justify-between mb-3"
|
|
8128
8394
|
},
|
|
8129
|
-
/* @__PURE__ */ React21__default.default.createElement("
|
|
8130
|
-
|
|
8395
|
+
/* @__PURE__ */ React21__default.default.createElement("label", { className: "font-['Poppins',sans-serif] text-[12px] text-muted font-medium cursor-pointer" }, "Availability"),
|
|
8396
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronDown, { className: `size-4 text-muted transition-transform ${expandedFilterSections.availability ? "rotate-180" : ""}` })
|
|
8131
8397
|
), expandedFilterSections.availability && /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8132
8398
|
"button",
|
|
8133
8399
|
{
|
|
8134
|
-
type: "button",
|
|
8135
8400
|
onClick: handleToggleStock,
|
|
8136
|
-
className: `
|
|
8401
|
+
className: `w-full flex items-center justify-between px-4 py-3 rounded-xl font-['Poppins',sans-serif] text-[13px] transition-all border-2 ${inStockOnly ? "bg-primary text-white shadow-lg" : "text-secondary hover:bg-gray-50 border-2 border-gray-100"}`
|
|
8137
8402
|
},
|
|
8138
|
-
|
|
8139
|
-
|
|
8140
|
-
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8403
|
+
"In Stock Only"
|
|
8404
|
+
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8141
8405
|
"button",
|
|
8142
8406
|
{
|
|
8143
|
-
type: "button",
|
|
8144
8407
|
onClick: () => toggleFilterSection("price"),
|
|
8145
|
-
className: "
|
|
8408
|
+
className: "w-full flex items-center justify-between mb-3"
|
|
8146
8409
|
},
|
|
8147
|
-
/* @__PURE__ */ React21__default.default.createElement("
|
|
8148
|
-
|
|
8149
|
-
), expandedFilterSections.price && /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-
|
|
8410
|
+
/* @__PURE__ */ React21__default.default.createElement("label", { className: "font-['Poppins',sans-serif] text-[12px] text-muted font-medium cursor-pointer" }, "Price Range"),
|
|
8411
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronDown, { className: `size-4 text-muted transition-transform ${expandedFilterSections.price ? "rotate-180" : ""}` })
|
|
8412
|
+
), expandedFilterSections.price && /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap gap-2" }, priceRanges.map((range) => {
|
|
8150
8413
|
const isActive = selectedPriceRange === range.value;
|
|
8151
8414
|
return /* @__PURE__ */ React21__default.default.createElement(
|
|
8152
8415
|
"button",
|
|
@@ -8154,7 +8417,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8154
8417
|
type: "button",
|
|
8155
8418
|
key: range.value,
|
|
8156
8419
|
onClick: () => handlePriceRangeSelect(range.value),
|
|
8157
|
-
className: `
|
|
8420
|
+
className: `w-full flex items-center justify-between px-4 py-3 rounded-xl font-['Poppins',sans-serif] text-[13px] transition-all border-2 ${isActive ? "bg-primary text-white shadow-lg" : "text-secondary hover:bg-gray-50 border-2 border-gray-100"}`
|
|
8158
8421
|
},
|
|
8159
8422
|
range.label
|
|
8160
8423
|
);
|
|
@@ -8166,7 +8429,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8166
8429
|
placeholder: "Min",
|
|
8167
8430
|
value: customPrice.min,
|
|
8168
8431
|
onChange: (event) => setCustomPrice((current) => ({ ...current, min: event.target.value })),
|
|
8169
|
-
className: "text-
|
|
8432
|
+
className: "w-1/2 px-4 py-2.5 rounded-xl border-2 border-gray-200 focus:border-primary focus:outline-none font-['Poppins',sans-serif] text-[13px] text-secondary"
|
|
8170
8433
|
}
|
|
8171
8434
|
), /* @__PURE__ */ React21__default.default.createElement(
|
|
8172
8435
|
Input,
|
|
@@ -8176,7 +8439,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8176
8439
|
placeholder: "Max",
|
|
8177
8440
|
value: customPrice.max,
|
|
8178
8441
|
onChange: (event) => setCustomPrice((current) => ({ ...current, max: event.target.value })),
|
|
8179
|
-
className: "text-
|
|
8442
|
+
className: "w-1/2 px-4 py-2.5 rounded-xl border-2 border-gray-200 focus:border-primary focus:outline-none font-['Poppins',sans-serif] text-[13px] text-secondary"
|
|
8180
8443
|
}
|
|
8181
8444
|
)), /* @__PURE__ */ React21__default.default.createElement(
|
|
8182
8445
|
"button",
|
|
@@ -8184,10 +8447,10 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8184
8447
|
type: "button",
|
|
8185
8448
|
onClick: applyCustomPrice,
|
|
8186
8449
|
disabled: !isCustomPriceDirty,
|
|
8187
|
-
className: "w-full rounded-lg border border-primary
|
|
8450
|
+
className: "w-full rounded-lg border border-primary bg-primary/10 px-4 py-2 text-sm font-medium text-primary transition hover:bg-primary/20 disabled:cursor-not-allowed disabled:border-slate-200 disabled:text-slate-400"
|
|
8188
8451
|
},
|
|
8189
8452
|
"Apply"
|
|
8190
|
-
)))));
|
|
8453
|
+
)))))));
|
|
8191
8454
|
const displayCategories = React21.useMemo(() => {
|
|
8192
8455
|
return topCategories.slice(0, 5);
|
|
8193
8456
|
}, [topCategories]);
|
|
@@ -8199,7 +8462,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8199
8462
|
if (name.includes("care") || name.includes("personal")) return lucideReact.Heart;
|
|
8200
8463
|
return lucideReact.Package;
|
|
8201
8464
|
};
|
|
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-
|
|
8465
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-[#F9FAFB]" }, /* @__PURE__ */ React21__default.default.createElement("section", { className: "relative overflow-hidden bg-primary-bg py-16 md:py-24" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8203
8466
|
framerMotion.motion.div,
|
|
8204
8467
|
{
|
|
8205
8468
|
initial: { opacity: 0, y: 24 },
|
|
@@ -8228,33 +8491,20 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8228
8491
|
}
|
|
8229
8492
|
))
|
|
8230
8493
|
)
|
|
8231
|
-
))), /* @__PURE__ */ React21__default.default.createElement("section", { className: "
|
|
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",
|
|
8235
|
-
{
|
|
8236
|
-
key: index,
|
|
8237
|
-
className: "rounded-xl border border-slate-200 bg-white p-8"
|
|
8238
|
-
},
|
|
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) => {
|
|
8494
|
+
))), /* @__PURE__ */ React21__default.default.createElement("section", { className: "py-8 bg-white" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "max-w-[1400px] mx-auto px-8 md:px-12" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-2xl md:text-3xl font-['Poppins',sans-serif] font-semibold text-secondary mb-6" }, "Shop by Category"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-4" }, displayCategories.map((category, index) => {
|
|
8255
8495
|
const Icon = getCategoryIcon(category.name ?? "");
|
|
8256
8496
|
const isSelected = categoryFilter === category.id;
|
|
8257
|
-
return /* @__PURE__ */ React21__default.default.createElement(
|
|
8497
|
+
return /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement(
|
|
8498
|
+
framerMotion.motion.button,
|
|
8499
|
+
{
|
|
8500
|
+
onClick: handleClearCategory,
|
|
8501
|
+
initial: { opacity: 0, y: 20 },
|
|
8502
|
+
animate: { opacity: 1, y: 0 },
|
|
8503
|
+
transition: { delay: index * 0.1 },
|
|
8504
|
+
className: `group relative overflow-hidden rounded-[24px] p-6 transition-all duration-300 ${!categoryFilter ? "bg-gradient-to-br from-primary to-secondary text-white shadow-xl scale-105" : "bg-gradient-to-br from-gray-50 to-white hover:shadow-lg border-2 border-gray-100 hover:border-primary"}`
|
|
8505
|
+
},
|
|
8506
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: `size-12 rounded-full mb-3 mx-auto flex items-center justify-center transition-all ${!categoryFilter ? "bg-white/20" : "bg-gradient-to-br from-primary/10 to-secondary/10 group-hover:scale-110"}` }, /* @__PURE__ */ React21__default.default.createElement(Icon, { className: `size-6 ${!categoryFilter ? "text-white" : "text-primary"}` })), /* @__PURE__ */ React21__default.default.createElement("h3", { className: `font-['Poppins',sans-serif] font-semibold text-[14px] mb-1.5 ${!categoryFilter ? "text-white" : "text-secondary"}` }, "All Products"), /* @__PURE__ */ React21__default.default.createElement("p", { className: `font-['Poppins',sans-serif] text-[11px] ${!categoryFilter ? "text-white/80" : "text-muted"}` }, "Browse Everything"))
|
|
8507
|
+
), /* @__PURE__ */ React21__default.default.createElement(
|
|
8258
8508
|
framerMotion.motion.button,
|
|
8259
8509
|
{
|
|
8260
8510
|
key: category.id,
|
|
@@ -8262,56 +8512,42 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8262
8512
|
animate: { opacity: 1, y: 0 },
|
|
8263
8513
|
transition: { delay: index * 0.1 },
|
|
8264
8514
|
onClick: () => handleCategoryChange(category.id ?? ""),
|
|
8265
|
-
className: `group rounded-
|
|
8515
|
+
className: `group relative overflow-hidden rounded-[24px] p-6 transition-all duration-300 ${isSelected ? "bg-gradient-to-br from-primary to-secondary text-white shadow-xl scale-105" : "bg-gradient-to-br from-gray-50 to-white hover:shadow-lg border-2 border-gray-100 hover:border-primary"}`
|
|
8266
8516
|
},
|
|
8267
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
8268
|
-
|
|
8269
|
-
|
|
8270
|
-
);
|
|
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(
|
|
8517
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: `size-12 rounded-full mb-3 mx-auto flex items-center justify-center transition-all ${isSelected ? "bg-white/20" : "bg-gradient-to-br from-primary/10 to-secondary/10 group-hover:scale-110"}` }, /* @__PURE__ */ React21__default.default.createElement(Icon, { className: `size-6 ${isSelected ? "text-white" : "text-primary"}` })), /* @__PURE__ */ React21__default.default.createElement("h3", { className: `font-['Poppins',sans-serif] font-semibold text-[14px] mb-1.5 ${isSelected ? "text-white" : "text-secondary"}` }, category.name), /* @__PURE__ */ React21__default.default.createElement("p", { className: `font-['Poppins',sans-serif] text-[11px] ${isSelected ? "text-white/80" : "text-muted"}` }, category.description))
|
|
8518
|
+
));
|
|
8519
|
+
})))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative 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" }, 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..." : `${displayedProducts.length} products found`)), /* @__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(
|
|
8272
8520
|
"select",
|
|
8273
8521
|
{
|
|
8274
8522
|
value: sortOption,
|
|
8275
8523
|
onChange: (event) => {
|
|
8276
8524
|
setSortOption(event.target.value);
|
|
8277
8525
|
},
|
|
8278
|
-
className: "appearance-none rounded-
|
|
8526
|
+
className: "appearance-none rounded-full border border-gray-200 bg-white py-2.5 pl-10 pr-9 text-sm font-medium text-gray-700 shadow-sm transition focus:outline-none focus:ring-1 focus:ring-secondary focus:border-primary"
|
|
8279
8527
|
},
|
|
8280
8528
|
/* @__PURE__ */ React21__default.default.createElement("option", { value: "featured" }, "Featured products"),
|
|
8281
8529
|
/* @__PURE__ */ React21__default.default.createElement("option", { value: "price-low-high" }, "Price: low to high"),
|
|
8282
8530
|
/* @__PURE__ */ React21__default.default.createElement("option", { value: "price-high-low" }, "Price: high to low"),
|
|
8283
8531
|
/* @__PURE__ */ React21__default.default.createElement("option", { value: "newest" }, "Newest arrivals")
|
|
8284
|
-
), /* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronDown, { className: "pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" })), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center rounded-
|
|
8532
|
+
), /* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronDown, { className: "pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" })), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center rounded-full border border-gray-200 bg-gray-100 shadow-sm p-1" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8285
8533
|
"button",
|
|
8286
8534
|
{
|
|
8287
8535
|
type: "button",
|
|
8288
8536
|
onClick: () => setViewMode("grid"),
|
|
8289
|
-
className: `flex items-center gap-2 rounded-
|
|
8537
|
+
className: `flex items-center gap-2 rounded-full px-4 py-2 text-sm font-medium transition ${viewMode === "grid" ? "bg-white text-primary shadow-md" : "text-gray-500 hover:text-gray-700"}`,
|
|
8290
8538
|
"aria-pressed": viewMode === "grid"
|
|
8291
8539
|
},
|
|
8292
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.LayoutGrid, { className: "h-4 w-4" })
|
|
8293
|
-
"Grid"
|
|
8540
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.LayoutGrid, { className: "h-4 w-4" })
|
|
8294
8541
|
), /* @__PURE__ */ React21__default.default.createElement(
|
|
8295
8542
|
"button",
|
|
8296
8543
|
{
|
|
8297
8544
|
type: "button",
|
|
8298
8545
|
onClick: () => setViewMode("list"),
|
|
8299
|
-
className: `flex items-center gap-2 rounded-
|
|
8546
|
+
className: `flex items-center gap-2 rounded-full px-4 py-2 text-sm font-medium transition ${viewMode === "list" ? "bg-white text-primary shadow-md" : "text-gray-500 hover:text-gray-700"}`,
|
|
8300
8547
|
"aria-pressed": viewMode === "list"
|
|
8301
8548
|
},
|
|
8302
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.LayoutList, { className: "h-4 w-4" })
|
|
8303
|
-
|
|
8304
|
-
)))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-4 md:hidden" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8305
|
-
Button,
|
|
8306
|
-
{
|
|
8307
|
-
variant: "outline",
|
|
8308
|
-
className: "w-full",
|
|
8309
|
-
onClick: () => setShowFilters(true)
|
|
8310
|
-
},
|
|
8311
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.SlidersHorizontal, { className: "h-5 w-5" }),
|
|
8312
|
-
"Filters",
|
|
8313
|
-
hasActiveFilters && /* @__PURE__ */ React21__default.default.createElement("span", { className: "ml-2 rounded-full bg-primary-600 px-2 py-0.5 text-xs font-semibold text-white" }, activeFilterChips.length)
|
|
8314
|
-
)), hasActiveFilters && /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-6 flex flex-wrap items-center gap-2 border-t border-gray-100 pt-4" }, activeFilterChips.map((chip) => /* @__PURE__ */ React21__default.default.createElement(
|
|
8549
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.LayoutList, { className: "h-4 w-4" })
|
|
8550
|
+
)))), hasActiveFilters && /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-6 flex flex-wrap items-center gap-2 border-t border-gray-100 pt-4" }, activeFilterChips.map((chip) => /* @__PURE__ */ React21__default.default.createElement(
|
|
8315
8551
|
"button",
|
|
8316
8552
|
{
|
|
8317
8553
|
key: chip.key,
|
|
@@ -8350,7 +8586,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8350
8586
|
onClick: () => router.push(buildPath(`/products/${product._id}`))
|
|
8351
8587
|
},
|
|
8352
8588
|
/* @__PURE__ */ React21__default.default.createElement("div", { className: "relative h-48 w-full overflow-hidden rounded-2xl bg-gray-100 md:h-40 md:w-40" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8353
|
-
|
|
8589
|
+
Image4__default.default,
|
|
8354
8590
|
{
|
|
8355
8591
|
src: product.productMedia[0]?.file || "/placeholder-product.jpg",
|
|
8356
8592
|
alt: product.name,
|
|
@@ -8366,14 +8602,14 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8366
8602
|
},
|
|
8367
8603
|
tag
|
|
8368
8604
|
))), /* @__PURE__ */ React21__default.default.createElement("h3", { className: "text-xl font-semibold text-gray-900" }, product.name), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap items-center gap-4 text-sm text-gray-500" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "inline-flex items-center gap-2 font-medium text-primary-600" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.ShieldCheck, { className: "h-4 w-4" }), product.inventoryCount > 0 ? "In stock & ready to ship" : "Restocking soon"), /* @__PURE__ */ React21__default.default.createElement("span", { className: "inline-flex items-center gap-2" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Clock, { className: "h-4 w-4 text-primary-500" }), "Added ", new Date(product.createdAt).toLocaleDateString()))),
|
|
8369
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex w-full flex-col items-end gap-3 md:w-auto" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-right" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-3xl font-semibold text-gray-900" }, formatPrice(product.finalPrice)), product.
|
|
8370
|
-
|
|
8605
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex w-full flex-col items-end gap-3 md:w-auto" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-right" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-3xl font-semibold text-gray-900" }, formatPrice(product.finalPrice)), product.isDiscounted && /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-gray-400 line-through" }, formatPrice(product.priceBeforeDiscount))), /* @__PURE__ */ React21__default.default.createElement(
|
|
8606
|
+
"button",
|
|
8371
8607
|
{
|
|
8372
|
-
size: "sm",
|
|
8373
8608
|
onClick: (event) => {
|
|
8374
8609
|
event.stopPropagation();
|
|
8375
8610
|
router.push(buildPath(`/products/${product._id}`));
|
|
8376
|
-
}
|
|
8611
|
+
},
|
|
8612
|
+
className: "w-full font-['Poppins',sans-serif] font-medium text-sm px-3 py-2 rounded-xl bg-secondary text-white hover:opacity-80 hover:shadow-lg transition-all duration-300 flex items-center justify-center gap-1.5 disabled:opacity-50 disabled:cursor-not-allowed"
|
|
8377
8613
|
},
|
|
8378
8614
|
"View product"
|
|
8379
8615
|
))
|
|
@@ -8403,50 +8639,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8403
8639
|
disabled: page === pagination.totalPages
|
|
8404
8640
|
},
|
|
8405
8641
|
"Next"
|
|
8406
|
-
)))))))
|
|
8407
|
-
framerMotion.motion.div,
|
|
8408
|
-
{
|
|
8409
|
-
initial: { opacity: 0 },
|
|
8410
|
-
animate: { opacity: 1 },
|
|
8411
|
-
exit: { opacity: 0 },
|
|
8412
|
-
className: "fixed inset-0 z-50 bg-black/40 backdrop-blur-sm lg:hidden"
|
|
8413
|
-
},
|
|
8414
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
8415
|
-
framerMotion.motion.div,
|
|
8416
|
-
{
|
|
8417
|
-
initial: { y: "100%" },
|
|
8418
|
-
animate: { y: 0 },
|
|
8419
|
-
exit: { y: "100%" },
|
|
8420
|
-
transition: { type: "spring", stiffness: 260, damping: 26 },
|
|
8421
|
-
className: "absolute inset-x-0 bottom-0 max-h-[85vh] overflow-y-auto rounded-t-3xl bg-white p-6 shadow-2xl"
|
|
8422
|
-
},
|
|
8423
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-6 flex items-center justify-between" }, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "text-lg font-semibold text-gray-900" }, "Filters"), /* @__PURE__ */ React21__default.default.createElement(
|
|
8424
|
-
"button",
|
|
8425
|
-
{
|
|
8426
|
-
type: "button",
|
|
8427
|
-
onClick: () => setShowFilters(false),
|
|
8428
|
-
className: "rounded-full border border-gray-200 p-2 text-gray-500 hover:text-gray-700"
|
|
8429
|
-
},
|
|
8430
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.X, { className: "h-4 w-4" })
|
|
8431
|
-
)),
|
|
8432
|
-
renderFiltersPanel()
|
|
8433
|
-
)
|
|
8434
|
-
)));
|
|
8435
|
-
}
|
|
8436
|
-
function Badge({ children, variant = "primary", size = "md", className = "" }) {
|
|
8437
|
-
const variants = {
|
|
8438
|
-
primary: "bg-primary-100 text-primary-700 border-primary-200",
|
|
8439
|
-
secondary: "bg-secondary-100 text-secondary-700 border-secondary-200",
|
|
8440
|
-
success: "bg-green-100 text-green-700 border-green-200",
|
|
8441
|
-
warning: "bg-yellow-100 text-yellow-700 border-yellow-200",
|
|
8442
|
-
danger: "bg-red-100 text-red-700 border-red-200",
|
|
8443
|
-
gray: "bg-gray-100 text-gray-700 border-gray-200"
|
|
8444
|
-
};
|
|
8445
|
-
const sizes = {
|
|
8446
|
-
sm: "px-2 py-1 text-xs",
|
|
8447
|
-
md: "px-3 py-1 text-sm"
|
|
8448
|
-
};
|
|
8449
|
-
return /* @__PURE__ */ React21__default.default.createElement("span", { className: `inline-flex items-center font-medium rounded-full border ${variants[variant]} ${sizes[size]} ${className}` }, children);
|
|
8642
|
+
))))))));
|
|
8450
8643
|
}
|
|
8451
8644
|
var safeFormatDate = (date, format = "long") => {
|
|
8452
8645
|
if (!date) return "N/A";
|
|
@@ -8463,6 +8656,7 @@ function ProductDetailScreen({ productId }) {
|
|
|
8463
8656
|
const { buildPath } = useBasePath();
|
|
8464
8657
|
const { product: productData, isLoading } = useProduct(productId);
|
|
8465
8658
|
const { addToCart } = useCart();
|
|
8659
|
+
const notification = useNotification();
|
|
8466
8660
|
const [selectedVariant, setSelectedVariant] = React21.useState(null);
|
|
8467
8661
|
const [quantity, setQuantity] = React21.useState(1);
|
|
8468
8662
|
const [isAddingToCart, setIsAddingToCart] = React21.useState(false);
|
|
@@ -8470,10 +8664,14 @@ function ProductDetailScreen({ productId }) {
|
|
|
8470
8664
|
const [relatedProducts, setRelatedProducts] = React21.useState([]);
|
|
8471
8665
|
const [initialProductData, setInitialProductData] = React21.useState(null);
|
|
8472
8666
|
const [activeImageIndex, setActiveImageIndex] = React21.useState(0);
|
|
8667
|
+
const [activeTab, setActiveTab] = React21.useState("description");
|
|
8473
8668
|
React21.useEffect(() => {
|
|
8474
8669
|
setActiveImageIndex(0);
|
|
8475
8670
|
}, [selectedVariant]);
|
|
8476
8671
|
const product = React21.useMemo(() => {
|
|
8672
|
+
console.log("productData", productData);
|
|
8673
|
+
console.log("selectedVariant", selectedVariant);
|
|
8674
|
+
console.log("initialProductData", initialProductData);
|
|
8477
8675
|
if (initialProductData && !productData) {
|
|
8478
8676
|
return initialProductData;
|
|
8479
8677
|
}
|
|
@@ -8528,12 +8726,11 @@ function ProductDetailScreen({ productId }) {
|
|
|
8528
8726
|
const variantImages = getVariantImages();
|
|
8529
8727
|
const variantPrice = selectedVariant?.finalPrice || currentVariant?.finalPrice || product?.price || 0;
|
|
8530
8728
|
const variantComparePrice = selectedVariant?.retailPrice || (currentVariant && "retailPrice" in currentVariant ? currentVariant.retailPrice : null) || product?.compareAtPrice;
|
|
8531
|
-
const discount = variantComparePrice && variantPrice && variantComparePrice > variantPrice ? Math.round((variantComparePrice - variantPrice) / variantComparePrice * 100) : 0;
|
|
8532
8729
|
const lastUpdatedLabel = safeFormatDate(
|
|
8533
8730
|
currentVariant && "updatedAt" in currentVariant && currentVariant.updatedAt ? currentVariant.updatedAt : product?.updatedAt
|
|
8534
8731
|
);
|
|
8535
|
-
|
|
8536
|
-
|
|
8732
|
+
currentVariant?.sku || product?.sku || "N/A";
|
|
8733
|
+
currentVariant?.inventoryCount > 0;
|
|
8537
8734
|
React21.useEffect(() => {
|
|
8538
8735
|
if (typeof window === "undefined") return;
|
|
8539
8736
|
const searchParams = new URLSearchParams(window.location.search);
|
|
@@ -8584,12 +8781,16 @@ function ProductDetailScreen({ productId }) {
|
|
|
8584
8781
|
quantity,
|
|
8585
8782
|
selectedVariant.id
|
|
8586
8783
|
);
|
|
8587
|
-
|
|
8588
|
-
|
|
8589
|
-
|
|
8784
|
+
notification.success(
|
|
8785
|
+
"Added to cart",
|
|
8786
|
+
`${quantity} \xD7 ${product.name}${selectedVariant.name ? ` (${selectedVariant.name})` : ""} added to your cart.`
|
|
8787
|
+
);
|
|
8590
8788
|
} catch (error) {
|
|
8591
8789
|
console.error("Failed to add to cart", error);
|
|
8592
|
-
|
|
8790
|
+
notification.error(
|
|
8791
|
+
"Could not add to cart",
|
|
8792
|
+
"Something went wrong while adding this item. Please try again."
|
|
8793
|
+
);
|
|
8593
8794
|
} finally {
|
|
8594
8795
|
setIsAddingToCart(false);
|
|
8595
8796
|
}
|
|
@@ -8605,33 +8806,41 @@ function ProductDetailScreen({ productId }) {
|
|
|
8605
8806
|
try {
|
|
8606
8807
|
if (isFavorited) {
|
|
8607
8808
|
await removeFromWishlist(product.id);
|
|
8608
|
-
|
|
8809
|
+
notification.info(
|
|
8810
|
+
"Removed from saved items",
|
|
8811
|
+
`${product.name} was removed from your saved items.`
|
|
8812
|
+
);
|
|
8609
8813
|
} else {
|
|
8610
8814
|
await addToWishlist(product);
|
|
8611
|
-
|
|
8815
|
+
notification.success(
|
|
8816
|
+
"Saved to favorites",
|
|
8817
|
+
`${product.name} was added to your favorites.`
|
|
8818
|
+
);
|
|
8612
8819
|
}
|
|
8613
8820
|
setIsFavorited(!isFavorited);
|
|
8614
8821
|
} catch (error) {
|
|
8615
8822
|
console.error("Error updating wishlist:", error);
|
|
8616
|
-
|
|
8823
|
+
notification.error(
|
|
8824
|
+
"Could not update favorites",
|
|
8825
|
+
"We could not update your favorites. Please try again."
|
|
8826
|
+
);
|
|
8617
8827
|
}
|
|
8618
8828
|
};
|
|
8619
8829
|
if (isLoading) {
|
|
8620
8830
|
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: "grid gap-10 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "h-[520px] animate-pulse rounded-3xl bg-slate-200" }), /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-3 gap-4" }, Array.from({ length: 3 }).map((_, index) => /* @__PURE__ */ React21__default.default.createElement("div", { key: index, className: "h-32 animate-pulse rounded-2xl bg-slate-200" })))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-4 rounded-3xl bg-white p-6 shadow-sm" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "h-8 w-32 animate-pulse rounded-full bg-slate-200" }), /* @__PURE__ */ React21__default.default.createElement("div", { className: "h-10 w-48 animate-pulse rounded-full bg-slate-200" }), /* @__PURE__ */ React21__default.default.createElement("div", { className: "h-6 w-full animate-pulse rounded-full bg-slate-200" }), /* @__PURE__ */ React21__default.default.createElement("div", { className: "h-12 w-full animate-pulse rounded-2xl bg-slate-200" }), /* @__PURE__ */ React21__default.default.createElement("div", { className: "h-12 w-full animate-pulse rounded-2xl bg-slate-200" })))));
|
|
8621
8831
|
}
|
|
8622
8832
|
if (!product) {
|
|
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(
|
|
8833
|
+
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(Link7__default.default, { href: "/shop", className: "inline-block" }, /* @__PURE__ */ React21__default.default.createElement(Button, null, "Browse products"))))));
|
|
8624
8834
|
}
|
|
8625
|
-
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-white" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "
|
|
8626
|
-
|
|
8835
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-white" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-gray-50 border-b border-gray-200 py-4" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "max-w-[1400px] mx-auto px-8 md:px-12" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8836
|
+
"button",
|
|
8627
8837
|
{
|
|
8628
|
-
|
|
8629
|
-
className: "
|
|
8630
|
-
onClick: () => router.push(buildPath("/shop"))
|
|
8838
|
+
onClick: () => router.push(buildPath("/shop")),
|
|
8839
|
+
className: "flex items-center gap-2 font-['Poppins',sans-serif] text-[13px] text-muted hover:text-primary transition-colors"
|
|
8631
8840
|
},
|
|
8632
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.
|
|
8841
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronLeft, { className: "size-4" }),
|
|
8633
8842
|
"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(
|
|
8843
|
+
))), /* @__PURE__ */ React21__default.default.createElement("section", { className: "py-12" }, /* @__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: "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(
|
|
8635
8844
|
framerMotion.motion.div,
|
|
8636
8845
|
{
|
|
8637
8846
|
key: selectedVariant?.id || "default",
|
|
@@ -8641,7 +8850,7 @@ function ProductDetailScreen({ productId }) {
|
|
|
8641
8850
|
className: "relative overflow-hidden rounded-3xl bg-slate-100 h-[420px] md:h-[560px]"
|
|
8642
8851
|
},
|
|
8643
8852
|
variantImages.length > 0 && variantImages[activeImageIndex] ? /* @__PURE__ */ React21__default.default.createElement(
|
|
8644
|
-
|
|
8853
|
+
Image4__default.default,
|
|
8645
8854
|
{
|
|
8646
8855
|
src: variantImages[activeImageIndex].src || variantImages[activeImageIndex].url || variantImages[activeImageIndex].file,
|
|
8647
8856
|
alt: currentVariant.name || product.name,
|
|
@@ -8651,7 +8860,7 @@ function ProductDetailScreen({ productId }) {
|
|
|
8651
8860
|
className: "object-contain"
|
|
8652
8861
|
}
|
|
8653
8862
|
) : product?.productMedia?.[0]?.file ? /* @__PURE__ */ React21__default.default.createElement(
|
|
8654
|
-
|
|
8863
|
+
Image4__default.default,
|
|
8655
8864
|
{
|
|
8656
8865
|
src: product.productMedia[0].file,
|
|
8657
8866
|
alt: product.name,
|
|
@@ -8661,34 +8870,17 @@ function ProductDetailScreen({ productId }) {
|
|
|
8661
8870
|
className: "object-contain"
|
|
8662
8871
|
}
|
|
8663
8872
|
) : null,
|
|
8664
|
-
|
|
8665
|
-
Badge,
|
|
8666
|
-
{
|
|
8667
|
-
variant: "danger",
|
|
8668
|
-
className: "absolute left-6 top-6 shadow-lg shadow-red-500/20"
|
|
8669
|
-
},
|
|
8670
|
-
"Save ",
|
|
8671
|
-
discount,
|
|
8672
|
-
"%"
|
|
8673
|
-
),
|
|
8674
|
-
!variantInStock && /* @__PURE__ */ React21__default.default.createElement(
|
|
8675
|
-
Badge,
|
|
8676
|
-
{
|
|
8677
|
-
variant: "secondary",
|
|
8678
|
-
className: "absolute right-6 top-6 bg-white/90 text-slate-700 shadow-lg border-slate-200"
|
|
8679
|
-
},
|
|
8680
|
-
"Out of Stock"
|
|
8681
|
-
)
|
|
8873
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "absolute top-6 left-6 flex flex-col gap-3" }, product.salePrice && /* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-[#E67E50] text-white rounded-full px-4 py-2" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] font-bold text-[12px] uppercase tracking-wide" }, "Save ", product.discount, "%")))
|
|
8682
8874
|
), 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(
|
|
8683
8875
|
"button",
|
|
8684
8876
|
{
|
|
8685
8877
|
key: image.src + index,
|
|
8686
8878
|
type: "button",
|
|
8687
8879
|
onClick: () => setActiveImageIndex(index),
|
|
8688
|
-
className: `relative aspect-square overflow-hidden rounded-lg border-2 transition-all ${activeImageIndex === index ? "border-primary
|
|
8880
|
+
className: `relative aspect-square overflow-hidden rounded-lg border-2 transition-all ${activeImageIndex === index ? "border-primary/50 ring-2 ring-primary/80 ring-offset-2 shadow-md" : "border-slate-200 hover:border-primary/50"}`
|
|
8689
8881
|
},
|
|
8690
8882
|
/* @__PURE__ */ React21__default.default.createElement(
|
|
8691
|
-
|
|
8883
|
+
Image4__default.default,
|
|
8692
8884
|
{
|
|
8693
8885
|
src: image?.src,
|
|
8694
8886
|
alt: image.alt || `Product image ${index + 1}`,
|
|
@@ -8698,7 +8890,13 @@ function ProductDetailScreen({ productId }) {
|
|
|
8698
8890
|
unoptimized: true
|
|
8699
8891
|
}
|
|
8700
8892
|
)
|
|
8701
|
-
)))))), /* @__PURE__ */ React21__default.default.createElement("aside", { className: "space-y-6 lg:sticky lg:top-24" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "" },
|
|
8893
|
+
)))))), /* @__PURE__ */ React21__default.default.createElement("aside", { className: "space-y-6 lg:sticky lg:top-24" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-4" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[12px] text-primary uppercase tracking-wide font-medium mb-2" }, product.brand, " \u2022 ", product.parentCategories?.[0].name), /* @__PURE__ */ React21__default.default.createElement("h1", { className: "text-3xl font-['Poppins',sans-serif] font-semibold text-secondary tracking-[-1.5px] mb-3" }, product.name), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-1" }, [...Array(5)].map((_, i) => /* @__PURE__ */ React21__default.default.createElement(
|
|
8894
|
+
lucideReact.Star,
|
|
8895
|
+
{
|
|
8896
|
+
key: i,
|
|
8897
|
+
className: `size-4 ${i < Math.floor(product.rating) ? "text-[#E67E50] fill-[#E67E50]" : "text-gray-300"}`
|
|
8898
|
+
}
|
|
8899
|
+
))), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] text-[14px] text-muted" }, product.rating, " (", product.reviewCount ? product.reviewCount : 0, " reviews)")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3 mb-6 pb-6 border-b-2 border-gray-100" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] font-bold text-[40px] text-[#E67E50]" }, selectedVariant ? formatPrice(selectedVariant.finalPrice) : formatPrice(product.finalPrice || product.price || 0)), variantComparePrice && variantComparePrice > variantPrice && /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] text-[24px] text-muted line-through" }, "$", product.price.toFixed(2)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "px-3 py-1 rounded-full bg-[#E67E50]/10" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] font-semibold text-[13px] text-[#E67E50]" }, "Save $", formatPrice(variantComparePrice))))), selectedVariant && /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-2 mb-2" }, selectedVariant.inventoryStatus === "OUT_OF_STOCK" /* OUTOFSTOCK */ || selectedVariant.inventoryStatus === "LOW_STOCK" /* LOWSTOCK */ ? /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement("div", { className: "size-3 rounded-full bg-red-500" }), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] text-[13px] text-red-600 font-medium" }, "Out of Stock")) : selectedVariant.inventoryCount <= 10 ? /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement("div", { className: "size-3 rounded-full bg-orange-500 animate-pulse" }), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] text-[13px] text-orange-600 font-medium" }, "Only ", selectedVariant.inventoryCount, " left in stock - Order soon!")) : /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement("div", { className: "size-3 rounded-full bg-green-500" }), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] text-[13px] text-green-600 font-medium" }, "In Stock"))), /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[12px] text-muted" }, "SKU: ", selectedVariant?.sku)), product.description && /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[14px] text-muted leading-[1.7] mb-8" }, /* @__PURE__ */ React21__default.default.createElement("div", { dangerouslySetInnerHTML: { __html: product.description } })), product?.productVariants && product.productVariants.length > 0 && /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "font-['Poppins',sans-serif] font-semibold text-[14px] text-secondary mb-3" }, "Select Variant"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap gap-3" }, product.productVariants.map((variant) => {
|
|
8702
8900
|
const isSelected = selectedVariant?.id === variant.id;
|
|
8703
8901
|
const variantImage = variant.productMedia?.[0]?.file || product.productMedia?.[0]?.file || product.images?.[0] || "/placeholder-product.jpg";
|
|
8704
8902
|
return /* @__PURE__ */ React21__default.default.createElement(
|
|
@@ -8707,10 +8905,10 @@ function ProductDetailScreen({ productId }) {
|
|
|
8707
8905
|
key: variant.id,
|
|
8708
8906
|
type: "button",
|
|
8709
8907
|
onClick: () => handleVariantSelect(variant),
|
|
8710
|
-
className: `flex
|
|
8908
|
+
className: `flex items-start gap-3 px-4 py-2.5 rounded-xl border-2 transition-all ${isSelected ? "border-primary bg-primary/5" : "border-gray-200 hover:border-primary/50"}`
|
|
8711
8909
|
},
|
|
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
|
|
8713
|
-
|
|
8910
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: `relative h-12 w-12 flex-shrink-0 overflow-hidden rounded-full border-2 ${isSelected ? "border-primary" : "border-slate-200"}` }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8911
|
+
Image4__default.default,
|
|
8714
8912
|
{
|
|
8715
8913
|
src: variantImage,
|
|
8716
8914
|
alt: variant.name || "Variant image",
|
|
@@ -8719,60 +8917,53 @@ function ProductDetailScreen({ productId }) {
|
|
|
8719
8917
|
sizes: "48px"
|
|
8720
8918
|
}
|
|
8721
8919
|
)),
|
|
8722
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex-1" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: `text-sm font-medium ${isSelected ? "text-
|
|
8723
|
-
isSelected && /* @__PURE__ */ React21__default.default.createElement(lucideReact.Check, { className: "h-5 w-5 text-
|
|
8920
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex-1" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: `text-start text-sm font-medium ${isSelected ? "text-secondary" : "text-slate-900"}` }, variant.name), variant.sku && /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-start text-xs text-slate-500 mt-0.5" }, "SKU: ", variant.sku)),
|
|
8921
|
+
isSelected && /* @__PURE__ */ React21__default.default.createElement(lucideReact.Check, { className: "h-5 w-5 text-secondary flex-shrink-0" })
|
|
8724
8922
|
);
|
|
8725
|
-
}))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "
|
|
8923
|
+
}))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-8" }, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "font-['Poppins',sans-serif] font-semibold text-[14px] text-secondary mb-3" }, "Quantity"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-4 bg-gray-100 rounded-full px-6 py-3" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8726
8924
|
"button",
|
|
8727
8925
|
{
|
|
8728
8926
|
type: "button",
|
|
8729
8927
|
onClick: () => setQuantity((current) => Math.max(1, current - 1)),
|
|
8730
|
-
className: "
|
|
8731
|
-
"aria-label": "
|
|
8928
|
+
className: "font-['Poppins',sans-serif] font-bold text-[18px] text-secondary hover:text-primary transition-colors",
|
|
8929
|
+
"aria-label": "Increase quantity"
|
|
8732
8930
|
},
|
|
8733
|
-
|
|
8734
|
-
), /* @__PURE__ */ React21__default.default.createElement("span", { className: "
|
|
8931
|
+
"-"
|
|
8932
|
+
), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] font-semibold text-[16px] text-secondary min-w-[30px] text-center" }, quantity), /* @__PURE__ */ React21__default.default.createElement(
|
|
8735
8933
|
"button",
|
|
8736
8934
|
{
|
|
8737
|
-
|
|
8738
|
-
|
|
8739
|
-
|
|
8740
|
-
return Math.min(maxQty, current + 1);
|
|
8741
|
-
}),
|
|
8742
|
-
className: "px-3 py-2 hover:bg-slate-50",
|
|
8743
|
-
"aria-label": "Increase quantity"
|
|
8935
|
+
onClick: () => setQuantity(Math.min(selectedVariant?.inventoryCount || product.inventoryCount || 999, quantity + 1)),
|
|
8936
|
+
disabled: quantity >= (selectedVariant?.inventoryCount || product.inventoryCount || 0),
|
|
8937
|
+
className: "font-['Poppins',sans-serif] font-bold text-[18px] text-secondary hover:text-primary transition-colors disabled:opacity-50"
|
|
8744
8938
|
},
|
|
8745
|
-
|
|
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-
|
|
8747
|
-
|
|
8939
|
+
"+"
|
|
8940
|
+
)), 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 sm:flex-row gap-3 mb-8" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8941
|
+
"button",
|
|
8748
8942
|
{
|
|
8749
|
-
|
|
8750
|
-
className: "w-full bg-orange-500 hover:bg-orange-600 text-white py-2.5",
|
|
8943
|
+
className: "flex-1 font-['Poppins',sans-serif] font-medium text-[14px] px-8 py-4 rounded-full transition-all duration-300 flex items-center justify-center gap-3 bg-[#E67E50] text-white hover:bg-[#d66f45] hover:shadow-lg disabled:opacity-50 disabled:cursor-not-allowed",
|
|
8751
8944
|
onClick: handleAddToCart,
|
|
8752
|
-
isLoading: isAddingToCart,
|
|
8753
8945
|
disabled: !selectedVariant || selectedVariant.inventoryStatus === "OUT_OF_STOCK" /* OUTOFSTOCK */
|
|
8754
8946
|
},
|
|
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"
|
|
8947
|
+
isAddingToCart ? /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement("svg", { className: "animate-spin h-5 w-5", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", "aria-hidden": "true" }, /* @__PURE__ */ React21__default.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ React21__default.default.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })), "Loading...") : /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement(lucideReact.ShoppingCart, { className: "h-4 w-4" }), !selectedVariant ? "Select a variant" : selectedVariant.inventoryStatus === "OUT_OF_STOCK" /* OUTOFSTOCK */ ? "Out of Stock" : "Add to Cart")
|
|
8757
8948
|
), /* @__PURE__ */ React21__default.default.createElement(
|
|
8758
|
-
|
|
8949
|
+
"button",
|
|
8759
8950
|
{
|
|
8760
|
-
|
|
8761
|
-
variant: "outline",
|
|
8762
|
-
className: "w-full py-2.5",
|
|
8951
|
+
className: "sm:w-auto px-6 py-4 rounded-full border-2 border-primary hover:bg-primary/5 transition-all flex items-center justify-center",
|
|
8763
8952
|
onClick: handleToggleFavorite
|
|
8764
8953
|
},
|
|
8765
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
8766
|
-
|
|
8767
|
-
|
|
8768
|
-
|
|
8769
|
-
|
|
8770
|
-
|
|
8771
|
-
|
|
8772
|
-
|
|
8954
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Heart, { className: `h-4 w-4 ${isFavorited ? "fill-red-500 text-red-500" : "text-primary"}` })
|
|
8955
|
+
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4 p-6 bg-gradient-to-br from-[#5B9BD5]/5 to-[#2B4B7C]/5 rounded-[24px]" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-start gap-3" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "size-10 rounded-full bg-white flex items-center justify-center shrink-0" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Truck, { className: "size-5 text-primary" })), /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] font-semibold text-[12px] text-secondary mb-1" }, "Free Shipping"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[11px] text-muted" }, "On all orders"))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-start gap-3" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "size-10 rounded-full bg-white flex items-center justify-center shrink-0" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.RotateCcw, { className: "size-5 text-primary" })), /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] font-semibold text-[12px] text-secondary mb-1" }, "Easy Returns"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[11px] text-muted" }, "30-day return policy"))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-start gap-3" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "size-10 rounded-full bg-white flex items-center justify-center shrink-0" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Shield, { className: "size-5 text-primary" })), /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] font-semibold text-[12px] text-secondary mb-1" }, "Secure Checkout"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[11px] text-muted" }, "Safe & protected"))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-start gap-3" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "size-10 rounded-full bg-white flex items-center justify-center shrink-0" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Package, { className: "size-5 text-primary" })), /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] font-semibold text-[12px] text-secondary mb-1" }, "Quality Guaranteed"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[11px] text-muted" }, "Premium materials")))))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-16" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-2 mb-8 border-b-2 border-gray-100" }, ["description", "reviews"].map((tab) => /* @__PURE__ */ React21__default.default.createElement(
|
|
8956
|
+
"button",
|
|
8957
|
+
{
|
|
8958
|
+
key: tab,
|
|
8959
|
+
onClick: () => setActiveTab(tab),
|
|
8960
|
+
className: `font-['Poppins',sans-serif] font-medium text-[14px] px-6 py-4 transition-all ${activeTab === tab ? "text-primary border-b-2 border-primary -mb-0.5" : "text-muted hover:text-primary"}`
|
|
8961
|
+
},
|
|
8962
|
+
tab.charAt(0).toUpperCase() + tab.slice(1)
|
|
8963
|
+
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-white rounded-[24px] p-8 border-2 border-gray-100" }, activeTab === "description" && /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "font-['Poppins',sans-serif] font-semibold text-secondary mb-4" }, "Product Description"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[14px] text-muted leading-[1.8] mb-4" }, /* @__PURE__ */ React21__default.default.createElement("div", { dangerouslySetInnerHTML: { __html: product.description } })), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-6" }, /* @__PURE__ */ React21__default.default.createElement("h4", { className: "font-['Poppins',sans-serif] font-semibold text-[13px] text-secondary mb-3" }, "Last updated:"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[14px] text-muted" }, lastUpdatedLabel)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-6" }, /* @__PURE__ */ React21__default.default.createElement("h4", { className: "font-['Poppins',sans-serif] font-semibold text-[13px] text-secondary mb-3" }, "Shipped from:"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[14px] text-muted" }, "Local pharmacy distribution center"))), activeTab === "reviews" && /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-center py-8" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Star, { className: "size-12 text-[#E67E50] mx-auto mb-4" }), /* @__PURE__ */ React21__default.default.createElement("h3", { className: "font-['Poppins',sans-serif] font-semibold text-secondary mb-2" }, product.rating, " out of 5 stars"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[14px] text-muted" }, "Based on ", product.reviewCount, " customer reviews")))), relatedProducts.length > 0 && /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "font-['Poppins',sans-serif] font-semibold text-secondary mb-8 text-2xl" }, "You May Also Like"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6" }, relatedProducts.map((relatedProduct) => /* @__PURE__ */ React21__default.default.createElement(
|
|
8773
8964
|
ProductCard,
|
|
8774
8965
|
{
|
|
8775
|
-
key: relatedProduct.id
|
|
8966
|
+
key: relatedProduct.id,
|
|
8776
8967
|
product: relatedProduct,
|
|
8777
8968
|
onClickProduct: (item) => {
|
|
8778
8969
|
router.push(buildPath(`/products/${item._id || item.id}`));
|
|
@@ -8813,70 +9004,71 @@ function CartItem({ item }) {
|
|
|
8813
9004
|
initial: { opacity: 0, y: 20 },
|
|
8814
9005
|
animate: { opacity: 1, y: 0 },
|
|
8815
9006
|
exit: { opacity: 0, x: -100 },
|
|
8816
|
-
className: "
|
|
9007
|
+
className: "bg-white border-2 border-gray-100 rounded-[24px] p-6 hover:border-[#5B9BD5]/30 transition-all duration-300"
|
|
8817
9008
|
},
|
|
8818
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
9009
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex gap-4 pr-8" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "w-28 h-28 rounded-[16px] overflow-hidden bg-gray-50 shrink-0" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
9010
|
+
Image4__default.default,
|
|
9011
|
+
{
|
|
9012
|
+
src: item.productVariantData.productMedia[0]?.file || "/placeholder-product.jpg",
|
|
9013
|
+
alt: item.productVariantData.name,
|
|
9014
|
+
className: "w-full h-full object-cover",
|
|
9015
|
+
height: 112,
|
|
9016
|
+
width: 112
|
|
9017
|
+
}
|
|
9018
|
+
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-start justify-between gap-4 mb-3" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "font-['Poppins',sans-serif] font-semibold text-[#2B4B7C] mb-2" }, item.productVariantData.name), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap items-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] text-[12px] text-[#676c80]" }, "Variant: ", /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-medium text-[#2B4B7C]" }, item.productVariantData.name)))), /* @__PURE__ */ React21__default.default.createElement(
|
|
8819
9019
|
"button",
|
|
8820
9020
|
{
|
|
8821
9021
|
onClick: handleRemove,
|
|
8822
|
-
className: "
|
|
9022
|
+
className: "p-2 hover:bg-red-50 rounded-full transition-colors group",
|
|
8823
9023
|
"aria-label": "Remove item"
|
|
8824
9024
|
},
|
|
8825
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Trash2, { className: "
|
|
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(
|
|
8828
|
-
Image3__default.default,
|
|
8829
|
-
{
|
|
8830
|
-
src: item.productVariantData.productMedia[0]?.file || "/placeholder-product.jpg",
|
|
8831
|
-
alt: item.productVariantData.name,
|
|
8832
|
-
fill: true,
|
|
8833
|
-
className: "object-cover",
|
|
8834
|
-
sizes: "80px"
|
|
8835
|
-
}
|
|
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(
|
|
9025
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Trash2, { className: "size-5 text-[#676c80] group-hover:text-red-500 transition-colors" })
|
|
9026
|
+
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between gap-4" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3 bg-gray-50 rounded-full px-4 py-2" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8837
9027
|
"button",
|
|
8838
9028
|
{
|
|
8839
9029
|
onClick: () => handleUpdateQuantity(item.quantity - 1),
|
|
8840
9030
|
disabled: isUpdating || item.quantity <= 1,
|
|
8841
|
-
className: "p-1 hover:bg-
|
|
9031
|
+
className: "p-1 hover:bg-white rounded-full transition-colors"
|
|
8842
9032
|
},
|
|
8843
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Minus, { className: "
|
|
8844
|
-
), /* @__PURE__ */ React21__default.default.createElement("span", { className: "
|
|
9033
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Minus, { className: "size-4 text-[#2B4B7C]" })
|
|
9034
|
+
), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] font-semibold text-[14px] text-[#2B4B7C] min-w-[20px] text-center" }, item.quantity), /* @__PURE__ */ React21__default.default.createElement(
|
|
8845
9035
|
"button",
|
|
8846
9036
|
{
|
|
8847
9037
|
onClick: () => handleUpdateQuantity(item.quantity + 1),
|
|
8848
9038
|
disabled: isUpdating || item.quantity >= (item.productVariantData.inventoryCount || 999),
|
|
8849
|
-
className: "p-1 hover:bg-
|
|
9039
|
+
className: "p-1 hover:bg-white rounded-full transition-colors"
|
|
8850
9040
|
},
|
|
8851
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Plus, { className: "
|
|
8852
|
-
))
|
|
9041
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Plus, { className: "size-4 text-[#2B4B7C]" })
|
|
9042
|
+
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-right" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] font-bold text-[18px] text-[#E67E50]" }, formatPrice(itemTotal)), /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[11px] text-[#676c80]" }, formatPrice(unitPrice), " each")))))
|
|
8853
9043
|
);
|
|
8854
9044
|
}
|
|
8855
9045
|
function CartScreen() {
|
|
8856
9046
|
const router = navigation.useRouter();
|
|
8857
9047
|
const { cart, isLoading } = useCart();
|
|
8858
9048
|
const { buildPath } = useBasePath();
|
|
9049
|
+
const { isAuthenticated, user } = useAuth();
|
|
9050
|
+
const notification = useNotification();
|
|
8859
9051
|
if (!cart || cart.cartBody.items.length === 0) {
|
|
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: "
|
|
9052
|
+
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: "flex flex-col items-center justify-center py-20" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8861
9053
|
framerMotion.motion.div,
|
|
8862
9054
|
{
|
|
8863
9055
|
initial: { opacity: 0, y: 24 },
|
|
8864
9056
|
animate: { opacity: 1, y: 0 },
|
|
8865
9057
|
className: "text-center space-y-6 max-w-md"
|
|
8866
9058
|
},
|
|
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-
|
|
8868
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-2xl font-bold text-
|
|
9059
|
+
/* @__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-secondary" }))),
|
|
9060
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-2xl font-bold text-secondary" }, "Your cart is empty"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-muted" }, "Start adding products to your cart to see them here.")),
|
|
8869
9061
|
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap gap-3 justify-center" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8870
9062
|
"button",
|
|
8871
9063
|
{
|
|
8872
9064
|
type: "button",
|
|
8873
9065
|
onClick: () => router.push(buildPath("/shop")),
|
|
8874
|
-
className: "rounded-
|
|
9066
|
+
className: "rounded-xl border-2 border-primary bg-primary text-white px-6 py-3 text-sm font-medium transition-colors flex items-center justify-center gap-2 hover:opacity-80"
|
|
8875
9067
|
},
|
|
8876
9068
|
"Discover products",
|
|
8877
9069
|
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ArrowRight, { className: "h-5 w-5" })
|
|
8878
9070
|
)),
|
|
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-
|
|
9071
|
+
/* @__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-secondary 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-secondary 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-secondary flex-shrink-0 mt-0.5" }), /* @__PURE__ */ React21__default.default.createElement("span", null, "Secure checkout process")))
|
|
8880
9072
|
)))));
|
|
8881
9073
|
}
|
|
8882
9074
|
const subtotal = cart.total;
|
|
@@ -8884,12 +9076,23 @@ function CartScreen() {
|
|
|
8884
9076
|
const tax = 0;
|
|
8885
9077
|
const total = subtotal + shipping + tax;
|
|
8886
9078
|
const itemCount = cart.cartBody.items.length;
|
|
8887
|
-
|
|
9079
|
+
const handleSubmit = async (e) => {
|
|
9080
|
+
if (!isAuthenticated) {
|
|
9081
|
+
notification.error(
|
|
9082
|
+
"Sign-in required",
|
|
9083
|
+
"Please log in to complete your checkout."
|
|
9084
|
+
);
|
|
9085
|
+
setTimeout(() => router.push(buildPath("/login?redirect=/checkout")), 50);
|
|
9086
|
+
return;
|
|
9087
|
+
}
|
|
9088
|
+
router.push(buildPath("/checkout"));
|
|
9089
|
+
};
|
|
9090
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-white" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "max-w-[1400px] mx-auto px-8 md:px-12" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4 py-8" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-12" }, /* @__PURE__ */ React21__default.default.createElement("h1", { className: "font-['Poppins',sans-serif] font-semibold text-secondary tracking-[-2px] mb-2 text-4xl" }, "Shopping Cart"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[16px] text-muted" }, itemCount, " ", itemCount === 1 ? "item" : "items", " in your cart")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-1 lg:grid-cols-3 gap-8" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
8888
9091
|
framerMotion.motion.section,
|
|
8889
9092
|
{
|
|
8890
9093
|
initial: { opacity: 0, y: 24 },
|
|
8891
9094
|
animate: { opacity: 1, y: 0 },
|
|
8892
|
-
className: "space-y-6"
|
|
9095
|
+
className: "space-y-6 lg:col-span-2"
|
|
8893
9096
|
},
|
|
8894
9097
|
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
9098
|
/* @__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 })))
|
|
@@ -8899,13 +9102,13 @@ function CartScreen() {
|
|
|
8899
9102
|
initial: { opacity: 0, y: 24 },
|
|
8900
9103
|
animate: { opacity: 1, y: 0 },
|
|
8901
9104
|
transition: { delay: 0.1 },
|
|
8902
|
-
className: "space-y-6 lg:sticky lg:top-
|
|
9105
|
+
className: "space-y-6 lg:sticky lg:top-24 h-fit lg:col-span-1"
|
|
8903
9106
|
},
|
|
8904
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-
|
|
9107
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-gradient-to-br from-[#5B9BD5]/10 to-[#2B4B7C]/10 rounded-[24px] p-8 border-2 border-[#5B9BD5]/20 sticky top-24" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "font-['Poppins',sans-serif] font-semibold text-secondary 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" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] text-[14px] text-muted" }, "Subtotal (", itemCount, " ", itemCount === 1 ? "item" : "items", ")"), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] font-semibold text-[14px] text-secondary" }, 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-secondary" }, "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
9108
|
"button",
|
|
8906
9109
|
{
|
|
8907
|
-
type: "
|
|
8908
|
-
onClick:
|
|
9110
|
+
type: "submit",
|
|
9111
|
+
onClick: handleSubmit,
|
|
8909
9112
|
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"
|
|
8910
9113
|
},
|
|
8911
9114
|
"Proceed to Checkout",
|
|
@@ -8915,11 +9118,10 @@ function CartScreen() {
|
|
|
8915
9118
|
{
|
|
8916
9119
|
type: "button",
|
|
8917
9120
|
onClick: () => router.push(buildPath("/shop")),
|
|
8918
|
-
className: "w-full rounded-full border-2 border-
|
|
9121
|
+
className: "w-full rounded-full border-2 border-muted bg-white px-4 py-3 text-sm font-medium text-slate-700 hover:bg-gray-50 transition-colors"
|
|
8919
9122
|
},
|
|
8920
9123
|
"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-
|
|
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."))
|
|
9124
|
+
)), /* @__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-muted 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-muted flex-shrink-0 mt-0.5" }), /* @__PURE__ */ React21__default.default.createElement("span", null, "Secure checkout process"))))
|
|
8923
9125
|
)))));
|
|
8924
9126
|
}
|
|
8925
9127
|
function useAddresses() {
|
|
@@ -8980,15 +9182,6 @@ function useAddresses() {
|
|
|
8980
9182
|
markAsDefault
|
|
8981
9183
|
};
|
|
8982
9184
|
}
|
|
8983
|
-
function Card({ className = "", ...props }) {
|
|
8984
|
-
return /* @__PURE__ */ React21__default.default.createElement(
|
|
8985
|
-
"div",
|
|
8986
|
-
{
|
|
8987
|
-
className: `rounded-lg border bg-white shadow-sm ${className}`,
|
|
8988
|
-
...props
|
|
8989
|
-
}
|
|
8990
|
-
);
|
|
8991
|
-
}
|
|
8992
9185
|
function Modal({ isOpen, onClose, title, children, size = "md" }) {
|
|
8993
9186
|
React21.useEffect(() => {
|
|
8994
9187
|
if (typeof window === "undefined") return;
|
|
@@ -9045,8 +9238,11 @@ var addressSchema = zod.z.object({
|
|
|
9045
9238
|
country: zod.z.string().min(2, "Country is required"),
|
|
9046
9239
|
phone: zod.z.string().min(10, "Phone number is required")
|
|
9047
9240
|
});
|
|
9241
|
+
|
|
9242
|
+
// src/components/AddressFormModal.tsx
|
|
9048
9243
|
function AddressFormModal({ isOpen, onClose, onAddressAdded, onAddressUpdated, initialAddress }) {
|
|
9049
9244
|
const [isSubmitting, setIsSubmitting] = React21.useState(false);
|
|
9245
|
+
const notification = useNotification();
|
|
9050
9246
|
const {
|
|
9051
9247
|
register,
|
|
9052
9248
|
handleSubmit,
|
|
@@ -9092,7 +9288,10 @@ function AddressFormModal({ isOpen, onClose, onAddressAdded, onAddressUpdated, i
|
|
|
9092
9288
|
country: data.country,
|
|
9093
9289
|
phone: data.phone
|
|
9094
9290
|
}, initialAddress.id);
|
|
9095
|
-
|
|
9291
|
+
notification.success(
|
|
9292
|
+
"Address updated",
|
|
9293
|
+
"Your address has been updated successfully."
|
|
9294
|
+
);
|
|
9096
9295
|
reset();
|
|
9097
9296
|
onClose();
|
|
9098
9297
|
if (onAddressUpdated) onAddressUpdated(response.data);
|
|
@@ -9108,16 +9307,25 @@ function AddressFormModal({ isOpen, onClose, onAddressAdded, onAddressUpdated, i
|
|
|
9108
9307
|
phone: data.phone
|
|
9109
9308
|
});
|
|
9110
9309
|
if (response.status === 201) {
|
|
9111
|
-
|
|
9310
|
+
notification.success(
|
|
9311
|
+
"Address added",
|
|
9312
|
+
"Your new address has been saved to your account."
|
|
9313
|
+
);
|
|
9112
9314
|
reset();
|
|
9113
9315
|
onClose();
|
|
9114
9316
|
if (onAddressAdded) onAddressAdded(response.data);
|
|
9115
9317
|
} else {
|
|
9116
|
-
|
|
9318
|
+
notification.error(
|
|
9319
|
+
"Could not add address",
|
|
9320
|
+
"We could not save this address. Please try again."
|
|
9321
|
+
);
|
|
9117
9322
|
}
|
|
9118
9323
|
}
|
|
9119
9324
|
} catch (error) {
|
|
9120
|
-
|
|
9325
|
+
notification.error(
|
|
9326
|
+
"Could not save address",
|
|
9327
|
+
"Something went wrong while saving your address. Please try again."
|
|
9328
|
+
);
|
|
9121
9329
|
} finally {
|
|
9122
9330
|
setIsSubmitting(false);
|
|
9123
9331
|
}
|
|
@@ -9194,14 +9402,14 @@ function AddressFormModal({ isOpen, onClose, onAddressAdded, onAddressUpdated, i
|
|
|
9194
9402
|
error: errors.country?.message
|
|
9195
9403
|
}
|
|
9196
9404
|
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex justify-end gap-4" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
9197
|
-
|
|
9405
|
+
"button",
|
|
9198
9406
|
{
|
|
9199
9407
|
type: "button",
|
|
9200
|
-
|
|
9201
|
-
|
|
9408
|
+
onClick: onClose,
|
|
9409
|
+
className: "flex flex-row items-center gap-2 px-6 py-2 border border-slate-200 rounded-xl text-slate-700 hover:opacity-80 transition-colors text-secondary text-sm"
|
|
9202
9410
|
},
|
|
9203
9411
|
"Cancel"
|
|
9204
|
-
), /* @__PURE__ */ React21__default.default.createElement(
|
|
9412
|
+
), /* @__PURE__ */ React21__default.default.createElement("button", { type: "submit", disabled: isSubmitting, className: "flex flex-row items-center gap-2 px-6 py-2 border border-slate-200 rounded-xl text-slate-700 hover:opacity-80 transition-colors bg-secondary text-white text-sm" }, isSubmitting ? "Adding Address..." : "Add Address")))
|
|
9205
9413
|
);
|
|
9206
9414
|
}
|
|
9207
9415
|
var checkoutSchema = zod.z.object({
|
|
@@ -9250,6 +9458,7 @@ function CheckoutScreen() {
|
|
|
9250
9458
|
const [isAddressModalOpen, setIsAddressModalOpen] = React21.useState(false);
|
|
9251
9459
|
const [editingAddress, setEditingAddress] = React21.useState(null);
|
|
9252
9460
|
const [shippingPrice, setShippingPrice] = React21.useState(0);
|
|
9461
|
+
const notification = useNotification();
|
|
9253
9462
|
const {
|
|
9254
9463
|
addresses: userAddresses,
|
|
9255
9464
|
defaultAddress
|
|
@@ -9379,7 +9588,10 @@ function CheckoutScreen() {
|
|
|
9379
9588
|
const onSubmit = async (data) => {
|
|
9380
9589
|
setError(null);
|
|
9381
9590
|
if (!isAuthenticated) {
|
|
9382
|
-
|
|
9591
|
+
notification.error(
|
|
9592
|
+
"Sign-in required",
|
|
9593
|
+
"Please log in to complete your checkout."
|
|
9594
|
+
);
|
|
9383
9595
|
setTimeout(() => router.push(buildPath("/login?redirect=/checkout")), 50);
|
|
9384
9596
|
return;
|
|
9385
9597
|
}
|
|
@@ -9431,7 +9643,10 @@ function CheckoutScreen() {
|
|
|
9431
9643
|
}
|
|
9432
9644
|
}
|
|
9433
9645
|
setIsSubmitting(true);
|
|
9434
|
-
|
|
9646
|
+
notification.info(
|
|
9647
|
+
"Submitting order",
|
|
9648
|
+
"We are processing your order and preparing your payment options."
|
|
9649
|
+
);
|
|
9435
9650
|
try {
|
|
9436
9651
|
const items = (cart?.cartBody?.items || []).map((item) => ({
|
|
9437
9652
|
productVariantId: String(item.productVariantId),
|
|
@@ -9463,7 +9678,10 @@ function CheckoutScreen() {
|
|
|
9463
9678
|
);
|
|
9464
9679
|
if (response?.data?.payment && response.data.payment.hostedInvoiceUrl === "INSUFFICIENT_CREDIT") {
|
|
9465
9680
|
setError("You have insufficient credit to complete this order.");
|
|
9466
|
-
|
|
9681
|
+
notification.error(
|
|
9682
|
+
"Insufficient credit",
|
|
9683
|
+
"You do not have enough credit to complete this order."
|
|
9684
|
+
);
|
|
9467
9685
|
return;
|
|
9468
9686
|
}
|
|
9469
9687
|
if (paymentMethod === "Card") {
|
|
@@ -9482,21 +9700,33 @@ function CheckoutScreen() {
|
|
|
9482
9700
|
} else if (!paymentUrl) {
|
|
9483
9701
|
console.error("No payment URL received in response:", response.data);
|
|
9484
9702
|
setError("Failed to initiate payment. Please try again or contact support.");
|
|
9485
|
-
|
|
9703
|
+
notification.error(
|
|
9704
|
+
"Payment setup failed",
|
|
9705
|
+
"We could not start the payment flow. Please try again or contact support."
|
|
9706
|
+
);
|
|
9486
9707
|
return;
|
|
9487
9708
|
}
|
|
9488
|
-
|
|
9709
|
+
notification.success(
|
|
9710
|
+
"Order placed",
|
|
9711
|
+
"Your order has been placed successfully. You will be redirected to payment."
|
|
9712
|
+
);
|
|
9489
9713
|
await clearCart();
|
|
9490
9714
|
router.push(buildPath(`/orders/${response.data?.id}`));
|
|
9491
9715
|
} else {
|
|
9492
|
-
|
|
9716
|
+
notification.success(
|
|
9717
|
+
"Order placed",
|
|
9718
|
+
"Your order has been placed successfully."
|
|
9719
|
+
);
|
|
9493
9720
|
await clearCart();
|
|
9494
9721
|
router.push(buildPath(`/orders/${response.data?.id}`));
|
|
9495
9722
|
}
|
|
9496
9723
|
} catch (err) {
|
|
9497
9724
|
const msg = err?.message || err?.response?.data?.message || "Failed to place order";
|
|
9498
9725
|
setError(msg);
|
|
9499
|
-
|
|
9726
|
+
notification.error(
|
|
9727
|
+
"Could not place order",
|
|
9728
|
+
msg
|
|
9729
|
+
);
|
|
9500
9730
|
} finally {
|
|
9501
9731
|
setIsSubmitting(false);
|
|
9502
9732
|
}
|
|
@@ -9508,14 +9738,15 @@ function CheckoutScreen() {
|
|
|
9508
9738
|
const subtotal = cart.total;
|
|
9509
9739
|
const tax = 0;
|
|
9510
9740
|
const total = subtotal + shippingPrice + tax;
|
|
9511
|
-
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-
|
|
9741
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-white pb-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(
|
|
9512
9742
|
framerMotion.motion.div,
|
|
9513
9743
|
{
|
|
9514
9744
|
initial: { opacity: 0, y: 24 },
|
|
9515
9745
|
animate: { opacity: 1, y: 0 },
|
|
9516
9746
|
className: "space-y-8"
|
|
9517
9747
|
},
|
|
9518
|
-
/* @__PURE__ */ React21__default.default.createElement("
|
|
9748
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-12" }, /* @__PURE__ */ React21__default.default.createElement("h1", { className: "font-['Poppins',sans-serif] font-semibold text-[#2B4B7C] mb-2 text-3xl" }, "Checkout"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[14px] text-[#676c80] text-md leading-relaxed" }, "Complete your order information below")),
|
|
9749
|
+
/* @__PURE__ */ React21__default.default.createElement("section", { className: "bg-white border-2 border-gray-100 rounded-[24px] p-8 text-[#2B4B7C]" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap items-center justify-between gap-4" }, /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "font-['Poppins',sans-serif] font-semibold text-[#2B4B7C] mb-2 text-2xl" }, "Contact Information"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-slate-500" }, "We use temperature-aware packaging and real-time tracking on every shipment.")), /* @__PURE__ */ React21__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full bg-primary-50 px-3 py-1 text-xs font-semibold uppercase tracking-wide text-primary-700" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Truck, { className: "h-4 w-4" }), "Dispatch in 12h")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-6 grid grid-cols-1 gap-4 md:grid-cols-2" }, isDelivery && /* @__PURE__ */ React21__default.default.createElement("div", { className: "md:col-span-2 space-y-4" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React21__default.default.createElement("label", { className: "block font-semibold" }, "Select Address"), /* @__PURE__ */ React21__default.default.createElement(
|
|
9519
9750
|
Button,
|
|
9520
9751
|
{
|
|
9521
9752
|
type: "button",
|
|
@@ -9579,9 +9810,9 @@ function CheckoutScreen() {
|
|
|
9579
9810
|
try {
|
|
9580
9811
|
await removeAddress(addr.id);
|
|
9581
9812
|
if (selectedAddressId === addr.id) setSelectedAddressId(null);
|
|
9582
|
-
|
|
9813
|
+
notification.success("Address deleted");
|
|
9583
9814
|
} catch (e2) {
|
|
9584
|
-
|
|
9815
|
+
notification.error("Failed to delete address");
|
|
9585
9816
|
}
|
|
9586
9817
|
},
|
|
9587
9818
|
className: "inline-flex items-center gap-1 rounded-full border border-red-200 px-2.5 py-0.5 text-xs font-semibold text-red-600 hover:border-red-300 hover:text-red-700"
|
|
@@ -9598,7 +9829,7 @@ function CheckoutScreen() {
|
|
|
9598
9829
|
},
|
|
9599
9830
|
storeAddresses.map((addr) => /* @__PURE__ */ React21__default.default.createElement("option", { key: addr.id, value: addr.id }, addr.name, " - ", addr.street1, ", ", addr.city))
|
|
9600
9831
|
)))),
|
|
9601
|
-
isDelivery && selectedAddressId && /* @__PURE__ */ React21__default.default.createElement(
|
|
9832
|
+
isDelivery && selectedAddressId && /* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-white border-2 border-gray-100 rounded-[24px] p-8 text-[#2B4B7C]" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3 text-xl font-semibold text-gray-900 pb-4 mb-8 border-b" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Truck, { className: "text-accent w-8 h-8 flex items-center justify-center text-[#2B4B7C]" }), /* @__PURE__ */ React21__default.default.createElement("h2", { className: "font-['Poppins',sans-serif] font-semibold text-[#2B4B7C] text-2xl" }, "Shipping Options")), shippingRatesLoading ? /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-center py-12" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-accent" }), /* @__PURE__ */ React21__default.default.createElement("span", { className: "ml-3 text-gray-600" }, "Loading shipping options...")) : shippingRatesError ? /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-center py-12" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "w-16 h-16 mx-auto mb-4 bg-red-100 rounded-full flex items-center justify-center" }, /* @__PURE__ */ React21__default.default.createElement("svg", { className: "w-8 h-8 text-red-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React21__default.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }))), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-red-500 text-lg font-medium" }, "Error loading shipping options"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-red-400 text-sm mt-1" }, shippingRatesError)) : shippingRates && shippingRates.length > 0 ? /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-4" }, shippingRates.map((rate) => {
|
|
9602
9833
|
const isSelected = !!selectedShippingRateId && selectedShippingRateId === rate.objectId;
|
|
9603
9834
|
const isTest = rate.test;
|
|
9604
9835
|
const hasAttributes = rate.attributes && rate.attributes.length > 0;
|
|
@@ -9613,7 +9844,7 @@ function CheckoutScreen() {
|
|
|
9613
9844
|
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"}`
|
|
9614
9845
|
},
|
|
9615
9846
|
/* @__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(
|
|
9616
|
-
|
|
9847
|
+
Image4__default.default,
|
|
9617
9848
|
{
|
|
9618
9849
|
src: rate.providerImage75 || "/placeholder-product.jpg",
|
|
9619
9850
|
alt: rate.provider,
|
|
@@ -9635,16 +9866,8 @@ function CheckoutScreen() {
|
|
|
9635
9866
|
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-1 text-sm text-gray-600" }, rate.durationTerms && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React21__default.default.createElement("svg", { className: "w-4 h-4 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React21__default.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" })), /* @__PURE__ */ React21__default.default.createElement("span", null, rate.durationTerms)), rate.estimatedDays && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React21__default.default.createElement("svg", { className: "w-4 h-4 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React21__default.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" })), /* @__PURE__ */ React21__default.default.createElement("span", null, "Estimated ", rate.estimatedDays, " day", rate.estimatedDays !== 1 ? "s" : "")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React21__default.default.createElement("svg", { className: "w-4 h-4 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React21__default.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M9 5H7a2 2 0 00-2 2v10a2 2 0 002 2h8a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" })), /* @__PURE__ */ React21__default.default.createElement("span", null, "Carrier: ", rate.provider)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React21__default.default.createElement("svg", { className: "w-4 h-4 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React21__default.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1" })), /* @__PURE__ */ React21__default.default.createElement("span", null, "Currency: ", rate.currency))))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-col items-end" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-2xl font-bold text-gray-900" }, formatPrice(parseFloat(rate.amount))), rate.amount !== rate.amountLocal && /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-sm text-gray-500" }, rate.amountLocal, " ", rate.currencyLocal))),
|
|
9636
9867
|
isSelected && /* @__PURE__ */ React21__default.default.createElement("div", { className: "absolute top-3 right-3" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "w-6 h-6 bg-primary-500 rounded-full flex items-center justify-center" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Check, { className: "w-4 h-4 text-white" })))
|
|
9637
9868
|
);
|
|
9638
|
-
})) : /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-center py-12" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "w-16 h-16 mx-auto mb-4 bg-gray-100 rounded-full flex items-center justify-center" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Truck, { className: "w-8 h-8 text-gray-400" })), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-gray-500 text-lg font-medium" }, "No shipping options available"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-gray-400 text-sm mt-1" }, "Please check the shipping address or try a different location.")))
|
|
9639
|
-
|
|
9640
|
-
framerMotion.motion.aside,
|
|
9641
|
-
{
|
|
9642
|
-
initial: { opacity: 0, y: 32 },
|
|
9643
|
-
animate: { opacity: 1, y: 0 },
|
|
9644
|
-
transition: { duration: 0.5, ease: "easeOut", delay: 0.1 },
|
|
9645
|
-
className: "space-y-10 lg:sticky lg:top-24"
|
|
9646
|
-
},
|
|
9647
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-3xl border border-slate-100 bg-white p-6 shadow-xl shadow-primary-50/50 transition hover:shadow-primary-100/60" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-2xl font-semibold text-slate-900" }, "Order Summary"), /* @__PURE__ */ React21__default.default.createElement("section", { className: "mt-6 space-y-4" }, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "text-xs font-semibold text-slate-700 uppercase tracking-wider" }, "Delivery Method"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-1 gap-3" }, [
|
|
9869
|
+
})) : /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-center py-12" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "w-16 h-16 mx-auto mb-4 bg-gray-100 rounded-full flex items-center justify-center" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Truck, { className: "w-8 h-8 text-gray-400" })), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-gray-500 text-lg font-medium" }, "No shipping options available"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-gray-400 text-sm mt-1" }, "Please check the shipping address or try a different location."))),
|
|
9870
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-white border-2 border-gray-100 rounded-[24px] p-8" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3 mb-6" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Truck, { className: "w-8 h-8 text-[#2B4B7C]" }), /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-2xl font-semibold text-[#2B4B7C]" }, "Delivery Method")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-1 gap-3" }, [
|
|
9648
9871
|
{
|
|
9649
9872
|
label: "Delivery",
|
|
9650
9873
|
icon: /* @__PURE__ */ React21__default.default.createElement(lucideReact.Truck, { className: "w-5 h-5" }),
|
|
@@ -9664,20 +9887,25 @@ function CheckoutScreen() {
|
|
|
9664
9887
|
{
|
|
9665
9888
|
key: option.label,
|
|
9666
9889
|
type: "button",
|
|
9667
|
-
onClick: () =>
|
|
9668
|
-
|
|
9669
|
-
|
|
9890
|
+
onClick: () => {
|
|
9891
|
+
setIsDelivery(option.value);
|
|
9892
|
+
if (option.value) {
|
|
9893
|
+
setSelectedShippingRateId(null);
|
|
9894
|
+
setShippingPrice(0);
|
|
9895
|
+
}
|
|
9896
|
+
},
|
|
9897
|
+
className: `relative flex w-full items-center justify-between rounded-xl border-2 p-4 transition-all duration-200 ${active ? "border-primary-500 bg-primary-50" : "border-gray-200 hover:border-primary-300"}`
|
|
9670
9898
|
},
|
|
9671
9899
|
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
9672
9900
|
"div",
|
|
9673
9901
|
{
|
|
9674
|
-
className: `p-2 rounded-lg ${active ? "bg-primary-100 text-primary-600" : "bg-
|
|
9902
|
+
className: `p-2 rounded-lg ${active ? "bg-primary-100 text-primary-600" : "bg-gray-100 text-gray-600"}`
|
|
9675
9903
|
},
|
|
9676
9904
|
option.icon
|
|
9677
|
-
), /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-left" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "font-medium text-
|
|
9678
|
-
active && /* @__PURE__ */ React21__default.default.createElement("div", { className: "w-5 h-5 rounded-full bg-primary-500 flex items-center justify-center
|
|
9905
|
+
), /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-left" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "font-medium text-gray-900" }, option.label), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-gray-500" }, option.desc))),
|
|
9906
|
+
active && /* @__PURE__ */ React21__default.default.createElement("div", { className: "w-5 h-5 rounded-full bg-primary-500 flex items-center justify-center" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Check, { className: "w-3 h-3 text-white" }))
|
|
9679
9907
|
);
|
|
9680
|
-
}))), /* @__PURE__ */ React21__default.default.createElement("
|
|
9908
|
+
}))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-white border-2 border-gray-100 rounded-[24px] p-8" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3 mb-6" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.CreditCard, { className: "w-8 h-8 text-[#2B4B7C]" }), /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-2xl font-semibold text-[#2B4B7C]" }, "Payment Method")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid gap-4 md:grid-cols-3" }, PAYMENT_METHODS.map((pm) => {
|
|
9681
9909
|
const active = paymentMethod === pm.value;
|
|
9682
9910
|
return /* @__PURE__ */ React21__default.default.createElement(
|
|
9683
9911
|
"button",
|
|
@@ -9685,47 +9913,46 @@ function CheckoutScreen() {
|
|
|
9685
9913
|
key: pm.value,
|
|
9686
9914
|
type: "button",
|
|
9687
9915
|
onClick: () => setPaymentMethod(pm.value),
|
|
9688
|
-
className: `
|
|
9916
|
+
className: `
|
|
9917
|
+
group relative flex w-full items-center justify-between rounded-xl border-2 p-3
|
|
9918
|
+
transition-all duration-200 ease-out
|
|
9919
|
+
focus:outline-none f
|
|
9920
|
+
${active ? `${pm.activeClass} shadow-md scale-[1.02]` : `${pm.className} border-gray-200 bg-white hover:shadow-sm hover:-translate-y-0.5`}
|
|
9921
|
+
`
|
|
9689
9922
|
},
|
|
9690
9923
|
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
9691
9924
|
"div",
|
|
9692
9925
|
{
|
|
9693
|
-
className: `
|
|
9926
|
+
className: `
|
|
9927
|
+
flex items-center justify-center rounded-lg p-2
|
|
9928
|
+
transition-colors duration-200
|
|
9929
|
+
${pm.value === "Card" ? " text-blue-600" : pm.value === "Cash" ? " text-amber-600" : " text-emerald-600"}
|
|
9930
|
+
${active ? "opacity-80" : "group-hover:opacity-90"}
|
|
9931
|
+
`
|
|
9694
9932
|
},
|
|
9695
9933
|
pm.icon
|
|
9696
|
-
), /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-sm font-
|
|
9697
|
-
active && /* @__PURE__ */ React21__default.default.createElement("div", { className: "
|
|
9934
|
+
), /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-sm font-semibold text-gray-900" }, pm.label)),
|
|
9935
|
+
active && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex h-6 w-6 items-center justify-center rounded-full shadow-sm" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Check, { className: "h-3.5 w-3.5 text-white" }))
|
|
9698
9936
|
);
|
|
9699
|
-
})), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-
|
|
9700
|
-
|
|
9701
|
-
|
|
9702
|
-
|
|
9703
|
-
|
|
9704
|
-
},
|
|
9705
|
-
|
|
9706
|
-
|
|
9707
|
-
|
|
9708
|
-
|
|
9709
|
-
alt: item.productVariantData.name,
|
|
9710
|
-
width: 64,
|
|
9711
|
-
height: 64,
|
|
9712
|
-
className: "object-contain"
|
|
9713
|
-
}
|
|
9714
|
-
)),
|
|
9715
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex-1" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm font-semibold text-slate-900" }, item?.productVariantData?.name), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xs text-slate-500" }, "Qty ", item.quantity)),
|
|
9716
|
-
/* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm font-semibold text-slate-900" }, formatPrice(item.productVariantData.finalPrice * item.quantity))
|
|
9717
|
-
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-6 space-y-3 text-sm text-slate-600" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React21__default.default.createElement("span", null, "Subtotal"), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-semibold text-slate-900" }, formatPrice(subtotal))), isDelivery && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React21__default.default.createElement("span", null, "Shipping"), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-semibold" }, formatPrice(shippingPrice))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React21__default.default.createElement("span", null, "Estimated tax"), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-semibold" }, formatPrice(tax))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-2xl bg-slate-50 p-4" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between text-base font-semibold text-slate-900" }, /* @__PURE__ */ React21__default.default.createElement("span", null, "Total Due"), /* @__PURE__ */ React21__default.default.createElement("span", null, formatPrice(total))), /* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-1 text-xs text-slate-500" }, "Tax is estimated. Final amount confirmed after payment.")))), /* @__PURE__ */ React21__default.default.createElement(
|
|
9937
|
+
})), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-gray-500 mt-4" }, 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.")))
|
|
9938
|
+
), /* @__PURE__ */ React21__default.default.createElement(
|
|
9939
|
+
framerMotion.motion.aside,
|
|
9940
|
+
{
|
|
9941
|
+
initial: { opacity: 0, y: 32 },
|
|
9942
|
+
animate: { opacity: 1, y: 0 },
|
|
9943
|
+
transition: { duration: 0.5, ease: "easeOut", delay: 0.1 },
|
|
9944
|
+
className: "space-y-10 lg:sticky lg:top-24 lg:col-span-1"
|
|
9945
|
+
},
|
|
9946
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-gradient-to-br from-[#5B9BD5]/10 to-[#2B4B7C]/10 rounded-[24px] p-8 border-2 border-[#5B9BD5]/20 sticky top-24" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "font-['Poppins',sans-serif] font-semibold text-[#2B4B7C] mb-6 text-2xl" }, "Order Summary"), /* @__PURE__ */ React21__default.default.createElement("section", { className: "mt-8 pt-6 border-t border-slate-100" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-4 mb-6" }, cart?.cartBody?.items?.map((item) => /* @__PURE__ */ React21__default.default.createElement("div", { key: `${item.productId}-${item.color}-${item.size}`, className: "flex gap-3" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "w-16 h-16 rounded-xl overflow-hidden bg-white shrink-0" }, /* @__PURE__ */ React21__default.default.createElement(Image4__default.default, { src: item.productVariantData.productMedia?.[0]?.file || "/placeholder-product.jpg", alt: item.productVariantData.name, className: "w-full h-full object-cover", height: 200, width: 200 })), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] font-medium text-[12px] text-[#2B4B7C] mb-1" }, item?.productVariantData?.name), /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[11px] text-[#676c80]" }, item?.productVariantData?.brand, " \u2022 Qty: ", item.quantity), /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] font-semibold text-[12px] text-[#E67E50] mt-1" }, formatPrice(item.productVariantData.finalPrice * item.quantity)))))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "h-px bg-[#5B9BD5]/20 my-4" }), /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-sm text-slate-600 space-y-3 py-4" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React21__default.default.createElement("span", null, "Subtotal"), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-semibold text-slate-900" }, formatPrice(subtotal))), isDelivery && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React21__default.default.createElement("span", null, "Shipping"), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-semibold" }, formatPrice(shippingPrice))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React21__default.default.createElement("span", null, "Estimated tax"), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-semibold" }, formatPrice(tax))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "h-px bg-[#5B9BD5]/20 mt-6" }), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between mb-6" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] font-semibold text-[16px] text-[#2B4B7C]" }, "Total"), /* @__PURE__ */ React21__default.default.createElement("span", { className: "font-['Poppins',sans-serif] font-bold text-[24px] text-[#E67E50]" }, formatPrice(total)))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-white/80 rounded-xl p-4" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-['Poppins',sans-serif] text-[11px] text-[#676c80] leading-[1.6]" }, /* @__PURE__ */ React21__default.default.createElement("strong", { className: "text-[#2B4B7C]" }, "Payment:"), " We'll contact you to arrange payment upon pickup or delivery. We accept cash, credit cards, and all major payment methods."))), /* @__PURE__ */ React21__default.default.createElement(
|
|
9718
9947
|
Button,
|
|
9719
9948
|
{
|
|
9720
9949
|
type: "submit",
|
|
9721
|
-
size: "lg",
|
|
9722
9950
|
isLoading: isSubmitting,
|
|
9723
|
-
className: "
|
|
9951
|
+
className: "font-['Poppins',sans-serif] font-medium text-[14px] px-6 py-2 rounded-full bg-[#E67E50] text-white hover:bg-[#d66f45] hover:shadow-lg transition-all duration-300 mt-4 w-full"
|
|
9724
9952
|
},
|
|
9725
9953
|
/* @__PURE__ */ React21__default.default.createElement(lucideReact.CreditCard, { className: "h-5 w-5" }),
|
|
9726
9954
|
isSubmitting ? "Placing order..." : "Place Secure Order"
|
|
9727
|
-
), /* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-4 flex items-center justify-center gap-2 text-xs text-slate-500" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Lock, { className: "h-4 w-4" }), "Fully encrypted checkout \u2014 cancel anytime before shipment."))
|
|
9728
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-3xl border border-primary-100 bg-primary-50/80 p-6 text-sm text-primary-700 shadow-sm hover:shadow-md transition-shadow" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "font-semibold uppercase tracking-[0.3em] text-primary-800" }, "Why Patients Choose Us"), /* @__PURE__ */ React21__default.default.createElement("ul", { className: "mt-4 space-y-3 text-primary-700 leading-relaxed" }, /* @__PURE__ */ React21__default.default.createElement("li", { className: "flex items-start gap-3" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.PackageCheck, { className: "mt-0.5 h-4 w-4 shrink-0" }), /* @__PURE__ */ React21__default.default.createElement("span", null, "Pharmacy-grade verification on every order.")), /* @__PURE__ */ React21__default.default.createElement("li", { className: "flex items-start gap-3" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.ShieldCheck, { className: "mt-0.5 h-4 w-4 shrink-0" }), /* @__PURE__ */ React21__default.default.createElement("span", null, "Cold-chain logistics for sensitive medications.")), /* @__PURE__ */ React21__default.default.createElement("li", { className: "flex items-start gap-3" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Truck, { className: "mt-0.5 h-4 w-4 shrink-0" }), /* @__PURE__ */ React21__default.default.createElement("span", null, "Real-time tracking and SMS updates from prep to delivery."))))
|
|
9955
|
+
), /* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-4 flex items-center justify-center gap-2 text-xs text-slate-500" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Lock, { className: "h-4 w-4" }), "Fully encrypted checkout \u2014 cancel anytime before shipment."))
|
|
9729
9956
|
))), /* @__PURE__ */ React21__default.default.createElement(
|
|
9730
9957
|
AddressFormModal,
|
|
9731
9958
|
{
|
|
@@ -9760,9 +9987,12 @@ function LoginScreen() {
|
|
|
9760
9987
|
const { buildPath } = useBasePath();
|
|
9761
9988
|
const searchParams = navigation.useSearchParams();
|
|
9762
9989
|
const redirectUrl = searchParams?.get("redirect") || buildPath("/");
|
|
9763
|
-
const { login } = useAuth();
|
|
9990
|
+
const { login, user, isLoading } = useAuth();
|
|
9764
9991
|
const [showPassword, setShowPassword] = React21.useState(false);
|
|
9765
9992
|
const [isSubmitting, setIsSubmitting] = React21.useState(false);
|
|
9993
|
+
const [status, setStatus] = React21.useState(
|
|
9994
|
+
null
|
|
9995
|
+
);
|
|
9766
9996
|
const {
|
|
9767
9997
|
register,
|
|
9768
9998
|
handleSubmit,
|
|
@@ -9772,36 +10002,25 @@ function LoginScreen() {
|
|
|
9772
10002
|
});
|
|
9773
10003
|
const onSubmit = async (data) => {
|
|
9774
10004
|
setIsSubmitting(true);
|
|
10005
|
+
setStatus(null);
|
|
9775
10006
|
try {
|
|
9776
10007
|
await login(data);
|
|
9777
|
-
|
|
10008
|
+
setStatus({ type: "success", message: "Welcome back!" });
|
|
9778
10009
|
router.push(redirectUrl);
|
|
9779
10010
|
} catch (error) {
|
|
9780
|
-
|
|
10011
|
+
setStatus({
|
|
10012
|
+
type: "error",
|
|
10013
|
+
message: error?.response?.data?.message || "Invalid credentials"
|
|
10014
|
+
});
|
|
9781
10015
|
} finally {
|
|
9782
10016
|
setIsSubmitting(false);
|
|
9783
10017
|
}
|
|
9784
10018
|
};
|
|
9785
|
-
|
|
9786
|
-
|
|
9787
|
-
|
|
9788
|
-
|
|
9789
|
-
|
|
9790
|
-
transition: { duration: 0.4 },
|
|
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"
|
|
9792
|
-
},
|
|
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.")),
|
|
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."))),
|
|
9795
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-6 text-sm text-white/80" }, /* @__PURE__ */ React21__default.default.createElement("span", null, "Need an account?"), /* @__PURE__ */ React21__default.default.createElement(
|
|
9796
|
-
Link8__default.default,
|
|
9797
|
-
{
|
|
9798
|
-
href: buildPath("/register"),
|
|
9799
|
-
className: "inline-flex items-center gap-2 rounded-full bg-white/15 px-4 py-2 font-semibold transition hover:bg-white/25"
|
|
9800
|
-
},
|
|
9801
|
-
"Create one now",
|
|
9802
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ArrowRight, { className: "h-4 w-4" })
|
|
9803
|
-
))
|
|
9804
|
-
), /* @__PURE__ */ React21__default.default.createElement(
|
|
10019
|
+
if (!isLoading && user) {
|
|
10020
|
+
router.push(buildPath("/account"));
|
|
10021
|
+
return null;
|
|
10022
|
+
}
|
|
10023
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-gradient-to-b from-[#F8FAFC] to-[#EBF4FB]" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid min-h-screen overflow-hidden pb-12" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
9805
10024
|
framerMotion.motion.section,
|
|
9806
10025
|
{
|
|
9807
10026
|
initial: { opacity: 0, x: 24 },
|
|
@@ -9809,55 +10028,74 @@ function LoginScreen() {
|
|
|
9809
10028
|
transition: { duration: 0.4 },
|
|
9810
10029
|
className: "flex items-center justify-center px-6 py-12 lg:px-16"
|
|
9811
10030
|
},
|
|
9812
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "w-full max-w-
|
|
9813
|
-
|
|
9814
|
-
{
|
|
9815
|
-
type: "email",
|
|
9816
|
-
label: "Email address",
|
|
9817
|
-
placeholder: "you@example.com",
|
|
9818
|
-
...register("email"),
|
|
9819
|
-
error: errors.email?.message
|
|
9820
|
-
}
|
|
9821
|
-
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
9822
|
-
Input,
|
|
9823
|
-
{
|
|
9824
|
-
type: showPassword ? "text" : "password",
|
|
9825
|
-
label: "Password",
|
|
9826
|
-
placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
|
|
9827
|
-
...register("password"),
|
|
9828
|
-
error: errors.password?.message
|
|
9829
|
-
}
|
|
9830
|
-
), /* @__PURE__ */ React21__default.default.createElement(
|
|
9831
|
-
"button",
|
|
9832
|
-
{
|
|
9833
|
-
type: "button",
|
|
9834
|
-
onClick: () => setShowPassword((prev) => !prev),
|
|
9835
|
-
className: "absolute right-3 top-[42px] text-slate-400 transition hover:text-slate-600"
|
|
9836
|
-
},
|
|
9837
|
-
showPassword ? /* @__PURE__ */ React21__default.default.createElement(lucideReact.EyeOff, { className: "h-5 w-5" }) : /* @__PURE__ */ React21__default.default.createElement(lucideReact.Eye, { className: "h-5 w-5" })
|
|
9838
|
-
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between text-sm" }, /* @__PURE__ */ React21__default.default.createElement("label", { className: "flex items-center gap-2 text-slate-600" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
9839
|
-
"input",
|
|
9840
|
-
{
|
|
9841
|
-
type: "checkbox",
|
|
9842
|
-
className: "h-4 w-4 rounded border-slate-300 text-primary-600 focus:ring-primary-500"
|
|
9843
|
-
}
|
|
9844
|
-
), "Remember me"), /* @__PURE__ */ React21__default.default.createElement(
|
|
9845
|
-
Link8__default.default,
|
|
9846
|
-
{
|
|
9847
|
-
href: buildPath("/forgot-password"),
|
|
9848
|
-
className: "font-medium text-primary-600 transition hover:text-primary-700"
|
|
9849
|
-
},
|
|
9850
|
-
"Forgot password?"
|
|
9851
|
-
)), /* @__PURE__ */ React21__default.default.createElement(
|
|
9852
|
-
Button,
|
|
10031
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "w-full max-w-lg space-y-10 text-center" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Lock, { strokeWidth: 2, className: "h-16 w-16 mx-auto text-white rounded-full bg-secondary m-2 mb-4 px-4" }), /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-4xl text-secondary" }, "Welcome Back"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-muted" }, "Sign in to access your patient portal")), /* @__PURE__ */ React21__default.default.createElement(
|
|
10032
|
+
"form",
|
|
9853
10033
|
{
|
|
9854
|
-
|
|
9855
|
-
|
|
9856
|
-
|
|
9857
|
-
|
|
10034
|
+
onSubmit: handleSubmit(onSubmit),
|
|
10035
|
+
className: "space-y-6 rounded-3xl border bg-white p-8",
|
|
10036
|
+
style: {
|
|
10037
|
+
boxShadow: "0px 4px 6px -4px #0000001A, 0px 10px 15px -3px #0000001A"
|
|
10038
|
+
}
|
|
9858
10039
|
},
|
|
9859
|
-
|
|
9860
|
-
|
|
10040
|
+
status && /* @__PURE__ */ React21__default.default.createElement(
|
|
10041
|
+
"div",
|
|
10042
|
+
{
|
|
10043
|
+
className: `flex items-start gap-2 rounded-2xl border px-4 py-3 text-sm ${status.type === "success" ? "border-green-200 bg-green-50 text-green-800" : "border-red-200 bg-red-50 text-red-700"}`
|
|
10044
|
+
},
|
|
10045
|
+
/* @__PURE__ */ React21__default.default.createElement("span", { className: "mt-[2px] text-base" }, status.type === "success" ? "\u2714" : "!"),
|
|
10046
|
+
/* @__PURE__ */ React21__default.default.createElement("span", null, status.message)
|
|
10047
|
+
),
|
|
10048
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "text-start text-secondary" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-sm text-secondary mb-3" }, "Email Address ", /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-primary-500" }, "*")), /* @__PURE__ */ React21__default.default.createElement(
|
|
10049
|
+
Input,
|
|
10050
|
+
{
|
|
10051
|
+
type: "email",
|
|
10052
|
+
placeholder: "you@example.com",
|
|
10053
|
+
...register("email"),
|
|
10054
|
+
error: errors.email?.message,
|
|
10055
|
+
className: "text-secondary"
|
|
10056
|
+
}
|
|
10057
|
+
)),
|
|
10058
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "relative text-start text-secondary" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-sm text-secondary mb-3" }, "Password ", /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-primary-500" }, "*")), /* @__PURE__ */ React21__default.default.createElement(
|
|
10059
|
+
Input,
|
|
10060
|
+
{
|
|
10061
|
+
type: showPassword ? "text" : "password",
|
|
10062
|
+
placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
|
|
10063
|
+
...register("password"),
|
|
10064
|
+
error: errors.password?.message
|
|
10065
|
+
}
|
|
10066
|
+
), /* @__PURE__ */ React21__default.default.createElement(
|
|
10067
|
+
"button",
|
|
10068
|
+
{
|
|
10069
|
+
type: "button",
|
|
10070
|
+
onClick: () => setShowPassword((prev) => !prev),
|
|
10071
|
+
className: "absolute right-3 top-[42px] text-slate-400 transition hover:text-slate-600"
|
|
10072
|
+
},
|
|
10073
|
+
showPassword ? /* @__PURE__ */ React21__default.default.createElement(lucideReact.EyeOff, { className: "h-5 w-5" }) : /* @__PURE__ */ React21__default.default.createElement(lucideReact.Eye, { className: "h-5 w-5" })
|
|
10074
|
+
)),
|
|
10075
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between text-sm" }, /* @__PURE__ */ React21__default.default.createElement("label", { className: "flex items-center gap-2 text-slate-600" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10076
|
+
"input",
|
|
10077
|
+
{
|
|
10078
|
+
type: "checkbox",
|
|
10079
|
+
className: "h-4 w-4 rounded border-slate-300 text-primary-600 focus:ring-primary-500"
|
|
10080
|
+
}
|
|
10081
|
+
), "Remember me"), /* @__PURE__ */ React21__default.default.createElement(
|
|
10082
|
+
Link7__default.default,
|
|
10083
|
+
{
|
|
10084
|
+
href: buildPath("/forgot-password"),
|
|
10085
|
+
className: "font-medium text-primary transition hover:opacity-80"
|
|
10086
|
+
},
|
|
10087
|
+
"Forgot password?"
|
|
10088
|
+
)),
|
|
10089
|
+
/* @__PURE__ */ React21__default.default.createElement(
|
|
10090
|
+
"button",
|
|
10091
|
+
{
|
|
10092
|
+
type: "submit",
|
|
10093
|
+
disabled: isSubmitting,
|
|
10094
|
+
className: "w-full bg-secondary hover:opacity-80 text-white font-medium py-3 px-4 rounded-lg transition-colors disabled:opacity-70 disabled:cursor-not-allowed"
|
|
10095
|
+
},
|
|
10096
|
+
isSubmitting ? "Signing in..." : "Sign in"
|
|
10097
|
+
)
|
|
10098
|
+
), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-4" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-muted" }, "Don't have an account? ", /* @__PURE__ */ React21__default.default.createElement(Link7__default.default, { href: buildPath("/register"), className: "font-medium text-primary transition hover:opacity-90" }, "Sign up"))))
|
|
9861
10099
|
)));
|
|
9862
10100
|
}
|
|
9863
10101
|
var registerSchema = zod.z.object({
|
|
@@ -9871,11 +10109,6 @@ var registerSchema = zod.z.object({
|
|
|
9871
10109
|
message: "Passwords don't match",
|
|
9872
10110
|
path: ["confirmPassword"]
|
|
9873
10111
|
});
|
|
9874
|
-
var BENEFITS = [
|
|
9875
|
-
"Personalized care plans from licensed pharmacists",
|
|
9876
|
-
"Express delivery with cold-chain handling",
|
|
9877
|
-
"Automatic refills and refill reminders"
|
|
9878
|
-
];
|
|
9879
10112
|
function RegisterScreen() {
|
|
9880
10113
|
const router = navigation.useRouter();
|
|
9881
10114
|
const { register: registerUser } = useAuth();
|
|
@@ -9883,6 +10116,7 @@ function RegisterScreen() {
|
|
|
9883
10116
|
const [showPassword, setShowPassword] = React21.useState(false);
|
|
9884
10117
|
const [showConfirmPassword, setShowConfirmPassword] = React21.useState(false);
|
|
9885
10118
|
const [isSubmitting, setIsSubmitting] = React21.useState(false);
|
|
10119
|
+
const notification = useNotification();
|
|
9886
10120
|
const {
|
|
9887
10121
|
register,
|
|
9888
10122
|
handleSubmit,
|
|
@@ -9900,33 +10134,21 @@ function RegisterScreen() {
|
|
|
9900
10134
|
customerType: "Regular" /* Regular */,
|
|
9901
10135
|
role: "User" /* User */
|
|
9902
10136
|
});
|
|
9903
|
-
|
|
10137
|
+
notification.success(
|
|
10138
|
+
"Account created",
|
|
10139
|
+
"Your Hey Pharmacist account is ready to use."
|
|
10140
|
+
);
|
|
9904
10141
|
router.push(buildPath("/"));
|
|
9905
10142
|
} catch (error) {
|
|
9906
|
-
|
|
10143
|
+
notification.error(
|
|
10144
|
+
"Could not create account",
|
|
10145
|
+
error.response?.data?.message || "Something went wrong while creating your account. Please try again."
|
|
10146
|
+
);
|
|
9907
10147
|
} finally {
|
|
9908
10148
|
setIsSubmitting(false);
|
|
9909
10149
|
}
|
|
9910
10150
|
};
|
|
9911
|
-
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-
|
|
9912
|
-
framerMotion.motion.section,
|
|
9913
|
-
{
|
|
9914
|
-
initial: { opacity: 0, x: -24 },
|
|
9915
|
-
animate: { opacity: 1, x: 0 },
|
|
9916
|
-
transition: { duration: 0.4 },
|
|
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"
|
|
9918
|
-
},
|
|
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.")),
|
|
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)))),
|
|
9921
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-6 text-sm text-white/80" }, /* @__PURE__ */ React21__default.default.createElement("span", null, "Already part of the community?"), /* @__PURE__ */ React21__default.default.createElement(
|
|
9922
|
-
Link8__default.default,
|
|
9923
|
-
{
|
|
9924
|
-
href: buildPath("/login"),
|
|
9925
|
-
className: "inline-flex items-center gap-2 rounded-full bg-white/15 px-4 py-2 font-semibold transition hover:bg-white/25"
|
|
9926
|
-
},
|
|
9927
|
-
"Sign in"
|
|
9928
|
-
))
|
|
9929
|
-
), /* @__PURE__ */ React21__default.default.createElement(
|
|
10151
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-gradient-to-b from-[#F8FAFC] to-[#EBF4FB]" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid min-h-screen overflow-hidden pb-12" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
9930
10152
|
framerMotion.motion.section,
|
|
9931
10153
|
{
|
|
9932
10154
|
initial: { opacity: 0, x: 24 },
|
|
@@ -9934,54 +10156,52 @@ function RegisterScreen() {
|
|
|
9934
10156
|
transition: { duration: 0.4 },
|
|
9935
10157
|
className: "flex items-center justify-center px-6 py-12 lg:px-16"
|
|
9936
10158
|
},
|
|
9937
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "w-full max-w-
|
|
10159
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "w-full max-w-xl space-y-10 text-center" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.UserPlus, { strokeWidth: 2, className: "h-16 w-16 mx-auto text-white rounded-full bg-primary m-2 mb-4 px-4" }), /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-4xl text-secondary" }, "Create Your Account"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-muted" }, "Join Holmdel Pharmacy Care for convenient healthcare access")), /* @__PURE__ */ React21__default.default.createElement(
|
|
9938
10160
|
"form",
|
|
9939
10161
|
{
|
|
9940
10162
|
onSubmit: handleSubmit(onSubmit),
|
|
9941
|
-
className: "space-y-6 rounded-3xl border border-slate-100 bg-white p-8 shadow-lg shadow-primary-50"
|
|
10163
|
+
className: "text-start space-y-6 rounded-3xl border border-slate-100 bg-white p-8 shadow-lg shadow-primary-50",
|
|
10164
|
+
style: {
|
|
10165
|
+
boxShadow: "0px 4px 6px -4px #0000001A, 0px 10px 15px -3px #0000001A"
|
|
10166
|
+
}
|
|
9942
10167
|
},
|
|
9943
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "grid gap-4 md:grid-cols-2" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10168
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "grid gap-4 md:grid-cols-2 text-start" }, /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-sm text-secondary mb-3" }, "First name ", /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-primary-500" }, "*")), /* @__PURE__ */ React21__default.default.createElement(
|
|
9944
10169
|
Input,
|
|
9945
10170
|
{
|
|
9946
|
-
label: "First name",
|
|
9947
10171
|
placeholder: "Alex",
|
|
9948
10172
|
...register("firstName"),
|
|
9949
10173
|
error: errors.firstName?.message
|
|
9950
10174
|
}
|
|
9951
|
-
), /* @__PURE__ */ React21__default.default.createElement(
|
|
10175
|
+
)), /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-sm text-secondary mb-3" }, "Last name ", /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-primary-500" }, "*")), /* @__PURE__ */ React21__default.default.createElement(
|
|
9952
10176
|
Input,
|
|
9953
10177
|
{
|
|
9954
|
-
label: "Last name",
|
|
9955
10178
|
placeholder: "Morgan",
|
|
9956
10179
|
...register("lastName"),
|
|
9957
10180
|
error: errors.lastName?.message
|
|
9958
10181
|
}
|
|
9959
|
-
)),
|
|
9960
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
10182
|
+
))),
|
|
10183
|
+
/* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-sm text-secondary mb-3" }, "Email Address ", /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-primary-500" }, "*")), /* @__PURE__ */ React21__default.default.createElement(
|
|
9961
10184
|
Input,
|
|
9962
10185
|
{
|
|
9963
10186
|
type: "email",
|
|
9964
|
-
label: "Email address",
|
|
9965
10187
|
placeholder: "you@example.com",
|
|
9966
10188
|
...register("email"),
|
|
9967
10189
|
error: errors.email?.message
|
|
9968
10190
|
}
|
|
9969
|
-
),
|
|
9970
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
10191
|
+
)),
|
|
10192
|
+
/* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-sm text-secondary mb-3" }, "Phone Number"), /* @__PURE__ */ React21__default.default.createElement(
|
|
9971
10193
|
Input,
|
|
9972
10194
|
{
|
|
9973
10195
|
type: "tel",
|
|
9974
|
-
label: "Phone number (optional)",
|
|
9975
10196
|
placeholder: "+1 (555) 123-4567",
|
|
9976
10197
|
...register("phone"),
|
|
9977
10198
|
error: errors.phone?.message
|
|
9978
10199
|
}
|
|
9979
|
-
),
|
|
9980
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10200
|
+
)),
|
|
10201
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-sm text-secondary mb-3" }, "Password ", /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-primary-500" }, "*")), /* @__PURE__ */ React21__default.default.createElement(
|
|
9981
10202
|
Input,
|
|
9982
10203
|
{
|
|
9983
10204
|
type: showPassword ? "text" : "password",
|
|
9984
|
-
label: "Password",
|
|
9985
10205
|
placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
|
|
9986
10206
|
...register("password"),
|
|
9987
10207
|
error: errors.password?.message
|
|
@@ -9995,11 +10215,10 @@ function RegisterScreen() {
|
|
|
9995
10215
|
},
|
|
9996
10216
|
showPassword ? /* @__PURE__ */ React21__default.default.createElement(lucideReact.EyeOff, { className: "h-5 w-5" }) : /* @__PURE__ */ React21__default.default.createElement(lucideReact.Eye, { className: "h-5 w-5" })
|
|
9997
10217
|
)),
|
|
9998
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10218
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-sm text-secondary mb-3" }, "Confirm Password ", /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-primary-500" }, "*")), /* @__PURE__ */ React21__default.default.createElement(
|
|
9999
10219
|
Input,
|
|
10000
10220
|
{
|
|
10001
10221
|
type: showConfirmPassword ? "text" : "password",
|
|
10002
|
-
label: "Confirm password",
|
|
10003
10222
|
placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
|
|
10004
10223
|
...register("confirmPassword"),
|
|
10005
10224
|
error: errors.confirmPassword?.message
|
|
@@ -10013,77 +10232,54 @@ function RegisterScreen() {
|
|
|
10013
10232
|
},
|
|
10014
10233
|
showConfirmPassword ? /* @__PURE__ */ React21__default.default.createElement(lucideReact.EyeOff, { className: "h-5 w-5" }) : /* @__PURE__ */ React21__default.default.createElement(lucideReact.Eye, { className: "h-5 w-5" })
|
|
10015
10234
|
)),
|
|
10016
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-start gap-3 rounded-2xl bg-slate-50 p-4 text-sm text-slate-600" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Shield, { className: "mt-0.5 h-
|
|
10017
|
-
|
|
10235
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-start gap-3 rounded-2xl bg-slate-50 p-4 text-sm text-slate-600" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Shield, { strokeWidth: 2, className: "mt-0.5 h-8 w-8 text-primary" }), /* @__PURE__ */ React21__default.default.createElement("span", null, "By creating an account, you agree to our", " ", /* @__PURE__ */ React21__default.default.createElement(Link7__default.default, { href: buildPath("/terms"), className: "font-semibold text-primary hover:opacity-70" }, "Terms of Service"), " ", "and", " ", /* @__PURE__ */ React21__default.default.createElement(
|
|
10236
|
+
Link7__default.default,
|
|
10018
10237
|
{
|
|
10019
10238
|
href: buildPath("/privacy"),
|
|
10020
|
-
className: "font-semibold text-primary
|
|
10239
|
+
className: "font-semibold text-primary hover:opacity-70"
|
|
10021
10240
|
},
|
|
10022
10241
|
"Privacy Policy"
|
|
10023
10242
|
), ". We protect your information with bank-level encryption.")),
|
|
10024
10243
|
/* @__PURE__ */ React21__default.default.createElement(
|
|
10025
|
-
|
|
10244
|
+
"button",
|
|
10026
10245
|
{
|
|
10027
10246
|
type: "submit",
|
|
10028
|
-
|
|
10029
|
-
|
|
10030
|
-
className: "w-full"
|
|
10247
|
+
disabled: isSubmitting,
|
|
10248
|
+
className: "w-full bg-secondary hover:opacity-80 text-white font-medium py-3 px-4 rounded-lg transition-colors disabled:opacity-70 disabled:cursor-not-allowed"
|
|
10031
10249
|
},
|
|
10032
|
-
|
|
10033
|
-
"Create my account"
|
|
10250
|
+
isSubmitting ? "Creating account..." : "Create my account"
|
|
10034
10251
|
)
|
|
10035
|
-
), /* @__PURE__ */ React21__default.default.createElement("div", { className: "
|
|
10252
|
+
), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-4" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-muted" }, "Already have an account? ", /* @__PURE__ */ React21__default.default.createElement(Link7__default.default, { href: buildPath("/login"), className: "font-medium text-primary transition hover:opacity-90" }, "Sign in"))))
|
|
10036
10253
|
)));
|
|
10037
10254
|
}
|
|
10038
|
-
var profileSchema = zod.z.object({
|
|
10039
|
-
firstName: zod.z.string().min(2, "First name is required"),
|
|
10040
|
-
lastName: zod.z.string().min(2, "Last name is required"),
|
|
10041
|
-
email: zod.z.string().email("Enter a valid email address"),
|
|
10042
|
-
phone: zod.z.string().optional()
|
|
10043
|
-
});
|
|
10044
10255
|
function ProfileScreen() {
|
|
10045
10256
|
const router = navigation.useRouter();
|
|
10046
|
-
const { user,
|
|
10257
|
+
const { user, logout, isLoading } = useAuth();
|
|
10047
10258
|
const { buildPath } = useBasePath();
|
|
10048
|
-
const [
|
|
10049
|
-
const
|
|
10050
|
-
|
|
10051
|
-
|
|
10052
|
-
|
|
10053
|
-
} = reactHookForm.useForm({
|
|
10054
|
-
resolver: zod$1.zodResolver(profileSchema),
|
|
10055
|
-
defaultValues: {
|
|
10056
|
-
firstName: user?.firstname || "",
|
|
10057
|
-
lastName: user?.lastname || "",
|
|
10058
|
-
email: user?.email || "",
|
|
10059
|
-
phone: user?.phoneNumber || ""
|
|
10060
|
-
}
|
|
10061
|
-
});
|
|
10062
|
-
const onSubmit = async (data) => {
|
|
10063
|
-
setIsSubmitting(true);
|
|
10259
|
+
const [isLoggingOut, setIsLoggingOut] = React21.useState(false);
|
|
10260
|
+
const [logoutError, setLogoutError] = React21.useState(null);
|
|
10261
|
+
const handleLogout = async () => {
|
|
10262
|
+
setIsLoggingOut(true);
|
|
10263
|
+
setLogoutError(null);
|
|
10064
10264
|
try {
|
|
10065
|
-
await
|
|
10066
|
-
|
|
10265
|
+
await logout();
|
|
10266
|
+
router.push(buildPath("/"));
|
|
10067
10267
|
} catch (error) {
|
|
10068
|
-
|
|
10268
|
+
setLogoutError(error?.response?.data?.message || "Failed to logout. Please try again.");
|
|
10069
10269
|
} finally {
|
|
10070
|
-
|
|
10270
|
+
setIsLoggingOut(false);
|
|
10071
10271
|
}
|
|
10072
10272
|
};
|
|
10073
|
-
const handleLogout = async () => {
|
|
10074
|
-
await logout();
|
|
10075
|
-
sonner.toast.success("Logged out successfully");
|
|
10076
|
-
router.push(buildPath("/"));
|
|
10077
|
-
};
|
|
10078
10273
|
if (!user) {
|
|
10274
|
+
if (isLoading) return null;
|
|
10079
10275
|
router.push(buildPath("/login"));
|
|
10080
10276
|
return null;
|
|
10081
10277
|
}
|
|
10082
10278
|
const quickLinks = [
|
|
10083
10279
|
{
|
|
10084
10280
|
icon: lucideReact.Package,
|
|
10085
|
-
label: "
|
|
10086
|
-
description: "Track shipments and
|
|
10281
|
+
label: "Orders & invoices",
|
|
10282
|
+
description: "Track shipments, invoices, and receipts",
|
|
10087
10283
|
href: buildPath("/orders")
|
|
10088
10284
|
},
|
|
10089
10285
|
{
|
|
@@ -10099,121 +10295,105 @@ function ProfileScreen() {
|
|
|
10099
10295
|
href: buildPath("/account/addresses")
|
|
10100
10296
|
}
|
|
10101
10297
|
];
|
|
10102
|
-
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React21__default.default.createElement("
|
|
10298
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-slate-50 text-slate-900" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative container mx-auto px-4 pb-16 pt-10" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-3xl border border-slate-200 bg-white/95 p-8 shadow-xl shadow-primary-50 backdrop-blur" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "mb-6 flex flex-wrap items-center justify-between gap-3" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-sm text-slate-500" }, "Stay signed in to keep prescriptions and deliveries synced."), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3" }, logoutError && /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-start gap-2 rounded-xl border border-red-200 bg-red-50 px-3 py-2 text-xs text-red-700" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.ShieldCheck, { className: "mt-[1px] h-4 w-4 text-red-500" }), /* @__PURE__ */ React21__default.default.createElement("span", null, logoutError)), /* @__PURE__ */ React21__default.default.createElement(
|
|
10299
|
+
Button,
|
|
10300
|
+
{
|
|
10301
|
+
type: "button",
|
|
10302
|
+
variant: "outline",
|
|
10303
|
+
size: "sm",
|
|
10304
|
+
className: "border-red-200 text-red-600 hover:bg-red-50",
|
|
10305
|
+
onClick: handleLogout,
|
|
10306
|
+
disabled: isLoggingOut
|
|
10307
|
+
},
|
|
10308
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.LogOut, { className: "h-4 w-4" }),
|
|
10309
|
+
isLoggingOut ? "Logging out..." : "Log out"
|
|
10310
|
+
))), /* @__PURE__ */ React21__default.default.createElement(
|
|
10103
10311
|
framerMotion.motion.div,
|
|
10104
10312
|
{
|
|
10105
|
-
initial: { opacity: 0, y:
|
|
10313
|
+
initial: { opacity: 0, y: 18 },
|
|
10106
10314
|
animate: { opacity: 1, y: 0 },
|
|
10107
|
-
className: "
|
|
10315
|
+
className: "grid gap-8 md:grid-cols-[minmax(0,1.1fr)_minmax(0,0.9fr)] md:items-center"
|
|
10108
10316
|
},
|
|
10109
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-
|
|
10110
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-col
|
|
10317
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "inline-flex items-center gap-2 rounded-full bg-slate-900 text-white px-4 py-1 text-xs font-semibold uppercase tracking-[0.32em]" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.HeartPulse, { className: "h-4 w-4" }), "Account"), /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("h1", { className: "text-4xl font-semibold md:text-5xl" }, "Welcome back, ", user.firstname, " ", user.lastname), /* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-3 max-w-2xl text-base text-slate-600" }, "Keep your identity and delivery details accurate for smoother refills, faster shipping, and timely pharmacist guidance.")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap gap-3 text-sm text-slate-600" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full border border-slate-200 bg-slate-50 px-3 py-2" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.ShieldCheck, { className: "h-4 w-4 text-primary-600" }), "Secure login enabled"), /* @__PURE__ */ React21__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full border border-slate-200 bg-slate-50 px-3 py-2" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Mail, { className: "h-4 w-4 text-primary-600" }), user.email), /* @__PURE__ */ React21__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full border border-slate-200 bg-slate-50 px-3 py-2" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Phone, { className: "h-4 w-4 text-primary-600" }), user.phoneNumber || "Add phone for urgent updates"))),
|
|
10318
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-col gap-4 rounded-2xl border border-slate-200 bg-slate-50/70 p-6 shadow-sm" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex h-16 w-16 items-center justify-center rounded-2xl bg-white text-2xl font-semibold text-slate-900 shadow-sm" }, getInitials(user?.firstname || "", user?.lastname || "") || ""), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-slate-500" }, "Signed in as"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-lg font-semibold text-slate-900" }, user.firstname), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-slate-500" }, user.email))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid gap-3 sm:grid-cols-2" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10319
|
+
Button,
|
|
10320
|
+
{
|
|
10321
|
+
variant: "outline",
|
|
10322
|
+
size: "md",
|
|
10323
|
+
className: "border-slate-300 text-slate-800 hover:bg-white",
|
|
10324
|
+
onClick: () => router.push(buildPath("/account/edit"))
|
|
10325
|
+
},
|
|
10326
|
+
"Edit profile"
|
|
10327
|
+
), /* @__PURE__ */ React21__default.default.createElement(
|
|
10111
10328
|
Button,
|
|
10112
10329
|
{
|
|
10113
10330
|
variant: "ghost",
|
|
10114
|
-
|
|
10331
|
+
size: "md",
|
|
10332
|
+
className: "text-slate-700 hover:bg-white",
|
|
10115
10333
|
onClick: () => router.push(buildPath("/account/change-password"))
|
|
10116
10334
|
},
|
|
10117
10335
|
"Change password"
|
|
10118
|
-
))
|
|
10119
|
-
))
|
|
10336
|
+
)))
|
|
10337
|
+
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-10 grid gap-8 lg:grid-cols-[minmax(0,1.08fr)_minmax(0,0.92fr)] items-stretch" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10120
10338
|
framerMotion.motion.div,
|
|
10121
10339
|
{
|
|
10122
|
-
initial: { opacity: 0, y:
|
|
10340
|
+
initial: { opacity: 0, y: 18 },
|
|
10123
10341
|
animate: { opacity: 1, y: 0 },
|
|
10124
10342
|
className: "space-y-6"
|
|
10125
10343
|
},
|
|
10126
|
-
/* @__PURE__ */ React21__default.default.createElement("section", { className: "rounded-3xl border border-slate-
|
|
10127
|
-
Input,
|
|
10128
|
-
{
|
|
10129
|
-
label: "First name",
|
|
10130
|
-
placeholder: "Taylor",
|
|
10131
|
-
...register("firstName"),
|
|
10132
|
-
error: errors.firstName?.message
|
|
10133
|
-
}
|
|
10134
|
-
), /* @__PURE__ */ React21__default.default.createElement(
|
|
10135
|
-
Input,
|
|
10136
|
-
{
|
|
10137
|
-
label: "Last name",
|
|
10138
|
-
placeholder: "Reed",
|
|
10139
|
-
...register("lastName"),
|
|
10140
|
-
error: errors.lastName?.message
|
|
10141
|
-
}
|
|
10142
|
-
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10143
|
-
Input,
|
|
10144
|
-
{
|
|
10145
|
-
type: "email",
|
|
10146
|
-
label: "Email address",
|
|
10147
|
-
placeholder: "you@example.com",
|
|
10148
|
-
className: "pl-10",
|
|
10149
|
-
...register("email"),
|
|
10150
|
-
error: errors.email?.message
|
|
10151
|
-
}
|
|
10152
|
-
), /* @__PURE__ */ React21__default.default.createElement(lucideReact.Mail, { className: "absolute left-3 top-[38px] h-4 w-4 text-slate-400" })), /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10153
|
-
Input,
|
|
10154
|
-
{
|
|
10155
|
-
type: "tel",
|
|
10156
|
-
label: "Phone number",
|
|
10157
|
-
placeholder: "+1 (555) 123-4567",
|
|
10158
|
-
className: "pl-10",
|
|
10159
|
-
...register("phone"),
|
|
10160
|
-
error: errors.phone?.message
|
|
10161
|
-
}
|
|
10162
|
-
), /* @__PURE__ */ React21__default.default.createElement(lucideReact.Phone, { className: "absolute left-3 top-[38px] h-4 w-4 text-slate-400" })), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap gap-4" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10163
|
-
Button,
|
|
10164
|
-
{
|
|
10165
|
-
type: "submit",
|
|
10166
|
-
size: "lg",
|
|
10167
|
-
isLoading: isSubmitting
|
|
10168
|
-
},
|
|
10169
|
-
"Save changes"
|
|
10170
|
-
), /* @__PURE__ */ React21__default.default.createElement(
|
|
10344
|
+
/* @__PURE__ */ React21__default.default.createElement("section", { className: "rounded-3xl border border-slate-200 bg-white p-7 shadow-lg shadow-primary-50/40 min-h-[420px] h-full flex flex-col" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between gap-3" }, /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xs font-semibold uppercase tracking-[0.3em] text-slate-400" }, "Essentials"), /* @__PURE__ */ React21__default.default.createElement("h2", { className: "mt-1 text-xl font-semibold text-slate-900" }, "Profile snapshot")), /* @__PURE__ */ React21__default.default.createElement(lucideReact.Sparkles, { className: "h-5 w-5 text-primary-500" })), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-6 grid gap-4 md:grid-cols-2" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-2xl border border-slate-200 bg-slate-50/70 p-5" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xs font-semibold uppercase tracking-[0.28em] text-slate-500" }, "Contact"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-3 space-y-2 text-sm text-slate-600" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "flex items-center gap-2 font-semibold text-slate-900" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.User, { className: "h-4 w-4 text-primary-500" }), user.firstname, " ", user.lastname), /* @__PURE__ */ React21__default.default.createElement("p", { className: "flex items-center gap-2" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Mail, { className: "h-4 w-4 text-primary-500" }), user.email), /* @__PURE__ */ React21__default.default.createElement("p", { className: "flex items-center gap-2" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Phone, { className: "h-4 w-4 text-primary-500" }), user.phoneNumber || "Not provided")), /* @__PURE__ */ React21__default.default.createElement(
|
|
10171
10345
|
Button,
|
|
10172
10346
|
{
|
|
10173
|
-
type: "button",
|
|
10174
10347
|
variant: "outline",
|
|
10175
|
-
size: "
|
|
10176
|
-
|
|
10348
|
+
size: "md",
|
|
10349
|
+
className: "mt-4 w-full border-slate-300 text-slate-800 hover:bg-white",
|
|
10350
|
+
onClick: () => router.push(buildPath("/account/edit"))
|
|
10177
10351
|
},
|
|
10178
|
-
"
|
|
10179
|
-
)))),
|
|
10180
|
-
|
|
10181
|
-
Link8__default.default,
|
|
10352
|
+
"Update information"
|
|
10353
|
+
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-2xl border border-slate-200 bg-slate-50/70 p-5" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xs font-semibold uppercase tracking-[0.28em] text-slate-500" }, "Security"), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-3 space-y-2 text-sm text-slate-600" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "flex items-center gap-2 font-semibold text-slate-900" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.ShieldCheck, { className: "h-4 w-4 text-primary-500" }), "Multi-factor ready"), /* @__PURE__ */ React21__default.default.createElement("p", null, "Protect your account with a fresh password and keep notifications on.")), /* @__PURE__ */ React21__default.default.createElement(
|
|
10354
|
+
Button,
|
|
10182
10355
|
{
|
|
10183
|
-
|
|
10184
|
-
|
|
10185
|
-
className: "
|
|
10356
|
+
variant: "primary",
|
|
10357
|
+
size: "md",
|
|
10358
|
+
className: "mt-4 w-full",
|
|
10359
|
+
onClick: () => router.push(buildPath("/account/change-password"))
|
|
10186
10360
|
},
|
|
10187
|
-
|
|
10188
|
-
)))
|
|
10361
|
+
"Change password"
|
|
10362
|
+
))))
|
|
10189
10363
|
), /* @__PURE__ */ React21__default.default.createElement(
|
|
10190
10364
|
framerMotion.motion.aside,
|
|
10191
10365
|
{
|
|
10192
|
-
initial: { opacity: 0, y:
|
|
10366
|
+
initial: { opacity: 0, y: 18 },
|
|
10193
10367
|
animate: { opacity: 1, y: 0 },
|
|
10194
|
-
transition: { delay: 0.
|
|
10195
|
-
className: "space-y-
|
|
10368
|
+
transition: { delay: 0.05 },
|
|
10369
|
+
className: "space-y-4 h-full"
|
|
10196
10370
|
},
|
|
10197
|
-
/* @__PURE__ */ React21__default.default.createElement("
|
|
10198
|
-
|
|
10371
|
+
/* @__PURE__ */ React21__default.default.createElement("section", { className: "rounded-3xl border border-slate-200 bg-white p-6 shadow-sm min-h-[420px] h-full flex flex-col" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xs font-semibold uppercase tracking-[0.3em] text-slate-400" }, "Quick links"), /* @__PURE__ */ React21__default.default.createElement("h3", { className: "mt-1 text-lg font-semibold text-slate-900" }, "Next steps")), /* @__PURE__ */ React21__default.default.createElement(lucideReact.Heart, { className: "h-5 w-5 text-primary-500" })), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-5 grid gap-3" }, quickLinks.map((item) => /* @__PURE__ */ React21__default.default.createElement(
|
|
10372
|
+
Link7__default.default,
|
|
10199
10373
|
{
|
|
10200
|
-
|
|
10201
|
-
|
|
10202
|
-
|
|
10203
|
-
},
|
|
10204
|
-
"Manage preferences"
|
|
10205
|
-
)),
|
|
10206
|
-
/* @__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]" }, "Pharmacist tip"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-3 leading-relaxed" }, "Keep your phone number current so pharmacists can reach you quickly with dosage advice or time-sensitive updates about your order.")),
|
|
10207
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
10208
|
-
"button",
|
|
10209
|
-
{
|
|
10210
|
-
onClick: handleLogout,
|
|
10211
|
-
className: "flex w-full items-center justify-center gap-2 rounded-3xl border border-red-200 bg-red-50 px-4 py-3 text-sm font-semibold text-red-600 transition hover:bg-red-100"
|
|
10374
|
+
key: item.href,
|
|
10375
|
+
href: item.href,
|
|
10376
|
+
className: "group relative flex items-start gap-3 rounded-2xl border border-slate-200 bg-slate-50/70 p-4 transition duration-200 hover:-translate-y-0.5 hover:border-primary-200 hover:bg-white hover:shadow-md"
|
|
10212
10377
|
},
|
|
10213
|
-
/* @__PURE__ */ React21__default.default.createElement(
|
|
10214
|
-
"
|
|
10215
|
-
)
|
|
10216
|
-
))))
|
|
10378
|
+
/* @__PURE__ */ React21__default.default.createElement("span", { className: "flex h-11 w-11 items-center justify-center rounded-xl bg-white text-primary-600 shadow-sm group-hover:bg-primary-600 group-hover:text-white" }, /* @__PURE__ */ React21__default.default.createElement(item.icon, { className: "h-5 w-5" })),
|
|
10379
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex-1" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "flex items-center gap-2 text-base font-semibold text-slate-900 group-hover:text-primary-700" }, item.label, /* @__PURE__ */ React21__default.default.createElement(lucideReact.ArrowRight, { className: "h-4 w-4 opacity-0 transition group-hover:opacity-100" })), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-slate-500" }, item.description))
|
|
10380
|
+
))))
|
|
10381
|
+
))));
|
|
10382
|
+
}
|
|
10383
|
+
function Badge({ children, variant = "primary", size = "md", className = "" }) {
|
|
10384
|
+
const variants = {
|
|
10385
|
+
primary: "bg-primary-100 text-primary-700 border-primary-200",
|
|
10386
|
+
secondary: "bg-secondary-100 text-secondary-700 border-secondary-200",
|
|
10387
|
+
success: "bg-green-100 text-green-700 border-green-200",
|
|
10388
|
+
warning: "bg-yellow-100 text-yellow-700 border-yellow-200",
|
|
10389
|
+
danger: "bg-red-100 text-red-700 border-red-200",
|
|
10390
|
+
gray: "bg-gray-100 text-gray-700 border-gray-200"
|
|
10391
|
+
};
|
|
10392
|
+
const sizes = {
|
|
10393
|
+
sm: "px-2 py-1 text-xs",
|
|
10394
|
+
md: "px-3 py-1 text-sm"
|
|
10395
|
+
};
|
|
10396
|
+
return /* @__PURE__ */ React21__default.default.createElement("span", { className: `inline-flex items-center font-medium rounded-full border ${variants[variant]} ${sizes[size]} ${className}` }, children);
|
|
10217
10397
|
}
|
|
10218
10398
|
function OrderCard({ order }) {
|
|
10219
10399
|
const config = order.orderStatus;
|
|
@@ -10231,7 +10411,7 @@ function OrderCard({ order }) {
|
|
|
10231
10411
|
const itemPrice = item.productVariantData?.finalPrice || 0;
|
|
10232
10412
|
const itemTotal = itemPrice * item.quantity;
|
|
10233
10413
|
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
|
-
|
|
10414
|
+
Image4__default.default,
|
|
10235
10415
|
{
|
|
10236
10416
|
src: item?.productVariantData?.productMedia?.[0]?.file || "/placeholder-product.jpg",
|
|
10237
10417
|
alt: item?.productVariantData?.name || "Product image",
|
|
@@ -10571,7 +10751,7 @@ function CurrentOrdersScreen() {
|
|
|
10571
10751
|
},
|
|
10572
10752
|
/* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm font-semibold uppercase tracking-[0.35em] text-white/70" }, "Quick actions"),
|
|
10573
10753
|
/* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-4 space-y-3 text-sm text-white/80" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
10574
|
-
|
|
10754
|
+
Link7__default.default,
|
|
10575
10755
|
{
|
|
10576
10756
|
href: buildPath("/orders"),
|
|
10577
10757
|
className: "flex items-center justify-between rounded-2xl bg-white/10 px-4 py-3 transition hover:bg-white/20"
|
|
@@ -10650,6 +10830,9 @@ function AddressesScreen() {
|
|
|
10650
10830
|
} = useAddresses();
|
|
10651
10831
|
const [isModalOpen, setIsModalOpen] = React21.useState(false);
|
|
10652
10832
|
const [editingAddress, setEditingAddress] = React21.useState(null);
|
|
10833
|
+
const [banner, setBanner] = React21.useState(
|
|
10834
|
+
null
|
|
10835
|
+
);
|
|
10653
10836
|
const {
|
|
10654
10837
|
register,
|
|
10655
10838
|
handleSubmit,
|
|
@@ -10704,10 +10887,10 @@ function AddressesScreen() {
|
|
|
10704
10887
|
if (editingAddress) {
|
|
10705
10888
|
const response = await updateAddress(editingAddress.id, payload);
|
|
10706
10889
|
if (response) {
|
|
10707
|
-
|
|
10890
|
+
setBanner({ type: "success", message: "Address updated successfully" });
|
|
10708
10891
|
closeModal();
|
|
10709
10892
|
} else {
|
|
10710
|
-
|
|
10893
|
+
setBanner({ type: "error", message: "Unable to update address" });
|
|
10711
10894
|
}
|
|
10712
10895
|
} else {
|
|
10713
10896
|
const response = await addAddress({
|
|
@@ -10722,10 +10905,10 @@ function AddressesScreen() {
|
|
|
10722
10905
|
addressType: values.addressType
|
|
10723
10906
|
});
|
|
10724
10907
|
if (response) {
|
|
10725
|
-
|
|
10908
|
+
setBanner({ type: "success", message: "Address added successfully" });
|
|
10726
10909
|
closeModal();
|
|
10727
10910
|
} else {
|
|
10728
|
-
|
|
10911
|
+
setBanner({ type: "error", message: "Failed to add address" });
|
|
10729
10912
|
}
|
|
10730
10913
|
}
|
|
10731
10914
|
};
|
|
@@ -10737,20 +10920,22 @@ You can add it back at any time.`
|
|
|
10737
10920
|
if (!confirmDelete) return;
|
|
10738
10921
|
try {
|
|
10739
10922
|
await removeAddress(address.id);
|
|
10740
|
-
|
|
10923
|
+
setBanner({ type: "success", message: "Address removed successfully" });
|
|
10741
10924
|
} catch (error2) {
|
|
10742
|
-
|
|
10743
|
-
|
|
10925
|
+
setBanner({
|
|
10926
|
+
type: "error",
|
|
10927
|
+
message: error2 instanceof Error ? error2.message : "Failed to remove address. Please try again."
|
|
10744
10928
|
});
|
|
10745
10929
|
}
|
|
10746
10930
|
};
|
|
10747
10931
|
const handleSetDefault = async (address) => {
|
|
10748
10932
|
try {
|
|
10749
10933
|
await markAsDefault(address.id);
|
|
10750
|
-
|
|
10934
|
+
setBanner({ type: "success", message: `${address.name} is now your default address` });
|
|
10751
10935
|
} catch (error2) {
|
|
10752
|
-
|
|
10753
|
-
|
|
10936
|
+
setBanner({
|
|
10937
|
+
type: "error",
|
|
10938
|
+
message: error2 instanceof Error ? error2.message : "Failed to set default address. Try again."
|
|
10754
10939
|
});
|
|
10755
10940
|
}
|
|
10756
10941
|
};
|
|
@@ -10778,27 +10963,32 @@ You can add it back at any time.`
|
|
|
10778
10963
|
}
|
|
10779
10964
|
];
|
|
10780
10965
|
}, [addresses]);
|
|
10781
|
-
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React21__default.default.createElement("
|
|
10782
|
-
|
|
10966
|
+
return /* @__PURE__ */ React21__default.default.createElement("div", { className: "min-h-screen bg-slate-50 text-slate-900" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4 pb-16 pt-10" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "rounded-3xl border border-slate-200 bg-white/95 p-6 shadow-xl shadow-primary-50" }, /* @__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: "space-y-2" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "inline-flex items-center gap-2 rounded-full bg-slate-900 text-white px-4 py-1 text-xs font-semibold uppercase tracking-[0.32em]" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.MapPin, { className: "h-4 w-4" }), "Address book"), /* @__PURE__ */ React21__default.default.createElement("h1", { className: "text-3xl font-semibold md:text-4xl" }, "Manage where your care arrives"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "max-w-2xl text-sm text-slate-600" }, "Save home, office, or loved ones' addresses and choose a default for faster checkout and delivery."), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap gap-3 text-xs text-slate-500" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full border border-slate-200 bg-slate-50 px-3 py-2" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Sparkles, { className: "h-4 w-4 text-primary-600" }), "Default: ", defaultAddress ? defaultAddress.name : "Not set"))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3" }, banner && /* @__PURE__ */ React21__default.default.createElement(
|
|
10967
|
+
"div",
|
|
10783
10968
|
{
|
|
10784
|
-
|
|
10785
|
-
animate: { opacity: 1, y: 0 },
|
|
10786
|
-
className: "space-y-5"
|
|
10969
|
+
className: `flex items-start gap-2 rounded-2xl border px-3 py-2 text-xs ${banner.type === "success" ? "border-green-200 bg-green-50 text-green-700" : "border-red-200 bg-red-50 text-red-700"}`
|
|
10787
10970
|
},
|
|
10788
|
-
/* @__PURE__ */ React21__default.default.createElement("span", { className: "
|
|
10789
|
-
/* @__PURE__ */ React21__default.default.createElement("
|
|
10790
|
-
/* @__PURE__ */ React21__default.default.createElement("p", { className: "max-w-2xl text-white/80 md:text-lg" }, "Add home, office, or loved ones' addresses and toggle a default for lightning-fast checkout and delivery."),
|
|
10791
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap items-center gap-3 text-sm text-white/75" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full bg-white/10 px-3 py-1" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Sparkles, { className: "h-4 w-4 text-white" }), "Default address: ", defaultAddress ? defaultAddress.name : "Not set"), /* @__PURE__ */ React21__default.default.createElement(Button, { variant: "ghost", className: "text-white hover:bg-white/10", onClick: openCreateModal }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Plus, { className: "h-5 w-5" }), "Add address"))
|
|
10971
|
+
/* @__PURE__ */ React21__default.default.createElement("span", { className: "mt-[1px] text-base" }, banner.type === "success" ? "\u2714" : "!"),
|
|
10972
|
+
/* @__PURE__ */ React21__default.default.createElement("span", null, banner.message)
|
|
10792
10973
|
), /* @__PURE__ */ React21__default.default.createElement(
|
|
10793
|
-
|
|
10974
|
+
Button,
|
|
10794
10975
|
{
|
|
10795
|
-
|
|
10796
|
-
|
|
10797
|
-
|
|
10798
|
-
|
|
10976
|
+
variant: "outline",
|
|
10977
|
+
size: "md",
|
|
10978
|
+
className: "border-slate-300 text-slate-800 hover:bg-white",
|
|
10979
|
+
onClick: openCreateModal
|
|
10799
10980
|
},
|
|
10800
|
-
|
|
10801
|
-
|
|
10981
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Plus, { className: "h-5 w-5" }),
|
|
10982
|
+
"Add address"
|
|
10983
|
+
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-6 grid gap-4 sm:grid-cols-3" }, stats.map((stat) => /* @__PURE__ */ React21__default.default.createElement(
|
|
10984
|
+
"div",
|
|
10985
|
+
{
|
|
10986
|
+
key: stat.id,
|
|
10987
|
+
className: "rounded-2xl border border-slate-200 bg-slate-50/70 px-4 py-3 text-sm text-slate-600"
|
|
10988
|
+
},
|
|
10989
|
+
/* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xs font-semibold uppercase tracking-[0.28em] text-slate-500" }, stat.label),
|
|
10990
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-1 flex items-center justify-between" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-slate-800" }, stat.helper), /* @__PURE__ */ React21__default.default.createElement("span", { className: "text-xl font-semibold text-slate-900" }, stat.value))
|
|
10991
|
+
)))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "mt-10" }, isLoading ? /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid gap-4 sm:grid-cols-2 xl:grid-cols-3" }, Array.from({ length: 3 }).map((_, index) => /* @__PURE__ */ React21__default.default.createElement(
|
|
10802
10992
|
"div",
|
|
10803
10993
|
{
|
|
10804
10994
|
key: index,
|
|
@@ -10821,7 +11011,7 @@ You can add it back at any time.`
|
|
|
10821
11011
|
key: address.id,
|
|
10822
11012
|
initial: { opacity: 0, y: 24 },
|
|
10823
11013
|
animate: { opacity: 1, y: 0 },
|
|
10824
|
-
className: "group relative flex h-full flex-col rounded-3xl border border-slate-
|
|
11014
|
+
className: "group relative flex h-full flex-col rounded-3xl border border-slate-200 bg-white p-6 shadow-sm transition hover:-translate-y-1 hover:border-primary-200 hover:shadow-lg"
|
|
10825
11015
|
},
|
|
10826
11016
|
address.isDefault && /* @__PURE__ */ React21__default.default.createElement("span", { className: "absolute right-6 top-6 inline-flex items-center gap-2 rounded-full bg-amber-100 px-3 py-1 text-xs font-semibold text-amber-700" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Crown, { className: "h-4 w-4" }), "Default"),
|
|
10827
11017
|
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement("span", { className: "rounded-full bg-primary-50 p-3 text-primary-600" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.User, { className: "h-5 w-5" })), /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-base font-semibold text-slate-900" }, address.name), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xs uppercase tracking-[0.3em] text-slate-400" }, typeCopy.label))),
|
|
@@ -11011,6 +11201,7 @@ function WishlistScreen() {
|
|
|
11011
11201
|
clearWishlist,
|
|
11012
11202
|
refreshWishlist
|
|
11013
11203
|
} = useWishlist();
|
|
11204
|
+
const notification = useNotification();
|
|
11014
11205
|
const wishlistCount = getWishlistCount?.() ?? 0;
|
|
11015
11206
|
const { products: wishlistProducts, isLoading, error } = useWishlistProducts(
|
|
11016
11207
|
wishlistItems
|
|
@@ -11020,9 +11211,12 @@ function WishlistScreen() {
|
|
|
11020
11211
|
const [sortOption, setSortOption] = React21.useState("featured");
|
|
11021
11212
|
React21.useEffect(() => {
|
|
11022
11213
|
if (error) {
|
|
11023
|
-
|
|
11214
|
+
notification.error(
|
|
11215
|
+
"Could not load wishlist",
|
|
11216
|
+
"We had trouble loading your saved products. Please refresh the page or try again shortly."
|
|
11217
|
+
);
|
|
11024
11218
|
}
|
|
11025
|
-
}, [error]);
|
|
11219
|
+
}, [error, notification]);
|
|
11026
11220
|
const handleRemoveFromWishlist = async (productId) => {
|
|
11027
11221
|
try {
|
|
11028
11222
|
await removeFromWishlist(productId);
|
|
@@ -11090,22 +11284,22 @@ function WishlistScreen() {
|
|
|
11090
11284
|
animate: { opacity: 1, y: 0 },
|
|
11091
11285
|
className: "space-y-6"
|
|
11092
11286
|
},
|
|
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-
|
|
11287
|
+
!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-secondary" }))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-2xl font-bold text-secondary" }, "Sign in to see your favourites"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-muted" }, "Create your curated shelf of products and we'll keep them ready whenever you return.")), /* @__PURE__ */ React21__default.default.createElement(
|
|
11094
11288
|
"button",
|
|
11095
11289
|
{
|
|
11096
11290
|
type: "button",
|
|
11097
11291
|
onClick: () => router.push(buildPath("/login")),
|
|
11098
|
-
className: "rounded-
|
|
11292
|
+
className: "rounded-xl border-2 border-primary bg-primary text-white px-6 py-3 text-sm font-medium transition-colors hover:opacity-80"
|
|
11099
11293
|
},
|
|
11100
11294
|
"Sign In"
|
|
11101
11295
|
))),
|
|
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-
|
|
11296
|
+
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-secondary" }, "Wishlist"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-muted 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-muted" }, "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 hover:text-secondary" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
11103
11297
|
"input",
|
|
11104
11298
|
{
|
|
11105
11299
|
type: "checkbox",
|
|
11106
11300
|
checked: onlyInStock,
|
|
11107
11301
|
onChange: (event) => setOnlyInStock(event.target.checked),
|
|
11108
|
-
className: "h-4 w-4 rounded border-slate-300 text-
|
|
11302
|
+
className: "h-4 w-4 rounded border-slate-300 text-secondary focus:ring-secondary"
|
|
11109
11303
|
}
|
|
11110
11304
|
), "Only show in-stock"), /* @__PURE__ */ React21__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__ */ React21__default.default.createElement("span", null, "Sort"), /* @__PURE__ */ React21__default.default.createElement(
|
|
11111
11305
|
"select",
|
|
@@ -11115,24 +11309,22 @@ function WishlistScreen() {
|
|
|
11115
11309
|
className: "bg-transparent text-sm font-medium text-slate-700 outline-none"
|
|
11116
11310
|
},
|
|
11117
11311
|
SORT_OPTIONS.map((option) => /* @__PURE__ */ React21__default.default.createElement("option", { key: option.value, value: option.value }, option.label))
|
|
11118
|
-
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex overflow-hidden rounded-full border border-slate-200 bg-
|
|
11312
|
+
)), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex overflow-hidden rounded-full border border-slate-200 bg-gray-100 p-1" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
11119
11313
|
"button",
|
|
11120
11314
|
{
|
|
11121
11315
|
type: "button",
|
|
11122
11316
|
onClick: () => setViewMode("grid"),
|
|
11123
|
-
className: `flex items-center gap-1 px-3 py-1.5 text-sm font-medium transition ${viewMode === "grid" ? "bg-
|
|
11317
|
+
className: `flex items-center gap-1 px-3 py-1.5 text-sm font-medium transition rounded-full ${viewMode === "grid" ? "bg-white text-primary shadow-md" : "text-slate-600 hover:bg-white"}`
|
|
11124
11318
|
},
|
|
11125
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Grid, { className: "h-4 w-4" })
|
|
11126
|
-
"Grid"
|
|
11319
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.Grid, { className: "h-4 w-4" })
|
|
11127
11320
|
), /* @__PURE__ */ React21__default.default.createElement(
|
|
11128
11321
|
"button",
|
|
11129
11322
|
{
|
|
11130
11323
|
type: "button",
|
|
11131
11324
|
onClick: () => setViewMode("list"),
|
|
11132
|
-
className: `flex items-center gap-1 px-3 py-1.5 text-sm font-medium transition ${viewMode === "list" ? "bg-
|
|
11325
|
+
className: `flex items-center gap-1 px-3 py-1.5 text-sm font-medium transition rounded-full ${viewMode === "list" ? "bg-white text-primary shadow-md" : "text-slate-600 hover:bg-white"}`
|
|
11133
11326
|
},
|
|
11134
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.List, { className: "h-4 w-4" })
|
|
11135
|
-
"List"
|
|
11327
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.List, { className: "h-4 w-4" })
|
|
11136
11328
|
)), wishlistCount > 0 && /* @__PURE__ */ React21__default.default.createElement(
|
|
11137
11329
|
Button,
|
|
11138
11330
|
{
|
|
@@ -11148,12 +11340,12 @@ function WishlistScreen() {
|
|
|
11148
11340
|
key: index,
|
|
11149
11341
|
className: "h-72 animate-pulse rounded-2xl border border-slate-200 bg-slate-100"
|
|
11150
11342
|
}
|
|
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-
|
|
11343
|
+
))), !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-secondary" }))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React21__default.default.createElement("h2", { className: "text-2xl font-bold text-secondary" }, "Your wishlist is empty"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-muted" }, "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
11344
|
"button",
|
|
11153
11345
|
{
|
|
11154
11346
|
type: "button",
|
|
11155
11347
|
onClick: () => router.push(buildPath("/shop")),
|
|
11156
|
-
className: "rounded-
|
|
11348
|
+
className: "rounded-xl border-2 border-primary bg-primary text-white px-6 py-3 text-sm font-medium transition-colors flex items-center justify-center gap-2 hover:opacity-80"
|
|
11157
11349
|
},
|
|
11158
11350
|
"Discover products"
|
|
11159
11351
|
)))), !isLoading && processedProducts.length > 0 && /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, viewMode === "grid" ? /* @__PURE__ */ React21__default.default.createElement(
|
|
@@ -11194,7 +11386,7 @@ function WishlistScreen() {
|
|
|
11194
11386
|
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"
|
|
11195
11387
|
},
|
|
11196
11388
|
/* @__PURE__ */ React21__default.default.createElement("div", { className: "relative h-28 w-full overflow-hidden rounded-2xl bg-white sm:w-40" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
11197
|
-
|
|
11389
|
+
Image4__default.default,
|
|
11198
11390
|
{
|
|
11199
11391
|
fill: true,
|
|
11200
11392
|
src: product.productMedia?.[0]?.file || "/placeholder-product.jpg",
|
|
@@ -11202,7 +11394,7 @@ function WishlistScreen() {
|
|
|
11202
11394
|
className: "h-full w-full object-cover"
|
|
11203
11395
|
}
|
|
11204
11396
|
)),
|
|
11205
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-1 flex-col gap-2" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap items-center justify-between gap-3" }, /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "text-lg font-semibold text-
|
|
11397
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-1 flex-col gap-2" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap items-center justify-between gap-3" }, /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "text-lg font-semibold text-secondary" }, product.name), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm text-muted" }, product.parentCategories?.map((category) => category?.name).join(", ") || "General wellness")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "text-right" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-lg font-bold text-primary" }, formatPrice(product.finalPrice ?? 0)), product.isDiscounted && /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xs text-emerald-500" }, "You save ", formatPrice(Math.max((product.priceBeforeDiscount ?? 0) - (product.finalPrice ?? 0), 0))))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap items-center gap-3 text-xs text-slate-500" }, /* @__PURE__ */ React21__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__ */ React21__default.default.createElement(lucideReact.Package, { className: "h-3.5 w-3.5" }), product.inventoryCount > 0 ? "In stock" : "Backordered"), product.totalSold > 0 && /* @__PURE__ */ React21__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__ */ React21__default.default.createElement(lucideReact.Sparkles, { className: "h-3.5 w-3.5" }), product.totalSold, "+ purchased")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex flex-wrap gap-2" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
11206
11398
|
Button,
|
|
11207
11399
|
{
|
|
11208
11400
|
size: "sm",
|
|
@@ -11215,15 +11407,15 @@ function WishlistScreen() {
|
|
|
11215
11407
|
size: "sm",
|
|
11216
11408
|
variant: "outline",
|
|
11217
11409
|
onClick: () => handleRemoveFromWishlist(product.id),
|
|
11218
|
-
className: "text-
|
|
11410
|
+
className: "text-secondary"
|
|
11219
11411
|
},
|
|
11220
11412
|
"Remove"
|
|
11221
11413
|
)))
|
|
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-
|
|
11414
|
+
))))), 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-secondary" }, "Nothing matches those filters"), /* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-2 max-w-md text-sm text-muted" }, "Try showing out-of-stock items or adjust your sort order to revisit everything you've saved."), /* @__PURE__ */ React21__default.default.createElement(
|
|
11223
11415
|
"button",
|
|
11224
11416
|
{
|
|
11225
11417
|
type: "button",
|
|
11226
|
-
className: "mt-6 rounded-
|
|
11418
|
+
className: "mt-6 rounded-xl border-2 border-primary bg-white px-6 py-3 text-sm font-medium text-secondary hover:opacity-80 transition-colors",
|
|
11227
11419
|
onClick: () => setOnlyInStock(false)
|
|
11228
11420
|
},
|
|
11229
11421
|
"Show all saved products"
|
|
@@ -11331,67 +11523,17 @@ function SearchPage() {
|
|
|
11331
11523
|
))), /* @__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(
|
|
11332
11524
|
ProductCard,
|
|
11333
11525
|
{
|
|
11526
|
+
key: product.id,
|
|
11334
11527
|
product,
|
|
11335
11528
|
isFavorited: isInWishlist(product.id),
|
|
11336
11529
|
onClickProduct: (p) => router.push(buildPath(`/products/${p.id}`))
|
|
11337
11530
|
}
|
|
11338
|
-
))) : 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(
|
|
11339
|
-
}
|
|
11340
|
-
function CategoriesScreen() {
|
|
11341
|
-
const { categories, isLoading } = useCategories();
|
|
11342
|
-
const router = navigation.useRouter();
|
|
11343
|
-
const { buildPath } = useBasePath();
|
|
11344
|
-
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(
|
|
11345
|
-
framerMotion.motion.div,
|
|
11346
|
-
{
|
|
11347
|
-
initial: { opacity: 0, y: 24 },
|
|
11348
|
-
animate: { opacity: 1, y: 0 },
|
|
11349
|
-
className: "space-y-6"
|
|
11350
|
-
},
|
|
11351
|
-
/* @__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.Package, { className: "h-4 w-4" }), "Product Categories"),
|
|
11352
|
-
/* @__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: "space-y-4" }, /* @__PURE__ */ React21__default.default.createElement("h1", { className: "text-4xl font-bold md:text-5xl" }, "Browse Our Product Range"), /* @__PURE__ */ React21__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__ */ React21__default.default.createElement("div", { className: "rounded-3xl bg-white/15 p-6 backdrop-blur" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm font-semibold uppercase tracking-[0.35em] text-white/70" }, "Quick tip"), /* @__PURE__ */ React21__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.")))
|
|
11353
|
-
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative -mt-16 pb-16" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
11354
|
-
framerMotion.motion.div,
|
|
11355
|
-
{
|
|
11356
|
-
initial: { opacity: 0, y: 24 },
|
|
11357
|
-
animate: { opacity: 1, y: 0 },
|
|
11358
|
-
className: "rounded-3xl border border-slate-100 bg-white p-6 shadow-lg shadow-primary-50"
|
|
11359
|
-
},
|
|
11360
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3 text-sm text-slate-500 mb-6" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Sparkles, { className: "h-4 w-4 text-primary-500" }), /* @__PURE__ */ React21__default.default.createElement("span", null, "Browse our complete product catalog organized by categories.")),
|
|
11361
|
-
isLoading ? /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6" }, [...Array(8)].map((_, i) => /* @__PURE__ */ React21__default.default.createElement("div", { key: i, className: "animate-pulse" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "bg-gray-200 rounded-lg aspect-square mb-2" }), /* @__PURE__ */ React21__default.default.createElement("div", { className: "h-4 bg-gray-200 rounded w-3/4 mb-1" }), /* @__PURE__ */ React21__default.default.createElement("div", { className: "h-3 bg-gray-200 rounded w-1/2" })))) : categories.length > 0 ? /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6" }, categories.map((category) => /* @__PURE__ */ React21__default.default.createElement(
|
|
11362
|
-
Link8__default.default,
|
|
11363
|
-
{
|
|
11364
|
-
key: category.id,
|
|
11365
|
-
href: buildPath(`/shop?category=${category.name}`),
|
|
11366
|
-
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"
|
|
11367
|
-
},
|
|
11368
|
-
/* @__PURE__ */ React21__default.default.createElement("div", { className: "relative aspect-square w-full overflow-hidden rounded-lg bg-gray-50 mb-3" }, category.image ? /* @__PURE__ */ React21__default.default.createElement(
|
|
11369
|
-
Image3__default.default,
|
|
11370
|
-
{
|
|
11371
|
-
src: category.image,
|
|
11372
|
-
alt: category.name || "Category Image",
|
|
11373
|
-
fill: true,
|
|
11374
|
-
className: "object-cover transition-transform group-hover:scale-105",
|
|
11375
|
-
sizes: "(max-width: 768px) 50vw, (max-width: 1200px) 33vw, 25vw"
|
|
11376
|
-
}
|
|
11377
|
-
) : /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex h-full w-full items-center justify-center bg-gray-100 text-gray-400" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Package, { className: "h-12 w-12" }))),
|
|
11378
|
-
/* @__PURE__ */ React21__default.default.createElement("h3", { className: "text-lg font-semibold text-gray-900 group-hover:text-primary-600 transition-colors" }, category.name),
|
|
11379
|
-
category.productCount > 0 && /* @__PURE__ */ React21__default.default.createElement("p", { className: "mt-1 text-sm text-gray-500" }, category.productCount, " ", category.productCount === 1 ? "product" : "products")
|
|
11380
|
-
))) : /* @__PURE__ */ React21__default.default.createElement(
|
|
11381
|
-
EmptyState,
|
|
11382
|
-
{
|
|
11383
|
-
title: "No categories found",
|
|
11384
|
-
description: "There are currently no product categories available.",
|
|
11385
|
-
icon: lucideReact.Package,
|
|
11386
|
-
actionLabel: "Shop products",
|
|
11387
|
-
onAction: () => router.push(buildPath("/shop"))
|
|
11388
|
-
}
|
|
11389
|
-
)
|
|
11390
|
-
))));
|
|
11531
|
+
))) : 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(Link7__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"))));
|
|
11391
11532
|
}
|
|
11392
11533
|
function NewAddressPage() {
|
|
11393
11534
|
const router = navigation.useRouter();
|
|
11394
11535
|
const [isSubmitting, setIsSubmitting] = React21.useState(false);
|
|
11536
|
+
const notification = useNotification();
|
|
11395
11537
|
const {
|
|
11396
11538
|
register,
|
|
11397
11539
|
handleSubmit,
|
|
@@ -11417,7 +11559,10 @@ function NewAddressPage() {
|
|
|
11417
11559
|
country: data.country,
|
|
11418
11560
|
phone: data.phone
|
|
11419
11561
|
});
|
|
11420
|
-
|
|
11562
|
+
notification.success(
|
|
11563
|
+
"Address added",
|
|
11564
|
+
"Your new address has been saved to your account."
|
|
11565
|
+
);
|
|
11421
11566
|
router.back();
|
|
11422
11567
|
} catch (error) {
|
|
11423
11568
|
let errorMessage = "An unexpected error occurred";
|
|
@@ -11432,15 +11577,17 @@ function NewAddressPage() {
|
|
|
11432
11577
|
if (error.message === "Network Error") {
|
|
11433
11578
|
errorMessage = "Unable to connect to the server. Please check your internet connection.";
|
|
11434
11579
|
}
|
|
11435
|
-
|
|
11436
|
-
|
|
11437
|
-
|
|
11438
|
-
|
|
11580
|
+
notification.error(
|
|
11581
|
+
"Unable to save address",
|
|
11582
|
+
errorMessage,
|
|
11583
|
+
5e3
|
|
11584
|
+
);
|
|
11439
11585
|
if (error.response?.status === 422) {
|
|
11440
|
-
|
|
11441
|
-
|
|
11442
|
-
|
|
11443
|
-
|
|
11586
|
+
notification.info(
|
|
11587
|
+
"Address validation failed",
|
|
11588
|
+
"Make sure your address is complete and formatted correctly.",
|
|
11589
|
+
6e3
|
|
11590
|
+
);
|
|
11444
11591
|
}
|
|
11445
11592
|
} finally {
|
|
11446
11593
|
setIsSubmitting(false);
|
|
@@ -11529,31 +11676,42 @@ function NewAddressPage() {
|
|
|
11529
11676
|
}
|
|
11530
11677
|
function Header() {
|
|
11531
11678
|
const { config } = useTheme();
|
|
11532
|
-
const { user, isAuthenticated } = useAuth();
|
|
11679
|
+
const { user, isAuthenticated, logout } = useAuth();
|
|
11533
11680
|
const { cart } = useCart() || { cart: { } };
|
|
11534
11681
|
const { getWishlistCount } = useWishlist();
|
|
11535
11682
|
const wishlistCount = getWishlistCount?.() || 0;
|
|
11536
11683
|
const [isMobileMenuOpen, setIsMobileMenuOpen] = React21.useState(false);
|
|
11537
11684
|
const [isSearchOpen, setIsSearchOpen] = React21.useState(false);
|
|
11685
|
+
const [isDropdownOpen, setIsDropdownOpen] = React21.useState(false);
|
|
11686
|
+
const [isLoggingOut, setIsLoggingOut] = React21.useState(false);
|
|
11538
11687
|
const [searchQuery, setSearchQuery] = React21.useState("");
|
|
11539
11688
|
const { buildPath } = useBasePath();
|
|
11689
|
+
const router = navigation.useRouter();
|
|
11690
|
+
const handleLogout = async () => {
|
|
11691
|
+
setIsLoggingOut(true);
|
|
11692
|
+
try {
|
|
11693
|
+
await logout();
|
|
11694
|
+
router.push(buildPath("/"));
|
|
11695
|
+
} catch (error) {
|
|
11696
|
+
console.error("Logout failed:", error);
|
|
11697
|
+
} finally {
|
|
11698
|
+
setIsLoggingOut(false);
|
|
11699
|
+
setIsDropdownOpen(false);
|
|
11700
|
+
}
|
|
11701
|
+
};
|
|
11540
11702
|
const navLinks = [
|
|
11541
|
-
{ href: buildPath("/shop"), label: "Shop" }
|
|
11542
|
-
{ href: buildPath("/categories"), label: "Categories" },
|
|
11543
|
-
{ href: buildPath("/orders"), label: "Orders" },
|
|
11544
|
-
{ href: buildPath("/about"), label: "About" },
|
|
11545
|
-
{ href: buildPath("/contact"), label: "Contact" }
|
|
11703
|
+
{ href: buildPath("/shop"), label: "Shop" }
|
|
11546
11704
|
];
|
|
11547
|
-
return /* @__PURE__ */ React21__default.default.createElement("header", { className: "sticky top-0 z-
|
|
11548
|
-
|
|
11705
|
+
return /* @__PURE__ */ React21__default.default.createElement("header", { className: "sticky top-0 z-10 bg-white/80 backdrop-blur-xl border-b border-gray-200 shadow-sm" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center justify-between h-20" }, /* @__PURE__ */ React21__default.default.createElement(Link7__default.default, { href: buildPath("/"), className: "flex items-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "relative w-12 h-12" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
11706
|
+
Image4__default.default,
|
|
11549
11707
|
{
|
|
11550
11708
|
src: config.logo,
|
|
11551
11709
|
alt: config.storeName,
|
|
11552
11710
|
fill: true,
|
|
11553
11711
|
className: "object-contain"
|
|
11554
11712
|
}
|
|
11555
|
-
))
|
|
11556
|
-
|
|
11713
|
+
))), /* @__PURE__ */ React21__default.default.createElement("nav", { className: "hidden lg:flex items-center gap-8" }, navLinks.map((link) => /* @__PURE__ */ React21__default.default.createElement(
|
|
11714
|
+
Link7__default.default,
|
|
11557
11715
|
{
|
|
11558
11716
|
key: link.href,
|
|
11559
11717
|
href: link.href,
|
|
@@ -11600,15 +11758,40 @@ function Header() {
|
|
|
11600
11758
|
},
|
|
11601
11759
|
/* @__PURE__ */ React21__default.default.createElement(lucideReact.X, { className: "w-4 h-4" })
|
|
11602
11760
|
))
|
|
11603
|
-
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
11604
|
-
|
|
11761
|
+
))), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ React21__default.default.createElement(Link7__default.default, { href: buildPath("/wishlist"), className: "relative p-2 text-gray-700 hover:text-red-500 transition-colors" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Heart, { className: "w-6 h-6" }), wishlistCount > 0 && /* @__PURE__ */ React21__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__ */ React21__default.default.createElement(Link7__default.default, { href: buildPath("/cart"), className: "relative p-2 text-gray-700 hover:text-primary-600 transition-colors" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.ShoppingCart, { className: "w-6 h-6" }), cart?.cartBody?.items?.length && cart.cartBody?.items?.length > 0 ? /* @__PURE__ */ React21__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__ */ React21__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React21__default.default.createElement(
|
|
11762
|
+
"button",
|
|
11763
|
+
{
|
|
11764
|
+
onClick: () => setIsDropdownOpen(!isDropdownOpen),
|
|
11765
|
+
className: "flex items-center gap-2 rounded-full border border-slate-200 bg-white px-3 py-2 hover:bg-slate-50 transition-colors"
|
|
11766
|
+
},
|
|
11767
|
+
/* @__PURE__ */ React21__default.default.createElement("div", { className: "flex h-7 w-7 items-center justify-center rounded-full bg-primary-100 text-xs font-semibold text-primary-700" }, getInitials(user?.firstname || "", user?.lastname || "")),
|
|
11768
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.ChevronDown, { className: `h-4 w-4 text-slate-400 transition-transform ${isDropdownOpen ? "rotate-180" : ""}` })
|
|
11769
|
+
), isDropdownOpen && /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement(
|
|
11770
|
+
"div",
|
|
11771
|
+
{
|
|
11772
|
+
className: "fixed inset-0 z-10",
|
|
11773
|
+
onClick: () => setIsDropdownOpen(false)
|
|
11774
|
+
}
|
|
11775
|
+
), /* @__PURE__ */ React21__default.default.createElement("div", { className: "absolute right-0 top-full mt-2 w-56 rounded-lg border border-slate-200 bg-white shadow-lg z-20" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "p-2" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "px-3 py-2 border-b border-slate-200 mb-1" }, /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-sm font-medium text-secondary truncate" }, user?.firstname, " ", user?.lastname), /* @__PURE__ */ React21__default.default.createElement("p", { className: "text-xs text-slate-500 truncate" }, user?.email)), /* @__PURE__ */ React21__default.default.createElement(
|
|
11776
|
+
Link7__default.default,
|
|
11605
11777
|
{
|
|
11606
11778
|
href: buildPath("/account"),
|
|
11607
|
-
|
|
11779
|
+
onClick: () => setIsDropdownOpen(false),
|
|
11780
|
+
className: "flex w-full items-center gap-2 rounded-md px-3 py-2 text-sm text-slate-700 hover:bg-slate-100 transition-colors"
|
|
11608
11781
|
},
|
|
11609
|
-
/* @__PURE__ */ React21__default.default.createElement(lucideReact.User, { className: "
|
|
11610
|
-
|
|
11611
|
-
|
|
11782
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.User, { className: "h-4 w-4" }),
|
|
11783
|
+
"My Account"
|
|
11784
|
+
), /* @__PURE__ */ React21__default.default.createElement("div", { className: "my-1 border-t border-slate-200" }), /* @__PURE__ */ React21__default.default.createElement(
|
|
11785
|
+
"button",
|
|
11786
|
+
{
|
|
11787
|
+
onClick: handleLogout,
|
|
11788
|
+
disabled: isLoggingOut,
|
|
11789
|
+
className: "flex w-full items-center gap-2 rounded-md px-3 py-2 text-sm text-red-600 hover:bg-red-50 transition-colors disabled:opacity-50"
|
|
11790
|
+
},
|
|
11791
|
+
/* @__PURE__ */ React21__default.default.createElement(lucideReact.LogOut, { className: "h-4 w-4" }),
|
|
11792
|
+
isLoggingOut ? "Signing out..." : "Sign Out"
|
|
11793
|
+
))))) : /* @__PURE__ */ React21__default.default.createElement(
|
|
11794
|
+
Link7__default.default,
|
|
11612
11795
|
{
|
|
11613
11796
|
href: buildPath("/login"),
|
|
11614
11797
|
className: "hidden sm:block px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors font-medium"
|
|
@@ -11630,7 +11813,7 @@ function Header() {
|
|
|
11630
11813
|
className: "lg:hidden overflow-hidden border-t border-gray-200"
|
|
11631
11814
|
},
|
|
11632
11815
|
/* @__PURE__ */ React21__default.default.createElement("nav", { className: "flex flex-col gap-1 py-2" }, navLinks.map((link) => /* @__PURE__ */ React21__default.default.createElement(
|
|
11633
|
-
|
|
11816
|
+
Link7__default.default,
|
|
11634
11817
|
{
|
|
11635
11818
|
key: link.href,
|
|
11636
11819
|
href: link.href,
|
|
@@ -11639,7 +11822,7 @@ function Header() {
|
|
|
11639
11822
|
},
|
|
11640
11823
|
link.label
|
|
11641
11824
|
)), !isAuthenticated && /* @__PURE__ */ React21__default.default.createElement(
|
|
11642
|
-
|
|
11825
|
+
Link7__default.default,
|
|
11643
11826
|
{
|
|
11644
11827
|
href: buildPath("/login"),
|
|
11645
11828
|
onClick: () => setIsMobileMenuOpen(false),
|
|
@@ -11678,21 +11861,21 @@ function Footer() {
|
|
|
11678
11861
|
]
|
|
11679
11862
|
};
|
|
11680
11863
|
return /* @__PURE__ */ React21__default.default.createElement("footer", { className: "bg-gray-900 text-gray-300" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "container mx-auto px-4 py-16" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-12" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "lg:col-span-2" }, /* @__PURE__ */ React21__default.default.createElement("h3", { className: "text-2xl font-bold text-white mb-4" }, config.storeName), /* @__PURE__ */ React21__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__ */ React21__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Mail, { className: "w-5 h-5 text-primary-500" }), /* @__PURE__ */ React21__default.default.createElement("span", null, "support@", config.storeName.toLowerCase().replace(/\s+/g, ""), ".com")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.Phone, { className: "w-5 h-5 text-primary-500" }), /* @__PURE__ */ React21__default.default.createElement("span", null, "+1 (555) 123-4567")), /* @__PURE__ */ React21__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React21__default.default.createElement(lucideReact.MapPin, { className: "w-5 h-5 text-primary-500" }), /* @__PURE__ */ React21__default.default.createElement("span", null, "123 Store Street, City, Country")))), /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("h4", { className: "text-lg font-semibold text-white mb-4" }, "Shop"), /* @__PURE__ */ React21__default.default.createElement("ul", { className: "space-y-2" }, footerLinks.shop.map((link) => /* @__PURE__ */ React21__default.default.createElement("li", { key: link.href }, /* @__PURE__ */ React21__default.default.createElement(
|
|
11681
|
-
|
|
11864
|
+
Link7__default.default,
|
|
11682
11865
|
{
|
|
11683
11866
|
href: link.href,
|
|
11684
11867
|
className: "hover:text-primary-500 transition-colors"
|
|
11685
11868
|
},
|
|
11686
11869
|
link.label
|
|
11687
11870
|
))))), /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("h4", { className: "text-lg font-semibold text-white mb-4" }, "Account"), /* @__PURE__ */ React21__default.default.createElement("ul", { className: "space-y-2" }, footerLinks.account.map((link) => /* @__PURE__ */ React21__default.default.createElement("li", { key: link.href }, /* @__PURE__ */ React21__default.default.createElement(
|
|
11688
|
-
|
|
11871
|
+
Link7__default.default,
|
|
11689
11872
|
{
|
|
11690
11873
|
href: link.href,
|
|
11691
11874
|
className: "hover:text-primary-500 transition-colors"
|
|
11692
11875
|
},
|
|
11693
11876
|
link.label
|
|
11694
11877
|
))))), /* @__PURE__ */ React21__default.default.createElement("div", null, /* @__PURE__ */ React21__default.default.createElement("h4", { className: "text-lg font-semibold text-white mb-4" }, "Support"), /* @__PURE__ */ React21__default.default.createElement("ul", { className: "space-y-2" }, footerLinks.support.map((link) => /* @__PURE__ */ React21__default.default.createElement("li", { key: link.href }, /* @__PURE__ */ React21__default.default.createElement(
|
|
11695
|
-
|
|
11878
|
+
Link7__default.default,
|
|
11696
11879
|
{
|
|
11697
11880
|
href: link.href,
|
|
11698
11881
|
className: "hover:text-primary-500 transition-colors"
|
|
@@ -11729,7 +11912,6 @@ exports.Button = Button;
|
|
|
11729
11912
|
exports.CartItem = CartItem;
|
|
11730
11913
|
exports.CartProvider = CartProvider;
|
|
11731
11914
|
exports.CartScreen = CartScreen;
|
|
11732
|
-
exports.CategoriesScreen = CategoriesScreen;
|
|
11733
11915
|
exports.CheckoutScreen = CheckoutScreen;
|
|
11734
11916
|
exports.CurrentOrdersScreen = CurrentOrdersScreen;
|
|
11735
11917
|
exports.EcommerceProvider = EcommerceProvider;
|