@lockerverse/react 0.2.19 → 0.2.20

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 CHANGED
@@ -79,4 +79,28 @@ An authoritative `failed` result is retryable and the next submit receives a new
79
79
 
80
80
  To abandon a locked attempt and intentionally start a new checkout, the host must remount `LockerversePayment` with a new React `key` after resolving the payment status through its own workflow.
81
81
 
82
+ Persist `onPaymentRecoveryChange` synchronously before navigation and pass the saved value back through `resumePayment` after a refresh. The recovery value contains a Lockerverse reference and public connected-account ID, never a Stripe secret.
83
+
84
+ ```tsx
85
+ import type { LockerversePaymentRecovery } from "@lockerverse/react";
86
+
87
+ const recoveryKey = "lockerverse:tailgate-party:payment";
88
+ const savedRecovery = sessionStorage.getItem(recoveryKey);
89
+ const recovery = savedRecovery
90
+ ? (JSON.parse(savedRecovery) as LockerversePaymentRecovery)
91
+ : null;
92
+
93
+ <LockerversePayment
94
+ // ...checkout props
95
+ resumePayment={recovery}
96
+ onPaymentRecoveryChange={(nextRecovery) => {
97
+ if (nextRecovery) {
98
+ sessionStorage.setItem(recoveryKey, JSON.stringify(nextRecovery));
99
+ } else {
100
+ sessionStorage.removeItem(recoveryKey);
101
+ }
102
+ }}
103
+ />
104
+ ```
105
+
82
106
  Malformed host selections and invalid custom tips render customer-safe validation messages and do not call the Lockerverse API. Product selection remains owned by the host application.
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { loadStripe } from "@stripe/stripe-js";
2
1
  import { CSSProperties, ComponentPropsWithoutRef } from "react";
3
2
  import { CreateLockerverseWidgetOptions, LockerversePaymentResult } from "@lockerverse/sdk/checkout";
3
+ import { loadStripe } from "@stripe/stripe-js";
4
4
  //#region src/types.d.ts
5
5
  type LockerversePaymentSelectionItem = {
6
6
  amountCents: number;
@@ -18,24 +18,41 @@ type LockerversePaymentBranding = {
18
18
  type LockerversePaymentStyle = CSSProperties & {
19
19
  "--lockerverse-accent"?: string;
20
20
  "--lockerverse-accent-contrast"?: string;
21
+ "--lockerverse-bg"?: string;
22
+ "--lockerverse-border"?: string;
23
+ "--lockerverse-control"?: string;
24
+ "--lockerverse-danger"?: string;
25
+ "--lockerverse-danger-border"?: string;
26
+ "--lockerverse-font-family"?: string;
27
+ "--lockerverse-muted"?: string;
28
+ "--lockerverse-placeholder"?: string;
21
29
  "--lockerverse-radius"?: string;
30
+ "--lockerverse-subtle"?: string;
31
+ "--lockerverse-text"?: string;
22
32
  };
23
33
  type LockerversePaymentUncertain = {
24
34
  paymentReference: string;
25
35
  reason: "action_required" | "pending" | "recovery_failed";
26
36
  };
37
+ type LockerversePaymentRecovery = {
38
+ connectedAccountId: string | null;
39
+ paymentReference: string;
40
+ };
41
+ type LockerverseStripeLoader = (...args: Parameters<typeof loadStripe>) => ReturnType<typeof loadStripe>;
27
42
  type LockerversePaymentProps = CreateLockerverseWidgetOptions & Omit<ComponentPropsWithoutRef<"section">, "children" | "onError"> & {
28
43
  branding?: LockerversePaymentBranding;
29
44
  onPaymentComplete?: (payment: LockerversePaymentResult) => void;
45
+ onPaymentRecoveryChange?: (recovery: LockerversePaymentRecovery | null) => void;
30
46
  onPaymentUncertain?: (payment: LockerversePaymentUncertain) => void;
47
+ resumePayment?: LockerversePaymentRecovery | null;
31
48
  selection: LockerversePaymentSelectionItem[];
32
- stripeLoader?: typeof loadStripe;
49
+ stripeLoader?: LockerverseStripeLoader;
33
50
  style?: LockerversePaymentStyle;
34
51
  theme?: LockerversePaymentTheme;
35
52
  };
36
53
  //#endregion
37
54
  //#region src/lockerverse-payment.d.ts
38
- declare function LockerversePayment({ apiBaseUrl, branding, className, communitySlug, environment, fetch, onError, onPaymentComplete, onPaymentUncertain, requestTimeoutMs, selection, sentryDsn, style, stripeLoader, theme, widgetSlug, ...sectionProps }: LockerversePaymentProps): import("react").JSX.Element;
55
+ declare function LockerversePayment({ apiBaseUrl, branding, className, communitySlug, environment, fetch, onError, onPaymentComplete, onPaymentRecoveryChange, onPaymentUncertain, requestTimeoutMs, resumePayment, selection, sentryDsn, style, stripeLoader, theme, widgetSlug, ...sectionProps }: LockerversePaymentProps): import("react").JSX.Element;
39
56
  //#endregion
40
- export { LockerversePayment, type LockerversePaymentBranding, type LockerversePaymentProps, type LockerversePaymentSelectionItem, type LockerversePaymentStyle, type LockerversePaymentTheme, type LockerversePaymentUncertain };
57
+ export { LockerversePayment, type LockerversePaymentBranding, type LockerversePaymentProps, type LockerversePaymentRecovery, type LockerversePaymentSelectionItem, type LockerversePaymentStyle, type LockerversePaymentTheme, type LockerversePaymentUncertain, type LockerverseStripeLoader };
41
58
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/lockerverse-payment.tsx"],"mappings":";;;;KAOY;EACN;EAAqB;;EACrB;EAAqB;;KAEf;KAEA;EACV;EACA;EACA;;KAGU,0BAA0B;EACpC;EACA;EACA;;KAGU;EACV;EACA;;KAGU,0BAA0B,iCACpC,KAAK;EACH,WAAW;EACX,qBAAqB,SAAS;EAC9B,sBAAsB,SAAS;EAC/B,WAAW;EACX,sBAAsB;EACtB,QAAQ;EACR,QAAQ;;;;iBCwkCI,qBACd,YACA,UACA,WACA,eACA,aACA,OACA,SACA,mBACA,oBACA,kBACA,WACA,WACA,OACA,cACA,OACA,eACG,gBACF,0CAAuB,IAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/lockerverse-payment.tsx"],"mappings":";;;;KAOY;EACN;EAAqB;;EACrB;EAAqB;;KAEf;KAEA;EACV;EACA;EACA;;KAGU,0BAA0B;EACpC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU;EACV;EACA;;KAGU;EACV;EACA;;KAGU,8BACP,MAAM,kBAAkB,gBACxB,kBAAkB;KAEX,0BAA0B,iCACpC,KAAK;EACH,WAAW;EACX,qBAAqB,SAAS;EAC9B,2BACE,UAAU;EAEZ,sBAAsB,SAAS;EAC/B,gBAAgB;EAChB,WAAW;EACX,eAAe;EACf,QAAQ;EACR,QAAQ;;;;iBC8qCI,qBACd,YACA,UACA,WACA,eACA,aACA,OACA,SACA,mBACA,yBACA,oBACA,kBACA,eACA,WACA,WACA,OACA,cACA,OACA,eACG,gBACF,0CAAuB,IAAA"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{AddressElement as e,Elements as t,PaymentElement as n,useElements as r,useStripe as i}from"@stripe/react-stripe-js";import{loadStripe as a}from"@stripe/stripe-js";import{useEffect as o,useId as s,useMemo as c,useReducer as l,useRef as u,useState as d}from"react";import{Fragment as f,jsx as p,jsxs as m}from"react/jsx-runtime";import{LockerverseSdkError as h,createLockerverseCheckoutClient as g}from"@lockerverse/sdk/checkout";import{array as _,email as v,minLength as y,minValue as b,nonEmpty as x,number as S,object as C,pipe as w,regex as T,safeInteger as E,safeParse as D,strictObject as O,string as k,transform as A,trim as j,union as M}from"valibot";const N=/^#([\da-f]{3}|[\da-f]{6})$/i;function P(e){let t=N.exec(e.trim());if(!t)return;let[,n]=t;if(!n)return;let r=n.length===3?Array.from(n,e=>`${e}${e}`).join(``):n;return[0,2,4].map(e=>Number.parseInt(r.slice(e,e+2),16))}function ee([e,t,n]){let[r=0,i=0,a=0]=[e,t,n].map((e=0)=>{let t=e/255;return t<=.04045?t/12.92:((t+.055)/1.055)**2.4});return .2126*r+.7152*i+.0722*a}function te(e){let t=P(e);if(!t)return;let n=ee(t);return(n+.05)/.05>=1.05/(n+.05)?`#000`:`#fff`}const ne=[`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`],F=[`15`,`12`,`10`,`5`];function re({enabled:e,error:t,errorId:n,onChange:r,values:i}){if(!e)return null;let a=e=>r({...i,...e});return m(`div`,{className:`lockerverse-payment__tip-box`,children:[p(`p`,{children:`Add a tip to support the Lockerverse platform`}),m(`div`,{"aria-label":`Tip amount`,role:`radiogroup`,children:[F.map(e=>m(`button`,{"aria-pressed":i.tipPercent===e,onClick:()=>a({tipPercent:e}),type:`button`,children:[e,`%`]},e)),p(`button`,{"aria-pressed":i.tipPercent===`custom`,onClick:()=>a({tipPercent:`custom`}),type:`button`,children:`Other`})]}),i.tipPercent===`custom`?m(`label`,{children:[p(`span`,{children:`Custom tip`}),m(`span`,{className:`lockerverse-payment__money-input`,children:[p(`span`,{"aria-hidden":`true`,children:`$`}),p(`input`,{"aria-describedby":t?n:void 0,"aria-invalid":t?`true`:void 0,inputMode:`decimal`,name:`tip`,onChange:e=>a({customTip:e.currentTarget.value}),placeholder:`0.00`,value:i.customTip})]}),t?p(`span`,{className:`lockerverse-payment__field-message`,id:n,children:t}):null]}):p(`input`,{name:`tip`,type:`hidden`,value:i.tipPercent})]})}function ie({checked:e,children:t,name:n,onChange:r}){return m(`label`,{className:`lockerverse-payment__check-row`,children:[p(`input`,{checked:e,name:n,onChange:e=>r(e.currentTarget.checked),type:`checkbox`}),p(`span`,{children:t})]})}function ae({customFields:e,errors:t,fields:n,idPrefix:r,onChange:i,values:a}){let o=e=>i({...a,...e});return m(`div`,{className:`lockerverse-payment__additional-fields`,children:[n.memberId?m(`label`,{children:[p(`span`,{children:`Member ID`}),p(`input`,{name:`memberId`,onChange:e=>o({memberId:e.currentTarget.value}),placeholder:`Optional`,value:a.memberId})]}):null,n.merchSize?m(`label`,{children:[p(`span`,{children:`Size`}),p(`select`,{name:`merchSize`,onChange:e=>o({merchSize:e.currentTarget.value}),value:a.merchSize,children:ne.map(e=>p(`option`,{value:e,children:e},e))})]}):null,n.promoCode?m(`label`,{children:[p(`span`,{children:`Promo code`}),p(`input`,{name:`promoCode`,onChange:e=>o({promoCode:e.currentTarget.value}),placeholder:`Optional`,value:a.promoCode})]}):null,e.map(e=>p(se,{error:t[e.id],field:e,idPrefix:r,onChange:t=>o({customFields:{...a.customFields,[e.id]:t}}),value:a.customFields[e.id]},e.id))]})}function oe({amountCents:e,enabled:t,onChange:n,values:r}){return t?m(ie,{checked:r.includeServiceFee,name:`includeServiceFee`,onChange:e=>n({...r,includeServiceFee:e}),children:[`Add `,L(e),` to help cover processing fees`]}):null}function se({error:e,field:t,idPrefix:n,onChange:r,value:i}){let a=`custom:${t.id}`,o=`${n}-custom-${t.id}`,s=`${o}-error`;switch(t.type){case`text`:case`textarea`:return p(ce,{controlId:o,error:e,errorId:s,field:t,name:a,onChange:r,value:i});case`select`:case`multi_select`:return p(le,{controlId:o,error:e,errorId:s,field:t,name:a,onChange:r,value:i});case`radio`:case`checkboxes`:return p(ue,{controlId:o,error:e,errorId:s,field:t,name:a,onChange:r,value:i});default:return null}}function I({error:e,id:t}){return e?p(`p`,{className:`lockerverse-payment__field-message`,id:t,children:e}):null}function ce({controlId:e,error:t,errorId:n,field:r,name:i,onChange:a,value:o}){let s={"aria-describedby":t?n:void 0,"aria-invalid":t?`true`:void 0,id:e,name:i,onChange:e=>a(e.currentTarget.value),required:r.required,value:typeof o==`string`?o:``};return m(`label`,{htmlFor:e,children:[p(`span`,{children:r.label}),r.type===`textarea`?p(`textarea`,{...s}):p(`input`,{...s}),p(I,{error:t,id:n})]})}function le({controlId:e,error:t,errorId:n,field:r,name:i,onChange:a,value:o}){return m(`label`,{htmlFor:e,children:[p(`span`,{children:r.label}),m(`select`,{"aria-describedby":t?n:void 0,"aria-invalid":t?`true`:void 0,id:e,multiple:r.type===`multi_select`,name:i,onChange:e=>a(r.type===`multi_select`?[...e.currentTarget.selectedOptions].map(e=>e.value):e.currentTarget.value),required:r.required,value:o??(r.type===`multi_select`?[]:``),children:[r.type===`select`?p(`option`,{value:``,children:`Select…`}):null,r.options.map(e=>p(`option`,{value:e.id,children:e.label},e.id))]}),p(I,{error:t,id:n})]})}function ue({controlId:e,error:t,errorId:n,field:r,name:i,onChange:a,value:o}){return m(`fieldset`,{"aria-describedby":t?n:void 0,"aria-invalid":t?`true`:void 0,children:[p(`legend`,{children:r.label}),r.options.map((t,n)=>{let s=Array.isArray(o)?o.includes(t.id):o===t.id;return m(`label`,{className:`lockerverse-payment__check-row`,children:[p(`input`,{checked:s,id:`${e}-${n}`,name:i,onChange:e=>{if(r.type===`radio`){a(t.id);return}let n=Array.isArray(o)?o:[];a(e.currentTarget.checked?[...n,t.id]:n.filter(e=>e!==t.id))},required:r.required,type:r.type===`radio`?`radio`:`checkbox`,value:t.id}),p(`span`,{children:t.label})]},t.id)}),p(I,{error:t,id:n})]})}function L(e){return new Intl.NumberFormat(`en-US`,{currency:`USD`,style:`currency`}).format(e/100)}const R=[`amountCents`,`discountableSubtotalCents`,`discountCents`,`serviceFeeCents`,`subtotalCents`,`tipCents`,`totalCents`];function z(e,t){return R.some(n=>e[n]!==t[n])||e.payment.connectedAccountId!==t.payment.connectedAccountId||e.payment.currency!==t.payment.currency||JSON.stringify(e.appliedDiscount)!==JSON.stringify(t.appliedDiscount)||JSON.stringify(e.lineItems)!==JSON.stringify(t.lineItems)}function B(e){return e.checkoutStatus===`success`?{kind:`success`,payment:e}:e.checkoutStatus===`failed`?{kind:`failed`,payment:e}:{kind:`unresolved`,paymentReference:e.paymentReference,reason:e.checkoutStatus===`action_required`?`action_required`:`pending`}}async function V(e,t,n){if(t.checkoutStatus!==`action_required`)return B(t);if(t.clientSecret)try{await n.handleNextAction({clientSecret:t.clientSecret})}catch{}try{return B(await e.getPaymentStatus(t.paymentReference))}catch{return{kind:`unresolved`,paymentReference:t.paymentReference,reason:`action_required`}}}async function H(e,t,n){let r;try{r=await e.submitPayment(t)}catch(n){if(!(n instanceof h&&n.recoveryRecommended))throw n;try{r=await e.getPaymentStatus(t.checkout.paymentReference)}catch{return{kind:`unresolved`,paymentReference:t.checkout.paymentReference,reason:`recovery_failed`}}}return V(e,r,n)}const U=w(k(),j(),x()),W=w(S(),E(),b(1)),G=w(_(M([O({amountCents:W,productSlug:U}),O({productSlug:U,quantity:W})])),y(1)),de=w(k(),j(),T(/^(?:0|[1-9]\d*)(?:\.\d{1,2})?$/,`Enter a valid tip amount.`),A(e=>Math.round(Number(e)*100)),E(`Enter a valid tip amount.`));function fe(e){let t=D(de,e);return t.success?{cents:t.output,success:!0}:{message:t.issues[0]?.message??`Enter a valid tip amount.`,success:!1}}function K(e){let t=D(G,e);return t.success?{success:!0,value:t.output}:{message:`Lockerverse payment configuration is invalid.`,success:!1}}const q=w(k(),j(),x(`Email is required.`),v(`Enter a valid email address.`)),J=w(k(),j(),x(`Phone is required.`),T(/^\+[1-9]\d{6,14}$/,`Enter a valid phone number.`));function Y(e){return e.trim().replace(/[().\s-]/g,``)}function pe(e,t){let n=t?{...e,phone:Y(e.phone)}:e,r=C(t?{email:q,phone:J}:{email:q}),i=D(r,n);if(i.success)return{errors:{},value:i.output};let a={};for(let e of i.issues){let t=e.path?.[0]?.key;(t===`email`||t===`phone`)&&!a[t]&&(a[t]=e.message)}return{errors:a,value:null}}function me(e,t){let n={};for(let r of e){if(!r.required)continue;let e=`${r.label} is required.`,i=t[r.id],a=r.type===`checkboxes`||r.type===`multi_select`?D(w(_(k()),y(1,e)),i??[]):D(w(k(),j(),x(e)),typeof i==`string`?i:``);a.success||(n[r.id]=a.issues[0]?.message??e)}return n}function he(e,t){switch(t.type){case`loading`:return{configuration:t.configuration,phase:`loading`,revision:e.revision,selectionKey:t.selectionKey};case`ready`:return{catalog:t.catalog,checkoutItems:t.checkoutItems,client:t.client,configuration:t.configuration,phase:`ready`,preparedCheckout:t.preparedCheckout,revision:e.revision+1,selectionKey:t.selectionKey};case`error`:return{configuration:t.configuration,failure:t.failure,phase:`error`,revision:e.revision,selectionKey:t.selectionKey};case`checkout`:return e.phase===`ready`?{...e,preparedCheckout:t.preparedCheckout}:e;default:return e}}function ge(e,t){if(`amountCents`in t){if(e.pricingMode!==`custom`)throw TypeError(`Fixed-price Products do not accept custom amounts.`);if(e.minimumAmountCents!==null&&t.amountCents<e.minimumAmountCents)throw TypeError(`Product amount must be at least ${e.minimumAmountCents} cents.`);return{amountCents:t.amountCents,productId:e.id}}if(e.pricingMode!==`fixed`)throw TypeError(`Custom-amount Products do not accept quantities.`);if(e.minimumQuantity!==null&&t.quantity<e.minimumQuantity)throw TypeError(`Product quantity must be at least ${e.minimumQuantity}.`);if(e.maximumQuantity!==null&&t.quantity>e.maximumQuantity)throw TypeError(`Product quantity must not exceed ${e.maximumQuantity}.`);if(e.inventoryQuantity!==null&&t.quantity>e.inventoryQuantity)throw TypeError(`Requested Product quantity is unavailable.`);return{productId:e.id,quantity:t.quantity}}function X(e,t){if(t.length===0)throw TypeError(`Lockerverse payment requires at least one Product.`);return t.map(t=>{let n=e.products.find(e=>e.slug===t.productSlug);if(!n)throw TypeError(`Product ${t.productSlug} is not available.`);return ge(n,t)})}function Z(e,t){let{apiBaseUrl:n,communitySlug:r,environment:i,fetch:a,requestTimeoutMs:o,sentryDsn:s,widgetSlug:c}=e,l={communitySlug:r,widgetSlug:c,...a?{fetch:a}:{},...t?{onError:t}:{},...o===void 0?{}:{requestTimeoutMs:o},...s===void 0?{}:{sentryDsn:s}};if(n===void 0){if(i===`development`)throw TypeError(`Lockerverse development checkout requires an API base URL.`);return{...l,...i===`production`?{environment:i}:{}}}if(!i)throw TypeError(`Lockerverse development checkout requires an environment.`);return{...l,apiBaseUrl:n,environment:i}}function Q(e,t,n){return e?.configuration===t&&e.selectionKey===n}function _e({apiBaseUrl:e,communitySlug:t,environment:n,fetch:r,onError:i,paymentState:a,requestTimeoutMs:s,selection:d,sentryDsn:f,widgetSlug:p}){let m=c(()=>({apiBaseUrl:e,communitySlug:t,environment:n,fetch:r,requestTimeoutMs:s,sentryDsn:f,widgetSlug:p}),[e,t,n,r,s,f,p]),h=K(d),_=h.success?JSON.stringify(h.value):`invalid-selection`,v=c(()=>h.success?JSON.parse(_):[],[h.success,_]),[y,b]=l(he,{phase:`idle`,revision:0}),x=u(void 0),S=u(void 0),C=u(i);return C.current=i,o(()=>{if(!h.success||a===`submitting`||a===`success`||a===`unresolved`||Q(S.current,m,_)||Q(x.current,m,_))return;let e=!0,t={configuration:m,selectionKey:_};x.current=t,b({configuration:m,selectionKey:_,type:`loading`});async function n(){try{let n=g(Z(m,e=>C.current?.(e))),r=await n.load(),i=X(r,v),a=await n.calculateTotal({...r.widget.fields.serviceFee?{includeServiceFee:!0}:{},items:i});e&&(x.current=void 0,S.current=t,b({catalog:r,checkoutItems:i,client:n,configuration:m,preparedCheckout:a,selectionKey:_,type:`ready`}))}catch(n){e&&(x.current=void 0,S.current=t,b({configuration:m,failure:n instanceof Error?n.message:`Lockerverse payment could not load.`,selectionKey:_,type:`error`}))}}return n(),()=>{e=!1,Q(x.current,m,_)&&(x.current=void 0)}},[m,h.success,a,_,v]),{selectionError:h.success?void 0:h.message,session:y,updateCheckout:e=>b({preparedCheckout:e,type:`checkout`})}}function $(e){return new Intl.NumberFormat(`en-US`,{currency:`USD`,style:`currency`}).format(e/100)}function ve(e,t){return t.tipPercent===`custom`?fe(t.customTip):{cents:Math.round(e*Number(t.tipPercent)/100),success:!0}}const ye=[{callingCode:`+1`,label:`🇺🇸 +1`,value:`US`},{callingCode:`+52`,label:`🇲🇽 +52`,value:`MX`},{callingCode:`+380`,label:`🇺🇦 +380`,value:`UA`},{callingCode:`+48`,label:`🇵🇱 +48`,value:`PL`},{callingCode:`+1`,label:`🇨🇦 +1`,value:`CA`},{callingCode:`+49`,label:`🇩🇪 +49`,value:`DE`},{callingCode:`+44`,label:`🇬🇧 +44`,value:`GB`},{callingCode:`+46`,label:`🇸🇪 +46`,value:`SE`},{callingCode:`+358`,label:`🇫🇮 +358`,value:`FI`},{callingCode:`+1`,label:`🇵🇷 +1`,value:`PR`}];function be(e,t){return e.trim().startsWith(`+`)?e:`${ye.find(e=>e.value===t)?.callingCode??`+1`}${e}`}function xe(e,t){return e.map(e=>{let n=t[e.id];return e.type===`checkboxes`||e.type===`multi_select`?{fieldId:e.id,value:Array.isArray(n)?n:[]}:{fieldId:e.id,value:typeof n==`string`?n:``}})}function Se(e,t,n,r){return{email:n,...e.widget.fields.serviceFee?{includeServiceFee:t.includeServiceFee}:{},...e.widget.fields.promoCode&&t.promoCode.trim()?{promoCode:t.promoCode.trim()}:{},...e.widget.fields.tipping?{tipCents:r}:{}}}async function Ce(e,t){let n=e.getElement(`address`,{mode:t}),r=t===`billing`?`Billing`:`Shipping`;if(!n)throw Error(`${r} address is still loading.`);let i=await n.getValue();if(!i.complete)throw Error(`${r} address is required.`);return i.value}function we(e,t,n,r){if(e.widget.fields.shipping)return n.shippingMatchesBilling?r:Ce(t,`shipping`)}function Te({billingAddress:e,catalog:t,email:n,phone:r,shippingAddress:i}){return{payment_method_data:{billing_details:{address:e.address,email:n,name:e.name,...t.widget.fields.phone?{phone:r}:{}}},...i?{shipping:{address:i.address,name:i.name,phone:t.widget.fields.phone?r:i.phone??null}}:{}}}function Ee({catalog:e,confirmationToken:t,email:n,fieldValues:r,phone:i}){return{confirmationToken:t,customFieldAnswers:xe(e.widget.customFields,r.customFields),email:n,...e.widget.fields.memberId&&r.memberId.trim()?{memberId:r.memberId.trim()}:{},...e.widget.fields.merchSize?{merchSize:r.merchSize}:{},...e.widget.fields.phone?{phone:i}:{}}}async function De({catalog:e,checkoutItems:t,client:n,elements:r,email:i,fieldValues:a,phone:o,quote:s,stripe:c}){let l=i.trim().toLowerCase(),u=Y(o),d=ve(s.subtotalCents,a);if(!d.success)throw Error(d.message);let f=Se(e,a,l,d.cents),p=await n.calculateTotal({...f,items:t});if(await r.update({amount:p.totalCents}),z(s,p))return{kind:`quote_changed`,quote:p};let m=await r.submit();if(m.error)throw Error(m.error.message);let h=await Ce(r,`billing`),g=await we(e,r,a,h),_=await c.createConfirmationToken({elements:r,params:Te({billingAddress:h,catalog:e,email:l,phone:u,shippingAddress:g})});if(_.error)throw Error(_.error.message);let v=await H(n,{checkout:p,submission:Ee({catalog:e,confirmationToken:_.confirmationToken.id,email:l,fieldValues:a,phone:u})},c);return v.kind===`failed`?{kind:`payment_failed`,message:`Payment was declined. Check your payment details and try again.`}:v.kind===`unresolved`?{kind:`payment_unresolved`,paymentReference:v.paymentReference,reason:v.reason}:{kind:`payment`,payment:v.payment,quote:p}}function Oe({accentColor:e,catalog:n,checkoutItems:r,client:i,onPaymentComplete:a,onPaymentUncertain:o,onQuoteChange:s,quote:l,onStateChange:u,stripeLoader:d,theme:f}){let m=c(()=>d(n.payment.publishableKey,l.payment.connectedAccountId?{stripeAccount:l.payment.connectedAccountId}:void 0),[n.payment.publishableKey,l.payment.connectedAccountId,d]);return p(t,{options:{amount:l.totalCents,appearance:{rules:{".Input:focus":{borderColor:e,boxShadow:`none`,outline:`none`}},theme:f===`light`?`stripe`:`night`,variables:{borderRadius:`8px`,colorBackground:f===`light`?`#f5f6f7`:`#101010`,colorDanger:f===`light`?`#c52b3e`:`#ef4444`,colorPrimary:e,colorText:f===`light`?`#121416`:`#ffffff`,colorTextPlaceholder:f===`light`?`#72767d`:`#6b6b6b`,colorTextSecondary:f===`light`?`#62666d`:`#a1a1aa`,focusBoxShadow:`none`,focusOutline:`none`,fontFamily:`Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif`,fontSizeBase:`16px`}},currency:l.payment.currency,excludedPaymentMethodTypes:[`us_bank_account`],mode:`payment`,syncAddressCheckbox:`none`},stripe:m,children:p(Ie,{catalog:n,checkoutItems:r,client:i,onPaymentComplete:a,onPaymentUncertain:o,onQuoteChange:s,onStateChange:u,quote:l})},`${n.payment.publishableKey}:${l.payment.connectedAccountId??`platform`}`)}function ke({label:e}){return m(`div`,{className:`lockerverse-payment__stripe-loader`,role:`status`,children:[p(`p`,{children:e}),m(`div`,{"aria-hidden":`true`,children:[p(`span`,{}),p(`span`,{}),p(`span`,{})]})]})}function Ae({onError:e,onReady:t,ready:r}){return m(`div`,{className:`lockerverse-payment__stripe-element`,"data-ready":r,children:[r?null:p(ke,{label:`Loading payment form...`}),p(n,{onLoadError:({error:t})=>e(t.message??`Payment form failed to load.`),onReady:t,options:{business:{name:`Lockerverse`},fields:{billingDetails:{email:`auto`}},layout:`tabs`,terms:{applePay:`auto`,auBecsDebit:`never`,bancontact:`never`,card:`always`,cashapp:`never`,googlePay:`never`,ideal:`never`,paypal:`auto`,sepaDebit:`never`,sofort:`never`,usBankAccount:`never`},wallets:{applePay:`auto`,googlePay:`never`}}})]})}function je({label:t,mode:n,onError:r,onReady:i,ready:a}){return m(`div`,{className:`lockerverse-payment__address`,children:[p(`h2`,{children:t}),m(`div`,{className:`lockerverse-payment__stripe-element lockerverse-payment__stripe-element--address`,"data-ready":a,children:[a?null:p(ke,{label:`Loading ${t.toLowerCase()}...`}),p(e,{onLoadError:({error:e})=>r(e.message??`${t} failed to load.`),onReady:i,options:{autocomplete:{mode:`automatic`},mode:n}})]})]})}function Me({message:e}){return e?p(`p`,{className:`lockerverse-payment__field-message`,role:`alert`,children:e}):null}function Ne({customFieldErrors:e,emailRef:t,form:n,parsedTipSuccess:r,phoneRef:i,validationErrors:a}){if(a.email){t.current?.focus();return}if(a.phone){i.current?.focus();return}if(!r){n.querySelector(`[name="tip"]`)?.focus();return}let[o]=Object.keys(e);o&&n.querySelector(`[name="custom:${o}"]`)?.focus()}function Pe({onPaymentComplete:e,onPaymentUncertain:t,onQuoteChange:n,onStateChange:r,result:i,setDisplayedTotalCents:a,setPaymentError:o,setTerminalState:s}){if(i.kind===`quote_changed`){let e=`The total changed to ${$(i.quote.totalCents)}. Review it and pay again.`;n(i.quote,e),a(i.quote.totalCents),r(`idle`);return}if(i.kind===`payment_failed`){o(i.message),r(`error`);return}if(i.kind===`payment_unresolved`){s({kind:`unresolved`,message:`Payment is still processing. Do not submit it again.`}),r(`unresolved`);try{t?.({paymentReference:i.paymentReference,reason:i.reason})}catch{}return}n(i.quote),s({kind:`success`,message:`Payment completed successfully.`}),r(`success`);try{e?.(i.payment)}catch{}}function Fe({email:e,emailErrorId:t,emailId:n,emailRef:r,errors:i,onEmailChange:a,onPhoneChange:o,onPhoneCountryChange:s,phone:c,phoneCountry:l,phoneEnabled:u,phoneErrorId:d,phoneId:h,phoneRef:g}){return m(`div`,{className:`lockerverse-payment__contact`,children:[p(`label`,{htmlFor:n,children:`Email`}),p(`input`,{"aria-describedby":i.email?t:void 0,"aria-invalid":i.email?`true`:void 0,autoComplete:`email`,id:n,name:`email`,onChange:e=>a(e.currentTarget.value),placeholder:`name@example.com`,ref:r,type:`email`,value:e}),i.email?p(`p`,{className:`lockerverse-payment__field-message`,id:t,children:i.email}):null,u?m(f,{children:[p(`label`,{htmlFor:h,children:`Phone`}),m(`div`,{className:`lockerverse-payment__phone-control`,children:[p(`select`,{"aria-label":`Phone number country`,name:`phoneCountry`,onChange:e=>s(e.currentTarget.value),value:l,children:ye.map(e=>p(`option`,{value:e.value,children:e.label},e.value))}),p(`input`,{"aria-describedby":i.phone?d:void 0,"aria-invalid":i.phone?`true`:void 0,autoComplete:`tel`,id:h,inputMode:`tel`,name:`phone`,onChange:e=>o(e.currentTarget.value),placeholder:`(201) 555-0123`,ref:g,type:`tel`,value:c})]}),i.phone?p(`p`,{className:`lockerverse-payment__field-message`,id:d,children:i.phone}):null]}):null]})}function Ie({catalog:e,checkoutItems:t,client:n,onPaymentComplete:a,onPaymentUncertain:c,onQuoteChange:l,onStateChange:f,quote:h}){let[g,_]=d(``),[v,y]=d(``),[b,x]=d(`US`),[S,C]=d({}),[w,T]=d(),[E,D]=d({}),[O,k]=d(),[A,j]=d(!1),[M,N]=d(),[P,ee]=d(!1),[te,ne]=d(!1),[F,se]=d(!1),[I,ce]=d({customFields:{},customTip:``,includeServiceFee:e.widget.fields.serviceFee,memberId:``,merchSize:`M`,promoCode:``,shippingMatchesBilling:!0,tipPercent:`10`}),[le,ue]=d(h.totalCents),L=u(null),R=u(null),z=u(null),B=r(),V=i(),H=`lockerverse-${s()}`,U=`${H}-email`,W=`${U}-error`,G=`${H}-phone`,de=`${G}-error`,fe=`${H}-tip-error`,K=e.widget.fields.tipping?ve(h.subtotalCents,I):{cents:0,success:!0},q=K.success?K.cents:null,J=q??0,Y=le-J,he=!e.widget.fields.shipping||I.shippingMatchesBilling||F;o(()=>{if(q===null)return;let t=e.widget.fields.serviceFee&&I.includeServiceFee?h.serviceFeeCents||Math.round(h.subtotalCents*e.pricingPolicy.serviceFeeRateBasisPoints/1e4):0,n=h.totalCents-h.serviceFeeCents-h.tipCents+t+q;ue(n),B?.update({amount:n})},[e.widget.fields.serviceFee,e.widget.fields.tipping,B,I.includeServiceFee,I.tipPercent,I.customTip,q,h.serviceFeeCents,h.tipCents,h.totalCents]),o(()=>{A&&z.current?.focus()},[A]);function ge(e){C(t=>{let n={...t};return delete n[e],n})}function X(e){ce(e),D({}),k(void 0)}function Z(e){T(e),f(`error`)}async function Q(r){r.preventDefault();let i=pe({email:g,phone:be(v,b)},e.widget.fields.phone),o=me(e.widget.customFields,I.customFields);if(!(i.value&&K.success)||Object.keys(o).length>0){C(i.errors),D(o),k(K.success?void 0:K.message),f(`invalid`);let e=r.currentTarget;queueMicrotask(()=>{Ne({customFieldErrors:o,emailRef:L,form:e,parsedTipSuccess:K.success,phoneRef:R,validationErrors:i.errors})});return}if(C({}),D({}),!(B&&V)){T(`Payment form is still loading.`),f(`error`);return}T(void 0),j(!0),f(`submitting`);try{Pe({onPaymentComplete:a,onPaymentUncertain:c,onQuoteChange:l,onStateChange:f,result:await De({catalog:e,checkoutItems:t,client:n,elements:B,email:g,fieldValues:I,phone:be(v,b),quote:h,stripe:V}),setDisplayedTotalCents:ue,setPaymentError:T,setTerminalState:N})}catch(e){T(e instanceof Error?e.message:`Payment could not be completed.`),f(`error`)}finally{j(!1)}}return M?p(`p`,{className:`lockerverse-payment__payment-status`,ref:z,role:`status`,tabIndex:-1,children:M.message}):m(`form`,{"aria-busy":A,className:`lockerverse-payment__form`,noValidate:!0,onSubmit:Q,children:[p(`div`,{"data-lockerverse-input-region":``,inert:A?!0:void 0,children:m(`fieldset`,{className:`lockerverse-payment__input-fieldset`,disabled:A,children:[p(re,{enabled:e.widget.fields.tipping,error:O,errorId:fe,onChange:X,values:I}),p(Fe,{email:g,emailErrorId:W,emailId:U,emailRef:L,errors:S,onEmailChange:e=>{_(e),ge(`email`)},onPhoneChange:e=>{y(e),ge(`phone`)},onPhoneCountryChange:x,phone:v,phoneCountry:b,phoneEnabled:e.widget.fields.phone,phoneErrorId:de,phoneId:G,phoneRef:R}),p(Ae,{onError:Z,onReady:()=>ee(!0),ready:P}),p(je,{label:`Billing address`,mode:`billing`,onError:Z,onReady:()=>ne(!0),ready:te}),e.widget.fields.shipping?m(`div`,{className:`lockerverse-payment__shipping`,children:[p(ie,{checked:I.shippingMatchesBilling,name:`shippingMatchesBilling`,onChange:e=>{X({...I,shippingMatchesBilling:e}),e||se(!1)},children:`Shipping is same as billing information`}),I.shippingMatchesBilling?null:p(je,{label:`Shipping address`,mode:`shipping`,onError:Z,onReady:()=>se(!0),ready:F})]}):null,p(ae,{customFields:e.widget.customFields,errors:E,fields:e.widget.fields,idPrefix:H,onChange:X,values:I}),m(`div`,{className:`lockerverse-payment__actions`,children:[p(oe,{amountCents:h.serviceFeeCents||Math.round(h.subtotalCents*e.pricingPolicy.serviceFeeRateBasisPoints/1e4),enabled:e.widget.fields.serviceFee,onChange:X,values:I}),p(`button`,{"aria-busy":A,"aria-label":`Process payment for ${$(le)} total`,disabled:A||!(P&&te&&he),type:`submit`,children:A?`Processing…`:`Process Payment (${$(Y)})${J>0?` + ${$(J)} tip`:``}`})]})]})}),A?p(`p`,{className:`lockerverse-payment__payment-status`,ref:z,role:`status`,tabIndex:-1,children:`Processing payment…`}):null,p(Me,{message:w})]})}function Le(){return m(`div`,{className:`lockerverse-payment__skeleton-loader-block`,children:[p(`span`,{className:`lockerverse-payment__skeleton-loader-label`}),m(`div`,{className:`lockerverse-payment__skeleton-loader-content`,children:[p(`span`,{className:`lockerverse-payment__skeleton-loader-full`}),m(`div`,{className:`lockerverse-payment__skeleton-loader-grid`,children:[p(`span`,{className:`lockerverse-payment__skeleton-loader-half`}),p(`span`,{className:`lockerverse-payment__skeleton-loader-half`})]})]})]})}function Re(){return m(`div`,{className:`lockerverse-payment__loading`,children:[p(`span`,{"aria-live":`polite`,className:`lockerverse-payment__sr-only`,role:`status`,children:`Loading payment…`}),m(`div`,{"aria-hidden":`true`,className:`lockerverse-payment__skeleton`,children:[m(`div`,{className:`lockerverse-payment__skeleton-branding`,children:[p(`span`,{className:`lockerverse-payment__skeleton-avatar`}),p(`span`,{className:`lockerverse-payment__skeleton-community`})]}),m(`div`,{className:`lockerverse-payment__skeleton-contact`,children:[m(`div`,{className:`lockerverse-payment__skeleton-field`,children:[p(`span`,{className:`lockerverse-payment__skeleton-label`}),p(`span`,{className:`lockerverse-payment__skeleton-input`})]}),m(`div`,{className:`lockerverse-payment__skeleton-field`,children:[p(`span`,{className:`lockerverse-payment__skeleton-label`}),p(`span`,{className:`lockerverse-payment__skeleton-input`})]})]}),p(Le,{}),p(Le,{}),m(`div`,{className:`lockerverse-payment__skeleton-actions`,children:[p(`span`,{className:`lockerverse-payment__skeleton-check-line`}),p(`span`,{className:`lockerverse-payment__skeleton-button`})]})]})]})}function ze({apiBaseUrl:e,branding:t,className:n,communitySlug:r,environment:i,fetch:s,onError:c,onPaymentComplete:l,onPaymentUncertain:u,requestTimeoutMs:f,selection:h,sentryDsn:g,style:_,stripeLoader:v=a,theme:y=`dark`,widgetSlug:b,...x}){let[S,C]=d(),[w,T]=d(`idle`),{selectionError:E,session:D,updateCheckout:O}=_e({apiBaseUrl:e,communitySlug:r,environment:i,fetch:s,onError:c,paymentState:w,requestTimeoutMs:f,selection:h,sentryDsn:g,widgetSlug:b});o(()=>{D.phase===`loading`&&C(void 0)},[D.phase]),o(()=>{D.phase===`ready`&&T(e=>e===`success`||e===`unresolved`?e:`idle`)},[D.phase,D.revision]);let k=[`lockerverse-payment`,n].filter(Boolean).join(` `),A=te(_?.[`--lockerverse-accent`]??t?.accentColor??`#38d77a`),j={..._,...t?.accentColor&&_?.[`--lockerverse-accent`]===void 0?{"--lockerverse-accent":t.accentColor}:{},...A&&_?.[`--lockerverse-accent-contrast`]===void 0?{"--lockerverse-accent-contrast":A}:{}};if(E)return p(`section`,{...x,className:k,"data-lockerverse-theme":y,role:`alert`,style:j,children:E});if(D.phase===`error`)return p(`section`,{...x,className:k,"data-lockerverse-theme":y,role:`alert`,children:D.failure});if(D.phase!==`ready`)return p(`section`,{...x,"aria-busy":`true`,"aria-label":`Payment`,className:k,"data-lockerverse-theme":y,children:p(Re,{})});let{catalog:M,checkoutItems:N,client:P,preparedCheckout:ee}=D;return m(`section`,{...x,"aria-label":`Payment`,className:k,"data-lockerverse-theme":y,"data-payment-state":w,style:j,children:[m(`header`,{children:[M.widget.showCommunityBranding&&t?m(`div`,{className:`lockerverse-payment__branding`,children:[t.imageUrl?p(`img`,{alt:t.name,height:`48`,src:t.imageUrl,width:`48`}):null,p(`strong`,{children:t.name})]}):null,p(`h1`,{children:M.widget.title??M.widget.name}),M.widget.description?p(`p`,{children:M.widget.description}):null]}),S?p(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:S}):null,p(Oe,{accentColor:_?.[`--lockerverse-accent`]??t?.accentColor??`#38d77a`,catalog:M,checkoutItems:N,client:P,onPaymentComplete:l,onPaymentUncertain:u,onQuoteChange:(e,t)=>{C(t),O(e)},onStateChange:T,quote:ee,stripeLoader:v,theme:y})]})}export{ze as LockerversePayment};
1
+ import{AddressElement as e,Elements as t,PaymentElement as n,useElements as r,useStripe as i}from"@stripe/react-stripe-js";import{loadStripe as a}from"@stripe/stripe-js/pure/index.js";import{createContext as o,useContext as s,useEffect as c,useId as l,useMemo as u,useReducer as d,useRef as f,useState as p}from"react";import{Select as m}from"@base-ui/react/select";import{Fragment as h,jsx as g,jsxs as _}from"react/jsx-runtime";import{LockerverseSdkError as v,createLockerverseCheckoutClient as y}from"@lockerverse/sdk/checkout";import{array as b,email as x,minLength as S,minValue as C,nonEmpty as w,number as T,object as E,pipe as D,regex as O,safeInteger as k,safeParse as A,strictObject as j,string as M,trim as N,union as ee}from"valibot";const P=/^#([\da-f]{3}|[\da-f]{6})$/i;function F(e){let t=P.exec(e.trim());if(!t)return;let[,n]=t;if(!n)return;let r=n.length===3?Array.from(n,e=>`${e}${e}`).join(``):n;return[0,2,4].map(e=>Number.parseInt(r.slice(e,e+2),16))}function I([e,t,n]){let[r=0,i=0,a=0]=[e,t,n].map((e=0)=>{let t=e/255;return t<=.04045?t/12.92:((t+.055)/1.055)**2.4});return .2126*r+.7152*i+.0722*a}function te(e){let t=F(e);if(!t)return;let n=I(t);return(n+.05)/.05>=1.05/(n+.05)?`#000`:`#fff`}const L=o(void 0);function ne({children:e,container:t}){return g(L.Provider,{value:t,children:e})}function re(){return g(`svg`,{"aria-hidden":`true`,fill:`none`,viewBox:`0 0 16 16`,children:g(`path`,{d:`m4 6 4 4 4-4`})})}function R(){return g(`svg`,{"aria-hidden":`true`,fill:`none`,viewBox:`0 0 16 16`,children:g(`path`,{d:`m3 8 3 3 7-7`})})}function z({ariaDescribedBy:e,ariaLabel:t,ariaLabelledBy:n,className:r,id:i,invalid:a=!1,name:o,onValueChange:c,options:l,value:u}){let d=s(L),f=[`lockerverse-payment__select`,r].filter(Boolean).join(` `);return g(`div`,{className:f,children:_(m.Root,{id:i,items:l,name:o,onValueChange:e=>{e!==null&&c(e)},value:u,children:[_(m.Trigger,{"aria-describedby":e,"aria-invalid":a||void 0,"aria-label":t,"aria-labelledby":n,className:`lockerverse-payment__select-trigger`,children:[g(m.Value,{}),g(m.Icon,{"aria-hidden":`true`,className:`lockerverse-payment__select-icon`,children:g(re,{})})]}),g(m.Portal,{container:d,children:g(m.Positioner,{alignItemWithTrigger:!1,className:`lockerverse-payment__select-positioner`,sideOffset:6,children:g(m.Popup,{className:`lockerverse-payment__select-popup`,children:g(m.List,{className:`lockerverse-payment__select-list`,children:l.map(e=>_(m.Item,{className:`lockerverse-payment__select-item`,value:e.value,children:[g(m.ItemText,{children:e.label}),g(m.ItemIndicator,{"aria-hidden":`true`,className:`lockerverse-payment__select-item-indicator`,children:g(R,{})})]},e.value))})})})})]})})}const B=[`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`],ie=[`15`,`12`,`10`,`5`],V=[...ie,`custom`];function ae({enabled:e,error:t,errorId:n,onChange:r,values:i}){if(!e)return null;let a=e=>r({...i,...e}),o=(e,t)=>{let n=V.indexOf(t),r;switch(e.key){case`ArrowDown`:case`ArrowRight`:r=(n+1)%V.length;break;case`ArrowLeft`:case`ArrowUp`:r=(n-1+V.length)%V.length;break;case`Home`:r=0;break;case`End`:r=V.length-1;break;default:return}e.preventDefault();let i=V[r];i&&((e.currentTarget.closest(`[role="radiogroup"]`)?.querySelectorAll(`input[type="radio"]`))?.[r]?.focus(),a({tipPercent:i}))};return _(`div`,{className:`lockerverse-payment__tip-box`,children:[g(`p`,{children:`Add a tip to support the Lockerverse platform`}),_(`div`,{"aria-label":`Tip amount`,role:`radiogroup`,children:[ie.map(e=>_(`label`,{className:`lockerverse-payment__tip-choice`,children:[g(`input`,{checked:i.tipPercent===e,name:`tipPercent`,onChange:()=>a({tipPercent:e}),onKeyDown:t=>o(t,e),tabIndex:i.tipPercent===e?0:-1,type:`radio`,value:e}),_(`span`,{children:[e,`%`]})]},e)),_(`label`,{className:`lockerverse-payment__tip-choice`,children:[g(`input`,{checked:i.tipPercent===`custom`,name:`tipPercent`,onChange:()=>a({tipPercent:`custom`}),onKeyDown:e=>o(e,`custom`),tabIndex:i.tipPercent===`custom`?0:-1,type:`radio`,value:`custom`}),g(`span`,{children:`Other`})]})]}),i.tipPercent===`custom`?_(`label`,{children:[g(`span`,{children:`Custom tip`}),_(`span`,{className:`lockerverse-payment__money-input`,children:[g(`span`,{"aria-hidden":`true`,children:`$`}),g(`input`,{"aria-describedby":t?n:void 0,"aria-invalid":t?`true`:void 0,inputMode:`decimal`,name:`tip`,onChange:e=>a({customTip:e.currentTarget.value}),placeholder:`0.00`,value:i.customTip})]}),t?g(`span`,{className:`lockerverse-payment__field-message`,id:n,children:t}):null]}):g(`input`,{name:`tip`,type:`hidden`,value:i.tipPercent})]})}function oe({checked:e,children:t,name:n,onChange:r}){return _(`label`,{className:`lockerverse-payment__check-row`,children:[g(`input`,{checked:e,name:n,onChange:e=>r(e.currentTarget.checked),type:`checkbox`}),g(`span`,{children:t})]})}function se({customFields:e,errors:t,fields:n,idPrefix:r,onChange:i,values:a}){let o=e=>i({...a,...e});return _(`div`,{className:`lockerverse-payment__additional-fields`,children:[n.memberId?_(`label`,{children:[g(`span`,{children:`Member ID`}),g(`input`,{name:`memberId`,onChange:e=>o({memberId:e.currentTarget.value}),placeholder:`Optional`,value:a.memberId})]}):null,n.merchSize?_(`div`,{className:`lockerverse-payment__field`,children:[g(`span`,{id:`${r}-merch-size-label`,children:`Size`}),g(z,{ariaLabelledBy:`${r}-merch-size-label`,name:`merchSize`,onValueChange:e=>o({merchSize:e}),options:B.map(e=>({label:e,value:e})),value:a.merchSize})]}):null,n.promoCode?_(`label`,{children:[g(`span`,{children:`Promo code`}),g(`input`,{name:`promoCode`,onChange:e=>o({promoCode:e.currentTarget.value}),placeholder:`Optional`,value:a.promoCode})]}):null,e.map(e=>g(le,{error:t[e.id],field:e,idPrefix:r,onChange:t=>o({customFields:{...a.customFields,[e.id]:t}}),value:a.customFields[e.id]},e.id))]})}function ce({amountCents:e,enabled:t,onChange:n,values:r}){return t?_(oe,{checked:r.includeServiceFee,name:`includeServiceFee`,onChange:e=>n({...r,includeServiceFee:e}),children:[`Add `,W(e),` to help cover processing fees`]}):null}function le({error:e,field:t,idPrefix:n,onChange:r,value:i}){let a=`custom:${t.id}`,o=`${n}-custom-${t.id}`,s=`${o}-error`;switch(t.type){case`text`:case`textarea`:return g(ue,{controlId:o,error:e,errorId:s,field:t,name:a,onChange:r,value:i});case`select`:case`multi_select`:return g(U,{controlId:o,error:e,errorId:s,field:t,name:a,onChange:r,value:i});case`radio`:case`checkboxes`:return g(de,{controlId:o,error:e,errorId:s,field:t,name:a,onChange:r,value:i});default:return null}}function H({error:e,id:t}){return e?g(`p`,{className:`lockerverse-payment__field-message`,id:t,children:e}):null}function ue({controlId:e,error:t,errorId:n,field:r,name:i,onChange:a,value:o}){let s={"aria-describedby":t?n:void 0,"aria-invalid":t?`true`:void 0,id:e,name:i,onChange:e=>a(e.currentTarget.value),required:r.required,value:typeof o==`string`?o:``};return _(`label`,{htmlFor:e,children:[g(`span`,{children:r.label}),r.type===`textarea`?g(`textarea`,{...s}):g(`input`,{...s}),g(H,{error:t,id:n})]})}function U({controlId:e,error:t,errorId:n,field:r,name:i,onChange:a,value:o}){return _(`label`,{htmlFor:e,children:[g(`span`,{children:r.label}),_(`select`,{"aria-describedby":t?n:void 0,"aria-invalid":t?`true`:void 0,id:e,multiple:r.type===`multi_select`,name:i,onChange:e=>a(r.type===`multi_select`?[...e.currentTarget.selectedOptions].map(e=>e.value):e.currentTarget.value),required:r.required,value:o??(r.type===`multi_select`?[]:``),children:[r.type===`select`?g(`option`,{value:``,children:`Select…`}):null,r.options.map(e=>g(`option`,{value:e.id,children:e.label},e.id))]}),g(H,{error:t,id:n})]})}function de({controlId:e,error:t,errorId:n,field:r,name:i,onChange:a,value:o}){return _(`fieldset`,{"aria-describedby":t?n:void 0,"aria-invalid":t?`true`:void 0,children:[g(`legend`,{children:r.label}),r.options.map((t,n)=>{let s=Array.isArray(o)?o.includes(t.id):o===t.id;return _(`label`,{className:`lockerverse-payment__check-row`,children:[g(`input`,{checked:s,id:`${e}-${n}`,name:i,onChange:e=>{if(r.type===`radio`){a(t.id);return}let n=Array.isArray(o)?o:[];a(e.currentTarget.checked?[...n,t.id]:n.filter(e=>e!==t.id))},required:r.required,type:r.type===`radio`?`radio`:`checkbox`,value:t.id}),g(`span`,{children:t.label})]},t.id)}),g(H,{error:t,id:n})]})}function W(e){return new Intl.NumberFormat(`en-US`,{currency:`USD`,style:`currency`}).format(e/100)}const G=[`amountCents`,`discountableSubtotalCents`,`discountCents`,`serviceFeeCents`,`subtotalCents`,`tipCents`,`totalCents`];function K(e,t){return G.some(n=>e[n]!==t[n])||e.payment.connectedAccountId!==t.payment.connectedAccountId||e.payment.currency!==t.payment.currency||JSON.stringify(e.appliedDiscount)!==JSON.stringify(t.appliedDiscount)||JSON.stringify(e.lineItems)!==JSON.stringify(t.lineItems)}function q(e){return e.checkoutStatus===`success`?{kind:`success`,payment:e}:e.checkoutStatus===`failed`?{kind:`failed`,payment:e}:{kind:`unresolved`,paymentReference:e.paymentReference,reason:e.checkoutStatus===`action_required`?`action_required`:`pending`}}async function fe(e,t,n){if(t.checkoutStatus!==`action_required`)return q(t);if(t.clientSecret)try{await n.handleNextAction({clientSecret:t.clientSecret})}catch{}try{return q(await e.getPaymentStatus(t.paymentReference))}catch{return{kind:`unresolved`,paymentReference:t.paymentReference,reason:`action_required`}}}async function pe(e,t,n){let r;try{r=await e.submitPayment(t)}catch(n){if(!(n instanceof v&&n.recoveryRecommended))throw n;try{r=await e.getPaymentStatus(t.checkout.paymentReference)}catch{return{kind:`unresolved`,paymentReference:t.checkout.paymentReference,reason:`recovery_failed`}}}return fe(e,r,n)}async function me(e,t,n){try{return fe(e,await e.getPaymentStatus(t),n)}catch{return{kind:`unresolved`,paymentReference:t,reason:`recovery_failed`}}}const he=D(M(),N(),w()),ge=D(T(),k(),C(1)),J=D(b(ee([j({amountCents:ge,productSlug:he}),j({productSlug:he,quantity:ge})])),S(1)),Y=D(M(),N(),O(/^(?:0|[1-9]\d*)(?:\.\d{1,2})?$/,`Enter a valid tip amount.`));function X(e){let t=A(Y,e);if(!t.success)return{message:t.issues[0]?.message??`Enter a valid tip amount.`,success:!1};let[n=`0`,r=``]=t.output.split(`.`),i=BigInt(n)*100n+BigInt(r.padEnd(2,`0`));return i>BigInt(2**53-1)?{message:`Enter a valid tip amount.`,success:!1}:{cents:Number(i),success:!0}}function _e(e){let t=A(J,e);return t.success?{success:!0,value:t.output}:{message:`Lockerverse payment configuration is invalid.`,success:!1}}const ve=D(M(),N(),w(`Email is required.`),x(`Enter a valid email address.`)),ye=D(M(),N(),w(`Phone is required.`),O(/^\+[1-9]\d{6,14}$/,`Enter a valid phone number.`));function Z(e){return e.trim().replace(/[().\s-]/g,``)}function be(e,t){let n=t?{...e,phone:Z(e.phone)}:e,r=E(t?{email:ve,phone:ye}:{email:ve}),i=A(r,n);if(i.success)return{errors:{},value:i.output};let a={};for(let e of i.issues){let t=e.path?.[0]?.key;(t===`email`||t===`phone`)&&!a[t]&&(a[t]=e.message)}return{errors:a,value:null}}function xe(e,t){let n={};for(let r of e){if(!r.required)continue;let e=`${r.label} is required.`,i=t[r.id],a=r.type===`checkboxes`||r.type===`multi_select`?A(D(b(M()),S(1,e)),i??[]):A(D(M(),N(),w(e)),typeof i==`string`?i:``);a.success||(n[r.id]=a.issues[0]?.message??e)}return n}function Se(e,t){switch(t.type){case`loading`:return{configuration:t.configuration,phase:`loading`,revision:e.revision,selectionKey:t.selectionKey};case`ready`:return{catalog:t.catalog,checkoutItems:t.checkoutItems,client:t.client,configuration:t.configuration,phase:`ready`,preparedCheckout:t.preparedCheckout,revision:e.revision+1,selectionKey:t.selectionKey};case`error`:return{configuration:t.configuration,failure:t.failure,phase:`error`,revision:e.revision,selectionKey:t.selectionKey};case`checkout`:return e.phase===`ready`?{...e,preparedCheckout:t.preparedCheckout}:e;case`retry`:return{phase:`idle`,revision:e.revision+1};default:return e}}function Ce(e,t){if(`amountCents`in t){if(e.pricingMode!==`custom`)throw TypeError(`Fixed-price Products do not accept custom amounts.`);if(e.minimumAmountCents!==null&&t.amountCents<e.minimumAmountCents)throw TypeError(`Product amount must be at least ${e.minimumAmountCents} cents.`);return{amountCents:t.amountCents,productId:e.id}}if(e.pricingMode!==`fixed`)throw TypeError(`Custom-amount Products do not accept quantities.`);if(e.minimumQuantity!==null&&t.quantity<e.minimumQuantity)throw TypeError(`Product quantity must be at least ${e.minimumQuantity}.`);if(e.maximumQuantity!==null&&t.quantity>e.maximumQuantity)throw TypeError(`Product quantity must not exceed ${e.maximumQuantity}.`);if(e.inventoryQuantity!==null&&t.quantity>e.inventoryQuantity)throw TypeError(`Requested Product quantity is unavailable.`);return{productId:e.id,quantity:t.quantity}}function we(e,t){if(t.length===0)throw TypeError(`Lockerverse payment requires at least one Product.`);return t.map(t=>{let n=e.products.find(e=>e.slug===t.productSlug);if(!n)throw TypeError(`Product ${t.productSlug} is not available.`);return Ce(n,t)})}function Te(e,t){let{apiBaseUrl:n,communitySlug:r,environment:i,fetch:a,requestTimeoutMs:o,sentryDsn:s,widgetSlug:c}=e,l={communitySlug:r,widgetSlug:c,...a?{fetch:a}:{},...t?{onError:t}:{},...o===void 0?{}:{requestTimeoutMs:o},...s===void 0?{}:{sentryDsn:s}};if(n===void 0){if(i===`development`)throw TypeError(`Lockerverse development checkout requires an API base URL.`);return{...l,...i===`production`?{environment:i}:{}}}if(!i)throw TypeError(`Lockerverse development checkout requires an environment.`);return{...l,apiBaseUrl:n,environment:i}}function Ee(e,t,n){return e?.configuration===t&&e.selectionKey===n}function De({apiBaseUrl:e,communitySlug:t,environment:n,fetch:r,onError:i,paymentState:a,requestTimeoutMs:o,selection:s,sentryDsn:l,widgetSlug:p}){let m=u(()=>({apiBaseUrl:e,communitySlug:t,environment:n,fetch:r,requestTimeoutMs:o,sentryDsn:l,widgetSlug:p}),[e,t,n,r,o,l,p]),h=_e(s),g=h.success?JSON.stringify(h.value):`invalid-selection`,_=u(()=>h.success?JSON.parse(g):[],[h.success,g]),[v,b]=d(Se,{phase:`idle`,revision:0}),x=f(void 0),S=f(void 0),C=f(i);return C.current=i,c(()=>{if(!h.success||a===`submitting`||a===`success`||a===`unresolved`||Ee(S.current,m,g)||Ee(x.current,m,g))return;let e=!0,t={configuration:m,selectionKey:g};x.current=t,b({configuration:m,selectionKey:g,type:`loading`});async function n(){try{let n=y(Te(m,e=>C.current?.(e))),r=await n.load(),i=we(r,_),a=await n.calculateTotal({...r.widget.fields.serviceFee?{includeServiceFee:!0}:{},items:i});e&&(x.current=void 0,S.current=t,b({catalog:r,checkoutItems:i,client:n,configuration:m,preparedCheckout:a,selectionKey:g,type:`ready`}))}catch(n){e&&(x.current=void 0,S.current=t,b({configuration:m,failure:n instanceof Error?n.message:`Lockerverse payment could not load.`,selectionKey:g,type:`error`}))}}return n(),()=>{e=!1,Ee(x.current,m,g)&&(x.current=void 0)}},[m,h.success,a,g,v.revision,_]),{retryCheckout:()=>{x.current=void 0,S.current=void 0,b({type:`retry`})},selectionError:h.success?void 0:h.message,session:v,updateCheckout:e=>b({preparedCheckout:e,type:`checkout`})}}function Q(e){return new Intl.NumberFormat(`en-US`,{currency:`USD`,style:`currency`}).format(e/100)}function Oe(e,t){return t.tipPercent===`custom`?X(t.customTip):{cents:Math.round(e*Number(t.tipPercent)/100),success:!0}}const ke=[{callingCode:`+1`,label:`🇺🇸 +1`,value:`US`},{callingCode:`+52`,label:`🇲🇽 +52`,value:`MX`},{callingCode:`+380`,label:`🇺🇦 +380`,value:`UA`},{callingCode:`+48`,label:`🇵🇱 +48`,value:`PL`},{callingCode:`+1`,label:`🇨🇦 +1`,value:`CA`},{callingCode:`+49`,label:`🇩🇪 +49`,value:`DE`},{callingCode:`+44`,label:`🇬🇧 +44`,value:`GB`},{callingCode:`+46`,label:`🇸🇪 +46`,value:`SE`},{callingCode:`+358`,label:`🇫🇮 +358`,value:`FI`},{callingCode:`+1`,label:`🇵🇷 +1`,value:`PR`}];function Ae(e,t){return e.trim().startsWith(`+`)?e:`${ke.find(e=>e.value===t)?.callingCode??`+1`}${e}`}function je(e,t){return e.map(e=>{let n=t[e.id];return e.type===`checkboxes`||e.type===`multi_select`?{fieldId:e.id,value:Array.isArray(n)?n:[]}:{fieldId:e.id,value:typeof n==`string`?n:``}})}function Me(e,t,n,r){return{email:n,...e.widget.fields.serviceFee?{includeServiceFee:t.includeServiceFee}:{},...e.widget.fields.promoCode&&t.promoCode.trim()?{promoCode:t.promoCode.trim()}:{},...e.widget.fields.tipping?{tipCents:r}:{}}}async function Ne(e,t){let n=e.getElement(`address`,{mode:t}),r=t===`billing`?`Billing`:`Shipping`;if(!n)throw Error(`${r} address is still loading.`);let i=await n.getValue();if(!i.complete)throw Error(`${r} address is required.`);return i.value}function Pe(e,t,n,r){if(e.widget.fields.shipping)return n.shippingMatchesBilling?r:Ne(t,`shipping`)}function Fe({billingAddress:e,catalog:t,email:n,phone:r,shippingAddress:i}){return{payment_method_data:{billing_details:{address:e.address,email:n,name:e.name,...t.widget.fields.phone?{phone:r}:{}}},...i?{shipping:{address:i.address,name:i.name,phone:t.widget.fields.phone?r:i.phone??null}}:{}}}function Ie({catalog:e,confirmationToken:t,email:n,fieldValues:r,phone:i}){return{confirmationToken:t,customFieldAnswers:je(e.widget.customFields,r.customFields),email:n,...e.widget.fields.memberId&&r.memberId.trim()?{memberId:r.memberId.trim()}:{},...e.widget.fields.merchSize?{merchSize:r.merchSize}:{},...e.widget.fields.phone?{phone:i}:{}}}async function Le({catalog:e,checkoutItems:t,client:n,elements:r,email:i,fieldValues:a,onPaymentRecoveryChange:o,phone:s,quote:c,stripe:l}){let u=i.trim().toLowerCase(),d=Z(s),f=Oe(c.subtotalCents,a);if(!f.success)throw Error(f.message);let p=Me(e,a,u,f.cents),m=await n.calculateTotal({...p,items:t});if(await r.update({amount:m.totalCents}),K(c,m))return{kind:`quote_changed`,quote:m};let h=await r.submit();if(h.error)throw Error(h.error.message);let g=await Ne(r,`billing`),_=await Pe(e,r,a,g),v=await l.createConfirmationToken({elements:r,params:Fe({billingAddress:g,catalog:e,email:u,phone:d,shippingAddress:_})});if(v.error)throw Error(v.error.message);$(o,{connectedAccountId:m.payment.connectedAccountId,paymentReference:m.paymentReference});let y=await pe(n,{checkout:m,submission:Ie({catalog:e,confirmationToken:v.confirmationToken.id,email:u,fieldValues:a,phone:d})},l);return y.kind===`failed`?{kind:`payment_failed`,message:`Payment was declined. Check your payment details and try again.`}:y.kind===`unresolved`?{kind:`payment_unresolved`,paymentReference:y.paymentReference,reason:y.reason}:{kind:`payment`,payment:y.payment,quote:m}}function Re({accentColor:e,catalog:n,checkoutItems:r,client:i,fontFamily:a,onPaymentComplete:o,onPaymentRecoveryChange:s,onPaymentUncertain:c,onQuoteChange:l,quote:d,resumePayment:f,onStateChange:p,stripeLoader:m,theme:h,visualStyle:_}){let v=f?f.connectedAccountId:d.payment.connectedAccountId,y=u(()=>m(n.payment.publishableKey,v?{stripeAccount:v}:void 0),[n.payment.publishableKey,v,m]);return g(t,{options:{amount:d.totalCents,appearance:{rules:{".Input:focus":{borderColor:e,boxShadow:`0 0 0 1px ${e}`,outline:`none`}},theme:h===`light`?`stripe`:`night`,variables:{borderRadius:_?.[`--lockerverse-radius`]??`10px`,colorBackground:_?.[`--lockerverse-control`]??(h===`light`?`#f5f6f7`:`#121212`),colorDanger:_?.[`--lockerverse-danger`]??(h===`light`?`#c52b3e`:`#f08a98`),colorPrimary:e,colorText:_?.[`--lockerverse-text`]??(h===`light`?`#121416`:`#ffffff`),colorTextPlaceholder:_?.[`--lockerverse-placeholder`]??(h===`light`?`#72767d`:`#6b6b6b`),colorTextSecondary:_?.[`--lockerverse-muted`]??(h===`light`?`#62666d`:`#a1a1aa`),focusBoxShadow:`none`,focusOutline:`none`,fontFamily:a,fontSizeBase:`16px`}},currency:d.payment.currency,excludedPaymentMethodTypes:[`us_bank_account`],mode:`payment`,syncAddressCheckbox:`none`},stripe:y,children:g(Ke,{catalog:n,checkoutItems:r,client:i,onPaymentComplete:o,onPaymentRecoveryChange:s,onPaymentUncertain:c,onQuoteChange:l,onStateChange:p,quote:d,resumePayment:f})},`${n.payment.publishableKey}:${v??`platform`}`)}function ze({label:e}){return _(`div`,{className:`lockerverse-payment__stripe-loader`,role:`status`,children:[g(`p`,{children:e}),_(`div`,{"aria-hidden":`true`,children:[g(`span`,{}),g(`span`,{}),g(`span`,{})]})]})}function Be({onError:e,onReady:t,ready:r}){return _(`div`,{className:`lockerverse-payment__stripe-element`,"data-ready":r,children:[r?null:g(ze,{label:`Loading payment form...`}),g(`div`,{className:`lockerverse-payment__stripe-mount`,children:g(n,{onLoadError:({error:t})=>e(t.message??`Payment form failed to load.`),onReady:t,options:{business:{name:`Lockerverse`},fields:{billingDetails:{address:`never`,email:`never`,name:`never`,phone:`never`}},layout:`tabs`,terms:{applePay:`auto`,auBecsDebit:`never`,bancontact:`never`,card:`always`,cashapp:`never`,googlePay:`never`,ideal:`never`,paypal:`auto`,sepaDebit:`never`,sofort:`never`,usBankAccount:`never`},wallets:{applePay:`auto`,googlePay:`never`}}})})]})}function Ve({label:t,mode:n,onError:r,onReady:i,ready:a}){return _(`div`,{className:`lockerverse-payment__address`,children:[g(`h2`,{children:t}),_(`div`,{className:`lockerverse-payment__stripe-element lockerverse-payment__stripe-element--address`,"data-ready":a,children:[a?null:g(ze,{label:`Loading ${t.toLowerCase()}...`}),g(`div`,{className:`lockerverse-payment__stripe-mount`,children:g(e,{onLoadError:({error:e})=>r(e.message??`${t} failed to load.`),onReady:i,options:{autocomplete:{mode:`automatic`},mode:n}})})]})]})}function He({message:e}){return e?g(`p`,{className:`lockerverse-payment__field-message`,role:`alert`,children:e}):null}function $(e,t){try{e?.(t)}catch{}}function Ue({customFieldErrors:e,emailRef:t,form:n,parsedTipSuccess:r,phoneRef:i,validationErrors:a}){if(a.email){t.current?.focus();return}if(a.phone){i.current?.focus();return}if(!r){n.querySelector(`[name="tip"]`)?.focus();return}let[o]=Object.keys(e);o&&n.querySelector(`[name="custom:${o}"]`)?.focus()}function We({onPaymentComplete:e,onPaymentRecoveryChange:t,onPaymentUncertain:n,onQuoteChange:r,onStateChange:i,result:a,setDisplayedTotalCents:o,setPaymentError:s,setTerminalState:c}){if(a.kind===`quote_changed`){let e=`The total changed to ${Q(a.quote.totalCents)}. Review it and pay again.`;r(a.quote,e),o(a.quote.totalCents),i(`idle`);return}if(a.kind===`payment_failed`){$(t,null),s(a.message),i(`error`);return}if(a.kind===`payment_unresolved`){c({kind:`unresolved`,message:`Payment is still processing. Do not submit it again.`}),i(`unresolved`);try{n?.({paymentReference:a.paymentReference,reason:a.reason})}catch{}return}r(a.quote),$(t,null),c({kind:`success`,message:`Payment completed successfully.`}),i(`success`);try{e?.(a.payment)}catch{}}function Ge({email:e,emailErrorId:t,emailId:n,emailRef:r,errors:i,onEmailChange:a,onPhoneChange:o,onPhoneCountryChange:s,phone:c,phoneCountry:l,phoneEnabled:u,phoneErrorId:d,phoneId:f,phoneRef:p}){return _(`div`,{className:`lockerverse-payment__contact`,children:[g(`label`,{htmlFor:n,children:`Email`}),g(`input`,{"aria-describedby":i.email?t:void 0,"aria-invalid":i.email?`true`:void 0,autoComplete:`email`,id:n,name:`email`,onChange:e=>a(e.currentTarget.value),placeholder:`name@example.com`,ref:r,type:`email`,value:e}),i.email?g(`p`,{className:`lockerverse-payment__field-message`,id:t,children:i.email}):null,u?_(h,{children:[g(`label`,{htmlFor:f,children:`Phone`}),_(`div`,{className:`lockerverse-payment__phone-control`,children:[g(z,{ariaLabel:`Phone number country`,className:`lockerverse-payment__select--phone-country`,name:`phoneCountry`,onValueChange:s,options:ke,value:l}),g(`input`,{"aria-describedby":i.phone?d:void 0,"aria-invalid":i.phone?`true`:void 0,autoComplete:`tel`,id:f,inputMode:`tel`,name:`phone`,onChange:e=>o(e.currentTarget.value),placeholder:`(201) 555-0123`,ref:p,type:`tel`,value:c})]}),i.phone?g(`p`,{className:`lockerverse-payment__field-message`,id:d,children:i.phone}):null]}):null]})}function Ke({catalog:e,checkoutItems:t,client:n,onPaymentComplete:a,onPaymentRecoveryChange:o,onPaymentUncertain:s,onQuoteChange:u,onStateChange:d,quote:m,resumePayment:h}){let[v,y]=p(``),[b,x]=p(``),[S,C]=p(`US`),[w,T]=p({}),[E,D]=p(),[O,k]=p({}),[A,j]=p(),[M,N]=p(!1),[ee,P]=p(!!h),[F,I]=p(),[te,L]=p(!1),[ne,re]=p(!1),[R,z]=p(!1),[B,ie]=p({customFields:{},customTip:``,includeServiceFee:e.widget.fields.serviceFee,memberId:``,merchSize:`M`,promoCode:``,shippingMatchesBilling:!0,tipPercent:`10`}),[V,le]=p(m.totalCents),H=f(null),ue=f(null),U=f(null),de=f(!1),W=r(),G=i(),K=`lockerverse-${l()}`,q=`${K}-email`,fe=`${q}-error`,pe=`${K}-phone`,he=`${pe}-error`,ge=`${K}-tip-error`,J=e.widget.fields.tipping?Oe(m.subtotalCents,B):{cents:0,success:!0},Y=J.success?J.cents:null,X=Y??0,_e=V-X,ve=!e.widget.fields.shipping||B.shippingMatchesBilling||R;c(()=>{if(Y===null)return;let t=e.widget.fields.serviceFee&&B.includeServiceFee?m.serviceFeeCents||Math.round(m.subtotalCents*e.pricingPolicy.serviceFeeRateBasisPoints/1e4):0,n=m.totalCents-m.serviceFeeCents-m.tipCents+t+Y;le(n),W?.update({amount:n})},[e.widget.fields.serviceFee,e.widget.fields.tipping,W,B.includeServiceFee,B.tipPercent,B.customTip,Y,m.serviceFeeCents,m.tipCents,m.totalCents]),c(()=>{M&&U.current?.focus()},[M]),c(()=>{!(h&&G)||de.current||(de.current=!0,d(`submitting`),me(n,h.paymentReference,G).then(e=>{if(e.kind===`failed`){$(o,null),D(`The previous payment failed. Check your details and try again.`),P(!1),d(`error`);return}if(e.kind===`unresolved`){I({kind:`unresolved`,message:`Payment is still processing. Do not submit it again.`}),d(`unresolved`);try{s?.({paymentReference:e.paymentReference,reason:e.reason})}catch{}return}$(o,null),I({kind:`success`,message:`Payment completed successfully.`}),d(`success`);try{a?.(e.payment)}catch{}}))},[n,a,o,s,d,h,G]);function ye(e){T(t=>{let n={...t};return delete n[e],n})}function Z(e){ie(e),k({}),j(void 0)}function Se(e){D(e),d(`error`)}async function Ce(r){r.preventDefault();let i=be({email:v,phone:Ae(b,S)},e.widget.fields.phone),c=xe(e.widget.customFields,B.customFields);if(!(i.value&&J.success)||Object.keys(c).length>0){T(i.errors),k(c),j(J.success?void 0:J.message),d(`invalid`);let e=r.currentTarget;queueMicrotask(()=>{Ue({customFieldErrors:c,emailRef:H,form:e,parsedTipSuccess:J.success,phoneRef:ue,validationErrors:i.errors})});return}if(T({}),k({}),!(W&&G)){D(`Payment form is still loading.`),d(`error`);return}D(void 0),N(!0),d(`submitting`);try{We({onPaymentComplete:a,onPaymentRecoveryChange:o,onPaymentUncertain:s,onQuoteChange:u,onStateChange:d,result:await Le({catalog:e,checkoutItems:t,client:n,elements:W,email:v,fieldValues:B,onPaymentRecoveryChange:o,phone:Ae(b,S),quote:m,stripe:G}),setDisplayedTotalCents:le,setPaymentError:D,setTerminalState:I})}catch(e){$(o,null),D(e instanceof Error?e.message:`Payment could not be completed.`),d(`error`)}finally{N(!1)}}return F?g(`p`,{className:`lockerverse-payment__payment-status`,ref:U,role:`status`,tabIndex:-1,children:F.message}):ee?g(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:`Recovering payment…`}):_(`form`,{"aria-busy":M,className:`lockerverse-payment__form`,noValidate:!0,onSubmit:Ce,children:[g(`div`,{"data-lockerverse-input-region":``,inert:M?!0:void 0,children:_(`fieldset`,{className:`lockerverse-payment__input-fieldset`,disabled:M,children:[g(ae,{enabled:e.widget.fields.tipping,error:A,errorId:ge,onChange:Z,values:B}),g(Ge,{email:v,emailErrorId:fe,emailId:q,emailRef:H,errors:w,onEmailChange:e=>{y(e),ye(`email`)},onPhoneChange:e=>{x(e),ye(`phone`)},onPhoneCountryChange:C,phone:b,phoneCountry:S,phoneEnabled:e.widget.fields.phone,phoneErrorId:he,phoneId:pe,phoneRef:ue}),g(Be,{onError:Se,onReady:()=>L(!0),ready:te}),g(Ve,{label:`Billing address`,mode:`billing`,onError:Se,onReady:()=>re(!0),ready:ne}),e.widget.fields.shipping?_(`div`,{className:`lockerverse-payment__shipping`,children:[g(oe,{checked:B.shippingMatchesBilling,name:`shippingMatchesBilling`,onChange:e=>{Z({...B,shippingMatchesBilling:e}),e||z(!1)},children:`Shipping is same as billing information`}),B.shippingMatchesBilling?null:g(Ve,{label:`Shipping address`,mode:`shipping`,onError:Se,onReady:()=>z(!0),ready:R})]}):null,g(se,{customFields:e.widget.customFields,errors:O,fields:e.widget.fields,idPrefix:K,onChange:Z,values:B}),_(`div`,{className:`lockerverse-payment__actions`,children:[g(ce,{amountCents:m.serviceFeeCents||Math.round(m.subtotalCents*e.pricingPolicy.serviceFeeRateBasisPoints/1e4),enabled:e.widget.fields.serviceFee,onChange:Z,values:B}),g(`button`,{"aria-busy":M,"aria-label":`Process payment for ${Q(V)} total`,disabled:M||!(te&&ne&&ve),type:`submit`,children:M?`Processing…`:`Process Payment (${Q(_e)})${X>0?` + ${Q(X)} tip`:``}`})]})]})}),M?g(`p`,{className:`lockerverse-payment__payment-status`,ref:U,role:`status`,tabIndex:-1,children:`Processing payment…`}):null,g(He,{message:E})]})}function qe(){return _(`div`,{className:`lockerverse-payment__skeleton-loader-block`,children:[g(`span`,{className:`lockerverse-payment__skeleton-loader-label`}),_(`div`,{className:`lockerverse-payment__skeleton-loader-content`,children:[g(`span`,{className:`lockerverse-payment__skeleton-loader-full`}),_(`div`,{className:`lockerverse-payment__skeleton-loader-grid`,children:[g(`span`,{className:`lockerverse-payment__skeleton-loader-half`}),g(`span`,{className:`lockerverse-payment__skeleton-loader-half`})]})]})]})}function Je(){return _(`div`,{className:`lockerverse-payment__loading`,children:[g(`span`,{"aria-live":`polite`,className:`lockerverse-payment__sr-only`,role:`status`,children:`Loading payment…`}),_(`div`,{"aria-hidden":`true`,className:`lockerverse-payment__skeleton`,children:[_(`div`,{className:`lockerverse-payment__skeleton-branding`,children:[g(`span`,{className:`lockerverse-payment__skeleton-avatar`}),g(`span`,{className:`lockerverse-payment__skeleton-community`})]}),_(`div`,{className:`lockerverse-payment__skeleton-contact`,children:[_(`div`,{className:`lockerverse-payment__skeleton-field`,children:[g(`span`,{className:`lockerverse-payment__skeleton-label`}),g(`span`,{className:`lockerverse-payment__skeleton-input`})]}),_(`div`,{className:`lockerverse-payment__skeleton-field`,children:[g(`span`,{className:`lockerverse-payment__skeleton-label`}),g(`span`,{className:`lockerverse-payment__skeleton-input`})]})]}),g(qe,{}),g(qe,{}),_(`div`,{className:`lockerverse-payment__skeleton-actions`,children:[g(`span`,{className:`lockerverse-payment__skeleton-check-line`}),g(`span`,{className:`lockerverse-payment__skeleton-button`})]})]})]})}function Ye({apiBaseUrl:e,branding:t,className:n,communitySlug:r,environment:i,fetch:o,onError:s,onPaymentComplete:l,onPaymentRecoveryChange:u,onPaymentUncertain:d,requestTimeoutMs:m,resumePayment:h,selection:v,sentryDsn:y,style:b,stripeLoader:x=a,theme:S=`dark`,widgetSlug:C,...w}){let T=f(h).current,E=f(null),[D,O]=p(),[k,A]=p(`idle`),{retryCheckout:j,selectionError:M,session:N,updateCheckout:ee}=De({apiBaseUrl:e,communitySlug:r,environment:i,fetch:o,onError:s,paymentState:k,requestTimeoutMs:m,selection:v,sentryDsn:y,widgetSlug:C});c(()=>{N.phase===`loading`&&O(void 0)},[N.phase]),c(()=>{N.phase===`ready`&&A(e=>e===`success`||e===`unresolved`?e:`idle`)},[N.phase,N.revision]);let P=[`lockerverse-payment`,n].filter(Boolean).join(` `),F=te(b?.[`--lockerverse-accent`]??t?.accentColor??`#38d77a`),I={...b,...t?.accentColor&&b?.[`--lockerverse-accent`]===void 0?{"--lockerverse-accent":t.accentColor}:{},...F&&b?.[`--lockerverse-accent-contrast`]===void 0?{"--lockerverse-accent-contrast":F}:{}};if(M)return g(`section`,{...w,className:P,"data-lockerverse-theme":S,role:`alert`,style:I,children:M});if(N.phase===`error`)return _(`section`,{...w,className:P,"data-lockerverse-theme":S,style:I,children:[g(`p`,{role:`alert`,children:N.failure}),g(`button`,{onClick:j,type:`button`,children:`Retry`})]});if(N.phase!==`ready`)return g(`section`,{...w,"aria-busy":`true`,"aria-label":`Payment`,className:P,"data-lockerverse-theme":S,style:I,children:g(Je,{})});let{catalog:L,checkoutItems:re,client:R,preparedCheckout:z}=N;return _(`section`,{...w,"aria-label":`Payment`,className:P,"data-lockerverse-theme":S,"data-payment-state":k,ref:E,style:I,children:[_(`header`,{children:[L.widget.showCommunityBranding&&t?_(`div`,{className:`lockerverse-payment__branding`,children:[t.imageUrl?g(`img`,{alt:t.name,height:`48`,src:t.imageUrl,width:`48`}):null,g(`strong`,{children:t.name})]}):null,g(`h1`,{children:L.widget.title??L.widget.name}),L.widget.description?g(`p`,{children:L.widget.description}):null]}),D?g(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:D}):null,g(ne,{container:E,children:g(Re,{accentColor:b?.[`--lockerverse-accent`]??t?.accentColor??`#38d77a`,catalog:L,checkoutItems:re,client:R,fontFamily:b?.[`--lockerverse-font-family`]??`ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif`,onPaymentComplete:l,onPaymentRecoveryChange:u,onPaymentUncertain:d,onQuoteChange:(e,t)=>{O(t),ee(e)},onStateChange:A,quote:z,resumePayment:T,stripeLoader:x,theme:S,visualStyle:I})})]})}export{Ye as LockerversePayment};
2
2
  //# sourceMappingURL=index.js.map