@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.
Files changed (37) hide show
  1. package/README.md +54 -0
  2. package/dist/chunks/{labels-BlZiVd3n.cjs → labels-CnPllzhT.cjs} +28 -9
  3. package/dist/chunks/labels-CnPllzhT.cjs.map +1 -0
  4. package/dist/chunks/{labels-CTR6b-KZ.js → labels-e8w4zRbg.js} +28 -9
  5. package/dist/chunks/labels-e8w4zRbg.js.map +1 -0
  6. package/dist/chunks/{use-checkout-DwHd4uFh.js → use-checkout-BM810__v.js} +5 -3
  7. package/dist/chunks/use-checkout-BM810__v.js.map +1 -0
  8. package/dist/chunks/{use-checkout-BEaLKgNa.cjs → use-checkout-DPtLgxlA.cjs} +5 -3
  9. package/dist/chunks/use-checkout-DPtLgxlA.cjs.map +1 -0
  10. package/dist/core/index.cjs +3 -1
  11. package/dist/core/index.cjs.map +1 -1
  12. package/dist/core/index.d.cts +27 -3
  13. package/dist/core/index.d.ts +27 -3
  14. package/dist/core/index.js +2 -1
  15. package/dist/core/index.js.map +1 -1
  16. package/dist/next/index.cjs +34 -13
  17. package/dist/next/index.cjs.map +1 -1
  18. package/dist/next/index.d.cts +48 -9
  19. package/dist/next/index.d.ts +48 -9
  20. package/dist/next/index.js +35 -14
  21. package/dist/next/index.js.map +1 -1
  22. package/dist/next/payment-return.cjs +40 -0
  23. package/dist/next/payment-return.cjs.map +1 -0
  24. package/dist/next/payment-return.d.cts +26 -0
  25. package/dist/next/payment-return.d.ts +26 -0
  26. package/dist/next/payment-return.js +38 -0
  27. package/dist/next/payment-return.js.map +1 -0
  28. package/dist/react/index.cjs +2 -2
  29. package/dist/react/index.d.cts +9 -1
  30. package/dist/react/index.d.ts +9 -1
  31. package/dist/react/index.js +2 -2
  32. package/dist/styles.css +29 -28
  33. package/package.json +15 -1
  34. package/dist/chunks/labels-BlZiVd3n.cjs.map +0 -1
  35. package/dist/chunks/labels-CTR6b-KZ.js.map +0 -1
  36. package/dist/chunks/use-checkout-BEaLKgNa.cjs.map +0 -1
  37. package/dist/chunks/use-checkout-DwHd4uFh.js.map +0 -1
@@ -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-BEaLKgNa.cjs');
7
- var labels = require('../chunks/labels-BlZiVd3n.cjs');
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({ continueShoppingUrl });
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", children: jsxRuntime.jsx(CartIcon, {}) }), jsxRuntime.jsxs("div", { className: "szc-empty__copy", children: [jsxRuntime.jsx("h3", { className: "szc-empty__title", children: t.cartEmpty }), jsxRuntime.jsx("p", { className: "szc-empty__hint", children: t.cartEmptyHint })] }), continueShoppingUrl ? (jsxRuntime.jsx(Button, { className: "szc-empty__cta", variant: "primary", onClick: () => { window.location.href = continueShoppingUrl; }, children: t.continueShopping })) : null] }) }));
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 fatal = error && !state.cart && step === 'cart';
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 isReturn = paymentReturnParams != null;
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: credentials, config: config, autoStart: !isReturn, children: [isReturn ? jsxRuntime.jsx(ResolveReturn, { params: paymentReturnParams }) : null, jsxRuntime.jsx(SazitoCheckout, { theme: config?.theme, continueShoppingUrl: config?.continueShoppingUrl, className: className, renderNextButton: renderNextButton, renderBackButton: renderBackButton, renderEmptyCart: renderEmptyCart })] }));
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
- // eslint-disable-next-line react-hooks/exhaustive-deps
848
- }, []);
869
+ }, [actions, params, paramsKey]);
849
870
  return null;
850
871
  }
851
872