@sazito/checkout 0.2.1 → 0.4.0
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/README.md +54 -0
- package/dist/chunks/{labels-BlZiVd3n.cjs → labels-CnPllzhT.cjs} +28 -9
- package/dist/chunks/labels-CnPllzhT.cjs.map +1 -0
- package/dist/chunks/{labels-CTR6b-KZ.js → labels-e8w4zRbg.js} +28 -9
- package/dist/chunks/labels-e8w4zRbg.js.map +1 -0
- package/dist/chunks/{use-checkout-DwHd4uFh.js → use-checkout-BM810__v.js} +5 -3
- package/dist/chunks/use-checkout-BM810__v.js.map +1 -0
- package/dist/chunks/{use-checkout-BEaLKgNa.cjs → use-checkout-DPtLgxlA.cjs} +5 -3
- package/dist/chunks/use-checkout-DPtLgxlA.cjs.map +1 -0
- package/dist/core/index.cjs +3 -1
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +27 -3
- package/dist/core/index.d.ts +27 -3
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/next/index.cjs +34 -13
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.d.cts +48 -9
- package/dist/next/index.d.ts +48 -9
- package/dist/next/index.js +35 -14
- package/dist/next/index.js.map +1 -1
- package/dist/next/payment-return.cjs +40 -0
- package/dist/next/payment-return.cjs.map +1 -0
- package/dist/next/payment-return.d.cts +26 -0
- package/dist/next/payment-return.d.ts +26 -0
- package/dist/next/payment-return.js +38 -0
- package/dist/next/payment-return.js.map +1 -0
- package/dist/react/index.cjs +2 -2
- package/dist/react/index.d.cts +9 -1
- package/dist/react/index.d.ts +9 -1
- package/dist/react/index.js +2 -2
- package/dist/styles.css +29 -28
- package/package.json +15 -1
- package/dist/chunks/labels-BlZiVd3n.cjs.map +0 -1
- package/dist/chunks/labels-CTR6b-KZ.js.map +0 -1
- package/dist/chunks/use-checkout-BEaLKgNa.cjs.map +0 -1
- package/dist/chunks/use-checkout-DwHd4uFh.js.map +0 -1
package/dist/next/index.cjs
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
var react = require('react');
|
|
6
|
-
var useCheckout = require('../chunks/use-checkout-
|
|
7
|
-
var labels = require('../chunks/labels-
|
|
6
|
+
var useCheckout = require('../chunks/use-checkout-DPtLgxlA.cjs');
|
|
7
|
+
var labels = require('../chunks/labels-CnPllzhT.cjs');
|
|
8
8
|
require('@sazito/client-sdk');
|
|
9
9
|
|
|
10
10
|
/**
|
|
@@ -186,17 +186,29 @@ function attrHexColor(value) {
|
|
|
186
186
|
}
|
|
187
187
|
return toHexColor(value);
|
|
188
188
|
}
|
|
189
|
-
function CartStep({ continueShoppingUrl, renderEmpty, }) {
|
|
189
|
+
function CartStep({ continueShoppingUrl, emptyCart, renderEmpty, }) {
|
|
190
190
|
const { state, actions, money, t } = useCheckout.useCheckout();
|
|
191
191
|
const cart = state.cart;
|
|
192
192
|
const busy = state.flags.updatingCart;
|
|
193
193
|
const newestCartItems = react.useMemo(() => labels.sortCartItemsNewestFirst(cart?.items ?? []), [cart?.items]);
|
|
194
194
|
const invoiceItemsByVariant = new Map((state.invoice?.items ?? []).map((item) => [item.productVariantId, item]));
|
|
195
195
|
if (!cart || cart.items.length === 0) {
|
|
196
|
+
const title = emptyCart?.title ?? t.cartEmpty;
|
|
197
|
+
const description = emptyCart?.description ?? t.cartEmptyHint;
|
|
198
|
+
const actionLabel = emptyCart?.actionLabel ?? t.continueShopping;
|
|
199
|
+
const actionUrl = emptyCart?.actionUrl ?? continueShoppingUrl;
|
|
200
|
+
const visibleActionUrl = emptyCart?.hideAction ? undefined : actionUrl;
|
|
201
|
+
const icon = emptyCart?.icon ?? jsxRuntime.jsx(CartIcon, {});
|
|
196
202
|
if (renderEmpty) {
|
|
197
|
-
return renderEmpty({
|
|
203
|
+
return renderEmpty({
|
|
204
|
+
continueShoppingUrl: visibleActionUrl,
|
|
205
|
+
title,
|
|
206
|
+
description,
|
|
207
|
+
actionLabel,
|
|
208
|
+
icon,
|
|
209
|
+
});
|
|
198
210
|
}
|
|
199
|
-
return (jsxRuntime.jsx("section", { className: "szc-empty", role: "status", "aria-live": "polite", children: jsxRuntime.jsxs("div", { className: "szc-empty__card", children: [jsxRuntime.jsx("span", { className: "szc-empty__badge",
|
|
211
|
+
return (jsxRuntime.jsx("section", { className: "szc-empty", role: "status", "aria-live": "polite", children: jsxRuntime.jsxs("div", { className: "szc-empty__card", children: [jsxRuntime.jsx("span", { className: "szc-empty__badge", "aria-hidden": "true", children: icon }), jsxRuntime.jsxs("div", { className: "szc-empty__copy", children: [jsxRuntime.jsx("h2", { className: "szc-empty__title", children: title }), jsxRuntime.jsx("p", { className: "szc-empty__hint", children: description })] }), visibleActionUrl ? (jsxRuntime.jsx(Button, { className: "szc-empty__cta", variant: "primary", asChild: true, children: jsxRuntime.jsx("a", { href: visibleActionUrl, children: actionLabel }) })) : null] }) }));
|
|
200
212
|
}
|
|
201
213
|
return (jsxRuntime.jsx("section", { className: "szc-step-panel", children: jsxRuntime.jsx("ul", { className: "szc-cart-list", children: newestCartItems.map((item) => {
|
|
202
214
|
const max = item.product.maxOrderQuantity;
|
|
@@ -759,12 +771,13 @@ function themeVars(theme) {
|
|
|
759
771
|
function CheckoutLoading({ label }) {
|
|
760
772
|
return (jsxRuntime.jsxs("div", { className: "szc-checkout-loading", role: "status", "aria-live": "polite", children: [jsxRuntime.jsx(Spinner, { className: "szc-checkout-loading__spinner" }), jsxRuntime.jsx("span", { children: label })] }));
|
|
761
773
|
}
|
|
762
|
-
function SazitoCheckout({ theme, continueShoppingUrl, className, renderNextButton, renderBackButton, renderEmptyCart, }) {
|
|
774
|
+
function SazitoCheckout({ theme, continueShoppingUrl, className, renderNextButton, renderBackButton, renderEmptyCart, emptyCart, }) {
|
|
763
775
|
const { state, actions, t, summary, money } = useCheckout.useCheckout();
|
|
764
776
|
const { step, direction, flags, error } = state;
|
|
765
777
|
const isResult = step === 'result';
|
|
766
778
|
const bootstrapping = step === 'cart' && !error && (!state.cart || !state.invoice || flags.bootstrapping);
|
|
767
|
-
const
|
|
779
|
+
const emptyCartError = error?.code === 'no_cart';
|
|
780
|
+
const fatal = error && !state.cart && step === 'cart' && !emptyCartError;
|
|
768
781
|
const cartEmpty = !state.cart || state.cart.items.length === 0;
|
|
769
782
|
const footerVisible = (step === 'cart' && !cartEmpty) || step === 'shipping' || step === 'payment';
|
|
770
783
|
const nextBusy = state.status === 'working' ||
|
|
@@ -832,20 +845,28 @@ function SazitoCheckout({ theme, continueShoppingUrl, className, renderNextButto
|
|
|
832
845
|
? CardIcon
|
|
833
846
|
: ClipboardIcon;
|
|
834
847
|
const mobileHead = (jsxRuntime.jsxs("div", { className: "szc-mobile-head", children: [footerVisible && backVisible ? (jsxRuntime.jsx("button", { type: "button", className: "szc-mobile-head__back", "aria-label": t.back, onClick: backOnClick, children: jsxRuntime.jsx("svg", { className: "szc-back-arrow", viewBox: "0 0 16 16", width: "18", height: "18", fill: "none", "aria-hidden": "true", children: jsxRuntime.jsx("path", { d: "M9.5 3.5 5 8l4.5 4.5", stroke: "currentColor", strokeWidth: "1.8", strokeLinecap: "round", strokeLinejoin: "round" }) }) })) : (jsxRuntime.jsx("span", {})), jsxRuntime.jsxs("span", { className: "szc-mobile-head__title", children: [jsxRuntime.jsx("span", { className: "szc-mobile-head__dot", children: jsxRuntime.jsx(HeadIcon, {}) }), headTitle] }), flowIndex >= 0 ? (jsxRuntime.jsx("span", { className: "szc-mobile-head__count", children: t.stepOf(labels.formatNumber(flowIndex + 1, state.locale), labels.formatNumber(flowSteps.length, state.locale)) })) : (jsxRuntime.jsx("span", {}))] }));
|
|
835
|
-
return (jsxRuntime.jsxs("div", { className: `szc-root${className ? ` ${className}` : ''}`, dir: direction, style: themeVars(theme), children: [mobileHead, jsxRuntime.jsx(Stepper, {}), bootstrapping ? (jsxRuntime.jsx(CheckoutLoading, { label: t.loading })) : fatal ? (jsxRuntime.jsx(ErrorBanner, { message: error.message })) : isResult ? (jsxRuntime.jsx("div", { className: "szc-result-wrap", children: jsxRuntime.jsx(ResultStep, { continueShoppingUrl: continueShoppingUrl }) })) : (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs("div", { className: `szc-layout${cartEmpty ? ' szc-layout--full' : ''}`, children: [jsxRuntime.jsxs("main", { className: "szc-main", children: [error ? jsxRuntime.jsx(ErrorBanner, { message: error.message }) : null, step === 'cart' ? jsxRuntime.jsx(CartStep, { continueShoppingUrl: continueShoppingUrl, renderEmpty: renderEmptyCart }) : null, step === 'shipping' ? jsxRuntime.jsx(ShippingStep, {}) : null, step === 'payment' ? jsxRuntime.jsx(PaymentStep, {}) : null, actionsVisible && backButtonNode ? (jsxRuntime.jsx("div", { className: "szc-back-row", children: backButtonNode })) : null] }), !cartEmpty ? (jsxRuntime.jsxs("div", { className: "szc-side", children: [jsxRuntime.jsx(OrderSummary, {}), actionsVisible ? jsxRuntime.jsx("div", { className: "szc-side__cta", children: nextButtonNode }) : null] })) : null] }) })), actionsVisible ? (jsxRuntime.jsx("div", { className: "szc-footer-bar", children: jsxRuntime.jsxs("div", { className: "szc-footer", children: [jsxRuntime.jsxs("div", { className: "szc-footer__total", children: [jsxRuntime.jsx("span", { className: "szc-footer__total-label", children: t.total }), jsxRuntime.jsx("span", { className: "szc-footer__total-value", children: money(summary.total) })] }), jsxRuntime.jsx("div", { className: "szc-footer__actions", children: nextButtonNode })] }) })) : null] }));
|
|
848
|
+
return (jsxRuntime.jsxs("div", { className: `szc-root${className ? ` ${className}` : ''}`, dir: direction, style: themeVars(theme), children: [mobileHead, jsxRuntime.jsx(Stepper, {}), bootstrapping ? (jsxRuntime.jsx(CheckoutLoading, { label: t.loading })) : fatal ? (jsxRuntime.jsx(ErrorBanner, { message: error.message })) : isResult ? (jsxRuntime.jsx("div", { className: "szc-result-wrap", children: jsxRuntime.jsx(ResultStep, { continueShoppingUrl: continueShoppingUrl }) })) : (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs("div", { className: `szc-layout${cartEmpty ? ' szc-layout--full' : ''}`, children: [jsxRuntime.jsxs("main", { className: "szc-main", children: [error && !emptyCartError ? jsxRuntime.jsx(ErrorBanner, { message: error.message }) : null, step === 'cart' ? (jsxRuntime.jsx(CartStep, { continueShoppingUrl: continueShoppingUrl, emptyCart: emptyCart, renderEmpty: renderEmptyCart })) : null, step === 'shipping' ? jsxRuntime.jsx(ShippingStep, {}) : null, step === 'payment' ? jsxRuntime.jsx(PaymentStep, {}) : null, actionsVisible && backButtonNode ? (jsxRuntime.jsx("div", { className: "szc-back-row", children: backButtonNode })) : null] }), !cartEmpty ? (jsxRuntime.jsxs("div", { className: "szc-side", children: [jsxRuntime.jsx(OrderSummary, {}), actionsVisible ? jsxRuntime.jsx("div", { className: "szc-side__cta", children: nextButtonNode }) : null] })) : null] }) })), actionsVisible ? (jsxRuntime.jsx("div", { className: "szc-footer-bar", children: jsxRuntime.jsxs("div", { className: "szc-footer", children: [jsxRuntime.jsxs("div", { className: "szc-footer__total", children: [jsxRuntime.jsx("span", { className: "szc-footer__total-label", children: t.total }), jsxRuntime.jsx("span", { className: "szc-footer__total-value", children: money(summary.total) })] }), jsxRuntime.jsx("div", { className: "szc-footer__actions", children: nextButtonNode })] }) })) : null] }));
|
|
836
849
|
}
|
|
837
850
|
|
|
838
|
-
function SazitoCheckoutPage({ credentials, config, paymentReturnParams, className, renderNextButton, renderBackButton, renderEmptyCart, }) {
|
|
839
|
-
const
|
|
851
|
+
function SazitoCheckoutPage({ credentials, config, paymentReturn, paymentReturnParams, className, renderNextButton, renderBackButton, renderEmptyCart, emptyCart, }) {
|
|
852
|
+
const returnParams = paymentReturn?.params ?? paymentReturnParams;
|
|
853
|
+
const isReturn = returnParams != null;
|
|
854
|
+
const checkoutCredentials = paymentReturn
|
|
855
|
+
? { ...credentials, payment: paymentReturn.payment }
|
|
856
|
+
: credentials;
|
|
840
857
|
const client = useCheckout.useSazitoClient();
|
|
841
|
-
return (jsxRuntime.jsxs(useCheckout.CheckoutProvider, { client: client, credentials:
|
|
858
|
+
return (jsxRuntime.jsxs(useCheckout.CheckoutProvider, { client: client, credentials: checkoutCredentials, config: config, autoStart: !isReturn, children: [returnParams ? jsxRuntime.jsx(ResolveReturn, { params: returnParams }) : null, jsxRuntime.jsx(SazitoCheckout, { theme: config?.theme, continueShoppingUrl: config?.continueShoppingUrl, className: className, renderNextButton: renderNextButton, renderBackButton: renderBackButton, renderEmptyCart: renderEmptyCart, emptyCart: emptyCart })] }));
|
|
842
859
|
}
|
|
843
860
|
function ResolveReturn({ params }) {
|
|
844
861
|
const { actions } = useCheckout.useCheckout();
|
|
862
|
+
const resolvedKey = react.useRef(null);
|
|
863
|
+
const paramsKey = JSON.stringify(Object.entries(params).sort(([a], [b]) => a.localeCompare(b)));
|
|
845
864
|
react.useEffect(() => {
|
|
865
|
+
if (resolvedKey.current === paramsKey)
|
|
866
|
+
return;
|
|
867
|
+
resolvedKey.current = paramsKey;
|
|
846
868
|
void actions.resolvePaymentReturn(params);
|
|
847
|
-
|
|
848
|
-
}, []);
|
|
869
|
+
}, [actions, params, paramsKey]);
|
|
849
870
|
return null;
|
|
850
871
|
}
|
|
851
872
|
|