@enadhq/enad-react-sdk 0.0.6
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/client/cart/components/cart-drawer.d.mts +19 -0
- package/dist/client/cart/components/cart-drawer.mjs +180 -0
- package/dist/client/cart/components/cart-drawer.mjs.map +1 -0
- package/dist/client/cart/components/cart-trigger.d.mts +5 -0
- package/dist/client/cart/components/cart-trigger.mjs +18 -0
- package/dist/client/cart/components/cart-trigger.mjs.map +1 -0
- package/dist/client/cart/constants/session.d.mts +3 -0
- package/dist/client/cart/constants/session.mjs +5 -0
- package/dist/client/cart/constants/session.mjs.map +1 -0
- package/dist/client/cart/contexts/cart.d.mts +27 -0
- package/dist/client/cart/contexts/cart.mjs +22 -0
- package/dist/client/cart/contexts/cart.mjs.map +1 -0
- package/dist/client/cart/hooks/useCart.d.mts +29 -0
- package/dist/client/cart/hooks/useCart.mjs +26 -0
- package/dist/client/cart/hooks/useCart.mjs.map +1 -0
- package/dist/client/cart/hooks/useCartActions.d.mts +26 -0
- package/dist/client/cart/hooks/useCartActions.mjs +58 -0
- package/dist/client/cart/hooks/useCartActions.mjs.map +1 -0
- package/dist/client/cart/queries/addToCartQueryFn.d.mts +10 -0
- package/dist/client/cart/queries/addToCartQueryFn.mjs +27 -0
- package/dist/client/cart/queries/addToCartQueryFn.mjs.map +1 -0
- package/dist/client/cart/queries/getCartQueryFn.d.mts +7 -0
- package/dist/client/cart/queries/getCartQueryFn.mjs +34 -0
- package/dist/client/cart/queries/getCartQueryFn.mjs.map +1 -0
- package/dist/client/cart/queries/removeCartItemQueryFn.d.mts +9 -0
- package/dist/client/cart/queries/removeCartItemQueryFn.mjs +24 -0
- package/dist/client/cart/queries/removeCartItemQueryFn.mjs.map +1 -0
- package/dist/client/cart/queries/updateCartItemQueryFn.d.mts +10 -0
- package/dist/client/cart/queries/updateCartItemQueryFn.mjs +27 -0
- package/dist/client/cart/queries/updateCartItemQueryFn.mjs.map +1 -0
- package/dist/client/cart/types/cart.d.mts +36 -0
- package/dist/client/cart/types/cart.mjs +1 -0
- package/dist/client/cart/types/cart.mjs.map +1 -0
- package/dist/client/cart/utils/session.d.mts +6 -0
- package/dist/client/cart/utils/session.mjs +21 -0
- package/dist/client/cart/utils/session.mjs.map +1 -0
- package/dist/client/cms/storyblok/preview/registerStoryblokBridge.d.mts +6 -0
- package/dist/client/cms/storyblok/preview/registerStoryblokBridge.mjs +24 -0
- package/dist/client/cms/storyblok/preview/registerStoryblokBridge.mjs.map +1 -0
- package/dist/client/cms/storyblok/preview/storyblok-preview-syncer.d.mts +22 -0
- package/dist/client/cms/storyblok/preview/storyblok-preview-syncer.mjs +79 -0
- package/dist/client/cms/storyblok/preview/storyblok-preview-syncer.mjs.map +1 -0
- package/dist/client/global/auth/withAuth.d.mts +6 -0
- package/dist/client/global/auth/withAuth.mjs +25 -0
- package/dist/client/global/auth/withAuth.mjs.map +1 -0
- package/dist/client/global/config/index.d.mts +17 -0
- package/dist/client/global/config/index.mjs +34 -0
- package/dist/client/global/config/index.mjs.map +1 -0
- package/dist/client/global/constants/tags.d.mts +16 -0
- package/dist/client/global/constants/tags.mjs +18 -0
- package/dist/client/global/constants/tags.mjs.map +1 -0
- package/dist/client/global/providers/enad-provider.d.mts +23 -0
- package/dist/client/global/providers/enad-provider.mjs +11 -0
- package/dist/client/global/providers/enad-provider.mjs.map +1 -0
- package/dist/client/search/actions/searchAction.d.mts +5 -0
- package/dist/client/search/actions/searchAction.mjs +18 -0
- package/dist/client/search/actions/searchAction.mjs.map +1 -0
- package/dist/client/search/components/search-bar.d.mts +2 -0
- package/dist/client/search/components/search-bar.mjs +1 -0
- package/dist/client/search/components/search-bar.mjs.map +1 -0
- package/dist/client/search/hooks/useSearch.d.mts +18 -0
- package/dist/client/search/hooks/useSearch.mjs +37 -0
- package/dist/client/search/hooks/useSearch.mjs.map +1 -0
- package/dist/client/user/actions/createResetPasswordLinkAction.d.mts +14 -0
- package/dist/client/user/actions/createResetPasswordLinkAction.mjs +30 -0
- package/dist/client/user/actions/createResetPasswordLinkAction.mjs.map +1 -0
- package/dist/client/user/actions/getUserAction.d.mts +5 -0
- package/dist/client/user/actions/getUserAction.mjs +19 -0
- package/dist/client/user/actions/getUserAction.mjs.map +1 -0
- package/dist/client/user/actions/logInUserAction.d.mts +15 -0
- package/dist/client/user/actions/logInUserAction.mjs +34 -0
- package/dist/client/user/actions/logInUserAction.mjs.map +1 -0
- package/dist/client/user/actions/logoutUserAction.d.mts +3 -0
- package/dist/client/user/actions/logoutUserAction.mjs +10 -0
- package/dist/client/user/actions/logoutUserAction.mjs.map +1 -0
- package/dist/client/user/actions/registerOrganisationAction.d.mts +12 -0
- package/dist/client/user/actions/registerOrganisationAction.mjs +18 -0
- package/dist/client/user/actions/registerOrganisationAction.mjs.map +1 -0
- package/dist/client/user/actions/registerUserAction.d.mts +18 -0
- package/dist/client/user/actions/registerUserAction.mjs +42 -0
- package/dist/client/user/actions/registerUserAction.mjs.map +1 -0
- package/dist/client/user/actions/registerUserWithoutRedirectAction.d.mts +44 -0
- package/dist/client/user/actions/registerUserWithoutRedirectAction.mjs +58 -0
- package/dist/client/user/actions/registerUserWithoutRedirectAction.mjs.map +1 -0
- package/dist/client/user/actions/updatePasswordAction.d.mts +21 -0
- package/dist/client/user/actions/updatePasswordAction.mjs +37 -0
- package/dist/client/user/actions/updatePasswordAction.mjs.map +1 -0
- package/dist/client/user/api/userRoute.d.mts +9 -0
- package/dist/client/user/api/userRoute.mjs +65 -0
- package/dist/client/user/api/userRoute.mjs.map +1 -0
- package/dist/client/user/clients/enad.d.mts +6 -0
- package/dist/client/user/clients/enad.mjs +19 -0
- package/dist/client/user/clients/enad.mjs.map +1 -0
- package/dist/client/user/components/login-form.d.mts +20 -0
- package/dist/client/user/components/login-form.mjs +113 -0
- package/dist/client/user/components/login-form.mjs.map +1 -0
- package/dist/client/user/components/reset-password-form.d.mts +15 -0
- package/dist/client/user/components/reset-password-form.mjs +86 -0
- package/dist/client/user/components/reset-password-form.mjs.map +1 -0
- package/dist/client/user/components/sign-out.d.mts +5 -0
- package/dist/client/user/components/sign-out.mjs +23 -0
- package/dist/client/user/components/sign-out.mjs.map +1 -0
- package/dist/client/user/components/signup-form.d.mts +15 -0
- package/dist/client/user/components/signup-form.mjs +155 -0
- package/dist/client/user/components/signup-form.mjs.map +1 -0
- package/dist/client/user/components/signup-organisation-form.d.mts +20 -0
- package/dist/client/user/components/signup-organisation-form.mjs +813 -0
- package/dist/client/user/components/signup-organisation-form.mjs.map +1 -0
- package/dist/client/user/components/update-password-form.d.mts +11 -0
- package/dist/client/user/components/update-password-form.mjs +69 -0
- package/dist/client/user/components/update-password-form.mjs.map +1 -0
- package/dist/client/user/hooks/index.d.mts +3 -0
- package/dist/client/user/hooks/index.mjs +2 -0
- package/dist/client/user/hooks/index.mjs.map +1 -0
- package/dist/client/user/hooks/useUser.d.mts +16 -0
- package/dist/client/user/hooks/useUser.mjs +32 -0
- package/dist/client/user/hooks/useUser.mjs.map +1 -0
- package/dist/client/user/types/user.d.mts +202 -0
- package/dist/client/user/types/user.mjs +1 -0
- package/dist/client/user/types/user.mjs.map +1 -0
- package/dist/client/user/utils/userCookieService.d.mts +20 -0
- package/dist/client/user/utils/userCookieService.mjs +51 -0
- package/dist/client/user/utils/userCookieService.mjs.map +1 -0
- package/dist/client/wishlist/actions/addItemsToWishlistAction.d.mts +7 -0
- package/dist/client/wishlist/actions/addItemsToWishlistAction.mjs +20 -0
- package/dist/client/wishlist/actions/addItemsToWishlistAction.mjs.map +1 -0
- package/dist/client/wishlist/actions/createOrGetShareTokenAction.d.mts +6 -0
- package/dist/client/wishlist/actions/createOrGetShareTokenAction.mjs +20 -0
- package/dist/client/wishlist/actions/createOrGetShareTokenAction.mjs.map +1 -0
- package/dist/client/wishlist/actions/createWishlistAction.d.mts +6 -0
- package/dist/client/wishlist/actions/createWishlistAction.mjs +16 -0
- package/dist/client/wishlist/actions/createWishlistAction.mjs.map +1 -0
- package/dist/client/wishlist/actions/deleteItemsFromWishlistAction.d.mts +7 -0
- package/dist/client/wishlist/actions/deleteItemsFromWishlistAction.mjs +20 -0
- package/dist/client/wishlist/actions/deleteItemsFromWishlistAction.mjs.map +1 -0
- package/dist/client/wishlist/actions/deleteWishlistAction.d.mts +5 -0
- package/dist/client/wishlist/actions/deleteWishlistAction.mjs +16 -0
- package/dist/client/wishlist/actions/deleteWishlistAction.mjs.map +1 -0
- package/dist/client/wishlist/actions/getSharedWishlistAction.d.mts +6 -0
- package/dist/client/wishlist/actions/getSharedWishlistAction.mjs +20 -0
- package/dist/client/wishlist/actions/getSharedWishlistAction.mjs.map +1 -0
- package/dist/client/wishlist/actions/getSpecificWishlistAction.d.mts +6 -0
- package/dist/client/wishlist/actions/getSpecificWishlistAction.mjs +20 -0
- package/dist/client/wishlist/actions/getSpecificWishlistAction.mjs.map +1 -0
- package/dist/client/wishlist/actions/getUserWishlists.d.mts +7 -0
- package/dist/client/wishlist/actions/getUserWishlists.mjs +25 -0
- package/dist/client/wishlist/actions/getUserWishlists.mjs.map +1 -0
- package/dist/client/wishlist/actions/revokeShareTokenAction.d.mts +5 -0
- package/dist/client/wishlist/actions/revokeShareTokenAction.mjs +20 -0
- package/dist/client/wishlist/actions/revokeShareTokenAction.mjs.map +1 -0
- package/dist/client/wishlist/actions/updateWishlistAction.d.mts +6 -0
- package/dist/client/wishlist/actions/updateWishlistAction.mjs +20 -0
- package/dist/client/wishlist/actions/updateWishlistAction.mjs.map +1 -0
- package/dist/client/wishlist/hooks/index.d.mts +3 -0
- package/dist/client/wishlist/hooks/index.mjs +2 -0
- package/dist/client/wishlist/hooks/index.mjs.map +1 -0
- package/dist/client/wishlist/hooks/useWishlist.d.mts +98 -0
- package/dist/client/wishlist/hooks/useWishlist.mjs +66 -0
- package/dist/client/wishlist/hooks/useWishlist.mjs.map +1 -0
- package/dist/client/wishlist/hooks/useWishlistActions.d.mts +48 -0
- package/dist/client/wishlist/hooks/useWishlistActions.mjs +101 -0
- package/dist/client/wishlist/hooks/useWishlistActions.mjs.map +1 -0
- package/dist/client/wishlist/wishlist-drawer.d.mts +19 -0
- package/dist/client/wishlist/wishlist-drawer.mjs +180 -0
- package/dist/client/wishlist/wishlist-drawer.mjs.map +1 -0
- package/dist/styles.css +959 -0
- package/package.json +64 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface CartDrawerProps {
|
|
4
|
+
isOpen: boolean;
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
labels?: {
|
|
7
|
+
title?: string;
|
|
8
|
+
emptyCartMessage?: string;
|
|
9
|
+
continueShopping?: string;
|
|
10
|
+
subtotal?: string;
|
|
11
|
+
discount?: string;
|
|
12
|
+
tax?: string;
|
|
13
|
+
total?: string;
|
|
14
|
+
proceedToCheckout?: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
declare function CartDrawer({ isOpen, onClose, labels }: CartDrawerProps): react_jsx_runtime.JSX.Element;
|
|
18
|
+
|
|
19
|
+
export { CartDrawer };
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { X, Minus, Plus, Trash2 } from "lucide-react";
|
|
4
|
+
import Link from "next/link";
|
|
5
|
+
import { useCart } from "../../cart/hooks/useCart";
|
|
6
|
+
const Button = ({
|
|
7
|
+
variant = "default",
|
|
8
|
+
size = "default",
|
|
9
|
+
className = "",
|
|
10
|
+
children,
|
|
11
|
+
...props
|
|
12
|
+
}) => {
|
|
13
|
+
const baseClasses = "inline-flex items-center justify-center font-medium transition-colors disabled:opacity-50 disabled:pointer-events-none";
|
|
14
|
+
const variantClasses = {
|
|
15
|
+
default: "bg-(--enad-button-bg) text-(--enad-button-color) hover:bg-(--enad-button-hover-bg)",
|
|
16
|
+
ghost: "bg-transparent hover:bg-(--enad-border-color)",
|
|
17
|
+
outline: "border border-(--enad-border-color) bg-transparent hover:bg-(--enad-border-color)"
|
|
18
|
+
};
|
|
19
|
+
const sizeClasses = {
|
|
20
|
+
default: "h-10 px-4 py-2 rounded-(--enad-border-radius)",
|
|
21
|
+
lg: "h-12 px-6 py-3 rounded-(--enad-border-radius)",
|
|
22
|
+
icon: "h-5 w-5 rounded-(--enad-border-radius)"
|
|
23
|
+
};
|
|
24
|
+
return /* @__PURE__ */ jsx(
|
|
25
|
+
"button",
|
|
26
|
+
{
|
|
27
|
+
className: `${baseClasses} ${variantClasses[variant]} ${sizeClasses[size]} ${className}`,
|
|
28
|
+
...props,
|
|
29
|
+
children
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
};
|
|
33
|
+
function CartDrawer({ isOpen, onClose, labels = {} }) {
|
|
34
|
+
const {
|
|
35
|
+
title = "Shopping Cart",
|
|
36
|
+
emptyCartMessage = "Your cart is empty",
|
|
37
|
+
continueShopping = "Continue Shopping",
|
|
38
|
+
subtotal = "Subtotal",
|
|
39
|
+
discount = "Discount",
|
|
40
|
+
tax = "Tax",
|
|
41
|
+
total = "Total",
|
|
42
|
+
proceedToCheckout = "Proceed to Checkout"
|
|
43
|
+
} = labels;
|
|
44
|
+
const { cart, removeItem, updateItem } = useCart();
|
|
45
|
+
const items = cart?.items || [];
|
|
46
|
+
const totals = cart?.totals;
|
|
47
|
+
const handleUpdateQuantity = (itemId, newQuantity) => {
|
|
48
|
+
updateItem({ itemId, quantity: newQuantity });
|
|
49
|
+
};
|
|
50
|
+
const handleRemoveItem = (itemId) => {
|
|
51
|
+
removeItem({ itemId });
|
|
52
|
+
};
|
|
53
|
+
const formatPrice = (amount) => {
|
|
54
|
+
return `${(amount / 100).toFixed(2)} ${cart?.currencyCode || "USD"}`;
|
|
55
|
+
};
|
|
56
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
57
|
+
/* @__PURE__ */ jsx(
|
|
58
|
+
"div",
|
|
59
|
+
{
|
|
60
|
+
className: `fixed font-enad inset-0 bg-black/60 backdrop-blur-sm z-50 transition-opacity duration-300 ${isOpen ? "opacity-100" : "opacity-0 pointer-events-none"}`,
|
|
61
|
+
onClick: onClose
|
|
62
|
+
}
|
|
63
|
+
),
|
|
64
|
+
/* @__PURE__ */ jsx(
|
|
65
|
+
"div",
|
|
66
|
+
{
|
|
67
|
+
className: `fixed top-0 right-0 h-full w-full md:w-[480px] bg-(--enad-surface) z-50 transform transition-transform duration-300 ease-in-out ${isOpen ? "translate-x-0" : "translate-x-full"}`,
|
|
68
|
+
children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col h-full", children: [
|
|
69
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between p-6", children: [
|
|
70
|
+
/* @__PURE__ */ jsx(
|
|
71
|
+
"h2",
|
|
72
|
+
{
|
|
73
|
+
className: "text-xl font-bold tracking-wider uppercase text-(--enad-text-primary-color)",
|
|
74
|
+
style: { fontFamily: "var(--font-oswald)" },
|
|
75
|
+
children: title
|
|
76
|
+
}
|
|
77
|
+
),
|
|
78
|
+
/* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon", onClick: onClose, children: /* @__PURE__ */ jsx(X, { className: "h-5 w-5" }) })
|
|
79
|
+
] }),
|
|
80
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto p-6", children: items.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center h-full text-center", children: [
|
|
81
|
+
/* @__PURE__ */ jsx("p", { className: "text-(--enad-text-muted-color) mb-4", children: emptyCartMessage }),
|
|
82
|
+
/* @__PURE__ */ jsx(Button, { onClick: onClose, variant: "outline", children: continueShopping })
|
|
83
|
+
] }) : /* @__PURE__ */ jsx("div", { className: "space-y-6", children: items.map((item) => /* @__PURE__ */ jsxs("div", { className: "flex gap-4", children: [
|
|
84
|
+
/* @__PURE__ */ jsx("div", { className: "relative w-24 h-24 flex-shrink-0 bg-(--enad-border-color) rounded-(--enad-border-radius) overflow-hidden", children: item.imageUrl ? /* @__PURE__ */ jsx(
|
|
85
|
+
"img",
|
|
86
|
+
{
|
|
87
|
+
src: item.imageUrl || "/placeholder.svg",
|
|
88
|
+
alt: item.displayName,
|
|
89
|
+
className: "object-cover"
|
|
90
|
+
}
|
|
91
|
+
) : /* @__PURE__ */ jsx("div", { className: "w-full h-full bg-(--enad-border-color)" }) }),
|
|
92
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-1 min-w-0 justify-between flex-col", children: [
|
|
93
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between gap-2 mb-2", children: [
|
|
94
|
+
/* @__PURE__ */ jsx(
|
|
95
|
+
Link,
|
|
96
|
+
{
|
|
97
|
+
href: `/products/${item.customAttributes?.productSlug || item.productVariantId}`,
|
|
98
|
+
className: "font-medium text-sm text-(--enad-link-color) hover:text-(--enad-link-hover-color) transition-colors",
|
|
99
|
+
onClick: onClose,
|
|
100
|
+
children: item.displayName
|
|
101
|
+
}
|
|
102
|
+
),
|
|
103
|
+
/* @__PURE__ */ jsx(
|
|
104
|
+
Button,
|
|
105
|
+
{
|
|
106
|
+
variant: "ghost",
|
|
107
|
+
size: "icon",
|
|
108
|
+
className: "h-5 w-5 flex-shrink-0",
|
|
109
|
+
onClick: () => handleRemoveItem(item.id),
|
|
110
|
+
children: /* @__PURE__ */ jsx(Trash2, { className: "h-4 w-4" })
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
] }),
|
|
114
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
115
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-(--enad-text-muted-color) mb-1", children: formatPrice(item.salePriceAmount) }),
|
|
116
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
117
|
+
/* @__PURE__ */ jsx(
|
|
118
|
+
Button,
|
|
119
|
+
{
|
|
120
|
+
variant: "outline",
|
|
121
|
+
size: "icon",
|
|
122
|
+
className: "h-5 w-5 bg-transparent",
|
|
123
|
+
onClick: () => handleUpdateQuantity(item.id, item.quantity - 1),
|
|
124
|
+
disabled: item.quantity <= 1,
|
|
125
|
+
children: /* @__PURE__ */ jsx(Minus, { className: "h-3 w-3" })
|
|
126
|
+
}
|
|
127
|
+
),
|
|
128
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium w-8 text-center text-(--enad-text-primary-color)", children: item.quantity }),
|
|
129
|
+
/* @__PURE__ */ jsx(
|
|
130
|
+
Button,
|
|
131
|
+
{
|
|
132
|
+
variant: "outline",
|
|
133
|
+
size: "icon",
|
|
134
|
+
className: "h-5 w-5 bg-transparent",
|
|
135
|
+
onClick: () => handleUpdateQuantity(item.id, item.quantity + 1),
|
|
136
|
+
children: /* @__PURE__ */ jsx(Plus, { className: "h-3 w-3" })
|
|
137
|
+
}
|
|
138
|
+
)
|
|
139
|
+
] })
|
|
140
|
+
] })
|
|
141
|
+
] })
|
|
142
|
+
] }, item.id)) }) }),
|
|
143
|
+
items.length > 0 && totals && /* @__PURE__ */ jsxs("div", { className: " p-6 space-y-4", children: [
|
|
144
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm", children: [
|
|
145
|
+
/* @__PURE__ */ jsx("span", { className: "text-(--enad-text-muted-color)", children: subtotal }),
|
|
146
|
+
/* @__PURE__ */ jsx("span", { className: "text-(--enad-text-primary-color)", children: formatPrice(totals.subTotal) })
|
|
147
|
+
] }),
|
|
148
|
+
totals.discountTotal > 0 && /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm", children: [
|
|
149
|
+
/* @__PURE__ */ jsx("span", { className: "text-(--enad-text-muted-color)", children: discount }),
|
|
150
|
+
/* @__PURE__ */ jsxs("span", { className: "text-(--enad-success-color)", children: [
|
|
151
|
+
"-",
|
|
152
|
+
formatPrice(totals.discountTotal)
|
|
153
|
+
] })
|
|
154
|
+
] }),
|
|
155
|
+
totals.taxTotal > 0 && /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm", children: [
|
|
156
|
+
/* @__PURE__ */ jsx("span", { className: "text-(--enad-text-muted-color)", children: tax }),
|
|
157
|
+
/* @__PURE__ */ jsx("span", { className: "text-(--enad-text-primary-color)", children: formatPrice(totals.taxTotal) })
|
|
158
|
+
] }),
|
|
159
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between text-lg font-bold pt-4 border-t border-(--enad-border-color)", children: [
|
|
160
|
+
/* @__PURE__ */ jsx("span", { className: "text-(--enad-text-primary-color)", children: total }),
|
|
161
|
+
/* @__PURE__ */ jsx("span", { className: "text-(--enad-text-primary-color)", children: formatPrice(totals.grandTotal) })
|
|
162
|
+
] }),
|
|
163
|
+
/* @__PURE__ */ jsx(
|
|
164
|
+
Button,
|
|
165
|
+
{
|
|
166
|
+
className: "w-full py-6 text-sm font-medium uppercase tracking-wider",
|
|
167
|
+
size: "lg",
|
|
168
|
+
children: proceedToCheckout
|
|
169
|
+
}
|
|
170
|
+
)
|
|
171
|
+
] })
|
|
172
|
+
] })
|
|
173
|
+
}
|
|
174
|
+
)
|
|
175
|
+
] });
|
|
176
|
+
}
|
|
177
|
+
export {
|
|
178
|
+
CartDrawer
|
|
179
|
+
};
|
|
180
|
+
//# sourceMappingURL=cart-drawer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/client/cart/components/cart-drawer.tsx"],"sourcesContent":["\"use client\"\n\nimport { X, Minus, Plus, Trash2 } from \"lucide-react\"\nimport Link from \"next/link\"\nimport { useCart } from \"../../cart/hooks/useCart\"\n\ninterface CartDrawerProps {\n isOpen: boolean\n onClose: () => void\n labels?: {\n title?: string\n emptyCartMessage?: string\n continueShopping?: string\n subtotal?: string\n discount?: string\n tax?: string\n total?: string\n proceedToCheckout?: string\n }\n}\n\n// Inline Button Component\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: \"ghost\" | \"outline\" | \"default\"\n size?: \"icon\" | \"lg\" | \"default\"\n children: React.ReactNode\n}\n\nconst Button = ({\n variant = \"default\",\n size = \"default\",\n className = \"\",\n children,\n ...props\n}: ButtonProps) => {\n const baseClasses =\n \"inline-flex items-center justify-center font-medium transition-colors disabled:opacity-50 disabled:pointer-events-none\"\n\n const variantClasses = {\n default: \"bg-(--enad-button-bg) text-(--enad-button-color) hover:bg-(--enad-button-hover-bg)\",\n ghost: \"bg-transparent hover:bg-(--enad-border-color)\",\n outline: \"border border-(--enad-border-color) bg-transparent hover:bg-(--enad-border-color)\",\n }\n\n const sizeClasses = {\n default: \"h-10 px-4 py-2 rounded-(--enad-border-radius)\",\n lg: \"h-12 px-6 py-3 rounded-(--enad-border-radius)\",\n icon: \"h-5 w-5 rounded-(--enad-border-radius)\",\n }\n\n return (\n <button\n className={`${baseClasses} ${variantClasses[variant]} ${sizeClasses[size]} ${className}`}\n {...props}\n >\n {children}\n </button>\n )\n}\n\nexport function CartDrawer({ isOpen, onClose, labels = {} }: CartDrawerProps) {\n const {\n title = \"Shopping Cart\",\n emptyCartMessage = \"Your cart is empty\",\n continueShopping = \"Continue Shopping\",\n subtotal = \"Subtotal\",\n discount = \"Discount\",\n tax = \"Tax\",\n total = \"Total\",\n proceedToCheckout = \"Proceed to Checkout\",\n } = labels\n const { cart, removeItem, updateItem } = useCart()\n\n const items = cart?.items || []\n const totals = cart?.totals\n\n const handleUpdateQuantity = (itemId: string, newQuantity: number) => {\n updateItem({ itemId, quantity: newQuantity })\n }\n\n const handleRemoveItem = (itemId: string) => {\n removeItem({ itemId })\n }\n\n const formatPrice = (amount: number) => {\n return `${(amount / 100).toFixed(2)} ${cart?.currencyCode || \"USD\"}`\n }\n\n return (\n <>\n {/* Backdrop */}\n <div\n className={`fixed font-enad inset-0 bg-black/60 backdrop-blur-sm z-50 transition-opacity duration-300 ${\n isOpen ? \"opacity-100\" : \"opacity-0 pointer-events-none\"\n }`}\n onClick={onClose}\n />\n\n {/* Drawer */}\n <div\n className={`fixed top-0 right-0 h-full w-full md:w-[480px] bg-(--enad-surface) z-50 transform transition-transform duration-300 ease-in-out ${\n isOpen ? \"translate-x-0\" : \"translate-x-full\"\n }`}\n >\n <div className=\"flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between p-6\">\n <h2\n className=\"text-xl font-bold tracking-wider uppercase text-(--enad-text-primary-color)\"\n style={{ fontFamily: \"var(--font-oswald)\" }}\n >\n {title}\n </h2>\n <Button variant=\"ghost\" size=\"icon\" onClick={onClose}>\n <X className=\"h-5 w-5\" />\n </Button>\n </div>\n\n {/* Cart Items */}\n <div className=\"flex-1 overflow-y-auto p-6\">\n {items.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full text-center\">\n <p className=\"text-(--enad-text-muted-color) mb-4\">{emptyCartMessage}</p>\n <Button onClick={onClose} variant=\"outline\">\n {continueShopping}\n </Button>\n </div>\n ) : (\n <div className=\"space-y-6\">\n {items.map((item) => (\n <div key={item.id} className=\"flex gap-4\">\n {/* Product Image */}\n <div className=\"relative w-24 h-24 flex-shrink-0 bg-(--enad-border-color) rounded-(--enad-border-radius) overflow-hidden\">\n {item.imageUrl ? (\n <img\n src={item.imageUrl || \"/placeholder.svg\"}\n alt={item.displayName}\n className=\"object-cover\"\n />\n ) : (\n <div className=\"w-full h-full bg-(--enad-border-color)\" />\n )}\n </div>\n\n {/* Product Info */}\n <div className=\"flex flex-1 min-w-0 justify-between flex-col\">\n <div className=\"flex justify-between gap-2 mb-2\">\n <Link\n href={`/products/${item.customAttributes?.productSlug || item.productVariantId}`}\n className=\"font-medium text-sm text-(--enad-link-color) hover:text-(--enad-link-hover-color) transition-colors\"\n onClick={onClose}\n >\n {item.displayName}\n </Link>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-5 w-5 flex-shrink-0\"\n onClick={() => handleRemoveItem(item.id)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <div>\n <p className=\"text-sm text-(--enad-text-muted-color) mb-1\">\n {formatPrice(item.salePriceAmount)}\n </p>\n\n {/* Quantity Controls */}\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-5 w-5 bg-transparent\"\n onClick={() => handleUpdateQuantity(item.id, item.quantity - 1)}\n disabled={item.quantity <= 1}\n >\n <Minus className=\"h-3 w-3\" />\n </Button>\n <span className=\"text-sm font-medium w-8 text-center text-(--enad-text-primary-color)\">\n {item.quantity}\n </span>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-5 w-5 bg-transparent\"\n onClick={() => handleUpdateQuantity(item.id, item.quantity + 1)}\n >\n <Plus className=\"h-3 w-3\" />\n </Button>\n </div>\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Footer with Totals */}\n {items.length > 0 && totals && (\n <div className=\" p-6 space-y-4\">\n {/* Subtotal */}\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-(--enad-text-muted-color)\">{subtotal}</span>\n <span className=\"text-(--enad-text-primary-color)\">\n {formatPrice(totals.subTotal)}\n </span>\n </div>\n\n {/* Discount */}\n {totals.discountTotal > 0 && (\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-(--enad-text-muted-color)\">{discount}</span>\n <span className=\"text-(--enad-success-color)\">\n -{formatPrice(totals.discountTotal)}\n </span>\n </div>\n )}\n\n {/* Tax */}\n {totals.taxTotal > 0 && (\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-(--enad-text-muted-color)\">{tax}</span>\n <span className=\"text-(--enad-text-primary-color)\">\n {formatPrice(totals.taxTotal)}\n </span>\n </div>\n )}\n\n {/* Total */}\n <div className=\"flex justify-between text-lg font-bold pt-4 border-t border-(--enad-border-color)\">\n <span className=\"text-(--enad-text-primary-color)\">{total}</span>\n <span className=\"text-(--enad-text-primary-color)\">\n {formatPrice(totals.grandTotal)}\n </span>\n </div>\n\n {/* Checkout Button */}\n <Button\n className=\"w-full py-6 text-sm font-medium uppercase tracking-wider\"\n size=\"lg\"\n >\n {proceedToCheckout}\n </Button>\n </div>\n )}\n </div>\n </div>\n </>\n )\n}\n"],"mappings":";AAmDI,SAsCA,UAtCA,KAuDM,YAvDN;AAjDJ,SAAS,GAAG,OAAO,MAAM,cAAc;AACvC,OAAO,UAAU;AACjB,SAAS,eAAe;AAwBxB,MAAM,SAAS,CAAC;AAAA,EACd,UAAU;AAAA,EACV,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,MAAmB;AACjB,QAAM,cACJ;AAEF,QAAM,iBAAiB;AAAA,IACrB,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAEA,QAAM,cAAc;AAAA,IAClB,SAAS;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,EACR;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,WAAW,IAAI,eAAe,OAAO,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,SAAS;AAAA,MACrF,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAEO,SAAS,WAAW,EAAE,QAAQ,SAAS,SAAS,CAAC,EAAE,GAAoB;AAC5E,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,WAAW;AAAA,IACX,WAAW;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,oBAAoB;AAAA,EACtB,IAAI;AACJ,QAAM,EAAE,MAAM,YAAY,WAAW,IAAI,QAAQ;AAEjD,QAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,QAAM,SAAS,MAAM;AAErB,QAAM,uBAAuB,CAAC,QAAgB,gBAAwB;AACpE,eAAW,EAAE,QAAQ,UAAU,YAAY,CAAC;AAAA,EAC9C;AAEA,QAAM,mBAAmB,CAAC,WAAmB;AAC3C,eAAW,EAAE,OAAO,CAAC;AAAA,EACvB;AAEA,QAAM,cAAc,CAAC,WAAmB;AACtC,WAAO,IAAI,SAAS,KAAK,QAAQ,CAAC,CAAC,IAAI,MAAM,gBAAgB,KAAK;AAAA,EACpE;AAEA,SACE,iCAEE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,6FACT,SAAS,gBAAgB,+BAC3B;AAAA,QACA,SAAS;AAAA;AAAA,IACX;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,mIACT,SAAS,kBAAkB,kBAC7B;AAAA,QAEA,+BAAC,SAAI,WAAU,wBAEb;AAAA,+BAAC,SAAI,WAAU,yCACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,EAAE,YAAY,qBAAqB;AAAA,gBAEzC;AAAA;AAAA,YACH;AAAA,YACA,oBAAC,UAAO,SAAQ,SAAQ,MAAK,QAAO,SAAS,SAC3C,8BAAC,KAAE,WAAU,WAAU,GACzB;AAAA,aACF;AAAA,UAGA,oBAAC,SAAI,WAAU,8BACZ,gBAAM,WAAW,IAChB,qBAAC,SAAI,WAAU,gEACb;AAAA,gCAAC,OAAE,WAAU,uCAAuC,4BAAiB;AAAA,YACrE,oBAAC,UAAO,SAAS,SAAS,SAAQ,WAC/B,4BACH;AAAA,aACF,IAEA,oBAAC,SAAI,WAAU,aACZ,gBAAM,IAAI,CAAC,SACV,qBAAC,SAAkB,WAAU,cAE3B;AAAA,gCAAC,SAAI,WAAU,4GACZ,eAAK,WACJ;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK,KAAK,YAAY;AAAA,gBACtB,KAAK,KAAK;AAAA,gBACV,WAAU;AAAA;AAAA,YACZ,IAEA,oBAAC,SAAI,WAAU,0CAAyC,GAE5D;AAAA,YAGA,qBAAC,SAAI,WAAU,gDACb;AAAA,mCAAC,SAAI,WAAU,mCACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,aAAa,KAAK,kBAAkB,eAAe,KAAK,gBAAgB;AAAA,oBAC9E,WAAU;AAAA,oBACV,SAAS;AAAA,oBAER,eAAK;AAAA;AAAA,gBACR;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,SAAS,MAAM,iBAAiB,KAAK,EAAE;AAAA,oBAEvC,8BAAC,UAAO,WAAU,WAAU;AAAA;AAAA,gBAC9B;AAAA,iBACF;AAAA,cAEA,qBAAC,SACC;AAAA,oCAAC,OAAE,WAAU,+CACV,sBAAY,KAAK,eAAe,GACnC;AAAA,gBAGA,qBAAC,SAAI,WAAU,2BACb;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS,MAAM,qBAAqB,KAAK,IAAI,KAAK,WAAW,CAAC;AAAA,sBAC9D,UAAU,KAAK,YAAY;AAAA,sBAE3B,8BAAC,SAAM,WAAU,WAAU;AAAA;AAAA,kBAC7B;AAAA,kBACA,oBAAC,UAAK,WAAU,wEACb,eAAK,UACR;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS,MAAM,qBAAqB,KAAK,IAAI,KAAK,WAAW,CAAC;AAAA,sBAE9D,8BAAC,QAAK,WAAU,WAAU;AAAA;AAAA,kBAC5B;AAAA,mBACF;AAAA,iBACF;AAAA,eACF;AAAA,eA/DQ,KAAK,EAgEf,CACD,GACH,GAEJ;AAAA,UAGC,MAAM,SAAS,KAAK,UACnB,qBAAC,SAAI,WAAU,kBAEb;AAAA,iCAAC,SAAI,WAAU,gCACb;AAAA,kCAAC,UAAK,WAAU,kCAAkC,oBAAS;AAAA,cAC3D,oBAAC,UAAK,WAAU,oCACb,sBAAY,OAAO,QAAQ,GAC9B;AAAA,eACF;AAAA,YAGC,OAAO,gBAAgB,KACtB,qBAAC,SAAI,WAAU,gCACb;AAAA,kCAAC,UAAK,WAAU,kCAAkC,oBAAS;AAAA,cAC3D,qBAAC,UAAK,WAAU,+BAA8B;AAAA;AAAA,gBAC1C,YAAY,OAAO,aAAa;AAAA,iBACpC;AAAA,eACF;AAAA,YAID,OAAO,WAAW,KACjB,qBAAC,SAAI,WAAU,gCACb;AAAA,kCAAC,UAAK,WAAU,kCAAkC,eAAI;AAAA,cACtD,oBAAC,UAAK,WAAU,oCACb,sBAAY,OAAO,QAAQ,GAC9B;AAAA,eACF;AAAA,YAIF,qBAAC,SAAI,WAAU,qFACb;AAAA,kCAAC,UAAK,WAAU,oCAAoC,iBAAM;AAAA,cAC1D,oBAAC,UAAK,WAAU,oCACb,sBAAY,OAAO,UAAU,GAChC;AAAA,eACF;AAAA,YAGA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,MAAK;AAAA,gBAEJ;AAAA;AAAA,YACH;AAAA,aACF;AAAA,WAEJ;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
const CartTrigger = () => {
|
|
5
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
6
|
+
return /* @__PURE__ */ jsx(
|
|
7
|
+
"button",
|
|
8
|
+
{
|
|
9
|
+
className: "mb-4 px-4 py-2 bg-(--enad-button-bg) hover:bg-(--enad-button-hover-bg) text-(--enad-button-color) rounded-(--enad-border-radius)",
|
|
10
|
+
onClick: () => setIsOpen((prev) => !prev),
|
|
11
|
+
children: "Toggle Cart"
|
|
12
|
+
}
|
|
13
|
+
);
|
|
14
|
+
};
|
|
15
|
+
export {
|
|
16
|
+
CartTrigger
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=cart-trigger.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/client/cart/components/cart-trigger.tsx"],"sourcesContent":["\"use client\"\nimport { useState } from \"react\"\n\nexport const CartTrigger = () => {\n const [isOpen, setIsOpen] = useState(false)\n\n return (\n <button\n className=\"mb-4 px-4 py-2 bg-(--enad-button-bg) hover:bg-(--enad-button-hover-bg) text-(--enad-button-color) rounded-(--enad-border-radius)\"\n onClick={() => setIsOpen((prev) => !prev)}\n >\n Toggle Cart\n </button>\n )\n}\n"],"mappings":";AAOI;AANJ,SAAS,gBAAgB;AAElB,MAAM,cAAc,MAAM;AAC/B,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAE1C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS,MAAM,UAAU,CAAC,SAAS,CAAC,IAAI;AAAA,MACzC;AAAA;AAAA,EAED;AAEJ;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/client/cart/constants/session.ts"],"sourcesContent":["export const CART_SESSION_KEY = \"brink_cart_session\"\n"],"mappings":"AAAO,MAAM,mBAAmB;","names":[]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* BrinkConfig defines the configuration needed for the cart context.
|
|
5
|
+
*/
|
|
6
|
+
interface BrinkConfig {
|
|
7
|
+
/**
|
|
8
|
+
* Brink environment identifier.
|
|
9
|
+
*/
|
|
10
|
+
env: string;
|
|
11
|
+
/**
|
|
12
|
+
* Store group identifier.
|
|
13
|
+
*/
|
|
14
|
+
storeGroupId: string;
|
|
15
|
+
/**
|
|
16
|
+
* Country code (e.g., "US").
|
|
17
|
+
*/
|
|
18
|
+
countryCode: string;
|
|
19
|
+
/**
|
|
20
|
+
* Language code (e.g., "en").
|
|
21
|
+
*/
|
|
22
|
+
languageCode: string;
|
|
23
|
+
}
|
|
24
|
+
declare const CartProvider: React__default.FC<React__default.PropsWithChildren<BrinkConfig>>;
|
|
25
|
+
declare const useBrinkConfig: () => BrinkConfig;
|
|
26
|
+
|
|
27
|
+
export { type BrinkConfig, CartProvider, useBrinkConfig };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext } from "react";
|
|
3
|
+
const CartContext = createContext(void 0);
|
|
4
|
+
const CartProvider = ({
|
|
5
|
+
children,
|
|
6
|
+
env,
|
|
7
|
+
storeGroupId,
|
|
8
|
+
countryCode,
|
|
9
|
+
languageCode
|
|
10
|
+
}) => {
|
|
11
|
+
return /* @__PURE__ */ jsx(CartContext.Provider, { value: { env, storeGroupId, countryCode, languageCode }, children });
|
|
12
|
+
};
|
|
13
|
+
const useBrinkConfig = () => {
|
|
14
|
+
const context = useContext(CartContext);
|
|
15
|
+
if (!context) throw new Error("useBrinkConfig must be used inside a CartProvider");
|
|
16
|
+
return context;
|
|
17
|
+
};
|
|
18
|
+
export {
|
|
19
|
+
CartProvider,
|
|
20
|
+
useBrinkConfig
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=cart.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/client/cart/contexts/cart.tsx"],"sourcesContent":["import React, { createContext, useContext } from \"react\"\n\n/**\n * BrinkConfig defines the configuration needed for the cart context.\n */\nexport interface BrinkConfig {\n /**\n * Brink environment identifier.\n */\n env: string\n /**\n * Store group identifier.\n */\n storeGroupId: string\n /**\n * Country code (e.g., \"US\").\n */\n countryCode: string\n /**\n * Language code (e.g., \"en\").\n */\n languageCode: string\n}\n\nconst CartContext = createContext<BrinkConfig | undefined>(undefined)\n\nexport const CartProvider: React.FC<React.PropsWithChildren<BrinkConfig>> = ({\n children,\n env,\n storeGroupId,\n countryCode,\n languageCode,\n}) => {\n return (\n <CartContext.Provider value={{ env, storeGroupId, countryCode, languageCode }}>\n {children}\n </CartContext.Provider>\n )\n}\n\nexport const useBrinkConfig = (): BrinkConfig => {\n const context = useContext(CartContext)\n if (!context) throw new Error(\"useBrinkConfig must be used inside a CartProvider\")\n return context\n}\n"],"mappings":"AAkCI;AAlCJ,SAAgB,eAAe,kBAAkB;AAwBjD,MAAM,cAAc,cAAuC,MAAS;AAE7D,MAAM,eAA+D,CAAC;AAAA,EAC3E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,SACE,oBAAC,YAAY,UAAZ,EAAqB,OAAO,EAAE,KAAK,cAAc,aAAa,aAAa,GACzE,UACH;AAEJ;AAEO,MAAM,iBAAiB,MAAmB;AAC/C,QAAM,UAAU,WAAW,WAAW;AACtC,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,mDAAmD;AACjF,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as _tanstack_react_query from '@tanstack/react-query';
|
|
2
|
+
import { CartResponse, Cart } from '../types/cart.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Hook to manage cart state and actions.
|
|
6
|
+
* Provides the current cart, loading states, and functions to modify the cart.
|
|
7
|
+
*/
|
|
8
|
+
declare const useCart: () => {
|
|
9
|
+
addItem: _tanstack_react_query.UseMutateAsyncFunction<CartResponse, Error, {
|
|
10
|
+
productVariantId: string;
|
|
11
|
+
quantity?: number;
|
|
12
|
+
}, unknown>;
|
|
13
|
+
updateItem: _tanstack_react_query.UseMutateAsyncFunction<CartResponse, Error, {
|
|
14
|
+
itemId: string;
|
|
15
|
+
quantity: number;
|
|
16
|
+
}, unknown>;
|
|
17
|
+
removeItem: _tanstack_react_query.UseMutateAsyncFunction<CartResponse, Error, {
|
|
18
|
+
itemId: string;
|
|
19
|
+
}, unknown>;
|
|
20
|
+
isAdding: boolean;
|
|
21
|
+
isUpdating: boolean;
|
|
22
|
+
isRemoving: boolean;
|
|
23
|
+
cart: Cart | undefined;
|
|
24
|
+
isLoading: boolean;
|
|
25
|
+
isFetching: boolean;
|
|
26
|
+
refreshCart: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<CartResponse, Error>>;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export { useCart };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { useQuery } from "@tanstack/react-query";
|
|
2
|
+
import { CACHE_TAGS } from "../../global/constants/tags";
|
|
3
|
+
import { useBrinkConfig } from "../contexts/cart";
|
|
4
|
+
import { getCartQueryFn } from "../queries/getCartQueryFn";
|
|
5
|
+
import { useCartActions } from "./useCartActions";
|
|
6
|
+
const useCart = () => {
|
|
7
|
+
const brinkConfig = useBrinkConfig();
|
|
8
|
+
const getCartQuery = useQuery({
|
|
9
|
+
queryKey: [CACHE_TAGS.cart],
|
|
10
|
+
queryFn: getCartQueryFn(brinkConfig),
|
|
11
|
+
refetchOnMount: false
|
|
12
|
+
});
|
|
13
|
+
const currentCart = getCartQuery.data;
|
|
14
|
+
const cartActions = useCartActions(brinkConfig, currentCart);
|
|
15
|
+
return {
|
|
16
|
+
cart: currentCart?.cart,
|
|
17
|
+
isLoading: getCartQuery.isLoading,
|
|
18
|
+
isFetching: getCartQuery.isFetching,
|
|
19
|
+
refreshCart: getCartQuery.refetch,
|
|
20
|
+
...cartActions
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
export {
|
|
24
|
+
useCart
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=useCart.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/client/cart/hooks/useCart.tsx"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\"\nimport { CACHE_TAGS } from \"../../global/constants/tags\"\nimport { useBrinkConfig } from \"../contexts/cart\"\nimport { getCartQueryFn } from \"../queries/getCartQueryFn\"\nimport { useCartActions } from \"./useCartActions\"\n\n/**\n * Hook to manage cart state and actions.\n * Provides the current cart, loading states, and functions to modify the cart.\n */\nexport const useCart = () => {\n const brinkConfig = useBrinkConfig()\n\n const getCartQuery = useQuery({\n queryKey: [CACHE_TAGS.cart],\n queryFn: getCartQueryFn(brinkConfig),\n refetchOnMount: false,\n })\n\n const currentCart = getCartQuery.data\n\n const cartActions = useCartActions(brinkConfig, currentCart)\n\n return {\n cart: currentCart?.cart,\n isLoading: getCartQuery.isLoading,\n isFetching: getCartQuery.isFetching,\n refreshCart: getCartQuery.refetch,\n ...cartActions,\n }\n}\n"],"mappings":"AAAA,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAMxB,MAAM,UAAU,MAAM;AAC3B,QAAM,cAAc,eAAe;AAEnC,QAAM,eAAe,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,IAAI;AAAA,IAC1B,SAAS,eAAe,WAAW;AAAA,IACnC,gBAAgB;AAAA,EAClB,CAAC;AAED,QAAM,cAAc,aAAa;AAEjC,QAAM,cAAc,eAAe,aAAa,WAAW;AAE3D,SAAO;AAAA,IACL,MAAM,aAAa;AAAA,IACnB,WAAW,aAAa;AAAA,IACxB,YAAY,aAAa;AAAA,IACzB,aAAa,aAAa;AAAA,IAC1B,GAAG;AAAA,EACL;AACF;","names":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as _tanstack_react_query from '@tanstack/react-query';
|
|
2
|
+
import { BrinkConfig } from '../contexts/cart.mjs';
|
|
3
|
+
import { CartResponse } from '../types/cart.mjs';
|
|
4
|
+
import 'react';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Hook to provide cart action mutations: add, update, and remove items.
|
|
8
|
+
*/
|
|
9
|
+
declare const useCartActions: (brinkConfig: BrinkConfig, currentCart: CartResponse | undefined) => {
|
|
10
|
+
addItem: _tanstack_react_query.UseMutateAsyncFunction<CartResponse, Error, {
|
|
11
|
+
productVariantId: string;
|
|
12
|
+
quantity?: number;
|
|
13
|
+
}, unknown>;
|
|
14
|
+
updateItem: _tanstack_react_query.UseMutateAsyncFunction<CartResponse, Error, {
|
|
15
|
+
itemId: string;
|
|
16
|
+
quantity: number;
|
|
17
|
+
}, unknown>;
|
|
18
|
+
removeItem: _tanstack_react_query.UseMutateAsyncFunction<CartResponse, Error, {
|
|
19
|
+
itemId: string;
|
|
20
|
+
}, unknown>;
|
|
21
|
+
isAdding: boolean;
|
|
22
|
+
isUpdating: boolean;
|
|
23
|
+
isRemoving: boolean;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { useCartActions };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { useMutation, useQueryClient } from "@tanstack/react-query";
|
|
2
|
+
import { CACHE_TAGS } from "../../global/constants/tags";
|
|
3
|
+
import { addToCartQueryFn } from "../queries/addToCartQueryFn";
|
|
4
|
+
import { removeCartItemQueryFn } from "../queries/removeCartItemQueryFn";
|
|
5
|
+
import { updateCartItemFn } from "../queries/updateCartItemQueryFn";
|
|
6
|
+
const useCartActions = (brinkConfig, currentCart) => {
|
|
7
|
+
const queryClient = useQueryClient();
|
|
8
|
+
const addItemMutation = useMutation({
|
|
9
|
+
mutationFn: async ({
|
|
10
|
+
productVariantId,
|
|
11
|
+
quantity = 1
|
|
12
|
+
}) => {
|
|
13
|
+
const existingItem = currentCart?.cart.items.find(
|
|
14
|
+
(i) => i.productVariantId === productVariantId
|
|
15
|
+
);
|
|
16
|
+
if (existingItem) {
|
|
17
|
+
return updateCartItemFn(brinkConfig)({
|
|
18
|
+
itemId: existingItem.id,
|
|
19
|
+
quantity: existingItem.quantity + quantity
|
|
20
|
+
});
|
|
21
|
+
} else {
|
|
22
|
+
return addToCartQueryFn(brinkConfig)({ productVariantId, quantity });
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
onSuccess: (data) => {
|
|
26
|
+
queryClient.setQueryData([CACHE_TAGS.cart], data);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
const updateItemMutation = useMutation({
|
|
30
|
+
mutationFn: async ({ itemId, quantity }) => {
|
|
31
|
+
if (quantity <= 0) {
|
|
32
|
+
return removeCartItemQueryFn(brinkConfig)({ itemId });
|
|
33
|
+
}
|
|
34
|
+
return updateCartItemFn(brinkConfig)({ itemId, quantity });
|
|
35
|
+
},
|
|
36
|
+
onSuccess: (data) => {
|
|
37
|
+
queryClient.setQueryData([CACHE_TAGS.cart], data);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
const removeItemMutation = useMutation({
|
|
41
|
+
mutationFn: async ({ itemId }) => removeCartItemQueryFn(brinkConfig)({ itemId }),
|
|
42
|
+
onSuccess: (data) => {
|
|
43
|
+
queryClient.setQueryData([CACHE_TAGS.cart], data);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
addItem: addItemMutation.mutateAsync,
|
|
48
|
+
updateItem: updateItemMutation.mutateAsync,
|
|
49
|
+
removeItem: removeItemMutation.mutateAsync,
|
|
50
|
+
isAdding: addItemMutation.isPending,
|
|
51
|
+
isUpdating: updateItemMutation.isPending,
|
|
52
|
+
isRemoving: removeItemMutation.isPending
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
export {
|
|
56
|
+
useCartActions
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=useCartActions.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/client/cart/hooks/useCartActions.tsx"],"sourcesContent":["// cartService.ts\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\"\nimport { CACHE_TAGS } from \"../../global/constants/tags\"\nimport { BrinkConfig } from \"../contexts/cart\"\nimport { addToCartQueryFn } from \"../queries/addToCartQueryFn\"\nimport { removeCartItemQueryFn } from \"../queries/removeCartItemQueryFn\"\nimport { updateCartItemFn } from \"../queries/updateCartItemQueryFn\"\nimport { CartResponse } from \"../types/cart\"\n\n/**\n * Hook to provide cart action mutations: add, update, and remove items.\n */\nexport const useCartActions = (brinkConfig: BrinkConfig, currentCart: CartResponse | undefined) => {\n const queryClient = useQueryClient()\n\n // Logic for adding item\n const addItemMutation = useMutation({\n mutationFn: async ({\n productVariantId,\n quantity = 1,\n }: {\n productVariantId: string\n quantity?: number\n }) => {\n const existingItem = currentCart?.cart.items.find(\n (i) => i.productVariantId === productVariantId\n )\n\n // If we already have the item, increment quantity instead of adding a new one.\n if (existingItem) {\n return updateCartItemFn(brinkConfig)({\n itemId: existingItem.id,\n quantity: existingItem.quantity + quantity,\n })\n } else {\n return addToCartQueryFn(brinkConfig)({ productVariantId, quantity })\n }\n },\n onSuccess: (data) => {\n queryClient.setQueryData([CACHE_TAGS.cart], data)\n },\n })\n\n // Update item mutation\n const updateItemMutation = useMutation({\n mutationFn: async ({ itemId, quantity }: { itemId: string; quantity: number }) => {\n // If quantity is zero or less, remove the item\n if (quantity <= 0) {\n return removeCartItemQueryFn(brinkConfig)({ itemId })\n }\n return updateCartItemFn(brinkConfig)({ itemId, quantity })\n },\n onSuccess: (data) => {\n queryClient.setQueryData([CACHE_TAGS.cart], data)\n },\n })\n\n // Remove item mutation\n const removeItemMutation = useMutation({\n mutationFn: async ({ itemId }: { itemId: string }) =>\n removeCartItemQueryFn(brinkConfig)({ itemId }),\n onSuccess: (data) => {\n queryClient.setQueryData([CACHE_TAGS.cart], data)\n },\n })\n\n return {\n addItem: addItemMutation.mutateAsync,\n updateItem: updateItemMutation.mutateAsync,\n removeItem: removeItemMutation.mutateAsync,\n isAdding: addItemMutation.isPending,\n isUpdating: updateItemMutation.isPending,\n isRemoving: removeItemMutation.isPending,\n }\n}\n"],"mappings":"AACA,SAAS,aAAa,sBAAsB;AAC5C,SAAS,kBAAkB;AAE3B,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AACtC,SAAS,wBAAwB;AAM1B,MAAM,iBAAiB,CAAC,aAA0B,gBAA0C;AACjG,QAAM,cAAc,eAAe;AAGnC,QAAM,kBAAkB,YAAY;AAAA,IAClC,YAAY,OAAO;AAAA,MACjB;AAAA,MACA,WAAW;AAAA,IACb,MAGM;AACJ,YAAM,eAAe,aAAa,KAAK,MAAM;AAAA,QAC3C,CAAC,MAAM,EAAE,qBAAqB;AAAA,MAChC;AAGA,UAAI,cAAc;AAChB,eAAO,iBAAiB,WAAW,EAAE;AAAA,UACnC,QAAQ,aAAa;AAAA,UACrB,UAAU,aAAa,WAAW;AAAA,QACpC,CAAC;AAAA,MACH,OAAO;AACL,eAAO,iBAAiB,WAAW,EAAE,EAAE,kBAAkB,SAAS,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,IACA,WAAW,CAAC,SAAS;AACnB,kBAAY,aAAa,CAAC,WAAW,IAAI,GAAG,IAAI;AAAA,IAClD;AAAA,EACF,CAAC;AAGD,QAAM,qBAAqB,YAAY;AAAA,IACrC,YAAY,OAAO,EAAE,QAAQ,SAAS,MAA4C;AAEhF,UAAI,YAAY,GAAG;AACjB,eAAO,sBAAsB,WAAW,EAAE,EAAE,OAAO,CAAC;AAAA,MACtD;AACA,aAAO,iBAAiB,WAAW,EAAE,EAAE,QAAQ,SAAS,CAAC;AAAA,IAC3D;AAAA,IACA,WAAW,CAAC,SAAS;AACnB,kBAAY,aAAa,CAAC,WAAW,IAAI,GAAG,IAAI;AAAA,IAClD;AAAA,EACF,CAAC;AAGD,QAAM,qBAAqB,YAAY;AAAA,IACrC,YAAY,OAAO,EAAE,OAAO,MAC1B,sBAAsB,WAAW,EAAE,EAAE,OAAO,CAAC;AAAA,IAC/C,WAAW,CAAC,SAAS;AACnB,kBAAY,aAAa,CAAC,WAAW,IAAI,GAAG,IAAI;AAAA,IAClD;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,SAAS,gBAAgB;AAAA,IACzB,YAAY,mBAAmB;AAAA,IAC/B,YAAY,mBAAmB;AAAA,IAC/B,UAAU,gBAAgB;AAAA,IAC1B,YAAY,mBAAmB;AAAA,IAC/B,YAAY,mBAAmB;AAAA,EACjC;AACF;","names":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BrinkConfig } from '../contexts/cart.mjs';
|
|
2
|
+
import { CartResponse } from '../types/cart.mjs';
|
|
3
|
+
import 'react';
|
|
4
|
+
|
|
5
|
+
declare const addToCartQueryFn: (brinkConfig: BrinkConfig) => ({ productVariantId, quantity, }: {
|
|
6
|
+
productVariantId: string;
|
|
7
|
+
quantity?: number;
|
|
8
|
+
}) => Promise<CartResponse>;
|
|
9
|
+
|
|
10
|
+
export { addToCartQueryFn };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { CART_SESSION_KEY } from "../constants/session";
|
|
2
|
+
import { getCartSession } from "../utils/session";
|
|
3
|
+
const addToCartQueryFn = (brinkConfig) => {
|
|
4
|
+
const { env } = brinkConfig;
|
|
5
|
+
return async ({
|
|
6
|
+
productVariantId,
|
|
7
|
+
quantity = 1
|
|
8
|
+
}) => {
|
|
9
|
+
const baseUrl = `https://shopper.eu-west-1.${env}.brinkcommerce.io`;
|
|
10
|
+
const res = await fetch(`${baseUrl}/shopper/sessions/items`, {
|
|
11
|
+
method: "POST",
|
|
12
|
+
headers: {
|
|
13
|
+
Authorization: `Bearer ${getCartSession()}`,
|
|
14
|
+
"Content-Type": "application/json"
|
|
15
|
+
},
|
|
16
|
+
body: JSON.stringify({ productVariantId, quantity })
|
|
17
|
+
});
|
|
18
|
+
if (!res.ok) throw new Error("Failed to add item to cart");
|
|
19
|
+
const data = await res.json();
|
|
20
|
+
localStorage.setItem(CART_SESSION_KEY, data.token);
|
|
21
|
+
return data;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export {
|
|
25
|
+
addToCartQueryFn
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=addToCartQueryFn.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/client/cart/queries/addToCartQueryFn.tsx"],"sourcesContent":["import { BrinkConfig } from \"../contexts/cart\"\nimport { CART_SESSION_KEY } from \"../constants/session\"\nimport { getCartSession } from \"../utils/session\"\nimport { CartResponse } from \"../types/cart\"\n\nexport const addToCartQueryFn = (brinkConfig: BrinkConfig) => {\n const { env } = brinkConfig\n\n return async ({\n productVariantId,\n quantity = 1,\n }: {\n productVariantId: string\n quantity?: number\n }): Promise<CartResponse> => {\n const baseUrl = `https://shopper.eu-west-1.${env}.brinkcommerce.io`\n\n const res = await fetch(`${baseUrl}/shopper/sessions/items`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${getCartSession()}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ productVariantId, quantity }),\n })\n\n if (!res.ok) throw new Error(\"Failed to add item to cart\")\n\n const data = (await res.json()) as CartResponse\n localStorage.setItem(CART_SESSION_KEY, data.token)\n\n return data\n }\n}\n"],"mappings":"AACA,SAAS,wBAAwB;AACjC,SAAS,sBAAsB;AAGxB,MAAM,mBAAmB,CAAC,gBAA6B;AAC5D,QAAM,EAAE,IAAI,IAAI;AAEhB,SAAO,OAAO;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,EACb,MAG6B;AAC3B,UAAM,UAAU,6BAA6B,GAAG;AAEhD,UAAM,MAAM,MAAM,MAAM,GAAG,OAAO,2BAA2B;AAAA,MAC3D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,eAAe,CAAC;AAAA,QACzC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,kBAAkB,SAAS,CAAC;AAAA,IACrD,CAAC;AAED,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,4BAA4B;AAEzD,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,iBAAa,QAAQ,kBAAkB,KAAK,KAAK;AAEjD,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { clearCartSession, getCartSession, hasCartSession, setCartSession } from "../utils/session";
|
|
2
|
+
const getCartQueryFn = (brinkConfig) => {
|
|
3
|
+
const { env, storeGroupId, countryCode, languageCode } = brinkConfig;
|
|
4
|
+
return async () => {
|
|
5
|
+
const baseUrl = `https://shopper.eu-west-1.${env}.brinkcommerce.io`;
|
|
6
|
+
const existingToken = hasCartSession() ? getCartSession() : null;
|
|
7
|
+
if (existingToken) {
|
|
8
|
+
const res2 = await fetch(`${baseUrl}/shopper/sessions`, {
|
|
9
|
+
headers: {
|
|
10
|
+
Authorization: `Bearer ${existingToken}`,
|
|
11
|
+
"Content-Type": "application/json"
|
|
12
|
+
},
|
|
13
|
+
cache: "no-store"
|
|
14
|
+
});
|
|
15
|
+
if (res2.ok) {
|
|
16
|
+
return await res2.json();
|
|
17
|
+
}
|
|
18
|
+
clearCartSession();
|
|
19
|
+
}
|
|
20
|
+
const res = await fetch(`${baseUrl}/shopper/sessions/start`, {
|
|
21
|
+
method: "POST",
|
|
22
|
+
headers: { "Content-Type": "application/json" },
|
|
23
|
+
body: JSON.stringify({ storeGroupId, countryCode, languageCode })
|
|
24
|
+
});
|
|
25
|
+
if (!res.ok) throw new Error("Failed to start shopper session");
|
|
26
|
+
const data = await res.json();
|
|
27
|
+
setCartSession(data.token);
|
|
28
|
+
return data;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
export {
|
|
32
|
+
getCartQueryFn
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=getCartQueryFn.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/client/cart/queries/getCartQueryFn.tsx"],"sourcesContent":["import { BrinkConfig } from \"../contexts/cart\"\nimport { CartResponse } from \"../types/cart\"\nimport { clearCartSession, getCartSession, hasCartSession, setCartSession } from \"../utils/session\"\n\nexport const getCartQueryFn = (brinkConfig: BrinkConfig) => {\n const { env, storeGroupId, countryCode, languageCode } = brinkConfig\n\n return async (): Promise<CartResponse> => {\n const baseUrl = `https://shopper.eu-west-1.${env}.brinkcommerce.io`\n\n const existingToken = hasCartSession() ? getCartSession() : null\n\n if (existingToken) {\n const res = await fetch(`${baseUrl}/shopper/sessions`, {\n headers: {\n Authorization: `Bearer ${existingToken}`,\n \"Content-Type\": \"application/json\",\n },\n cache: \"no-store\",\n })\n\n if (res.ok) {\n return (await res.json()) as CartResponse\n }\n\n clearCartSession()\n }\n\n const res = await fetch(`${baseUrl}/shopper/sessions/start`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ storeGroupId, countryCode, languageCode }),\n })\n\n if (!res.ok) throw new Error(\"Failed to start shopper session\")\n\n const data = (await res.json()) as CartResponse\n\n setCartSession(data.token)\n\n return data\n }\n}\n"],"mappings":"AAEA,SAAS,kBAAkB,gBAAgB,gBAAgB,sBAAsB;AAE1E,MAAM,iBAAiB,CAAC,gBAA6B;AAC1D,QAAM,EAAE,KAAK,cAAc,aAAa,aAAa,IAAI;AAEzD,SAAO,YAAmC;AACxC,UAAM,UAAU,6BAA6B,GAAG;AAEhD,UAAM,gBAAgB,eAAe,IAAI,eAAe,IAAI;AAE5D,QAAI,eAAe;AACjB,YAAMA,OAAM,MAAM,MAAM,GAAG,OAAO,qBAAqB;AAAA,QACrD,SAAS;AAAA,UACP,eAAe,UAAU,aAAa;AAAA,UACtC,gBAAgB;AAAA,QAClB;AAAA,QACA,OAAO;AAAA,MACT,CAAC;AAED,UAAIA,KAAI,IAAI;AACV,eAAQ,MAAMA,KAAI,KAAK;AAAA,MACzB;AAEA,uBAAiB;AAAA,IACnB;AAEA,UAAM,MAAM,MAAM,MAAM,GAAG,OAAO,2BAA2B;AAAA,MAC3D,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,cAAc,aAAa,aAAa,CAAC;AAAA,IAClE,CAAC;AAED,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,iCAAiC;AAE9D,UAAM,OAAQ,MAAM,IAAI,KAAK;AAE7B,mBAAe,KAAK,KAAK;AAEzB,WAAO;AAAA,EACT;AACF;","names":["res"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BrinkConfig } from '../contexts/cart.mjs';
|
|
2
|
+
import { CartResponse } from '../types/cart.mjs';
|
|
3
|
+
import 'react';
|
|
4
|
+
|
|
5
|
+
declare const removeCartItemQueryFn: (brinkConfig: BrinkConfig) => ({ itemId }: {
|
|
6
|
+
itemId: string;
|
|
7
|
+
}) => Promise<CartResponse>;
|
|
8
|
+
|
|
9
|
+
export { removeCartItemQueryFn };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { getCartSession, setCartSession } from "../utils/session";
|
|
2
|
+
const removeCartItemQueryFn = (brinkConfig) => {
|
|
3
|
+
const { env } = brinkConfig;
|
|
4
|
+
return async ({ itemId }) => {
|
|
5
|
+
const baseUrl = `https://shopper.eu-west-1.${env}.brinkcommerce.io`;
|
|
6
|
+
const res = await fetch(`${baseUrl}/shopper/sessions/items/${itemId}`, {
|
|
7
|
+
method: "DELETE",
|
|
8
|
+
headers: {
|
|
9
|
+
Authorization: `Bearer ${getCartSession()}`
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
if (!res.ok) {
|
|
13
|
+
const errorText = await res.text();
|
|
14
|
+
throw new Error(`Failed to remove cart item: ${errorText}`);
|
|
15
|
+
}
|
|
16
|
+
const data = await res.json();
|
|
17
|
+
setCartSession(data.token);
|
|
18
|
+
return data;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export {
|
|
22
|
+
removeCartItemQueryFn
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=removeCartItemQueryFn.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/client/cart/queries/removeCartItemQueryFn.tsx"],"sourcesContent":["import { BrinkConfig } from \"../contexts/cart\"\nimport { CartResponse } from \"../types/cart\"\nimport { getCartSession, setCartSession } from \"../utils/session\"\n\nexport const removeCartItemQueryFn = (brinkConfig: BrinkConfig) => {\n const { env } = brinkConfig\n\n return async ({ itemId }: { itemId: string }): Promise<CartResponse> => {\n const baseUrl = `https://shopper.eu-west-1.${env}.brinkcommerce.io`\n\n const res = await fetch(`${baseUrl}/shopper/sessions/items/${itemId}`, {\n method: \"DELETE\",\n headers: {\n Authorization: `Bearer ${getCartSession()}`,\n },\n })\n\n if (!res.ok) {\n const errorText = await res.text()\n throw new Error(`Failed to remove cart item: ${errorText}`)\n }\n\n const data = (await res.json()) as CartResponse\n\n // Update token in localStorage if it changed\n setCartSession(data.token)\n\n return data\n }\n}\n"],"mappings":"AAEA,SAAS,gBAAgB,sBAAsB;AAExC,MAAM,wBAAwB,CAAC,gBAA6B;AACjE,QAAM,EAAE,IAAI,IAAI;AAEhB,SAAO,OAAO,EAAE,OAAO,MAAiD;AACtE,UAAM,UAAU,6BAA6B,GAAG;AAEhD,UAAM,MAAM,MAAM,MAAM,GAAG,OAAO,2BAA2B,MAAM,IAAI;AAAA,MACrE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,eAAe,CAAC;AAAA,MAC3C;AAAA,IACF,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,YAAY,MAAM,IAAI,KAAK;AACjC,YAAM,IAAI,MAAM,+BAA+B,SAAS,EAAE;AAAA,IAC5D;AAEA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAG7B,mBAAe,KAAK,KAAK;AAEzB,WAAO;AAAA,EACT;AACF;","names":[]}
|