hey-pharmacist-ecommerce 1.1.2 → 1.1.3
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 +9 -2
- package/dist/index.d.ts +9 -2
- package/dist/index.js +610 -588
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +416 -395
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/ProductCard.tsx +3 -1
- package/src/index.ts +1 -0
- package/src/providers/BasePathProvider.tsx +36 -0
- package/src/providers/EcommerceProvider.tsx +13 -9
- package/src/screens/HomeScreen.tsx +4 -2
- package/src/screens/SearchResultsScreen.tsx +4 -2
- package/src/screens/ShopScreen.tsx +5 -3
- package/src/screens/WishlistScreen.tsx +3 -1
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var React20 = require('react');
|
|
5
5
|
var globalAxios4 = require('axios');
|
|
6
6
|
var sonner = require('sonner');
|
|
7
7
|
var reactQuery = require('@tanstack/react-query');
|
|
@@ -17,7 +17,7 @@ var zod = require('zod');
|
|
|
17
17
|
|
|
18
18
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
19
19
|
|
|
20
|
-
var
|
|
20
|
+
var React20__default = /*#__PURE__*/_interopDefault(React20);
|
|
21
21
|
var globalAxios4__default = /*#__PURE__*/_interopDefault(globalAxios4);
|
|
22
22
|
var Image3__default = /*#__PURE__*/_interopDefault(Image3);
|
|
23
23
|
var dynamic__default = /*#__PURE__*/_interopDefault(dynamic);
|
|
@@ -68,16 +68,16 @@ function darken(r, g, b, amount) {
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
// src/providers/ThemeProvider.tsx
|
|
71
|
-
var ThemeContext =
|
|
71
|
+
var ThemeContext = React20.createContext(void 0);
|
|
72
72
|
function useTheme() {
|
|
73
|
-
const context =
|
|
73
|
+
const context = React20.useContext(ThemeContext);
|
|
74
74
|
if (!context) {
|
|
75
75
|
throw new Error("useTheme must be used within ThemeProvider");
|
|
76
76
|
}
|
|
77
77
|
return context;
|
|
78
78
|
}
|
|
79
79
|
function ThemeProvider({ config, children }) {
|
|
80
|
-
|
|
80
|
+
React20.useEffect(() => {
|
|
81
81
|
const primaryShades = generateColorShades(config.colors.primary);
|
|
82
82
|
const secondaryShades = generateColorShades(config.colors.secondary);
|
|
83
83
|
const accentShades = generateColorShades(config.colors.accent);
|
|
@@ -104,7 +104,7 @@ function ThemeProvider({ config, children }) {
|
|
|
104
104
|
root.style.setProperty(`--header-to`, secondaryShades[600]);
|
|
105
105
|
}
|
|
106
106
|
}, [config]);
|
|
107
|
-
return /* @__PURE__ */
|
|
107
|
+
return /* @__PURE__ */ React20__default.default.createElement(ThemeContext.Provider, { value: { config } }, children);
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
// src/lib/Apis/configuration.ts
|
|
@@ -1895,19 +1895,19 @@ var AuthApi = class extends BaseAPI {
|
|
|
1895
1895
|
};
|
|
1896
1896
|
|
|
1897
1897
|
// src/providers/AuthProvider.tsx
|
|
1898
|
-
var AuthContext =
|
|
1898
|
+
var AuthContext = React20.createContext(void 0);
|
|
1899
1899
|
function useAuth() {
|
|
1900
|
-
const context =
|
|
1900
|
+
const context = React20.useContext(AuthContext);
|
|
1901
1901
|
if (!context) {
|
|
1902
1902
|
throw new Error("useAuth must be used within AuthProvider");
|
|
1903
1903
|
}
|
|
1904
1904
|
return context;
|
|
1905
1905
|
}
|
|
1906
1906
|
function AuthProvider({ children }) {
|
|
1907
|
-
const [user, setUser] =
|
|
1908
|
-
const [isLoading, setIsLoading] =
|
|
1907
|
+
const [user, setUser] = React20.useState(null);
|
|
1908
|
+
const [isLoading, setIsLoading] = React20.useState(true);
|
|
1909
1909
|
const USER_KEY = "ecommerce_user";
|
|
1910
|
-
const refreshUser =
|
|
1910
|
+
const refreshUser = React20.useCallback(async () => {
|
|
1911
1911
|
try {
|
|
1912
1912
|
const token = getAuthToken();
|
|
1913
1913
|
if (token) {
|
|
@@ -1921,7 +1921,7 @@ function AuthProvider({ children }) {
|
|
|
1921
1921
|
setIsLoading(false);
|
|
1922
1922
|
}
|
|
1923
1923
|
}, []);
|
|
1924
|
-
|
|
1924
|
+
React20.useEffect(() => {
|
|
1925
1925
|
if (typeof window !== "undefined") {
|
|
1926
1926
|
try {
|
|
1927
1927
|
const cached = localStorage.getItem(USER_KEY);
|
|
@@ -2002,7 +2002,7 @@ function AuthProvider({ children }) {
|
|
|
2002
2002
|
updateUser,
|
|
2003
2003
|
refreshUser
|
|
2004
2004
|
};
|
|
2005
|
-
return /* @__PURE__ */
|
|
2005
|
+
return /* @__PURE__ */ React20__default.default.createElement(AuthContext.Provider, { value }, children);
|
|
2006
2006
|
}
|
|
2007
2007
|
var AddressesApiAxiosParamCreator = function(configuration) {
|
|
2008
2008
|
return {
|
|
@@ -6707,19 +6707,19 @@ var PaymentPaymentStatusEnum = /* @__PURE__ */ ((PaymentPaymentStatusEnum2) => {
|
|
|
6707
6707
|
})(PaymentPaymentStatusEnum || {});
|
|
6708
6708
|
|
|
6709
6709
|
// src/providers/CartProvider.tsx
|
|
6710
|
-
var CartContext =
|
|
6710
|
+
var CartContext = React20.createContext(void 0);
|
|
6711
6711
|
function useCart() {
|
|
6712
|
-
const context =
|
|
6712
|
+
const context = React20.useContext(CartContext);
|
|
6713
6713
|
if (!context) {
|
|
6714
6714
|
throw new Error("useCart must be used within CartProvider");
|
|
6715
6715
|
}
|
|
6716
6716
|
return context;
|
|
6717
6717
|
}
|
|
6718
6718
|
function CartProvider({ children }) {
|
|
6719
|
-
const [cart, setCart] =
|
|
6720
|
-
const [isLoading, setIsLoading] =
|
|
6719
|
+
const [cart, setCart] = React20.useState(null);
|
|
6720
|
+
const [isLoading, setIsLoading] = React20.useState(false);
|
|
6721
6721
|
const { isAuthenticated } = useAuth();
|
|
6722
|
-
const refreshCart =
|
|
6722
|
+
const refreshCart = React20.useCallback(async () => {
|
|
6723
6723
|
if (!isAuthenticated) {
|
|
6724
6724
|
setCart(null);
|
|
6725
6725
|
return;
|
|
@@ -6731,7 +6731,7 @@ function CartProvider({ children }) {
|
|
|
6731
6731
|
console.error("Failed to fetch cart:", error);
|
|
6732
6732
|
}
|
|
6733
6733
|
}, [isAuthenticated]);
|
|
6734
|
-
|
|
6734
|
+
React20.useEffect(() => {
|
|
6735
6735
|
refreshCart();
|
|
6736
6736
|
}, [refreshCart]);
|
|
6737
6737
|
const addToCart = async (productId, quantity = 1, variantId) => {
|
|
@@ -6792,7 +6792,7 @@ function CartProvider({ children }) {
|
|
|
6792
6792
|
clearCart,
|
|
6793
6793
|
refreshCart
|
|
6794
6794
|
};
|
|
6795
|
-
return /* @__PURE__ */
|
|
6795
|
+
return /* @__PURE__ */ React20__default.default.createElement(CartContext.Provider, { value }, children);
|
|
6796
6796
|
}
|
|
6797
6797
|
var BaseUrl = "https://api.heypharmacist.com";
|
|
6798
6798
|
globalAxios4__default.default.interceptors.request.use(async (config) => {
|
|
@@ -6825,9 +6825,9 @@ var AXIOS_CONFIG = new Configuration({
|
|
|
6825
6825
|
timeout: 2e4
|
|
6826
6826
|
}
|
|
6827
6827
|
});
|
|
6828
|
-
var WishlistContext =
|
|
6828
|
+
var WishlistContext = React20.createContext(void 0);
|
|
6829
6829
|
function WishlistProvider({ children }) {
|
|
6830
|
-
const [state, setState] =
|
|
6830
|
+
const [state, setState] = React20.useState({
|
|
6831
6831
|
_id: "",
|
|
6832
6832
|
createdAt: /* @__PURE__ */ new Date(),
|
|
6833
6833
|
updatedAt: /* @__PURE__ */ new Date(),
|
|
@@ -6835,8 +6835,8 @@ function WishlistProvider({ children }) {
|
|
|
6835
6835
|
products: []
|
|
6836
6836
|
});
|
|
6837
6837
|
const { isAuthenticated } = useAuth() || {};
|
|
6838
|
-
const wishlistApi =
|
|
6839
|
-
const fetchWishlist =
|
|
6838
|
+
const wishlistApi = React20.useMemo(() => new WishlistApi(AXIOS_CONFIG), []);
|
|
6839
|
+
const fetchWishlist = React20.useCallback(async () => {
|
|
6840
6840
|
if (!isAuthenticated) {
|
|
6841
6841
|
setState((prev) => ({
|
|
6842
6842
|
...prev,
|
|
@@ -6865,7 +6865,7 @@ function WishlistProvider({ children }) {
|
|
|
6865
6865
|
}));
|
|
6866
6866
|
}
|
|
6867
6867
|
}, [isAuthenticated]);
|
|
6868
|
-
|
|
6868
|
+
React20.useEffect(() => {
|
|
6869
6869
|
fetchWishlist();
|
|
6870
6870
|
}, [fetchWishlist]);
|
|
6871
6871
|
const addToWishlist = async (product) => {
|
|
@@ -6927,7 +6927,7 @@ function WishlistProvider({ children }) {
|
|
|
6927
6927
|
const refreshWishlist = async () => {
|
|
6928
6928
|
await fetchWishlist();
|
|
6929
6929
|
};
|
|
6930
|
-
return /* @__PURE__ */
|
|
6930
|
+
return /* @__PURE__ */ React20__default.default.createElement(
|
|
6931
6931
|
WishlistContext.Provider,
|
|
6932
6932
|
{
|
|
6933
6933
|
value: {
|
|
@@ -6944,20 +6944,37 @@ function WishlistProvider({ children }) {
|
|
|
6944
6944
|
);
|
|
6945
6945
|
}
|
|
6946
6946
|
var useWishlist = () => {
|
|
6947
|
-
const context =
|
|
6947
|
+
const context = React20.useContext(WishlistContext);
|
|
6948
6948
|
if (context === void 0) {
|
|
6949
6949
|
throw new Error("useWishlist must be used within a WishlistProvider");
|
|
6950
6950
|
}
|
|
6951
6951
|
return context;
|
|
6952
6952
|
};
|
|
6953
|
-
|
|
6954
|
-
|
|
6953
|
+
var BasePathContext = React20.createContext(void 0);
|
|
6954
|
+
function BasePathProvider({ basePath = "", children }) {
|
|
6955
|
+
const normalized = basePath ? basePath.startsWith("/") ? basePath : `/${basePath}` : "";
|
|
6956
|
+
const buildPath = (path) => {
|
|
6957
|
+
if (!normalized) return path;
|
|
6958
|
+
if (!path) return normalized;
|
|
6959
|
+
if (path.startsWith(normalized + "/")) return path;
|
|
6960
|
+
if (path.startsWith("/")) return `${normalized}${path}`;
|
|
6961
|
+
return `${normalized}/${path}`;
|
|
6962
|
+
};
|
|
6963
|
+
return /* @__PURE__ */ React20__default.default.createElement(BasePathContext.Provider, { value: { basePath: normalized, buildPath } }, children);
|
|
6964
|
+
}
|
|
6965
|
+
function useBasePath() {
|
|
6966
|
+
const ctx = React20.useContext(BasePathContext);
|
|
6967
|
+
if (!ctx) throw new Error("useBasePath must be used within BasePathProvider");
|
|
6968
|
+
return ctx;
|
|
6969
|
+
}
|
|
6970
|
+
function EcommerceProvider({ config, children, withToaster = true, basePath = "" }) {
|
|
6971
|
+
React20.useEffect(() => {
|
|
6955
6972
|
initializeApiAdapter(config);
|
|
6956
6973
|
}, [config]);
|
|
6957
|
-
const [client] =
|
|
6974
|
+
const [client] = React20__default.default.useState(
|
|
6958
6975
|
new reactQuery.QueryClient({ defaultOptions: { queries: { staleTime: 5e3 } } })
|
|
6959
6976
|
);
|
|
6960
|
-
return /* @__PURE__ */
|
|
6977
|
+
return /* @__PURE__ */ React20__default.default.createElement(reactQuery.QueryClientProvider, { client }, /* @__PURE__ */ React20__default.default.createElement(ThemeProvider, { config }, /* @__PURE__ */ React20__default.default.createElement(BasePathProvider, { basePath }, /* @__PURE__ */ React20__default.default.createElement(AuthProvider, null, /* @__PURE__ */ React20__default.default.createElement(CartProvider, null, /* @__PURE__ */ React20__default.default.createElement(WishlistProvider, null, children, withToaster && /* @__PURE__ */ React20__default.default.createElement(sonner.Toaster, { position: "top-right", richColors: true })))))));
|
|
6961
6978
|
}
|
|
6962
6979
|
|
|
6963
6980
|
// src/lib/utils/format.ts
|
|
@@ -7000,14 +7017,15 @@ function ProductCard({
|
|
|
7000
7017
|
className
|
|
7001
7018
|
}) {
|
|
7002
7019
|
const router = navigation.useRouter();
|
|
7003
|
-
const
|
|
7020
|
+
const { buildPath } = useBasePath();
|
|
7021
|
+
const [isFavorite, setIsFavorite] = React20.useState(isFavorited);
|
|
7004
7022
|
const { addToWishlist, removeFromWishlist, isInWishlist } = useWishlist();
|
|
7005
|
-
const [isHovered, setIsHovered] =
|
|
7006
|
-
const [isImageLoaded, setIsImageLoaded] =
|
|
7007
|
-
const handleImageLoad =
|
|
7023
|
+
const [isHovered, setIsHovered] = React20.useState(false);
|
|
7024
|
+
const [isImageLoaded, setIsImageLoaded] = React20.useState(false);
|
|
7025
|
+
const handleImageLoad = React20.useCallback(() => {
|
|
7008
7026
|
setIsImageLoaded(true);
|
|
7009
7027
|
}, []);
|
|
7010
|
-
const handleCardClick =
|
|
7028
|
+
const handleCardClick = React20.useCallback((e) => {
|
|
7011
7029
|
if (onClickProduct) {
|
|
7012
7030
|
e.preventDefault();
|
|
7013
7031
|
onClickProduct(product);
|
|
@@ -7031,7 +7049,7 @@ function ProductCard({
|
|
|
7031
7049
|
sonner.toast.error("Failed to update wishlist");
|
|
7032
7050
|
}
|
|
7033
7051
|
};
|
|
7034
|
-
|
|
7052
|
+
React20.useEffect(() => {
|
|
7035
7053
|
setIsFavorite(isInWishlist(product?._id || "") || isFavorited);
|
|
7036
7054
|
}, [isFavorited, isInWishlist, product?._id]);
|
|
7037
7055
|
const handleKeyDown = (e) => {
|
|
@@ -7040,13 +7058,13 @@ function ProductCard({
|
|
|
7040
7058
|
handleCardClick(e);
|
|
7041
7059
|
}
|
|
7042
7060
|
};
|
|
7043
|
-
|
|
7061
|
+
React20.useMemo(() => {
|
|
7044
7062
|
return {
|
|
7045
7063
|
src: product.productMedia?.[0]?.file || "/placeholder-product.jpg",
|
|
7046
7064
|
alt: product.name || "Product image"
|
|
7047
7065
|
};
|
|
7048
7066
|
}, [product.productMedia, product.name]);
|
|
7049
|
-
return /* @__PURE__ */
|
|
7067
|
+
return /* @__PURE__ */ React20__default.default.createElement(
|
|
7050
7068
|
framerMotion.motion.article,
|
|
7051
7069
|
{
|
|
7052
7070
|
className: "relative group bg-white rounded-xl overflow-hidden shadow-sm hover:shadow-md transition-all duration-300 border border-gray-100 hover:border-gray-200 flex h-[420px] flex-col",
|
|
@@ -7059,7 +7077,7 @@ function ProductCard({
|
|
|
7059
7077
|
onClick: handleCardClick,
|
|
7060
7078
|
onKeyDown: handleKeyDown
|
|
7061
7079
|
},
|
|
7062
|
-
/* @__PURE__ */
|
|
7080
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "relative h-48 w-full overflow-hidden bg-gray-50" }, /* @__PURE__ */ React20__default.default.createElement(framerMotion.AnimatePresence, null, !isImageLoaded && /* @__PURE__ */ React20__default.default.createElement(
|
|
7063
7081
|
framerMotion.motion.div,
|
|
7064
7082
|
{
|
|
7065
7083
|
className: "absolute inset-0 bg-gray-200 animate-pulse",
|
|
@@ -7067,7 +7085,7 @@ function ProductCard({
|
|
|
7067
7085
|
exit: { opacity: 0 },
|
|
7068
7086
|
transition: { duration: 0.2 }
|
|
7069
7087
|
}
|
|
7070
|
-
)), product.productMedia?.[0]?.file && /* @__PURE__ */
|
|
7088
|
+
)), product.productMedia?.[0]?.file && /* @__PURE__ */ React20__default.default.createElement(
|
|
7071
7089
|
Image3__default.default,
|
|
7072
7090
|
{
|
|
7073
7091
|
src: product.productMedia?.[0]?.file || "/placeholder-product.jpg",
|
|
@@ -7078,7 +7096,7 @@ function ProductCard({
|
|
|
7078
7096
|
priority: false,
|
|
7079
7097
|
onLoad: handleImageLoad
|
|
7080
7098
|
}
|
|
7081
|
-
), /* @__PURE__ */
|
|
7099
|
+
), /* @__PURE__ */ React20__default.default.createElement("div", { className: "absolute top-3 left-3 flex flex-col gap-2 z-10" }, product.isDiscounted && /* @__PURE__ */ React20__default.default.createElement(
|
|
7082
7100
|
framerMotion.motion.span,
|
|
7083
7101
|
{
|
|
7084
7102
|
initial: { scale: 0.9, opacity: 0 },
|
|
@@ -7088,7 +7106,7 @@ function ProductCard({
|
|
|
7088
7106
|
"-",
|
|
7089
7107
|
product.discountAmount,
|
|
7090
7108
|
"%"
|
|
7091
|
-
), product.inventoryCount === 0 && /* @__PURE__ */
|
|
7109
|
+
), product.inventoryCount === 0 && /* @__PURE__ */ React20__default.default.createElement(
|
|
7092
7110
|
framerMotion.motion.span,
|
|
7093
7111
|
{
|
|
7094
7112
|
initial: { scale: 0.9, opacity: 0 },
|
|
@@ -7096,7 +7114,7 @@ function ProductCard({
|
|
|
7096
7114
|
className: "inline-flex items-center justify-center px-2.5 py-1 rounded-full text-xs font-bold text-white bg-red-600"
|
|
7097
7115
|
},
|
|
7098
7116
|
"Out of Stock"
|
|
7099
|
-
)), showFavoriteButton && /* @__PURE__ */
|
|
7117
|
+
)), showFavoriteButton && /* @__PURE__ */ React20__default.default.createElement(
|
|
7100
7118
|
framerMotion.motion.button,
|
|
7101
7119
|
{
|
|
7102
7120
|
type: "button",
|
|
@@ -7106,10 +7124,10 @@ function ProductCard({
|
|
|
7106
7124
|
whileTap: { scale: 0.95 },
|
|
7107
7125
|
"aria-label": isFavorite ? "Remove from wishlist" : "Add to wishlist"
|
|
7108
7126
|
},
|
|
7109
|
-
/* @__PURE__ */
|
|
7127
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Heart, { className: `w-5 h-5 ${isFavorite ? "fill-current" : ""}` })
|
|
7110
7128
|
)),
|
|
7111
|
-
/* @__PURE__ */
|
|
7112
|
-
showFavoriteButton && /* @__PURE__ */
|
|
7129
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "absolute top-4 left-4 flex flex-col gap-2" }, product.inventoryCount === 0 && /* @__PURE__ */ React20__default.default.createElement("span", { className: "px-3 py-1 rounded-full text-sm font-bold bg-red-100 text-red-800" }, "Out of Stock")),
|
|
7130
|
+
showFavoriteButton && /* @__PURE__ */ React20__default.default.createElement(
|
|
7113
7131
|
"button",
|
|
7114
7132
|
{
|
|
7115
7133
|
type: "button",
|
|
@@ -7117,21 +7135,21 @@ function ProductCard({
|
|
|
7117
7135
|
className: `absolute top-2 right-2 p-2 rounded-full transition-colors ${isFavorite ? "text-red-500" : "text-gray-400 hover:text-red-500"}`,
|
|
7118
7136
|
"aria-label": isFavorite ? "Remove from wishlist" : "Add to wishlist"
|
|
7119
7137
|
},
|
|
7120
|
-
/* @__PURE__ */
|
|
7138
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Heart, { className: `w-5 h-5 ${isFavorite ? "fill-current" : ""}` })
|
|
7121
7139
|
),
|
|
7122
|
-
/* @__PURE__ */
|
|
7123
|
-
/* @__PURE__ */
|
|
7140
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "p-4" }, product.parentCategories && product.parentCategories?.length > 0 && /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-xs text-gray-500 uppercase tracking-wider mb-2" }, product.parentCategories?.map((category) => category?.name).join(", ") || "No categories"), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mb-2" }, /* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-lg font-semibold text-gray-900 line-clamp-1 group-hover:text-primary-600 transition-colors" }, product.name), product?.sku && /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-xs text-gray-400 mt-1" }, "SKU: ", product.sku)), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-baseline gap-2" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ React20__default.default.createElement("span", { className: "text-2xl font-bold text-gray-900" }, formatPrice(product.finalPrice)), product.inventoryCount > 0 && /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("span", { className: "text-sm text-gray-500 line-through" }, formatPrice(product.priceBeforeDiscount)))),
|
|
7141
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-auto p-4 pt-0" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
7124
7142
|
"button",
|
|
7125
7143
|
{
|
|
7126
7144
|
type: "button",
|
|
7127
7145
|
onClick: (e) => {
|
|
7128
7146
|
e.stopPropagation();
|
|
7129
|
-
router.push(`/products/${product._id}`);
|
|
7147
|
+
router.push(buildPath(`/products/${product._id}`));
|
|
7130
7148
|
},
|
|
7131
7149
|
className: `w-full flex items-center justify-center rounded-md px-3 py-2 text-sm font-medium bg-primary-600 hover:bg-primary-700 text-white`
|
|
7132
7150
|
},
|
|
7133
7151
|
"View Product"
|
|
7134
|
-
), showFavoriteButton && /* @__PURE__ */
|
|
7152
|
+
), showFavoriteButton && /* @__PURE__ */ React20__default.default.createElement(
|
|
7135
7153
|
"button",
|
|
7136
7154
|
{
|
|
7137
7155
|
type: "button",
|
|
@@ -7139,7 +7157,7 @@ function ProductCard({
|
|
|
7139
7157
|
className: "mt-2 w-full flex items-center justify-center rounded-md border border-gray-300 bg-white px-3 py-2 text-sm font-medium text-primary-600 hover:bg-gray-50",
|
|
7140
7158
|
"aria-label": isFavorite ? "Remove from wishlist" : "Add to wishlist"
|
|
7141
7159
|
},
|
|
7142
|
-
/* @__PURE__ */
|
|
7160
|
+
/* @__PURE__ */ React20__default.default.createElement(
|
|
7143
7161
|
lucideReact.Heart,
|
|
7144
7162
|
{
|
|
7145
7163
|
className: `mr-2 h-4 w-4 ${isFavorite ? "fill-red-500 text-red-500" : "text-primary-600"}`
|
|
@@ -7150,13 +7168,13 @@ function ProductCard({
|
|
|
7150
7168
|
);
|
|
7151
7169
|
}
|
|
7152
7170
|
function Skeleton({ className = "" }) {
|
|
7153
|
-
return /* @__PURE__ */
|
|
7171
|
+
return /* @__PURE__ */ React20__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}` });
|
|
7154
7172
|
}
|
|
7155
7173
|
function ProductCardSkeleton() {
|
|
7156
|
-
return /* @__PURE__ */
|
|
7174
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "bg-white rounded-2xl overflow-hidden shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement(Skeleton, { className: "h-64 w-full" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "p-4 space-y-3" }, /* @__PURE__ */ React20__default.default.createElement(Skeleton, { className: "h-6 w-3/4" }), /* @__PURE__ */ React20__default.default.createElement(Skeleton, { className: "h-4 w-1/2" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex justify-between items-center pt-2" }, /* @__PURE__ */ React20__default.default.createElement(Skeleton, { className: "h-8 w-24" }), /* @__PURE__ */ React20__default.default.createElement(Skeleton, { className: "h-10 w-10 rounded-full" }))));
|
|
7157
7175
|
}
|
|
7158
7176
|
function OrderCardSkeleton() {
|
|
7159
|
-
return /* @__PURE__ */
|
|
7177
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "bg-white rounded-2xl p-6 shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex justify-between items-start mb-4" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-2 flex-1" }, /* @__PURE__ */ React20__default.default.createElement(Skeleton, { className: "h-6 w-32" }), /* @__PURE__ */ React20__default.default.createElement(Skeleton, { className: "h-4 w-48" })), /* @__PURE__ */ React20__default.default.createElement(Skeleton, { className: "h-6 w-20 rounded-full" })), /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React20__default.default.createElement(Skeleton, { className: "h-4 w-full" }), /* @__PURE__ */ React20__default.default.createElement(Skeleton, { className: "h-4 w-2/3" })));
|
|
7160
7178
|
}
|
|
7161
7179
|
var MotionDiv = dynamic__default.default(() => import('framer-motion').then((mod) => mod.motion.div), {
|
|
7162
7180
|
ssr: false
|
|
@@ -7182,14 +7200,14 @@ function Button({
|
|
|
7182
7200
|
md: "px-6 py-3 text-base",
|
|
7183
7201
|
lg: "px-8 py-4 text-lg"
|
|
7184
7202
|
};
|
|
7185
|
-
return /* @__PURE__ */
|
|
7203
|
+
return /* @__PURE__ */ React20__default.default.createElement(
|
|
7186
7204
|
MotionDiv,
|
|
7187
7205
|
{
|
|
7188
7206
|
whileHover: { scale: 1.02 },
|
|
7189
7207
|
whileTap: { scale: 0.98 },
|
|
7190
7208
|
className: "inline-block"
|
|
7191
7209
|
},
|
|
7192
|
-
/* @__PURE__ */
|
|
7210
|
+
/* @__PURE__ */ React20__default.default.createElement(
|
|
7193
7211
|
"button",
|
|
7194
7212
|
{
|
|
7195
7213
|
className: `${baseStyles} ${variants[variant]} ${sizes[size]} ${className}`,
|
|
@@ -7198,18 +7216,18 @@ function Button({
|
|
|
7198
7216
|
"aria-busy": isLoading,
|
|
7199
7217
|
...props
|
|
7200
7218
|
},
|
|
7201
|
-
isLoading ? /* @__PURE__ */
|
|
7219
|
+
isLoading ? /* @__PURE__ */ React20__default.default.createElement(React20__default.default.Fragment, null, /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ React20__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...") : children
|
|
7202
7220
|
)
|
|
7203
7221
|
);
|
|
7204
7222
|
}
|
|
7205
7223
|
|
|
7206
7224
|
// src/components/EmptyState.tsx
|
|
7207
7225
|
function EmptyState({ icon: Icon, title, description, actionLabel, onAction }) {
|
|
7208
|
-
return /* @__PURE__ */
|
|
7226
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col items-center justify-center py-16 px-4" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "w-24 h-24 bg-gray-100 rounded-full flex items-center justify-center mb-6" }, /* @__PURE__ */ React20__default.default.createElement(Icon, { className: "w-12 h-12 text-gray-400" })), /* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-2xl font-bold text-gray-900 mb-2" }, title), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-gray-600 text-center max-w-md mb-8" }, description), actionLabel && onAction && /* @__PURE__ */ React20__default.default.createElement(Button, { onClick: onAction }, actionLabel));
|
|
7209
7227
|
}
|
|
7210
|
-
var Input =
|
|
7228
|
+
var Input = React20.forwardRef(
|
|
7211
7229
|
({ label, error, helperText, className = "", ...props }, ref) => {
|
|
7212
|
-
return /* @__PURE__ */
|
|
7230
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "w-full" }, label && /* @__PURE__ */ React20__default.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-2" }, label), /* @__PURE__ */ React20__default.default.createElement(
|
|
7213
7231
|
"input",
|
|
7214
7232
|
{
|
|
7215
7233
|
ref,
|
|
@@ -7223,21 +7241,21 @@ var Input = React19.forwardRef(
|
|
|
7223
7241
|
`,
|
|
7224
7242
|
...props
|
|
7225
7243
|
}
|
|
7226
|
-
), error && /* @__PURE__ */
|
|
7244
|
+
), error && /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-2 text-sm text-red-600" }, error), helperText && !error && /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-2 text-sm text-gray-500" }, helperText));
|
|
7227
7245
|
}
|
|
7228
7246
|
);
|
|
7229
7247
|
Input.displayName = "Input";
|
|
7230
7248
|
function useProducts(filters, page = 1, limit = 20) {
|
|
7231
|
-
const [products, setProducts] =
|
|
7232
|
-
const [isLoading, setIsLoading] =
|
|
7233
|
-
const [error, setError] =
|
|
7234
|
-
const [pagination, setPagination] =
|
|
7249
|
+
const [products, setProducts] = React20.useState([]);
|
|
7250
|
+
const [isLoading, setIsLoading] = React20.useState(true);
|
|
7251
|
+
const [error, setError] = React20.useState(null);
|
|
7252
|
+
const [pagination, setPagination] = React20.useState({
|
|
7235
7253
|
page: 1,
|
|
7236
7254
|
limit: 20,
|
|
7237
7255
|
total: 0,
|
|
7238
7256
|
totalPages: 0
|
|
7239
7257
|
});
|
|
7240
|
-
const fetchProducts =
|
|
7258
|
+
const fetchProducts = React20.useCallback(async () => {
|
|
7241
7259
|
setIsLoading(true);
|
|
7242
7260
|
setError(null);
|
|
7243
7261
|
try {
|
|
@@ -7293,16 +7311,16 @@ function useProducts(filters, page = 1, limit = 20) {
|
|
|
7293
7311
|
}
|
|
7294
7312
|
setIsLoading(false);
|
|
7295
7313
|
}, [filters, page, limit]);
|
|
7296
|
-
|
|
7314
|
+
React20.useEffect(() => {
|
|
7297
7315
|
fetchProducts();
|
|
7298
7316
|
}, [fetchProducts]);
|
|
7299
7317
|
return { products, isLoading, error, pagination };
|
|
7300
7318
|
}
|
|
7301
7319
|
function useProduct(id) {
|
|
7302
|
-
const [product, setProduct] =
|
|
7303
|
-
const [isLoading, setIsLoading] =
|
|
7304
|
-
const [error, setError] =
|
|
7305
|
-
|
|
7320
|
+
const [product, setProduct] = React20.useState(null);
|
|
7321
|
+
const [isLoading, setIsLoading] = React20.useState(true);
|
|
7322
|
+
const [error, setError] = React20.useState(null);
|
|
7323
|
+
React20.useEffect(() => {
|
|
7306
7324
|
const fetchProduct = async () => {
|
|
7307
7325
|
setIsLoading(true);
|
|
7308
7326
|
setError(null);
|
|
@@ -7319,10 +7337,10 @@ function useProduct(id) {
|
|
|
7319
7337
|
return { product, isLoading, error };
|
|
7320
7338
|
}
|
|
7321
7339
|
function useCategories() {
|
|
7322
|
-
const [categories, setCategories] =
|
|
7323
|
-
const [isLoading, setIsLoading] =
|
|
7324
|
-
const [error, setError] =
|
|
7325
|
-
|
|
7340
|
+
const [categories, setCategories] = React20.useState([]);
|
|
7341
|
+
const [isLoading, setIsLoading] = React20.useState(true);
|
|
7342
|
+
const [error, setError] = React20.useState(null);
|
|
7343
|
+
React20.useEffect(() => {
|
|
7326
7344
|
const fetchCategories = async () => {
|
|
7327
7345
|
try {
|
|
7328
7346
|
setIsLoading(true);
|
|
@@ -7343,19 +7361,20 @@ function useCategories() {
|
|
|
7343
7361
|
// src/screens/ShopScreen.tsx
|
|
7344
7362
|
function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
7345
7363
|
const router = navigation.useRouter();
|
|
7346
|
-
const
|
|
7347
|
-
const [
|
|
7348
|
-
const [
|
|
7349
|
-
const [
|
|
7350
|
-
const [
|
|
7351
|
-
const [
|
|
7352
|
-
const [
|
|
7353
|
-
const [
|
|
7354
|
-
const [
|
|
7364
|
+
const { buildPath } = useBasePath();
|
|
7365
|
+
const [filters, setFilters] = React20.useState(initialFilters);
|
|
7366
|
+
const [page, setPage] = React20.useState(1);
|
|
7367
|
+
const [showFilters, setShowFilters] = React20.useState(false);
|
|
7368
|
+
const [searchQuery, setSearchQuery] = React20.useState("");
|
|
7369
|
+
const [isSearching, setIsSearching] = React20.useState(false);
|
|
7370
|
+
const [sortOption, setSortOption] = React20.useState("featured");
|
|
7371
|
+
const [viewMode, setViewMode] = React20.useState("grid");
|
|
7372
|
+
const [selectedPriceRange, setSelectedPriceRange] = React20.useState(null);
|
|
7373
|
+
const [customPrice, setCustomPrice] = React20.useState({
|
|
7355
7374
|
min: "",
|
|
7356
7375
|
max: ""
|
|
7357
7376
|
});
|
|
7358
|
-
const [expandedCategories, setExpandedCategories] =
|
|
7377
|
+
const [expandedCategories, setExpandedCategories] = React20.useState({});
|
|
7359
7378
|
const { products, isLoading, pagination } = useProducts(filters, page, 20);
|
|
7360
7379
|
const { categories } = useCategories();
|
|
7361
7380
|
const handleSearch = (e) => {
|
|
@@ -7375,7 +7394,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7375
7394
|
router.push(`/search?q=${encodeURIComponent(searchQuery.trim())}`);
|
|
7376
7395
|
}
|
|
7377
7396
|
};
|
|
7378
|
-
const priceRanges =
|
|
7397
|
+
const priceRanges = React20.useMemo(
|
|
7379
7398
|
() => [
|
|
7380
7399
|
{ label: `Under ${formatPrice(25)}`, value: "under-25", min: void 0, max: 25 },
|
|
7381
7400
|
{ label: `${formatPrice(25)} - ${formatPrice(50)}`, value: "25-50", min: 25, max: 50 },
|
|
@@ -7384,13 +7403,13 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7384
7403
|
],
|
|
7385
7404
|
[]
|
|
7386
7405
|
);
|
|
7387
|
-
|
|
7406
|
+
React20.useEffect(() => {
|
|
7388
7407
|
setCustomPrice({
|
|
7389
7408
|
min: filters.minPrice !== void 0 ? String(filters.minPrice) : "",
|
|
7390
7409
|
max: filters.maxPrice !== void 0 ? String(filters.maxPrice) : ""
|
|
7391
7410
|
});
|
|
7392
7411
|
}, [filters.minPrice, filters.maxPrice]);
|
|
7393
|
-
|
|
7412
|
+
React20.useEffect(() => {
|
|
7394
7413
|
const updates = {};
|
|
7395
7414
|
if (filters.category) updates[filters.category] = true;
|
|
7396
7415
|
if (filters.subCategory) {
|
|
@@ -7403,18 +7422,18 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7403
7422
|
setExpandedCategories((prev) => ({ ...prev, ...updates }));
|
|
7404
7423
|
}
|
|
7405
7424
|
}, [filters.category, filters.subCategory, categories]);
|
|
7406
|
-
const toggleCategoryExpand =
|
|
7425
|
+
const toggleCategoryExpand = React20.useCallback((id) => {
|
|
7407
7426
|
setExpandedCategories((prev) => ({ ...prev, [id]: !prev[id] }));
|
|
7408
7427
|
}, []);
|
|
7409
|
-
const sortedCategories =
|
|
7428
|
+
const sortedCategories = React20.useMemo(
|
|
7410
7429
|
() => [...categories].sort((a, b) => a.name?.localeCompare(b.name ?? "") ?? 0),
|
|
7411
7430
|
[categories]
|
|
7412
7431
|
);
|
|
7413
|
-
const topCategories =
|
|
7432
|
+
const topCategories = React20.useMemo(
|
|
7414
7433
|
() => [...categories].sort((a, b) => (b.productCount ?? 0) - (a.productCount ?? 0)).slice(0, 6),
|
|
7415
7434
|
[categories]
|
|
7416
7435
|
);
|
|
7417
|
-
const productInsights =
|
|
7436
|
+
const productInsights = React20.useMemo(() => {
|
|
7418
7437
|
if (!products.length) {
|
|
7419
7438
|
return { newArrivals: 0, inStockCount: 0 };
|
|
7420
7439
|
}
|
|
@@ -7427,7 +7446,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7427
7446
|
});
|
|
7428
7447
|
return { newArrivals: newArrivals2, inStockCount };
|
|
7429
7448
|
}, [products]);
|
|
7430
|
-
const insightCards =
|
|
7449
|
+
const insightCards = React20.useMemo(
|
|
7431
7450
|
() => [
|
|
7432
7451
|
{
|
|
7433
7452
|
id: "new",
|
|
@@ -7460,7 +7479,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7460
7479
|
filters.newArrivals
|
|
7461
7480
|
]
|
|
7462
7481
|
);
|
|
7463
|
-
const filteredProducts =
|
|
7482
|
+
const filteredProducts = React20.useMemo(() => {
|
|
7464
7483
|
if (isLoading) return products;
|
|
7465
7484
|
let items = [...products];
|
|
7466
7485
|
if (filters.tags?.length) {
|
|
@@ -7472,7 +7491,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7472
7491
|
}
|
|
7473
7492
|
return items;
|
|
7474
7493
|
}, [isLoading, products, filters.tags, filters.newArrivals]);
|
|
7475
|
-
const sortedProducts =
|
|
7494
|
+
const sortedProducts = React20.useMemo(() => {
|
|
7476
7495
|
if (isLoading) {
|
|
7477
7496
|
return filteredProducts;
|
|
7478
7497
|
}
|
|
@@ -7491,14 +7510,14 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7491
7510
|
}
|
|
7492
7511
|
}, [isLoading, filteredProducts, sortOption]);
|
|
7493
7512
|
const displayedProducts = sortedProducts;
|
|
7494
|
-
const quickSearches =
|
|
7513
|
+
const quickSearches = React20.useMemo(() => {
|
|
7495
7514
|
const counts = /* @__PURE__ */ new Map();
|
|
7496
7515
|
products.forEach((p) => {
|
|
7497
7516
|
(p.tags || []).forEach((t) => counts.set(t, (counts.get(t) || 0) + 1));
|
|
7498
7517
|
});
|
|
7499
7518
|
return Array.from(counts.entries()).sort((a, b) => b[1] - a[1]).slice(0, 4).map(([tag]) => tag);
|
|
7500
7519
|
}, [products]);
|
|
7501
|
-
const handleQuickSearch =
|
|
7520
|
+
const handleQuickSearch = React20.useCallback((term) => {
|
|
7502
7521
|
setSearchQuery("");
|
|
7503
7522
|
setFilters((current) => ({
|
|
7504
7523
|
...current,
|
|
@@ -7507,7 +7526,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7507
7526
|
}));
|
|
7508
7527
|
setPage(1);
|
|
7509
7528
|
}, []);
|
|
7510
|
-
const handleCategoryChange =
|
|
7529
|
+
const handleCategoryChange = React20.useCallback(
|
|
7511
7530
|
(categorySlug) => {
|
|
7512
7531
|
setFilters((current) => {
|
|
7513
7532
|
if (current.category === categorySlug) {
|
|
@@ -7524,7 +7543,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7524
7543
|
},
|
|
7525
7544
|
[]
|
|
7526
7545
|
);
|
|
7527
|
-
const handleSubCategoryChange =
|
|
7546
|
+
const handleSubCategoryChange = React20.useCallback((parentCategoryId, subCategoryId) => {
|
|
7528
7547
|
setFilters((current) => {
|
|
7529
7548
|
if (current.subCategory === subCategoryId) {
|
|
7530
7549
|
const { subCategory, ...rest } = current;
|
|
@@ -7534,7 +7553,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7534
7553
|
});
|
|
7535
7554
|
setPage(1);
|
|
7536
7555
|
}, []);
|
|
7537
|
-
const handleToggleStock =
|
|
7556
|
+
const handleToggleStock = React20.useCallback(() => {
|
|
7538
7557
|
setFilters((current) => {
|
|
7539
7558
|
if (current.inStock) {
|
|
7540
7559
|
const { inStock, ...rest } = current;
|
|
@@ -7544,7 +7563,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7544
7563
|
});
|
|
7545
7564
|
setPage(1);
|
|
7546
7565
|
}, []);
|
|
7547
|
-
const handleToggleNewArrivals =
|
|
7566
|
+
const handleToggleNewArrivals = React20.useCallback(() => {
|
|
7548
7567
|
setFilters((current) => {
|
|
7549
7568
|
if (current.newArrivals) {
|
|
7550
7569
|
const { newArrivals: newArrivals2, ...rest } = current;
|
|
@@ -7554,21 +7573,21 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7554
7573
|
});
|
|
7555
7574
|
setPage(1);
|
|
7556
7575
|
}, []);
|
|
7557
|
-
const handleClearFilters =
|
|
7576
|
+
const handleClearFilters = React20.useCallback(() => {
|
|
7558
7577
|
setFilters({});
|
|
7559
7578
|
setSearchQuery("");
|
|
7560
7579
|
setSelectedPriceRange(null);
|
|
7561
7580
|
setCustomPrice({ min: "", max: "" });
|
|
7562
7581
|
setPage(1);
|
|
7563
7582
|
}, []);
|
|
7564
|
-
const handleRemoveCategory =
|
|
7583
|
+
const handleRemoveCategory = React20.useCallback(() => {
|
|
7565
7584
|
setFilters((current) => {
|
|
7566
7585
|
const { category, subCategory, ...rest } = current;
|
|
7567
7586
|
return rest;
|
|
7568
7587
|
});
|
|
7569
7588
|
setPage(1);
|
|
7570
7589
|
}, []);
|
|
7571
|
-
const handleRemoveSubCategory =
|
|
7590
|
+
const handleRemoveSubCategory = React20.useCallback(() => {
|
|
7572
7591
|
setFilters((current) => {
|
|
7573
7592
|
const next = { ...current };
|
|
7574
7593
|
delete next.subCategory;
|
|
@@ -7576,7 +7595,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7576
7595
|
});
|
|
7577
7596
|
setPage(1);
|
|
7578
7597
|
}, []);
|
|
7579
|
-
const handleRemoveSearch =
|
|
7598
|
+
const handleRemoveSearch = React20.useCallback(() => {
|
|
7580
7599
|
setFilters((current) => {
|
|
7581
7600
|
const { search, ...rest } = current;
|
|
7582
7601
|
return rest;
|
|
@@ -7584,14 +7603,14 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7584
7603
|
setSearchQuery("");
|
|
7585
7604
|
setPage(1);
|
|
7586
7605
|
}, []);
|
|
7587
|
-
const handleRemoveInStock =
|
|
7606
|
+
const handleRemoveInStock = React20.useCallback(() => {
|
|
7588
7607
|
setFilters((current) => {
|
|
7589
7608
|
const { inStock, ...rest } = current;
|
|
7590
7609
|
return rest;
|
|
7591
7610
|
});
|
|
7592
7611
|
setPage(1);
|
|
7593
7612
|
}, []);
|
|
7594
|
-
const handleRemovePrice =
|
|
7613
|
+
const handleRemovePrice = React20.useCallback(() => {
|
|
7595
7614
|
setFilters((current) => {
|
|
7596
7615
|
const next = { ...current };
|
|
7597
7616
|
delete next.minPrice;
|
|
@@ -7602,7 +7621,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7602
7621
|
setCustomPrice({ min: "", max: "" });
|
|
7603
7622
|
setPage(1);
|
|
7604
7623
|
}, []);
|
|
7605
|
-
const handleRemoveTag =
|
|
7624
|
+
const handleRemoveTag = React20.useCallback((tag) => {
|
|
7606
7625
|
setFilters((current) => {
|
|
7607
7626
|
if (!current.tags) return current;
|
|
7608
7627
|
const updated = current.tags.filter((item) => item !== tag);
|
|
@@ -7616,7 +7635,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7616
7635
|
});
|
|
7617
7636
|
setPage(1);
|
|
7618
7637
|
}, []);
|
|
7619
|
-
const handlePriceRangeSelect =
|
|
7638
|
+
const handlePriceRangeSelect = React20.useCallback(
|
|
7620
7639
|
(value) => {
|
|
7621
7640
|
const range = priceRanges.find((item) => item.value === value);
|
|
7622
7641
|
if (selectedPriceRange === value) {
|
|
@@ -7655,7 +7674,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7655
7674
|
},
|
|
7656
7675
|
[priceRanges, selectedPriceRange]
|
|
7657
7676
|
);
|
|
7658
|
-
const applyCustomPrice =
|
|
7677
|
+
const applyCustomPrice = React20.useCallback(() => {
|
|
7659
7678
|
const rawMin = customPrice.min.trim();
|
|
7660
7679
|
const rawMax = customPrice.max.trim();
|
|
7661
7680
|
const minValue = rawMin !== "" ? Number(rawMin) : void 0;
|
|
@@ -7692,7 +7711,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7692
7711
|
tags,
|
|
7693
7712
|
newArrivals
|
|
7694
7713
|
} = filters;
|
|
7695
|
-
const activeFilterChips =
|
|
7714
|
+
const activeFilterChips = React20.useMemo(() => {
|
|
7696
7715
|
const chips = [];
|
|
7697
7716
|
if (searchFilter) {
|
|
7698
7717
|
chips.push({
|
|
@@ -7784,7 +7803,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7784
7803
|
]);
|
|
7785
7804
|
const hasActiveFilters = activeFilterChips.length > 0;
|
|
7786
7805
|
const isCustomPriceDirty = customPrice.min.trim() !== "" || customPrice.max.trim() !== "";
|
|
7787
|
-
const renderFiltersPanel = () => /* @__PURE__ */
|
|
7806
|
+
const renderFiltersPanel = () => /* @__PURE__ */ React20__default.default.createElement(React20__default.default.Fragment, null, /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-8" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-8" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-start justify-between gap-3" }, /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-lg font-semibold text-gray-900" }, "Refine results"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-1 text-sm text-gray-500" }, "Filter by category, price, and availability to find the perfect fit faster.")), hasActiveFilters && /* @__PURE__ */ React20__default.default.createElement(
|
|
7788
7807
|
"button",
|
|
7789
7808
|
{
|
|
7790
7809
|
type: "button",
|
|
@@ -7792,10 +7811,10 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7792
7811
|
className: "text-sm font-semibold text-primary-600 hover:text-primary-700"
|
|
7793
7812
|
},
|
|
7794
7813
|
"Clear all"
|
|
7795
|
-
)), /* @__PURE__ */
|
|
7814
|
+
)), /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React20__default.default.createElement("h4", { className: "text-xs font-semibold uppercase tracking-[0.2em] text-gray-500" }, "Categories"), /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-2" }, sortedCategories.length === 0 && /* @__PURE__ */ React20__default.default.createElement("span", { className: "text-sm text-gray-500" }, "No categories available yet."), sortedCategories.map((category) => {
|
|
7796
7815
|
const isCategoryActive = categoryFilter === category.id;
|
|
7797
7816
|
const isExpanded = !!expandedCategories[category.id];
|
|
7798
|
-
return /* @__PURE__ */
|
|
7817
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { key: category.id, className: "rounded-xl border-gray-100 bg-white/50" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
7799
7818
|
"div",
|
|
7800
7819
|
{
|
|
7801
7820
|
role: "button",
|
|
@@ -7806,8 +7825,8 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7806
7825
|
},
|
|
7807
7826
|
className: `flex w-full items-center justify-between rounded-xl px-3 py-2 text-sm font-medium transition ${isCategoryActive ? "text-primary-700 bg-primary-50" : "text-gray-700 hover:text-primary-700 hover:bg-primary-50/50"}`
|
|
7808
7827
|
},
|
|
7809
|
-
/* @__PURE__ */
|
|
7810
|
-
/* @__PURE__ */
|
|
7828
|
+
/* @__PURE__ */ React20__default.default.createElement("span", { className: "flex items-center gap-2" }, /* @__PURE__ */ React20__default.default.createElement("span", { className: "font-medium" }, category.name), category.productCount > 0 && /* @__PURE__ */ React20__default.default.createElement("span", { className: `ml-1 rounded-full bg-gray-100 px-2 py-0.5 text-xs ${isCategoryActive ? "text-primary-700" : "text-gray-500"}` }, category.productCount)),
|
|
7829
|
+
/* @__PURE__ */ React20__default.default.createElement(
|
|
7811
7830
|
"button",
|
|
7812
7831
|
{
|
|
7813
7832
|
type: "button",
|
|
@@ -7819,11 +7838,11 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7819
7838
|
className: "rounded-md p-1 hover:bg-gray-100",
|
|
7820
7839
|
"aria-label": isExpanded ? "Collapse" : "Expand"
|
|
7821
7840
|
},
|
|
7822
|
-
/* @__PURE__ */
|
|
7841
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.ChevronDown, { className: `h-4 w-4 transition-transform ${isExpanded ? "rotate-180 text-primary-600" : "rotate-0 text-gray-400"}` })
|
|
7823
7842
|
)
|
|
7824
|
-
), isExpanded && Array.isArray(category.categorySubCategories) && category.categorySubCategories.length > 0 && /* @__PURE__ */
|
|
7843
|
+
), isExpanded && Array.isArray(category.categorySubCategories) && category.categorySubCategories.length > 0 && /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-1 border-gray-100 px-2 pb-2 pl-4" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "divide-y divide-gray-100" }, category.categorySubCategories.map((sub) => {
|
|
7825
7844
|
const isSubActive = subCategoryFilter === sub.id;
|
|
7826
|
-
return /* @__PURE__ */
|
|
7845
|
+
return /* @__PURE__ */ React20__default.default.createElement(
|
|
7827
7846
|
"button",
|
|
7828
7847
|
{
|
|
7829
7848
|
key: sub.id,
|
|
@@ -7834,9 +7853,9 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7834
7853
|
sub.name
|
|
7835
7854
|
);
|
|
7836
7855
|
}))));
|
|
7837
|
-
}))))), /* @__PURE__ */
|
|
7856
|
+
}))))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React20__default.default.createElement("h4", { className: "text-xs font-semibold uppercase tracking-[0.2em] text-gray-500" }, "Price"), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap gap-2" }, priceRanges.map((range) => {
|
|
7838
7857
|
const isActive = selectedPriceRange === range.value;
|
|
7839
|
-
return /* @__PURE__ */
|
|
7858
|
+
return /* @__PURE__ */ React20__default.default.createElement(
|
|
7840
7859
|
"button",
|
|
7841
7860
|
{
|
|
7842
7861
|
type: "button",
|
|
@@ -7846,7 +7865,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7846
7865
|
},
|
|
7847
7866
|
range.label
|
|
7848
7867
|
);
|
|
7849
|
-
})), /* @__PURE__ */
|
|
7868
|
+
})), /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid grid-cols-2 gap-3" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
7850
7869
|
Input,
|
|
7851
7870
|
{
|
|
7852
7871
|
type: "number",
|
|
@@ -7855,7 +7874,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7855
7874
|
value: customPrice.min,
|
|
7856
7875
|
onChange: (event) => setCustomPrice((current) => ({ ...current, min: event.target.value }))
|
|
7857
7876
|
}
|
|
7858
|
-
), /* @__PURE__ */
|
|
7877
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
7859
7878
|
Input,
|
|
7860
7879
|
{
|
|
7861
7880
|
type: "number",
|
|
@@ -7864,7 +7883,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7864
7883
|
value: customPrice.max,
|
|
7865
7884
|
onChange: (event) => setCustomPrice((current) => ({ ...current, max: event.target.value }))
|
|
7866
7885
|
}
|
|
7867
|
-
)), /* @__PURE__ */
|
|
7886
|
+
)), /* @__PURE__ */ React20__default.default.createElement(
|
|
7868
7887
|
"button",
|
|
7869
7888
|
{
|
|
7870
7889
|
type: "button",
|
|
@@ -7873,48 +7892,48 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7873
7892
|
className: "w-full rounded-xl border border-primary-500 bg-primary-500/10 px-4 py-2.5 text-sm font-semibold text-primary-700 transition hover:bg-primary-500/20 disabled:cursor-not-allowed disabled:border-gray-200 disabled:text-gray-400"
|
|
7874
7893
|
},
|
|
7875
7894
|
"Apply price range"
|
|
7876
|
-
)), /* @__PURE__ */
|
|
7895
|
+
)), /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React20__default.default.createElement("h4", { className: "text-xs font-semibold uppercase tracking-[0.2em] text-gray-500" }, "Availability"), /* @__PURE__ */ React20__default.default.createElement(
|
|
7877
7896
|
"button",
|
|
7878
7897
|
{
|
|
7879
7898
|
type: "button",
|
|
7880
7899
|
onClick: handleToggleStock,
|
|
7881
7900
|
className: `flex w-full items-center justify-between rounded-xl border px-4 py-3 text-sm font-medium transition ${inStockOnly ? "border-primary-500 bg-primary-50 text-primary-700" : "border-gray-200 bg-white text-gray-600 hover:border-primary-300 hover:text-primary-600"}`
|
|
7882
7901
|
},
|
|
7883
|
-
/* @__PURE__ */
|
|
7884
|
-
/* @__PURE__ */
|
|
7885
|
-
), /* @__PURE__ */
|
|
7902
|
+
/* @__PURE__ */ React20__default.default.createElement("span", null, "In stock only"),
|
|
7903
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Sparkles, { className: "h-4 w-4 text-primary-500" })
|
|
7904
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
7886
7905
|
"button",
|
|
7887
7906
|
{
|
|
7888
7907
|
type: "button",
|
|
7889
7908
|
onClick: handleToggleNewArrivals,
|
|
7890
7909
|
className: `mt-2 flex w-full items-center justify-between rounded-xl border px-4 py-3 text-sm font-medium transition ${newArrivals ? "border-secondary-500 bg-secondary-50 text-secondary-700" : "border-gray-200 bg-white text-gray-600 hover:border-secondary-300 hover:text-secondary-600"}`
|
|
7891
7910
|
},
|
|
7892
|
-
/* @__PURE__ */
|
|
7893
|
-
/* @__PURE__ */
|
|
7911
|
+
/* @__PURE__ */ React20__default.default.createElement("span", null, "New arrivals (last 30 days)"),
|
|
7912
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Sparkles, { className: "h-4 w-4 text-secondary-500" })
|
|
7894
7913
|
))));
|
|
7895
|
-
return /* @__PURE__ */
|
|
7914
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React20__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" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
7896
7915
|
"div",
|
|
7897
7916
|
{
|
|
7898
7917
|
className: "absolute inset-0 bg-[radial-gradient(circle_at_top_left,_rgba(255,255,255,0.35),_transparent_60%)]",
|
|
7899
7918
|
"aria-hidden": "true"
|
|
7900
7919
|
}
|
|
7901
|
-
), /* @__PURE__ */
|
|
7920
|
+
), /* @__PURE__ */ React20__default.default.createElement("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_bottom_right,_rgba(94,234,212,0.35),_transparent_55%)] opacity-60" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative container mx-auto px-4 py-24" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
7902
7921
|
framerMotion.motion.div,
|
|
7903
7922
|
{
|
|
7904
7923
|
initial: { opacity: 0, y: 24 },
|
|
7905
7924
|
animate: { opacity: 1, y: 0 },
|
|
7906
7925
|
className: "max-w-3xl space-y-8 text-center md:mx-auto md:text-left"
|
|
7907
7926
|
},
|
|
7908
|
-
/* @__PURE__ */
|
|
7909
|
-
/* @__PURE__ */
|
|
7910
|
-
/* @__PURE__ */
|
|
7911
|
-
/* @__PURE__ */
|
|
7927
|
+
/* @__PURE__ */ React20__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full bg-white/10 px-4 py-2 text-sm font-semibold tracking-wide text-white/80 backdrop-blur" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Sparkles, { className: "h-4 w-4" }), "Wellness products, curated for you"),
|
|
7928
|
+
/* @__PURE__ */ React20__default.default.createElement("h1", { className: "text-4xl font-bold leading-tight md:text-6xl" }, "Find pharmacy favorites crafted to keep your family thriving"),
|
|
7929
|
+
/* @__PURE__ */ React20__default.default.createElement("p", { className: "text-lg text-white/80 md:text-xl" }, "Explore a modern storefront with real-time inventory, smart filters, and rich product details designed to make healthier choices easier."),
|
|
7930
|
+
/* @__PURE__ */ React20__default.default.createElement(
|
|
7912
7931
|
"form",
|
|
7913
7932
|
{
|
|
7914
7933
|
onSubmit: handleSearch,
|
|
7915
7934
|
className: "mx-auto max-w-2xl md:mx-0"
|
|
7916
7935
|
},
|
|
7917
|
-
/* @__PURE__ */
|
|
7936
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "relative w-full" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
7918
7937
|
"input",
|
|
7919
7938
|
{
|
|
7920
7939
|
type: "search",
|
|
@@ -7925,17 +7944,17 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7925
7944
|
className: "flex h-12 w-full rounded-xl border border-white/20 bg-white/10 px-4 py-2 pr-14 text-lg text-white placeholder-white/60 shadow-2xl shadow-primary-900/20 backdrop-blur focus:border-white/30 focus:outline-none focus:ring-2 focus:ring-white/20 disabled:opacity-50",
|
|
7926
7945
|
disabled: isSearching
|
|
7927
7946
|
}
|
|
7928
|
-
), /* @__PURE__ */
|
|
7947
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
7929
7948
|
"button",
|
|
7930
7949
|
{
|
|
7931
7950
|
type: "submit",
|
|
7932
7951
|
className: "absolute right-2 top-1/2 -translate-y-1/2 rounded-xl bg-white/20 p-3 text-white transition hover:bg-white/30 disabled:opacity-50",
|
|
7933
7952
|
disabled: !searchQuery.trim() || isSearching
|
|
7934
7953
|
},
|
|
7935
|
-
isSearching ? /* @__PURE__ */
|
|
7954
|
+
isSearching ? /* @__PURE__ */ React20__default.default.createElement("div", { className: "h-5 w-5 animate-spin rounded-full border-2 border-white border-t-transparent" }) : /* @__PURE__ */ React20__default.default.createElement(lucideReact.Search, { className: "h-5 w-5" })
|
|
7936
7955
|
))
|
|
7937
7956
|
)
|
|
7938
|
-
), /* @__PURE__ */
|
|
7957
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
7939
7958
|
framerMotion.motion.div,
|
|
7940
7959
|
{
|
|
7941
7960
|
initial: { opacity: 0, y: 24 },
|
|
@@ -7943,7 +7962,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7943
7962
|
transition: { delay: 0.15 },
|
|
7944
7963
|
className: "mt-12 flex flex-col gap-6 rounded-3xl border border-white/20 bg-white/10 p-6 backdrop-blur md:flex-row md:items-center md:justify-between"
|
|
7945
7964
|
},
|
|
7946
|
-
/* @__PURE__ */
|
|
7965
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm font-semibold uppercase tracking-[0.3em] text-white/60" }, "Explore popular searches"), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap gap-2" }, quickSearches.map((term) => /* @__PURE__ */ React20__default.default.createElement(
|
|
7947
7966
|
"button",
|
|
7948
7967
|
{
|
|
7949
7968
|
key: term,
|
|
@@ -7953,7 +7972,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7953
7972
|
},
|
|
7954
7973
|
term
|
|
7955
7974
|
)))),
|
|
7956
|
-
topCategories.length > 0 && /* @__PURE__ */
|
|
7975
|
+
topCategories.length > 0 && /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-3 md:text-right" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm font-semibold uppercase tracking-[0.3em] text-white/60" }, "Trending categories"), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap justify-start gap-2 md:justify-end" }, topCategories.map((category) => /* @__PURE__ */ React20__default.default.createElement(
|
|
7957
7976
|
"button",
|
|
7958
7977
|
{
|
|
7959
7978
|
key: category.id,
|
|
@@ -7963,9 +7982,9 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7963
7982
|
},
|
|
7964
7983
|
category.name
|
|
7965
7984
|
))))
|
|
7966
|
-
), /* @__PURE__ */
|
|
7985
|
+
), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-10 grid gap-4 md:grid-cols-3" }, insightCards.map((card, index) => {
|
|
7967
7986
|
const Icon = card.icon;
|
|
7968
|
-
return /* @__PURE__ */
|
|
7987
|
+
return /* @__PURE__ */ React20__default.default.createElement(
|
|
7969
7988
|
framerMotion.motion.div,
|
|
7970
7989
|
{
|
|
7971
7990
|
key: card.id,
|
|
@@ -7978,10 +7997,10 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7978
7997
|
"aria-pressed": card.id === "new" ? newArrivals ? "true" : "false" : void 0,
|
|
7979
7998
|
title: card.id === "new" ? newArrivals ? "Filter active: showing products from the last 30 days" : "Click to filter products from the last 30 days" : void 0
|
|
7980
7999
|
},
|
|
7981
|
-
/* @__PURE__ */
|
|
7982
|
-
/* @__PURE__ */
|
|
8000
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm font-semibold uppercase tracking-[0.3em] text-white/60" }, card.label), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-2 text-3xl font-semibold text-white" }, card.value)), /* @__PURE__ */ React20__default.default.createElement("span", { className: "rounded-full bg-white/20 p-3 text-white" }, /* @__PURE__ */ React20__default.default.createElement(Icon, { className: "h-5 w-5" }))),
|
|
8001
|
+
/* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-3 text-sm text-white/70" }, card.helper)
|
|
7983
8002
|
);
|
|
7984
|
-
})))), /* @__PURE__ */
|
|
8003
|
+
})))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative z-10 -mt-12 pb-16" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col gap-8 lg:flex-row" }, /* @__PURE__ */ React20__default.default.createElement("aside", { className: "hidden w-72 flex-shrink-0 lg:block" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "sticky top-24 rounded-3xl border border-gray-100 bg-white p-6 shadow-xl shadow-gray-200/40" }, renderFiltersPanel())), /* @__PURE__ */ React20__default.default.createElement("main", { className: "flex-1 space-y-6" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-3xl border border-gray-100 bg-white p-6 shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col gap-6 md:flex-row md:items-center md:justify-between" }, /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("h2", { className: "text-2xl font-bold text-gray-900" }, "All products"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-1 text-sm text-gray-500" }, "Browse a pharmacy-grade catalogue with smart merchandising and modern UI.")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col gap-3 md:flex-row md:items-center" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React20__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__ */ React20__default.default.createElement(
|
|
7985
8004
|
"select",
|
|
7986
8005
|
{
|
|
7987
8006
|
value: sortOption,
|
|
@@ -7990,11 +8009,11 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
7990
8009
|
},
|
|
7991
8010
|
className: "appearance-none rounded-xl border border-gray-200 bg-white py-2.5 pl-10 pr-9 text-sm font-medium text-gray-700 shadow-sm transition focus:border-primary-500 focus:outline-none focus:ring-2 focus:ring-primary-500/30"
|
|
7992
8011
|
},
|
|
7993
|
-
/* @__PURE__ */
|
|
7994
|
-
/* @__PURE__ */
|
|
7995
|
-
/* @__PURE__ */
|
|
7996
|
-
/* @__PURE__ */
|
|
7997
|
-
), /* @__PURE__ */
|
|
8012
|
+
/* @__PURE__ */ React20__default.default.createElement("option", { value: "featured" }, "Featured products"),
|
|
8013
|
+
/* @__PURE__ */ React20__default.default.createElement("option", { value: "price-low-high" }, "Price: low to high"),
|
|
8014
|
+
/* @__PURE__ */ React20__default.default.createElement("option", { value: "price-high-low" }, "Price: high to low"),
|
|
8015
|
+
/* @__PURE__ */ React20__default.default.createElement("option", { value: "newest" }, "Newest arrivals")
|
|
8016
|
+
), /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("div", { className: "flex items-center rounded-xl border border-gray-200 bg-white shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
7998
8017
|
"button",
|
|
7999
8018
|
{
|
|
8000
8019
|
type: "button",
|
|
@@ -8002,9 +8021,9 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8002
8021
|
className: `flex items-center gap-2 rounded-l-xl px-4 py-2 text-sm font-medium transition ${viewMode === "grid" ? "bg-primary-50 text-primary-600" : "text-gray-500 hover:text-gray-700"}`,
|
|
8003
8022
|
"aria-pressed": viewMode === "grid"
|
|
8004
8023
|
},
|
|
8005
|
-
/* @__PURE__ */
|
|
8024
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.LayoutGrid, { className: "h-4 w-4" }),
|
|
8006
8025
|
"Grid"
|
|
8007
|
-
), /* @__PURE__ */
|
|
8026
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
8008
8027
|
"button",
|
|
8009
8028
|
{
|
|
8010
8029
|
type: "button",
|
|
@@ -8012,19 +8031,19 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8012
8031
|
className: `flex items-center gap-2 rounded-r-xl px-4 py-2 text-sm font-medium transition ${viewMode === "list" ? "bg-primary-50 text-primary-600" : "text-gray-500 hover:text-gray-700"}`,
|
|
8013
8032
|
"aria-pressed": viewMode === "list"
|
|
8014
8033
|
},
|
|
8015
|
-
/* @__PURE__ */
|
|
8034
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.LayoutList, { className: "h-4 w-4" }),
|
|
8016
8035
|
"List"
|
|
8017
|
-
)))), /* @__PURE__ */
|
|
8036
|
+
)))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-4 md:hidden" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
8018
8037
|
Button,
|
|
8019
8038
|
{
|
|
8020
8039
|
variant: "outline",
|
|
8021
8040
|
className: "w-full",
|
|
8022
8041
|
onClick: () => setShowFilters(true)
|
|
8023
8042
|
},
|
|
8024
|
-
/* @__PURE__ */
|
|
8043
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.SlidersHorizontal, { className: "h-5 w-5" }),
|
|
8025
8044
|
"Filters",
|
|
8026
|
-
hasActiveFilters && /* @__PURE__ */
|
|
8027
|
-
)), hasActiveFilters && /* @__PURE__ */
|
|
8045
|
+
hasActiveFilters && /* @__PURE__ */ React20__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)
|
|
8046
|
+
)), hasActiveFilters && /* @__PURE__ */ React20__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__ */ React20__default.default.createElement(
|
|
8028
8047
|
"button",
|
|
8029
8048
|
{
|
|
8030
8049
|
key: chip.key,
|
|
@@ -8033,8 +8052,8 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8033
8052
|
className: "group flex items-center gap-2 rounded-full bg-primary-50 px-3 py-1.5 text-sm font-medium text-primary-700 transition hover:bg-primary-100"
|
|
8034
8053
|
},
|
|
8035
8054
|
chip.label,
|
|
8036
|
-
/* @__PURE__ */
|
|
8037
|
-
)), /* @__PURE__ */
|
|
8055
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.X, { className: "h-4 w-4 text-primary-500 group-hover:text-primary-700" })
|
|
8056
|
+
)), /* @__PURE__ */ React20__default.default.createElement(
|
|
8038
8057
|
"button",
|
|
8039
8058
|
{
|
|
8040
8059
|
type: "button",
|
|
@@ -8042,28 +8061,28 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8042
8061
|
className: "text-sm font-semibold text-gray-500 hover:text-gray-700"
|
|
8043
8062
|
},
|
|
8044
8063
|
"Reset all"
|
|
8045
|
-
))), /* @__PURE__ */
|
|
8064
|
+
))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-3xl border border-gray-100 bg-white p-6 shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col gap-3 text-sm text-gray-600 md:flex-row md:items-center md:justify-between" }, /* @__PURE__ */ React20__default.default.createElement("span", null, isLoading ? "Loading products..." : `Showing ${displayedProducts.length} of ${pagination.total || displayedProducts.length} products`), /* @__PURE__ */ React20__default.default.createElement("span", { className: "inline-flex items-center gap-2 text-gray-400" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Clock, { className: "h-4 w-4" }), "Updated a moment ago")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-6" }, isLoading ? /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid grid-cols-1 gap-6 sm:grid-cols-2 xl:grid-cols-3" }, Array.from({ length: 6 }).map((_, index) => /* @__PURE__ */ React20__default.default.createElement(ProductCardSkeleton, { key: index }))) : displayedProducts.length > 0 ? viewMode === "grid" ? /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid grid-cols-1 gap-6 sm:grid-cols-2 xl:grid-cols-3" }, displayedProducts.map((product) => /* @__PURE__ */ React20__default.default.createElement("div", { key: product.id, className: "h-full" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
8046
8065
|
ProductCard,
|
|
8047
8066
|
{
|
|
8048
8067
|
product,
|
|
8049
8068
|
onClickProduct: (item) => {
|
|
8050
8069
|
const productData = encodeURIComponent(JSON.stringify(item));
|
|
8051
|
-
router.push(`/products/${item.id}?product=${productData}`);
|
|
8070
|
+
router.push(buildPath(`/products/${item.id}?product=${productData}`));
|
|
8052
8071
|
}
|
|
8053
8072
|
}
|
|
8054
|
-
)))) : /* @__PURE__ */
|
|
8073
|
+
)))) : /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-4" }, displayedProducts.map((product) => {
|
|
8055
8074
|
product.priceBeforeDiscount && product.priceBeforeDiscount > product.finalPrice ? Math.round(
|
|
8056
8075
|
(product.priceBeforeDiscount - product.finalPrice) / product.priceBeforeDiscount * 100
|
|
8057
8076
|
) : 0;
|
|
8058
|
-
return /* @__PURE__ */
|
|
8077
|
+
return /* @__PURE__ */ React20__default.default.createElement(
|
|
8059
8078
|
framerMotion.motion.div,
|
|
8060
8079
|
{
|
|
8061
8080
|
key: product.id,
|
|
8062
8081
|
whileHover: { y: -4 },
|
|
8063
8082
|
className: "group flex cursor-pointer flex-col gap-6 rounded-2xl border border-gray-100 bg-white p-5 shadow-sm transition hover:shadow-xl md:flex-row md:items-start",
|
|
8064
|
-
onClick: () => router.push(`/products/${product.id}`)
|
|
8083
|
+
onClick: () => router.push(buildPath(`/products/${product.id}`))
|
|
8065
8084
|
},
|
|
8066
|
-
/* @__PURE__ */
|
|
8085
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "relative h-48 w-full overflow-hidden rounded-2xl bg-gray-100 md:h-40 md:w-40" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
8067
8086
|
Image3__default.default,
|
|
8068
8087
|
{
|
|
8069
8088
|
src: product.productMedia[0]?.file || "/placeholder-product.jpg",
|
|
@@ -8072,27 +8091,27 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8072
8091
|
className: "object-cover transition duration-500 group-hover:scale-105"
|
|
8073
8092
|
}
|
|
8074
8093
|
)),
|
|
8075
|
-
/* @__PURE__ */
|
|
8094
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex-1 space-y-3" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap items-center gap-2 text-xs font-semibold uppercase tracking-wide text-primary-600" }, product.parentCategories.length > 0 && /* @__PURE__ */ React20__default.default.createElement("span", { className: "rounded-full bg-primary-50 px-3 py-1 text-primary-700" }, product.parentCategories.map((category) => category?.name).join(", ")), product.tags?.slice(0, 3).map((tag) => /* @__PURE__ */ React20__default.default.createElement(
|
|
8076
8095
|
"span",
|
|
8077
8096
|
{
|
|
8078
8097
|
key: tag,
|
|
8079
8098
|
className: "rounded-full bg-slate-100 px-3 py-1 text-gray-600"
|
|
8080
8099
|
},
|
|
8081
8100
|
tag
|
|
8082
|
-
))), /* @__PURE__ */
|
|
8083
|
-
/* @__PURE__ */
|
|
8101
|
+
))), /* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-xl font-semibold text-gray-900" }, product.name), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap items-center gap-4 text-sm text-gray-500" }, /* @__PURE__ */ React20__default.default.createElement("span", { className: "inline-flex items-center gap-2 font-medium text-primary-600" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.ShieldCheck, { className: "h-4 w-4" }), product.inventoryCount > 0 ? "In stock & ready to ship" : "Restocking soon"), /* @__PURE__ */ React20__default.default.createElement("span", { className: "inline-flex items-center gap-2" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Clock, { className: "h-4 w-4 text-primary-500" }), "Added ", new Date(product.createdAt).toLocaleDateString()))),
|
|
8102
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex w-full flex-col items-end gap-3 md:w-auto" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "text-right" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-3xl font-semibold text-gray-900" }, formatPrice(product.finalPrice)), product.priceBeforeDiscount && /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-gray-400 line-through" }, formatPrice(product.priceBeforeDiscount))), /* @__PURE__ */ React20__default.default.createElement(
|
|
8084
8103
|
Button,
|
|
8085
8104
|
{
|
|
8086
8105
|
size: "sm",
|
|
8087
8106
|
onClick: (event) => {
|
|
8088
8107
|
event.stopPropagation();
|
|
8089
|
-
router.push(`/products/${product._id}`);
|
|
8108
|
+
router.push(buildPath(`/products/${product._id}`));
|
|
8090
8109
|
}
|
|
8091
8110
|
},
|
|
8092
8111
|
"View product"
|
|
8093
8112
|
))
|
|
8094
8113
|
);
|
|
8095
|
-
})) : /* @__PURE__ */
|
|
8114
|
+
})) : /* @__PURE__ */ React20__default.default.createElement(
|
|
8096
8115
|
EmptyState,
|
|
8097
8116
|
{
|
|
8098
8117
|
icon: lucideReact.Package,
|
|
@@ -8101,7 +8120,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8101
8120
|
actionLabel: hasActiveFilters ? "Clear filters" : void 0,
|
|
8102
8121
|
onAction: hasActiveFilters ? handleClearFilters : void 0
|
|
8103
8122
|
}
|
|
8104
|
-
)), pagination.totalPages > 1 && /* @__PURE__ */
|
|
8123
|
+
)), pagination.totalPages > 1 && /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-10 flex flex-wrap items-center justify-center gap-3" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
8105
8124
|
Button,
|
|
8106
8125
|
{
|
|
8107
8126
|
variant: "outline",
|
|
@@ -8109,7 +8128,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8109
8128
|
disabled: page === 1
|
|
8110
8129
|
},
|
|
8111
8130
|
"Previous"
|
|
8112
|
-
), /* @__PURE__ */
|
|
8131
|
+
), /* @__PURE__ */ React20__default.default.createElement("span", { className: "text-sm font-semibold text-gray-600" }, "Page ", page, " of ", pagination.totalPages), /* @__PURE__ */ React20__default.default.createElement(
|
|
8113
8132
|
Button,
|
|
8114
8133
|
{
|
|
8115
8134
|
variant: "outline",
|
|
@@ -8117,7 +8136,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8117
8136
|
disabled: page === pagination.totalPages
|
|
8118
8137
|
},
|
|
8119
8138
|
"Next"
|
|
8120
|
-
))))))), /* @__PURE__ */
|
|
8139
|
+
))))))), /* @__PURE__ */ React20__default.default.createElement(framerMotion.AnimatePresence, null, showFilters && /* @__PURE__ */ React20__default.default.createElement(
|
|
8121
8140
|
framerMotion.motion.div,
|
|
8122
8141
|
{
|
|
8123
8142
|
initial: { opacity: 0 },
|
|
@@ -8125,7 +8144,7 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8125
8144
|
exit: { opacity: 0 },
|
|
8126
8145
|
className: "fixed inset-0 z-50 bg-black/40 backdrop-blur-sm lg:hidden"
|
|
8127
8146
|
},
|
|
8128
|
-
/* @__PURE__ */
|
|
8147
|
+
/* @__PURE__ */ React20__default.default.createElement(
|
|
8129
8148
|
framerMotion.motion.div,
|
|
8130
8149
|
{
|
|
8131
8150
|
initial: { y: "100%" },
|
|
@@ -8134,14 +8153,14 @@ function ShopScreen({ initialFilters = {}, categoryName }) {
|
|
|
8134
8153
|
transition: { type: "spring", stiffness: 260, damping: 26 },
|
|
8135
8154
|
className: "absolute inset-x-0 bottom-0 max-h-[85vh] overflow-y-auto rounded-t-3xl bg-white p-6 shadow-2xl"
|
|
8136
8155
|
},
|
|
8137
|
-
/* @__PURE__ */
|
|
8156
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "mb-6 flex items-center justify-between" }, /* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-lg font-semibold text-gray-900" }, "Filters"), /* @__PURE__ */ React20__default.default.createElement(
|
|
8138
8157
|
"button",
|
|
8139
8158
|
{
|
|
8140
8159
|
type: "button",
|
|
8141
8160
|
onClick: () => setShowFilters(false),
|
|
8142
8161
|
className: "rounded-full border border-gray-200 p-2 text-gray-500 hover:text-gray-700"
|
|
8143
8162
|
},
|
|
8144
|
-
/* @__PURE__ */
|
|
8163
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.X, { className: "h-4 w-4" })
|
|
8145
8164
|
)),
|
|
8146
8165
|
renderFiltersPanel()
|
|
8147
8166
|
)
|
|
@@ -8160,7 +8179,7 @@ function Badge({ children, variant = "primary", size = "md", className = "" }) {
|
|
|
8160
8179
|
sm: "px-2 py-1 text-xs",
|
|
8161
8180
|
md: "px-3 py-1 text-sm"
|
|
8162
8181
|
};
|
|
8163
|
-
return /* @__PURE__ */
|
|
8182
|
+
return /* @__PURE__ */ React20__default.default.createElement("span", { className: `inline-flex items-center font-medium rounded-full border ${variants[variant]} ${sizes[size]} ${className}` }, children);
|
|
8164
8183
|
}
|
|
8165
8184
|
var safeFormatDate = (date, format = "long") => {
|
|
8166
8185
|
if (!date) return "N/A";
|
|
@@ -8176,17 +8195,17 @@ function ProductDetailScreen({ productId }) {
|
|
|
8176
8195
|
const router = navigation.useRouter();
|
|
8177
8196
|
const { product: productData, isLoading } = useProduct(productId);
|
|
8178
8197
|
const { addToCart } = useCart();
|
|
8179
|
-
const [selectedVariant, setSelectedVariant] =
|
|
8180
|
-
const [quantity, setQuantity] =
|
|
8181
|
-
const [isAddingToCart, setIsAddingToCart] =
|
|
8182
|
-
const [isFavorited, setIsFavorited] =
|
|
8183
|
-
const [relatedProducts, setRelatedProducts] =
|
|
8184
|
-
const [initialProductData, setInitialProductData] =
|
|
8185
|
-
const [activeImageIndex, setActiveImageIndex] =
|
|
8186
|
-
|
|
8198
|
+
const [selectedVariant, setSelectedVariant] = React20.useState(null);
|
|
8199
|
+
const [quantity, setQuantity] = React20.useState(1);
|
|
8200
|
+
const [isAddingToCart, setIsAddingToCart] = React20.useState(false);
|
|
8201
|
+
const [isFavorited, setIsFavorited] = React20.useState(false);
|
|
8202
|
+
const [relatedProducts, setRelatedProducts] = React20.useState([]);
|
|
8203
|
+
const [initialProductData, setInitialProductData] = React20.useState(null);
|
|
8204
|
+
const [activeImageIndex, setActiveImageIndex] = React20.useState(0);
|
|
8205
|
+
React20.useEffect(() => {
|
|
8187
8206
|
setActiveImageIndex(0);
|
|
8188
8207
|
}, [selectedVariant]);
|
|
8189
|
-
const product =
|
|
8208
|
+
const product = React20.useMemo(() => {
|
|
8190
8209
|
if (initialProductData && !productData) {
|
|
8191
8210
|
return initialProductData;
|
|
8192
8211
|
}
|
|
@@ -8237,7 +8256,7 @@ function ProductDetailScreen({ productId }) {
|
|
|
8237
8256
|
);
|
|
8238
8257
|
const variantSku = currentVariant?.sku || product?.sku || "N/A";
|
|
8239
8258
|
const variantInStock = currentVariant?.inventoryCount > 0;
|
|
8240
|
-
|
|
8259
|
+
React20.useEffect(() => {
|
|
8241
8260
|
if (typeof window === "undefined") return;
|
|
8242
8261
|
const searchParams = new URLSearchParams(window.location.search);
|
|
8243
8262
|
const productParam = searchParams.get("product");
|
|
@@ -8250,13 +8269,13 @@ function ProductDetailScreen({ productId }) {
|
|
|
8250
8269
|
}
|
|
8251
8270
|
}
|
|
8252
8271
|
}, []);
|
|
8253
|
-
|
|
8272
|
+
React20.useEffect(() => {
|
|
8254
8273
|
if (product?.productVariants?.length > 0) {
|
|
8255
8274
|
const newVariant = product?.productVariants?.[0];
|
|
8256
8275
|
setSelectedVariant(newVariant);
|
|
8257
8276
|
}
|
|
8258
8277
|
}, [product?.productVariants]);
|
|
8259
|
-
|
|
8278
|
+
React20.useEffect(() => {
|
|
8260
8279
|
if (!product?.id) return;
|
|
8261
8280
|
const fetchRelated = async () => {
|
|
8262
8281
|
try {
|
|
@@ -8297,7 +8316,7 @@ function ProductDetailScreen({ productId }) {
|
|
|
8297
8316
|
}
|
|
8298
8317
|
};
|
|
8299
8318
|
const { addToWishlist, removeFromWishlist, isInWishlist } = useWishlist();
|
|
8300
|
-
|
|
8319
|
+
React20.useEffect(() => {
|
|
8301
8320
|
if (product) {
|
|
8302
8321
|
setIsFavorited(isInWishlist(product.id));
|
|
8303
8322
|
}
|
|
@@ -8319,10 +8338,10 @@ function ProductDetailScreen({ productId }) {
|
|
|
8319
8338
|
}
|
|
8320
8339
|
};
|
|
8321
8340
|
if (isLoading) {
|
|
8322
|
-
return /* @__PURE__ */
|
|
8341
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "container mx-auto px-4 py-16" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid gap-10 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "h-[520px] animate-pulse rounded-3xl bg-slate-200" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid grid-cols-3 gap-4" }, Array.from({ length: 3 }).map((_, index) => /* @__PURE__ */ React20__default.default.createElement("div", { key: index, className: "h-32 animate-pulse rounded-2xl bg-slate-200" })))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-4 rounded-3xl bg-white p-6 shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "h-8 w-32 animate-pulse rounded-full bg-slate-200" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "h-10 w-48 animate-pulse rounded-full bg-slate-200" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "h-6 w-full animate-pulse rounded-full bg-slate-200" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "h-12 w-full animate-pulse rounded-2xl bg-slate-200" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "h-12 w-full animate-pulse rounded-2xl bg-slate-200" })))));
|
|
8323
8342
|
}
|
|
8324
8343
|
if (!product) {
|
|
8325
|
-
return /* @__PURE__ */
|
|
8344
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "container mx-auto px-4 py-16" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-3xl bg-white p-10 text-center shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Sparkles, { className: "mx-auto h-10 w-10 text-primary-500" }), /* @__PURE__ */ React20__default.default.createElement("h1", { className: "mt-6 text-2xl font-semibold text-gray-900" }, "Product not found"), /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("div", { className: "mt-6" }, /* @__PURE__ */ React20__default.default.createElement(Link8__default.default, { href: "/shop", className: "inline-block" }, /* @__PURE__ */ React20__default.default.createElement(Button, null, "Browse products"))))));
|
|
8326
8345
|
}
|
|
8327
8346
|
product.tags && product.tags.length > 0 ? product.tags.slice(0, 6) : ["Pharmacist approved", "Gentle on daily routines", "Backed by real customers"];
|
|
8328
8347
|
const highlightCards = [
|
|
@@ -8342,29 +8361,29 @@ function ProductDetailScreen({ productId }) {
|
|
|
8342
8361
|
description: "Average rating 4.8/5 with over 120 verified customer experiences."
|
|
8343
8362
|
}
|
|
8344
8363
|
];
|
|
8345
|
-
return /* @__PURE__ */
|
|
8364
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React20__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__ */ React20__default.default.createElement(
|
|
8346
8365
|
"div",
|
|
8347
8366
|
{
|
|
8348
8367
|
className: "absolute inset-0 bg-[radial-gradient(circle_at_top_left,_rgba(255,255,255,0.35),_transparent_60%)]",
|
|
8349
8368
|
"aria-hidden": "true"
|
|
8350
8369
|
}
|
|
8351
|
-
), /* @__PURE__ */
|
|
8370
|
+
), /* @__PURE__ */ React20__default.default.createElement("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_bottom_right,_rgba(255,255,255,0.25),_transparent_55%)] opacity-70" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative container mx-auto px-4 py-16" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
8352
8371
|
Button,
|
|
8353
8372
|
{
|
|
8354
8373
|
variant: "ghost",
|
|
8355
8374
|
className: "text-white hover:bg-white/10",
|
|
8356
8375
|
onClick: () => router.push("/shop")
|
|
8357
8376
|
},
|
|
8358
|
-
/* @__PURE__ */
|
|
8377
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.ArrowLeft, { className: "h-5 w-5" }),
|
|
8359
8378
|
"Continue shopping"
|
|
8360
|
-
), /* @__PURE__ */
|
|
8379
|
+
), /* @__PURE__ */ React20__default.default.createElement("div", { className: "hidden items-center gap-3 text-sm text-white/80 md:flex" }, /* @__PURE__ */ React20__default.default.createElement(Link8__default.default, { href: "/", className: "transition hover:text-white" }, "Home"), /* @__PURE__ */ React20__default.default.createElement(lucideReact.ChevronRight, { className: "h-4 w-4" }), /* @__PURE__ */ React20__default.default.createElement(Link8__default.default, { href: "/shop", className: "transition hover:text-white" }, "Shop"), /* @__PURE__ */ React20__default.default.createElement(lucideReact.ChevronRight, { className: "h-4 w-4" }), /* @__PURE__ */ React20__default.default.createElement("span", { className: "truncate font-medium text-white" }, product.name))), /* @__PURE__ */ React20__default.default.createElement(
|
|
8361
8380
|
framerMotion.motion.div,
|
|
8362
8381
|
{
|
|
8363
8382
|
initial: { opacity: 0, y: 24 },
|
|
8364
8383
|
animate: { opacity: 1, y: 0 },
|
|
8365
8384
|
className: "max-w-3xl space-y-4"
|
|
8366
8385
|
},
|
|
8367
|
-
product.category && /* @__PURE__ */
|
|
8386
|
+
product.category && /* @__PURE__ */ React20__default.default.createElement(
|
|
8368
8387
|
Badge,
|
|
8369
8388
|
{
|
|
8370
8389
|
variant: "secondary",
|
|
@@ -8372,9 +8391,9 @@ function ProductDetailScreen({ productId }) {
|
|
|
8372
8391
|
},
|
|
8373
8392
|
product.category
|
|
8374
8393
|
),
|
|
8375
|
-
/* @__PURE__ */
|
|
8376
|
-
/* @__PURE__ */
|
|
8377
|
-
)))), /* @__PURE__ */
|
|
8394
|
+
/* @__PURE__ */ React20__default.default.createElement("h1", { className: "text-4xl font-bold leading-tight md:text-5xl" }, product.name),
|
|
8395
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap items-center gap-3 text-sm text-white/80" }, /* @__PURE__ */ React20__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full bg-white/10 px-3 py-1 font-medium text-white" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Sparkles, { className: "h-4 w-4" }), "Ready to ship today"), /* @__PURE__ */ React20__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full bg-white/10 px-3 py-1 font-medium text-white" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Shield, { className: "h-4 w-4" }), "30-day happiness guarantee"))
|
|
8396
|
+
)))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative -mt-16 pb-20" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid gap-10 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-10" }, /* @__PURE__ */ React20__default.default.createElement("section", { className: "rounded-3xl border border-white bg-white/70 p-6 shadow-xl shadow-primary-100/40 backdrop-blur" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid gap-6 lg:grid-cols-[minmax(0,1fr)_220px]" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
8378
8397
|
framerMotion.motion.div,
|
|
8379
8398
|
{
|
|
8380
8399
|
key: variantImages[activeImageIndex],
|
|
@@ -8383,7 +8402,7 @@ function ProductDetailScreen({ productId }) {
|
|
|
8383
8402
|
transition: { duration: 0.35 },
|
|
8384
8403
|
className: "relative overflow-hidden rounded-3xl bg-slate-100 h-[420px] md:h-[560px]"
|
|
8385
8404
|
},
|
|
8386
|
-
/* @__PURE__ */
|
|
8405
|
+
/* @__PURE__ */ React20__default.default.createElement(
|
|
8387
8406
|
Image3__default.default,
|
|
8388
8407
|
{
|
|
8389
8408
|
src: variantImages[activeImageIndex],
|
|
@@ -8394,7 +8413,7 @@ function ProductDetailScreen({ productId }) {
|
|
|
8394
8413
|
className: "object-contain"
|
|
8395
8414
|
}
|
|
8396
8415
|
),
|
|
8397
|
-
discount > 0 && /* @__PURE__ */
|
|
8416
|
+
discount > 0 && /* @__PURE__ */ React20__default.default.createElement(
|
|
8398
8417
|
Badge,
|
|
8399
8418
|
{
|
|
8400
8419
|
variant: "danger",
|
|
@@ -8404,7 +8423,7 @@ function ProductDetailScreen({ productId }) {
|
|
|
8404
8423
|
discount,
|
|
8405
8424
|
"%"
|
|
8406
8425
|
),
|
|
8407
|
-
!variantInStock && /* @__PURE__ */
|
|
8426
|
+
!variantInStock && /* @__PURE__ */ React20__default.default.createElement(
|
|
8408
8427
|
Badge,
|
|
8409
8428
|
{
|
|
8410
8429
|
variant: "secondary",
|
|
@@ -8412,7 +8431,7 @@ function ProductDetailScreen({ productId }) {
|
|
|
8412
8431
|
},
|
|
8413
8432
|
"Out of Stock"
|
|
8414
8433
|
)
|
|
8415
|
-
), /* @__PURE__ */
|
|
8434
|
+
), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col gap-4" }, product?.productVariants?.length > 0 && /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-2xl border border-slate-200 bg-white p-4 shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "mb-2 text-sm font-semibold uppercase tracking-[0.25em] text-slate-400" }, "Variant"), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap gap-2" }, product?.productVariants?.map((variant, index) => /* @__PURE__ */ React20__default.default.createElement(
|
|
8416
8435
|
"button",
|
|
8417
8436
|
{
|
|
8418
8437
|
key: variant.id,
|
|
@@ -8421,7 +8440,7 @@ function ProductDetailScreen({ productId }) {
|
|
|
8421
8440
|
className: `rounded-full px-4 py-2 text-sm font-medium transition ${selectedVariant?.id === variant.id ? "bg-primary-600 text-white" : "bg-slate-100 text-slate-700 hover:bg-slate-200"}`
|
|
8422
8441
|
},
|
|
8423
8442
|
variant.name
|
|
8424
|
-
)))), /* @__PURE__ */
|
|
8443
|
+
)))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid grid-cols-3 gap-3" }, variantImages.map((image, index) => /* @__PURE__ */ React20__default.default.createElement(
|
|
8425
8444
|
"button",
|
|
8426
8445
|
{
|
|
8427
8446
|
key: image.src + index,
|
|
@@ -8429,7 +8448,7 @@ function ProductDetailScreen({ productId }) {
|
|
|
8429
8448
|
onClick: () => setActiveImageIndex(index),
|
|
8430
8449
|
className: `relative aspect-square overflow-hidden rounded-2xl border transition ${activeImageIndex === index ? "border-primary-500 shadow-lg shadow-primary-200/60" : "border-transparent hover:border-primary-200"}`
|
|
8431
8450
|
},
|
|
8432
|
-
/* @__PURE__ */
|
|
8451
|
+
/* @__PURE__ */ React20__default.default.createElement(
|
|
8433
8452
|
Image3__default.default,
|
|
8434
8453
|
{
|
|
8435
8454
|
src: image.src,
|
|
@@ -8440,18 +8459,18 @@ function ProductDetailScreen({ productId }) {
|
|
|
8440
8459
|
unoptimized: true
|
|
8441
8460
|
}
|
|
8442
8461
|
)
|
|
8443
|
-
)))))), /* @__PURE__ */
|
|
8462
|
+
)))))), /* @__PURE__ */ React20__default.default.createElement("section", { className: "grid gap-6 lg:grid-cols-3" }, highlightCards.map((card) => {
|
|
8444
8463
|
const Icon = card.icon;
|
|
8445
|
-
return /* @__PURE__ */
|
|
8464
|
+
return /* @__PURE__ */ React20__default.default.createElement(
|
|
8446
8465
|
"div",
|
|
8447
8466
|
{
|
|
8448
8467
|
key: card.title,
|
|
8449
8468
|
className: "rounded-3xl border border-slate-100 bg-white p-6 shadow-sm transition hover:-translate-y-1 hover:shadow-lg"
|
|
8450
8469
|
},
|
|
8451
|
-
/* @__PURE__ */
|
|
8452
|
-
/* @__PURE__ */
|
|
8470
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React20__default.default.createElement("span", { className: "rounded-2xl bg-primary-50 p-3 text-primary-600" }, /* @__PURE__ */ React20__default.default.createElement(Icon, { className: "h-5 w-5" })), /* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-base font-semibold text-slate-900" }, card.title)),
|
|
8471
|
+
/* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-3 text-sm leading-relaxed text-slate-600" }, card.description)
|
|
8453
8472
|
);
|
|
8454
|
-
})), /* @__PURE__ */
|
|
8473
|
+
})), /* @__PURE__ */ React20__default.default.createElement("section", { className: "grid gap-6 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-3xl border border-slate-100 bg-white p-8 shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap items-center gap-4 pb-6" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-1 text-amber-500" }, Array.from({ length: 5 }).map((_, index) => /* @__PURE__ */ React20__default.default.createElement(lucideReact.Star, { key: index, className: "h-4 w-4 fill-current" }))), /* @__PURE__ */ React20__default.default.createElement("span", { className: "text-sm font-medium text-slate-500" }, "Rated 4.8 \u2022 Patients love the results")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-8" }, product.description && /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-lg font-semibold text-slate-900" }, "Description"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-base leading-relaxed text-slate-600", dangerouslySetInnerHTML: { __html: product.description } })))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "h-full rounded-3xl border border-slate-100 bg-gradient-to-br from-primary-50 via-white to-secondary-50 p-8 shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-sm font-semibold uppercase tracking-[0.3em] text-primary-500" }, "Care tips"), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-4 space-y-4 text-sm text-slate-600" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "leading-relaxed" }, "Store in a cool, dry place away from direct sunlight. Check packaging for allergen statements."), /* @__PURE__ */ React20__default.default.createElement("p", { className: "leading-relaxed" }, "Consult with your local pharmacist if you are combining with other treatments or have chronic conditions."), /* @__PURE__ */ React20__default.default.createElement("p", { className: "rounded-2xl bg-white/60 p-4 leading-relaxed text-primary-700" }, "Questions? Our care team is on standby \u2014 reach us via chat for tailored support before you checkout.")))), /* @__PURE__ */ React20__default.default.createElement("section", { className: "rounded-3xl border border-slate-100 bg-white p-8 shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement("h2", { className: "text-xl font-semibold text-slate-900" }, "Product insights"), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-6 grid gap-6 md:grid-cols-2" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-2xl border border-slate-200 bg-slate-50/60 p-5" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-xs font-semibold uppercase tracking-[0.3em] text-slate-500" }, "Availability"), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-3 flex items-center gap-2 text-sm text-slate-600" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Check, { className: "h-4 w-4 text-primary-500" }), product.inStock ? "Available for dispatch today" : "Currently restocking"), product.stock !== void 0 && /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-2 text-xs text-slate-500" }, product.stock > 0 ? `${product.stock} units remaining in inventory` : "Join the waitlist to be notified first")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-2xl border border-slate-200 bg-slate-50/60 p-5" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-xs font-semibold uppercase tracking-[0.3em] text-slate-500" }, "Product details"), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-3 space-y-2 text-sm text-slate-600" }, /* @__PURE__ */ React20__default.default.createElement("p", null, /* @__PURE__ */ React20__default.default.createElement("span", { className: "font-medium text-slate-700" }, "Variant:"), " ", currentVariant.name), /* @__PURE__ */ React20__default.default.createElement("p", null, /* @__PURE__ */ React20__default.default.createElement("span", { className: "font-medium text-slate-700" }, "SKU:"), " ", variantSku), /* @__PURE__ */ React20__default.default.createElement("p", null, /* @__PURE__ */ React20__default.default.createElement("span", { className: "font-medium text-slate-700" }, "Status:"), " ", /* @__PURE__ */ React20__default.default.createElement("span", { className: variantInStock ? "text-green-600" : "text-amber-600" }, variantInStock ? "In Stock" : "Out of Stock")), /* @__PURE__ */ React20__default.default.createElement("p", null, /* @__PURE__ */ React20__default.default.createElement("span", { className: "font-medium text-slate-700" }, "Last updated:"), " ", lastUpdatedLabel), /* @__PURE__ */ React20__default.default.createElement("p", null, /* @__PURE__ */ React20__default.default.createElement("span", { className: "font-medium text-slate-700" }, "Ships from:"), " Local pharmacy distribution center")))))), /* @__PURE__ */ React20__default.default.createElement("aside", { className: "space-y-6 lg:sticky lg:top-24" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-3xl border border-slate-100 bg-white p-8 shadow-lg shadow-primary-100/40" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-baseline gap-3" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-3xl font-bold text-slate-900" }, selectedVariant ? formatPrice(selectedVariant.finalPrice) : formatPrice(product.price)), variantComparePrice && variantComparePrice > variantPrice && /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-base text-slate-400 line-through" }, formatPrice(variantComparePrice)), discount > 0 && /* @__PURE__ */ React20__default.default.createElement(Badge, { variant: "danger", size: "sm" }, "-", discount, "%")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-6 space-y-4" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-3 rounded-2xl bg-primary-50/80 px-4 py-3 text-sm font-medium text-primary-700" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.ShieldCheck, { className: "h-4 w-4" }), "Pharmacist verified product"), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between rounded-2xl border border-slate-200 px-4 py-3" }, /* @__PURE__ */ React20__default.default.createElement("span", { className: "text-sm font-medium text-slate-600" }, "Qty"), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center rounded-full border border-slate-200 bg-slate-50" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
8455
8474
|
"button",
|
|
8456
8475
|
{
|
|
8457
8476
|
type: "button",
|
|
@@ -8459,8 +8478,8 @@ function ProductDetailScreen({ productId }) {
|
|
|
8459
8478
|
className: "rounded-l-full p-2 hover:bg-primary-100/60",
|
|
8460
8479
|
"aria-label": "Decrease quantity"
|
|
8461
8480
|
},
|
|
8462
|
-
/* @__PURE__ */
|
|
8463
|
-
), /* @__PURE__ */
|
|
8481
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Minus, { className: "h-4 w-4" })
|
|
8482
|
+
), /* @__PURE__ */ React20__default.default.createElement("span", { className: "w-12 text-center text-sm font-semibold text-slate-700" }, quantity), /* @__PURE__ */ React20__default.default.createElement(
|
|
8464
8483
|
"button",
|
|
8465
8484
|
{
|
|
8466
8485
|
type: "button",
|
|
@@ -8468,8 +8487,8 @@ function ProductDetailScreen({ productId }) {
|
|
|
8468
8487
|
className: "rounded-r-full p-2 hover:bg-primary-100/60",
|
|
8469
8488
|
"aria-label": "Increase quantity"
|
|
8470
8489
|
},
|
|
8471
|
-
/* @__PURE__ */
|
|
8472
|
-
)))), selectedVariant && /* @__PURE__ */
|
|
8490
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Plus, { className: "h-4 w-4" })
|
|
8491
|
+
)))), selectedVariant && /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-4 text-sm" }, selectedVariant.inventoryStatus === "OUT_OF_STOCK" /* OUTOFSTOCK */ || selectedVariant.inventoryStatus === "LOW_STOCK" /* LOWSTOCK */ ? /* @__PURE__ */ React20__default.default.createElement("div", { className: "text-red-600 font-medium" }, "Out of Stock") : /* @__PURE__ */ React20__default.default.createElement("div", { className: "text-green-600 font-medium" }, "In Stock")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-6 space-x-3" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
8473
8492
|
Button,
|
|
8474
8493
|
{
|
|
8475
8494
|
size: "lg",
|
|
@@ -8478,9 +8497,9 @@ function ProductDetailScreen({ productId }) {
|
|
|
8478
8497
|
isLoading: isAddingToCart,
|
|
8479
8498
|
disabled: !selectedVariant || selectedVariant.inventoryStatus === "OUT_OF_STOCK" /* OUTOFSTOCK */
|
|
8480
8499
|
},
|
|
8481
|
-
/* @__PURE__ */
|
|
8500
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.ShoppingCart, { className: "h-5 w-5" }),
|
|
8482
8501
|
!selectedVariant ? "Select a variant" : selectedVariant.inventoryStatus === "OUT_OF_STOCK" /* OUTOFSTOCK */ ? "Out of Stock" : `Add to Cart`
|
|
8483
|
-
), /* @__PURE__ */
|
|
8502
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
8484
8503
|
Button,
|
|
8485
8504
|
{
|
|
8486
8505
|
size: "lg",
|
|
@@ -8488,18 +8507,18 @@ function ProductDetailScreen({ productId }) {
|
|
|
8488
8507
|
className: "w-full",
|
|
8489
8508
|
onClick: handleToggleFavorite
|
|
8490
8509
|
},
|
|
8491
|
-
/* @__PURE__ */
|
|
8510
|
+
/* @__PURE__ */ React20__default.default.createElement(
|
|
8492
8511
|
lucideReact.Heart,
|
|
8493
8512
|
{
|
|
8494
8513
|
className: `h-5 w-5 ${isFavorited ? "fill-red-500 text-red-500" : "text-slate-500"}`
|
|
8495
8514
|
}
|
|
8496
8515
|
),
|
|
8497
8516
|
isFavorited ? "Saved" : "Save for later"
|
|
8498
|
-
))), /* @__PURE__ */
|
|
8517
|
+
))), /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("p", { className: "font-semibold uppercase tracking-[0.25em]" }, "Need advice?"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-2 leading-relaxed" }, "Chat with a pharmacist in real time before completing your purchase. We will help you choose supporting supplements and answer dosing questions.")))), relatedProducts.length > 0 && /* @__PURE__ */ React20__default.default.createElement("section", { className: "mt-20" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("h2", { className: "text-2xl font-semibold text-slate-900" }, "You may also like"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-1 text-sm text-slate-500" }, "Hand-picked recommendations that pair nicely with this product.")), /* @__PURE__ */ React20__default.default.createElement(Link8__default.default, { href: "/shop", className: "hidden md:inline-flex" }, /* @__PURE__ */ React20__default.default.createElement(Button, { variant: "ghost", className: "text-primary-600" }, "View all products"))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-6 grid gap-6 sm:grid-cols-2 lg:grid-cols-4" }, relatedProducts?.map((relatedProduct) => /* @__PURE__ */ React20__default.default.createElement(ProductCard, { key: relatedProduct.id, product: relatedProduct })))))));
|
|
8499
8518
|
}
|
|
8500
8519
|
function CartItem({ item }) {
|
|
8501
8520
|
const { updateQuantity, removeFromCart } = useCart();
|
|
8502
|
-
const [isUpdating, setIsUpdating] =
|
|
8521
|
+
const [isUpdating, setIsUpdating] = React20.useState(false);
|
|
8503
8522
|
const handleUpdateQuantity = async (newQuantity) => {
|
|
8504
8523
|
if (newQuantity < 1) return;
|
|
8505
8524
|
setIsUpdating(true);
|
|
@@ -8513,7 +8532,7 @@ function CartItem({ item }) {
|
|
|
8513
8532
|
await removeFromCart(item.productVariantId);
|
|
8514
8533
|
};
|
|
8515
8534
|
const itemTotal = item.productVariantData.finalPrice * item.quantity;
|
|
8516
|
-
return /* @__PURE__ */
|
|
8535
|
+
return /* @__PURE__ */ React20__default.default.createElement(
|
|
8517
8536
|
framerMotion.motion.div,
|
|
8518
8537
|
{
|
|
8519
8538
|
layout: true,
|
|
@@ -8522,7 +8541,7 @@ function CartItem({ item }) {
|
|
|
8522
8541
|
exit: { opacity: 0, x: -100 },
|
|
8523
8542
|
className: "flex gap-4 bg-white p-4 rounded-xl border border-gray-200 hover:border-primary-300 transition-colors"
|
|
8524
8543
|
},
|
|
8525
|
-
/* @__PURE__ */
|
|
8544
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "relative w-24 h-24 rounded-lg overflow-hidden flex-shrink-0 bg-gray-100" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
8526
8545
|
Image3__default.default,
|
|
8527
8546
|
{
|
|
8528
8547
|
src: item.productVariantData.productMedia[0]?.file || "/placeholder-product.jpg",
|
|
@@ -8531,39 +8550,39 @@ function CartItem({ item }) {
|
|
|
8531
8550
|
className: "object-cover"
|
|
8532
8551
|
}
|
|
8533
8552
|
)),
|
|
8534
|
-
/* @__PURE__ */
|
|
8553
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-lg font-semibold text-gray-900 truncate" }, item.productVariantData.name), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-gray-500 mt-1" }, formatPrice(item.productVariantData.finalPrice), " each"), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-3 mt-3" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center border-2 border-gray-200 rounded-lg" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
8535
8554
|
"button",
|
|
8536
8555
|
{
|
|
8537
8556
|
onClick: () => handleUpdateQuantity(item.quantity - 1),
|
|
8538
8557
|
disabled: isUpdating || item.quantity <= 0,
|
|
8539
8558
|
className: "p-2 hover:bg-gray-100 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
|
|
8540
8559
|
},
|
|
8541
|
-
/* @__PURE__ */
|
|
8542
|
-
), /* @__PURE__ */
|
|
8560
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Minus, { className: "w-4 h-4" })
|
|
8561
|
+
), /* @__PURE__ */ React20__default.default.createElement("span", { className: "px-4 font-medium min-w-[3rem] text-center" }, isUpdating ? /* @__PURE__ */ React20__default.default.createElement("span", { className: "inline-block h-4 w-4 align-middle animate-spin rounded-full border-2 border-gray-300 border-t-gray-600" }) : item.quantity), /* @__PURE__ */ React20__default.default.createElement(
|
|
8543
8562
|
"button",
|
|
8544
8563
|
{
|
|
8545
8564
|
onClick: () => handleUpdateQuantity(item.quantity + 1),
|
|
8546
8565
|
disabled: isUpdating || item.quantity >= item.productVariantData.inventoryCount,
|
|
8547
8566
|
className: "p-2 hover:bg-gray-100 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
|
|
8548
8567
|
},
|
|
8549
|
-
/* @__PURE__ */
|
|
8550
|
-
)), /* @__PURE__ */
|
|
8568
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Plus, { className: "w-4 h-4" })
|
|
8569
|
+
)), /* @__PURE__ */ React20__default.default.createElement(
|
|
8551
8570
|
"button",
|
|
8552
8571
|
{
|
|
8553
8572
|
onClick: handleRemove,
|
|
8554
8573
|
className: "p-2 text-red-600 hover:bg-red-50 rounded-lg transition-colors",
|
|
8555
8574
|
"aria-label": "Remove item"
|
|
8556
8575
|
},
|
|
8557
|
-
/* @__PURE__ */
|
|
8576
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Trash2, { className: "w-5 h-5" })
|
|
8558
8577
|
))),
|
|
8559
|
-
/* @__PURE__ */
|
|
8578
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "text-right" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-xl font-bold text-gray-900" }, formatPrice(itemTotal)))
|
|
8560
8579
|
);
|
|
8561
8580
|
}
|
|
8562
8581
|
function CartScreen() {
|
|
8563
8582
|
const router = navigation.useRouter();
|
|
8564
8583
|
const { cart, isLoading } = useCart();
|
|
8565
8584
|
if (!cart || cart.cartBody.items.length === 0) {
|
|
8566
|
-
return /* @__PURE__ */
|
|
8585
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "min-h-screen bg-gradient-to-br from-primary-700 via-primary-600 to-secondary-600 flex items-center justify-center" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "mx-auto px-20 py-5 bg-white rounded-3xl" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
8567
8586
|
EmptyState,
|
|
8568
8587
|
{
|
|
8569
8588
|
icon: lucideReact.ShoppingBag,
|
|
@@ -8578,16 +8597,16 @@ function CartScreen() {
|
|
|
8578
8597
|
const shipping = 0;
|
|
8579
8598
|
const tax = 0;
|
|
8580
8599
|
const total = subtotal + shipping + tax;
|
|
8581
|
-
return /* @__PURE__ */
|
|
8600
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React20__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" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_top_left,_rgba(255,255,255,0.35),_transparent_60%)]" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative container mx-auto px-4 py-16 mb-8" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
8582
8601
|
framerMotion.motion.div,
|
|
8583
8602
|
{
|
|
8584
8603
|
initial: { opacity: 0, y: 24 },
|
|
8585
8604
|
animate: { opacity: 1, y: 0 },
|
|
8586
8605
|
className: "flex flex-col gap-6 md:flex-row md:items-center md:justify-between"
|
|
8587
8606
|
},
|
|
8588
|
-
/* @__PURE__ */
|
|
8589
|
-
/* @__PURE__ */
|
|
8590
|
-
))), /* @__PURE__ */
|
|
8607
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "max-w-2xl space-y-4" }, /* @__PURE__ */ React20__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1 text-sm font-semibold tracking-wide text-white/80 backdrop-blur" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.HeartPulse, { className: "h-4 w-4" }), "Wellness essentials, ready when you are"), /* @__PURE__ */ React20__default.default.createElement("h1", { className: "text-4xl font-bold md:text-5xl" }, "Your curated cart"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-white/75 md:text-lg" }, "Review your selections, unlock exclusive perks, and check out with pharmacist-backed confidence.")),
|
|
8608
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-3xl bg-white/15 p-6 backdrop-blur-md" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm font-semibold uppercase tracking-[0.35em] text-white/70" }, "Cart summary"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-4 text-4xl font-semibold" }, formatPrice(total)), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-white/70" }, "Taxes and shipping calculated below"))
|
|
8609
|
+
))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative -mt-16 pb-20" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid gap-10 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
8591
8610
|
framerMotion.motion.section,
|
|
8592
8611
|
{
|
|
8593
8612
|
initial: { opacity: 0, y: 24 },
|
|
@@ -8595,10 +8614,10 @@ function CartScreen() {
|
|
|
8595
8614
|
transition: { delay: 0.05 },
|
|
8596
8615
|
className: "space-y-6 rounded-3xl border border-slate-100 bg-white p-6 shadow-lg shadow-primary-50"
|
|
8597
8616
|
},
|
|
8598
|
-
/* @__PURE__ */
|
|
8599
|
-
isLoading && /* @__PURE__ */
|
|
8600
|
-
/* @__PURE__ */
|
|
8601
|
-
), /* @__PURE__ */
|
|
8617
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap items-center justify-between gap-4" }, /* @__PURE__ */ React20__default.default.createElement("h2", { className: "text-xl font-semibold text-slate-900" }, "Items (", cart.cartBody.items.length, ")"), /* @__PURE__ */ React20__default.default.createElement("div", { 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__ */ React20__default.default.createElement(lucideReact.ShieldCheck, { className: "h-4 w-4" }), "Guaranteed cold-chain handling")),
|
|
8618
|
+
isLoading && /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-2 rounded-xl border border-slate-200 bg-slate-50 px-3 py-2 text-sm text-slate-600" }, /* @__PURE__ */ React20__default.default.createElement("span", { className: "inline-block h-3 w-3 animate-spin rounded-full border-2 border-slate-300 border-t-slate-600" }), "Updating cart\u2026"),
|
|
8619
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-5" }, cart.cartBody.items.map((item) => /* @__PURE__ */ React20__default.default.createElement(CartItem, { key: item.productVariantId, item })))
|
|
8620
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
8602
8621
|
framerMotion.motion.aside,
|
|
8603
8622
|
{
|
|
8604
8623
|
initial: { opacity: 0, y: 24 },
|
|
@@ -8606,7 +8625,7 @@ function CartScreen() {
|
|
|
8606
8625
|
transition: { delay: 0.1 },
|
|
8607
8626
|
className: "space-y-6 lg:sticky lg:top-28"
|
|
8608
8627
|
},
|
|
8609
|
-
/* @__PURE__ */
|
|
8628
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-3xl border border-slate-100 bg-white p-6 shadow-lg shadow-primary-50" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React20__default.default.createElement("h2", { className: "text-xl font-semibold text-slate-900" }, "Checkout summary"), /* @__PURE__ */ React20__default.default.createElement("span", { className: "inline-flex items-center gap-1 rounded-full bg-primary-50 px-3 py-1 text-xs font-semibold text-primary-700" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.BadgePercent, { className: "h-4 w-4" }), "Savings applied")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-6 space-y-4 text-sm text-slate-600" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React20__default.default.createElement("span", null, "Subtotal"), /* @__PURE__ */ React20__default.default.createElement("span", { className: "font-semibold text-slate-900" }, formatPrice(subtotal))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React20__default.default.createElement("span", null, "Shipping"), /* @__PURE__ */ React20__default.default.createElement("span", { className: "font-semibold" }, "Will be calculated at checkout")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-2xl bg-slate-50 p-4" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between text-base font-semibold text-slate-900" }, /* @__PURE__ */ React20__default.default.createElement("span", null, "Order total"), /* @__PURE__ */ React20__default.default.createElement("span", null, formatPrice(total))), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-2 text-xs text-slate-500" }, "Prices include pharmacy-grade quality control and packaging."))), /* @__PURE__ */ React20__default.default.createElement(
|
|
8610
8629
|
Button,
|
|
8611
8630
|
{
|
|
8612
8631
|
size: "lg",
|
|
@@ -8614,8 +8633,8 @@ function CartScreen() {
|
|
|
8614
8633
|
onClick: () => router.push("/checkout")
|
|
8615
8634
|
},
|
|
8616
8635
|
"Secure checkout",
|
|
8617
|
-
/* @__PURE__ */
|
|
8618
|
-
), /* @__PURE__ */
|
|
8636
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.ArrowRight, { className: "h-5 w-5" })
|
|
8637
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
8619
8638
|
"button",
|
|
8620
8639
|
{
|
|
8621
8640
|
type: "button",
|
|
@@ -8624,24 +8643,24 @@ function CartScreen() {
|
|
|
8624
8643
|
},
|
|
8625
8644
|
"Continue shopping"
|
|
8626
8645
|
)),
|
|
8627
|
-
/* @__PURE__ */
|
|
8646
|
+
/* @__PURE__ */ React20__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__ */ React20__default.default.createElement("p", { className: "font-semibold uppercase tracking-[0.3em]" }, "Need help?"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-2 leading-relaxed" }, "Chat with a pharmacist to optimize your regimen or discuss substitutions before you check out."))
|
|
8628
8647
|
)))));
|
|
8629
8648
|
}
|
|
8630
8649
|
function useAddresses() {
|
|
8631
|
-
const [addresses, setAddresses] =
|
|
8632
|
-
const [isLoading, setIsLoading] =
|
|
8633
|
-
const [error, setError] =
|
|
8634
|
-
const refresh =
|
|
8650
|
+
const [addresses, setAddresses] = React20.useState([]);
|
|
8651
|
+
const [isLoading, setIsLoading] = React20.useState(true);
|
|
8652
|
+
const [error, setError] = React20.useState(null);
|
|
8653
|
+
const refresh = React20.useCallback(async () => {
|
|
8635
8654
|
setIsLoading(true);
|
|
8636
8655
|
setError(null);
|
|
8637
8656
|
const response = await new AddressesApi(AXIOS_CONFIG).getMyAddresses();
|
|
8638
8657
|
setAddresses(response.data || []);
|
|
8639
8658
|
setIsLoading(false);
|
|
8640
8659
|
}, []);
|
|
8641
|
-
|
|
8660
|
+
React20.useEffect(() => {
|
|
8642
8661
|
refresh();
|
|
8643
8662
|
}, [refresh]);
|
|
8644
|
-
const sortedAddresses =
|
|
8663
|
+
const sortedAddresses = React20.useMemo(() => {
|
|
8645
8664
|
return [...addresses].sort((a, b) => {
|
|
8646
8665
|
if (a.isDefault === b.isDefault) {
|
|
8647
8666
|
return (b.updatedAt.toISOString() || "").localeCompare(a.updatedAt.toISOString() || "");
|
|
@@ -8649,26 +8668,26 @@ function useAddresses() {
|
|
|
8649
8668
|
return a.isDefault ? -1 : 1;
|
|
8650
8669
|
});
|
|
8651
8670
|
}, [addresses]);
|
|
8652
|
-
const defaultAddress =
|
|
8671
|
+
const defaultAddress = React20.useMemo(
|
|
8653
8672
|
() => sortedAddresses.find((address) => address.isDefault) || null,
|
|
8654
8673
|
[sortedAddresses]
|
|
8655
8674
|
);
|
|
8656
|
-
const addAddress =
|
|
8675
|
+
const addAddress = React20.useCallback(async (payload) => {
|
|
8657
8676
|
const response = await new AddressesApi(AXIOS_CONFIG).createAddressForUser(payload);
|
|
8658
8677
|
setAddresses((prev) => [...prev, response.data]);
|
|
8659
8678
|
return response.data;
|
|
8660
8679
|
}, []);
|
|
8661
|
-
const updateAddress =
|
|
8680
|
+
const updateAddress = React20.useCallback(async (id, payload) => {
|
|
8662
8681
|
const response = await new AddressesApi(AXIOS_CONFIG).updateUserAddress(payload, id);
|
|
8663
8682
|
setAddresses((prev) => prev.map((address) => address.id === id ? response.data : address));
|
|
8664
8683
|
return response.data;
|
|
8665
8684
|
}, []);
|
|
8666
|
-
const removeAddress =
|
|
8685
|
+
const removeAddress = React20.useCallback(async (id) => {
|
|
8667
8686
|
await new AddressesApi(AXIOS_CONFIG).deleteUserAddress(id);
|
|
8668
8687
|
setAddresses((prev) => prev.filter((address) => address.id !== id));
|
|
8669
8688
|
return;
|
|
8670
8689
|
}, []);
|
|
8671
|
-
const markAsDefault =
|
|
8690
|
+
const markAsDefault = React20.useCallback(async (id) => {
|
|
8672
8691
|
const response = await new AddressesApi(AXIOS_CONFIG).updateDefaultAddress(id);
|
|
8673
8692
|
setAddresses((prev) => prev.map((address) => address.id === id ? response.data : address));
|
|
8674
8693
|
return response.data;
|
|
@@ -8686,7 +8705,7 @@ function useAddresses() {
|
|
|
8686
8705
|
};
|
|
8687
8706
|
}
|
|
8688
8707
|
function Card({ className = "", ...props }) {
|
|
8689
|
-
return /* @__PURE__ */
|
|
8708
|
+
return /* @__PURE__ */ React20__default.default.createElement(
|
|
8690
8709
|
"div",
|
|
8691
8710
|
{
|
|
8692
8711
|
className: `rounded-lg border bg-white shadow-sm ${className}`,
|
|
@@ -8695,7 +8714,7 @@ function Card({ className = "", ...props }) {
|
|
|
8695
8714
|
);
|
|
8696
8715
|
}
|
|
8697
8716
|
function Modal({ isOpen, onClose, title, children, size = "md" }) {
|
|
8698
|
-
|
|
8717
|
+
React20.useEffect(() => {
|
|
8699
8718
|
if (isOpen) {
|
|
8700
8719
|
document.body.style.overflow = "hidden";
|
|
8701
8720
|
} else {
|
|
@@ -8711,7 +8730,7 @@ function Modal({ isOpen, onClose, title, children, size = "md" }) {
|
|
|
8711
8730
|
lg: "max-w-2xl",
|
|
8712
8731
|
xl: "max-w-4xl"
|
|
8713
8732
|
};
|
|
8714
|
-
return /* @__PURE__ */
|
|
8733
|
+
return /* @__PURE__ */ React20__default.default.createElement(framerMotion.AnimatePresence, null, isOpen && /* @__PURE__ */ React20__default.default.createElement(React20__default.default.Fragment, null, /* @__PURE__ */ React20__default.default.createElement(
|
|
8715
8734
|
framerMotion.motion.div,
|
|
8716
8735
|
{
|
|
8717
8736
|
initial: { opacity: 0 },
|
|
@@ -8720,7 +8739,7 @@ function Modal({ isOpen, onClose, title, children, size = "md" }) {
|
|
|
8720
8739
|
onClick: onClose,
|
|
8721
8740
|
className: "fixed inset-0 bg-black/50 backdrop-blur-sm z-50"
|
|
8722
8741
|
}
|
|
8723
|
-
), /* @__PURE__ */
|
|
8742
|
+
), /* @__PURE__ */ React20__default.default.createElement("div", { className: "fixed inset-0 z-50 flex items-center justify-center p-4" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
8724
8743
|
framerMotion.motion.div,
|
|
8725
8744
|
{
|
|
8726
8745
|
initial: { opacity: 0, scale: 0.95, y: 20 },
|
|
@@ -8728,15 +8747,15 @@ function Modal({ isOpen, onClose, title, children, size = "md" }) {
|
|
|
8728
8747
|
exit: { opacity: 0, scale: 0.95, y: 20 },
|
|
8729
8748
|
className: `bg-white rounded-2xl shadow-2xl w-full ${sizes[size]} max-h-[90vh] overflow-hidden flex flex-col`
|
|
8730
8749
|
},
|
|
8731
|
-
title && /* @__PURE__ */
|
|
8750
|
+
title && /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between p-6 border-b border-gray-200" }, /* @__PURE__ */ React20__default.default.createElement("h2", { className: "text-2xl font-bold text-gray-900" }, title), /* @__PURE__ */ React20__default.default.createElement(
|
|
8732
8751
|
"button",
|
|
8733
8752
|
{
|
|
8734
8753
|
onClick: onClose,
|
|
8735
8754
|
className: "p-2 hover:bg-gray-100 rounded-lg transition-colors"
|
|
8736
8755
|
},
|
|
8737
|
-
/* @__PURE__ */
|
|
8756
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.X, { className: "w-5 h-5" })
|
|
8738
8757
|
)),
|
|
8739
|
-
/* @__PURE__ */
|
|
8758
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex-1 overflow-y-auto p-6" }, children)
|
|
8740
8759
|
))));
|
|
8741
8760
|
}
|
|
8742
8761
|
var addressSchema = zod.z.object({
|
|
@@ -8750,7 +8769,7 @@ var addressSchema = zod.z.object({
|
|
|
8750
8769
|
phone: zod.z.string().min(10, "Phone number is required")
|
|
8751
8770
|
});
|
|
8752
8771
|
function AddressFormModal({ isOpen, onClose, onAddressAdded, onAddressUpdated, initialAddress }) {
|
|
8753
|
-
const [isSubmitting, setIsSubmitting] =
|
|
8772
|
+
const [isSubmitting, setIsSubmitting] = React20.useState(false);
|
|
8754
8773
|
const {
|
|
8755
8774
|
register,
|
|
8756
8775
|
handleSubmit,
|
|
@@ -8769,7 +8788,7 @@ function AddressFormModal({ isOpen, onClose, onAddressAdded, onAddressUpdated, i
|
|
|
8769
8788
|
country: initialAddress?.country || "United States"
|
|
8770
8789
|
}
|
|
8771
8790
|
});
|
|
8772
|
-
|
|
8791
|
+
React20.useState(() => {
|
|
8773
8792
|
});
|
|
8774
8793
|
const onSubmit = async (data) => {
|
|
8775
8794
|
setIsSubmitting(true);
|
|
@@ -8907,7 +8926,7 @@ var PAYMENT_METHODS = [
|
|
|
8907
8926
|
{
|
|
8908
8927
|
label: "Card",
|
|
8909
8928
|
value: "Card",
|
|
8910
|
-
icon: /* @__PURE__ */
|
|
8929
|
+
icon: /* @__PURE__ */ React20__default.default.createElement(lucideReact.CreditCard, { className: "w-5 h-5" }),
|
|
8911
8930
|
description: "Pay securely with your credit or debit card",
|
|
8912
8931
|
className: "border-blue-500 hover:bg-blue-50",
|
|
8913
8932
|
activeClass: "bg-blue-50 border-blue-500 text-blue-700"
|
|
@@ -8915,7 +8934,7 @@ var PAYMENT_METHODS = [
|
|
|
8915
8934
|
{
|
|
8916
8935
|
label: "Cash",
|
|
8917
8936
|
value: "Cash",
|
|
8918
|
-
icon: /* @__PURE__ */
|
|
8937
|
+
icon: /* @__PURE__ */ React20__default.default.createElement(lucideReact.PackageCheck, { className: "w-5 h-5" }),
|
|
8919
8938
|
description: "Pay with cash on delivery or at pickup",
|
|
8920
8939
|
className: "border-amber-500 hover:bg-amber-50",
|
|
8921
8940
|
activeClass: "bg-amber-50 border-amber-500 text-amber-700"
|
|
@@ -8923,7 +8942,7 @@ var PAYMENT_METHODS = [
|
|
|
8923
8942
|
{
|
|
8924
8943
|
label: "Credit",
|
|
8925
8944
|
value: "Credit",
|
|
8926
|
-
icon: /* @__PURE__ */
|
|
8945
|
+
icon: /* @__PURE__ */ React20__default.default.createElement(lucideReact.ShieldCheck, { className: "w-5 h-5" }),
|
|
8927
8946
|
description: "Use your account credit",
|
|
8928
8947
|
className: "border-emerald-500 hover:bg-emerald-50",
|
|
8929
8948
|
activeClass: "bg-emerald-50 border-emerald-500 text-emerald-700"
|
|
@@ -8933,25 +8952,25 @@ function CheckoutScreen() {
|
|
|
8933
8952
|
const router = navigation.useRouter();
|
|
8934
8953
|
const { cart, clearCart } = useCart();
|
|
8935
8954
|
const { isAuthenticated, user } = useAuth();
|
|
8936
|
-
const [isSubmitting, setIsSubmitting] =
|
|
8937
|
-
const [isDelivery, setIsDelivery] =
|
|
8938
|
-
const [paymentMethod, setPaymentMethod] =
|
|
8939
|
-
const [error, setError] =
|
|
8940
|
-
const [selectedAddressId, setSelectedAddressId] =
|
|
8941
|
-
const [selectedStoreAddressId, setSelectedStoreAddressId] =
|
|
8942
|
-
const [storeAddresses, setStoreAddresses] =
|
|
8943
|
-
const [isAddressModalOpen, setIsAddressModalOpen] =
|
|
8944
|
-
const [editingAddress, setEditingAddress] =
|
|
8945
|
-
const [shippingPrice, setShippingPrice] =
|
|
8955
|
+
const [isSubmitting, setIsSubmitting] = React20.useState(false);
|
|
8956
|
+
const [isDelivery, setIsDelivery] = React20.useState(true);
|
|
8957
|
+
const [paymentMethod, setPaymentMethod] = React20.useState("Card");
|
|
8958
|
+
const [error, setError] = React20.useState(null);
|
|
8959
|
+
const [selectedAddressId, setSelectedAddressId] = React20.useState(null);
|
|
8960
|
+
const [selectedStoreAddressId, setSelectedStoreAddressId] = React20.useState(null);
|
|
8961
|
+
const [storeAddresses, setStoreAddresses] = React20.useState([]);
|
|
8962
|
+
const [isAddressModalOpen, setIsAddressModalOpen] = React20.useState(false);
|
|
8963
|
+
const [editingAddress, setEditingAddress] = React20.useState(null);
|
|
8964
|
+
const [shippingPrice, setShippingPrice] = React20.useState(0);
|
|
8946
8965
|
const {
|
|
8947
8966
|
addresses: userAddresses,
|
|
8948
8967
|
defaultAddress
|
|
8949
8968
|
} = useAddresses();
|
|
8950
|
-
const [selectedShippingRateId, setSelectedShippingRateId] =
|
|
8951
|
-
const [shippingRates, setShippingRates] =
|
|
8952
|
-
const [shippingRatesLoading, setShippingRatesLoading] =
|
|
8953
|
-
const [shippingRatesError, setShippingRatesError] =
|
|
8954
|
-
const [storeData, setStoreData] =
|
|
8969
|
+
const [selectedShippingRateId, setSelectedShippingRateId] = React20.useState(null);
|
|
8970
|
+
const [shippingRates, setShippingRates] = React20.useState([]);
|
|
8971
|
+
const [shippingRatesLoading, setShippingRatesLoading] = React20.useState(false);
|
|
8972
|
+
const [shippingRatesError, setShippingRatesError] = React20.useState(null);
|
|
8973
|
+
const [storeData, setStoreData] = React20.useState(null);
|
|
8955
8974
|
const { addresses, isLoading, refresh, removeAddress } = useAddresses();
|
|
8956
8975
|
const {
|
|
8957
8976
|
register,
|
|
@@ -8976,7 +8995,7 @@ function CheckoutScreen() {
|
|
|
8976
8995
|
}
|
|
8977
8996
|
});
|
|
8978
8997
|
const sameAsShipping = watch("sameAsShipping", true);
|
|
8979
|
-
|
|
8998
|
+
React20.useEffect(() => {
|
|
8980
8999
|
if (sameAsShipping) {
|
|
8981
9000
|
setValue("billing.name", watch("shipping.name"));
|
|
8982
9001
|
setValue("billing.phone", watch("shipping.phone"));
|
|
@@ -8988,7 +9007,7 @@ function CheckoutScreen() {
|
|
|
8988
9007
|
setValue("billing.country", watch("shipping.country"));
|
|
8989
9008
|
}
|
|
8990
9009
|
}, [sameAsShipping, watch("shipping.name"), watch("shipping.phone"), watch("shipping.street1"), watch("shipping.street2"), watch("shipping.city"), watch("shipping.state"), watch("shipping.zip"), watch("shipping.country")]);
|
|
8991
|
-
|
|
9010
|
+
React20.useEffect(() => {
|
|
8992
9011
|
if (defaultAddress && !selectedAddressId) {
|
|
8993
9012
|
setSelectedAddressId(defaultAddress.id);
|
|
8994
9013
|
setValue("shipping.name", defaultAddress.name);
|
|
@@ -9023,7 +9042,7 @@ function CheckoutScreen() {
|
|
|
9023
9042
|
setShippingRates([]);
|
|
9024
9043
|
setSelectedShippingRateId(null);
|
|
9025
9044
|
};
|
|
9026
|
-
|
|
9045
|
+
React20.useEffect(() => {
|
|
9027
9046
|
if (!isDelivery || !selectedAddressId || !cart || cart?.cartBody?.items?.length === 0 || !cart?.cartBody?.items) {
|
|
9028
9047
|
setShippingRates([]);
|
|
9029
9048
|
setSelectedShippingRateId(null);
|
|
@@ -9052,7 +9071,7 @@ function CheckoutScreen() {
|
|
|
9052
9071
|
}
|
|
9053
9072
|
})();
|
|
9054
9073
|
}, [isDelivery, selectedAddressId, cart]);
|
|
9055
|
-
|
|
9074
|
+
React20.useEffect(() => {
|
|
9056
9075
|
if (!isDelivery) {
|
|
9057
9076
|
const stores = [
|
|
9058
9077
|
{ id: "store1", name: "Main Pharmacy", street1: "123 Main St", city: "Seattle" },
|
|
@@ -9126,7 +9145,7 @@ function CheckoutScreen() {
|
|
|
9126
9145
|
}
|
|
9127
9146
|
}
|
|
9128
9147
|
setIsSubmitting(true);
|
|
9129
|
-
sonner.toast("Submitting order...", { icon: /* @__PURE__ */
|
|
9148
|
+
sonner.toast("Submitting order...", { icon: /* @__PURE__ */ React20__default.default.createElement(lucideReact.CreditCard, { className: "h-4 w-4" }) });
|
|
9130
9149
|
try {
|
|
9131
9150
|
const items = (cart?.cartBody?.items || []).map((item) => ({
|
|
9132
9151
|
productVariantId: String(item.productVariantId),
|
|
@@ -9191,33 +9210,33 @@ function CheckoutScreen() {
|
|
|
9191
9210
|
const subtotal = cart.total;
|
|
9192
9211
|
const tax = 0;
|
|
9193
9212
|
const total = subtotal + shippingPrice + tax;
|
|
9194
|
-
return /* @__PURE__ */
|
|
9213
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React20__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" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_top_left,_rgba(255,255,255,0.35),_transparent_60%)]" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative container mx-auto px-4 py-16" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid gap-10 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9195
9214
|
framerMotion.motion.div,
|
|
9196
9215
|
{
|
|
9197
9216
|
initial: { opacity: 0, y: 24 },
|
|
9198
9217
|
animate: { opacity: 1, y: 0 },
|
|
9199
9218
|
className: "space-y-6"
|
|
9200
9219
|
},
|
|
9201
|
-
/* @__PURE__ */
|
|
9202
|
-
/* @__PURE__ */
|
|
9203
|
-
/* @__PURE__ */
|
|
9204
|
-
/* @__PURE__ */
|
|
9220
|
+
/* @__PURE__ */ React20__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__ */ React20__default.default.createElement(lucideReact.ShieldCheck, { className: "h-4 w-4" }), "Secure checkout"),
|
|
9221
|
+
/* @__PURE__ */ React20__default.default.createElement("h1", { className: "text-4xl font-bold md:text-5xl" }, "Provide delivery details"),
|
|
9222
|
+
/* @__PURE__ */ React20__default.default.createElement("p", { className: "text-white/75 md:text-lg" }, "Our pharmacists handle every package with care. Share your shipping and billing information so we can dispatch your order within the next 12 hours."),
|
|
9223
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap gap-3" }, checkoutSteps.map((step) => /* @__PURE__ */ React20__default.default.createElement(
|
|
9205
9224
|
"div",
|
|
9206
9225
|
{
|
|
9207
9226
|
key: step.id,
|
|
9208
9227
|
className: `flex items-center gap-3 rounded-2xl px-4 py-2 text-sm font-semibold ${step.status === "complete" ? "bg-white/20 text-white" : step.status === "current" ? "bg-white text-primary-700" : "bg-white/10 text-white/60"}`
|
|
9209
9228
|
},
|
|
9210
|
-
/* @__PURE__ */
|
|
9229
|
+
/* @__PURE__ */ React20__default.default.createElement("span", { className: "flex h-7 w-7 items-center justify-center rounded-full bg-white/20 text-xs font-bold" }, step.id),
|
|
9211
9230
|
step.label
|
|
9212
9231
|
)))
|
|
9213
|
-
)))), /* @__PURE__ */
|
|
9232
|
+
)))), /* @__PURE__ */ React20__default.default.createElement("form", { onSubmit: handleSubmit(onSubmit) }, error && /* @__PURE__ */ React20__default.default.createElement("div", { className: "mb-4 text-red-600 font-semibold" }, error), /* @__PURE__ */ React20__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__ */ React20__default.default.createElement(
|
|
9214
9233
|
framerMotion.motion.div,
|
|
9215
9234
|
{
|
|
9216
9235
|
initial: { opacity: 0, y: 24 },
|
|
9217
9236
|
animate: { opacity: 1, y: 0 },
|
|
9218
9237
|
className: "space-y-8"
|
|
9219
9238
|
},
|
|
9220
|
-
/* @__PURE__ */
|
|
9239
|
+
/* @__PURE__ */ React20__default.default.createElement("section", { className: "rounded-3xl border border-slate-100 bg-white p-6 shadow-lg shadow-primary-50" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap items-center justify-between gap-4" }, /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("h2", { className: "text-xl font-semibold text-slate-900" }, "Shipping information"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-slate-500" }, "We use temperature-aware packaging and real-time tracking on every shipment.")), /* @__PURE__ */ React20__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__ */ React20__default.default.createElement(lucideReact.Truck, { className: "h-4 w-4" }), "Dispatch in 12h")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-6 grid grid-cols-1 gap-4 md:grid-cols-2" }, isDelivery && /* @__PURE__ */ React20__default.default.createElement("div", { className: "md:col-span-2 space-y-4" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React20__default.default.createElement("label", { className: "block font-semibold" }, "Select Address"), /* @__PURE__ */ React20__default.default.createElement(
|
|
9221
9240
|
Button,
|
|
9222
9241
|
{
|
|
9223
9242
|
type: "button",
|
|
@@ -9228,15 +9247,15 @@ function CheckoutScreen() {
|
|
|
9228
9247
|
setIsAddressModalOpen(true);
|
|
9229
9248
|
}
|
|
9230
9249
|
},
|
|
9231
|
-
/* @__PURE__ */
|
|
9250
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Plus, { className: "h-4 w-4 mr-2" }),
|
|
9232
9251
|
"Add New Address"
|
|
9233
|
-
)), userAddresses.length > 0 ? /* @__PURE__ */
|
|
9252
|
+
)), userAddresses.length > 0 ? /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid gap-4" }, userAddresses.map((addr) => /* @__PURE__ */ React20__default.default.createElement(
|
|
9234
9253
|
"label",
|
|
9235
9254
|
{
|
|
9236
9255
|
key: addr.id,
|
|
9237
9256
|
className: `group relative flex items-start gap-3 p-4 rounded-2xl border ${selectedAddressId === addr.id ? "border-primary-500 bg-primary-50 shadow-sm" : "border-slate-200 bg-white"} cursor-pointer hover:border-primary-300 transition-colors`
|
|
9238
9257
|
},
|
|
9239
|
-
/* @__PURE__ */
|
|
9258
|
+
/* @__PURE__ */ React20__default.default.createElement(
|
|
9240
9259
|
"input",
|
|
9241
9260
|
{
|
|
9242
9261
|
type: "radio",
|
|
@@ -9257,7 +9276,7 @@ function CheckoutScreen() {
|
|
|
9257
9276
|
className: "mt-1"
|
|
9258
9277
|
}
|
|
9259
9278
|
),
|
|
9260
|
-
/* @__PURE__ */
|
|
9279
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex-1" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "font-semibold text-slate-900" }, addr.name), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-slate-600" }, addr.street1), addr.street2 && /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-slate-600" }, addr.street2), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-slate-600" }, addr.city, ", ", addr.state, " ", addr.zip), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-slate-600" }, addr.country), addr.phone && /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-slate-600 mt-1" }, addr.phone), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-3 flex items-center gap-2" }, addr.isDefault && /* @__PURE__ */ React20__default.default.createElement("span", { className: "inline-flex items-center gap-1 rounded-full bg-primary-100 px-2.5 py-0.5 text-xs font-semibold text-primary-700" }, "Default"), /* @__PURE__ */ React20__default.default.createElement(
|
|
9261
9280
|
"button",
|
|
9262
9281
|
{
|
|
9263
9282
|
type: "button",
|
|
@@ -9268,9 +9287,9 @@ function CheckoutScreen() {
|
|
|
9268
9287
|
},
|
|
9269
9288
|
className: "inline-flex items-center gap-1 rounded-full border border-slate-200 px-2.5 py-0.5 text-xs font-medium text-slate-600 hover:border-primary-300 hover:text-primary-600"
|
|
9270
9289
|
},
|
|
9271
|
-
/* @__PURE__ */
|
|
9290
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Edit3, { className: "h-3.5 w-3.5" }),
|
|
9272
9291
|
" Edit"
|
|
9273
|
-
), /* @__PURE__ */
|
|
9292
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
9274
9293
|
"button",
|
|
9275
9294
|
{
|
|
9276
9295
|
type: "button",
|
|
@@ -9288,23 +9307,23 @@ function CheckoutScreen() {
|
|
|
9288
9307
|
},
|
|
9289
9308
|
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"
|
|
9290
9309
|
},
|
|
9291
|
-
/* @__PURE__ */
|
|
9310
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Trash2, { className: "h-3.5 w-3.5" }),
|
|
9292
9311
|
" Delete"
|
|
9293
9312
|
)))
|
|
9294
|
-
))) : /* @__PURE__ */
|
|
9313
|
+
))) : /* @__PURE__ */ React20__default.default.createElement("div", { className: "text-center py-8 bg-slate-50 rounded-lg" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.MapPin, { className: "h-12 w-12 mx-auto text-slate-400" }), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-2 text-slate-600" }, "No addresses found"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-slate-500" }, "Add a new address to continue"))), !isDelivery && storeAddresses.length > 0 && /* @__PURE__ */ React20__default.default.createElement("div", { className: "md:col-span-2" }, /* @__PURE__ */ React20__default.default.createElement("label", { className: "block mb-2 font-semibold" }, "Select Pickup Location"), /* @__PURE__ */ React20__default.default.createElement(
|
|
9295
9314
|
"select",
|
|
9296
9315
|
{
|
|
9297
9316
|
className: "w-full border rounded p-2",
|
|
9298
9317
|
value: selectedStoreAddressId || "",
|
|
9299
9318
|
onChange: (e) => setSelectedStoreAddressId(e.target.value)
|
|
9300
9319
|
},
|
|
9301
|
-
storeAddresses.map((addr) => /* @__PURE__ */
|
|
9320
|
+
storeAddresses.map((addr) => /* @__PURE__ */ React20__default.default.createElement("option", { key: addr.id, value: addr.id }, addr.name, " - ", addr.street1, ", ", addr.city))
|
|
9302
9321
|
)))),
|
|
9303
|
-
isDelivery && selectedAddressId && /* @__PURE__ */
|
|
9322
|
+
isDelivery && selectedAddressId && /* @__PURE__ */ React20__default.default.createElement(Card, { className: "p-6 border border-gray-200 rounded-xl shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-3 text-xl font-semibold text-gray-900 pb-4 mb-6 border-b" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Truck, { className: "text-accent w-6 h-6" }), /* @__PURE__ */ React20__default.default.createElement("span", null, "Shipping Options")), shippingRatesLoading ? /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-center py-12" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-accent" }), /* @__PURE__ */ React20__default.default.createElement("span", { className: "ml-3 text-gray-600" }, "Loading shipping options...")) : shippingRatesError ? /* @__PURE__ */ React20__default.default.createElement("div", { className: "text-center py-12" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "w-16 h-16 mx-auto mb-4 bg-red-100 rounded-full flex items-center justify-center" }, /* @__PURE__ */ React20__default.default.createElement("svg", { className: "w-8 h-8 text-red-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("p", { className: "text-red-500 text-lg font-medium" }, "Error loading shipping options"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-red-400 text-sm mt-1" }, shippingRatesError)) : shippingRates && shippingRates.length > 0 ? /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-4" }, shippingRates.map((rate) => {
|
|
9304
9323
|
const isSelected = !!selectedShippingRateId && selectedShippingRateId === rate.objectId;
|
|
9305
9324
|
const isTest = rate.test;
|
|
9306
9325
|
const hasAttributes = rate.attributes && rate.attributes.length > 0;
|
|
9307
|
-
return /* @__PURE__ */
|
|
9326
|
+
return /* @__PURE__ */ React20__default.default.createElement(
|
|
9308
9327
|
"div",
|
|
9309
9328
|
{
|
|
9310
9329
|
key: rate.objectId,
|
|
@@ -9313,7 +9332,7 @@ function CheckoutScreen() {
|
|
|
9313
9332
|
onMouseLeave: () => setShippingPrice(parseFloat(rate.amountLocal)),
|
|
9314
9333
|
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"}`
|
|
9315
9334
|
},
|
|
9316
|
-
/* @__PURE__ */
|
|
9335
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-start justify-between" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-start gap-4 flex-1" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex-shrink-0" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9317
9336
|
Image3__default.default,
|
|
9318
9337
|
{
|
|
9319
9338
|
src: rate.providerImage75 || "/placeholder-product.jpg",
|
|
@@ -9326,18 +9345,18 @@ function CheckoutScreen() {
|
|
|
9326
9345
|
width: 48,
|
|
9327
9346
|
height: 48
|
|
9328
9347
|
}
|
|
9329
|
-
)), /* @__PURE__ */
|
|
9348
|
+
)), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-2 mb-2" }, /* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-lg font-semibold text-gray-900" }, rate.provider, " ", rate.servicelevel?.name), isTest && /* @__PURE__ */ React20__default.default.createElement("span", { className: "px-2 py-1 text-xs font-medium bg-orange-100 text-orange-800 rounded-full" }, "TEST")), hasAttributes && /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap gap-2 mb-3" }, rate.attributes.map((attr) => /* @__PURE__ */ React20__default.default.createElement(
|
|
9330
9349
|
"span",
|
|
9331
9350
|
{
|
|
9332
9351
|
key: attr,
|
|
9333
9352
|
className: `px-2 py-1 text-xs font-medium rounded-full ${attr === "FASTEST" ? "bg-green-100 text-green-800" : attr === "BESTVALUE" ? "bg-blue-100 text-blue-800" : attr === "CHEAPEST" ? "bg-purple-100 text-purple-800" : "bg-gray-100 text-gray-800"}`
|
|
9334
9353
|
},
|
|
9335
9354
|
attr
|
|
9336
|
-
))), /* @__PURE__ */
|
|
9337
|
-
isSelected && /* @__PURE__ */
|
|
9355
|
+
))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-1 text-sm text-gray-600" }, rate.durationTerms && /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React20__default.default.createElement("svg", { className: "w-4 h-4 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("span", null, rate.durationTerms)), rate.estimatedDays && /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React20__default.default.createElement("svg", { className: "w-4 h-4 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("span", null, "Estimated ", rate.estimatedDays, " day", rate.estimatedDays !== 1 ? "s" : "")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React20__default.default.createElement("svg", { className: "w-4 h-4 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("span", null, "Carrier: ", rate.provider)), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React20__default.default.createElement("svg", { className: "w-4 h-4 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("span", null, "Currency: ", rate.currency))))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col items-end" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "text-2xl font-bold text-gray-900" }, formatPrice(parseFloat(rate.amount))), rate.amount !== rate.amountLocal && /* @__PURE__ */ React20__default.default.createElement("div", { className: "text-sm text-gray-500" }, rate.amountLocal, " ", rate.currencyLocal))),
|
|
9356
|
+
isSelected && /* @__PURE__ */ React20__default.default.createElement("div", { className: "absolute top-3 right-3" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "w-6 h-6 bg-primary-500 rounded-full flex items-center justify-center" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Check, { className: "w-4 h-4 text-white" })))
|
|
9338
9357
|
);
|
|
9339
|
-
})) : /* @__PURE__ */
|
|
9340
|
-
), /* @__PURE__ */
|
|
9358
|
+
})) : /* @__PURE__ */ React20__default.default.createElement("div", { className: "text-center py-12" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "w-16 h-16 mx-auto mb-4 bg-gray-100 rounded-full flex items-center justify-center" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Truck, { className: "w-8 h-8 text-gray-400" })), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-gray-500 text-lg font-medium" }, "No shipping options available"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-gray-400 text-sm mt-1" }, "Please check the shipping address or try a different location.")))
|
|
9359
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
9341
9360
|
framerMotion.motion.aside,
|
|
9342
9361
|
{
|
|
9343
9362
|
initial: { opacity: 0, y: 32 },
|
|
@@ -9345,22 +9364,22 @@ function CheckoutScreen() {
|
|
|
9345
9364
|
transition: { duration: 0.5, ease: "easeOut", delay: 0.1 },
|
|
9346
9365
|
className: "space-y-10 lg:sticky lg:top-24"
|
|
9347
9366
|
},
|
|
9348
|
-
/* @__PURE__ */
|
|
9367
|
+
/* @__PURE__ */ React20__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__ */ React20__default.default.createElement("h2", { className: "text-2xl font-semibold text-slate-900" }, "Order Summary"), /* @__PURE__ */ React20__default.default.createElement("section", { className: "mt-6 space-y-4" }, /* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-xs font-semibold text-slate-700 uppercase tracking-wider" }, "Delivery Method"), /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid grid-cols-1 gap-3" }, [
|
|
9349
9368
|
{
|
|
9350
9369
|
label: "Delivery",
|
|
9351
|
-
icon: /* @__PURE__ */
|
|
9370
|
+
icon: /* @__PURE__ */ React20__default.default.createElement(lucideReact.Truck, { className: "w-5 h-5" }),
|
|
9352
9371
|
value: true,
|
|
9353
9372
|
desc: "Shipped to your address"
|
|
9354
9373
|
},
|
|
9355
9374
|
{
|
|
9356
9375
|
label: "Pickup",
|
|
9357
|
-
icon: /* @__PURE__ */
|
|
9376
|
+
icon: /* @__PURE__ */ React20__default.default.createElement(lucideReact.MapPin, { className: "w-5 h-5" }),
|
|
9358
9377
|
value: false,
|
|
9359
9378
|
desc: "Collect from pharmacy"
|
|
9360
9379
|
}
|
|
9361
9380
|
].map((option) => {
|
|
9362
9381
|
const active = isDelivery === option.value;
|
|
9363
|
-
return /* @__PURE__ */
|
|
9382
|
+
return /* @__PURE__ */ React20__default.default.createElement(
|
|
9364
9383
|
"button",
|
|
9365
9384
|
{
|
|
9366
9385
|
key: option.label,
|
|
@@ -9369,18 +9388,18 @@ function CheckoutScreen() {
|
|
|
9369
9388
|
"aria-pressed": active,
|
|
9370
9389
|
className: `relative flex w-full items-center justify-between rounded-xl border-2 p-3 transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-400 focus-visible:ring-offset-2 ${active ? "border-primary-500 bg-primary-50 shadow-sm" : "border-slate-200 bg-white hover:border-primary-200 hover:bg-primary-50/40"}`
|
|
9371
9390
|
},
|
|
9372
|
-
/* @__PURE__ */
|
|
9391
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9373
9392
|
"div",
|
|
9374
9393
|
{
|
|
9375
9394
|
className: `p-2 rounded-lg ${active ? "bg-primary-100 text-primary-600" : "bg-slate-100 text-slate-600 group-hover:bg-slate-50"}`
|
|
9376
9395
|
},
|
|
9377
9396
|
option.icon
|
|
9378
|
-
), /* @__PURE__ */
|
|
9379
|
-
active && /* @__PURE__ */
|
|
9397
|
+
), /* @__PURE__ */ React20__default.default.createElement("div", { className: "text-left" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "font-medium text-slate-900" }, option.label), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-xs text-slate-500" }, option.desc))),
|
|
9398
|
+
active && /* @__PURE__ */ React20__default.default.createElement("div", { className: "w-5 h-5 rounded-full bg-primary-500 flex items-center justify-center text-white shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Check, { className: "w-3 h-3" }))
|
|
9380
9399
|
);
|
|
9381
|
-
}))), /* @__PURE__ */
|
|
9400
|
+
}))), /* @__PURE__ */ React20__default.default.createElement("section", { className: "mt-8 space-y-4" }, /* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-xs font-semibold text-slate-700 uppercase tracking-wider" }, "Payment Method"), /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-3" }, PAYMENT_METHODS.map((pm) => {
|
|
9382
9401
|
const active = paymentMethod === pm.value;
|
|
9383
|
-
return /* @__PURE__ */
|
|
9402
|
+
return /* @__PURE__ */ React20__default.default.createElement(
|
|
9384
9403
|
"button",
|
|
9385
9404
|
{
|
|
9386
9405
|
key: pm.value,
|
|
@@ -9388,22 +9407,22 @@ function CheckoutScreen() {
|
|
|
9388
9407
|
onClick: () => setPaymentMethod(pm.value),
|
|
9389
9408
|
className: `w-full flex items-center justify-between rounded-xl border-2 p-3 transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 ${active ? `${pm.activeClass} border-current shadow-sm` : `${pm.className} border-slate-200 hover:border-primary-200 hover:shadow-sm`}`
|
|
9390
9409
|
},
|
|
9391
|
-
/* @__PURE__ */
|
|
9410
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9392
9411
|
"div",
|
|
9393
9412
|
{
|
|
9394
9413
|
className: `p-1.5 rounded-md ${pm.value === "Card" ? "bg-blue-100 text-blue-600" : pm.value === "Cash" ? "bg-amber-100 text-amber-600" : "bg-emerald-100 text-emerald-600"} ${active ? "bg-opacity-30" : "bg-opacity-100"}`
|
|
9395
9414
|
},
|
|
9396
9415
|
pm.icon
|
|
9397
|
-
), /* @__PURE__ */
|
|
9398
|
-
active && /* @__PURE__ */
|
|
9416
|
+
), /* @__PURE__ */ React20__default.default.createElement("span", { className: "text-sm font-medium text-slate-900" }, pm.label)),
|
|
9417
|
+
active && /* @__PURE__ */ React20__default.default.createElement("div", { className: "w-4 h-4 rounded-full bg-primary-500 flex items-center justify-center text-white shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Check, { className: "w-2.5 h-2.5" }))
|
|
9399
9418
|
);
|
|
9400
|
-
})), /* @__PURE__ */
|
|
9419
|
+
})), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-xs text-slate-500 mt-2 pl-1 leading-relaxed" }, paymentMethod === "Card" && "You will be redirected to a secure payment page.", paymentMethod === "Cash" && "Pay with cash at the time of delivery or pickup.", paymentMethod === "Credit" && "Use your available account credit for this order.")), /* @__PURE__ */ React20__default.default.createElement("section", { className: "mt-8 pt-6 border-t border-slate-100" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "max-h-60 space-y-4 overflow-y-auto pr-2 scrollbar-thin scrollbar-thumb-slate-200 hover:scrollbar-thumb-slate-300" }, cart?.cartBody?.items?.map((item) => /* @__PURE__ */ React20__default.default.createElement(
|
|
9401
9420
|
"div",
|
|
9402
9421
|
{
|
|
9403
9422
|
key: item.productId,
|
|
9404
9423
|
className: "flex gap-4 rounded-2xl border border-slate-100 p-4 hover:bg-slate-50/50 transition"
|
|
9405
9424
|
},
|
|
9406
|
-
/* @__PURE__ */
|
|
9425
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex h-16 w-16 items-center justify-center rounded-xl bg-slate-100 text-slate-400" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9407
9426
|
Image3__default.default,
|
|
9408
9427
|
{
|
|
9409
9428
|
src: item.productVariantData.productMedia?.[0]?.file || "/placeholder-product.jpg",
|
|
@@ -9413,9 +9432,9 @@ function CheckoutScreen() {
|
|
|
9413
9432
|
className: "object-contain"
|
|
9414
9433
|
}
|
|
9415
9434
|
)),
|
|
9416
|
-
/* @__PURE__ */
|
|
9417
|
-
/* @__PURE__ */
|
|
9418
|
-
))), /* @__PURE__ */
|
|
9435
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex-1" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm font-semibold text-slate-900" }, item?.productVariantData?.name), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-xs text-slate-500" }, "Qty ", item.quantity)),
|
|
9436
|
+
/* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm font-semibold text-slate-900" }, formatPrice(item.productVariantData.finalPrice * item.quantity))
|
|
9437
|
+
))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-6 space-y-3 text-sm text-slate-600" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React20__default.default.createElement("span", null, "Subtotal"), /* @__PURE__ */ React20__default.default.createElement("span", { className: "font-semibold text-slate-900" }, formatPrice(subtotal))), isDelivery && /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React20__default.default.createElement("span", null, "Shipping"), /* @__PURE__ */ React20__default.default.createElement("span", { className: "font-semibold" }, formatPrice(shippingPrice))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React20__default.default.createElement("span", null, "Estimated tax"), /* @__PURE__ */ React20__default.default.createElement("span", { className: "font-semibold" }, formatPrice(tax))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-2xl bg-slate-50 p-4" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between text-base font-semibold text-slate-900" }, /* @__PURE__ */ React20__default.default.createElement("span", null, "Total Due"), /* @__PURE__ */ React20__default.default.createElement("span", null, formatPrice(total))), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-1 text-xs text-slate-500" }, "Tax is estimated. Final amount confirmed after payment.")))), /* @__PURE__ */ React20__default.default.createElement(
|
|
9419
9438
|
Button,
|
|
9420
9439
|
{
|
|
9421
9440
|
type: "submit",
|
|
@@ -9423,11 +9442,11 @@ function CheckoutScreen() {
|
|
|
9423
9442
|
isLoading: isSubmitting,
|
|
9424
9443
|
className: "mt-6 w-full transition-transform hover:scale-[1.02] active:scale-[0.99]"
|
|
9425
9444
|
},
|
|
9426
|
-
/* @__PURE__ */
|
|
9445
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.CreditCard, { className: "h-5 w-5" }),
|
|
9427
9446
|
isSubmitting ? "Placing order..." : "Place Secure Order"
|
|
9428
|
-
), /* @__PURE__ */
|
|
9429
|
-
/* @__PURE__ */
|
|
9430
|
-
))), /* @__PURE__ */
|
|
9447
|
+
), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-4 flex items-center justify-center gap-2 text-xs text-slate-500" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Lock, { className: "h-4 w-4" }), "Fully encrypted checkout \u2014 cancel anytime before shipment.")),
|
|
9448
|
+
/* @__PURE__ */ React20__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__ */ React20__default.default.createElement("p", { className: "font-semibold uppercase tracking-[0.3em] text-primary-800" }, "Why Patients Choose Us"), /* @__PURE__ */ React20__default.default.createElement("ul", { className: "mt-4 space-y-3 text-primary-700 leading-relaxed" }, /* @__PURE__ */ React20__default.default.createElement("li", { className: "flex items-start gap-3" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.PackageCheck, { className: "mt-0.5 h-4 w-4 shrink-0" }), /* @__PURE__ */ React20__default.default.createElement("span", null, "Pharmacy-grade verification on every order.")), /* @__PURE__ */ React20__default.default.createElement("li", { className: "flex items-start gap-3" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.ShieldCheck, { className: "mt-0.5 h-4 w-4 shrink-0" }), /* @__PURE__ */ React20__default.default.createElement("span", null, "Cold-chain logistics for sensitive medications.")), /* @__PURE__ */ React20__default.default.createElement("li", { className: "flex items-start gap-3" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Truck, { className: "mt-0.5 h-4 w-4 shrink-0" }), /* @__PURE__ */ React20__default.default.createElement("span", null, "Real-time tracking and SMS updates from prep to delivery."))))
|
|
9449
|
+
))), /* @__PURE__ */ React20__default.default.createElement(
|
|
9431
9450
|
AddressFormModal,
|
|
9432
9451
|
{
|
|
9433
9452
|
isOpen: isAddressModalOpen,
|
|
@@ -9461,8 +9480,8 @@ function LoginScreen() {
|
|
|
9461
9480
|
const searchParams = navigation.useSearchParams();
|
|
9462
9481
|
const redirectUrl = searchParams?.get("redirect") || "/";
|
|
9463
9482
|
const { login } = useAuth();
|
|
9464
|
-
const [showPassword, setShowPassword] =
|
|
9465
|
-
const [isSubmitting, setIsSubmitting] =
|
|
9483
|
+
const [showPassword, setShowPassword] = React20.useState(false);
|
|
9484
|
+
const [isSubmitting, setIsSubmitting] = React20.useState(false);
|
|
9466
9485
|
const {
|
|
9467
9486
|
register,
|
|
9468
9487
|
handleSubmit,
|
|
@@ -9482,7 +9501,7 @@ function LoginScreen() {
|
|
|
9482
9501
|
setIsSubmitting(false);
|
|
9483
9502
|
}
|
|
9484
9503
|
};
|
|
9485
|
-
return /* @__PURE__ */
|
|
9504
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid min-h-screen overflow-hidden bg-white lg:grid-cols-[1.1fr_0.9fr]" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9486
9505
|
framerMotion.motion.section,
|
|
9487
9506
|
{
|
|
9488
9507
|
initial: { opacity: 0, x: -24 },
|
|
@@ -9490,18 +9509,18 @@ function LoginScreen() {
|
|
|
9490
9509
|
transition: { duration: 0.4 },
|
|
9491
9510
|
className: "relative flex flex-col justify-between bg-gradient-to-br from-[rgb(var(--header-from))] via-[rgb(var(--header-via))] to-[rgb(var(--header-to))] px-10 py-14 text-white"
|
|
9492
9511
|
},
|
|
9493
|
-
/* @__PURE__ */
|
|
9494
|
-
/* @__PURE__ */
|
|
9495
|
-
/* @__PURE__ */
|
|
9512
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React20__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__ */ React20__default.default.createElement(lucideReact.HeartPulse, { className: "h-4 w-4" }), "Hey Pharmacist"), /* @__PURE__ */ React20__default.default.createElement("h1", { className: "text-4xl font-bold leading-tight lg:text-5xl" }, "Pharmacy-grade care for your household"), /* @__PURE__ */ React20__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.")),
|
|
9513
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "grid gap-4 rounded-3xl bg-white/10 p-6 backdrop-blur" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.ShieldCheck, { className: "h-5 w-5 text-white" }), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-white/80" }, "HIPAA-compliant security keeps your health information protected.")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Sparkles, { className: "h-5 w-5 text-white" }), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-white/80" }, "Pharmacists ready to chat in under 10 minutes for medication support."))),
|
|
9514
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-6 text-sm text-white/80" }, /* @__PURE__ */ React20__default.default.createElement("span", null, "Need an account?"), /* @__PURE__ */ React20__default.default.createElement(
|
|
9496
9515
|
Link8__default.default,
|
|
9497
9516
|
{
|
|
9498
9517
|
href: "/register",
|
|
9499
9518
|
className: "inline-flex items-center gap-2 rounded-full bg-white/15 px-4 py-2 font-semibold transition hover:bg-white/25"
|
|
9500
9519
|
},
|
|
9501
9520
|
"Create one now",
|
|
9502
|
-
/* @__PURE__ */
|
|
9521
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.ArrowRight, { className: "h-4 w-4" })
|
|
9503
9522
|
))
|
|
9504
|
-
), /* @__PURE__ */
|
|
9523
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
9505
9524
|
framerMotion.motion.section,
|
|
9506
9525
|
{
|
|
9507
9526
|
initial: { opacity: 0, x: 24 },
|
|
@@ -9509,7 +9528,7 @@ function LoginScreen() {
|
|
|
9509
9528
|
transition: { duration: 0.4 },
|
|
9510
9529
|
className: "flex items-center justify-center px-6 py-12 lg:px-16"
|
|
9511
9530
|
},
|
|
9512
|
-
/* @__PURE__ */
|
|
9531
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "w-full max-w-md space-y-10" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React20__default.default.createElement("h2", { className: "text-3xl font-bold text-slate-900" }, "Sign in"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-slate-500" }, "Welcome back! Enter your details to continue your personalized care plan.")), /* @__PURE__ */ React20__default.default.createElement("form", { onSubmit: handleSubmit(onSubmit), className: "space-y-6 rounded-3xl border border-slate-100 bg-white p-8 shadow-lg shadow-primary-50" }, /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement(
|
|
9513
9532
|
Input,
|
|
9514
9533
|
{
|
|
9515
9534
|
type: "email",
|
|
@@ -9518,7 +9537,7 @@ function LoginScreen() {
|
|
|
9518
9537
|
...register("email"),
|
|
9519
9538
|
error: errors.email?.message
|
|
9520
9539
|
}
|
|
9521
|
-
)), /* @__PURE__ */
|
|
9540
|
+
)), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9522
9541
|
Input,
|
|
9523
9542
|
{
|
|
9524
9543
|
type: showPassword ? "text" : "password",
|
|
@@ -9527,28 +9546,28 @@ function LoginScreen() {
|
|
|
9527
9546
|
...register("password"),
|
|
9528
9547
|
error: errors.password?.message
|
|
9529
9548
|
}
|
|
9530
|
-
), /* @__PURE__ */
|
|
9549
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
9531
9550
|
"button",
|
|
9532
9551
|
{
|
|
9533
9552
|
type: "button",
|
|
9534
9553
|
onClick: () => setShowPassword((prev) => !prev),
|
|
9535
9554
|
className: "absolute right-3 top-[42px] text-slate-400 transition hover:text-slate-600"
|
|
9536
9555
|
},
|
|
9537
|
-
showPassword ? /* @__PURE__ */
|
|
9538
|
-
)), /* @__PURE__ */
|
|
9556
|
+
showPassword ? /* @__PURE__ */ React20__default.default.createElement(lucideReact.EyeOff, { className: "h-5 w-5" }) : /* @__PURE__ */ React20__default.default.createElement(lucideReact.Eye, { className: "h-5 w-5" })
|
|
9557
|
+
)), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between text-sm" }, /* @__PURE__ */ React20__default.default.createElement("label", { className: "flex items-center gap-2 text-slate-600" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9539
9558
|
"input",
|
|
9540
9559
|
{
|
|
9541
9560
|
type: "checkbox",
|
|
9542
9561
|
className: "h-4 w-4 rounded border-slate-300 text-primary-600 focus:ring-primary-500"
|
|
9543
9562
|
}
|
|
9544
|
-
), "Remember me"), /* @__PURE__ */
|
|
9563
|
+
), "Remember me"), /* @__PURE__ */ React20__default.default.createElement(
|
|
9545
9564
|
Link8__default.default,
|
|
9546
9565
|
{
|
|
9547
9566
|
href: "/forgot-password",
|
|
9548
9567
|
className: "font-medium text-primary-600 transition hover:text-primary-700"
|
|
9549
9568
|
},
|
|
9550
9569
|
"Forgot password?"
|
|
9551
|
-
)), /* @__PURE__ */
|
|
9570
|
+
)), /* @__PURE__ */ React20__default.default.createElement(
|
|
9552
9571
|
Button,
|
|
9553
9572
|
{
|
|
9554
9573
|
type: "submit",
|
|
@@ -9557,7 +9576,7 @@ function LoginScreen() {
|
|
|
9557
9576
|
className: "w-full"
|
|
9558
9577
|
},
|
|
9559
9578
|
"Sign in securely"
|
|
9560
|
-
)), /* @__PURE__ */
|
|
9579
|
+
)), /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-3xl border border-slate-100 bg-slate-50 p-6 text-sm text-slate-600" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-start gap-3" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Lock, { className: "mt-0.5 h-5 w-5 text-primary-500" }), /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("p", { className: "font-semibold text-slate-800" }, "Secure by design"), /* @__PURE__ */ React20__default.default.createElement("p", null, "Encrypted sessions, multi-factor ready, and privacy-first policies keep your personal data safe.")))))
|
|
9561
9580
|
)));
|
|
9562
9581
|
}
|
|
9563
9582
|
var registerSchema = zod.z.object({
|
|
@@ -9579,9 +9598,9 @@ var BENEFITS = [
|
|
|
9579
9598
|
function RegisterScreen() {
|
|
9580
9599
|
const router = navigation.useRouter();
|
|
9581
9600
|
const { register: registerUser } = useAuth();
|
|
9582
|
-
const [showPassword, setShowPassword] =
|
|
9583
|
-
const [showConfirmPassword, setShowConfirmPassword] =
|
|
9584
|
-
const [isSubmitting, setIsSubmitting] =
|
|
9601
|
+
const [showPassword, setShowPassword] = React20.useState(false);
|
|
9602
|
+
const [showConfirmPassword, setShowConfirmPassword] = React20.useState(false);
|
|
9603
|
+
const [isSubmitting, setIsSubmitting] = React20.useState(false);
|
|
9585
9604
|
const {
|
|
9586
9605
|
register,
|
|
9587
9606
|
handleSubmit,
|
|
@@ -9607,7 +9626,7 @@ function RegisterScreen() {
|
|
|
9607
9626
|
setIsSubmitting(false);
|
|
9608
9627
|
}
|
|
9609
9628
|
};
|
|
9610
|
-
return /* @__PURE__ */
|
|
9629
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid min-h-screen overflow-hidden bg-white lg:grid-cols-[0.95fr_1.05fr]" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9611
9630
|
framerMotion.motion.section,
|
|
9612
9631
|
{
|
|
9613
9632
|
initial: { opacity: 0, x: -24 },
|
|
@@ -9615,9 +9634,9 @@ function RegisterScreen() {
|
|
|
9615
9634
|
transition: { duration: 0.4 },
|
|
9616
9635
|
className: "flex flex-col justify-between bg-gradient-to-br from-[rgb(var(--header-from))] via-[rgb(var(--header-via))] to-[rgb(var(--header-to))] px-10 py-14 text-white"
|
|
9617
9636
|
},
|
|
9618
|
-
/* @__PURE__ */
|
|
9619
|
-
/* @__PURE__ */
|
|
9620
|
-
/* @__PURE__ */
|
|
9637
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React20__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__ */ React20__default.default.createElement(lucideReact.HeartPulse, { className: "h-4 w-4" }), "Join Hey Pharmacist"), /* @__PURE__ */ React20__default.default.createElement("h1", { className: "text-4xl font-bold leading-tight lg:text-5xl" }, "Create your wellness account"), /* @__PURE__ */ React20__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.")),
|
|
9638
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-4 rounded-3xl bg-white/10 p-6 backdrop-blur" }, BENEFITS.map((benefit) => /* @__PURE__ */ React20__default.default.createElement("div", { key: benefit, className: "flex items-center gap-3" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.CheckCircle2, { className: "h-5 w-5 text-white" }), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-white/85" }, benefit)))),
|
|
9639
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-6 text-sm text-white/80" }, /* @__PURE__ */ React20__default.default.createElement("span", null, "Already part of the community?"), /* @__PURE__ */ React20__default.default.createElement(
|
|
9621
9640
|
Link8__default.default,
|
|
9622
9641
|
{
|
|
9623
9642
|
href: "/login",
|
|
@@ -9625,7 +9644,7 @@ function RegisterScreen() {
|
|
|
9625
9644
|
},
|
|
9626
9645
|
"Sign in"
|
|
9627
9646
|
))
|
|
9628
|
-
), /* @__PURE__ */
|
|
9647
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
9629
9648
|
framerMotion.motion.section,
|
|
9630
9649
|
{
|
|
9631
9650
|
initial: { opacity: 0, x: 24 },
|
|
@@ -9633,13 +9652,13 @@ function RegisterScreen() {
|
|
|
9633
9652
|
transition: { duration: 0.4 },
|
|
9634
9653
|
className: "flex items-center justify-center px-6 py-12 lg:px-16"
|
|
9635
9654
|
},
|
|
9636
|
-
/* @__PURE__ */
|
|
9655
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "w-full max-w-lg space-y-10" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React20__default.default.createElement("h2", { className: "text-3xl font-bold text-slate-900" }, "Create an account"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-slate-500" }, "Start your personalized care journey with pharmacist-backed guidance.")), /* @__PURE__ */ React20__default.default.createElement(
|
|
9637
9656
|
"form",
|
|
9638
9657
|
{
|
|
9639
9658
|
onSubmit: handleSubmit(onSubmit),
|
|
9640
9659
|
className: "space-y-6 rounded-3xl border border-slate-100 bg-white p-8 shadow-lg shadow-primary-50"
|
|
9641
9660
|
},
|
|
9642
|
-
/* @__PURE__ */
|
|
9661
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "grid gap-4 md:grid-cols-2" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9643
9662
|
Input,
|
|
9644
9663
|
{
|
|
9645
9664
|
label: "First name",
|
|
@@ -9647,7 +9666,7 @@ function RegisterScreen() {
|
|
|
9647
9666
|
...register("firstName"),
|
|
9648
9667
|
error: errors.firstName?.message
|
|
9649
9668
|
}
|
|
9650
|
-
), /* @__PURE__ */
|
|
9669
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
9651
9670
|
Input,
|
|
9652
9671
|
{
|
|
9653
9672
|
label: "Last name",
|
|
@@ -9656,7 +9675,7 @@ function RegisterScreen() {
|
|
|
9656
9675
|
error: errors.lastName?.message
|
|
9657
9676
|
}
|
|
9658
9677
|
)),
|
|
9659
|
-
/* @__PURE__ */
|
|
9678
|
+
/* @__PURE__ */ React20__default.default.createElement(
|
|
9660
9679
|
Input,
|
|
9661
9680
|
{
|
|
9662
9681
|
type: "email",
|
|
@@ -9666,7 +9685,7 @@ function RegisterScreen() {
|
|
|
9666
9685
|
error: errors.email?.message
|
|
9667
9686
|
}
|
|
9668
9687
|
),
|
|
9669
|
-
/* @__PURE__ */
|
|
9688
|
+
/* @__PURE__ */ React20__default.default.createElement(
|
|
9670
9689
|
Input,
|
|
9671
9690
|
{
|
|
9672
9691
|
type: "tel",
|
|
@@ -9676,7 +9695,7 @@ function RegisterScreen() {
|
|
|
9676
9695
|
error: errors.phone?.message
|
|
9677
9696
|
}
|
|
9678
9697
|
),
|
|
9679
|
-
/* @__PURE__ */
|
|
9698
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9680
9699
|
Input,
|
|
9681
9700
|
{
|
|
9682
9701
|
type: showPassword ? "text" : "password",
|
|
@@ -9685,16 +9704,16 @@ function RegisterScreen() {
|
|
|
9685
9704
|
...register("password"),
|
|
9686
9705
|
error: errors.password?.message
|
|
9687
9706
|
}
|
|
9688
|
-
), /* @__PURE__ */
|
|
9707
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
9689
9708
|
"button",
|
|
9690
9709
|
{
|
|
9691
9710
|
type: "button",
|
|
9692
9711
|
onClick: () => setShowPassword((prev) => !prev),
|
|
9693
9712
|
className: "absolute right-3 top-[42px] text-slate-400 transition hover:text-slate-600"
|
|
9694
9713
|
},
|
|
9695
|
-
showPassword ? /* @__PURE__ */
|
|
9714
|
+
showPassword ? /* @__PURE__ */ React20__default.default.createElement(lucideReact.EyeOff, { className: "h-5 w-5" }) : /* @__PURE__ */ React20__default.default.createElement(lucideReact.Eye, { className: "h-5 w-5" })
|
|
9696
9715
|
)),
|
|
9697
|
-
/* @__PURE__ */
|
|
9716
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9698
9717
|
Input,
|
|
9699
9718
|
{
|
|
9700
9719
|
type: showConfirmPassword ? "text" : "password",
|
|
@@ -9703,16 +9722,16 @@ function RegisterScreen() {
|
|
|
9703
9722
|
...register("confirmPassword"),
|
|
9704
9723
|
error: errors.confirmPassword?.message
|
|
9705
9724
|
}
|
|
9706
|
-
), /* @__PURE__ */
|
|
9725
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
9707
9726
|
"button",
|
|
9708
9727
|
{
|
|
9709
9728
|
type: "button",
|
|
9710
9729
|
onClick: () => setShowConfirmPassword((prev) => !prev),
|
|
9711
9730
|
className: "absolute right-3 top-[42px] text-slate-400 transition hover:text-slate-600"
|
|
9712
9731
|
},
|
|
9713
|
-
showConfirmPassword ? /* @__PURE__ */
|
|
9732
|
+
showConfirmPassword ? /* @__PURE__ */ React20__default.default.createElement(lucideReact.EyeOff, { className: "h-5 w-5" }) : /* @__PURE__ */ React20__default.default.createElement(lucideReact.Eye, { className: "h-5 w-5" })
|
|
9714
9733
|
)),
|
|
9715
|
-
/* @__PURE__ */
|
|
9734
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-start gap-3 rounded-2xl bg-slate-50 p-4 text-sm text-slate-600" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Shield, { className: "mt-0.5 h-5 w-5 text-primary-500" }), /* @__PURE__ */ React20__default.default.createElement("span", null, "By creating an account, you agree to our", " ", /* @__PURE__ */ React20__default.default.createElement(Link8__default.default, { href: "/terms", className: "font-semibold text-primary-600 hover:text-primary-700" }, "Terms of Service"), " ", "and", " ", /* @__PURE__ */ React20__default.default.createElement(
|
|
9716
9735
|
Link8__default.default,
|
|
9717
9736
|
{
|
|
9718
9737
|
href: "/privacy",
|
|
@@ -9720,7 +9739,7 @@ function RegisterScreen() {
|
|
|
9720
9739
|
},
|
|
9721
9740
|
"Privacy Policy"
|
|
9722
9741
|
), ". We protect your information with bank-level encryption.")),
|
|
9723
|
-
/* @__PURE__ */
|
|
9742
|
+
/* @__PURE__ */ React20__default.default.createElement(
|
|
9724
9743
|
Button,
|
|
9725
9744
|
{
|
|
9726
9745
|
type: "submit",
|
|
@@ -9728,10 +9747,10 @@ function RegisterScreen() {
|
|
|
9728
9747
|
isLoading: isSubmitting,
|
|
9729
9748
|
className: "w-full"
|
|
9730
9749
|
},
|
|
9731
|
-
/* @__PURE__ */
|
|
9750
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.UserPlus, { className: "h-5 w-5" }),
|
|
9732
9751
|
"Create my account"
|
|
9733
9752
|
)
|
|
9734
|
-
), /* @__PURE__ */
|
|
9753
|
+
), /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-3xl border border-slate-100 bg-slate-50 p-6 text-sm text-slate-600" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-start gap-3" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Heart, { className: "mt-0.5 h-5 w-5 text-primary-500" }), /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("p", { className: "font-semibold text-slate-800" }, "Members love us"), /* @__PURE__ */ React20__default.default.createElement("p", null, "92% of patients report improved adherence after receiving pharmacist touchpoints through their Hey Pharmacist account.")))))
|
|
9735
9754
|
)));
|
|
9736
9755
|
}
|
|
9737
9756
|
var profileSchema = zod.z.object({
|
|
@@ -9743,7 +9762,7 @@ var profileSchema = zod.z.object({
|
|
|
9743
9762
|
function ProfileScreen() {
|
|
9744
9763
|
const router = navigation.useRouter();
|
|
9745
9764
|
const { user, updateUser, logout } = useAuth();
|
|
9746
|
-
const [isSubmitting, setIsSubmitting] =
|
|
9765
|
+
const [isSubmitting, setIsSubmitting] = React20.useState(false);
|
|
9747
9766
|
const {
|
|
9748
9767
|
register,
|
|
9749
9768
|
handleSubmit,
|
|
@@ -9797,15 +9816,15 @@ function ProfileScreen() {
|
|
|
9797
9816
|
href: "/account/addresses"
|
|
9798
9817
|
}
|
|
9799
9818
|
];
|
|
9800
|
-
return /* @__PURE__ */
|
|
9819
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_top_left,_rgba(255,255,255,0.35),_transparent_60%)]" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative container mx-auto px-4 py-16" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9801
9820
|
framerMotion.motion.div,
|
|
9802
9821
|
{
|
|
9803
9822
|
initial: { opacity: 0, y: 24 },
|
|
9804
9823
|
animate: { opacity: 1, y: 0 },
|
|
9805
9824
|
className: "flex flex-col gap-8 md:flex-row md:items-center md:justify-between"
|
|
9806
9825
|
},
|
|
9807
|
-
/* @__PURE__ */
|
|
9808
|
-
/* @__PURE__ */
|
|
9826
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-5" }, /* @__PURE__ */ React20__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__ */ React20__default.default.createElement(lucideReact.HeartPulse, { className: "h-4 w-4" }), "My account"), /* @__PURE__ */ React20__default.default.createElement("h1", { className: "text-4xl font-bold md:text-5xl" }, "Hello, ", user.firstname, " ", user.lastname), /* @__PURE__ */ React20__default.default.createElement("p", { className: "max-w-2xl text-white/80 md:text-lg" }, "Manage profile details, shipping preferences, and personalized recommendations. Our pharmacists keep your care plan up to date."), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap items-center gap-4 text-sm text-white/80" }, /* @__PURE__ */ React20__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full bg-white/15 px-4 py-2" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.ShieldCheck, { className: "h-4 w-4" }), "Account secured with multi-factor ready login"))),
|
|
9827
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col items-center gap-4 rounded-3xl bg-white/15 p-6 text-center backdrop-blur" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex h-24 w-24 items-center justify-center rounded-full bg-white/20 text-3xl font-bold text-white" }, getInitials(user?.firstname || "", user?.lastname || "") || ""), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-white/80" }, user.email), /* @__PURE__ */ React20__default.default.createElement(
|
|
9809
9828
|
Button,
|
|
9810
9829
|
{
|
|
9811
9830
|
variant: "ghost",
|
|
@@ -9814,14 +9833,14 @@ function ProfileScreen() {
|
|
|
9814
9833
|
},
|
|
9815
9834
|
"Change password"
|
|
9816
9835
|
))
|
|
9817
|
-
))), /* @__PURE__ */
|
|
9836
|
+
))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative -mt-16 pb-20" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid gap-10 lg:grid-cols-[minmax(0,1.1fr)_minmax(0,0.9fr)]" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9818
9837
|
framerMotion.motion.div,
|
|
9819
9838
|
{
|
|
9820
9839
|
initial: { opacity: 0, y: 24 },
|
|
9821
9840
|
animate: { opacity: 1, y: 0 },
|
|
9822
9841
|
className: "space-y-6"
|
|
9823
9842
|
},
|
|
9824
|
-
/* @__PURE__ */
|
|
9843
|
+
/* @__PURE__ */ React20__default.default.createElement("section", { className: "rounded-3xl border border-slate-100 bg-white p-8 shadow-lg shadow-primary-50" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React20__default.default.createElement("h2", { className: "text-xl font-semibold text-slate-900" }, "Personal information"), /* @__PURE__ */ React20__default.default.createElement(lucideReact.Sparkles, { className: "h-5 w-5 text-primary-500" })), /* @__PURE__ */ React20__default.default.createElement("form", { onSubmit: handleSubmit(onSubmit), className: "mt-6 space-y-6" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid gap-4 md:grid-cols-2" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9825
9844
|
Input,
|
|
9826
9845
|
{
|
|
9827
9846
|
label: "First name",
|
|
@@ -9829,7 +9848,7 @@ function ProfileScreen() {
|
|
|
9829
9848
|
...register("firstName"),
|
|
9830
9849
|
error: errors.firstName?.message
|
|
9831
9850
|
}
|
|
9832
|
-
), /* @__PURE__ */
|
|
9851
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
9833
9852
|
Input,
|
|
9834
9853
|
{
|
|
9835
9854
|
label: "Last name",
|
|
@@ -9837,7 +9856,7 @@ function ProfileScreen() {
|
|
|
9837
9856
|
...register("lastName"),
|
|
9838
9857
|
error: errors.lastName?.message
|
|
9839
9858
|
}
|
|
9840
|
-
)), /* @__PURE__ */
|
|
9859
|
+
)), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9841
9860
|
Input,
|
|
9842
9861
|
{
|
|
9843
9862
|
type: "email",
|
|
@@ -9847,7 +9866,7 @@ function ProfileScreen() {
|
|
|
9847
9866
|
...register("email"),
|
|
9848
9867
|
error: errors.email?.message
|
|
9849
9868
|
}
|
|
9850
|
-
), /* @__PURE__ */
|
|
9869
|
+
), /* @__PURE__ */ React20__default.default.createElement(lucideReact.Mail, { className: "absolute left-3 top-[38px] h-4 w-4 text-slate-400" })), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9851
9870
|
Input,
|
|
9852
9871
|
{
|
|
9853
9872
|
type: "tel",
|
|
@@ -9857,7 +9876,7 @@ function ProfileScreen() {
|
|
|
9857
9876
|
...register("phone"),
|
|
9858
9877
|
error: errors.phone?.message
|
|
9859
9878
|
}
|
|
9860
|
-
), /* @__PURE__ */
|
|
9879
|
+
), /* @__PURE__ */ React20__default.default.createElement(lucideReact.Phone, { className: "absolute left-3 top-[38px] h-4 w-4 text-slate-400" })), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap gap-4" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
9861
9880
|
Button,
|
|
9862
9881
|
{
|
|
9863
9882
|
type: "submit",
|
|
@@ -9865,7 +9884,7 @@ function ProfileScreen() {
|
|
|
9865
9884
|
isLoading: isSubmitting
|
|
9866
9885
|
},
|
|
9867
9886
|
"Save changes"
|
|
9868
|
-
), /* @__PURE__ */
|
|
9887
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
9869
9888
|
Button,
|
|
9870
9889
|
{
|
|
9871
9890
|
type: "button",
|
|
@@ -9875,16 +9894,16 @@ function ProfileScreen() {
|
|
|
9875
9894
|
},
|
|
9876
9895
|
"View recent orders"
|
|
9877
9896
|
)))),
|
|
9878
|
-
/* @__PURE__ */
|
|
9897
|
+
/* @__PURE__ */ React20__default.default.createElement("section", { className: "grid gap-4 md:grid-cols-2" }, quickLinks.map((item) => /* @__PURE__ */ React20__default.default.createElement(
|
|
9879
9898
|
Link8__default.default,
|
|
9880
9899
|
{
|
|
9881
9900
|
key: item.href,
|
|
9882
9901
|
href: item.href,
|
|
9883
9902
|
className: "group rounded-3xl border border-slate-100 bg-white p-6 shadow-sm transition hover:-translate-y-1 hover:shadow-lg"
|
|
9884
9903
|
},
|
|
9885
|
-
/* @__PURE__ */
|
|
9904
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React20__default.default.createElement("span", { className: "rounded-2xl bg-primary-50 p-3 text-primary-600" }, /* @__PURE__ */ React20__default.default.createElement(item.icon, { className: "h-5 w-5" })), /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-base font-semibold text-slate-900 group-hover:text-primary-600" }, item.label), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-slate-500" }, item.description)))
|
|
9886
9905
|
)))
|
|
9887
|
-
), /* @__PURE__ */
|
|
9906
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
9888
9907
|
framerMotion.motion.aside,
|
|
9889
9908
|
{
|
|
9890
9909
|
initial: { opacity: 0, y: 24 },
|
|
@@ -9892,7 +9911,7 @@ function ProfileScreen() {
|
|
|
9892
9911
|
transition: { delay: 0.1 },
|
|
9893
9912
|
className: "space-y-6"
|
|
9894
9913
|
},
|
|
9895
|
-
/* @__PURE__ */
|
|
9914
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-3xl border border-slate-100 bg-white p-6 shadow-lg shadow-primary-50" }, /* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-lg font-semibold text-slate-900" }, "Care preferences"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-3 text-sm text-slate-600" }, "Customize how we support you. Set refill reminders or manage communication preferences to stay aligned with your wellness goals."), /* @__PURE__ */ React20__default.default.createElement(
|
|
9896
9915
|
Button,
|
|
9897
9916
|
{
|
|
9898
9917
|
variant: "outline",
|
|
@@ -9901,21 +9920,21 @@ function ProfileScreen() {
|
|
|
9901
9920
|
},
|
|
9902
9921
|
"Manage preferences"
|
|
9903
9922
|
)),
|
|
9904
|
-
/* @__PURE__ */
|
|
9905
|
-
/* @__PURE__ */
|
|
9923
|
+
/* @__PURE__ */ React20__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__ */ React20__default.default.createElement("p", { className: "font-semibold uppercase tracking-[0.3em]" }, "Pharmacist tip"), /* @__PURE__ */ React20__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.")),
|
|
9924
|
+
/* @__PURE__ */ React20__default.default.createElement(
|
|
9906
9925
|
"button",
|
|
9907
9926
|
{
|
|
9908
9927
|
onClick: handleLogout,
|
|
9909
9928
|
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"
|
|
9910
9929
|
},
|
|
9911
|
-
/* @__PURE__ */
|
|
9930
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.LogOut, { className: "h-4 w-4" }),
|
|
9912
9931
|
"Log out"
|
|
9913
9932
|
)
|
|
9914
9933
|
)))));
|
|
9915
9934
|
}
|
|
9916
9935
|
function OrderCard({ order }) {
|
|
9917
9936
|
const config = order.orderStatus;
|
|
9918
|
-
return /* @__PURE__ */
|
|
9937
|
+
return /* @__PURE__ */ React20__default.default.createElement(
|
|
9919
9938
|
framerMotion.motion.div,
|
|
9920
9939
|
{
|
|
9921
9940
|
initial: { opacity: 0, y: 20 },
|
|
@@ -9923,9 +9942,9 @@ function OrderCard({ order }) {
|
|
|
9923
9942
|
whileHover: { y: -4 },
|
|
9924
9943
|
className: "bg-white rounded-2xl p-6 shadow-sm hover:shadow-xl transition-all duration-300 border border-gray-100"
|
|
9925
9944
|
},
|
|
9926
|
-
/* @__PURE__ */
|
|
9927
|
-
/* @__PURE__ */
|
|
9928
|
-
/* @__PURE__ */
|
|
9945
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex justify-between items-start mb-4" }, /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-lg font-bold text-gray-900 flex items-center gap-2" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Package, { className: "w-5 h-5 text-primary-600" }), "Order #", order?._id?.slice(0, 6) || ""), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-gray-500 mt-1 flex items-center gap-2" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Calendar, { className: "w-4 h-4" }), formatDate(order.createdAt || /* @__PURE__ */ new Date(), "long"))), /* @__PURE__ */ React20__default.default.createElement(Badge, { variant: config }, config)),
|
|
9946
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-2 mb-4" }, order.items?.slice(0, 2).map((item) => /* @__PURE__ */ React20__default.default.createElement("div", { key: item.productVariantId, className: "flex items-center gap-3 text-sm" }, /* @__PURE__ */ React20__default.default.createElement(Image3__default.default, { src: item?.productVariantData?.productMedia?.[0]?.file || "/placeholder-product.jpg", alt: item?.productVariantData?.name || "Product image", width: 48, height: 48, className: "w-12 h-12 rounded-lg bg-gray-100 flex-shrink-0" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "font-medium text-gray-900 truncate" }, item.productVariantData.name), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-gray-500" }, "Qty: ", item.quantity)), /* @__PURE__ */ React20__default.default.createElement("p", { className: "font-semibold text-gray-900" }, formatPrice(item.productVariantData.finalPrice)))), order.items?.length && order.items?.length > 2 && /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-gray-500 pl-15" }, "+", order.items.length - 2, " more item", order.items.length - 2 > 1 ? "s" : "")),
|
|
9947
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex justify-between items-center pt-4 border-t border-gray-200" }, /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-gray-500" }, "Total Amount"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-2xl font-bold text-gray-900" }, formatPrice(order.grandTotal || 0))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex gap-2" }, order.payment.paymentStatus !== "Paid" /* Paid */ && order.payment.paymentMethod === "Card" /* Card */ && /* @__PURE__ */ React20__default.default.createElement(
|
|
9929
9948
|
"a",
|
|
9930
9949
|
{
|
|
9931
9950
|
href: order?.payment?.paymentIntent?.hostedInvoiceUrl || "",
|
|
@@ -9933,16 +9952,16 @@ function OrderCard({ order }) {
|
|
|
9933
9952
|
rel: "noopener noreferrer",
|
|
9934
9953
|
className: "inline-flex items-center gap-2 px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors"
|
|
9935
9954
|
},
|
|
9936
|
-
/* @__PURE__ */
|
|
9955
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.CreditCard, { className: "w-4 h-4" }),
|
|
9937
9956
|
"Pay Now"
|
|
9938
9957
|
)))
|
|
9939
9958
|
);
|
|
9940
9959
|
}
|
|
9941
9960
|
function useOrders(page = 1, limit = 10, orderStatus, paymentStatus) {
|
|
9942
|
-
const [orders, setOrders] =
|
|
9943
|
-
const [isLoading, setIsLoading] =
|
|
9944
|
-
const [error, setError] =
|
|
9945
|
-
const [pagination, setPagination] =
|
|
9961
|
+
const [orders, setOrders] = React20.useState([]);
|
|
9962
|
+
const [isLoading, setIsLoading] = React20.useState(true);
|
|
9963
|
+
const [error, setError] = React20.useState(null);
|
|
9964
|
+
const [pagination, setPagination] = React20.useState({
|
|
9946
9965
|
page: 1,
|
|
9947
9966
|
limit: 10,
|
|
9948
9967
|
total: 0,
|
|
@@ -9950,7 +9969,7 @@ function useOrders(page = 1, limit = 10, orderStatus, paymentStatus) {
|
|
|
9950
9969
|
});
|
|
9951
9970
|
const { user } = useAuth();
|
|
9952
9971
|
const resolvedUserId = user?._id || user?.id;
|
|
9953
|
-
const fetchOrders =
|
|
9972
|
+
const fetchOrders = React20.useCallback(async () => {
|
|
9954
9973
|
setIsLoading(true);
|
|
9955
9974
|
setError(null);
|
|
9956
9975
|
try {
|
|
@@ -9977,7 +9996,7 @@ function useOrders(page = 1, limit = 10, orderStatus, paymentStatus) {
|
|
|
9977
9996
|
setIsLoading(false);
|
|
9978
9997
|
}
|
|
9979
9998
|
}, [page, limit, resolvedUserId, orderStatus, paymentStatus]);
|
|
9980
|
-
|
|
9999
|
+
React20.useEffect(() => {
|
|
9981
10000
|
fetchOrders();
|
|
9982
10001
|
}, [fetchOrders]);
|
|
9983
10002
|
return {
|
|
@@ -9989,10 +10008,10 @@ function useOrders(page = 1, limit = 10, orderStatus, paymentStatus) {
|
|
|
9989
10008
|
};
|
|
9990
10009
|
}
|
|
9991
10010
|
function useOrder(id) {
|
|
9992
|
-
const [order, setOrder] =
|
|
9993
|
-
const [isLoading, setIsLoading] =
|
|
9994
|
-
const [error, setError] =
|
|
9995
|
-
const fetchOrder =
|
|
10011
|
+
const [order, setOrder] = React20.useState(null);
|
|
10012
|
+
const [isLoading, setIsLoading] = React20.useState(true);
|
|
10013
|
+
const [error, setError] = React20.useState(null);
|
|
10014
|
+
const fetchOrder = React20.useCallback(async () => {
|
|
9996
10015
|
setIsLoading(true);
|
|
9997
10016
|
setError(null);
|
|
9998
10017
|
try {
|
|
@@ -10004,7 +10023,7 @@ function useOrder(id) {
|
|
|
10004
10023
|
setIsLoading(false);
|
|
10005
10024
|
}
|
|
10006
10025
|
}, [id]);
|
|
10007
|
-
|
|
10026
|
+
React20.useEffect(() => {
|
|
10008
10027
|
if (id) {
|
|
10009
10028
|
fetchOrder();
|
|
10010
10029
|
}
|
|
@@ -10012,10 +10031,10 @@ function useOrder(id) {
|
|
|
10012
10031
|
return { order, isLoading, error, refetch: fetchOrder };
|
|
10013
10032
|
}
|
|
10014
10033
|
function useCurrentOrders() {
|
|
10015
|
-
const [orders, setOrders] =
|
|
10016
|
-
const [isLoading, setIsLoading] =
|
|
10017
|
-
const [error, setError] =
|
|
10018
|
-
const fetchCurrentOrders =
|
|
10034
|
+
const [orders, setOrders] = React20.useState([]);
|
|
10035
|
+
const [isLoading, setIsLoading] = React20.useState(true);
|
|
10036
|
+
const [error, setError] = React20.useState(null);
|
|
10037
|
+
const fetchCurrentOrders = React20.useCallback(async () => {
|
|
10019
10038
|
setIsLoading(true);
|
|
10020
10039
|
setError(null);
|
|
10021
10040
|
try {
|
|
@@ -10027,7 +10046,7 @@ function useCurrentOrders() {
|
|
|
10027
10046
|
setIsLoading(false);
|
|
10028
10047
|
}
|
|
10029
10048
|
}, []);
|
|
10030
|
-
|
|
10049
|
+
React20.useEffect(() => {
|
|
10031
10050
|
fetchCurrentOrders();
|
|
10032
10051
|
}, [fetchCurrentOrders]);
|
|
10033
10052
|
return { orders, isLoading, error, refetch: fetchCurrentOrders };
|
|
@@ -10041,11 +10060,11 @@ function FilterChips({
|
|
|
10041
10060
|
maxVisible = 4,
|
|
10042
10061
|
variant = "primary"
|
|
10043
10062
|
}) {
|
|
10044
|
-
const [isOverflowOpen, setIsOverflowOpen] =
|
|
10045
|
-
const [filterSearchTerm, setFilterSearchTerm] =
|
|
10046
|
-
const overflowMenuRef =
|
|
10063
|
+
const [isOverflowOpen, setIsOverflowOpen] = React20.useState(false);
|
|
10064
|
+
const [filterSearchTerm, setFilterSearchTerm] = React20.useState("");
|
|
10065
|
+
const overflowMenuRef = React20.useRef(null);
|
|
10047
10066
|
const color = variant === "primary" ? "primary" : "secondary";
|
|
10048
|
-
const { visibleFilters, overflowFilters } =
|
|
10067
|
+
const { visibleFilters, overflowFilters } = React20.useMemo(() => {
|
|
10049
10068
|
const basePrimary = filters.slice(0, maxVisible);
|
|
10050
10069
|
if (basePrimary.includes(selected)) {
|
|
10051
10070
|
return {
|
|
@@ -10065,18 +10084,18 @@ function FilterChips({
|
|
|
10065
10084
|
overflowFilters: filters.filter((filter) => !uniquePrimary.includes(filter))
|
|
10066
10085
|
};
|
|
10067
10086
|
}, [filters, maxVisible, selected]);
|
|
10068
|
-
const filteredOverflowFilters =
|
|
10087
|
+
const filteredOverflowFilters = React20.useMemo(() => {
|
|
10069
10088
|
if (!filterSearchTerm.trim()) return overflowFilters;
|
|
10070
10089
|
return overflowFilters.filter(
|
|
10071
10090
|
(filter) => filter.toLowerCase().includes(filterSearchTerm.toLowerCase())
|
|
10072
10091
|
);
|
|
10073
10092
|
}, [filterSearchTerm, overflowFilters]);
|
|
10074
|
-
|
|
10093
|
+
React20.useEffect(() => {
|
|
10075
10094
|
if (!isOverflowOpen) {
|
|
10076
10095
|
setFilterSearchTerm("");
|
|
10077
10096
|
}
|
|
10078
10097
|
}, [isOverflowOpen]);
|
|
10079
|
-
|
|
10098
|
+
React20.useEffect(() => {
|
|
10080
10099
|
function handleClickOutside(event) {
|
|
10081
10100
|
if (overflowMenuRef.current && !overflowMenuRef.current.contains(event.target)) {
|
|
10082
10101
|
setIsOverflowOpen(false);
|
|
@@ -10089,7 +10108,7 @@ function FilterChips({
|
|
|
10089
10108
|
document.removeEventListener("mousedown", handleClickOutside);
|
|
10090
10109
|
};
|
|
10091
10110
|
}, [isOverflowOpen]);
|
|
10092
|
-
return /* @__PURE__ */
|
|
10111
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col gap-3 md:flex-row md:items-center md:gap-4" }, /* @__PURE__ */ React20__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full border border-slate-200 bg-slate-50 px-3 py-1 text-xs font-semibold uppercase tracking-wide text-slate-600" }, /* @__PURE__ */ React20__default.default.createElement(Icon, { className: "h-4 w-4" }), label), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col gap-2 md:flex-row md:items-center md:gap-3" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap gap-2" }, visibleFilters.map((filter) => /* @__PURE__ */ React20__default.default.createElement(
|
|
10093
10112
|
"button",
|
|
10094
10113
|
{
|
|
10095
10114
|
key: filter,
|
|
@@ -10098,16 +10117,16 @@ function FilterChips({
|
|
|
10098
10117
|
className: `rounded-full border px-3 py-1 text-sm font-medium transition ${selected === filter ? `border-${color}-600 bg-${color}-600 text-white shadow-lg shadow-${color}-500/30` : `border-slate-200 bg-slate-50 text-slate-600 hover:border-${color}-300 hover:text-${color}-600`}`
|
|
10099
10118
|
},
|
|
10100
10119
|
filter
|
|
10101
|
-
))), overflowFilters.length > 0 && /* @__PURE__ */
|
|
10120
|
+
))), overflowFilters.length > 0 && /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative", ref: overflowMenuRef }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10102
10121
|
"button",
|
|
10103
10122
|
{
|
|
10104
10123
|
type: "button",
|
|
10105
10124
|
onClick: () => setIsOverflowOpen((prev) => !prev),
|
|
10106
10125
|
className: `flex items-center gap-2 rounded-full border px-3 py-1 text-sm font-medium transition ${overflowFilters.includes(selected) ? `border-${color}-600 bg-${color}-50 text-${color}-700 shadow-lg shadow-${color}-500/20` : "border-slate-200 bg-white text-slate-600 hover:border-slate-300"}`
|
|
10107
10126
|
},
|
|
10108
|
-
/* @__PURE__ */
|
|
10109
|
-
/* @__PURE__ */
|
|
10110
|
-
), /* @__PURE__ */
|
|
10127
|
+
/* @__PURE__ */ React20__default.default.createElement("span", null, overflowFilters.includes(selected) ? selected : "More"),
|
|
10128
|
+
/* @__PURE__ */ React20__default.default.createElement("span", { className: `inline-flex h-5 min-w-[1.5rem] items-center justify-center rounded-full bg-${color}-100 px-1 text-xs font-semibold text-${color}-600` }, overflowFilters.length)
|
|
10129
|
+
), /* @__PURE__ */ React20__default.default.createElement(framerMotion.AnimatePresence, null, isOverflowOpen && /* @__PURE__ */ React20__default.default.createElement(
|
|
10111
10130
|
framerMotion.motion.div,
|
|
10112
10131
|
{
|
|
10113
10132
|
initial: { opacity: 0, y: 8 },
|
|
@@ -10116,7 +10135,7 @@ function FilterChips({
|
|
|
10116
10135
|
transition: { duration: 0.15 },
|
|
10117
10136
|
className: "absolute right-0 z-50 mt-2 w-64 rounded-2xl border border-slate-100 bg-white shadow-xl shadow-primary-50"
|
|
10118
10137
|
},
|
|
10119
|
-
/* @__PURE__ */
|
|
10138
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "border-b border-slate-100 px-4 py-3" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Search, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-slate-400" }), /* @__PURE__ */ React20__default.default.createElement(
|
|
10120
10139
|
"input",
|
|
10121
10140
|
{
|
|
10122
10141
|
type: "text",
|
|
@@ -10126,7 +10145,7 @@ function FilterChips({
|
|
|
10126
10145
|
className: "w-full rounded-full border border-slate-200 bg-slate-50 py-2 pl-9 pr-3 text-sm text-slate-600 outline-none transition focus:border-primary-300 focus:bg-white focus:ring-2 focus:ring-primary-200"
|
|
10127
10146
|
}
|
|
10128
10147
|
))),
|
|
10129
|
-
/* @__PURE__ */
|
|
10148
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "max-h-60 overflow-y-auto px-2 py-2" }, filteredOverflowFilters.length > 0 ? filteredOverflowFilters.map((filter) => /* @__PURE__ */ React20__default.default.createElement(
|
|
10130
10149
|
"button",
|
|
10131
10150
|
{
|
|
10132
10151
|
key: filter,
|
|
@@ -10137,10 +10156,10 @@ function FilterChips({
|
|
|
10137
10156
|
},
|
|
10138
10157
|
className: `flex w-full items-center justify-between rounded-xl px-3 py-2 text-sm font-medium transition ${selected === filter ? `bg-${color}-600 text-white shadow-lg shadow-${color}-500/30` : "text-slate-600 hover:bg-slate-100"}`
|
|
10139
10158
|
},
|
|
10140
|
-
/* @__PURE__ */
|
|
10141
|
-
selected === filter && /* @__PURE__ */
|
|
10142
|
-
)) : /* @__PURE__ */
|
|
10143
|
-
/* @__PURE__ */
|
|
10159
|
+
/* @__PURE__ */ React20__default.default.createElement("span", null, filter),
|
|
10160
|
+
selected === filter && /* @__PURE__ */ React20__default.default.createElement(lucideReact.Check, { className: "h-4 w-4" })
|
|
10161
|
+
)) : /* @__PURE__ */ React20__default.default.createElement("p", { className: "px-3 py-4 text-sm text-slate-500" }, "No items found.")),
|
|
10162
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between gap-2 border-t border-slate-100 px-4 py-3" }, /* @__PURE__ */ React20__default.default.createElement("span", { className: "text-xs font-semibold uppercase tracking-wide text-slate-400" }, "Quick actions"), /* @__PURE__ */ React20__default.default.createElement(
|
|
10144
10163
|
"button",
|
|
10145
10164
|
{
|
|
10146
10165
|
type: "button",
|
|
@@ -10158,19 +10177,19 @@ var STATUS_FILTERS = ["All", ...Object.values(ManualOrderDTOOrderStatusEnum)];
|
|
|
10158
10177
|
var PAYMENT_FILTERS = ["All", ...Object.values(PaymentPaymentStatusEnum)];
|
|
10159
10178
|
function OrdersScreen() {
|
|
10160
10179
|
const router = navigation.useRouter();
|
|
10161
|
-
const [page, setPage] =
|
|
10162
|
-
const [selectedFilter, setSelectedFilter] =
|
|
10163
|
-
const [selectedPaymentFilter, setSelectedPaymentFilter] =
|
|
10180
|
+
const [page, setPage] = React20.useState(1);
|
|
10181
|
+
const [selectedFilter, setSelectedFilter] = React20.useState("All");
|
|
10182
|
+
const [selectedPaymentFilter, setSelectedPaymentFilter] = React20.useState("All");
|
|
10164
10183
|
const { orders, isLoading, pagination } = useOrders(
|
|
10165
10184
|
page,
|
|
10166
10185
|
10,
|
|
10167
10186
|
selectedFilter,
|
|
10168
10187
|
selectedPaymentFilter
|
|
10169
10188
|
);
|
|
10170
|
-
const [isOverflowOpen, setIsOverflowOpen] =
|
|
10171
|
-
const [filterSearchTerm, setFilterSearchTerm] =
|
|
10172
|
-
const overflowMenuRef =
|
|
10173
|
-
const filteredOrders =
|
|
10189
|
+
const [isOverflowOpen, setIsOverflowOpen] = React20.useState(false);
|
|
10190
|
+
const [filterSearchTerm, setFilterSearchTerm] = React20.useState("");
|
|
10191
|
+
const overflowMenuRef = React20.useRef(null);
|
|
10192
|
+
const filteredOrders = React20.useMemo(() => {
|
|
10174
10193
|
return orders.filter((order) => {
|
|
10175
10194
|
const matchesStatus = selectedFilter === "All" || order?.orderStatus?.toLowerCase() === selectedFilter.toLowerCase();
|
|
10176
10195
|
const matchesPayment = selectedPaymentFilter === "All" || order?.payment?.paymentStatus?.toLowerCase() === selectedPaymentFilter.toLowerCase();
|
|
@@ -10179,12 +10198,12 @@ function OrdersScreen() {
|
|
|
10179
10198
|
}, [orders, selectedFilter, selectedPaymentFilter]);
|
|
10180
10199
|
const hasOrders = filteredOrders.length > 0;
|
|
10181
10200
|
const MAX_VISIBLE_FILTERS = 4;
|
|
10182
|
-
|
|
10201
|
+
React20.useEffect(() => {
|
|
10183
10202
|
if (!isOverflowOpen) {
|
|
10184
10203
|
setFilterSearchTerm("");
|
|
10185
10204
|
}
|
|
10186
10205
|
}, [isOverflowOpen]);
|
|
10187
|
-
|
|
10206
|
+
React20.useEffect(() => {
|
|
10188
10207
|
function handleClickOutside(event) {
|
|
10189
10208
|
if (overflowMenuRef.current && !overflowMenuRef.current.contains(event.target)) {
|
|
10190
10209
|
setIsOverflowOpen(false);
|
|
@@ -10197,23 +10216,23 @@ function OrdersScreen() {
|
|
|
10197
10216
|
document.removeEventListener("mousedown", handleClickOutside);
|
|
10198
10217
|
};
|
|
10199
10218
|
}, [isOverflowOpen]);
|
|
10200
|
-
return /* @__PURE__ */
|
|
10219
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_top_left,_rgba(255,255,255,0.35),_transparent_60%)]" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative container mx-auto px-4 py-16" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10201
10220
|
framerMotion.motion.div,
|
|
10202
10221
|
{
|
|
10203
10222
|
initial: { opacity: 0, y: 24 },
|
|
10204
10223
|
animate: { opacity: 1, y: 0 },
|
|
10205
10224
|
className: "space-y-6"
|
|
10206
10225
|
},
|
|
10207
|
-
/* @__PURE__ */
|
|
10208
|
-
/* @__PURE__ */
|
|
10209
|
-
))), /* @__PURE__ */
|
|
10226
|
+
/* @__PURE__ */ React20__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__ */ React20__default.default.createElement(lucideReact.CalendarDays, { className: "h-4 w-4" }), "Order history"),
|
|
10227
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col gap-4 md:flex-row md:items-center md:justify-between" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React20__default.default.createElement("h1", { className: "text-4xl font-bold md:text-5xl" }, "All of your pharmacy orders"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "max-w-2xl text-white/80 md:text-lg" }, "Access receipts, shipping statuses, and reorder suggestions in one organized timeline curated by our pharmacists.")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-3xl bg-white/15 p-6 backdrop-blur" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm font-semibold uppercase tracking-[0.35em] text-white/70" }, "Quick tip"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-3 text-sm text-white/80" }, "Use filters to review previous prescriptions, reorder favorites, or download invoices for insurance claims.")))
|
|
10228
|
+
))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative -mt-16 pb-16 container mx-auto px-4" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10210
10229
|
framerMotion.motion.div,
|
|
10211
10230
|
{
|
|
10212
10231
|
initial: { opacity: 0, y: 24 },
|
|
10213
10232
|
animate: { opacity: 1, y: 0 },
|
|
10214
10233
|
className: "rounded-3xl border border-slate-100 bg-white p-6 shadow-lg shadow-primary-50"
|
|
10215
10234
|
},
|
|
10216
|
-
/* @__PURE__ */
|
|
10235
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col gap-4 md:flex-row md:items-center md:justify-between" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-3 text-sm text-slate-500" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Sparkles, { className: "h-4 w-4 text-primary-500" }), /* @__PURE__ */ React20__default.default.createElement("span", null, "Explore your complete order archive with pharmacist notes.")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col gap-4 md:items-end" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10217
10236
|
FilterChips,
|
|
10218
10237
|
{
|
|
10219
10238
|
label: "Status filters",
|
|
@@ -10227,7 +10246,7 @@ function OrdersScreen() {
|
|
|
10227
10246
|
maxVisible: MAX_VISIBLE_FILTERS,
|
|
10228
10247
|
variant: "primary"
|
|
10229
10248
|
}
|
|
10230
|
-
), /* @__PURE__ */
|
|
10249
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
10231
10250
|
FilterChips,
|
|
10232
10251
|
{
|
|
10233
10252
|
label: "Payment status",
|
|
@@ -10242,7 +10261,7 @@ function OrdersScreen() {
|
|
|
10242
10261
|
variant: "primary"
|
|
10243
10262
|
}
|
|
10244
10263
|
))),
|
|
10245
|
-
/* @__PURE__ */
|
|
10264
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-6 space-y-4" }, isLoading ? Array.from({ length: 3 }).map((_, index) => /* @__PURE__ */ React20__default.default.createElement(OrderCardSkeleton, { key: index })) : hasOrders ? filteredOrders.map((order) => /* @__PURE__ */ React20__default.default.createElement(OrderCard, { key: order.id, order })) : /* @__PURE__ */ React20__default.default.createElement(
|
|
10246
10265
|
EmptyState,
|
|
10247
10266
|
{
|
|
10248
10267
|
icon: lucideReact.Package,
|
|
@@ -10252,16 +10271,16 @@ function OrdersScreen() {
|
|
|
10252
10271
|
onAction: () => router.push("/shop")
|
|
10253
10272
|
}
|
|
10254
10273
|
)),
|
|
10255
|
-
!isLoading && pagination.totalPages > 1 && hasOrders && /* @__PURE__ */
|
|
10274
|
+
!isLoading && pagination.totalPages > 1 && hasOrders && /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-10 flex flex-wrap items-center justify-center gap-4" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10256
10275
|
Button,
|
|
10257
10276
|
{
|
|
10258
10277
|
variant: "outline",
|
|
10259
10278
|
onClick: () => setPage((current) => Math.max(1, current - 1)),
|
|
10260
10279
|
disabled: page === 1
|
|
10261
10280
|
},
|
|
10262
|
-
/* @__PURE__ */
|
|
10281
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.ChevronLeft, { className: "h-5 w-5" }),
|
|
10263
10282
|
"Previous"
|
|
10264
|
-
), /* @__PURE__ */
|
|
10283
|
+
), /* @__PURE__ */ React20__default.default.createElement("span", { className: "text-sm font-semibold text-slate-600" }, "Page ", page, " of ", pagination.totalPages), /* @__PURE__ */ React20__default.default.createElement(
|
|
10265
10284
|
Button,
|
|
10266
10285
|
{
|
|
10267
10286
|
variant: "outline",
|
|
@@ -10269,7 +10288,7 @@ function OrdersScreen() {
|
|
|
10269
10288
|
disabled: page === pagination.totalPages
|
|
10270
10289
|
},
|
|
10271
10290
|
"Next",
|
|
10272
|
-
/* @__PURE__ */
|
|
10291
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.ChevronRight, { className: "h-5 w-5" })
|
|
10273
10292
|
))
|
|
10274
10293
|
))));
|
|
10275
10294
|
}
|
|
@@ -10277,17 +10296,17 @@ function CurrentOrdersScreen() {
|
|
|
10277
10296
|
const router = navigation.useRouter();
|
|
10278
10297
|
const { orders, isLoading } = useCurrentOrders();
|
|
10279
10298
|
const hasOrders = orders.length > 0;
|
|
10280
|
-
return /* @__PURE__ */
|
|
10299
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React20__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" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_top_left,_rgba(255,255,255,0.35),_transparent_60%)]" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative container mx-auto px-4 py-16" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col gap-6 md:flex-row md:items-center md:justify-between" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10281
10300
|
framerMotion.motion.div,
|
|
10282
10301
|
{
|
|
10283
10302
|
initial: { opacity: 0, y: 24 },
|
|
10284
10303
|
animate: { opacity: 1, y: 0 },
|
|
10285
10304
|
className: "space-y-4"
|
|
10286
10305
|
},
|
|
10287
|
-
/* @__PURE__ */
|
|
10288
|
-
/* @__PURE__ */
|
|
10289
|
-
/* @__PURE__ */
|
|
10290
|
-
), /* @__PURE__ */
|
|
10306
|
+
/* @__PURE__ */ React20__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__ */ React20__default.default.createElement(lucideReact.Truck, { className: "h-4 w-4" }), "Live order tracking"),
|
|
10307
|
+
/* @__PURE__ */ React20__default.default.createElement("h1", { className: "text-4xl font-bold md:text-5xl" }, "Current orders"),
|
|
10308
|
+
/* @__PURE__ */ React20__default.default.createElement("p", { className: "max-w-2xl text-white/80 md:text-lg" }, "Follow your pharmacy orders from preparation to delivery. Real-time updates, SMS alerts, and pharmacist oversight come standard.")
|
|
10309
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
10291
10310
|
framerMotion.motion.div,
|
|
10292
10311
|
{
|
|
10293
10312
|
initial: { opacity: 0, y: 24 },
|
|
@@ -10295,24 +10314,24 @@ function CurrentOrdersScreen() {
|
|
|
10295
10314
|
transition: { delay: 0.1 },
|
|
10296
10315
|
className: "rounded-3xl bg-white/15 p-6 backdrop-blur"
|
|
10297
10316
|
},
|
|
10298
|
-
/* @__PURE__ */
|
|
10299
|
-
/* @__PURE__ */
|
|
10317
|
+
/* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm font-semibold uppercase tracking-[0.35em] text-white/70" }, "Quick actions"),
|
|
10318
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-4 space-y-3 text-sm text-white/80" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10300
10319
|
Link8__default.default,
|
|
10301
10320
|
{
|
|
10302
10321
|
href: "/orders",
|
|
10303
10322
|
className: "flex items-center justify-between rounded-2xl bg-white/10 px-4 py-3 transition hover:bg-white/20"
|
|
10304
10323
|
},
|
|
10305
|
-
/* @__PURE__ */
|
|
10306
|
-
/* @__PURE__ */
|
|
10307
|
-
), /* @__PURE__ */
|
|
10308
|
-
)))), /* @__PURE__ */
|
|
10324
|
+
/* @__PURE__ */ React20__default.default.createElement("span", { className: "font-semibold text-white" }, "View order history"),
|
|
10325
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.ArrowUpRight, { className: "h-4 w-4" })
|
|
10326
|
+
), /* @__PURE__ */ React20__default.default.createElement("p", null, "Need help fast? Chat with a pharmacist and we will triage your request in under 10 minutes."))
|
|
10327
|
+
)))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative -mt-16 pb-16" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10309
10328
|
framerMotion.motion.section,
|
|
10310
10329
|
{
|
|
10311
10330
|
initial: { opacity: 0, y: 24 },
|
|
10312
10331
|
animate: { opacity: 1, y: 0 },
|
|
10313
10332
|
className: "grid gap-6 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]"
|
|
10314
10333
|
},
|
|
10315
|
-
/* @__PURE__ */
|
|
10334
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-6" }, isLoading ? /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-4" }, Array.from({ length: 3 }).map((_, index) => /* @__PURE__ */ React20__default.default.createElement(OrderCardSkeleton, { key: index }))) : hasOrders ? /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-4" }, orders.map((order) => /* @__PURE__ */ React20__default.default.createElement(OrderCard, { key: order.id, order }))) : /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-3xl border border-slate-100 bg-white p-10 shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10316
10335
|
EmptyState,
|
|
10317
10336
|
{
|
|
10318
10337
|
icon: lucideReact.PackageCheck,
|
|
@@ -10322,7 +10341,7 @@ function CurrentOrdersScreen() {
|
|
|
10322
10341
|
onAction: () => router.push("/shop")
|
|
10323
10342
|
}
|
|
10324
10343
|
))),
|
|
10325
|
-
/* @__PURE__ */
|
|
10344
|
+
/* @__PURE__ */ React20__default.default.createElement("aside", { className: "space-y-6" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-3xl border border-slate-100 bg-white p-6 shadow-lg shadow-primary-50" }, /* @__PURE__ */ React20__default.default.createElement("h2", { className: "text-lg font-semibold text-slate-900" }, "Real-time milestones"), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-4 space-y-4 text-sm text-slate-600" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-start gap-3 rounded-2xl bg-slate-50 p-4" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Warehouse, { className: "h-5 w-5 text-primary-500" }), /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("p", { className: "font-semibold text-slate-800" }, "Preparation"), /* @__PURE__ */ React20__default.default.createElement("p", null, "Our pharmacists verify ingredients and pack thermo-sensitive items."))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-start gap-3 rounded-2xl bg-slate-50 p-4" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Truck, { className: "h-5 w-5 text-primary-500" }), /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("p", { className: "font-semibold text-slate-800" }, "In transit"), /* @__PURE__ */ React20__default.default.createElement("p", null, "Track live courier location with ETA updates tailored to your delivery window."))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-start gap-3 rounded-2xl bg-slate-50 p-4" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.BellRing, { className: "h-5 w-5 text-primary-500" }), /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("p", { className: "font-semibold text-slate-800" }, "Arrival alerts"), /* @__PURE__ */ React20__default.default.createElement("p", null, "Receive SMS and email notifications when parcels are out for delivery."))))), /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("p", { className: "font-semibold uppercase tracking-[0.3em]" }, "Need support?"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-3 leading-relaxed" }, "Our fulfillment team is online 7 days a week. Message us if you need to adjust delivery instructions or review dosage guidance.")))
|
|
10326
10345
|
))));
|
|
10327
10346
|
}
|
|
10328
10347
|
var addressFormSchema = zod.z.object({
|
|
@@ -10355,12 +10374,12 @@ function formatAddressSnippet(address) {
|
|
|
10355
10374
|
function getAddressTypeCopy(type) {
|
|
10356
10375
|
switch (type) {
|
|
10357
10376
|
case "Billing":
|
|
10358
|
-
return { label: "Billing", icon: /* @__PURE__ */
|
|
10377
|
+
return { label: "Billing", icon: /* @__PURE__ */ React20__default.default.createElement(lucideReact.Home, { className: "h-4 w-4" }) };
|
|
10359
10378
|
case "Both":
|
|
10360
|
-
return { label: "Billing & Shipping", icon: /* @__PURE__ */
|
|
10379
|
+
return { label: "Billing & Shipping", icon: /* @__PURE__ */ React20__default.default.createElement(lucideReact.Globe, { className: "h-4 w-4" }) };
|
|
10361
10380
|
case "Shipping":
|
|
10362
10381
|
default:
|
|
10363
|
-
return { label: "Shipping", icon: /* @__PURE__ */
|
|
10382
|
+
return { label: "Shipping", icon: /* @__PURE__ */ React20__default.default.createElement(lucideReact.MapPin, { className: "h-4 w-4" }) };
|
|
10364
10383
|
}
|
|
10365
10384
|
}
|
|
10366
10385
|
function AddressesScreen() {
|
|
@@ -10374,8 +10393,8 @@ function AddressesScreen() {
|
|
|
10374
10393
|
removeAddress,
|
|
10375
10394
|
markAsDefault
|
|
10376
10395
|
} = useAddresses();
|
|
10377
|
-
const [isModalOpen, setIsModalOpen] =
|
|
10378
|
-
const [editingAddress, setEditingAddress] =
|
|
10396
|
+
const [isModalOpen, setIsModalOpen] = React20.useState(false);
|
|
10397
|
+
const [editingAddress, setEditingAddress] = React20.useState(null);
|
|
10379
10398
|
const {
|
|
10380
10399
|
register,
|
|
10381
10400
|
handleSubmit,
|
|
@@ -10385,7 +10404,7 @@ function AddressesScreen() {
|
|
|
10385
10404
|
resolver: zod$1.zodResolver(addressFormSchema),
|
|
10386
10405
|
defaultValues: FORM_DEFAULTS
|
|
10387
10406
|
});
|
|
10388
|
-
|
|
10407
|
+
React20.useEffect(() => {
|
|
10389
10408
|
if (editingAddress) {
|
|
10390
10409
|
reset({
|
|
10391
10410
|
fullName: editingAddress.name,
|
|
@@ -10480,7 +10499,7 @@ You can add it back at any time.`
|
|
|
10480
10499
|
});
|
|
10481
10500
|
}
|
|
10482
10501
|
};
|
|
10483
|
-
const stats =
|
|
10502
|
+
const stats = React20.useMemo(() => {
|
|
10484
10503
|
const shippingCount = addresses.filter((address) => address.addressType !== "Billing").length;
|
|
10485
10504
|
const billingCount = addresses.filter((address) => address.addressType !== "Shipping").length;
|
|
10486
10505
|
return [
|
|
@@ -10504,18 +10523,18 @@ You can add it back at any time.`
|
|
|
10504
10523
|
}
|
|
10505
10524
|
];
|
|
10506
10525
|
}, [addresses]);
|
|
10507
|
-
return /* @__PURE__ */
|
|
10526
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_top_left,_rgba(255,255,255,0.3),_transparent_60%)]" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative container mx-auto px-4 py-16" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col gap-6 md:flex-row md:items-center md:justify-between" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10508
10527
|
framerMotion.motion.div,
|
|
10509
10528
|
{
|
|
10510
10529
|
initial: { opacity: 0, y: 24 },
|
|
10511
10530
|
animate: { opacity: 1, y: 0 },
|
|
10512
10531
|
className: "space-y-5"
|
|
10513
10532
|
},
|
|
10514
|
-
/* @__PURE__ */
|
|
10515
|
-
/* @__PURE__ */
|
|
10516
|
-
/* @__PURE__ */
|
|
10517
|
-
/* @__PURE__ */
|
|
10518
|
-
), /* @__PURE__ */
|
|
10533
|
+
/* @__PURE__ */ React20__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__ */ React20__default.default.createElement(lucideReact.MapPin, { className: "h-4 w-4" }), "Address book"),
|
|
10534
|
+
/* @__PURE__ */ React20__default.default.createElement("h1", { className: "text-4xl font-bold md:text-5xl" }, "Manage where your care arrives"),
|
|
10535
|
+
/* @__PURE__ */ React20__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."),
|
|
10536
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap items-center gap-3 text-sm text-white/75" }, /* @__PURE__ */ React20__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full bg-white/10 px-3 py-1" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Sparkles, { className: "h-4 w-4 text-white" }), "Default address: ", defaultAddress ? defaultAddress.name : "Not set"), /* @__PURE__ */ React20__default.default.createElement(Button, { variant: "ghost", className: "text-white hover:bg-white/10", onClick: openCreateModal }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Plus, { className: "h-5 w-5" }), "Add address"))
|
|
10537
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
10519
10538
|
framerMotion.motion.div,
|
|
10520
10539
|
{
|
|
10521
10540
|
initial: { opacity: 0, y: 24 },
|
|
@@ -10523,14 +10542,14 @@ You can add it back at any time.`
|
|
|
10523
10542
|
transition: { delay: 0.1 },
|
|
10524
10543
|
className: "grid gap-4 rounded-3xl bg-white/15 p-6 text-sm text-white/80 backdrop-blur"
|
|
10525
10544
|
},
|
|
10526
|
-
stats.map((stat) => /* @__PURE__ */
|
|
10527
|
-
)))), /* @__PURE__ */
|
|
10545
|
+
stats.map((stat) => /* @__PURE__ */ React20__default.default.createElement("div", { key: stat.id, className: "flex items-center justify-between" }, /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-xs font-semibold uppercase tracking-[0.3em] text-white/70" }, stat.label), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-white" }, stat.helper)), /* @__PURE__ */ React20__default.default.createElement("span", { className: "text-3xl font-semibold text-white" }, stat.value)))
|
|
10546
|
+
)))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative -mt-16 pb-20" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "container mx-auto px-4" }, isLoading ? /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid gap-4 sm:grid-cols-2 xl:grid-cols-3" }, Array.from({ length: 3 }).map((_, index) => /* @__PURE__ */ React20__default.default.createElement(
|
|
10528
10547
|
"div",
|
|
10529
10548
|
{
|
|
10530
10549
|
key: index,
|
|
10531
10550
|
className: "h-56 animate-pulse rounded-3xl border border-slate-100 bg-white"
|
|
10532
10551
|
}
|
|
10533
|
-
))) : error ? /* @__PURE__ */
|
|
10552
|
+
))) : error ? /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-3xl border border-red-100 bg-red-50 p-6 text-sm text-red-700" }, error.message) : addresses.length === 0 ? /* @__PURE__ */ React20__default.default.createElement("div", { className: "rounded-3xl border border-slate-100 bg-white p-12 shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10534
10553
|
EmptyState,
|
|
10535
10554
|
{
|
|
10536
10555
|
icon: lucideReact.MapPin,
|
|
@@ -10539,9 +10558,9 @@ You can add it back at any time.`
|
|
|
10539
10558
|
actionLabel: "Add your first address",
|
|
10540
10559
|
onAction: openCreateModal
|
|
10541
10560
|
}
|
|
10542
|
-
)) : /* @__PURE__ */
|
|
10561
|
+
)) : /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid gap-4 sm:grid-cols-2 xl:grid-cols-3" }, addresses.map((address) => {
|
|
10543
10562
|
const typeCopy = getAddressTypeCopy(address.addressType);
|
|
10544
|
-
return /* @__PURE__ */
|
|
10563
|
+
return /* @__PURE__ */ React20__default.default.createElement(
|
|
10545
10564
|
framerMotion.motion.div,
|
|
10546
10565
|
{
|
|
10547
10566
|
key: address.id,
|
|
@@ -10549,39 +10568,39 @@ You can add it back at any time.`
|
|
|
10549
10568
|
animate: { opacity: 1, y: 0 },
|
|
10550
10569
|
className: "group relative flex h-full flex-col rounded-3xl border border-slate-100 bg-white p-6 shadow-sm transition hover:-translate-y-1 hover:shadow-xl"
|
|
10551
10570
|
},
|
|
10552
|
-
address.isDefault && /* @__PURE__ */
|
|
10553
|
-
/* @__PURE__ */
|
|
10554
|
-
/* @__PURE__ */
|
|
10555
|
-
/* @__PURE__ */
|
|
10571
|
+
address.isDefault && /* @__PURE__ */ React20__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__ */ React20__default.default.createElement(lucideReact.Crown, { className: "h-4 w-4" }), "Default"),
|
|
10572
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React20__default.default.createElement("span", { className: "rounded-full bg-primary-50 p-3 text-primary-600" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.User, { className: "h-5 w-5" })), /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-base font-semibold text-slate-900" }, address.name), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-xs uppercase tracking-[0.3em] text-slate-400" }, typeCopy.label))),
|
|
10573
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-6 flex flex-1 flex-col gap-3 text-sm text-slate-600" }, /* @__PURE__ */ React20__default.default.createElement("p", null, formatAddressSnippet(address)), /* @__PURE__ */ React20__default.default.createElement("p", { className: "inline-flex items-center gap-2 text-slate-500" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Phone, { className: "h-4 w-4 text-slate-400" }), address.phone || "Not provided")),
|
|
10574
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-6 flex items-center justify-between gap-3" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10556
10575
|
"button",
|
|
10557
10576
|
{
|
|
10558
10577
|
type: "button",
|
|
10559
10578
|
onClick: () => openEditModal(address),
|
|
10560
10579
|
className: "inline-flex items-center gap-2 rounded-full border border-slate-200 px-3 py-1 text-sm font-medium text-slate-600 transition hover:border-primary-300 hover:text-primary-600"
|
|
10561
10580
|
},
|
|
10562
|
-
/* @__PURE__ */
|
|
10581
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Edit3, { className: "h-4 w-4" }),
|
|
10563
10582
|
"Edit"
|
|
10564
|
-
), /* @__PURE__ */
|
|
10583
|
+
), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-2" }, !address.isDefault && /* @__PURE__ */ React20__default.default.createElement(
|
|
10565
10584
|
"button",
|
|
10566
10585
|
{
|
|
10567
10586
|
type: "button",
|
|
10568
10587
|
onClick: () => handleSetDefault(address),
|
|
10569
10588
|
className: "inline-flex items-center gap-2 rounded-full border border-amber-200 px-3 py-1 text-sm font-semibold text-amber-600 transition hover:border-amber-300 hover:text-amber-700"
|
|
10570
10589
|
},
|
|
10571
|
-
/* @__PURE__ */
|
|
10590
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Star, { className: "h-4 w-4" }),
|
|
10572
10591
|
"Make default"
|
|
10573
|
-
), /* @__PURE__ */
|
|
10592
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
10574
10593
|
"button",
|
|
10575
10594
|
{
|
|
10576
10595
|
type: "button",
|
|
10577
10596
|
onClick: () => handleDelete(address),
|
|
10578
10597
|
className: "inline-flex items-center gap-2 rounded-full border border-red-200 px-3 py-1 text-sm font-semibold text-red-600 transition hover:border-red-300 hover:text-red-700"
|
|
10579
10598
|
},
|
|
10580
|
-
/* @__PURE__ */
|
|
10599
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Trash2, { className: "h-4 w-4" }),
|
|
10581
10600
|
"Delete"
|
|
10582
10601
|
)))
|
|
10583
10602
|
);
|
|
10584
|
-
})))), /* @__PURE__ */
|
|
10603
|
+
})))), /* @__PURE__ */ React20__default.default.createElement(
|
|
10585
10604
|
Modal,
|
|
10586
10605
|
{
|
|
10587
10606
|
isOpen: isModalOpen,
|
|
@@ -10589,7 +10608,7 @@ You can add it back at any time.`
|
|
|
10589
10608
|
title: editingAddress ? "Edit address" : "Add new address",
|
|
10590
10609
|
size: "lg"
|
|
10591
10610
|
},
|
|
10592
|
-
/* @__PURE__ */
|
|
10611
|
+
/* @__PURE__ */ React20__default.default.createElement("form", { onSubmit: handleSubmit(onSubmit), className: "space-y-6" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid gap-4 md:grid-cols-2" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10593
10612
|
Input,
|
|
10594
10613
|
{
|
|
10595
10614
|
label: "Full name",
|
|
@@ -10597,7 +10616,7 @@ You can add it back at any time.`
|
|
|
10597
10616
|
...register("fullName"),
|
|
10598
10617
|
error: errors.fullName?.message
|
|
10599
10618
|
}
|
|
10600
|
-
), /* @__PURE__ */
|
|
10619
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
10601
10620
|
Input,
|
|
10602
10621
|
{
|
|
10603
10622
|
label: "Phone number",
|
|
@@ -10605,7 +10624,7 @@ You can add it back at any time.`
|
|
|
10605
10624
|
...register("phone"),
|
|
10606
10625
|
error: errors.phone?.message
|
|
10607
10626
|
}
|
|
10608
|
-
)), /* @__PURE__ */
|
|
10627
|
+
)), /* @__PURE__ */ React20__default.default.createElement(
|
|
10609
10628
|
Input,
|
|
10610
10629
|
{
|
|
10611
10630
|
label: "Address line 1",
|
|
@@ -10613,7 +10632,7 @@ You can add it back at any time.`
|
|
|
10613
10632
|
...register("addressLine1"),
|
|
10614
10633
|
error: errors.addressLine1?.message
|
|
10615
10634
|
}
|
|
10616
|
-
), /* @__PURE__ */
|
|
10635
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
10617
10636
|
Input,
|
|
10618
10637
|
{
|
|
10619
10638
|
label: "Address line 2 (optional)",
|
|
@@ -10621,7 +10640,7 @@ You can add it back at any time.`
|
|
|
10621
10640
|
...register("addressLine2"),
|
|
10622
10641
|
error: errors.addressLine2?.message
|
|
10623
10642
|
}
|
|
10624
|
-
), /* @__PURE__ */
|
|
10643
|
+
), /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid gap-4 md:grid-cols-2" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10625
10644
|
Input,
|
|
10626
10645
|
{
|
|
10627
10646
|
label: "City",
|
|
@@ -10629,7 +10648,7 @@ You can add it back at any time.`
|
|
|
10629
10648
|
...register("city"),
|
|
10630
10649
|
error: errors.city?.message
|
|
10631
10650
|
}
|
|
10632
|
-
), /* @__PURE__ */
|
|
10651
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
10633
10652
|
Input,
|
|
10634
10653
|
{
|
|
10635
10654
|
label: "State / Region",
|
|
@@ -10637,7 +10656,7 @@ You can add it back at any time.`
|
|
|
10637
10656
|
...register("state"),
|
|
10638
10657
|
error: errors.state?.message
|
|
10639
10658
|
}
|
|
10640
|
-
)), /* @__PURE__ */
|
|
10659
|
+
)), /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid gap-4 md:grid-cols-2" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10641
10660
|
Input,
|
|
10642
10661
|
{
|
|
10643
10662
|
label: "Postal code",
|
|
@@ -10645,7 +10664,7 @@ You can add it back at any time.`
|
|
|
10645
10664
|
...register("zipCode"),
|
|
10646
10665
|
error: errors.zipCode?.message
|
|
10647
10666
|
}
|
|
10648
|
-
), /* @__PURE__ */
|
|
10667
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
10649
10668
|
Input,
|
|
10650
10669
|
{
|
|
10651
10670
|
label: "Country",
|
|
@@ -10653,35 +10672,35 @@ You can add it back at any time.`
|
|
|
10653
10672
|
...register("country"),
|
|
10654
10673
|
error: errors.country?.message
|
|
10655
10674
|
}
|
|
10656
|
-
)), /* @__PURE__ */
|
|
10675
|
+
)), /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid gap-4 md:grid-cols-2" }, /* @__PURE__ */ React20__default.default.createElement("label", { className: "flex flex-col gap-2 rounded-2xl border border-slate-200 p-4" }, /* @__PURE__ */ React20__default.default.createElement("span", { className: "text-sm font-semibold text-slate-700" }, "Address type"), /* @__PURE__ */ React20__default.default.createElement(
|
|
10657
10676
|
"select",
|
|
10658
10677
|
{
|
|
10659
10678
|
...register("addressType"),
|
|
10660
10679
|
className: "rounded-xl border border-slate-200 px-3 py-2 text-sm text-slate-700 focus:border-primary-400 focus:outline-none focus:ring-2 focus:ring-primary-500/20"
|
|
10661
10680
|
},
|
|
10662
|
-
/* @__PURE__ */
|
|
10663
|
-
/* @__PURE__ */
|
|
10664
|
-
/* @__PURE__ */
|
|
10665
|
-
)), /* @__PURE__ */
|
|
10681
|
+
/* @__PURE__ */ React20__default.default.createElement("option", { value: "Shipping" }, "Shipping"),
|
|
10682
|
+
/* @__PURE__ */ React20__default.default.createElement("option", { value: "Billing" }, "Billing"),
|
|
10683
|
+
/* @__PURE__ */ React20__default.default.createElement("option", { value: "Both" }, "Billing & Shipping")
|
|
10684
|
+
)), /* @__PURE__ */ React20__default.default.createElement("label", { className: "flex items-center justify-between gap-4 rounded-2xl border border-slate-200 bg-slate-50 px-4 py-3 text-sm font-medium text-slate-700" }, /* @__PURE__ */ React20__default.default.createElement("span", null, "Set as default address"), /* @__PURE__ */ React20__default.default.createElement(
|
|
10666
10685
|
"input",
|
|
10667
10686
|
{
|
|
10668
10687
|
type: "checkbox",
|
|
10669
10688
|
...register("isDefault"),
|
|
10670
10689
|
className: "h-4 w-4 rounded border-primary-300 text-primary-600 focus:ring-primary-500"
|
|
10671
10690
|
}
|
|
10672
|
-
))), /* @__PURE__ */
|
|
10691
|
+
))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-end gap-3" }, /* @__PURE__ */ React20__default.default.createElement(Button, { type: "button", variant: "outline", onClick: closeModal }, "Cancel"), /* @__PURE__ */ React20__default.default.createElement(Button, { type: "submit", isLoading: isSubmitting }, editingAddress ? "Save changes" : "Save address")))
|
|
10673
10692
|
));
|
|
10674
10693
|
}
|
|
10675
10694
|
function useWishlistProducts(productIds = []) {
|
|
10676
|
-
const [products, setProducts] =
|
|
10677
|
-
const [isLoading, setIsLoading] =
|
|
10678
|
-
const [error, setError] =
|
|
10679
|
-
const [cache] =
|
|
10680
|
-
const uniqueIds =
|
|
10695
|
+
const [products, setProducts] = React20.useState([]);
|
|
10696
|
+
const [isLoading, setIsLoading] = React20.useState(false);
|
|
10697
|
+
const [error, setError] = React20.useState(null);
|
|
10698
|
+
const [cache] = React20.useState(() => /* @__PURE__ */ new Map());
|
|
10699
|
+
const uniqueIds = React20.useMemo(
|
|
10681
10700
|
() => Array.from(new Set((productIds || []).filter(Boolean))),
|
|
10682
10701
|
[productIds]
|
|
10683
10702
|
);
|
|
10684
|
-
const fetchProducts =
|
|
10703
|
+
const fetchProducts = React20.useCallback(async () => {
|
|
10685
10704
|
if (uniqueIds.length === 0) {
|
|
10686
10705
|
setProducts([]);
|
|
10687
10706
|
setIsLoading(false);
|
|
@@ -10709,7 +10728,7 @@ function useWishlistProducts(productIds = []) {
|
|
|
10709
10728
|
setIsLoading(false);
|
|
10710
10729
|
}
|
|
10711
10730
|
}, [cache, uniqueIds]);
|
|
10712
|
-
|
|
10731
|
+
React20.useEffect(() => {
|
|
10713
10732
|
fetchProducts();
|
|
10714
10733
|
}, [fetchProducts]);
|
|
10715
10734
|
return {
|
|
@@ -10728,6 +10747,7 @@ var SORT_OPTIONS = [
|
|
|
10728
10747
|
];
|
|
10729
10748
|
function WishlistScreen() {
|
|
10730
10749
|
const router = navigation.useRouter();
|
|
10750
|
+
const { buildPath } = useBasePath();
|
|
10731
10751
|
const { isAuthenticated } = useAuth() || {};
|
|
10732
10752
|
const {
|
|
10733
10753
|
products: wishlistItems,
|
|
@@ -10740,10 +10760,10 @@ function WishlistScreen() {
|
|
|
10740
10760
|
const { products: wishlistProducts, isLoading, error } = useWishlistProducts(
|
|
10741
10761
|
wishlistItems
|
|
10742
10762
|
);
|
|
10743
|
-
const [onlyInStock, setOnlyInStock] =
|
|
10744
|
-
const [viewMode, setViewMode] =
|
|
10745
|
-
const [sortOption, setSortOption] =
|
|
10746
|
-
|
|
10763
|
+
const [onlyInStock, setOnlyInStock] = React20.useState(false);
|
|
10764
|
+
const [viewMode, setViewMode] = React20.useState("list");
|
|
10765
|
+
const [sortOption, setSortOption] = React20.useState("featured");
|
|
10766
|
+
React20.useEffect(() => {
|
|
10747
10767
|
if (error) {
|
|
10748
10768
|
sonner.toast.error("We had trouble loading your saved products. Please try again.");
|
|
10749
10769
|
}
|
|
@@ -10765,11 +10785,11 @@ function WishlistScreen() {
|
|
|
10765
10785
|
console.error("Error clearing wishlist:", err);
|
|
10766
10786
|
}
|
|
10767
10787
|
};
|
|
10768
|
-
const totalValue =
|
|
10788
|
+
const totalValue = React20.useMemo(
|
|
10769
10789
|
() => wishlistProducts.reduce((sum, product) => sum + (product.finalPrice ?? 0), 0),
|
|
10770
10790
|
[wishlistProducts]
|
|
10771
10791
|
);
|
|
10772
|
-
|
|
10792
|
+
React20.useMemo(
|
|
10773
10793
|
() => wishlistProducts.reduce((sum, product) => {
|
|
10774
10794
|
const before = product.priceBeforeDiscount ?? product.finalPrice ?? 0;
|
|
10775
10795
|
const after = product.finalPrice ?? 0;
|
|
@@ -10778,11 +10798,11 @@ function WishlistScreen() {
|
|
|
10778
10798
|
}, 0),
|
|
10779
10799
|
[wishlistProducts]
|
|
10780
10800
|
);
|
|
10781
|
-
|
|
10801
|
+
React20.useMemo(
|
|
10782
10802
|
() => wishlistProducts.filter((product) => (product.inventoryCount ?? 0) > 0).length,
|
|
10783
10803
|
[wishlistProducts]
|
|
10784
10804
|
);
|
|
10785
|
-
const processedProducts =
|
|
10805
|
+
const processedProducts = React20.useMemo(() => {
|
|
10786
10806
|
let list = [...wishlistProducts];
|
|
10787
10807
|
if (onlyInStock) {
|
|
10788
10808
|
list = list.filter((product) => (product.inventoryCount ?? 0) > 0);
|
|
@@ -10808,14 +10828,14 @@ function WishlistScreen() {
|
|
|
10808
10828
|
return list;
|
|
10809
10829
|
}, [wishlistProducts, onlyInStock, sortOption]);
|
|
10810
10830
|
const emptyAfterFiltering = !isLoading && wishlistProducts.length > 0 && processedProducts.length === 0;
|
|
10811
|
-
return /* @__PURE__ */
|
|
10831
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "min-h-screen bg-slate-50 pb-16" }, /* @__PURE__ */ React20__default.default.createElement("section", { className: "relative overflow-hidden bg-gradient-to-br from-[rgb(var(--header-from))] via-[rgb(var(--header-via))] to-[rgb(var(--header-to))] pb-32 pt-16 text-white" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "absolute inset-0 opacity-40 mix-blend-soft-light", "aria-hidden": "true" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "absolute -top-1/2 right-1/2 h-[40rem] w-[40rem] rounded-full bg-white/10 blur-3xl" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "absolute left-1/4 top-1/4 h-48 w-48 rounded-full bg-white/20 blur-2xl" })), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative container mx-auto px-4" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "max-w-3xl space-y-6" }, /* @__PURE__ */ React20__default.default.createElement("span", { className: "inline-flex items-center gap-2 rounded-full bg-white/15 px-4 py-1 text-sm font-semibold uppercase tracking-[0.35em] text-white/70 backdrop-blur" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Heart, { className: "h-4 w-4" }), "Wishlist"), /* @__PURE__ */ React20__default.default.createElement("h1", { className: "text-4xl font-bold leading-tight md:text-5xl" }, "Curate your pharmacy must-haves in one calming space"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "max-w-2xl text-white/80 md:text-lg" }, "We keep your favourite products ready for reorder, refill reminders, and quick checkout\u2014exactly when you need them.")))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative -mt-20" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10812
10832
|
framerMotion.motion.div,
|
|
10813
10833
|
{
|
|
10814
10834
|
initial: { opacity: 0, y: 24 },
|
|
10815
10835
|
animate: { opacity: 1, y: 0 },
|
|
10816
10836
|
className: "rounded-3xl border border-slate-100 bg-white p-6 shadow-xl shadow-primary-50"
|
|
10817
10837
|
},
|
|
10818
|
-
/* @__PURE__ */
|
|
10838
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col gap-6" }, !isAuthenticated && /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex min-h-[40vh] items-center justify-center" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "max-w-lg rounded-3xl border border-slate-100 bg-white p-10 text-center shadow-lg shadow-primary-50" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "mx-auto flex h-16 w-16 items-center justify-center rounded-full bg-primary-50 text-primary-600" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Heart, { className: "h-8 w-8" })), /* @__PURE__ */ React20__default.default.createElement("h2", { className: "mt-6 text-3xl font-bold text-slate-900" }, "Sign in to see your favourites"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-3 text-slate-500" }, "Create your curated shelf of products and we'll keep them ready whenever you return."), /* @__PURE__ */ React20__default.default.createElement(Button, { className: "mt-6", onClick: () => router.push("/login") }, "Sign In"))), isAuthenticated && /* @__PURE__ */ React20__default.default.createElement(React20__default.default.Fragment, null, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React20__default.default.createElement("h2", { className: "text-2xl font-semibold text-slate-900" }, "Your saved collection"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-slate-500" }, "Total value: ", /* @__PURE__ */ React20__default.default.createElement("span", { className: "font-semibold text-primary-600" }, formatPrice(totalValue)), onlyInStock && " \u2022 Showing items ready to ship")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap items-center gap-3" }, /* @__PURE__ */ React20__default.default.createElement("label", { className: "inline-flex cursor-pointer items-center gap-2 rounded-full border border-slate-200 bg-slate-50 px-3 py-1.5 text-sm font-medium text-slate-600 transition hover:border-primary-200 hover:text-primary-600" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10819
10839
|
"input",
|
|
10820
10840
|
{
|
|
10821
10841
|
type: "checkbox",
|
|
@@ -10823,54 +10843,54 @@ function WishlistScreen() {
|
|
|
10823
10843
|
onChange: (event) => setOnlyInStock(event.target.checked),
|
|
10824
10844
|
className: "h-4 w-4 rounded border-slate-300 text-primary-600 focus:ring-primary-500"
|
|
10825
10845
|
}
|
|
10826
|
-
), "Only show in-stock"), /* @__PURE__ */
|
|
10846
|
+
), "Only show in-stock"), /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("span", null, "Sort"), /* @__PURE__ */ React20__default.default.createElement(
|
|
10827
10847
|
"select",
|
|
10828
10848
|
{
|
|
10829
10849
|
value: sortOption,
|
|
10830
10850
|
onChange: (event) => setSortOption(event.target.value),
|
|
10831
10851
|
className: "bg-transparent text-sm font-medium text-slate-700 outline-none"
|
|
10832
10852
|
},
|
|
10833
|
-
SORT_OPTIONS.map((option) => /* @__PURE__ */
|
|
10834
|
-
)), /* @__PURE__ */
|
|
10853
|
+
SORT_OPTIONS.map((option) => /* @__PURE__ */ React20__default.default.createElement("option", { key: option.value, value: option.value }, option.label))
|
|
10854
|
+
)), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex overflow-hidden rounded-full border border-slate-200 bg-slate-50" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10835
10855
|
"button",
|
|
10836
10856
|
{
|
|
10837
10857
|
type: "button",
|
|
10838
10858
|
onClick: () => setViewMode("grid"),
|
|
10839
10859
|
className: `flex items-center gap-1 px-3 py-1.5 text-sm font-medium transition ${viewMode === "grid" ? "bg-primary-600 text-white shadow-lg shadow-primary-500/30" : "text-slate-600 hover:bg-white"}`
|
|
10840
10860
|
},
|
|
10841
|
-
/* @__PURE__ */
|
|
10861
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Grid, { className: "h-4 w-4" }),
|
|
10842
10862
|
"Grid"
|
|
10843
|
-
), /* @__PURE__ */
|
|
10863
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
10844
10864
|
"button",
|
|
10845
10865
|
{
|
|
10846
10866
|
type: "button",
|
|
10847
10867
|
onClick: () => setViewMode("list"),
|
|
10848
10868
|
className: `flex items-center gap-1 px-3 py-1.5 text-sm font-medium transition ${viewMode === "list" ? "bg-primary-600 text-white shadow-lg shadow-primary-500/30" : "text-slate-600 hover:bg-white"}`
|
|
10849
10869
|
},
|
|
10850
|
-
/* @__PURE__ */
|
|
10870
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.List, { className: "h-4 w-4" }),
|
|
10851
10871
|
"List"
|
|
10852
|
-
)), wishlistCount > 0 && /* @__PURE__ */
|
|
10872
|
+
)), wishlistCount > 0 && /* @__PURE__ */ React20__default.default.createElement(
|
|
10853
10873
|
Button,
|
|
10854
10874
|
{
|
|
10855
10875
|
variant: "ghost",
|
|
10856
10876
|
className: "text-sm font-semibold text-slate-500 hover:text-red-500",
|
|
10857
10877
|
onClick: handleClearWishlist
|
|
10858
10878
|
},
|
|
10859
|
-
/* @__PURE__ */
|
|
10879
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Trash2, { className: "h-4 w-4" }),
|
|
10860
10880
|
"Clear all"
|
|
10861
|
-
))), isLoading && /* @__PURE__ */
|
|
10881
|
+
))), isLoading && /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3" }, Array.from({ length: Math.min(wishlistCount || 3, 6) }).map((_, index) => /* @__PURE__ */ React20__default.default.createElement(
|
|
10862
10882
|
"div",
|
|
10863
10883
|
{
|
|
10864
10884
|
key: index,
|
|
10865
10885
|
className: "h-72 animate-pulse rounded-2xl border border-slate-200 bg-slate-100"
|
|
10866
10886
|
}
|
|
10867
|
-
))), !isLoading && wishlistCount === 0 && /* @__PURE__ */
|
|
10887
|
+
))), !isLoading && wishlistCount === 0 && /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex min-h-[30vh] items-center justify-center" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "max-w-2xl rounded-3xl border border-slate-100 bg-white p-12 text-center shadow-xl shadow-primary-50" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "mx-auto flex h-20 w-20 items-center justify-center rounded-full bg-primary-100 text-primary-600" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Sparkles, { className: "h-10 w-10" })), /* @__PURE__ */ React20__default.default.createElement("h2", { className: "mt-6 text-4xl font-bold text-slate-900" }, "Start your wellness wishlist"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-4 text-lg text-slate-500" }, "Bookmark pharmacy essentials, supplements, or skincare picks and we'll keep them safe until you're ready to checkout."), /* @__PURE__ */ React20__default.default.createElement("div", { className: "mt-8 flex flex-wrap justify-center gap-3" }, /* @__PURE__ */ React20__default.default.createElement(Button, { onClick: () => router.push("/shop") }, "Discover products"), /* @__PURE__ */ React20__default.default.createElement(Button, { variant: "outline", onClick: () => router.push("/categories") }, "Browse categories")))), !isLoading && processedProducts.length > 0 && /* @__PURE__ */ React20__default.default.createElement(React20__default.default.Fragment, null, viewMode === "grid" ? /* @__PURE__ */ React20__default.default.createElement(
|
|
10868
10888
|
framerMotion.motion.div,
|
|
10869
10889
|
{
|
|
10870
10890
|
layout: true,
|
|
10871
10891
|
className: "grid grid-cols-1 gap-5 sm:grid-cols-2 xl:grid-cols-3"
|
|
10872
10892
|
},
|
|
10873
|
-
/* @__PURE__ */
|
|
10893
|
+
/* @__PURE__ */ React20__default.default.createElement(framerMotion.AnimatePresence, null, processedProducts.map((product) => /* @__PURE__ */ React20__default.default.createElement(
|
|
10874
10894
|
framerMotion.motion.div,
|
|
10875
10895
|
{
|
|
10876
10896
|
key: product.id,
|
|
@@ -10880,17 +10900,17 @@ function WishlistScreen() {
|
|
|
10880
10900
|
exit: { opacity: 0, y: -20 },
|
|
10881
10901
|
transition: { duration: 0.2 }
|
|
10882
10902
|
},
|
|
10883
|
-
/* @__PURE__ */
|
|
10903
|
+
/* @__PURE__ */ React20__default.default.createElement(
|
|
10884
10904
|
ProductCard,
|
|
10885
10905
|
{
|
|
10886
10906
|
product,
|
|
10887
|
-
onClickProduct: (p) => router.push(`/products/${p.id}`),
|
|
10907
|
+
onClickProduct: (p) => router.push(buildPath(`/products/${p.id}`)),
|
|
10888
10908
|
onFavorite: () => handleRemoveFromWishlist(product.id),
|
|
10889
10909
|
isFavorited: true
|
|
10890
10910
|
}
|
|
10891
10911
|
)
|
|
10892
10912
|
)))
|
|
10893
|
-
) : /* @__PURE__ */
|
|
10913
|
+
) : /* @__PURE__ */ React20__default.default.createElement(framerMotion.motion.div, { layout: true, className: "space-y-4" }, /* @__PURE__ */ React20__default.default.createElement(framerMotion.AnimatePresence, null, processedProducts.map((product) => /* @__PURE__ */ React20__default.default.createElement(
|
|
10894
10914
|
framerMotion.motion.div,
|
|
10895
10915
|
{
|
|
10896
10916
|
key: product.id,
|
|
@@ -10901,7 +10921,7 @@ function WishlistScreen() {
|
|
|
10901
10921
|
transition: { duration: 0.2 },
|
|
10902
10922
|
className: "flex flex-col gap-4 rounded-2xl border border-slate-100 bg-slate-50 p-4 shadow-sm shadow-primary-50 sm:flex-row sm:items-center"
|
|
10903
10923
|
},
|
|
10904
|
-
/* @__PURE__ */
|
|
10924
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "relative h-28 w-full overflow-hidden rounded-2xl bg-white sm:w-40" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10905
10925
|
Image3__default.default,
|
|
10906
10926
|
{
|
|
10907
10927
|
fill: true,
|
|
@@ -10910,14 +10930,14 @@ function WishlistScreen() {
|
|
|
10910
10930
|
className: "h-full w-full object-cover"
|
|
10911
10931
|
}
|
|
10912
10932
|
)),
|
|
10913
|
-
/* @__PURE__ */
|
|
10933
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-1 flex-col gap-2" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap items-center justify-between gap-3" }, /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-lg font-semibold text-slate-900" }, product.name), /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm text-slate-500" }, product.parentCategories?.map((category) => category?.name).join(", ") || "General wellness")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "text-right" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-lg font-bold text-primary-600" }, formatPrice(product.finalPrice ?? 0)), product.isDiscounted && /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-xs text-emerald-500" }, "You save ", formatPrice(Math.max((product.priceBeforeDiscount ?? 0) - (product.finalPrice ?? 0), 0))))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap items-center gap-3 text-xs text-slate-500" }, /* @__PURE__ */ React20__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__ */ React20__default.default.createElement(lucideReact.Package, { className: "h-3.5 w-3.5" }), product.inventoryCount > 0 ? "In stock" : "Backordered"), product.totalSold > 0 && /* @__PURE__ */ React20__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__ */ React20__default.default.createElement(lucideReact.Sparkles, { className: "h-3.5 w-3.5" }), product.totalSold, "+ purchased")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-wrap gap-2" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
10914
10934
|
Button,
|
|
10915
10935
|
{
|
|
10916
10936
|
size: "sm",
|
|
10917
10937
|
onClick: () => router.push(`/products/${product.id}`)
|
|
10918
10938
|
},
|
|
10919
10939
|
"View details"
|
|
10920
|
-
), /* @__PURE__ */
|
|
10940
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
10921
10941
|
Button,
|
|
10922
10942
|
{
|
|
10923
10943
|
size: "sm",
|
|
@@ -10927,19 +10947,20 @@ function WishlistScreen() {
|
|
|
10927
10947
|
},
|
|
10928
10948
|
"Remove"
|
|
10929
10949
|
)))
|
|
10930
|
-
))))), isAuthenticated && emptyAfterFiltering && /* @__PURE__ */
|
|
10950
|
+
))))), isAuthenticated && emptyAfterFiltering && /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col items-center justify-center rounded-2xl border border-dashed border-slate-200 bg-slate-50 p-12 text-center" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex h-16 w-16 items-center justify-center rounded-full bg-slate-200 text-slate-500" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Package, { className: "h-8 w-8" })), /* @__PURE__ */ React20__default.default.createElement("h3", { className: "mt-6 text-2xl font-semibold text-slate-900" }, "Nothing matches those filters"), /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-2 max-w-md text-sm text-slate-500" }, "Try showing out-of-stock items or adjust your sort order to revisit everything you\u2019ve saved."), /* @__PURE__ */ React20__default.default.createElement(Button, { className: "mt-6", variant: "outline", onClick: () => setOnlyInStock(false) }, "Show all saved products"))))
|
|
10931
10951
|
))));
|
|
10932
10952
|
}
|
|
10933
10953
|
function SearchPage() {
|
|
10934
10954
|
const router = navigation.useRouter();
|
|
10955
|
+
const { buildPath } = useBasePath();
|
|
10935
10956
|
const searchParams = navigation.useSearchParams();
|
|
10936
10957
|
const searchQuery = searchParams.get("q") || "";
|
|
10937
|
-
const [products, setProducts] =
|
|
10938
|
-
const [isLoading, setIsLoading] =
|
|
10939
|
-
const [searchInput, setSearchInput] =
|
|
10940
|
-
const [hasSearched, setHasSearched] =
|
|
10958
|
+
const [products, setProducts] = React20.useState([]);
|
|
10959
|
+
const [isLoading, setIsLoading] = React20.useState(true);
|
|
10960
|
+
const [searchInput, setSearchInput] = React20.useState(searchQuery);
|
|
10961
|
+
const [hasSearched, setHasSearched] = React20.useState(false);
|
|
10941
10962
|
const { isInWishlist } = useWishlist();
|
|
10942
|
-
|
|
10963
|
+
React20.useEffect(() => {
|
|
10943
10964
|
const fetchSearchResults = async () => {
|
|
10944
10965
|
if (!searchQuery.trim()) {
|
|
10945
10966
|
setProducts([]);
|
|
@@ -11032,38 +11053,38 @@ function SearchPage() {
|
|
|
11032
11053
|
{
|
|
11033
11054
|
product,
|
|
11034
11055
|
isFavorited: isInWishlist(product.id),
|
|
11035
|
-
onClickProduct: (p) => router.push(`/products/${p.id}`)
|
|
11056
|
+
onClickProduct: (p) => router.push(buildPath(`/products/${p.id}`))
|
|
11036
11057
|
}
|
|
11037
11058
|
))) : hasSearched ? /* @__PURE__ */ React.createElement("div", { className: "text-center py-12" }, /* @__PURE__ */ React.createElement("div", { className: "text-gray-500 text-lg mb-4" }, 'No products found for "', searchQuery, '"'), /* @__PURE__ */ React.createElement("p", { className: "text-gray-500 mb-6" }, "Try different keywords or check out our", " ", /* @__PURE__ */ React.createElement(Link8__default.default, { href: "/shop", className: "text-primary-600 hover:underline ml-1 font-medium" }, "featured products"))) : /* @__PURE__ */ React.createElement("div", { className: "text-center py-12" }, /* @__PURE__ */ React.createElement("p", { className: "text-gray-500" }, "Enter a search term to find products"))));
|
|
11038
11059
|
}
|
|
11039
11060
|
function CategoriesScreen() {
|
|
11040
11061
|
const { categories, isLoading } = useCategories();
|
|
11041
11062
|
const router = navigation.useRouter();
|
|
11042
|
-
return /* @__PURE__ */
|
|
11063
|
+
return /* @__PURE__ */ React20__default.default.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_top_left,_rgba(255,255,255,0.35),_transparent_60%)]" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative container mx-auto px-4 py-16" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
11043
11064
|
framerMotion.motion.div,
|
|
11044
11065
|
{
|
|
11045
11066
|
initial: { opacity: 0, y: 24 },
|
|
11046
11067
|
animate: { opacity: 1, y: 0 },
|
|
11047
11068
|
className: "space-y-6"
|
|
11048
11069
|
},
|
|
11049
|
-
/* @__PURE__ */
|
|
11050
|
-
/* @__PURE__ */
|
|
11051
|
-
))), /* @__PURE__ */
|
|
11070
|
+
/* @__PURE__ */ React20__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__ */ React20__default.default.createElement(lucideReact.Package, { className: "h-4 w-4" }), "Product Categories"),
|
|
11071
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex flex-col gap-4 md:flex-row md:items-center md:justify-between" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React20__default.default.createElement("h1", { className: "text-4xl font-bold md:text-5xl" }, "Browse Our Product Range"), /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("div", { className: "rounded-3xl bg-white/15 p-6 backdrop-blur" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-sm font-semibold uppercase tracking-[0.35em] text-white/70" }, "Quick tip"), /* @__PURE__ */ React20__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.")))
|
|
11072
|
+
))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative -mt-16 pb-16" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
11052
11073
|
framerMotion.motion.div,
|
|
11053
11074
|
{
|
|
11054
11075
|
initial: { opacity: 0, y: 24 },
|
|
11055
11076
|
animate: { opacity: 1, y: 0 },
|
|
11056
11077
|
className: "rounded-3xl border border-slate-100 bg-white p-6 shadow-lg shadow-primary-50"
|
|
11057
11078
|
},
|
|
11058
|
-
/* @__PURE__ */
|
|
11059
|
-
isLoading ? /* @__PURE__ */
|
|
11079
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-3 text-sm text-slate-500 mb-6" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Sparkles, { className: "h-4 w-4 text-primary-500" }), /* @__PURE__ */ React20__default.default.createElement("span", null, "Browse our complete product catalog organized by categories.")),
|
|
11080
|
+
isLoading ? /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6" }, [...Array(8)].map((_, i) => /* @__PURE__ */ React20__default.default.createElement("div", { key: i, className: "animate-pulse" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "bg-gray-200 rounded-lg aspect-square mb-2" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "h-4 bg-gray-200 rounded w-3/4 mb-1" }), /* @__PURE__ */ React20__default.default.createElement("div", { className: "h-3 bg-gray-200 rounded w-1/2" })))) : categories.length > 0 ? /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6" }, categories.map((category) => /* @__PURE__ */ React20__default.default.createElement(
|
|
11060
11081
|
Link8__default.default,
|
|
11061
11082
|
{
|
|
11062
11083
|
key: category.id,
|
|
11063
11084
|
href: `/shop?category=${category.name}`,
|
|
11064
11085
|
className: "group block overflow-hidden rounded-xl border border-gray-100 bg-white p-4 text-center transition hover:shadow-lg hover:border-primary-500"
|
|
11065
11086
|
},
|
|
11066
|
-
/* @__PURE__ */
|
|
11087
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "relative aspect-square w-full overflow-hidden rounded-lg bg-gray-50 mb-3" }, category.image ? /* @__PURE__ */ React20__default.default.createElement(
|
|
11067
11088
|
Image3__default.default,
|
|
11068
11089
|
{
|
|
11069
11090
|
src: category.image,
|
|
@@ -11072,10 +11093,10 @@ function CategoriesScreen() {
|
|
|
11072
11093
|
className: "object-cover transition-transform group-hover:scale-105",
|
|
11073
11094
|
sizes: "(max-width: 768px) 50vw, (max-width: 1200px) 33vw, 25vw"
|
|
11074
11095
|
}
|
|
11075
|
-
) : /* @__PURE__ */
|
|
11076
|
-
/* @__PURE__ */
|
|
11077
|
-
category.productCount > 0 && /* @__PURE__ */
|
|
11078
|
-
))) : /* @__PURE__ */
|
|
11096
|
+
) : /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex h-full w-full items-center justify-center bg-gray-100 text-gray-400" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Package, { className: "h-12 w-12" }))),
|
|
11097
|
+
/* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-lg font-semibold text-gray-900 group-hover:text-primary-600 transition-colors" }, category.name),
|
|
11098
|
+
category.productCount > 0 && /* @__PURE__ */ React20__default.default.createElement("p", { className: "mt-1 text-sm text-gray-500" }, category.productCount, " ", category.productCount === 1 ? "product" : "products")
|
|
11099
|
+
))) : /* @__PURE__ */ React20__default.default.createElement(
|
|
11079
11100
|
EmptyState,
|
|
11080
11101
|
{
|
|
11081
11102
|
title: "No categories found",
|
|
@@ -11089,7 +11110,7 @@ function CategoriesScreen() {
|
|
|
11089
11110
|
}
|
|
11090
11111
|
function NewAddressPage() {
|
|
11091
11112
|
const router = navigation.useRouter();
|
|
11092
|
-
const [isSubmitting, setIsSubmitting] =
|
|
11113
|
+
const [isSubmitting, setIsSubmitting] = React20.useState(false);
|
|
11093
11114
|
const {
|
|
11094
11115
|
register,
|
|
11095
11116
|
handleSubmit,
|
|
@@ -11231,9 +11252,9 @@ function Header() {
|
|
|
11231
11252
|
const { cart } = useCart() || { cart: { } };
|
|
11232
11253
|
const { getWishlistCount } = useWishlist();
|
|
11233
11254
|
const wishlistCount = getWishlistCount?.() || 0;
|
|
11234
|
-
const [isMobileMenuOpen, setIsMobileMenuOpen] =
|
|
11235
|
-
const [isSearchOpen, setIsSearchOpen] =
|
|
11236
|
-
const [searchQuery, setSearchQuery] =
|
|
11255
|
+
const [isMobileMenuOpen, setIsMobileMenuOpen] = React20.useState(false);
|
|
11256
|
+
const [isSearchOpen, setIsSearchOpen] = React20.useState(false);
|
|
11257
|
+
const [searchQuery, setSearchQuery] = React20.useState("");
|
|
11237
11258
|
const navLinks = [
|
|
11238
11259
|
{ href: "/shop", label: "Shop" },
|
|
11239
11260
|
{ href: "/categories", label: "Categories" },
|
|
@@ -11241,7 +11262,7 @@ function Header() {
|
|
|
11241
11262
|
{ href: "/about", label: "About" },
|
|
11242
11263
|
{ href: "/contact", label: "Contact" }
|
|
11243
11264
|
];
|
|
11244
|
-
return /* @__PURE__ */
|
|
11265
|
+
return /* @__PURE__ */ React20__default.default.createElement("header", { className: "sticky top-0 z-40 bg-white/80 backdrop-blur-xl border-b border-gray-200 shadow-sm" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center justify-between h-20" }, /* @__PURE__ */ React20__default.default.createElement(Link8__default.default, { href: "/", className: "flex items-center gap-3" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative w-12 h-12" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
11245
11266
|
Image3__default.default,
|
|
11246
11267
|
{
|
|
11247
11268
|
src: config.logo,
|
|
@@ -11249,7 +11270,7 @@ function Header() {
|
|
|
11249
11270
|
fill: true,
|
|
11250
11271
|
className: "object-contain"
|
|
11251
11272
|
}
|
|
11252
|
-
)), /* @__PURE__ */
|
|
11273
|
+
)), /* @__PURE__ */ React20__default.default.createElement("span", { className: "text-2xl font-bold text-gray-900 hidden sm:block" }, config.storeName)), /* @__PURE__ */ React20__default.default.createElement("nav", { className: "hidden lg:flex items-center gap-8" }, navLinks.map((link) => /* @__PURE__ */ React20__default.default.createElement(
|
|
11253
11274
|
Link8__default.default,
|
|
11254
11275
|
{
|
|
11255
11276
|
key: link.href,
|
|
@@ -11257,16 +11278,16 @@ function Header() {
|
|
|
11257
11278
|
className: "text-gray-700 hover:text-primary-600 font-medium transition-colors relative group"
|
|
11258
11279
|
},
|
|
11259
11280
|
link.label,
|
|
11260
|
-
/* @__PURE__ */
|
|
11261
|
-
))), /* @__PURE__ */
|
|
11281
|
+
/* @__PURE__ */ React20__default.default.createElement("span", { className: "absolute bottom-0 left-0 w-0 h-0.5 bg-primary-600 group-hover:w-full transition-all duration-300" })
|
|
11282
|
+
))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
11262
11283
|
"button",
|
|
11263
11284
|
{
|
|
11264
11285
|
onClick: () => setIsSearchOpen(!isSearchOpen),
|
|
11265
11286
|
className: "p-2 hover:bg-gray-100 rounded-lg transition-colors",
|
|
11266
11287
|
"aria-label": "Search"
|
|
11267
11288
|
},
|
|
11268
|
-
/* @__PURE__ */
|
|
11269
|
-
), /* @__PURE__ */
|
|
11289
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Search, { className: "w-5 h-5 text-gray-700" })
|
|
11290
|
+
), /* @__PURE__ */ React20__default.default.createElement(framerMotion.AnimatePresence, null, isSearchOpen && /* @__PURE__ */ React20__default.default.createElement(
|
|
11270
11291
|
framerMotion.motion.div,
|
|
11271
11292
|
{
|
|
11272
11293
|
initial: { opacity: 0, width: 0 },
|
|
@@ -11274,7 +11295,7 @@ function Header() {
|
|
|
11274
11295
|
exit: { opacity: 0, width: 0 },
|
|
11275
11296
|
className: "absolute right-0 top-full mt-2 bg-white rounded-lg shadow-lg overflow-hidden"
|
|
11276
11297
|
},
|
|
11277
|
-
/* @__PURE__ */
|
|
11298
|
+
/* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center p-2 w-64" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Search, { className: "w-5 h-5 text-gray-400 mr-2" }), /* @__PURE__ */ React20__default.default.createElement(
|
|
11278
11299
|
"input",
|
|
11279
11300
|
{
|
|
11280
11301
|
type: "text",
|
|
@@ -11289,36 +11310,36 @@ function Header() {
|
|
|
11289
11310
|
className: "w-full outline-none text-gray-700",
|
|
11290
11311
|
autoFocus: true
|
|
11291
11312
|
}
|
|
11292
|
-
), searchQuery && /* @__PURE__ */
|
|
11313
|
+
), searchQuery && /* @__PURE__ */ React20__default.default.createElement(
|
|
11293
11314
|
"button",
|
|
11294
11315
|
{
|
|
11295
11316
|
onClick: () => setSearchQuery(""),
|
|
11296
11317
|
className: "text-gray-400 hover:text-gray-600"
|
|
11297
11318
|
},
|
|
11298
|
-
/* @__PURE__ */
|
|
11319
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.X, { className: "w-4 h-4" })
|
|
11299
11320
|
))
|
|
11300
|
-
))), /* @__PURE__ */
|
|
11321
|
+
))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ React20__default.default.createElement(Link8__default.default, { href: "/wishlist", className: "relative p-2 text-gray-700 hover:text-red-500 transition-colors" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Heart, { className: "w-6 h-6" }), wishlistCount > 0 && /* @__PURE__ */ React20__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__ */ React20__default.default.createElement(Link8__default.default, { href: "/cart", className: "relative p-2 text-gray-700 hover:text-primary-600 transition-colors" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.ShoppingCart, { className: "w-6 h-6" }), cart?.cartBody?.items?.length && cart.cartBody?.items?.length > 0 ? /* @__PURE__ */ React20__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__ */ React20__default.default.createElement(
|
|
11301
11322
|
Link8__default.default,
|
|
11302
11323
|
{
|
|
11303
11324
|
href: "/account",
|
|
11304
11325
|
className: "p-2 hover:bg-gray-100 rounded-lg transition-colors"
|
|
11305
11326
|
},
|
|
11306
|
-
/* @__PURE__ */
|
|
11307
|
-
) : /* @__PURE__ */
|
|
11327
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.User, { className: "w-6 h-6 text-gray-700" })
|
|
11328
|
+
) : /* @__PURE__ */ React20__default.default.createElement(
|
|
11308
11329
|
Link8__default.default,
|
|
11309
11330
|
{
|
|
11310
11331
|
href: "/login",
|
|
11311
11332
|
className: "hidden sm:block px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors font-medium"
|
|
11312
11333
|
},
|
|
11313
11334
|
"Sign In"
|
|
11314
|
-
)), /* @__PURE__ */
|
|
11335
|
+
)), /* @__PURE__ */ React20__default.default.createElement(
|
|
11315
11336
|
"button",
|
|
11316
11337
|
{
|
|
11317
11338
|
className: "lg:hidden p-2 hover:bg-gray-100 rounded-lg transition-colors",
|
|
11318
11339
|
onClick: () => setIsMobileMenuOpen(!isMobileMenuOpen)
|
|
11319
11340
|
},
|
|
11320
|
-
isMobileMenuOpen ? /* @__PURE__ */
|
|
11321
|
-
)), /* @__PURE__ */
|
|
11341
|
+
isMobileMenuOpen ? /* @__PURE__ */ React20__default.default.createElement(lucideReact.X, { className: "w-6 h-6" }) : /* @__PURE__ */ React20__default.default.createElement(lucideReact.Menu, { className: "w-6 h-6" })
|
|
11342
|
+
)), /* @__PURE__ */ React20__default.default.createElement(framerMotion.AnimatePresence, null, isMobileMenuOpen && /* @__PURE__ */ React20__default.default.createElement(
|
|
11322
11343
|
framerMotion.motion.div,
|
|
11323
11344
|
{
|
|
11324
11345
|
initial: { opacity: 0, height: 0 },
|
|
@@ -11326,7 +11347,7 @@ function Header() {
|
|
|
11326
11347
|
exit: { opacity: 0, height: 0 },
|
|
11327
11348
|
className: "lg:hidden overflow-hidden border-t border-gray-200"
|
|
11328
11349
|
},
|
|
11329
|
-
/* @__PURE__ */
|
|
11350
|
+
/* @__PURE__ */ React20__default.default.createElement("nav", { className: "flex flex-col gap-1 py-2" }, navLinks.map((link) => /* @__PURE__ */ React20__default.default.createElement(
|
|
11330
11351
|
Link8__default.default,
|
|
11331
11352
|
{
|
|
11332
11353
|
key: link.href,
|
|
@@ -11335,7 +11356,7 @@ function Header() {
|
|
|
11335
11356
|
onClick: () => setIsMobileMenuOpen(false)
|
|
11336
11357
|
},
|
|
11337
11358
|
link.label
|
|
11338
|
-
)), !isAuthenticated && /* @__PURE__ */
|
|
11359
|
+
)), !isAuthenticated && /* @__PURE__ */ React20__default.default.createElement(
|
|
11339
11360
|
Link8__default.default,
|
|
11340
11361
|
{
|
|
11341
11362
|
href: "/login",
|
|
@@ -11367,48 +11388,48 @@ function Footer() {
|
|
|
11367
11388
|
{ label: "Shipping Info", href: "/shipping" },
|
|
11368
11389
|
{ label: "Returns", href: "/returns" }
|
|
11369
11390
|
]};
|
|
11370
|
-
return /* @__PURE__ */
|
|
11391
|
+
return /* @__PURE__ */ React20__default.default.createElement("footer", { className: "bg-gray-900 text-gray-300" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "container mx-auto px-4 py-16" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-12" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "lg:col-span-2" }, /* @__PURE__ */ React20__default.default.createElement("h3", { className: "text-2xl font-bold text-white mb-4" }, config.storeName), /* @__PURE__ */ React20__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__ */ React20__default.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Mail, { className: "w-5 h-5 text-primary-500" }), /* @__PURE__ */ React20__default.default.createElement("span", null, "support@", config.storeName.toLowerCase().replace(/\s+/g, ""), ".com")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.Phone, { className: "w-5 h-5 text-primary-500" }), /* @__PURE__ */ React20__default.default.createElement("span", null, "+1 (555) 123-4567")), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React20__default.default.createElement(lucideReact.MapPin, { className: "w-5 h-5 text-primary-500" }), /* @__PURE__ */ React20__default.default.createElement("span", null, "123 Store Street, City, Country")))), /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("h4", { className: "text-lg font-semibold text-white mb-4" }, "Shop"), /* @__PURE__ */ React20__default.default.createElement("ul", { className: "space-y-2" }, footerLinks.shop.map((link) => /* @__PURE__ */ React20__default.default.createElement("li", { key: link.href }, /* @__PURE__ */ React20__default.default.createElement(
|
|
11371
11392
|
Link8__default.default,
|
|
11372
11393
|
{
|
|
11373
11394
|
href: link.href,
|
|
11374
11395
|
className: "hover:text-primary-500 transition-colors"
|
|
11375
11396
|
},
|
|
11376
11397
|
link.label
|
|
11377
|
-
))))), /* @__PURE__ */
|
|
11398
|
+
))))), /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("h4", { className: "text-lg font-semibold text-white mb-4" }, "Account"), /* @__PURE__ */ React20__default.default.createElement("ul", { className: "space-y-2" }, footerLinks.account.map((link) => /* @__PURE__ */ React20__default.default.createElement("li", { key: link.href }, /* @__PURE__ */ React20__default.default.createElement(
|
|
11378
11399
|
Link8__default.default,
|
|
11379
11400
|
{
|
|
11380
11401
|
href: link.href,
|
|
11381
11402
|
className: "hover:text-primary-500 transition-colors"
|
|
11382
11403
|
},
|
|
11383
11404
|
link.label
|
|
11384
|
-
))))), /* @__PURE__ */
|
|
11405
|
+
))))), /* @__PURE__ */ React20__default.default.createElement("div", null, /* @__PURE__ */ React20__default.default.createElement("h4", { className: "text-lg font-semibold text-white mb-4" }, "Support"), /* @__PURE__ */ React20__default.default.createElement("ul", { className: "space-y-2" }, footerLinks.support.map((link) => /* @__PURE__ */ React20__default.default.createElement("li", { key: link.href }, /* @__PURE__ */ React20__default.default.createElement(
|
|
11385
11406
|
Link8__default.default,
|
|
11386
11407
|
{
|
|
11387
11408
|
href: link.href,
|
|
11388
11409
|
className: "hover:text-primary-500 transition-colors"
|
|
11389
11410
|
},
|
|
11390
11411
|
link.label
|
|
11391
|
-
)))))), /* @__PURE__ */
|
|
11412
|
+
)))))), /* @__PURE__ */ React20__default.default.createElement("div", { className: "border-t border-gray-800 mt-12 pt-8 flex flex-col md:flex-row justify-between items-center gap-4" }, /* @__PURE__ */ React20__default.default.createElement("p", { className: "text-gray-400 text-sm" }, "\xA9 ", (/* @__PURE__ */ new Date()).getFullYear(), " ", config.storeName, ". All rights reserved."), /* @__PURE__ */ React20__default.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ React20__default.default.createElement(
|
|
11392
11413
|
"a",
|
|
11393
11414
|
{
|
|
11394
11415
|
href: "#",
|
|
11395
11416
|
className: "w-10 h-10 bg-gray-800 hover:bg-primary-600 rounded-full flex items-center justify-center transition-colors"
|
|
11396
11417
|
},
|
|
11397
|
-
/* @__PURE__ */
|
|
11398
|
-
), /* @__PURE__ */
|
|
11418
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Facebook, { className: "w-5 h-5" })
|
|
11419
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
11399
11420
|
"a",
|
|
11400
11421
|
{
|
|
11401
11422
|
href: "#",
|
|
11402
11423
|
className: "w-10 h-10 bg-gray-800 hover:bg-primary-600 rounded-full flex items-center justify-center transition-colors"
|
|
11403
11424
|
},
|
|
11404
|
-
/* @__PURE__ */
|
|
11405
|
-
), /* @__PURE__ */
|
|
11425
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Twitter, { className: "w-5 h-5" })
|
|
11426
|
+
), /* @__PURE__ */ React20__default.default.createElement(
|
|
11406
11427
|
"a",
|
|
11407
11428
|
{
|
|
11408
11429
|
href: "#",
|
|
11409
11430
|
className: "w-10 h-10 bg-gray-800 hover:bg-primary-600 rounded-full flex items-center justify-center transition-colors"
|
|
11410
11431
|
},
|
|
11411
|
-
/* @__PURE__ */
|
|
11432
|
+
/* @__PURE__ */ React20__default.default.createElement(lucideReact.Instagram, { className: "w-5 h-5" })
|
|
11412
11433
|
)))));
|
|
11413
11434
|
}
|
|
11414
11435
|
|
|
@@ -11454,6 +11475,7 @@ exports.initializeApiAdapter = initializeApiAdapter;
|
|
|
11454
11475
|
exports.truncate = truncate;
|
|
11455
11476
|
exports.useAddresses = useAddresses;
|
|
11456
11477
|
exports.useAuth = useAuth;
|
|
11478
|
+
exports.useBasePath = useBasePath;
|
|
11457
11479
|
exports.useCart = useCart;
|
|
11458
11480
|
exports.useCategories = useCategories;
|
|
11459
11481
|
exports.useCurrentOrders = useCurrentOrders;
|