@lockerverse/react 0.2.194 → 0.2.196

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/MIGRATIONS.md CHANGED
@@ -36,6 +36,21 @@ If it cannot be found, report that limit and use the baseline review below. Do n
36
36
  claim that every historical migration was applied. Read this file even if the
37
37
  version already matches: a previous upgrade may have missed host adoption steps.
38
38
 
39
+ ## 0.2.196 — save reusable payment methods
40
+
41
+ - **Affected:** React one-time payments, subscriptions, auction Buy Now, and
42
+ purchase recovery. Deferred Stripe Elements now requests `off_session` setup
43
+ so its configuration matches the backend PaymentIntent and saves supported
44
+ reusable methods, including Link, to the customer.
45
+ - **Required:** update the matching SDK/React packages and deploy the host with
46
+ the backend payment-saving change. No host prop changes are required.
47
+ - **Unchanged:** existing purchases are not converted into reusable methods.
48
+ Future charges can still require customer authentication. Methods without
49
+ off-session support cannot be made reusable by this setting.
50
+ - **Check:** in Stripe test mode, complete supported payment methods and verify
51
+ the successful PaymentIntent and customer payment-method attachment. Verify
52
+ auction Buy Now and purchase recovery with the same backend configuration.
53
+
39
54
  ## 0.2.194 — sharper large auction gallery photos
40
55
 
41
56
  - **Affected:** React auction item gallery responsive images.
@@ -1,2 +1,2 @@
1
- import{i as e}from"./use-auction-boundary.js";import{a as t,i as n,n as r,o as i,r as a,s as o,t as s}from"./auction-payment.js";import{t as c}from"./host-callback.js";import{d as l,n as u,p as d,r as f,t as p,u as m}from"./phone-field.js";import{i as h,n as g,t as _}from"./stripe-loader.js";import{ArrowRight as v,ChevronLeft as y}from"lucide-react";import{useEffect as b,useId as x,useRef as S,useState as C}from"react";import{Fragment as w,jsx as T,jsxs as E}from"react/jsx-runtime";import{LockerverseSdkError as D}from"@lockerverse/sdk/auctions";import{AddressElement as O,Elements as k,PaymentElement as A,useElements as ee,useStripe as te}from"@stripe/react-stripe-js";function j(e){return{business:{name:`Lockerverse`},fields:{billingDetails:{address:`never`,email:`never`,name:`never`,phone:`never`}},terms:{applePay:e?`auto`:`never`,auBecsDebit:`never`,bancontact:`never`,card:`always`,cashapp:`never`,googlePay:`never`,ideal:`never`,paypal:e?`auto`:`never`,sepaDebit:`never`,sofort:`never`,usBankAccount:`never`},wallets:{applePay:e?`auto`:`never`,googlePay:`never`}}}function ne(t){let{isPurchase:n,item:r,pricing:i,id:a}=t;return E(`form`,{className:`lockerverse-auctions__checkout`,noValidate:!0,onSubmit:t.onSubmit,children:[E(`div`,{className:`lockerverse-auctions__checkout-header`,children:[E(`div`,{className:`lockerverse-auctions__checkout-navigation`,children:[T(`button`,{"aria-label":`Back`,className:`lockerverse-auctions__checkout-back`,disabled:!t.onBack,onClick:t.onBack,type:`button`,children:T(y,{"aria-hidden":`true`,size:20})}),E(`div`,{children:[T(`p`,{className:`lockerverse-auctions__checkout-eyebrow`,children:`Step 2 of 2`}),T(`p`,{children:n?`Secure checkout`:`Secure payment method`})]})]}),T(`p`,{className:`lockerverse-auctions__checkout-eyebrow`,children:t.communityName}),T(`h2`,{children:n?`Finalize your purchase.`:`Finalize your bid authorization.`}),T(`p`,{className:`lockerverse-auctions__checkout-summary`,children:n?E(w,{children:[`Pay `,T(`strong`,{children:e(i.totalCents)}),` for`,` `,t.quantity,` `,t.quantity===1?`item`:`items`,` of`,` `,T(`strong`,{children:r.name}),`. Your card is charged immediately once checkout succeeds.`]}):E(w,{children:[`Authorize a payment method for your bid of`,` `,T(`strong`,{children:e(i.subtotalCents)}),` on`,` `,T(`strong`,{children:r.name}),`. Your card is only charged if this bid wins the item.`]})}),r.collectShippingAddress&&E(`div`,{className:`lockerverse-auctions__checkout-physical`,children:[T(`p`,{className:`lockerverse-auctions__checkout-eyebrow`,children:`Physical item`}),T(`p`,{children:`This item requires a delivery address. Billing details are used by default, and you can switch to a separate delivery address below if needed.`})]})]}),E(`div`,{className:`lockerverse-auctions__checkout-body`,children:[t.showFields&&E(`fieldset`,{disabled:t.locked,children:[E(`div`,{className:`lockerverse-auctions__checkout-contact`,children:[T(l,{error:t.contactErrors.email,id:`${a}-email`,label:`Email`,name:`email`,onChange:e=>t.onEmailChange(e.target.value),required:!0,value:t.email}),T(d,{error:t.contactErrors.phone,id:`${a}-phone`,label:`Phone`,children:T(p,{country:t.phoneCountry,error:t.contactErrors.phone,errorId:`${a}-phone-error`,id:`${a}-phone`,name:`phone`,onChange:t.onPhoneChange,required:!0,value:t.phone})})]}),E(`section`,{"aria-label":`Payment Information`,className:`lockerverse-auctions__checkout-section`,children:[E(`div`,{className:`lockerverse-auctions__checkout-section-heading`,children:[T(`h3`,{children:`Payment Information`}),T(`p`,{children:n?`Processed securely and charged immediately for this purchase.`:`Stored securely and charged only if your bid finishes on top.`})]}),T(A,{onLoadError:t.onPaymentLoadError,options:j(n)})]}),E(`section`,{"aria-label":`Billing Details`,className:`lockerverse-auctions__checkout-section`,children:[T(`h3`,{children:`Billing Details`}),T(O,{onChange:t.onBillingChange,options:{mode:`billing`}}),T(`p`,{children:n?`Use your full name here. We use the email and phone above for purchase confirmation and fulfillment updates.`:`Use the bidder's full name here. We use the email and phone above to contact you if this bid is outbid or wins.`})]}),r.collectShippingAddress&&E(`section`,{"aria-label":`Delivery Details`,className:`lockerverse-auctions__checkout-section`,children:[E(`label`,{className:`lockerverse-auctions__checkout-checkbox lockerverse-auctions__checkout-delivery`,htmlFor:`${a}-delivery-same-as-billing`,children:[T(m,{checked:t.sameAsBilling,id:`${a}-delivery-same-as-billing`,onChange:e=>t.onSameAsBillingChange(e.target.checked)}),E(`span`,{children:[T(`strong`,{children:`Delivery address is the same as billing`}),T(`span`,{children:`Leave this on for the fastest flow. Turn it off only if the delivery address should differ from the billing details above.`})]})]}),!t.sameAsBilling&&E(w,{children:[T(`h3`,{children:`Delivery Address`}),T(O,{onChange:t.onShippingChange,options:{mode:`shipping`}})]})]}),T(N,{isPurchase:n,pricing:i}),t.serviceFeeEnabled&&T(M,{...t})]}),t.message&&T(`p`,{"aria-live":`polite`,className:`lockerverse-auctions__notice`,role:`status`,children:t.message}),!t.isTerminal&&E(`div`,{className:`lockerverse-auctions__checkout-footer`,children:[E(`p`,{children:[n?`By continuing, you agree to be charged for this purchase.`:`By continuing, you agree to have this payment method stored for item settlement if your bid is the winning offer.`,r.collectShippingAddress?` Your delivery details are stored with the ${n?`order`:`bid`} so the seller can fulfill the item after payment.`:``]}),E(`button`,{className:`lockerverse-auctions__button lockerverse-auctions__checkout-submit`,disabled:t.submitDisabled,type:`submit`,children:[t.buttonText,T(v,{"aria-hidden":`true`,size:16})]})]})]})]})}function M(t){let{isPurchase:n,pricing:r}=t;return T(`section`,{"aria-label":`Processing fees`,className:`lockerverse-auctions__checkout-section`,children:t.onIncludeServiceFeeChange?E(`label`,{className:`lockerverse-auctions__checkout-checkbox`,htmlFor:`${t.id}-service-fee`,children:[T(m,{checked:t.includeServiceFee,id:`${t.id}-service-fee`,onChange:e=>t.onIncludeServiceFeeChange?.(e.target.checked)}),E(`span`,{children:[E(`strong`,{children:[n?`Add`:`If I win, add`,` `,e(t.serviceFeeCents),` to help cover processing fees`]}),E(`span`,{children:[n?`Total`:`Total if I win`,`:`,` `,e(r.totalCents)]})]})]}):E(`p`,{children:[n?`Total`:`Total if I win`,`:`,` `,e(r.totalCents)]})})}function N({pricing:t,isPurchase:n}){return t.additionalCharge?E(`section`,{"aria-label":`Order amounts`,className:`lockerverse-auctions__checkout-section`,children:[E(`p`,{children:[n?`Subtotal`:`Bid amount`,`:`,` `,e(t.subtotalCents)]}),E(`p`,{children:[t.additionalCharge.name,`:`,` `,e(t.additionalChargeCents??0)]}),E(`p`,{children:[n?`Total`:`Total if I win`,`:`,` `,e(t.totalCents)]})]}):null}function re(e,t,n){return e===`busy`?n?`Processing...`:`Authorizing...`:e===`retry`?`Retry original purchase`:t?`Check purchase status`:n?`Buy Now`:`Authorize Bid`}function P(e){let{auction:l,item:d,selection:p,client:m,onReview:g,onBack:_}=e,v=te(),y=ee(),w=x(),[E,O]=C(e.contact?.email??``),[k,A]=C(e.contact?.phone??``),[j,M]=C(()=>f(e.contact?.phone??``)),[N,P]=C({}),[F,ie]=C(!0),[I,ae]=C(null),[oe,se]=C(null),[L,ce]=C(e.resumePurchase??null),[R,le]=C(e.resumePurchase?`pending`:`ready`),[ue,de]=C(null),z=S(e.resumePurchase?.submission.clientRequestId??null),B=R===`complete`||R===`uncertain`,V=S(!1),H=S(!0),U=S(e);U.current=e;let W=S(!1);function G(e){H.current&&le(e),c(U.current.onInteractionLockChange,e!==`ready`&&e!==`complete`)}function K(e){H.current&&de(e)}function q(e){G(e===`bid`?`uncertain`:`pending`),K(e===`bid`?`We could not confirm your bid. Do not submit another bid until you check your email or contact the auction organizer.`:`We could not confirm the purchase result. Check its status using the same purchase request.`),W.current||(W.current=!0,c(U.current.onUncertain,e))}b(()=>(H.current=!0,()=>{H.current=!1}),[]);let J=!!(L??e.resumePurchase)||d.saleMode===`buy_now`,Y=L?.pricing??e.resumePurchase?.pricing??t(l,d,p),fe=L?.payment??e.resumePurchase?.payment??l.payment;function X(e){H.current&&ce(e),c(U.current.onPurchaseRecoveryChange,e)}function Z(e){e.status===`paid`?(z.current=null,X(null),G(`complete`),c(U.current.onResult,{additionalCharge:e.additionalCharge??null,additionalChargeCents:e.additionalChargeCents??0,kind:`purchase`,purchaseId:e.purchaseId,quantity:e.quantity,serviceFeeCents:e.serviceFeeCents,status:`paid`,subtotalCents:e.subtotalCents,totalCents:e.totalCents,unitAmountCents:e.subtotalCents/e.quantity}),W.current||(W.current=!0,c(U.current.onPurchaseComplete,e))):e.status===`pending_payment`?(G(`pending`),K(`Your purchase is pending. Check its status before making another payment.`)):(z.current=null,X(null),G(`ready`),K(`This purchase is ${e.status.replaceAll(`_`,` `)}. You can start a new purchase.`))}function pe(){let e=u(k,j),t=h({email:E,phone:e},!0);return P(t.errors),t.value?{email:t.value.email,phone:e}:(document.getElementById(`${w}-${t.errors.email?`email`:`phone`}`)?.focus(),null)}function me(){let e=U.current.selection;if(p.quantity!==e.quantity||p.amount!==e.amount||p.includeServiceFee!==e.includeServiceFee)throw Error(`Your selection changed. Review the total before continuing.`)}async function he(e){if(!(J&&d.additionalCharge))return!0;let t=await m.getPurchaseQuote(l.slug,d.id,{includeServiceFee:p.includeServiceFee,quantity:p.quantity});return H.current?t.subtotalCents!==Y.subtotalCents||(t.additionalChargeCents??0)!==(Y.additionalChargeCents??0)||t.serviceFeeCents!==Y.serviceFeeCents||t.totalCents!==Y.totalCents||!o(t.additionalCharge,Y.additionalCharge)?(g(e,`The checkout details changed. Review them before continuing.`),!1):!0:!1}async function ge(e){if(!e)throw Error(`Check the contact fields below.`);if(!(v&&y&&l.payment))throw Error(`Payment details are still loading.`);let t=await m.load(l.slug);if(!H.current)return null;let r=t.items.find(e=>e.id===d.id);if(!r)return g(t,`This item is no longer available.`),null;let o=n(t,r,p);if(o||i(l,t,d,r,p))return g(t,o??`The checkout details changed. Review them before continuing.`),null;if(!await he(t))return null;let c=await a({billing:I,collectShippingAddress:d.collectShippingAddress,elements:y,email:e.email,phone:e.phone,shipping:F?I:oe,stripe:v});return H.current?(me(),{confirmationToken:c,email:e.email,includeServiceFee:p.includeServiceFee,phone:e.phone,...s(Y)}):null}async function _e(e){let t=await m.createBid(l.slug,d.id,{...e,amount:p.amount});if(t.requiresAction){if(!(H.current&&v)){q(`bid`);return}await r(v,t)}G(`complete`),c(U.current.onResult,{additionalCharge:t.additionalCharge??null,additionalChargeCents:t.additionalChargeCents??0,amountCents:t.subtotalCents,kind:`bid`,serviceFeeCents:t.serviceFeeCents,totalCents:t.totalCents}),W.current||(W.current=!0,c(U.current.onBidSubmitted,t))}async function Q(e,t){if(e.requiresAction){if(!(H.current&&v)){q(`purchase`);return}await r(v,e);let n=await m.getPurchaseStatus(l.slug,d.id,t.submission.clientRequestId);n?Z(n):(G(`pending`),K(`Payment status is not available yet. Check again shortly.`));return}Z(e),!H.current&&e.status===`pending_payment`&&q(`purchase`)}async function ve(e){let t=await m.getPurchaseStatus(l.slug,d.id,e.submission.clientRequestId);if(t)await Q(t,e);else{if(!H.current){q(`purchase`);return}G(`retry`),K(`No purchase is recorded yet. You can retry the original purchase with the same request ID.`)}}async function ye(e,t){let n=await m.getPurchaseStatus(l.slug,d.id,t.submission.clientRequestId);if(n){await Q(n,t);return}X(null),G(`ready`),K(`The purchase was rejected. Review the item and payment details before trying again. (${e.status??`validation`})`)}async function be(e,t,n,r){let i=t&&(!(e instanceof D)||e.recoveryRecommended);if(K(e instanceof Error?e.message:`Unable to complete this request.`),J&&n){if(!r&&e instanceof D&&!e.recoveryRecommended)try{await ye(e,n);return}catch{}q(`purchase`)}else i?q(`bid`):G(`ready`)}function xe(){return z.current??=globalThis.crypto.randomUUID(),z.current}function Se(){return H.current?!0:(L||(X(null),G(`ready`)),!1)}async function Ce(e,t){if(t){await ve(e);return}Se()&&await Q(await m.createPurchase(l.slug,d.id,e.submission),e)}let $=v&&y&&fe;function we(){if(V.current||B)return null;if(!$)return K(`Payment details are still loading.`),null;let e=L?null:pe();return L||e?{checkoutPayment:$,contact:e,retryOriginal:R===`retry`}:null}async function Te(e){e.preventDefault();let t=we();if(!t)return;let{contact:n,checkoutPayment:r,retryOriginal:i}=t;V.current=!0,W.current=!1,G(`busy`),K(null);let a=!1,o=L;try{if(!o){let e=await ge(n);if(!(e&&H.current)){G(`ready`);return}if(!J){a=!0,await _e(e);return}o=Object.freeze({auctionId:l.id,item:d,itemId:d.id,payment:Object.freeze({...r}),pricing:Y,submission:Object.freeze({...e,clientRequestId:xe(),paymentMethodTypes:Object.freeze([`card`]),quantity:p.quantity})}),X(o)}a=!0,await Ce(o,!!L&&!i)}catch(e){await be(e,a,o,L!==null&&!i)}finally{V.current=!1}}let Ee=re(R,L!==null,J),De=R!==`ready`;return T(ne,{buttonText:Ee,communityName:e.communityName??l.name,contactErrors:N,email:E,id:w,includeServiceFee:p.includeServiceFee,isPurchase:J,isTerminal:B,item:d,locked:De,message:ue,onBack:R===`ready`?_:void 0,onBillingChange:ae,onEmailChange:t=>{O(t),e.onContactChange?.({email:t,phone:u(k,j)})},onIncludeServiceFeeChange:e.onIncludeServiceFeeChange,onPaymentLoadError:()=>K(`Unable to load payment form.`),onPhoneChange:({value:t,country:n})=>{A(t),M(n),e.onContactChange?.({email:E,phone:u(t,n)})},onSameAsBillingChange:ie,onShippingChange:se,onSubmit:Te,phone:k,phoneCountry:j,pricing:Y,quantity:p.quantity,sameAsBilling:F,serviceFeeCents:L?Y.serviceFeeCents:t(l,d,{...p,includeServiceFee:l.serviceFeeEnabled}).serviceFeeCents,serviceFeeEnabled:l.serviceFeeEnabled,showFields:!(L||B),submitDisabled:R===`busy`||!v||!y})}function F(e){let{auction:n,item:r,selection:i,theme:a=`dark`,stripeLoader:o=_,style:s,onBack:c,resumePurchase:l}=e,[u,d]=C(null),[f,p]=C(!1),[m,h]=C(0),v=g(e.appearanceRoot,a,s,e.interactionLocked),y=l?.payment??n.payment;if(b(()=>{let e=!0;if(!y){p(!0);return}return Promise.resolve().then(()=>o(y.publishableKey,y.connectedAccountId?{stripeAccount:y.connectedAccountId}:void 0)).then(t=>{e&&(d(t),p(!t))},()=>{e&&p(!0)}),()=>{e=!1}},[y,o,m]),f)return E(`div`,{children:[T(`p`,{role:`alert`,children:`Payment details could not load.`}),l?null:T(`button`,{onClick:c,type:`button`,children:`Back to item`}),T(`button`,{onClick:()=>{p(!1),d(null),h(e=>e+1)},type:`button`,children:`Try again`})]});if(!(u&&v))return E(`div`,{children:[T(`p`,{role:`status`,children:`Loading secure payment details…`}),l?null:T(`button`,{onClick:c,type:`button`,children:`Back to item`})]});let x={mode:`setup`,setupFutureUsage:`off_session`};l?x={amount:l.pricing.totalCents,currency:`usd`,mode:`payment`}:r.saleMode===`buy_now`&&(x={amount:t(n,r,i).totalCents,currency:`usd`,mode:`payment`});let S={...x,appearance:v,currency:`usd`,paymentMethodTypes:[`card`],syncAddressCheckbox:`none`};return T(k,{options:S,stripe:u,children:T(P,{...e})})}export{F as AuctionPayment};
1
+ import{i as e}from"./use-auction-boundary.js";import{a as t,i as n,n as r,o as i,r as a,s as o,t as s}from"./auction-payment.js";import{t as c}from"./host-callback.js";import{d as l,n as u,p as d,r as f,t as p,u as m}from"./phone-field.js";import{i as h,n as g,t as _}from"./stripe-loader.js";import{ArrowRight as v,ChevronLeft as y}from"lucide-react";import{useEffect as b,useId as x,useRef as S,useState as C}from"react";import{Fragment as w,jsx as T,jsxs as E}from"react/jsx-runtime";import{LockerverseSdkError as D}from"@lockerverse/sdk/auctions";import{AddressElement as O,Elements as k,PaymentElement as A,useElements as ee,useStripe as te}from"@stripe/react-stripe-js";function j(e){return{business:{name:`Lockerverse`},fields:{billingDetails:{address:`never`,email:`never`,name:`never`,phone:`never`}},terms:{applePay:e?`auto`:`never`,auBecsDebit:`never`,bancontact:`never`,card:`always`,cashapp:`never`,googlePay:`never`,ideal:`never`,paypal:e?`auto`:`never`,sepaDebit:`never`,sofort:`never`,usBankAccount:`never`},wallets:{applePay:e?`auto`:`never`,googlePay:`never`}}}function ne(t){let{isPurchase:n,item:r,pricing:i,id:a}=t;return E(`form`,{className:`lockerverse-auctions__checkout`,noValidate:!0,onSubmit:t.onSubmit,children:[E(`div`,{className:`lockerverse-auctions__checkout-header`,children:[E(`div`,{className:`lockerverse-auctions__checkout-navigation`,children:[T(`button`,{"aria-label":`Back`,className:`lockerverse-auctions__checkout-back`,disabled:!t.onBack,onClick:t.onBack,type:`button`,children:T(y,{"aria-hidden":`true`,size:20})}),E(`div`,{children:[T(`p`,{className:`lockerverse-auctions__checkout-eyebrow`,children:`Step 2 of 2`}),T(`p`,{children:n?`Secure checkout`:`Secure payment method`})]})]}),T(`p`,{className:`lockerverse-auctions__checkout-eyebrow`,children:t.communityName}),T(`h2`,{children:n?`Finalize your purchase.`:`Finalize your bid authorization.`}),T(`p`,{className:`lockerverse-auctions__checkout-summary`,children:n?E(w,{children:[`Pay `,T(`strong`,{children:e(i.totalCents)}),` for`,` `,t.quantity,` `,t.quantity===1?`item`:`items`,` of`,` `,T(`strong`,{children:r.name}),`. Your card is charged immediately once checkout succeeds.`]}):E(w,{children:[`Authorize a payment method for your bid of`,` `,T(`strong`,{children:e(i.subtotalCents)}),` on`,` `,T(`strong`,{children:r.name}),`. Your card is only charged if this bid wins the item.`]})}),r.collectShippingAddress&&E(`div`,{className:`lockerverse-auctions__checkout-physical`,children:[T(`p`,{className:`lockerverse-auctions__checkout-eyebrow`,children:`Physical item`}),T(`p`,{children:`This item requires a delivery address. Billing details are used by default, and you can switch to a separate delivery address below if needed.`})]})]}),E(`div`,{className:`lockerverse-auctions__checkout-body`,children:[t.showFields&&E(`fieldset`,{disabled:t.locked,children:[E(`div`,{className:`lockerverse-auctions__checkout-contact`,children:[T(l,{error:t.contactErrors.email,id:`${a}-email`,label:`Email`,name:`email`,onChange:e=>t.onEmailChange(e.target.value),required:!0,value:t.email}),T(d,{error:t.contactErrors.phone,id:`${a}-phone`,label:`Phone`,children:T(p,{country:t.phoneCountry,error:t.contactErrors.phone,errorId:`${a}-phone-error`,id:`${a}-phone`,name:`phone`,onChange:t.onPhoneChange,required:!0,value:t.phone})})]}),E(`section`,{"aria-label":`Payment Information`,className:`lockerverse-auctions__checkout-section`,children:[E(`div`,{className:`lockerverse-auctions__checkout-section-heading`,children:[T(`h3`,{children:`Payment Information`}),T(`p`,{children:n?`Processed securely and charged immediately for this purchase.`:`Stored securely and charged only if your bid finishes on top.`})]}),T(A,{onLoadError:t.onPaymentLoadError,options:j(n)})]}),E(`section`,{"aria-label":`Billing Details`,className:`lockerverse-auctions__checkout-section`,children:[T(`h3`,{children:`Billing Details`}),T(O,{onChange:t.onBillingChange,options:{mode:`billing`}}),T(`p`,{children:n?`Use your full name here. We use the email and phone above for purchase confirmation and fulfillment updates.`:`Use the bidder's full name here. We use the email and phone above to contact you if this bid is outbid or wins.`})]}),r.collectShippingAddress&&E(`section`,{"aria-label":`Delivery Details`,className:`lockerverse-auctions__checkout-section`,children:[E(`label`,{className:`lockerverse-auctions__checkout-checkbox lockerverse-auctions__checkout-delivery`,htmlFor:`${a}-delivery-same-as-billing`,children:[T(m,{checked:t.sameAsBilling,id:`${a}-delivery-same-as-billing`,onChange:e=>t.onSameAsBillingChange(e.target.checked)}),E(`span`,{children:[T(`strong`,{children:`Delivery address is the same as billing`}),T(`span`,{children:`Leave this on for the fastest flow. Turn it off only if the delivery address should differ from the billing details above.`})]})]}),!t.sameAsBilling&&E(w,{children:[T(`h3`,{children:`Delivery Address`}),T(O,{onChange:t.onShippingChange,options:{mode:`shipping`}})]})]}),T(N,{isPurchase:n,pricing:i}),t.serviceFeeEnabled&&T(M,{...t})]}),t.message&&T(`p`,{"aria-live":`polite`,className:`lockerverse-auctions__notice`,role:`status`,children:t.message}),!t.isTerminal&&E(`div`,{className:`lockerverse-auctions__checkout-footer`,children:[E(`p`,{children:[n?`By continuing, you agree to be charged for this purchase.`:`By continuing, you agree to have this payment method stored for item settlement if your bid is the winning offer.`,r.collectShippingAddress?` Your delivery details are stored with the ${n?`order`:`bid`} so the seller can fulfill the item after payment.`:``]}),E(`button`,{className:`lockerverse-auctions__button lockerverse-auctions__checkout-submit`,disabled:t.submitDisabled,type:`submit`,children:[t.buttonText,T(v,{"aria-hidden":`true`,size:16})]})]})]})]})}function M(t){let{isPurchase:n,pricing:r}=t;return T(`section`,{"aria-label":`Processing fees`,className:`lockerverse-auctions__checkout-section`,children:t.onIncludeServiceFeeChange?E(`label`,{className:`lockerverse-auctions__checkout-checkbox`,htmlFor:`${t.id}-service-fee`,children:[T(m,{checked:t.includeServiceFee,id:`${t.id}-service-fee`,onChange:e=>t.onIncludeServiceFeeChange?.(e.target.checked)}),E(`span`,{children:[E(`strong`,{children:[n?`Add`:`If I win, add`,` `,e(t.serviceFeeCents),` to help cover processing fees`]}),E(`span`,{children:[n?`Total`:`Total if I win`,`:`,` `,e(r.totalCents)]})]})]}):E(`p`,{children:[n?`Total`:`Total if I win`,`:`,` `,e(r.totalCents)]})})}function N({pricing:t,isPurchase:n}){return t.additionalCharge?E(`section`,{"aria-label":`Order amounts`,className:`lockerverse-auctions__checkout-section`,children:[E(`p`,{children:[n?`Subtotal`:`Bid amount`,`:`,` `,e(t.subtotalCents)]}),E(`p`,{children:[t.additionalCharge.name,`:`,` `,e(t.additionalChargeCents??0)]}),E(`p`,{children:[n?`Total`:`Total if I win`,`:`,` `,e(t.totalCents)]})]}):null}function re(e,t,n){return e===`busy`?n?`Processing...`:`Authorizing...`:e===`retry`?`Retry original purchase`:t?`Check purchase status`:n?`Buy Now`:`Authorize Bid`}function P(e){let{auction:l,item:d,selection:p,client:m,onReview:g,onBack:_}=e,v=te(),y=ee(),w=x(),[E,O]=C(e.contact?.email??``),[k,A]=C(e.contact?.phone??``),[j,M]=C(()=>f(e.contact?.phone??``)),[N,P]=C({}),[F,ie]=C(!0),[I,ae]=C(null),[oe,se]=C(null),[L,ce]=C(e.resumePurchase??null),[R,le]=C(e.resumePurchase?`pending`:`ready`),[ue,de]=C(null),z=S(e.resumePurchase?.submission.clientRequestId??null),B=R===`complete`||R===`uncertain`,V=S(!1),H=S(!0),U=S(e);U.current=e;let W=S(!1);function G(e){H.current&&le(e),c(U.current.onInteractionLockChange,e!==`ready`&&e!==`complete`)}function K(e){H.current&&de(e)}function q(e){G(e===`bid`?`uncertain`:`pending`),K(e===`bid`?`We could not confirm your bid. Do not submit another bid until you check your email or contact the auction organizer.`:`We could not confirm the purchase result. Check its status using the same purchase request.`),W.current||(W.current=!0,c(U.current.onUncertain,e))}b(()=>(H.current=!0,()=>{H.current=!1}),[]);let J=!!(L??e.resumePurchase)||d.saleMode===`buy_now`,Y=L?.pricing??e.resumePurchase?.pricing??t(l,d,p),fe=L?.payment??e.resumePurchase?.payment??l.payment;function X(e){H.current&&ce(e),c(U.current.onPurchaseRecoveryChange,e)}function Z(e){e.status===`paid`?(z.current=null,X(null),G(`complete`),c(U.current.onResult,{additionalCharge:e.additionalCharge??null,additionalChargeCents:e.additionalChargeCents??0,kind:`purchase`,purchaseId:e.purchaseId,quantity:e.quantity,serviceFeeCents:e.serviceFeeCents,status:`paid`,subtotalCents:e.subtotalCents,totalCents:e.totalCents,unitAmountCents:e.subtotalCents/e.quantity}),W.current||(W.current=!0,c(U.current.onPurchaseComplete,e))):e.status===`pending_payment`?(G(`pending`),K(`Your purchase is pending. Check its status before making another payment.`)):(z.current=null,X(null),G(`ready`),K(`This purchase is ${e.status.replaceAll(`_`,` `)}. You can start a new purchase.`))}function pe(){let e=u(k,j),t=h({email:E,phone:e},!0);return P(t.errors),t.value?{email:t.value.email,phone:e}:(document.getElementById(`${w}-${t.errors.email?`email`:`phone`}`)?.focus(),null)}function me(){let e=U.current.selection;if(p.quantity!==e.quantity||p.amount!==e.amount||p.includeServiceFee!==e.includeServiceFee)throw Error(`Your selection changed. Review the total before continuing.`)}async function he(e){if(!(J&&d.additionalCharge))return!0;let t=await m.getPurchaseQuote(l.slug,d.id,{includeServiceFee:p.includeServiceFee,quantity:p.quantity});return H.current?t.subtotalCents!==Y.subtotalCents||(t.additionalChargeCents??0)!==(Y.additionalChargeCents??0)||t.serviceFeeCents!==Y.serviceFeeCents||t.totalCents!==Y.totalCents||!o(t.additionalCharge,Y.additionalCharge)?(g(e,`The checkout details changed. Review them before continuing.`),!1):!0:!1}async function ge(e){if(!e)throw Error(`Check the contact fields below.`);if(!(v&&y&&l.payment))throw Error(`Payment details are still loading.`);let t=await m.load(l.slug);if(!H.current)return null;let r=t.items.find(e=>e.id===d.id);if(!r)return g(t,`This item is no longer available.`),null;let o=n(t,r,p);if(o||i(l,t,d,r,p))return g(t,o??`The checkout details changed. Review them before continuing.`),null;if(!await he(t))return null;let c=await a({billing:I,collectShippingAddress:d.collectShippingAddress,elements:y,email:e.email,phone:e.phone,shipping:F?I:oe,stripe:v});return H.current?(me(),{confirmationToken:c,email:e.email,includeServiceFee:p.includeServiceFee,phone:e.phone,...s(Y)}):null}async function _e(e){let t=await m.createBid(l.slug,d.id,{...e,amount:p.amount});if(t.requiresAction){if(!(H.current&&v)){q(`bid`);return}await r(v,t)}G(`complete`),c(U.current.onResult,{additionalCharge:t.additionalCharge??null,additionalChargeCents:t.additionalChargeCents??0,amountCents:t.subtotalCents,kind:`bid`,serviceFeeCents:t.serviceFeeCents,totalCents:t.totalCents}),W.current||(W.current=!0,c(U.current.onBidSubmitted,t))}async function Q(e,t){if(e.requiresAction){if(!(H.current&&v)){q(`purchase`);return}await r(v,e);let n=await m.getPurchaseStatus(l.slug,d.id,t.submission.clientRequestId);n?Z(n):(G(`pending`),K(`Payment status is not available yet. Check again shortly.`));return}Z(e),!H.current&&e.status===`pending_payment`&&q(`purchase`)}async function ve(e){let t=await m.getPurchaseStatus(l.slug,d.id,e.submission.clientRequestId);if(t)await Q(t,e);else{if(!H.current){q(`purchase`);return}G(`retry`),K(`No purchase is recorded yet. You can retry the original purchase with the same request ID.`)}}async function ye(e,t){let n=await m.getPurchaseStatus(l.slug,d.id,t.submission.clientRequestId);if(n){await Q(n,t);return}X(null),G(`ready`),K(`The purchase was rejected. Review the item and payment details before trying again. (${e.status??`validation`})`)}async function be(e,t,n,r){let i=t&&(!(e instanceof D)||e.recoveryRecommended);if(K(e instanceof Error?e.message:`Unable to complete this request.`),J&&n){if(!r&&e instanceof D&&!e.recoveryRecommended)try{await ye(e,n);return}catch{}q(`purchase`)}else i?q(`bid`):G(`ready`)}function xe(){return z.current??=globalThis.crypto.randomUUID(),z.current}function Se(){return H.current?!0:(L||(X(null),G(`ready`)),!1)}async function Ce(e,t){if(t){await ve(e);return}Se()&&await Q(await m.createPurchase(l.slug,d.id,e.submission),e)}let $=v&&y&&fe;function we(){if(V.current||B)return null;if(!$)return K(`Payment details are still loading.`),null;let e=L?null:pe();return L||e?{checkoutPayment:$,contact:e,retryOriginal:R===`retry`}:null}async function Te(e){e.preventDefault();let t=we();if(!t)return;let{contact:n,checkoutPayment:r,retryOriginal:i}=t;V.current=!0,W.current=!1,G(`busy`),K(null);let a=!1,o=L;try{if(!o){let e=await ge(n);if(!(e&&H.current)){G(`ready`);return}if(!J){a=!0,await _e(e);return}o=Object.freeze({auctionId:l.id,item:d,itemId:d.id,payment:Object.freeze({...r}),pricing:Y,submission:Object.freeze({...e,clientRequestId:xe(),paymentMethodTypes:Object.freeze([`card`]),quantity:p.quantity})}),X(o)}a=!0,await Ce(o,!!L&&!i)}catch(e){await be(e,a,o,L!==null&&!i)}finally{V.current=!1}}let Ee=re(R,L!==null,J),De=R!==`ready`;return T(ne,{buttonText:Ee,communityName:e.communityName??l.name,contactErrors:N,email:E,id:w,includeServiceFee:p.includeServiceFee,isPurchase:J,isTerminal:B,item:d,locked:De,message:ue,onBack:R===`ready`?_:void 0,onBillingChange:ae,onEmailChange:t=>{O(t),e.onContactChange?.({email:t,phone:u(k,j)})},onIncludeServiceFeeChange:e.onIncludeServiceFeeChange,onPaymentLoadError:()=>K(`Unable to load payment form.`),onPhoneChange:({value:t,country:n})=>{A(t),M(n),e.onContactChange?.({email:E,phone:u(t,n)})},onSameAsBillingChange:ie,onShippingChange:se,onSubmit:Te,phone:k,phoneCountry:j,pricing:Y,quantity:p.quantity,sameAsBilling:F,serviceFeeCents:L?Y.serviceFeeCents:t(l,d,{...p,includeServiceFee:l.serviceFeeEnabled}).serviceFeeCents,serviceFeeEnabled:l.serviceFeeEnabled,showFields:!(L||B),submitDisabled:R===`busy`||!v||!y})}function F(e){let{auction:n,item:r,selection:i,theme:a=`dark`,stripeLoader:o=_,style:s,onBack:c,resumePurchase:l}=e,[u,d]=C(null),[f,p]=C(!1),[m,h]=C(0),v=g(e.appearanceRoot,a,s,e.interactionLocked),y=l?.payment??n.payment;if(b(()=>{let e=!0;if(!y){p(!0);return}return Promise.resolve().then(()=>o(y.publishableKey,y.connectedAccountId?{stripeAccount:y.connectedAccountId}:void 0)).then(t=>{e&&(d(t),p(!t))},()=>{e&&p(!0)}),()=>{e=!1}},[y,o,m]),f)return E(`div`,{children:[T(`p`,{role:`alert`,children:`Payment details could not load.`}),l?null:T(`button`,{onClick:c,type:`button`,children:`Back to item`}),T(`button`,{onClick:()=>{p(!1),d(null),h(e=>e+1)},type:`button`,children:`Try again`})]});if(!(u&&v))return E(`div`,{children:[T(`p`,{role:`status`,children:`Loading secure payment details…`}),l?null:T(`button`,{onClick:c,type:`button`,children:`Back to item`})]});let x={mode:`setup`};l?x={amount:l.pricing.totalCents,currency:`usd`,mode:`payment`}:r.saleMode===`buy_now`&&(x={amount:t(n,r,i).totalCents,currency:`usd`,mode:`payment`});let S={...x,appearance:v,currency:`usd`,paymentMethodTypes:[`card`],setupFutureUsage:`off_session`,syncAddressCheckbox:`none`};return T(k,{options:S,stripe:u,children:T(P,{...e})})}export{F as AuctionPayment};
2
2
  //# sourceMappingURL=auction-payment-view.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auction-payment-view.js","names":["formatMoney"],"sources":["../src/auction-checkout-view.tsx","../src/auction-checkout.tsx","../src/auction-payment-view.tsx"],"sourcesContent":["import type {\n LockerverseAuctionItem,\n LockerverseAuctionPricing,\n} from \"@lockerverse/sdk/auctions\";\nimport { AddressElement, PaymentElement } from \"@stripe/react-stripe-js\";\nimport type {\n StripeAddressElementChangeEvent,\n StripePaymentElementOptions,\n} from \"@stripe/stripe-js\";\nimport { ArrowRight, ChevronLeft } from \"lucide-react\";\nimport type { FormEventHandler } from \"react\";\nimport { formatAuctionMoney as formatMoney } from \"./auction-display.ts\";\nimport { Checkbox, EmailField, FormField } from \"./form-field.tsx\";\nimport type { PhoneInputValue } from \"./phone-field.tsx\";\nimport { PhoneInput } from \"./phone-field.tsx\";\n\ntype AuctionCheckoutViewProps = {\n buttonText: string;\n communityName: string;\n email: string;\n contactErrors: { email?: string; phone?: string };\n phoneCountry: string;\n id: string;\n includeServiceFee: boolean;\n isPurchase: boolean;\n isTerminal: boolean;\n item: LockerverseAuctionItem;\n locked: boolean;\n message: string | null;\n onBack?: (() => void) | undefined;\n onBillingChange: (event: StripeAddressElementChangeEvent) => void;\n onEmailChange: (value: string) => void;\n onIncludeServiceFeeChange?: ((value: boolean) => void) | undefined;\n onPaymentLoadError: () => void;\n onPhoneChange: (value: PhoneInputValue) => void;\n onSameAsBillingChange: (value: boolean) => void;\n onShippingChange: (event: StripeAddressElementChangeEvent) => void;\n onSubmit: FormEventHandler<HTMLFormElement>;\n phone: string;\n pricing: LockerverseAuctionPricing;\n quantity: number;\n sameAsBilling: boolean;\n serviceFeeCents: number;\n serviceFeeEnabled: boolean;\n showFields: boolean;\n submitDisabled: boolean;\n};\n\nfunction getPaymentOptions(isPurchase: boolean): StripePaymentElementOptions {\n return {\n business: { name: \"Lockerverse\" },\n fields: {\n billingDetails: {\n address: \"never\",\n email: \"never\",\n name: \"never\",\n phone: \"never\",\n },\n },\n terms: {\n applePay: isPurchase ? \"auto\" : \"never\",\n auBecsDebit: \"never\",\n bancontact: \"never\",\n card: \"always\",\n cashapp: \"never\",\n googlePay: \"never\",\n ideal: \"never\",\n paypal: isPurchase ? \"auto\" : \"never\",\n sepaDebit: \"never\",\n sofort: \"never\",\n usBankAccount: \"never\",\n },\n wallets: { applePay: isPurchase ? \"auto\" : \"never\", googlePay: \"never\" },\n };\n}\n\nexport function AuctionCheckoutView(props: AuctionCheckoutViewProps) {\n const { isPurchase, item, pricing, id } = props;\n return (\n <form\n className=\"lockerverse-auctions__checkout\"\n noValidate\n onSubmit={props.onSubmit}\n >\n <div className=\"lockerverse-auctions__checkout-header\">\n <div className=\"lockerverse-auctions__checkout-navigation\">\n <button\n aria-label=\"Back\"\n className=\"lockerverse-auctions__checkout-back\"\n disabled={!props.onBack}\n onClick={props.onBack}\n type=\"button\"\n >\n <ChevronLeft aria-hidden=\"true\" size={20} />\n </button>\n <div>\n <p className=\"lockerverse-auctions__checkout-eyebrow\">\n Step 2 of 2\n </p>\n <p>{isPurchase ? \"Secure checkout\" : \"Secure payment method\"}</p>\n </div>\n </div>\n <p className=\"lockerverse-auctions__checkout-eyebrow\">\n {props.communityName}\n </p>\n <h2>\n {isPurchase\n ? \"Finalize your purchase.\"\n : \"Finalize your bid authorization.\"}\n </h2>\n <p className=\"lockerverse-auctions__checkout-summary\">\n {isPurchase ? (\n <>\n Pay <strong>{formatMoney(pricing.totalCents)}</strong> for{\" \"}\n {props.quantity} {props.quantity === 1 ? \"item\" : \"items\"} of{\" \"}\n <strong>{item.name}</strong>. Your card is charged immediately\n once checkout succeeds.\n </>\n ) : (\n <>\n Authorize a payment method for your bid of{\" \"}\n <strong>{formatMoney(pricing.subtotalCents)}</strong> on{\" \"}\n <strong>{item.name}</strong>. Your card is only charged if this\n bid wins the item.\n </>\n )}\n </p>\n {item.collectShippingAddress && (\n <div className=\"lockerverse-auctions__checkout-physical\">\n <p className=\"lockerverse-auctions__checkout-eyebrow\">\n Physical item\n </p>\n <p>\n This item requires a delivery address. Billing details are used by\n default, and you can switch to a separate delivery address below\n if needed.\n </p>\n </div>\n )}\n </div>\n <div className=\"lockerverse-auctions__checkout-body\">\n {props.showFields && (\n <fieldset disabled={props.locked}>\n <div className=\"lockerverse-auctions__checkout-contact\">\n <EmailField\n error={props.contactErrors.email}\n id={`${id}-email`}\n label=\"Email\"\n name=\"email\"\n onChange={(event) => props.onEmailChange(event.target.value)}\n required\n value={props.email}\n />\n <FormField\n error={props.contactErrors.phone}\n id={`${id}-phone`}\n label=\"Phone\"\n >\n <PhoneInput\n country={props.phoneCountry}\n error={props.contactErrors.phone}\n errorId={`${id}-phone-error`}\n id={`${id}-phone`}\n name=\"phone\"\n onChange={props.onPhoneChange}\n required\n value={props.phone}\n />\n </FormField>\n </div>\n <section\n aria-label=\"Payment Information\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n <div className=\"lockerverse-auctions__checkout-section-heading\">\n <h3>Payment Information</h3>\n <p>\n {isPurchase\n ? \"Processed securely and charged immediately for this purchase.\"\n : \"Stored securely and charged only if your bid finishes on top.\"}\n </p>\n </div>\n <PaymentElement\n onLoadError={props.onPaymentLoadError}\n options={getPaymentOptions(isPurchase)}\n />\n </section>\n <section\n aria-label=\"Billing Details\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n <h3>Billing Details</h3>\n <AddressElement\n onChange={props.onBillingChange}\n options={{ mode: \"billing\" }}\n />\n <p>\n {isPurchase\n ? \"Use your full name here. We use the email and phone above for purchase confirmation and fulfillment updates.\"\n : \"Use the bidder's full name here. We use the email and phone above to contact you if this bid is outbid or wins.\"}\n </p>\n </section>\n {item.collectShippingAddress && (\n <section\n aria-label=\"Delivery Details\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n <label\n className=\"lockerverse-auctions__checkout-checkbox lockerverse-auctions__checkout-delivery\"\n htmlFor={`${id}-delivery-same-as-billing`}\n >\n <Checkbox\n checked={props.sameAsBilling}\n id={`${id}-delivery-same-as-billing`}\n onChange={(event) =>\n props.onSameAsBillingChange(event.target.checked)\n }\n />\n <span>\n <strong>Delivery address is the same as billing</strong>\n <span>\n Leave this on for the fastest flow. Turn it off only if\n the delivery address should differ from the billing\n details above.\n </span>\n </span>\n </label>\n {!props.sameAsBilling && (\n <>\n <h3>Delivery Address</h3>\n <AddressElement\n onChange={props.onShippingChange}\n options={{ mode: \"shipping\" }}\n />\n </>\n )}\n </section>\n )}\n <CheckoutAdditionalCharge\n isPurchase={isPurchase}\n pricing={pricing}\n />\n {props.serviceFeeEnabled && <CheckoutServiceFee {...props} />}\n </fieldset>\n )}\n {props.message && (\n <p\n aria-live=\"polite\"\n className=\"lockerverse-auctions__notice\"\n role=\"status\"\n >\n {props.message}\n </p>\n )}\n {!props.isTerminal && (\n <div className=\"lockerverse-auctions__checkout-footer\">\n <p>\n {isPurchase\n ? \"By continuing, you agree to be charged for this purchase.\"\n : \"By continuing, you agree to have this payment method stored for item settlement if your bid is the winning offer.\"}\n {item.collectShippingAddress\n ? ` Your delivery details are stored with the ${isPurchase ? \"order\" : \"bid\"} so the seller can fulfill the item after payment.`\n : \"\"}\n </p>\n <button\n className=\"lockerverse-auctions__button lockerverse-auctions__checkout-submit\"\n disabled={props.submitDisabled}\n type=\"submit\"\n >\n {props.buttonText}\n <ArrowRight aria-hidden=\"true\" size={16} />\n </button>\n </div>\n )}\n </div>\n </form>\n );\n}\n\nfunction CheckoutServiceFee(props: AuctionCheckoutViewProps) {\n const { isPurchase, pricing } = props;\n return (\n <section\n aria-label=\"Processing fees\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n {props.onIncludeServiceFeeChange ? (\n <label\n className=\"lockerverse-auctions__checkout-checkbox\"\n htmlFor={`${props.id}-service-fee`}\n >\n <Checkbox\n checked={props.includeServiceFee}\n id={`${props.id}-service-fee`}\n onChange={(event) =>\n props.onIncludeServiceFeeChange?.(event.target.checked)\n }\n />\n <span>\n <strong>\n {isPurchase ? \"Add\" : \"If I win, add\"}{\" \"}\n {formatMoney(props.serviceFeeCents)} to help cover processing fees\n </strong>\n <span>\n {isPurchase ? \"Total\" : \"Total if I win\"}:{\" \"}\n {formatMoney(pricing.totalCents)}\n </span>\n </span>\n </label>\n ) : (\n <p>\n {isPurchase ? \"Total\" : \"Total if I win\"}:{\" \"}\n {formatMoney(pricing.totalCents)}\n </p>\n )}\n </section>\n );\n}\n\nfunction CheckoutAdditionalCharge({\n pricing,\n isPurchase,\n}: {\n pricing: LockerverseAuctionPricing;\n isPurchase: boolean;\n}) {\n if (!pricing.additionalCharge) {\n return null;\n }\n return (\n <section\n aria-label=\"Order amounts\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n <p>\n {isPurchase ? \"Subtotal\" : \"Bid amount\"}:{\" \"}\n {formatMoney(pricing.subtotalCents)}\n </p>\n <p>\n {pricing.additionalCharge.name}:{\" \"}\n {formatMoney(pricing.additionalChargeCents ?? 0)}\n </p>\n <p>\n {isPurchase ? \"Total\" : \"Total if I win\"}:{\" \"}\n {formatMoney(pricing.totalCents)}\n </p>\n </section>\n );\n}\n","// biome-ignore-all lint/suspicious/noUnnecessaryConditions: React refs change in effect cleanup and event handlers outside this static control flow.\nimport {\n type LockerverseAuction,\n type LockerverseAuctionItem,\n type LockerverseAuctionPurchaseResult,\n LockerverseSdkError,\n} from \"@lockerverse/sdk/auctions\";\nimport { useElements, useStripe } from \"@stripe/react-stripe-js\";\nimport type { StripeAddressElementChangeEvent } from \"@stripe/stripe-js\";\nimport { type FormEvent, useEffect, useId, useRef, useState } from \"react\";\nimport { AuctionCheckoutView } from \"./auction-checkout-view.tsx\";\nimport type {\n LockerverseAuctionItemProps,\n LockerverseAuctionPurchaseRecovery,\n} from \"./auction-item-types.ts\";\nimport {\n type AuctionSelection,\n auctionExpectedPricing,\n completeAuctionAction,\n createAuctionConfirmationToken,\n getAuctionSelectionError,\n getAuctionSelectionPricing,\n hasAuctionCheckoutChanged,\n sameAuctionAdditionalCharge,\n} from \"./auction-payment.ts\";\nimport type { LockerverseAuctionOutcome } from \"./auction-result.tsx\";\nimport { notifyHostCallback } from \"./host-callback.ts\";\nimport { type ContactErrors, validateContact } from \"./payment-validation.ts\";\nimport { getInternationalPhone, resolvePhoneCountry } from \"./phone.ts\";\n\ntype AuctionCheckoutProps = LockerverseAuctionItemProps & {\n item: LockerverseAuctionItem;\n selection: AuctionSelection;\n onReview: (auction: LockerverseAuction, message: string) => void;\n onBack: () => void;\n contact?: { email: string; phone: string };\n onContactChange?: (contact: { email: string; phone: string }) => void;\n onIncludeServiceFeeChange?: (value: boolean) => void;\n onInteractionLockChange?: (locked: boolean) => void;\n onResult: (outcome: LockerverseAuctionOutcome) => void;\n};\n\ntype CheckoutState =\n | \"ready\"\n | \"busy\"\n | \"pending\"\n | \"retry\"\n | \"complete\"\n | \"uncertain\";\n\nfunction getSubmitLabel(\n state: CheckoutState,\n hasRecovery: boolean,\n isPurchase: boolean\n) {\n if (state === \"busy\") {\n return isPurchase ? \"Processing...\" : \"Authorizing...\";\n }\n if (state === \"retry\") {\n return \"Retry original purchase\";\n }\n if (hasRecovery) {\n return \"Check purchase status\";\n }\n return isPurchase ? \"Buy Now\" : \"Authorize Bid\";\n}\n\nexport function AuctionCheckout(props: AuctionCheckoutProps) {\n const { auction, item, selection, client, onReview, onBack } = props;\n const stripe = useStripe();\n const elements = useElements();\n const id = useId();\n const [email, setEmail] = useState(props.contact?.email ?? \"\");\n const [phone, setPhone] = useState(props.contact?.phone ?? \"\");\n const [phoneCountry, setPhoneCountry] = useState<string>(() =>\n resolvePhoneCountry(props.contact?.phone ?? \"\")\n );\n const [contactErrors, setContactErrors] = useState<ContactErrors>({});\n const [sameAsBilling, setSameAsBilling] = useState(true);\n const [billing, setBilling] =\n useState<StripeAddressElementChangeEvent | null>(null);\n const [shipping, setShipping] =\n useState<StripeAddressElementChangeEvent | null>(null);\n const [recovery, setRecovery] = useState(props.resumePurchase ?? null);\n const [state, setState] = useState<CheckoutState>(\n props.resumePurchase ? \"pending\" : \"ready\"\n );\n const [message, setMessage] = useState<string | null>(null);\n const purchaseRequestId = useRef<string | null>(\n props.resumePurchase?.submission.clientRequestId ?? null\n );\n const isTerminal = state === \"complete\" || state === \"uncertain\";\n const busy = useRef<boolean>(false);\n const mounted = useRef<boolean>(true);\n const callbacks = useRef(props);\n callbacks.current = props;\n const outcomeReported = useRef(false);\n\n function transition(next: CheckoutState) {\n if (mounted.current) {\n setState(next);\n }\n notifyHostCallback(\n callbacks.current.onInteractionLockChange,\n next !== \"ready\" && next !== \"complete\"\n );\n }\n function showMessage(value: string | null) {\n if (mounted.current) {\n setMessage(value);\n }\n }\n function reportUncertain(kind: \"bid\" | \"purchase\") {\n transition(kind === \"bid\" ? \"uncertain\" : \"pending\");\n showMessage(\n kind === \"bid\"\n ? \"We could not confirm your bid. Do not submit another bid until you check your email or contact the auction organizer.\"\n : \"We could not confirm the purchase result. Check its status using the same purchase request.\"\n );\n if (!outcomeReported.current) {\n outcomeReported.current = true;\n notifyHostCallback(callbacks.current.onUncertain, kind);\n }\n }\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n const isPurchase =\n Boolean(recovery ?? props.resumePurchase) || item.saleMode === \"buy_now\";\n const pricing =\n recovery?.pricing ??\n props.resumePurchase?.pricing ??\n getAuctionSelectionPricing(auction, item, selection);\n\n const payment =\n recovery?.payment ?? props.resumePurchase?.payment ?? auction.payment;\n\n function rememberPurchase(value: LockerverseAuctionPurchaseRecovery | null) {\n if (mounted.current) {\n setRecovery(value);\n }\n notifyHostCallback(callbacks.current.onPurchaseRecoveryChange, value);\n }\n\n function finishPurchase(result: LockerverseAuctionPurchaseResult) {\n if (result.status === \"paid\") {\n purchaseRequestId.current = null;\n rememberPurchase(null);\n transition(\"complete\");\n notifyHostCallback(callbacks.current.onResult, {\n additionalCharge: result.additionalCharge ?? null,\n additionalChargeCents: result.additionalChargeCents ?? 0,\n kind: \"purchase\",\n purchaseId: result.purchaseId,\n quantity: result.quantity,\n serviceFeeCents: result.serviceFeeCents,\n status: \"paid\",\n subtotalCents: result.subtotalCents,\n totalCents: result.totalCents,\n unitAmountCents: result.subtotalCents / result.quantity,\n });\n if (!outcomeReported.current) {\n outcomeReported.current = true;\n notifyHostCallback(callbacks.current.onPurchaseComplete, result);\n }\n } else if (result.status === \"pending_payment\") {\n transition(\"pending\");\n showMessage(\n \"Your purchase is pending. Check its status before making another payment.\"\n );\n } else {\n purchaseRequestId.current = null;\n rememberPurchase(null);\n transition(\"ready\");\n showMessage(\n `This purchase is ${result.status.replaceAll(\"_\", \" \")}. You can start a new purchase.`\n );\n }\n }\n\n function readContact() {\n const phoneNumber = getInternationalPhone(phone, phoneCountry);\n const contact = validateContact({ email, phone: phoneNumber }, true);\n setContactErrors(contact.errors);\n if (!contact.value) {\n document\n .getElementById(`${id}-${contact.errors.email ? \"email\" : \"phone\"}`)\n ?.focus();\n return null;\n }\n return { email: contact.value.email, phone: phoneNumber };\n }\n\n function requireCurrentSelection() {\n const latest = callbacks.current.selection;\n if (\n selection.quantity !== latest.quantity ||\n selection.amount !== latest.amount ||\n selection.includeServiceFee !== latest.includeServiceFee\n ) {\n throw new Error(\n \"Your selection changed. Review the total before continuing.\"\n );\n }\n }\n\n async function verifyPurchaseQuote(current: LockerverseAuction) {\n if (!(isPurchase && item.additionalCharge)) {\n return true;\n }\n const quote = await client.getPurchaseQuote(auction.slug, item.id, {\n includeServiceFee: selection.includeServiceFee,\n quantity: selection.quantity,\n });\n if (!mounted.current) {\n return false;\n }\n if (\n quote.subtotalCents !== pricing.subtotalCents ||\n (quote.additionalChargeCents ?? 0) !==\n (pricing.additionalChargeCents ?? 0) ||\n quote.serviceFeeCents !== pricing.serviceFeeCents ||\n quote.totalCents !== pricing.totalCents ||\n !sameAuctionAdditionalCharge(\n quote.additionalCharge,\n pricing.additionalCharge\n )\n ) {\n onReview(\n current,\n \"The checkout details changed. Review them before continuing.\"\n );\n return false;\n }\n return true;\n }\n\n async function prepareSubmission(\n contact: { email: string; phone: string } | null\n ) {\n if (!contact) {\n throw new Error(\"Check the contact fields below.\");\n }\n if (!(stripe && elements && auction.payment)) {\n throw new Error(\"Payment details are still loading.\");\n }\n const current = await client.load(auction.slug);\n if (!mounted.current) {\n return null;\n }\n const currentItem = current.items.find(\n (candidate) => candidate.id === item.id\n );\n if (!currentItem) {\n onReview(current, \"This item is no longer available.\");\n return null;\n }\n const selectionError = getAuctionSelectionError(\n current,\n currentItem,\n selection\n );\n if (\n selectionError ||\n hasAuctionCheckoutChanged(auction, current, item, currentItem, selection)\n ) {\n onReview(\n current,\n selectionError ??\n \"The checkout details changed. Review them before continuing.\"\n );\n return null;\n }\n if (!(await verifyPurchaseQuote(current))) {\n return null;\n }\n const confirmationToken = await createAuctionConfirmationToken({\n billing,\n collectShippingAddress: item.collectShippingAddress,\n elements,\n email: contact.email,\n phone: contact.phone,\n shipping: sameAsBilling ? billing : shipping,\n stripe,\n });\n if (!mounted.current) {\n return null;\n }\n requireCurrentSelection();\n return {\n confirmationToken,\n email: contact.email,\n includeServiceFee: selection.includeServiceFee,\n phone: contact.phone,\n ...auctionExpectedPricing(pricing),\n };\n }\n\n async function sendBid(\n submission: NonNullable<Awaited<ReturnType<typeof prepareSubmission>>>\n ) {\n const result = await client.createBid(auction.slug, item.id, {\n ...submission,\n amount: selection.amount,\n });\n if (result.requiresAction) {\n if (!(mounted.current && stripe)) {\n reportUncertain(\"bid\");\n return;\n }\n await completeAuctionAction(stripe, result);\n }\n transition(\"complete\");\n notifyHostCallback(callbacks.current.onResult, {\n additionalCharge: result.additionalCharge ?? null,\n additionalChargeCents: result.additionalChargeCents ?? 0,\n amountCents: result.subtotalCents,\n kind: \"bid\",\n serviceFeeCents: result.serviceFeeCents,\n totalCents: result.totalCents,\n });\n if (!outcomeReported.current) {\n outcomeReported.current = true;\n notifyHostCallback(callbacks.current.onBidSubmitted, result);\n }\n }\n\n async function resolvePurchase(\n result: LockerverseAuctionPurchaseResult,\n active: LockerverseAuctionPurchaseRecovery\n ) {\n if (result.requiresAction) {\n if (!(mounted.current && stripe)) {\n reportUncertain(\"purchase\");\n return;\n }\n await completeAuctionAction(stripe, result);\n const updated = await client.getPurchaseStatus(\n auction.slug,\n item.id,\n active.submission.clientRequestId\n );\n if (updated) {\n finishPurchase(updated);\n } else {\n transition(\"pending\");\n showMessage(\n \"Payment status is not available yet. Check again shortly.\"\n );\n }\n return;\n }\n finishPurchase(result);\n if (!mounted.current && result.status === \"pending_payment\") {\n reportUncertain(\"purchase\");\n }\n }\n\n async function checkPurchase(active: LockerverseAuctionPurchaseRecovery) {\n const result = await client.getPurchaseStatus(\n auction.slug,\n item.id,\n active.submission.clientRequestId\n );\n if (result) {\n await resolvePurchase(result, active);\n } else {\n if (!mounted.current) {\n reportUncertain(\"purchase\");\n return;\n }\n transition(\"retry\");\n showMessage(\n \"No purchase is recorded yet. You can retry the original purchase with the same request ID.\"\n );\n }\n }\n\n async function clearRejectedPurchase(\n error: LockerverseSdkError,\n active: LockerverseAuctionPurchaseRecovery\n ) {\n const result = await client.getPurchaseStatus(\n auction.slug,\n item.id,\n active.submission.clientRequestId\n );\n if (result) {\n await resolvePurchase(result, active);\n return;\n }\n rememberPurchase(null);\n transition(\"ready\");\n showMessage(\n `The purchase was rejected. Review the item and payment details before trying again. (${error.status ?? \"validation\"})`\n );\n }\n\n async function handleFailure<Failure>(\n error: Failure,\n requestSent: boolean,\n active: LockerverseAuctionPurchaseRecovery | null,\n wasRecovery: boolean\n ) {\n const uncertain =\n requestSent &&\n (!(error instanceof LockerverseSdkError) || error.recoveryRecommended);\n showMessage(\n error instanceof Error\n ? error.message\n : \"Unable to complete this request.\"\n );\n if (isPurchase && active) {\n if (\n !wasRecovery &&\n error instanceof LockerverseSdkError &&\n !error.recoveryRecommended\n ) {\n try {\n await clearRejectedPurchase(error, active);\n return;\n } catch {\n /* Keep the original request when status cannot be established. */\n }\n }\n reportUncertain(\"purchase\");\n } else if (uncertain) {\n reportUncertain(\"bid\");\n } else {\n transition(\"ready\");\n }\n }\n\n function getPurchaseRequestId() {\n purchaseRequestId.current ??= globalThis.crypto.randomUUID();\n return purchaseRequestId.current;\n }\n\n function canSendPurchase() {\n if (mounted.current) {\n return true;\n }\n if (!recovery) {\n rememberPurchase(null);\n transition(\"ready\");\n }\n return false;\n }\n\n async function sendOrCheckPurchase(\n active: LockerverseAuctionPurchaseRecovery,\n statusOnly: boolean\n ) {\n if (statusOnly) {\n await checkPurchase(active);\n return;\n }\n if (!canSendPurchase()) {\n return;\n }\n const result = await client.createPurchase(\n auction.slug,\n item.id,\n active.submission\n );\n await resolvePurchase(result, active);\n }\n\n const checkoutPayment = stripe && elements && payment;\n\n function startSubmission() {\n if (busy.current || isTerminal) {\n return null;\n }\n if (!checkoutPayment) {\n showMessage(\"Payment details are still loading.\");\n return null;\n }\n const contact = recovery ? null : readContact();\n if (!(recovery || contact)) {\n return null;\n }\n return { checkoutPayment, contact, retryOriginal: state === \"retry\" };\n }\n\n async function submit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n const start = startSubmission();\n if (!start) {\n return;\n }\n const { contact, checkoutPayment: readyPayment, retryOriginal } = start;\n busy.current = true;\n outcomeReported.current = false;\n transition(\"busy\");\n showMessage(null);\n let requestSent = false;\n let activeRecovery = recovery;\n try {\n if (!activeRecovery) {\n const submission = await prepareSubmission(contact);\n if (!(submission && mounted.current)) {\n transition(\"ready\");\n return;\n }\n if (!isPurchase) {\n requestSent = true;\n await sendBid(submission);\n return;\n }\n activeRecovery = Object.freeze({\n auctionId: auction.id,\n item,\n itemId: item.id,\n payment: Object.freeze({ ...readyPayment }),\n pricing,\n submission: Object.freeze({\n ...submission,\n clientRequestId: getPurchaseRequestId(),\n paymentMethodTypes: Object.freeze([\"card\"] as const),\n quantity: selection.quantity,\n }),\n });\n rememberPurchase(activeRecovery);\n }\n requestSent = true;\n await sendOrCheckPurchase(\n activeRecovery,\n Boolean(recovery) && !retryOriginal\n );\n } catch (error) {\n await handleFailure(\n error,\n requestSent,\n activeRecovery,\n recovery !== null && !retryOriginal\n );\n } finally {\n busy.current = false;\n }\n }\n\n const buttonText = getSubmitLabel(state, recovery !== null, isPurchase);\n\n const locked = state !== \"ready\";\n return (\n <AuctionCheckoutView\n buttonText={buttonText}\n communityName={props.communityName ?? auction.name}\n contactErrors={contactErrors}\n email={email}\n id={id}\n includeServiceFee={selection.includeServiceFee}\n isPurchase={isPurchase}\n isTerminal={isTerminal}\n item={item}\n locked={locked}\n message={message}\n onBack={state === \"ready\" ? onBack : undefined}\n onBillingChange={setBilling}\n onEmailChange={(value) => {\n setEmail(value);\n props.onContactChange?.({\n email: value,\n phone: getInternationalPhone(phone, phoneCountry),\n });\n }}\n onIncludeServiceFeeChange={props.onIncludeServiceFeeChange}\n onPaymentLoadError={() => showMessage(\"Unable to load payment form.\")}\n onPhoneChange={({ value, country }) => {\n setPhone(value);\n setPhoneCountry(country);\n props.onContactChange?.({\n email,\n phone: getInternationalPhone(value, country),\n });\n }}\n onSameAsBillingChange={setSameAsBilling}\n onShippingChange={setShipping}\n onSubmit={submit}\n phone={phone}\n phoneCountry={phoneCountry}\n pricing={pricing}\n quantity={selection.quantity}\n sameAsBilling={sameAsBilling}\n serviceFeeCents={\n recovery\n ? pricing.serviceFeeCents\n : getAuctionSelectionPricing(auction, item, {\n ...selection,\n includeServiceFee: auction.serviceFeeEnabled,\n }).serviceFeeCents\n }\n serviceFeeEnabled={auction.serviceFeeEnabled}\n showFields={!(recovery || isTerminal)}\n submitDisabled={state === \"busy\" || !stripe || !elements}\n />\n );\n}\n","import type {\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuction,\n} from \"@lockerverse/sdk/auctions\";\nimport { Elements } from \"@stripe/react-stripe-js\";\nimport type {\n StripeElementsOptions,\n StripeElementsOptionsMode,\n} from \"@stripe/stripe-js\";\nimport { type RefObject, useEffect, useState } from \"react\";\nimport { AuctionCheckout } from \"./auction-checkout.tsx\";\nimport type { LockerverseAuctionItemProps } from \"./auction-item-types.ts\";\nimport {\n type AuctionSelection,\n getAuctionSelectionPricing,\n} from \"./auction-payment.ts\";\nimport type { LockerverseAuctionOutcome } from \"./auction-result.tsx\";\nimport { useStripeAppearance } from \"./stripe-appearance.ts\";\nimport { defaultLockerverseStripeLoader } from \"./stripe-loader.ts\";\n\nexport type AuctionPaymentProps = LockerverseAuctionItemProps & {\n appearanceRoot: RefObject<HTMLElement | null>;\n interactionLocked: boolean;\n item: AuctionItem;\n selection: AuctionSelection;\n onReview: (auction: LockerverseAuction, message: string) => void;\n onBack: () => void;\n contact: { email: string; phone: string };\n onContactChange: (contact: { email: string; phone: string }) => void;\n onIncludeServiceFeeChange: (value: boolean) => void;\n onInteractionLockChange: (locked: boolean) => void;\n onResult: (outcome: LockerverseAuctionOutcome) => void;\n};\n\nexport function AuctionPayment(props: AuctionPaymentProps) {\n const {\n auction,\n item,\n selection,\n theme = \"dark\",\n stripeLoader = defaultLockerverseStripeLoader,\n style,\n onBack,\n resumePurchase,\n } = props;\n const [stripe, setStripe] =\n useState<Awaited<ReturnType<typeof defaultLockerverseStripeLoader>>>(null);\n const [failed, setFailed] = useState(false);\n const [revision, setRevision] = useState(0);\n const appearance = useStripeAppearance(\n props.appearanceRoot,\n theme,\n style,\n props.interactionLocked\n );\n const payment = resumePurchase?.payment ?? auction.payment;\n useEffect(() => {\n let active = true;\n if (!payment) {\n setFailed(true);\n return;\n }\n Promise.resolve()\n .then(() =>\n stripeLoader(\n payment.publishableKey,\n payment.connectedAccountId\n ? { stripeAccount: payment.connectedAccountId }\n : undefined\n )\n )\n .then(\n (loaded) => {\n if (active) {\n setStripe(loaded);\n setFailed(!loaded);\n }\n },\n () => {\n if (active) {\n setFailed(true);\n }\n }\n );\n return () => {\n active = false;\n };\n }, [payment, stripeLoader, revision]);\n if (failed) {\n return (\n <div>\n <p role=\"alert\">Payment details could not load.</p>\n {resumePurchase ? null : (\n <button onClick={onBack} type=\"button\">\n Back to item\n </button>\n )}\n <button\n onClick={() => {\n setFailed(false);\n setStripe(null);\n setRevision((value) => value + 1);\n }}\n type=\"button\"\n >\n Try again\n </button>\n </div>\n );\n }\n if (!(stripe && appearance)) {\n return (\n <div>\n <p role=\"status\">Loading secure payment details…</p>\n {resumePurchase ? null : (\n <button onClick={onBack} type=\"button\">\n Back to item\n </button>\n )}\n </div>\n );\n }\n let paymentOptions: StripeElementsOptionsMode = {\n mode: \"setup\",\n setupFutureUsage: \"off_session\",\n };\n if (resumePurchase) {\n paymentOptions = {\n amount: resumePurchase.pricing.totalCents,\n currency: \"usd\",\n mode: \"payment\",\n };\n } else if (item.saleMode === \"buy_now\") {\n paymentOptions = {\n amount: getAuctionSelectionPricing(auction, item, selection).totalCents,\n currency: \"usd\",\n mode: \"payment\",\n };\n }\n const options: StripeElementsOptions = {\n ...paymentOptions,\n appearance,\n currency: \"usd\",\n paymentMethodTypes: [\"card\"],\n syncAddressCheckbox: \"none\",\n };\n return (\n <Elements options={options} stripe={stripe}>\n <AuctionCheckout {...props} />\n </Elements>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"auction-payment-view.js","names":["formatMoney"],"sources":["../src/auction-checkout-view.tsx","../src/auction-checkout.tsx","../src/auction-payment-view.tsx"],"sourcesContent":["import type {\n LockerverseAuctionItem,\n LockerverseAuctionPricing,\n} from \"@lockerverse/sdk/auctions\";\nimport { AddressElement, PaymentElement } from \"@stripe/react-stripe-js\";\nimport type {\n StripeAddressElementChangeEvent,\n StripePaymentElementOptions,\n} from \"@stripe/stripe-js\";\nimport { ArrowRight, ChevronLeft } from \"lucide-react\";\nimport type { FormEventHandler } from \"react\";\nimport { formatAuctionMoney as formatMoney } from \"./auction-display.ts\";\nimport { Checkbox, EmailField, FormField } from \"./form-field.tsx\";\nimport type { PhoneInputValue } from \"./phone-field.tsx\";\nimport { PhoneInput } from \"./phone-field.tsx\";\n\ntype AuctionCheckoutViewProps = {\n buttonText: string;\n communityName: string;\n email: string;\n contactErrors: { email?: string; phone?: string };\n phoneCountry: string;\n id: string;\n includeServiceFee: boolean;\n isPurchase: boolean;\n isTerminal: boolean;\n item: LockerverseAuctionItem;\n locked: boolean;\n message: string | null;\n onBack?: (() => void) | undefined;\n onBillingChange: (event: StripeAddressElementChangeEvent) => void;\n onEmailChange: (value: string) => void;\n onIncludeServiceFeeChange?: ((value: boolean) => void) | undefined;\n onPaymentLoadError: () => void;\n onPhoneChange: (value: PhoneInputValue) => void;\n onSameAsBillingChange: (value: boolean) => void;\n onShippingChange: (event: StripeAddressElementChangeEvent) => void;\n onSubmit: FormEventHandler<HTMLFormElement>;\n phone: string;\n pricing: LockerverseAuctionPricing;\n quantity: number;\n sameAsBilling: boolean;\n serviceFeeCents: number;\n serviceFeeEnabled: boolean;\n showFields: boolean;\n submitDisabled: boolean;\n};\n\nfunction getPaymentOptions(isPurchase: boolean): StripePaymentElementOptions {\n return {\n business: { name: \"Lockerverse\" },\n fields: {\n billingDetails: {\n address: \"never\",\n email: \"never\",\n name: \"never\",\n phone: \"never\",\n },\n },\n terms: {\n applePay: isPurchase ? \"auto\" : \"never\",\n auBecsDebit: \"never\",\n bancontact: \"never\",\n card: \"always\",\n cashapp: \"never\",\n googlePay: \"never\",\n ideal: \"never\",\n paypal: isPurchase ? \"auto\" : \"never\",\n sepaDebit: \"never\",\n sofort: \"never\",\n usBankAccount: \"never\",\n },\n wallets: { applePay: isPurchase ? \"auto\" : \"never\", googlePay: \"never\" },\n };\n}\n\nexport function AuctionCheckoutView(props: AuctionCheckoutViewProps) {\n const { isPurchase, item, pricing, id } = props;\n return (\n <form\n className=\"lockerverse-auctions__checkout\"\n noValidate\n onSubmit={props.onSubmit}\n >\n <div className=\"lockerverse-auctions__checkout-header\">\n <div className=\"lockerverse-auctions__checkout-navigation\">\n <button\n aria-label=\"Back\"\n className=\"lockerverse-auctions__checkout-back\"\n disabled={!props.onBack}\n onClick={props.onBack}\n type=\"button\"\n >\n <ChevronLeft aria-hidden=\"true\" size={20} />\n </button>\n <div>\n <p className=\"lockerverse-auctions__checkout-eyebrow\">\n Step 2 of 2\n </p>\n <p>{isPurchase ? \"Secure checkout\" : \"Secure payment method\"}</p>\n </div>\n </div>\n <p className=\"lockerverse-auctions__checkout-eyebrow\">\n {props.communityName}\n </p>\n <h2>\n {isPurchase\n ? \"Finalize your purchase.\"\n : \"Finalize your bid authorization.\"}\n </h2>\n <p className=\"lockerverse-auctions__checkout-summary\">\n {isPurchase ? (\n <>\n Pay <strong>{formatMoney(pricing.totalCents)}</strong> for{\" \"}\n {props.quantity} {props.quantity === 1 ? \"item\" : \"items\"} of{\" \"}\n <strong>{item.name}</strong>. Your card is charged immediately\n once checkout succeeds.\n </>\n ) : (\n <>\n Authorize a payment method for your bid of{\" \"}\n <strong>{formatMoney(pricing.subtotalCents)}</strong> on{\" \"}\n <strong>{item.name}</strong>. Your card is only charged if this\n bid wins the item.\n </>\n )}\n </p>\n {item.collectShippingAddress && (\n <div className=\"lockerverse-auctions__checkout-physical\">\n <p className=\"lockerverse-auctions__checkout-eyebrow\">\n Physical item\n </p>\n <p>\n This item requires a delivery address. Billing details are used by\n default, and you can switch to a separate delivery address below\n if needed.\n </p>\n </div>\n )}\n </div>\n <div className=\"lockerverse-auctions__checkout-body\">\n {props.showFields && (\n <fieldset disabled={props.locked}>\n <div className=\"lockerverse-auctions__checkout-contact\">\n <EmailField\n error={props.contactErrors.email}\n id={`${id}-email`}\n label=\"Email\"\n name=\"email\"\n onChange={(event) => props.onEmailChange(event.target.value)}\n required\n value={props.email}\n />\n <FormField\n error={props.contactErrors.phone}\n id={`${id}-phone`}\n label=\"Phone\"\n >\n <PhoneInput\n country={props.phoneCountry}\n error={props.contactErrors.phone}\n errorId={`${id}-phone-error`}\n id={`${id}-phone`}\n name=\"phone\"\n onChange={props.onPhoneChange}\n required\n value={props.phone}\n />\n </FormField>\n </div>\n <section\n aria-label=\"Payment Information\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n <div className=\"lockerverse-auctions__checkout-section-heading\">\n <h3>Payment Information</h3>\n <p>\n {isPurchase\n ? \"Processed securely and charged immediately for this purchase.\"\n : \"Stored securely and charged only if your bid finishes on top.\"}\n </p>\n </div>\n <PaymentElement\n onLoadError={props.onPaymentLoadError}\n options={getPaymentOptions(isPurchase)}\n />\n </section>\n <section\n aria-label=\"Billing Details\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n <h3>Billing Details</h3>\n <AddressElement\n onChange={props.onBillingChange}\n options={{ mode: \"billing\" }}\n />\n <p>\n {isPurchase\n ? \"Use your full name here. We use the email and phone above for purchase confirmation and fulfillment updates.\"\n : \"Use the bidder's full name here. We use the email and phone above to contact you if this bid is outbid or wins.\"}\n </p>\n </section>\n {item.collectShippingAddress && (\n <section\n aria-label=\"Delivery Details\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n <label\n className=\"lockerverse-auctions__checkout-checkbox lockerverse-auctions__checkout-delivery\"\n htmlFor={`${id}-delivery-same-as-billing`}\n >\n <Checkbox\n checked={props.sameAsBilling}\n id={`${id}-delivery-same-as-billing`}\n onChange={(event) =>\n props.onSameAsBillingChange(event.target.checked)\n }\n />\n <span>\n <strong>Delivery address is the same as billing</strong>\n <span>\n Leave this on for the fastest flow. Turn it off only if\n the delivery address should differ from the billing\n details above.\n </span>\n </span>\n </label>\n {!props.sameAsBilling && (\n <>\n <h3>Delivery Address</h3>\n <AddressElement\n onChange={props.onShippingChange}\n options={{ mode: \"shipping\" }}\n />\n </>\n )}\n </section>\n )}\n <CheckoutAdditionalCharge\n isPurchase={isPurchase}\n pricing={pricing}\n />\n {props.serviceFeeEnabled && <CheckoutServiceFee {...props} />}\n </fieldset>\n )}\n {props.message && (\n <p\n aria-live=\"polite\"\n className=\"lockerverse-auctions__notice\"\n role=\"status\"\n >\n {props.message}\n </p>\n )}\n {!props.isTerminal && (\n <div className=\"lockerverse-auctions__checkout-footer\">\n <p>\n {isPurchase\n ? \"By continuing, you agree to be charged for this purchase.\"\n : \"By continuing, you agree to have this payment method stored for item settlement if your bid is the winning offer.\"}\n {item.collectShippingAddress\n ? ` Your delivery details are stored with the ${isPurchase ? \"order\" : \"bid\"} so the seller can fulfill the item after payment.`\n : \"\"}\n </p>\n <button\n className=\"lockerverse-auctions__button lockerverse-auctions__checkout-submit\"\n disabled={props.submitDisabled}\n type=\"submit\"\n >\n {props.buttonText}\n <ArrowRight aria-hidden=\"true\" size={16} />\n </button>\n </div>\n )}\n </div>\n </form>\n );\n}\n\nfunction CheckoutServiceFee(props: AuctionCheckoutViewProps) {\n const { isPurchase, pricing } = props;\n return (\n <section\n aria-label=\"Processing fees\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n {props.onIncludeServiceFeeChange ? (\n <label\n className=\"lockerverse-auctions__checkout-checkbox\"\n htmlFor={`${props.id}-service-fee`}\n >\n <Checkbox\n checked={props.includeServiceFee}\n id={`${props.id}-service-fee`}\n onChange={(event) =>\n props.onIncludeServiceFeeChange?.(event.target.checked)\n }\n />\n <span>\n <strong>\n {isPurchase ? \"Add\" : \"If I win, add\"}{\" \"}\n {formatMoney(props.serviceFeeCents)} to help cover processing fees\n </strong>\n <span>\n {isPurchase ? \"Total\" : \"Total if I win\"}:{\" \"}\n {formatMoney(pricing.totalCents)}\n </span>\n </span>\n </label>\n ) : (\n <p>\n {isPurchase ? \"Total\" : \"Total if I win\"}:{\" \"}\n {formatMoney(pricing.totalCents)}\n </p>\n )}\n </section>\n );\n}\n\nfunction CheckoutAdditionalCharge({\n pricing,\n isPurchase,\n}: {\n pricing: LockerverseAuctionPricing;\n isPurchase: boolean;\n}) {\n if (!pricing.additionalCharge) {\n return null;\n }\n return (\n <section\n aria-label=\"Order amounts\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n <p>\n {isPurchase ? \"Subtotal\" : \"Bid amount\"}:{\" \"}\n {formatMoney(pricing.subtotalCents)}\n </p>\n <p>\n {pricing.additionalCharge.name}:{\" \"}\n {formatMoney(pricing.additionalChargeCents ?? 0)}\n </p>\n <p>\n {isPurchase ? \"Total\" : \"Total if I win\"}:{\" \"}\n {formatMoney(pricing.totalCents)}\n </p>\n </section>\n );\n}\n","// biome-ignore-all lint/suspicious/noUnnecessaryConditions: React refs change in effect cleanup and event handlers outside this static control flow.\nimport {\n type LockerverseAuction,\n type LockerverseAuctionItem,\n type LockerverseAuctionPurchaseResult,\n LockerverseSdkError,\n} from \"@lockerverse/sdk/auctions\";\nimport { useElements, useStripe } from \"@stripe/react-stripe-js\";\nimport type { StripeAddressElementChangeEvent } from \"@stripe/stripe-js\";\nimport { type FormEvent, useEffect, useId, useRef, useState } from \"react\";\nimport { AuctionCheckoutView } from \"./auction-checkout-view.tsx\";\nimport type {\n LockerverseAuctionItemProps,\n LockerverseAuctionPurchaseRecovery,\n} from \"./auction-item-types.ts\";\nimport {\n type AuctionSelection,\n auctionExpectedPricing,\n completeAuctionAction,\n createAuctionConfirmationToken,\n getAuctionSelectionError,\n getAuctionSelectionPricing,\n hasAuctionCheckoutChanged,\n sameAuctionAdditionalCharge,\n} from \"./auction-payment.ts\";\nimport type { LockerverseAuctionOutcome } from \"./auction-result.tsx\";\nimport { notifyHostCallback } from \"./host-callback.ts\";\nimport { type ContactErrors, validateContact } from \"./payment-validation.ts\";\nimport { getInternationalPhone, resolvePhoneCountry } from \"./phone.ts\";\n\ntype AuctionCheckoutProps = LockerverseAuctionItemProps & {\n item: LockerverseAuctionItem;\n selection: AuctionSelection;\n onReview: (auction: LockerverseAuction, message: string) => void;\n onBack: () => void;\n contact?: { email: string; phone: string };\n onContactChange?: (contact: { email: string; phone: string }) => void;\n onIncludeServiceFeeChange?: (value: boolean) => void;\n onInteractionLockChange?: (locked: boolean) => void;\n onResult: (outcome: LockerverseAuctionOutcome) => void;\n};\n\ntype CheckoutState =\n | \"ready\"\n | \"busy\"\n | \"pending\"\n | \"retry\"\n | \"complete\"\n | \"uncertain\";\n\nfunction getSubmitLabel(\n state: CheckoutState,\n hasRecovery: boolean,\n isPurchase: boolean\n) {\n if (state === \"busy\") {\n return isPurchase ? \"Processing...\" : \"Authorizing...\";\n }\n if (state === \"retry\") {\n return \"Retry original purchase\";\n }\n if (hasRecovery) {\n return \"Check purchase status\";\n }\n return isPurchase ? \"Buy Now\" : \"Authorize Bid\";\n}\n\nexport function AuctionCheckout(props: AuctionCheckoutProps) {\n const { auction, item, selection, client, onReview, onBack } = props;\n const stripe = useStripe();\n const elements = useElements();\n const id = useId();\n const [email, setEmail] = useState(props.contact?.email ?? \"\");\n const [phone, setPhone] = useState(props.contact?.phone ?? \"\");\n const [phoneCountry, setPhoneCountry] = useState<string>(() =>\n resolvePhoneCountry(props.contact?.phone ?? \"\")\n );\n const [contactErrors, setContactErrors] = useState<ContactErrors>({});\n const [sameAsBilling, setSameAsBilling] = useState(true);\n const [billing, setBilling] =\n useState<StripeAddressElementChangeEvent | null>(null);\n const [shipping, setShipping] =\n useState<StripeAddressElementChangeEvent | null>(null);\n const [recovery, setRecovery] = useState(props.resumePurchase ?? null);\n const [state, setState] = useState<CheckoutState>(\n props.resumePurchase ? \"pending\" : \"ready\"\n );\n const [message, setMessage] = useState<string | null>(null);\n const purchaseRequestId = useRef<string | null>(\n props.resumePurchase?.submission.clientRequestId ?? null\n );\n const isTerminal = state === \"complete\" || state === \"uncertain\";\n const busy = useRef<boolean>(false);\n const mounted = useRef<boolean>(true);\n const callbacks = useRef(props);\n callbacks.current = props;\n const outcomeReported = useRef(false);\n\n function transition(next: CheckoutState) {\n if (mounted.current) {\n setState(next);\n }\n notifyHostCallback(\n callbacks.current.onInteractionLockChange,\n next !== \"ready\" && next !== \"complete\"\n );\n }\n function showMessage(value: string | null) {\n if (mounted.current) {\n setMessage(value);\n }\n }\n function reportUncertain(kind: \"bid\" | \"purchase\") {\n transition(kind === \"bid\" ? \"uncertain\" : \"pending\");\n showMessage(\n kind === \"bid\"\n ? \"We could not confirm your bid. Do not submit another bid until you check your email or contact the auction organizer.\"\n : \"We could not confirm the purchase result. Check its status using the same purchase request.\"\n );\n if (!outcomeReported.current) {\n outcomeReported.current = true;\n notifyHostCallback(callbacks.current.onUncertain, kind);\n }\n }\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n const isPurchase =\n Boolean(recovery ?? props.resumePurchase) || item.saleMode === \"buy_now\";\n const pricing =\n recovery?.pricing ??\n props.resumePurchase?.pricing ??\n getAuctionSelectionPricing(auction, item, selection);\n\n const payment =\n recovery?.payment ?? props.resumePurchase?.payment ?? auction.payment;\n\n function rememberPurchase(value: LockerverseAuctionPurchaseRecovery | null) {\n if (mounted.current) {\n setRecovery(value);\n }\n notifyHostCallback(callbacks.current.onPurchaseRecoveryChange, value);\n }\n\n function finishPurchase(result: LockerverseAuctionPurchaseResult) {\n if (result.status === \"paid\") {\n purchaseRequestId.current = null;\n rememberPurchase(null);\n transition(\"complete\");\n notifyHostCallback(callbacks.current.onResult, {\n additionalCharge: result.additionalCharge ?? null,\n additionalChargeCents: result.additionalChargeCents ?? 0,\n kind: \"purchase\",\n purchaseId: result.purchaseId,\n quantity: result.quantity,\n serviceFeeCents: result.serviceFeeCents,\n status: \"paid\",\n subtotalCents: result.subtotalCents,\n totalCents: result.totalCents,\n unitAmountCents: result.subtotalCents / result.quantity,\n });\n if (!outcomeReported.current) {\n outcomeReported.current = true;\n notifyHostCallback(callbacks.current.onPurchaseComplete, result);\n }\n } else if (result.status === \"pending_payment\") {\n transition(\"pending\");\n showMessage(\n \"Your purchase is pending. Check its status before making another payment.\"\n );\n } else {\n purchaseRequestId.current = null;\n rememberPurchase(null);\n transition(\"ready\");\n showMessage(\n `This purchase is ${result.status.replaceAll(\"_\", \" \")}. You can start a new purchase.`\n );\n }\n }\n\n function readContact() {\n const phoneNumber = getInternationalPhone(phone, phoneCountry);\n const contact = validateContact({ email, phone: phoneNumber }, true);\n setContactErrors(contact.errors);\n if (!contact.value) {\n document\n .getElementById(`${id}-${contact.errors.email ? \"email\" : \"phone\"}`)\n ?.focus();\n return null;\n }\n return { email: contact.value.email, phone: phoneNumber };\n }\n\n function requireCurrentSelection() {\n const latest = callbacks.current.selection;\n if (\n selection.quantity !== latest.quantity ||\n selection.amount !== latest.amount ||\n selection.includeServiceFee !== latest.includeServiceFee\n ) {\n throw new Error(\n \"Your selection changed. Review the total before continuing.\"\n );\n }\n }\n\n async function verifyPurchaseQuote(current: LockerverseAuction) {\n if (!(isPurchase && item.additionalCharge)) {\n return true;\n }\n const quote = await client.getPurchaseQuote(auction.slug, item.id, {\n includeServiceFee: selection.includeServiceFee,\n quantity: selection.quantity,\n });\n if (!mounted.current) {\n return false;\n }\n if (\n quote.subtotalCents !== pricing.subtotalCents ||\n (quote.additionalChargeCents ?? 0) !==\n (pricing.additionalChargeCents ?? 0) ||\n quote.serviceFeeCents !== pricing.serviceFeeCents ||\n quote.totalCents !== pricing.totalCents ||\n !sameAuctionAdditionalCharge(\n quote.additionalCharge,\n pricing.additionalCharge\n )\n ) {\n onReview(\n current,\n \"The checkout details changed. Review them before continuing.\"\n );\n return false;\n }\n return true;\n }\n\n async function prepareSubmission(\n contact: { email: string; phone: string } | null\n ) {\n if (!contact) {\n throw new Error(\"Check the contact fields below.\");\n }\n if (!(stripe && elements && auction.payment)) {\n throw new Error(\"Payment details are still loading.\");\n }\n const current = await client.load(auction.slug);\n if (!mounted.current) {\n return null;\n }\n const currentItem = current.items.find(\n (candidate) => candidate.id === item.id\n );\n if (!currentItem) {\n onReview(current, \"This item is no longer available.\");\n return null;\n }\n const selectionError = getAuctionSelectionError(\n current,\n currentItem,\n selection\n );\n if (\n selectionError ||\n hasAuctionCheckoutChanged(auction, current, item, currentItem, selection)\n ) {\n onReview(\n current,\n selectionError ??\n \"The checkout details changed. Review them before continuing.\"\n );\n return null;\n }\n if (!(await verifyPurchaseQuote(current))) {\n return null;\n }\n const confirmationToken = await createAuctionConfirmationToken({\n billing,\n collectShippingAddress: item.collectShippingAddress,\n elements,\n email: contact.email,\n phone: contact.phone,\n shipping: sameAsBilling ? billing : shipping,\n stripe,\n });\n if (!mounted.current) {\n return null;\n }\n requireCurrentSelection();\n return {\n confirmationToken,\n email: contact.email,\n includeServiceFee: selection.includeServiceFee,\n phone: contact.phone,\n ...auctionExpectedPricing(pricing),\n };\n }\n\n async function sendBid(\n submission: NonNullable<Awaited<ReturnType<typeof prepareSubmission>>>\n ) {\n const result = await client.createBid(auction.slug, item.id, {\n ...submission,\n amount: selection.amount,\n });\n if (result.requiresAction) {\n if (!(mounted.current && stripe)) {\n reportUncertain(\"bid\");\n return;\n }\n await completeAuctionAction(stripe, result);\n }\n transition(\"complete\");\n notifyHostCallback(callbacks.current.onResult, {\n additionalCharge: result.additionalCharge ?? null,\n additionalChargeCents: result.additionalChargeCents ?? 0,\n amountCents: result.subtotalCents,\n kind: \"bid\",\n serviceFeeCents: result.serviceFeeCents,\n totalCents: result.totalCents,\n });\n if (!outcomeReported.current) {\n outcomeReported.current = true;\n notifyHostCallback(callbacks.current.onBidSubmitted, result);\n }\n }\n\n async function resolvePurchase(\n result: LockerverseAuctionPurchaseResult,\n active: LockerverseAuctionPurchaseRecovery\n ) {\n if (result.requiresAction) {\n if (!(mounted.current && stripe)) {\n reportUncertain(\"purchase\");\n return;\n }\n await completeAuctionAction(stripe, result);\n const updated = await client.getPurchaseStatus(\n auction.slug,\n item.id,\n active.submission.clientRequestId\n );\n if (updated) {\n finishPurchase(updated);\n } else {\n transition(\"pending\");\n showMessage(\n \"Payment status is not available yet. Check again shortly.\"\n );\n }\n return;\n }\n finishPurchase(result);\n if (!mounted.current && result.status === \"pending_payment\") {\n reportUncertain(\"purchase\");\n }\n }\n\n async function checkPurchase(active: LockerverseAuctionPurchaseRecovery) {\n const result = await client.getPurchaseStatus(\n auction.slug,\n item.id,\n active.submission.clientRequestId\n );\n if (result) {\n await resolvePurchase(result, active);\n } else {\n if (!mounted.current) {\n reportUncertain(\"purchase\");\n return;\n }\n transition(\"retry\");\n showMessage(\n \"No purchase is recorded yet. You can retry the original purchase with the same request ID.\"\n );\n }\n }\n\n async function clearRejectedPurchase(\n error: LockerverseSdkError,\n active: LockerverseAuctionPurchaseRecovery\n ) {\n const result = await client.getPurchaseStatus(\n auction.slug,\n item.id,\n active.submission.clientRequestId\n );\n if (result) {\n await resolvePurchase(result, active);\n return;\n }\n rememberPurchase(null);\n transition(\"ready\");\n showMessage(\n `The purchase was rejected. Review the item and payment details before trying again. (${error.status ?? \"validation\"})`\n );\n }\n\n async function handleFailure<Failure>(\n error: Failure,\n requestSent: boolean,\n active: LockerverseAuctionPurchaseRecovery | null,\n wasRecovery: boolean\n ) {\n const uncertain =\n requestSent &&\n (!(error instanceof LockerverseSdkError) || error.recoveryRecommended);\n showMessage(\n error instanceof Error\n ? error.message\n : \"Unable to complete this request.\"\n );\n if (isPurchase && active) {\n if (\n !wasRecovery &&\n error instanceof LockerverseSdkError &&\n !error.recoveryRecommended\n ) {\n try {\n await clearRejectedPurchase(error, active);\n return;\n } catch {\n /* Keep the original request when status cannot be established. */\n }\n }\n reportUncertain(\"purchase\");\n } else if (uncertain) {\n reportUncertain(\"bid\");\n } else {\n transition(\"ready\");\n }\n }\n\n function getPurchaseRequestId() {\n purchaseRequestId.current ??= globalThis.crypto.randomUUID();\n return purchaseRequestId.current;\n }\n\n function canSendPurchase() {\n if (mounted.current) {\n return true;\n }\n if (!recovery) {\n rememberPurchase(null);\n transition(\"ready\");\n }\n return false;\n }\n\n async function sendOrCheckPurchase(\n active: LockerverseAuctionPurchaseRecovery,\n statusOnly: boolean\n ) {\n if (statusOnly) {\n await checkPurchase(active);\n return;\n }\n if (!canSendPurchase()) {\n return;\n }\n const result = await client.createPurchase(\n auction.slug,\n item.id,\n active.submission\n );\n await resolvePurchase(result, active);\n }\n\n const checkoutPayment = stripe && elements && payment;\n\n function startSubmission() {\n if (busy.current || isTerminal) {\n return null;\n }\n if (!checkoutPayment) {\n showMessage(\"Payment details are still loading.\");\n return null;\n }\n const contact = recovery ? null : readContact();\n if (!(recovery || contact)) {\n return null;\n }\n return { checkoutPayment, contact, retryOriginal: state === \"retry\" };\n }\n\n async function submit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n const start = startSubmission();\n if (!start) {\n return;\n }\n const { contact, checkoutPayment: readyPayment, retryOriginal } = start;\n busy.current = true;\n outcomeReported.current = false;\n transition(\"busy\");\n showMessage(null);\n let requestSent = false;\n let activeRecovery = recovery;\n try {\n if (!activeRecovery) {\n const submission = await prepareSubmission(contact);\n if (!(submission && mounted.current)) {\n transition(\"ready\");\n return;\n }\n if (!isPurchase) {\n requestSent = true;\n await sendBid(submission);\n return;\n }\n activeRecovery = Object.freeze({\n auctionId: auction.id,\n item,\n itemId: item.id,\n payment: Object.freeze({ ...readyPayment }),\n pricing,\n submission: Object.freeze({\n ...submission,\n clientRequestId: getPurchaseRequestId(),\n paymentMethodTypes: Object.freeze([\"card\"] as const),\n quantity: selection.quantity,\n }),\n });\n rememberPurchase(activeRecovery);\n }\n requestSent = true;\n await sendOrCheckPurchase(\n activeRecovery,\n Boolean(recovery) && !retryOriginal\n );\n } catch (error) {\n await handleFailure(\n error,\n requestSent,\n activeRecovery,\n recovery !== null && !retryOriginal\n );\n } finally {\n busy.current = false;\n }\n }\n\n const buttonText = getSubmitLabel(state, recovery !== null, isPurchase);\n\n const locked = state !== \"ready\";\n return (\n <AuctionCheckoutView\n buttonText={buttonText}\n communityName={props.communityName ?? auction.name}\n contactErrors={contactErrors}\n email={email}\n id={id}\n includeServiceFee={selection.includeServiceFee}\n isPurchase={isPurchase}\n isTerminal={isTerminal}\n item={item}\n locked={locked}\n message={message}\n onBack={state === \"ready\" ? onBack : undefined}\n onBillingChange={setBilling}\n onEmailChange={(value) => {\n setEmail(value);\n props.onContactChange?.({\n email: value,\n phone: getInternationalPhone(phone, phoneCountry),\n });\n }}\n onIncludeServiceFeeChange={props.onIncludeServiceFeeChange}\n onPaymentLoadError={() => showMessage(\"Unable to load payment form.\")}\n onPhoneChange={({ value, country }) => {\n setPhone(value);\n setPhoneCountry(country);\n props.onContactChange?.({\n email,\n phone: getInternationalPhone(value, country),\n });\n }}\n onSameAsBillingChange={setSameAsBilling}\n onShippingChange={setShipping}\n onSubmit={submit}\n phone={phone}\n phoneCountry={phoneCountry}\n pricing={pricing}\n quantity={selection.quantity}\n sameAsBilling={sameAsBilling}\n serviceFeeCents={\n recovery\n ? pricing.serviceFeeCents\n : getAuctionSelectionPricing(auction, item, {\n ...selection,\n includeServiceFee: auction.serviceFeeEnabled,\n }).serviceFeeCents\n }\n serviceFeeEnabled={auction.serviceFeeEnabled}\n showFields={!(recovery || isTerminal)}\n submitDisabled={state === \"busy\" || !stripe || !elements}\n />\n );\n}\n","import type {\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuction,\n} from \"@lockerverse/sdk/auctions\";\nimport { Elements } from \"@stripe/react-stripe-js\";\nimport type {\n StripeElementsOptions,\n StripeElementsOptionsMode,\n} from \"@stripe/stripe-js\";\nimport { type RefObject, useEffect, useState } from \"react\";\nimport { AuctionCheckout } from \"./auction-checkout.tsx\";\nimport type { LockerverseAuctionItemProps } from \"./auction-item-types.ts\";\nimport {\n type AuctionSelection,\n getAuctionSelectionPricing,\n} from \"./auction-payment.ts\";\nimport type { LockerverseAuctionOutcome } from \"./auction-result.tsx\";\nimport { useStripeAppearance } from \"./stripe-appearance.ts\";\nimport { defaultLockerverseStripeLoader } from \"./stripe-loader.ts\";\n\nexport type AuctionPaymentProps = LockerverseAuctionItemProps & {\n appearanceRoot: RefObject<HTMLElement | null>;\n interactionLocked: boolean;\n item: AuctionItem;\n selection: AuctionSelection;\n onReview: (auction: LockerverseAuction, message: string) => void;\n onBack: () => void;\n contact: { email: string; phone: string };\n onContactChange: (contact: { email: string; phone: string }) => void;\n onIncludeServiceFeeChange: (value: boolean) => void;\n onInteractionLockChange: (locked: boolean) => void;\n onResult: (outcome: LockerverseAuctionOutcome) => void;\n};\n\nexport function AuctionPayment(props: AuctionPaymentProps) {\n const {\n auction,\n item,\n selection,\n theme = \"dark\",\n stripeLoader = defaultLockerverseStripeLoader,\n style,\n onBack,\n resumePurchase,\n } = props;\n const [stripe, setStripe] =\n useState<Awaited<ReturnType<typeof defaultLockerverseStripeLoader>>>(null);\n const [failed, setFailed] = useState(false);\n const [revision, setRevision] = useState(0);\n const appearance = useStripeAppearance(\n props.appearanceRoot,\n theme,\n style,\n props.interactionLocked\n );\n const payment = resumePurchase?.payment ?? auction.payment;\n useEffect(() => {\n let active = true;\n if (!payment) {\n setFailed(true);\n return;\n }\n Promise.resolve()\n .then(() =>\n stripeLoader(\n payment.publishableKey,\n payment.connectedAccountId\n ? { stripeAccount: payment.connectedAccountId }\n : undefined\n )\n )\n .then(\n (loaded) => {\n if (active) {\n setStripe(loaded);\n setFailed(!loaded);\n }\n },\n () => {\n if (active) {\n setFailed(true);\n }\n }\n );\n return () => {\n active = false;\n };\n }, [payment, stripeLoader, revision]);\n if (failed) {\n return (\n <div>\n <p role=\"alert\">Payment details could not load.</p>\n {resumePurchase ? null : (\n <button onClick={onBack} type=\"button\">\n Back to item\n </button>\n )}\n <button\n onClick={() => {\n setFailed(false);\n setStripe(null);\n setRevision((value) => value + 1);\n }}\n type=\"button\"\n >\n Try again\n </button>\n </div>\n );\n }\n if (!(stripe && appearance)) {\n return (\n <div>\n <p role=\"status\">Loading secure payment details…</p>\n {resumePurchase ? null : (\n <button onClick={onBack} type=\"button\">\n Back to item\n </button>\n )}\n </div>\n );\n }\n let paymentOptions: StripeElementsOptionsMode = {\n mode: \"setup\",\n };\n if (resumePurchase) {\n paymentOptions = {\n amount: resumePurchase.pricing.totalCents,\n currency: \"usd\",\n mode: \"payment\",\n };\n } else if (item.saleMode === \"buy_now\") {\n paymentOptions = {\n amount: getAuctionSelectionPricing(auction, item, selection).totalCents,\n currency: \"usd\",\n mode: \"payment\",\n };\n }\n const options: StripeElementsOptions = {\n ...paymentOptions,\n appearance,\n currency: \"usd\",\n paymentMethodTypes: [\"card\"],\n setupFutureUsage: \"off_session\" as const,\n syncAddressCheckbox: \"none\",\n };\n return (\n <Elements options={options} stripe={stripe}>\n <AuctionCheckout {...props} />\n </Elements>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./format-money.js";import{t}from"./host-callback.js";import{n,t as r}from"./accent-contrast.js";import{d as i,i as a,n as o,p as s,t as c,u as l}from"./phone-field.js";import{a as u,i as d,n as f,r as p,s as m}from"./custom-fields.js";import{t as h}from"./form-skeleton.js";import{t as g}from"./payment-summary.js";import{i as _,n as v,r as y,t as b}from"./stripe-loader.js";import{useCallback as x,useEffect as S,useId as ee,useLayoutEffect as C,useMemo as w,useReducer as T,useRef as E,useState as D}from"react";import{Fragment as O,jsx as k,jsxs as A}from"react/jsx-runtime";import{LockerverseSdkError as j,estimateLockerverseCheckout as M}from"@lockerverse/sdk/checkout";import{AddressElement as N,Elements as P,PaymentElement as F,useElements as I,useStripe as L}from"@stripe/react-stripe-js";import{array as R,literal as z,minLength as te,minValue as B,nonEmpty as ne,nullable as re,number as ie,object as V,optional as H,pipe as U,regex as W,safeInteger as ae,safeParse as oe,strictObject as se,string as G,trim as ce,union as le}from"valibot";function ue({ariaDescribedBy:e,ariaLabel:t,ariaLabelledBy:n,className:r,id:i,invalid:a=!1,name:o,onValueChange:s,options:c,value:l}){return k(`select`,{"aria-describedby":e,"aria-invalid":a||void 0,"aria-label":t,"aria-labelledby":n,className:[`lockerverse-form__control`,`lockerverse-form__select`,r].filter(Boolean).join(` `),id:i,name:o,onChange:e=>s(e.currentTarget.value),value:l,children:c.map(e=>k(`option`,{value:e.value,children:e.label},e.value))})}const de=[`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`],fe=[`15`,`12`,`10`,`5`],K=[...fe,`custom`];function pe({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=K.indexOf(t),r;switch(e.key){case`ArrowDown`:case`ArrowRight`:r=(n+1)%K.length;break;case`ArrowLeft`:case`ArrowUp`:r=(n-1+K.length)%K.length;break;case`Home`:r=0;break;case`End`:r=K.length-1;break;default:return}e.preventDefault();let i=K[r];i&&((e.currentTarget.closest(`[role="radiogroup"]`)?.querySelectorAll(`input[type="radio"]`))?.[r]?.focus(),a({tipPercent:i}))};return A(`div`,{className:`lockerverse-payment__tip-box`,children:[k(`p`,{children:`Add a tip to support the Lockerverse platform`}),A(`div`,{"aria-label":`Tip amount`,role:`radiogroup`,children:[fe.map(e=>A(`label`,{className:`lockerverse-payment__tip-choice`,children:[k(`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}),A(`span`,{children:[e,`%`]})]},e)),A(`label`,{className:`lockerverse-payment__tip-choice`,children:[k(`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`}),k(`span`,{children:`Other`})]})]}),i.tipPercent===`custom`?A(`label`,{children:[k(`span`,{children:`Custom tip`}),A(`span`,{className:`lockerverse-payment__money-input`,children:[k(`span`,{"aria-hidden":`true`,children:`$`}),k(`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?k(`span`,{className:`lockerverse-payment__field-message`,id:n,children:t}):null]}):k(`input`,{name:`tip`,type:`hidden`,value:i.tipPercent})]})}function q({checked:e,children:t,name:n,onChange:r}){let i=ee();return A(`label`,{className:`lockerverse-payment__check-row`,htmlFor:i,children:[k(l,{checked:e,id:i,name:n,onChange:e=>r(e.currentTarget.checked)}),k(`span`,{children:t})]})}function me({customFields:e,errors:t,fields:n,idPrefix:r,isPromoApplying:i,memberIdLabel:a,onChange:o,onApplyPromo:s,promoError:c,values:l}){let u=e=>o({...l,...e});return A(`div`,{className:`lockerverse-payment__additional-fields`,children:[n.memberId?A(`label`,{children:[k(`span`,{children:a?.trim()||`Member ID`}),k(`input`,{name:`memberId`,onChange:e=>u({memberId:e.currentTarget.value}),placeholder:`Optional`,value:l.memberId})]}):null,n.merchSize?A(`div`,{className:`lockerverse-payment__field`,children:[k(`span`,{id:`${r}-merch-size-label`,children:`Size`}),k(ue,{ariaLabelledBy:`${r}-merch-size-label`,name:`merchSize`,onValueChange:e=>{let t=de.find(t=>t===e);t&&u({merchSize:t})},options:de.map(e=>({label:e,value:e})),value:l.merchSize})]}):null,n.promoCode?A(`div`,{className:`lockerverse-payment__field`,children:[k(`span`,{id:`${r}-promo-code-label`,children:`Promo code`}),A(`div`,{className:`lockerverse-payment__promo-control`,children:[k(`input`,{"aria-describedby":c?`${r}-promo-code-error`:void 0,"aria-invalid":c?`true`:void 0,"aria-labelledby":`${r}-promo-code-label`,name:`promoCode`,onChange:e=>u({promoCode:e.currentTarget.value}),placeholder:`Optional`,value:l.promoCode}),k(`button`,{disabled:!l.promoCode.trim()||i,onClick:s,type:`button`,children:i?`Applying…`:`Apply`})]}),c?k(`p`,{className:`lockerverse-payment__field-message`,id:`${r}-promo-code-error`,role:`alert`,children:c}):null]}):null,k(f,{choiceClassName:`lockerverse-payment__check-row`,errorClassName:`lockerverse-payment__field-message`,errors:t,fields:e,idPrefix:r,onChange:e=>u({customFields:e}),values:l.customFields})]})}function J({amountCents:t,enabled:n,onChange:r,values:i}){return n?A(q,{checked:i.includeServiceFee,name:`includeServiceFee`,onChange:e=>r({...i,includeServiceFee:e}),children:[`Add `,e(t),` to help cover processing fees`]}):null}function Y(e){return{error:void 0,message:void 0,status:e?`recovering`:`editing`}}function X(e,t,n){return t.includes(e.status)?{...e,...n}:e}function he(e,t){if(t.type===`recovery_started`&&e.status===`unresolved`)return{...e,message:void 0,status:`recovering`};if(e.status===`sold_out`||e.status===`succeeded`||e.status===`unresolved`)return e;switch(t.type){case`field_changed`:return X(e,[`editing`,`invalid`,`refreshing_quote`],{error:void 0,status:`editing`});case`validation_failed`:return X(e,[`editing`],{status:`invalid`});case`quote_refresh_started`:return X(e,[`editing`,`invalid`],{status:`refreshing_quote`});case`quote_refresh_succeeded`:return X(e,[`refreshing_quote`],{error:void 0,status:`editing`});case`quote_refresh_failed`:return X(e,[`refreshing_quote`],{error:t.error??e.error,status:`editing`});case`submission_started`:return X(e,[`editing`,`invalid`,`refreshing_quote`],{error:void 0,status:`submitting`});case`submission_validation_failed`:return X(e,[`submitting`],{error:void 0,status:`invalid`});case`quote_changed`:return X(e,[`submitting`],{status:`editing`});case`retryable_failure`:return X(e,[`editing`,`invalid`,`submitting`],{error:t.error,status:`editing`});case`recovery_failed`:return X(e,[`recovering`],{error:t.error,retryUrl:void 0,status:`editing`});case`sold_out`:return{error:void 0,message:void 0,status:`sold_out`};case`succeeded`:return X(e,[`recovering`,`submitting`],{message:t.message,retryUrl:void 0,status:`succeeded`});case`unresolved`:return X(e,[`recovering`,`submitting`],{message:t.message,retryUrl:t.retryUrl,status:`unresolved`});default:return e}}function Z(e){return e.status===`editing`||e.status===`invalid`||e.status===`refreshing_quote`?e.error:void 0}function Q(e){return e.status===`sold_out`?`sold_out`:e.status===`succeeded`?`success`:e.status===`unresolved`?`unresolved`:e.status===`submitting`||e.status===`recovering`?`submitting`:e.status===`invalid`?`invalid`:Z(e)?`error`:`idle`}function ge(e){return e.status===`submitting`}const _e=[`amountCents`,`discountableSubtotalCents`,`discountCents`,`serviceFeeCents`,`subtotalCents`,`tipCents`,`totalCents`],ve=[`discountableSubtotalCents`,`discountCents`,`subtotalCents`];function ye(e,t,n,r){return(n===t.totalCents?ve:_e).some(n=>e[n]!==t[n])||r!==t.payment.connectedAccountId||e.authoritative&&(e.payment.connectedAccountId!==r||e.payment.currency!==t.payment.currency)||JSON.stringify(e.appliedDiscount)!==JSON.stringify(t.appliedDiscount)||JSON.stringify(e.lineItems)!==JSON.stringify(t.lineItems)}function be(e){if(e.checkoutStatus===`success`)return{kind:`success`,payment:e};if(e.checkoutStatus===`failed`)return{kind:`failed`,payment:e};let t={kind:`unresolved`,paymentReference:e.paymentReference,reason:e.checkoutStatus===`action_required`?`action_required`:`pending`};return e.retryUrl&&(t.retryUrl=e.retryUrl),t}async function xe(e,t,n){if(t.checkoutStatus!==`action_required`||!t.requiresAction)return be(t);if(!n)return{kind:`unresolved`,paymentReference:t.paymentReference,reason:`action_required`};if(t.clientSecret)try{await n.handleNextAction({clientSecret:t.clientSecret})}catch{}try{return be(await e.getPaymentStatus(t.paymentReference))}catch{return{kind:`unresolved`,paymentReference:t.paymentReference,reason:`action_required`}}}async function Se(e,t,n){let r;try{r=await e.submitPayment(t)}catch(n){if(!(n instanceof j&&n.recoveryRecommended))throw n;try{r=await e.getPaymentStatus(t.checkout.paymentReference)}catch{return{kind:`unresolved`,paymentReference:t.checkout.paymentReference,reason:`recovery_failed`}}}return xe(e,r,n)}async function Ce(e,t,n){try{return xe(e,await e.getPaymentStatus(t),n)}catch{return{kind:`unresolved`,paymentReference:t,reason:`recovery_failed`}}}const we=U(G(),ce(),ne()),Te=U(ie(),ae(),B(1)),Ee=U(R(le([se({amountCents:Te,productSlug:we}),se({productSlug:we,quantity:Te}),se({productSlug:we})])),te(1)),De=U(G(),ce(),W(/^(?:0|[1-9]\d*)(?:\.\d{1,2})?$/,`Enter a valid tip amount.`));function Oe(e){let t=oe(De,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 ke(e){let t=oe(Ee,e);return t.success?{success:!0,value:t.output}:{message:`Lockerverse payment configuration is invalid.`,success:!1}}const Ae=`This promo code is invalid or cannot be applied.`;function je(e,t){return t.tipPercent===`custom`?t.customTip.trim()?Oe(t.customTip):{cents:0,success:!0}:{cents:Math.round(e*Number(t.tipPercent)/100),success:!0}}function Me(e,t,n,r){let i={};return n&&(i.email=n),e.widget.fields.serviceFee&&(i.includeServiceFee=t.includeServiceFee),e.widget.fields.promoCode&&t.promoCode.trim()&&(i.promoCode=t.promoCode.trim()),e.widget.fields.tipping&&(i.tipCents=r),i}function Ne(e,t,n){let r=e.widget.fields.tipping?je(n.subtotalCents,t):{cents:0,success:!0};if(!r.success)return{parsedTip:r,totalCents:null};let i=e.widget.fields.serviceFee&&t.includeServiceFee?n.serviceFeeCents||Math.round(n.subtotalCents*e.pricingPolicy.serviceFeeRateBasisPoints/1e4):0;return{parsedTip:r,totalCents:n.totalCents-n.serviceFeeCents-n.tipCents+i+r.cents}}function Pe(e,t){return{displayedTotalCents:e.totalCents,promoError:t&&e.appliedDiscount?.source!==`promo_code`?Ae:void 0}}function Fe(e,t){let n;return t||(n=e instanceof Error?e.message:`The order total could not be updated.`),{paymentError:n,promoError:t?Ae:void 0}}function Ie(e,t){if(!e?.complete)throw Error(`${t} address is required.`);return e.value}function Le(e,t,n,r){if(e.widget.fields.shipping)return t.shippingMatchesBilling?n:Ie(r.shipping,`Shipping`)}function Re({billingAddress:e,catalog:t,email:n,phone:r,shippingAddress:i}){let a={payment_method_data:{billing_details:t.widget.fields.phone?{address:e.address,email:n,name:e.name,phone:r}:{address:e.address,email:n,name:e.name}}};return i?{...a,shipping:{address:i.address,name:i.name,phone:t.widget.fields.phone?r:i.phone??null}}:a}function ze({catalog:e,checkoutItems:t,confirmationToken:n,email:r,fieldValues:i,metadata:a,phone:o,shippingAddress:s}){let c={customFieldAnswers:p(u(e,t),i.customFields),email:r};if(n&&(c.confirmationToken=n,c.paymentMethodConfiguration=`explicit`),a&&(c.metadata=a),e.widget.fields.memberId&&i.memberId.trim()&&(c.memberId=i.memberId.trim()),e.widget.fields.merchSize&&(c.merchSize=i.merchSize),e.widget.fields.phone&&(c.phone=o),s){let e={city:s.address.city??``,country:s.address.country,line1:s.address.line1??``,postal_code:s.address.postal_code??``,state:s.address.state??``};s.address.line2&&(e.line2=s.address.line2),c.shipping={address:e,name:s.name}}return c}function Be(e){if(!e())throw Error(`Payment component is no longer active.`)}function Ve(e,n){t(e,n)}function He(e,t,n,r){return e.kind===`failed`?{kind:`payment_failed`,message:r}:e.kind===`unresolved`?{kind:`payment_unresolved`,paymentReference:e.paymentReference,reason:e.reason,retryUrl:e.retryUrl}:{email:n,kind:`payment`,payment:e.payment,quote:t}}async function Ue({addresses:e,catalog:t,checkoutItems:n,client:r,elements:i,email:a,fieldValues:o,isAttemptActive:s,locallyPreviewedTotalCents:c,metadata:l,onPaymentRecoveryChange:u,phone:d,quote:f,stripe:p,stripeConnectedAccountId:m}){let h=a.trim().toLowerCase(),g=y(d),_=je(f.subtotalCents,o);if(!_.success)throw Error(_.message);let v=await r.calculateTotal({...Me(t,o,h,_.cents),catalog:t,items:n});if(Be(s),v.totalCents>0&&ye(f,v,c,m))return{kind:`quote_changed`,quote:v};let b,x;if(v.totalCents===0)t.widget.fields.shipping&&(b=Le(t,o,Ie(e.billing,`Billing`),e));else{if(!(i&&p))throw Error(`Payment form is still loading.`);await i.update({amount:v.totalCents}),Be(s);let n=await i.submit();if(Be(s),n.error)throw Error(n.error.message);let r=Ie(e.billing,`Billing`);b=Le(t,o,r,e);let a=await p.createConfirmationToken({elements:i,params:Re({billingAddress:r,catalog:t,email:h,phone:g,shippingAddress:b})});if(Be(s),a.error)throw Error(a.error.message);x=a.confirmationToken.id}Ve(u,{connectedAccountId:v.payment.connectedAccountId,paymentReference:v.paymentReference});let S=await Se(r,{checkout:v,submission:ze({catalog:t,checkoutItems:n,confirmationToken:x,email:h,fieldValues:o,metadata:l,phone:g,shippingAddress:b})},p);return Be(s),He(S,v,h,v.totalCents===0?`Order could not be completed. Review the details and try again.`:`Payment was declined. Check your payment details and try again.`)}function We(e,n){t(e,n)}function Ge(e,n){t(e,n)}function Ke(e,t){return{...e,...t}}function qe(e){let t={message:e.reason===`action_required`?`Payment needs your attention. Keep this checkout open.`:`Payment is not complete. Check its status before you try again.`,type:`unresolved`};return e.retryUrl&&(t.retryUrl=e.retryUrl),t}function Je(e,t,n){return e.kind===`unresolved`&&e.reason===`action_required`&&!e.retryUrl&&!t&&!n}function Ye(e){return e instanceof j&&e.serverCode===`PAYMENT_WIDGET_SALES_LIMIT_REACHED`}function Xe({nextQuote:e,onQuoteChange:t,setDisplayedTotalCents:n,setPromoError:r,updateState:i,validatePromo:a}){let o=Pe(e,a);i({type:`quote_refresh_succeeded`}),n(o.displayedTotalCents),t(e),a&&r(o.promoError)}function Ze({error:e,setPromoError:t,updateState:n,validatePromo:r}){let i=Fe(e,r);r&&t(i.promoError),n(i.paymentError===void 0?{type:`quote_refresh_failed`}:{error:i.paymentError,type:`quote_refresh_failed`})}function Qe({onPaymentComplete:n,onPaymentRecoveryChange:r,onPaymentUncertain:i,onQuoteChange:a,result:o,setDisplayedTotalCents:s,dispatchState:c,unresolvedReferenceRef:l}){if(o.kind===`quote_changed`){let t=`The total changed to ${e(o.quote.totalCents)}. Review it and pay again.`;a(o.quote,t),s(o.quote.totalCents),c({type:`quote_changed`});return}if(o.kind===`payment_failed`){We(r,null),c({error:o.message,type:`retryable_failure`});return}if(o.kind===`payment_unresolved`){l.current=o.paymentReference,c(qe(o)),Ge(i,{paymentReference:o.paymentReference,reason:o.reason});return}a(o.quote),We(r,null),c({message:o.payment.paymentRequired?`Payment completed successfully.`:`Order confirmed. No payment was required.`,type:`succeeded`}),t(n,Ke(o.payment,{email:o.email,lineItems:o.quote.lineItems}))}function $e(e){let{catalog:n,checkoutItems:r,client:i,elements:o,email:s,fieldValues:c,metadata:l,onPaymentComplete:u,onResumePaymentFailed:d,onPaymentRecoveryChange:f,onPaymentUncertain:p,onQuoteChange:m,onStateChange:h,quote:g,resumePayment:v,stripe:y,stripeConnectedAccountId:b,stripeLoadFailed:ee,paymentState:C,updateState:w}=e,[T,O]=D(g.totalCents),[k,A]=D(),M=E(!1),N=E(void 0),P=E(0),F=E(0),I=x(e=>w(e,!0),[w]),L=x(()=>{let e=F.current+1;return F.current=e,()=>F.current===e},[]);S(()=>()=>{F.current+=1,P.current+=1},[]);let{parsedTip:R,totalCents:z}=Ne(n,c,g);S(()=>{z!==null&&(O(z),z>0&&o?.update({amount:z}))},[n.pricingPolicy.serviceFeeRateBasisPoints,n.widget.fields.serviceFee,o,c.includeServiceFee,z,g.serviceFeeCents,g.tipCents,g.totalCents,g.subtotalCents]),S(()=>{let e=v?.paymentReference??N.current;if(!e||M.current||C.status!==`recovering`)return;M.current=!0;let n=L();return h(Q(C)),Ce(i,e,y).then(e=>{if(n()&&!Je(e,y,ee)){if(e.kind===`failed`){We(f,null),d(),I({error:`The previous payment failed. Check your details and try again.`,type:`recovery_failed`});return}if(e.kind===`unresolved`){I(qe(e)),Ge(p,{paymentReference:e.paymentReference,reason:e.reason});return}We(f,null),I({message:e.payment.paymentRequired?`Payment completed successfully.`:`Order confirmed. No payment was required.`,type:`succeeded`}),t(u,Ke(e.payment,{email:null,lineItems:null}))}}),()=>{n()&&(F.current+=1),M.current=!1}},[i,u,d,f,p,h,v,y,ee,L,I,C]);let te=x((e=!1,t=!1)=>{t||(P.current+=1),e&&A(void 0),w({type:`field_changed`})},[w]);async function B(e=!1,t=!1){let a=s.trim().toLowerCase(),o=_({email:a,phone:``},!1);if(!(R.success&&(o.value||e)))return;P.current+=1;let l=P.current;w({type:`quote_refresh_started`});try{let e=await i.calculateTotal({...Me(n,c,o.value?.email??``,R.cents),catalog:n,items:r});if(l!==P.current)return;Xe({nextQuote:e,onQuoteChange:m,setDisplayedTotalCents:O,setPromoError:A,updateState:w,validatePromo:t})}catch(e){if(l!==P.current)return;if(Ye(e)){w({type:`sold_out`});return}Ze({error:e,setPromoError:A,updateState:w,validatePromo:t})}}async function ne(){A(void 0),await B(!0,!0)}async function re({addresses:e,phone:t}){I({type:`submission_started`});let d=L();try{let a=await Ue({addresses:e,catalog:n,checkoutItems:r,client:i,elements:o,email:s,fieldValues:c,isAttemptActive:d,locallyPreviewedTotalCents:T,metadata:l,onPaymentRecoveryChange:f,phone:t,quote:g,stripe:y,stripeConnectedAccountId:b});if(!d())return;Qe({dispatchState:I,onPaymentComplete:u,onPaymentRecoveryChange:f,onPaymentUncertain:p,onQuoteChange:m,result:a,setDisplayedTotalCents:O,unresolvedReferenceRef:N})}catch(e){if(!d())return;if(We(f,null),Ye(e)){I({type:`sold_out`});return}let t=e instanceof j?a(e.serverCode):void 0;if(t)return I({type:`submission_validation_failed`}),{phoneError:t};I({error:e instanceof Error?e.message:`Payment could not be completed.`,type:`retryable_failure`})}}let ie=C.status===`succeeded`||C.status===`unresolved`?C.message:void 0;return{commands:{applyPromo:ne,checkPaymentStatus:()=>I({type:`recovery_started`}),fieldChanged:te,refreshAuthoritativeTotal:B,reportValidationFailure:()=>I({type:`validation_failed`}),submit:re},state:{displayedTotalCents:T,isRecovering:C.status===`recovering`,isRefreshingQuote:C.status===`refreshing_quote`,isSubmitting:ge(C),isUnresolved:C.status===`unresolved`,parsedTip:R,paymentError:Z(C),promoError:k,retryUrl:C.retryUrl,terminalMessage:ie}}}const et=b;function tt(e){let{connectedAccountId:t,publishableKey:n}=e.payment;return et(n,t?{stripeAccount:t}:void 0)}function nt(e){return e===`monthly`?{interval:`month`,label:`Monthly`}:e===`annually`?{interval:`year`,label:`Annual`}:e===`every-six-months`?{interval:`6 months`,label:`Every 6 months`}:null}function rt(e,t,n){if(n){let{connectedAccountId:e}=n;return e}if(`payment`in t){let{connectedAccountId:e}=t.payment;return e}let{connectedAccountId:r}=e.payment;return r}function it({accentColor:e,catalog:t,checkoutItems:n,client:r,appearanceRoot:i,initialCustomFieldValues:a,metadata:o,onPaymentComplete:s,onResumePaymentFailed:c,onPaymentRecoveryChange:l,onPaymentUncertain:u,onQuoteChange:d,quote:f,resumePayment:p,onStateChange:m,stripeLoader:g,theme:_,visualStyle:y}){let[b,ee]=D(()=>Y(!!p)),C=E(b);C.current=b;let T=x((e,t=!1)=>{let n=he(C.current,e);n!==C.current&&(C.current=n,ee(n),t&&m(Q(n)))},[m]),O=rt(t,f,p),A=E({connectedAccountId:O,paymentOption:f.paymentOption});b.status!==`submitting`&&b.status!==`recovering`&&(A.current={connectedAccountId:O,paymentOption:f.paymentOption});let{connectedAccountId:j,paymentOption:M}=A.current,N=w(()=>g(t.payment.publishableKey,j?{stripeAccount:j}:void 0).catch(()=>null),[t.payment.publishableKey,j,g]),[F,I]=D(!1);S(()=>{let e=!0;return I(!1),N.then(t=>{e&&t===null&&I(!0)}),()=>{e=!1}},[N]);let L=v(i,_,y,b.status===`submitting`||b.status===`recovering`,e);return L?k(P,{options:{amount:Math.max(f.totalCents,100),appearance:L,currency:t.payment.currency,mode:M===`one-time`?`payment`:`subscription`,paymentMethodTypes:t.community?.widgetAchEnabled?[`card`,`link`,`us_bank_account`]:[`card`,`link`],syncAddressCheckbox:`none`},stripe:N,children:k(_t,{catalog:t,checkoutItems:n,client:r,initialCustomFieldValues:a,metadata:o,onPaymentComplete:s,onPaymentRecoveryChange:l,onPaymentUncertain:u,onQuoteChange:d,onResumePaymentFailed:c,onStateChange:m,paymentState:b,quote:f,resumePayment:p,stripeConnectedAccountId:j,stripeLoadFailed:F,updateState:T})},`${t.payment.publishableKey}:${j??`platform`}:${M}`):k(h,{fieldCount:3,label:`Loading payment form`})}function at({label:e}){return A(`div`,{className:`lockerverse-payment__stripe-loader`,role:`status`,children:[k(`p`,{children:e}),A(`div`,{"aria-hidden":`true`,children:[k(`span`,{}),k(`span`,{}),k(`span`,{})]})]})}function ot({onError:e,onReady:t,ready:n}){return A(`div`,{className:`lockerverse-payment__stripe-element`,"data-ready":n,children:[n?null:k(at,{label:`Loading payment form...`}),k(`div`,{className:`lockerverse-payment__stripe-mount`,children:k(F,{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:`auto`},wallets:{applePay:`auto`,googlePay:`never`}}})})]})}function st({label:e,mode:t,onChange:n,onError:r,onReady:i,ready:a}){return A(`div`,{className:`lockerverse-payment__address`,children:[k(`h2`,{children:e}),A(`div`,{className:`lockerverse-payment__stripe-element lockerverse-payment__stripe-element--address`,"data-ready":a,children:[a?null:k(at,{label:`Loading ${e.toLowerCase()}...`}),k(`div`,{className:`lockerverse-payment__stripe-mount`,children:k(N,{onChange:n,onLoadError:({error:t})=>r(t.message??`${e} failed to load.`),onReady:i,options:{autocomplete:{mode:`automatic`},mode:t}})})]})]})}function ct({message:e}){return e?k(`p`,{className:`lockerverse-payment__field-message`,role:`alert`,children:e}):null}function lt({catalog:e,displayedTotalCents:t,fieldValues:n,isBillingAddressReady:r,isPaymentReady:i,isShippingAddressReady:a,onAddressChange:o,onFieldValuesChange:s,onStripeLoadError:c,setIsBillingAddressReady:l,setIsPaymentReady:u,setIsShippingAddressReady:d}){let f=t>0;return A(O,{children:[f?k(ot,{onError:c,onReady:()=>u(!0),ready:i}):null,f||e.widget.fields.shipping?k(st,{label:f?`Billing address`:`Shipping address`,mode:`billing`,onChange:e=>o(`billing`,e),onError:c,onReady:()=>l(!0),ready:r}):null,e.widget.fields.shipping?A(`div`,{className:`lockerverse-payment__shipping`,children:[k(q,{checked:n.shippingMatchesBilling,name:`shippingMatchesBilling`,onChange:e=>{s({...n,shippingMatchesBilling:e}),e?o(`shipping`,null):d(!1)},children:`Shipping is same as billing information`}),n.shippingMatchesBilling?null:k(st,{label:`Shipping address`,mode:`shipping`,onChange:e=>o(`shipping`,e),onError:c,onReady:()=>d(!0),ready:a})]}):null]})}function ut({catalog:t,displayedTotalCents:n,fieldValues:r,isBillingAddressReady:i,isPaymentReady:a,isRequiredShippingReady:o,isSubmitting:s,onFieldValuesChange:c,quote:l}){let u=n===0,d=u?!t.widget.fields.shipping||i&&o:a&&i&&o,f=nt(l.paymentOption),p=u?`Complete order`:`Pay ${e(n)}`;!u&&f&&(p=`Subscribe for ${e(n)}/${f.interval}`),s&&(p=u?`Completing…`:`Processing…`);let m=`Process payment for ${e(n)} total`;return u?m=`Complete order`:f&&(m=`Start ${f.label.toLowerCase()} subscription for ${e(n)}`),A(`div`,{className:`lockerverse-payment__actions`,children:[k(J,{amountCents:l.serviceFeeCents||Math.round(l.subtotalCents*t.pricingPolicy.serviceFeeRateBasisPoints/1e4),enabled:t.widget.fields.serviceFee,onChange:c,values:r}),k(`button`,{"aria-busy":s,"aria-label":m,disabled:s||!d,type:`submit`,children:p})]})}function dt(e,t){let n=e.elements.namedItem(t);if(n instanceof HTMLElement){n.focus();return}n instanceof RadioNodeList&&Array.from(n).find(e=>e instanceof HTMLElement)?.focus()}function ft({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&&dt(n,`custom:${o}`)}function pt(t){let n=t.appliedDiscount;if(n?.source!==`email_list`)return;let r=n.percentageOff===void 0?e(t.discountCents):`${n.percentageOff}%`;return n.message??`Your email qualifies for ${r} off.`}function mt({email:e,emailDiscountMessage:t,emailErrorId:n,emailId:r,emailRef:a,errors:o,onEmailBlur:l,onEmailChange:u,onPhoneChange:d,phone:f,phoneCountry:p,phoneEnabled:m,phoneErrorId:h,phoneId:g,phoneRef:_}){return A(`div`,{className:`lockerverse-payment__contact`,children:[k(i,{error:o.email,errorId:n,id:r,label:`Email`,name:`email`,onBlur:l,onChange:e=>u(e.currentTarget.value),ref:a,required:!0,value:e}),t===void 0?null:k(`p`,{className:`lockerverse-payment__discount-message`,role:`status`,children:t}),m?k(s,{error:o.phone,errorId:h,id:g,label:`Phone`,children:k(c,{country:p,error:o.phone,errorId:h,id:g,inputRef:_,name:`phone`,onChange:d,required:!0,value:f})}):null]})}function ht({message:e}){return e?A(`div`,{className:`lockerverse-payment__actions`,children:[k(`p`,{className:`lockerverse-payment__field-message`,role:`alert`,children:e}),k(`button`,{className:`lockerverse-payment__status-check`,onClick:()=>window.location.reload(),type:`button`,children:`Reload checkout`})]}):null}function gt({paymentRequired:e,shippingRequired:t,isPaymentReady:n,isBillingAddressReady:r,isRequiredShippingReady:i,isSubmitting:a,scriptFailed:o,elementError:s,clearElementError:c}){let[l,u]=D(!1),d=e||t,f=(!e||n)&&(!d||r)&&i;if(S(()=>{if(u(!1),f&&c(void 0),!d||f||a)return;let e=window.setTimeout(()=>u(!0),3e4);return()=>window.clearTimeout(e)},[d,f,a,c]),!(!d||f||a)){if(o||s)return`The secure checkout fields could not load. Check your connection, then reload the checkout.`;if(l)return`The secure checkout fields are taking longer than expected. You can wait or reload the checkout.`}}function _t({catalog:e,checkoutItems:t,client:n,initialCustomFieldValues:r,metadata:i,onPaymentComplete:a,onResumePaymentFailed:s,onPaymentRecoveryChange:c,onPaymentUncertain:l,onQuoteChange:f,onStateChange:p,quote:h,resumePayment:v,stripeConnectedAccountId:y,stripeLoadFailed:b,paymentState:x,updateState:C}){let w=u(e,t),[T,j]=D(``),[M,N]=D(``),[P,F]=D(`US`),[R,z]=D({}),[te,B]=D({}),[ne,re]=D(),[ie,V]=D(),[H,U]=D(!1),[W,ae]=D(!1),[oe,se]=D(!1),[G,ce]=D(()=>({customFields:d(w,r),customTip:``,includeServiceFee:e.widget.fields.serviceFee,memberId:``,merchSize:`M`,promoCode:``,shippingMatchesBilling:!0,tipPercent:`10`})),le=E({billing:null,shipping:null}),ue=E(null),de=E(null),fe=E(null),K=E(h.totalCents>0),q=$e({catalog:e,checkoutItems:t,client:n,elements:I(),email:T,fieldValues:G,metadata:i,onPaymentComplete:a,onPaymentRecoveryChange:c,onPaymentUncertain:l,onQuoteChange:f,onResumePaymentFailed:s,onStateChange:p,paymentState:x,quote:h,resumePayment:v,stripe:L(),stripeConnectedAccountId:y,stripeLoadFailed:b,updateState:C}),{displayedTotalCents:J,isRecovering:Y,isUnresolved:X,isRefreshingQuote:he,isSubmitting:Z,parsedTip:Q,paymentError:ge,promoError:_e,terminalMessage:ve,retryUrl:ye}=q.state,be=`lockerverse-${ee()}`,xe=`${be}-email`,Se=`${xe}-error`,Ce=`${be}-phone`,we=`${Ce}-error`,Te=`${be}-tip-error`,Ee=(Q.success?Q.cents:null)??0,De=J-Ee,Oe=!e.widget.fields.shipping||G.shippingMatchesBilling||oe,ke=gt({clearElementError:V,elementError:ie,isBillingAddressReady:W,isPaymentReady:H,isRequiredShippingReady:Oe,isSubmitting:Z,paymentRequired:J>0,scriptFailed:b,shippingRequired:e.widget.fields.shipping});S(()=>{Z&&fe.current?.focus({preventScroll:!0})},[Z]),S(()=>{Z||R.email||!R.phone||de.current?.focus()},[R.email,R.phone,Z]),S(()=>{let e=J>0;e&&!K.current&&(U(!1),ae(!1)),K.current=e},[J]);function Ae(e){q.commands.fieldChanged(!1,e!==`email`),z(t=>{let n={...t};return delete n[e],n})}function je(e){let t=e.promoCode!==G.promoCode,n=e.includeServiceFee!==G.includeServiceFee;q.commands.fieldChanged(t,!(t||n)),ce(e),B({}),re(void 0)}async function Me(t){t.preventDefault();let n=e.widget.fields.phone?o(M,P):``,r=_({email:T,phone:n},e.widget.fields.phone),i=m(w,G.customFields);if(!(r.value&&Q.success)||Object.keys(i).length>0){z(r.errors),B(i),re(Q.success?void 0:Q.message),q.commands.reportValidationFailure();let e=t.currentTarget;queueMicrotask(()=>{ft({customFieldErrors:i,emailRef:ue,form:e,parsedTipSuccess:Q.success,phoneRef:de,validationErrors:r.errors})});return}z({}),B({});let a=await q.commands.submit({addresses:le.current,phone:n});a?.phoneError&&z({phone:a.phoneError})}return ve||Y?A(`div`,{className:`lockerverse-payment__actions`,children:[A(`p`,{className:`lockerverse-payment__payment-status`,ref:fe,role:`status`,tabIndex:-1,children:[Y?`Recovering payment…`:ve,ye?A(O,{children:[` `,k(`a`,{href:ye,rel:`noopener noreferrer`,target:`_blank`,children:`Complete payment`})]}):null]}),X||Y?k(`button`,{"aria-busy":Y,className:`lockerverse-payment__status-check`,disabled:Y,onClick:q.commands.checkPaymentStatus,type:`button`,children:Y?`Checking payment status…`:`Check payment status`}):null]}):A(`form`,{"aria-busy":Z,className:`lockerverse-payment__form`,noValidate:!0,onSubmit:Me,children:[k(`div`,{"data-lockerverse-input-region":``,inert:Z?!0:void 0,children:A(`fieldset`,{className:`lockerverse-payment__input-fieldset`,disabled:Z,children:[k(g,{displayedBaseCents:De,displayedTipCents:Ee,displayedTotalCents:J,quote:h}),k(pe,{enabled:e.widget.fields.tipping,error:ne,errorId:Te,onChange:je,values:G}),k(mt,{email:T,emailDiscountMessage:pt(h),emailErrorId:Se,emailId:xe,emailRef:ue,errors:R,onEmailBlur:()=>q.commands.refreshAuthoritativeTotal(),onEmailChange:e=>{j(e),Ae(`email`)},onPhoneChange:({value:e,country:t})=>{N(e),F(t),Ae(`phone`)},phone:M,phoneCountry:P,phoneEnabled:e.widget.fields.phone,phoneErrorId:we,phoneId:Ce,phoneRef:de}),k(ht,{message:ke}),k(lt,{catalog:e,displayedTotalCents:J,fieldValues:G,isBillingAddressReady:W,isPaymentReady:H,isShippingAddressReady:oe,onAddressChange:(e,t)=>{le.current[e]=t},onFieldValuesChange:je,onStripeLoadError:V,setIsBillingAddressReady:ae,setIsPaymentReady:U,setIsShippingAddressReady:se}),k(me,{customFields:w,errors:te,fields:e.widget.fields,idPrefix:be,isPromoApplying:he,memberIdLabel:e.community?.memberIdLabel,onApplyPromo:q.commands.applyPromo,onChange:je,promoError:_e,values:G}),k(ut,{catalog:e,displayedTotalCents:J,fieldValues:G,isBillingAddressReady:W,isPaymentReady:H,isRequiredShippingReady:Oe,isSubmitting:Z,onFieldValuesChange:je,quote:h})]})}),Z?k(`p`,{className:`lockerverse-payment__sr-only`,ref:fe,role:`status`,tabIndex:-1,children:J===0?`Completing order…`:`Processing payment…`}):null,k(ct,{message:ge})]})}function vt(){return k(h,{fieldCount:2,label:`Loading payment…`,sectionCount:2,showCheckbox:!0})}function yt(e,t){switch(t.type){case`loading`:return{phase:`loading`,revision:e.revision};case`ready`:return St(t.displayedQuote,e.revision+1);case`error`:return{failure:t.failure,phase:`error`,revision:e.revision};case`checkout`:return e.phase===`ready`?{...e,displayedQuote:t.checkout,quoteFailure:void 0}:e;case`quote-error`:return e.phase===`ready`?{...e,quoteFailure:t.failure}:e;default:return e}}function $(e,t,n){return e?.catalog===t&&e.selectionKey===n}function bt({checkout:e}){return{displayedQuote:e,type:`ready`}}function xt(e){return e instanceof Error?e.message:`Lockerverse payment could not load.`}function St(e,t){return{checkoutItems:[...e.items],displayedQuote:e,phase:`ready`,quoteFailure:void 0,revision:t}}function Ct(e,t){let n=e.widget.fields.serviceFee;return M(e,{includeServiceFee:n,selection:t})}function wt(e,t){try{return St(Ct(e,t),1)}catch(e){return{failure:xt(e),phase:`error`,revision:0}}}function Tt({catalog:e,client:t,paymentState:n,selection:r}){let i=ke(r),a=i.success?JSON.stringify(i.value):`invalid-selection`,o=w(()=>i.success?i.value:[],[i.success,a]),[s,c]=T(yt,void 0,()=>i.success?wt(e,o):{phase:`loading`,revision:0}),l=E(void 0),u=E(0),d=E(s.phase===`ready`?{catalog:e,selectionKey:a}:void 0),f=E(s.phase===`error`?{catalog:e,selectionKey:a}:void 0),p=n===`submitting`||n===`success`||n===`unresolved`;S(()=>{if(!i.success||p||$(f.current,e,a)||$(l.current,e,a))return;let n=!0;l.current={catalog:e,selectionKey:a};let r=$(d.current,e,a);r||c({type:`loading`});function s(e){n&&c(e)}function m(){n&&(l.current=void 0,f.current={catalog:e,selectionKey:a})}let h;function g(t){if(!n||(l.current=void 0,f.current={catalog:e,selectionKey:a},r&&h!==void 0&&u.current!==h))return;let i=xt(t);if(i===`This option is sold out.`){c({failure:i,type:`error`});return}c(r?{failure:i,type:`quote-error`}:{failure:i,type:`error`})}async function _(){try{h=u.current;let n=e.widget.fields.serviceFee;if(!r){let t=Ct(e,o);r=!0,d.current={catalog:e,selectionKey:a},s(bt({checkout:t}))}let i=await t.calculateTotal({catalog:e,includeServiceFee:n,selection:o});m(),u.current===h&&s({checkout:i,type:`checkout`})}catch(e){g(e)}}return _(),()=>{n=!1,$(l.current,e,a)&&(l.current=void 0)}},[e,t,i.success,p,a,o]);let m=$(d.current,e,a)||$(f.current,e,a)||$(l.current,e,a),h=p||m?s:{phase:`loading`,revision:s.revision};return{selectionError:i.success?void 0:i.message,session:h,updateCheckout:e=>{u.current+=1,c({checkout:e,type:`checkout`})}}}const Et=V({recovery:V({connectedAccountId:re(G()),paymentReference:U(G(),ce(),ne())}),selectionFingerprint:G(),version:le([z(1),z(2)]),widgetId:H(G())});function Dt(e){let t=ke(e);return t.success?JSON.stringify(t.value.map(e=>{let t=e.productSlug.trim();return`quantity`in e?[`quantity`,t,e.quantity]:`amountCents`in e?[`amount`,t,e.amountCents]:[`product`,t]})):null}const Ot=`A previous payment uses different checkout details. Return to its original checkout to check the payment before you pay again.`;function kt(e,t,n){let r;try{r=window.sessionStorage.getItem(e)}catch{return{recovery:null}}if(!r)return{recovery:null};try{let e=oe(Et,JSON.parse(r));if(!e.success)throw Error(`Invalid recovery record`);let i=e.output;return i.selectionFingerprint!==t||i.version===2&&i.widgetId!==n?{error:Ot,recovery:null}:{recovery:{connectedAccountId:i.recovery.connectedAccountId,paymentReference:i.recovery.paymentReference}}}catch{return{error:`The saved payment could not be read. Contact support to check it before you pay again.`,recovery:null}}}function At({selection:e,storageKey:t,widgetId:n}){let r=Dt(e),i=JSON.stringify([t,r,n]),[a,o]=D(null),s=E(null);S(()=>{if(!t)return;let e=s.current,a={recovery:null};e?.recovery?a=e.identity===i?{recovery:e.recovery}:{error:Ot,recovery:null}:r!==null&&(a=kt(t,r,n)),a.recovery&&(s.current={identity:i,recovery:a.recovery}),o({identity:i,...a})},[r,i,t,n]);let c=x(e=>{if(!(!t||r===null)){s.current=e?{identity:i,recovery:e}:null;try{e?window.sessionStorage.setItem(t,JSON.stringify({recovery:e,selectionFingerprint:r,version:2,widgetId:n})):window.sessionStorage.removeItem(t)}catch{}}},[r,i,t,n]);return{error:t&&a?.identity===i?a.error:void 0,ready:!t||a?.identity===i,recovery:t&&a?.identity===i?a.recovery:null,remember:c}}const jt={annually:`/year`,"every-six-months":` every 6 months`,monthly:`/month`,"one-time":``};function Mt({branding:e,catalog:t}){return A(`header`,{children:[t.widget.showCommunityBranding&&e?A(`div`,{className:`lockerverse-payment__branding`,children:[e.imageUrl?k(`img`,{alt:e.name,height:`48`,src:e.imageUrl,width:`48`}):null,k(`strong`,{children:e.name})]}):null,k(`h1`,{children:t.widget.title??t.widget.name}),t.widget.description?k(`p`,{children:t.widget.description}):null]})}function Nt({catalog:t,selection:n}){let r=n?.length?t.products.filter(e=>n.some(t=>t.productSlug===e.slug)):t.products.filter(e=>e.id!==t.widget.requiredShipping?.productId);return r.length===0?null:A(`div`,{className:`lockerverse-payment__payment-summary`,children:[k(`h2`,{children:`Products`}),k(`div`,{className:`lockerverse-payment__payment-summary-items`,children:r.map(t=>{let n=t.pricingMode===`fixed`?t.amountCents:t.minimumAmountCents,r=jt[t.paymentOption];return A(`div`,{className:`lockerverse-payment__payment-summary-row`,children:[k(`span`,{children:t.name}),k(`strong`,{children:n===null?`Choose amount`:`${t.pricingMode===`custom`?`From `:``}${e(n)}${r}`})]},t.id)})}),k(`p`,{children:`Base prices. Final total is checked at checkout.`})]})}function Pt(e,t){let i=n(e?.[`--lockerverse-accent`]??t?.accentColor??`#38d77a`),a=r(i),o={...e};return(e?.[`--lockerverse-accent`]!==void 0||t?.accentColor)&&(o[`--lockerverse-accent`]=i),a&&e?.[`--lockerverse-accent-contrast`]===void 0&&(o[`--lockerverse-accent-contrast`]=a),{accent:i,rootStyle:o}}function Ft({catalog:e,client:n,loadError:r,onRetry:i,...a}){let{branding:o,className:s,completionView:c,recoveryStorageKey:l,initialCustomFieldValues:u,metadata:d,onPaymentComplete:f,onPaymentRecoveryChange:p,onPaymentUncertain:m,resumePayment:h,selection:g,style:_,stripeLoader:v=et,theme:y=`dark`,...b}=a,[ee,w]=D(h),T=E(null),[O,j]=D(null),M=x(e=>{j(e),t(f,e)},[f]),[N,P]=D(),[F,I]=D(`idle`),L=E(void 0),{selectionError:R,session:z,updateCheckout:te}=Tt({catalog:e,client:n,paymentState:F,selection:g}),B=z.phase===`ready`?z.revision:void 0,ne=x(e=>{B!==void 0&&(L.current=B),I(e)},[B]),re=x(e=>p?.(e),[p]),ie=x(()=>{w(void 0)},[]);S(()=>{z.phase===`loading`&&P(void 0)},[z.phase]),C(()=>{z.phase===`ready`&&L.current!==z.revision&&I(e=>e===`success`||e===`unresolved`?e:`idle`)},[z.phase,z.revision]);let V=[`lockerverse-payment`,s].filter(Boolean).join(` `),H=o??e.community,{accent:U,rootStyle:W}=Pt(_,H);return O&&c===`summary`?k(`section`,{...b,className:V,"data-lockerverse-theme":y,"data-payment-state":`success`,style:W,children:A(`div`,{className:`lockerverse-payment__completion`,role:`status`,children:[k(`span`,{"aria-hidden":`true`,className:`lockerverse-payment__completion-icon`,children:k(`svg`,{"aria-hidden":`true`,fill:`none`,height:`28`,stroke:`currentColor`,strokeWidth:`2`,viewBox:`0 0 24 24`,width:`28`,children:k(`path`,{d:`m5 12 4 4L19 6`})})}),k(`h1`,{children:O.paymentRequired?`Thank you`:`Order confirmed`}),k(`p`,{children:O.paymentRequired?`Your payment has been received.`:`Your order is confirmed. No payment was required.`})]})}):R?k(`section`,{...b,className:V,"data-lockerverse-theme":y,role:`alert`,style:W,children:R}):z.phase===`error`&&z.failure===`This option is sold out.`||F===`sold_out`?A(`section`,{...b,className:V,"data-lockerverse-theme":y,role:`alert`,style:W,children:[k(`h1`,{children:`Sold out`}),k(`p`,{children:`This option is sold out.`})]}):z.phase===`error`?k(`section`,{...b,className:V,"data-lockerverse-theme":y,style:W,children:k(`p`,{role:`alert`,children:z.failure})}):z.phase===`ready`?A(`section`,{...b,"aria-label":`Payment`,className:V,"data-lockerverse-theme":y,"data-payment-state":F,ref:T,style:W,children:[k(Mt,{branding:H,catalog:e}),r?A(`div`,{role:`alert`,children:[k(`p`,{children:r.message}),k(`button`,{onClick:i,type:`button`,children:`Retry`})]}):null,N?k(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:N}):null,z.quoteFailure?A(`div`,{className:`lockerverse-payment__payment-status`,role:`alert`,children:[k(`span`,{children:z.quoteFailure}),k(`span`,{children:` The final total will be checked when you submit.`})]}):null,k(it,{accentColor:U,appearanceRoot:T,catalog:e,checkoutItems:z.checkoutItems,client:n,initialCustomFieldValues:u,metadata:d,onPaymentComplete:M,onPaymentRecoveryChange:re,onPaymentUncertain:m,onQuoteChange:(e,t)=>{P(t),te(e)},onResumePaymentFailed:ie,onStateChange:ne,quote:z.displayedQuote,resumePayment:ee,stripeLoader:v,theme:y,visualStyle:W},z.revision)]}):A(`section`,{...b,"aria-busy":`true`,"aria-label":`Payment`,className:V,"data-lockerverse-theme":y,style:W,children:[k(Mt,{branding:H,catalog:e}),r?A(`div`,{role:`alert`,children:[k(`p`,{children:r.message}),k(`button`,{onClick:i,type:`button`,children:`Retry`})]}):null,k(vt,{})]})}function It({children:e,loading:t=!1,viewProps:i}){let{branding:a,className:o,completionView:s,recoveryStorageKey:c,initialCustomFieldValues:l,metadata:u,onPaymentComplete:d,onPaymentRecoveryChange:f,onPaymentUncertain:p,resumePayment:m,selection:h,stripeLoader:g,style:_,theme:v=`dark`,...y}=i,b=n(_?.[`--lockerverse-accent`]??a?.accentColor??`#38d77a`),x=r(b),S={..._};return(_?.[`--lockerverse-accent`]!==void 0||a?.accentColor)&&(S[`--lockerverse-accent`]=b),x&&_?.[`--lockerverse-accent-contrast`]===void 0&&(S[`--lockerverse-accent-contrast`]=x),k(`section`,{...y,...t?{"aria-busy":!0,"aria-label":`Payment`}:{},className:[`lockerverse-payment`,o].filter(Boolean).join(` `),"data-lockerverse-theme":v,style:S,children:e})}function Lt(e){let{catalog:n,client:r,loadError:i,onRetry:a,...o}=e,{onPaymentRecoveryChange:s,recoveryStorageKey:c,resumePayment:l,selection:u}=o,d=At({selection:u,storageKey:c,widgetId:n.widget.id}),f=x(e=>{d.remember(e),t(s,e)},[s,d.remember]);return!d.ready||d.error?k(It,{loading:!d.ready,viewProps:o,children:d.error?k(`p`,{role:`alert`,children:d.error}):k(vt,{})}):k(Ft,{...e,onPaymentRecoveryChange:f,resumePayment:l??d.recovery})}function Rt({widget:e,...t}){return e.error&&!e.catalog?A(It,{viewProps:t,children:[k(`p`,{role:`alert`,children:e.error.message}),k(`button`,{onClick:e.refresh,type:`button`,children:`Retry`})]}):e.loading?A(It,{loading:!0,viewProps:t,children:[e.catalog?A(O,{children:[k(Mt,{branding:t.branding??e.catalog.community,catalog:e.catalog}),k(Nt,{catalog:e.catalog,selection:t.selection})]}):null,k(vt,{})]}):e.catalog?k(Lt,{catalog:e.catalog,client:e.client,loadError:e.error,onRetry:e.refresh,...t}):k(It,{loading:!0,viewProps:t,children:k(vt,{})})}export{tt as n,Rt as t};
1
+ import{t as e}from"./format-money.js";import{t}from"./host-callback.js";import{n,t as r}from"./accent-contrast.js";import{d as i,i as a,n as o,p as s,t as c,u as l}from"./phone-field.js";import{a as u,i as d,n as f,r as p,s as m}from"./custom-fields.js";import{t as h}from"./form-skeleton.js";import{t as g}from"./payment-summary.js";import{i as _,n as v,r as y,t as b}from"./stripe-loader.js";import{useCallback as x,useEffect as S,useId as ee,useLayoutEffect as C,useMemo as w,useReducer as T,useRef as E,useState as D}from"react";import{Fragment as O,jsx as k,jsxs as A}from"react/jsx-runtime";import{LockerverseSdkError as j,estimateLockerverseCheckout as M}from"@lockerverse/sdk/checkout";import{AddressElement as N,Elements as P,PaymentElement as F,useElements as I,useStripe as L}from"@stripe/react-stripe-js";import{array as R,literal as z,minLength as te,minValue as B,nonEmpty as ne,nullable as re,number as ie,object as V,optional as H,pipe as U,regex as W,safeInteger as ae,safeParse as oe,strictObject as se,string as G,trim as ce,union as le}from"valibot";function ue({ariaDescribedBy:e,ariaLabel:t,ariaLabelledBy:n,className:r,id:i,invalid:a=!1,name:o,onValueChange:s,options:c,value:l}){return k(`select`,{"aria-describedby":e,"aria-invalid":a||void 0,"aria-label":t,"aria-labelledby":n,className:[`lockerverse-form__control`,`lockerverse-form__select`,r].filter(Boolean).join(` `),id:i,name:o,onChange:e=>s(e.currentTarget.value),value:l,children:c.map(e=>k(`option`,{value:e.value,children:e.label},e.value))})}const de=[`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`],fe=[`15`,`12`,`10`,`5`],K=[...fe,`custom`];function pe({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=K.indexOf(t),r;switch(e.key){case`ArrowDown`:case`ArrowRight`:r=(n+1)%K.length;break;case`ArrowLeft`:case`ArrowUp`:r=(n-1+K.length)%K.length;break;case`Home`:r=0;break;case`End`:r=K.length-1;break;default:return}e.preventDefault();let i=K[r];i&&((e.currentTarget.closest(`[role="radiogroup"]`)?.querySelectorAll(`input[type="radio"]`))?.[r]?.focus(),a({tipPercent:i}))};return A(`div`,{className:`lockerverse-payment__tip-box`,children:[k(`p`,{children:`Add a tip to support the Lockerverse platform`}),A(`div`,{"aria-label":`Tip amount`,role:`radiogroup`,children:[fe.map(e=>A(`label`,{className:`lockerverse-payment__tip-choice`,children:[k(`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}),A(`span`,{children:[e,`%`]})]},e)),A(`label`,{className:`lockerverse-payment__tip-choice`,children:[k(`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`}),k(`span`,{children:`Other`})]})]}),i.tipPercent===`custom`?A(`label`,{children:[k(`span`,{children:`Custom tip`}),A(`span`,{className:`lockerverse-payment__money-input`,children:[k(`span`,{"aria-hidden":`true`,children:`$`}),k(`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?k(`span`,{className:`lockerverse-payment__field-message`,id:n,children:t}):null]}):k(`input`,{name:`tip`,type:`hidden`,value:i.tipPercent})]})}function q({checked:e,children:t,name:n,onChange:r}){let i=ee();return A(`label`,{className:`lockerverse-payment__check-row`,htmlFor:i,children:[k(l,{checked:e,id:i,name:n,onChange:e=>r(e.currentTarget.checked)}),k(`span`,{children:t})]})}function me({customFields:e,errors:t,fields:n,idPrefix:r,isPromoApplying:i,memberIdLabel:a,onChange:o,onApplyPromo:s,promoError:c,values:l}){let u=e=>o({...l,...e});return A(`div`,{className:`lockerverse-payment__additional-fields`,children:[n.memberId?A(`label`,{children:[k(`span`,{children:a?.trim()||`Member ID`}),k(`input`,{name:`memberId`,onChange:e=>u({memberId:e.currentTarget.value}),placeholder:`Optional`,value:l.memberId})]}):null,n.merchSize?A(`div`,{className:`lockerverse-payment__field`,children:[k(`span`,{id:`${r}-merch-size-label`,children:`Size`}),k(ue,{ariaLabelledBy:`${r}-merch-size-label`,name:`merchSize`,onValueChange:e=>{let t=de.find(t=>t===e);t&&u({merchSize:t})},options:de.map(e=>({label:e,value:e})),value:l.merchSize})]}):null,n.promoCode?A(`div`,{className:`lockerverse-payment__field`,children:[k(`span`,{id:`${r}-promo-code-label`,children:`Promo code`}),A(`div`,{className:`lockerverse-payment__promo-control`,children:[k(`input`,{"aria-describedby":c?`${r}-promo-code-error`:void 0,"aria-invalid":c?`true`:void 0,"aria-labelledby":`${r}-promo-code-label`,name:`promoCode`,onChange:e=>u({promoCode:e.currentTarget.value}),placeholder:`Optional`,value:l.promoCode}),k(`button`,{disabled:!l.promoCode.trim()||i,onClick:s,type:`button`,children:i?`Applying…`:`Apply`})]}),c?k(`p`,{className:`lockerverse-payment__field-message`,id:`${r}-promo-code-error`,role:`alert`,children:c}):null]}):null,k(f,{choiceClassName:`lockerverse-payment__check-row`,errorClassName:`lockerverse-payment__field-message`,errors:t,fields:e,idPrefix:r,onChange:e=>u({customFields:e}),values:l.customFields})]})}function J({amountCents:t,enabled:n,onChange:r,values:i}){return n?A(q,{checked:i.includeServiceFee,name:`includeServiceFee`,onChange:e=>r({...i,includeServiceFee:e}),children:[`Add `,e(t),` to help cover processing fees`]}):null}function Y(e){return{error:void 0,message:void 0,status:e?`recovering`:`editing`}}function X(e,t,n){return t.includes(e.status)?{...e,...n}:e}function he(e,t){if(t.type===`recovery_started`&&e.status===`unresolved`)return{...e,message:void 0,status:`recovering`};if(e.status===`sold_out`||e.status===`succeeded`||e.status===`unresolved`)return e;switch(t.type){case`field_changed`:return X(e,[`editing`,`invalid`,`refreshing_quote`],{error:void 0,status:`editing`});case`validation_failed`:return X(e,[`editing`],{status:`invalid`});case`quote_refresh_started`:return X(e,[`editing`,`invalid`],{status:`refreshing_quote`});case`quote_refresh_succeeded`:return X(e,[`refreshing_quote`],{error:void 0,status:`editing`});case`quote_refresh_failed`:return X(e,[`refreshing_quote`],{error:t.error??e.error,status:`editing`});case`submission_started`:return X(e,[`editing`,`invalid`,`refreshing_quote`],{error:void 0,status:`submitting`});case`submission_validation_failed`:return X(e,[`submitting`],{error:void 0,status:`invalid`});case`quote_changed`:return X(e,[`submitting`],{status:`editing`});case`retryable_failure`:return X(e,[`editing`,`invalid`,`submitting`],{error:t.error,status:`editing`});case`recovery_failed`:return X(e,[`recovering`],{error:t.error,retryUrl:void 0,status:`editing`});case`sold_out`:return{error:void 0,message:void 0,status:`sold_out`};case`succeeded`:return X(e,[`recovering`,`submitting`],{message:t.message,retryUrl:void 0,status:`succeeded`});case`unresolved`:return X(e,[`recovering`,`submitting`],{message:t.message,retryUrl:t.retryUrl,status:`unresolved`});default:return e}}function Z(e){return e.status===`editing`||e.status===`invalid`||e.status===`refreshing_quote`?e.error:void 0}function Q(e){return e.status===`sold_out`?`sold_out`:e.status===`succeeded`?`success`:e.status===`unresolved`?`unresolved`:e.status===`submitting`||e.status===`recovering`?`submitting`:e.status===`invalid`?`invalid`:Z(e)?`error`:`idle`}function ge(e){return e.status===`submitting`}const _e=[`amountCents`,`discountableSubtotalCents`,`discountCents`,`serviceFeeCents`,`subtotalCents`,`tipCents`,`totalCents`],ve=[`discountableSubtotalCents`,`discountCents`,`subtotalCents`];function ye(e,t,n,r){return(n===t.totalCents?ve:_e).some(n=>e[n]!==t[n])||r!==t.payment.connectedAccountId||e.authoritative&&(e.payment.connectedAccountId!==r||e.payment.currency!==t.payment.currency)||JSON.stringify(e.appliedDiscount)!==JSON.stringify(t.appliedDiscount)||JSON.stringify(e.lineItems)!==JSON.stringify(t.lineItems)}function be(e){if(e.checkoutStatus===`success`)return{kind:`success`,payment:e};if(e.checkoutStatus===`failed`)return{kind:`failed`,payment:e};let t={kind:`unresolved`,paymentReference:e.paymentReference,reason:e.checkoutStatus===`action_required`?`action_required`:`pending`};return e.retryUrl&&(t.retryUrl=e.retryUrl),t}async function xe(e,t,n){if(t.checkoutStatus!==`action_required`||!t.requiresAction)return be(t);if(!n)return{kind:`unresolved`,paymentReference:t.paymentReference,reason:`action_required`};if(t.clientSecret)try{await n.handleNextAction({clientSecret:t.clientSecret})}catch{}try{return be(await e.getPaymentStatus(t.paymentReference))}catch{return{kind:`unresolved`,paymentReference:t.paymentReference,reason:`action_required`}}}async function Se(e,t,n){let r;try{r=await e.submitPayment(t)}catch(n){if(!(n instanceof j&&n.recoveryRecommended))throw n;try{r=await e.getPaymentStatus(t.checkout.paymentReference)}catch{return{kind:`unresolved`,paymentReference:t.checkout.paymentReference,reason:`recovery_failed`}}}return xe(e,r,n)}async function Ce(e,t,n){try{return xe(e,await e.getPaymentStatus(t),n)}catch{return{kind:`unresolved`,paymentReference:t,reason:`recovery_failed`}}}const we=U(G(),ce(),ne()),Te=U(ie(),ae(),B(1)),Ee=U(R(le([se({amountCents:Te,productSlug:we}),se({productSlug:we,quantity:Te}),se({productSlug:we})])),te(1)),De=U(G(),ce(),W(/^(?:0|[1-9]\d*)(?:\.\d{1,2})?$/,`Enter a valid tip amount.`));function Oe(e){let t=oe(De,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 ke(e){let t=oe(Ee,e);return t.success?{success:!0,value:t.output}:{message:`Lockerverse payment configuration is invalid.`,success:!1}}const Ae=`This promo code is invalid or cannot be applied.`;function je(e,t){return t.tipPercent===`custom`?t.customTip.trim()?Oe(t.customTip):{cents:0,success:!0}:{cents:Math.round(e*Number(t.tipPercent)/100),success:!0}}function Me(e,t,n,r){let i={};return n&&(i.email=n),e.widget.fields.serviceFee&&(i.includeServiceFee=t.includeServiceFee),e.widget.fields.promoCode&&t.promoCode.trim()&&(i.promoCode=t.promoCode.trim()),e.widget.fields.tipping&&(i.tipCents=r),i}function Ne(e,t,n){let r=e.widget.fields.tipping?je(n.subtotalCents,t):{cents:0,success:!0};if(!r.success)return{parsedTip:r,totalCents:null};let i=e.widget.fields.serviceFee&&t.includeServiceFee?n.serviceFeeCents||Math.round(n.subtotalCents*e.pricingPolicy.serviceFeeRateBasisPoints/1e4):0;return{parsedTip:r,totalCents:n.totalCents-n.serviceFeeCents-n.tipCents+i+r.cents}}function Pe(e,t){return{displayedTotalCents:e.totalCents,promoError:t&&e.appliedDiscount?.source!==`promo_code`?Ae:void 0}}function Fe(e,t){let n;return t||(n=e instanceof Error?e.message:`The order total could not be updated.`),{paymentError:n,promoError:t?Ae:void 0}}function Ie(e,t){if(!e?.complete)throw Error(`${t} address is required.`);return e.value}function Le(e,t,n,r){if(e.widget.fields.shipping)return t.shippingMatchesBilling?n:Ie(r.shipping,`Shipping`)}function Re({billingAddress:e,catalog:t,email:n,phone:r,shippingAddress:i}){let a={payment_method_data:{billing_details:t.widget.fields.phone?{address:e.address,email:n,name:e.name,phone:r}:{address:e.address,email:n,name:e.name}}};return i?{...a,shipping:{address:i.address,name:i.name,phone:t.widget.fields.phone?r:i.phone??null}}:a}function ze({catalog:e,checkoutItems:t,confirmationToken:n,email:r,fieldValues:i,metadata:a,phone:o,shippingAddress:s}){let c={customFieldAnswers:p(u(e,t),i.customFields),email:r};if(n&&(c.confirmationToken=n,c.paymentMethodConfiguration=`explicit`),a&&(c.metadata=a),e.widget.fields.memberId&&i.memberId.trim()&&(c.memberId=i.memberId.trim()),e.widget.fields.merchSize&&(c.merchSize=i.merchSize),e.widget.fields.phone&&(c.phone=o),s){let e={city:s.address.city??``,country:s.address.country,line1:s.address.line1??``,postal_code:s.address.postal_code??``,state:s.address.state??``};s.address.line2&&(e.line2=s.address.line2),c.shipping={address:e,name:s.name}}return c}function Be(e){if(!e())throw Error(`Payment component is no longer active.`)}function Ve(e,n){t(e,n)}function He(e,t,n,r){return e.kind===`failed`?{kind:`payment_failed`,message:r}:e.kind===`unresolved`?{kind:`payment_unresolved`,paymentReference:e.paymentReference,reason:e.reason,retryUrl:e.retryUrl}:{email:n,kind:`payment`,payment:e.payment,quote:t}}async function Ue({addresses:e,catalog:t,checkoutItems:n,client:r,elements:i,email:a,fieldValues:o,isAttemptActive:s,locallyPreviewedTotalCents:c,metadata:l,onPaymentRecoveryChange:u,phone:d,quote:f,stripe:p,stripeConnectedAccountId:m}){let h=a.trim().toLowerCase(),g=y(d),_=je(f.subtotalCents,o);if(!_.success)throw Error(_.message);let v=await r.calculateTotal({...Me(t,o,h,_.cents),catalog:t,items:n});if(Be(s),v.totalCents>0&&ye(f,v,c,m))return{kind:`quote_changed`,quote:v};let b,x;if(v.totalCents===0)t.widget.fields.shipping&&(b=Le(t,o,Ie(e.billing,`Billing`),e));else{if(!(i&&p))throw Error(`Payment form is still loading.`);await i.update({amount:v.totalCents}),Be(s);let n=await i.submit();if(Be(s),n.error)throw Error(n.error.message);let r=Ie(e.billing,`Billing`);b=Le(t,o,r,e);let a=await p.createConfirmationToken({elements:i,params:Re({billingAddress:r,catalog:t,email:h,phone:g,shippingAddress:b})});if(Be(s),a.error)throw Error(a.error.message);x=a.confirmationToken.id}Ve(u,{connectedAccountId:v.payment.connectedAccountId,paymentReference:v.paymentReference});let S=await Se(r,{checkout:v,submission:ze({catalog:t,checkoutItems:n,confirmationToken:x,email:h,fieldValues:o,metadata:l,phone:g,shippingAddress:b})},p);return Be(s),He(S,v,h,v.totalCents===0?`Order could not be completed. Review the details and try again.`:`Payment was declined. Check your payment details and try again.`)}function We(e,n){t(e,n)}function Ge(e,n){t(e,n)}function Ke(e,t){return{...e,...t}}function qe(e){let t={message:e.reason===`action_required`?`Payment needs your attention. Keep this checkout open.`:`Payment is not complete. Check its status before you try again.`,type:`unresolved`};return e.retryUrl&&(t.retryUrl=e.retryUrl),t}function Je(e,t,n){return e.kind===`unresolved`&&e.reason===`action_required`&&!e.retryUrl&&!t&&!n}function Ye(e){return e instanceof j&&e.serverCode===`PAYMENT_WIDGET_SALES_LIMIT_REACHED`}function Xe({nextQuote:e,onQuoteChange:t,setDisplayedTotalCents:n,setPromoError:r,updateState:i,validatePromo:a}){let o=Pe(e,a);i({type:`quote_refresh_succeeded`}),n(o.displayedTotalCents),t(e),a&&r(o.promoError)}function Ze({error:e,setPromoError:t,updateState:n,validatePromo:r}){let i=Fe(e,r);r&&t(i.promoError),n(i.paymentError===void 0?{type:`quote_refresh_failed`}:{error:i.paymentError,type:`quote_refresh_failed`})}function Qe({onPaymentComplete:n,onPaymentRecoveryChange:r,onPaymentUncertain:i,onQuoteChange:a,result:o,setDisplayedTotalCents:s,dispatchState:c,unresolvedReferenceRef:l}){if(o.kind===`quote_changed`){let t=`The total changed to ${e(o.quote.totalCents)}. Review it and pay again.`;a(o.quote,t),s(o.quote.totalCents),c({type:`quote_changed`});return}if(o.kind===`payment_failed`){We(r,null),c({error:o.message,type:`retryable_failure`});return}if(o.kind===`payment_unresolved`){l.current=o.paymentReference,c(qe(o)),Ge(i,{paymentReference:o.paymentReference,reason:o.reason});return}a(o.quote),We(r,null),c({message:o.payment.paymentRequired?`Payment completed successfully.`:`Order confirmed. No payment was required.`,type:`succeeded`}),t(n,Ke(o.payment,{email:o.email,lineItems:o.quote.lineItems}))}function $e(e){let{catalog:n,checkoutItems:r,client:i,elements:o,email:s,fieldValues:c,metadata:l,onPaymentComplete:u,onResumePaymentFailed:d,onPaymentRecoveryChange:f,onPaymentUncertain:p,onQuoteChange:m,onStateChange:h,quote:g,resumePayment:v,stripe:y,stripeConnectedAccountId:b,stripeLoadFailed:ee,paymentState:C,updateState:w}=e,[T,O]=D(g.totalCents),[k,A]=D(),M=E(!1),N=E(void 0),P=E(0),F=E(0),I=x(e=>w(e,!0),[w]),L=x(()=>{let e=F.current+1;return F.current=e,()=>F.current===e},[]);S(()=>()=>{F.current+=1,P.current+=1},[]);let{parsedTip:R,totalCents:z}=Ne(n,c,g);S(()=>{z!==null&&(O(z),z>0&&o?.update({amount:z}))},[n.pricingPolicy.serviceFeeRateBasisPoints,n.widget.fields.serviceFee,o,c.includeServiceFee,z,g.serviceFeeCents,g.tipCents,g.totalCents,g.subtotalCents]),S(()=>{let e=v?.paymentReference??N.current;if(!e||M.current||C.status!==`recovering`)return;M.current=!0;let n=L();return h(Q(C)),Ce(i,e,y).then(e=>{if(n()&&!Je(e,y,ee)){if(e.kind===`failed`){We(f,null),d(),I({error:`The previous payment failed. Check your details and try again.`,type:`recovery_failed`});return}if(e.kind===`unresolved`){I(qe(e)),Ge(p,{paymentReference:e.paymentReference,reason:e.reason});return}We(f,null),I({message:e.payment.paymentRequired?`Payment completed successfully.`:`Order confirmed. No payment was required.`,type:`succeeded`}),t(u,Ke(e.payment,{email:null,lineItems:null}))}}),()=>{n()&&(F.current+=1),M.current=!1}},[i,u,d,f,p,h,v,y,ee,L,I,C]);let te=x((e=!1,t=!1)=>{t||(P.current+=1),e&&A(void 0),w({type:`field_changed`})},[w]);async function B(e=!1,t=!1){let a=s.trim().toLowerCase(),o=_({email:a,phone:``},!1);if(!(R.success&&(o.value||e)))return;P.current+=1;let l=P.current;w({type:`quote_refresh_started`});try{let e=await i.calculateTotal({...Me(n,c,o.value?.email??``,R.cents),catalog:n,items:r});if(l!==P.current)return;Xe({nextQuote:e,onQuoteChange:m,setDisplayedTotalCents:O,setPromoError:A,updateState:w,validatePromo:t})}catch(e){if(l!==P.current)return;if(Ye(e)){w({type:`sold_out`});return}Ze({error:e,setPromoError:A,updateState:w,validatePromo:t})}}async function ne(){A(void 0),await B(!0,!0)}async function re({addresses:e,phone:t}){I({type:`submission_started`});let d=L();try{let a=await Ue({addresses:e,catalog:n,checkoutItems:r,client:i,elements:o,email:s,fieldValues:c,isAttemptActive:d,locallyPreviewedTotalCents:T,metadata:l,onPaymentRecoveryChange:f,phone:t,quote:g,stripe:y,stripeConnectedAccountId:b});if(!d())return;Qe({dispatchState:I,onPaymentComplete:u,onPaymentRecoveryChange:f,onPaymentUncertain:p,onQuoteChange:m,result:a,setDisplayedTotalCents:O,unresolvedReferenceRef:N})}catch(e){if(!d())return;if(We(f,null),Ye(e)){I({type:`sold_out`});return}let t=e instanceof j?a(e.serverCode):void 0;if(t)return I({type:`submission_validation_failed`}),{phoneError:t};I({error:e instanceof Error?e.message:`Payment could not be completed.`,type:`retryable_failure`})}}let ie=C.status===`succeeded`||C.status===`unresolved`?C.message:void 0;return{commands:{applyPromo:ne,checkPaymentStatus:()=>I({type:`recovery_started`}),fieldChanged:te,refreshAuthoritativeTotal:B,reportValidationFailure:()=>I({type:`validation_failed`}),submit:re},state:{displayedTotalCents:T,isRecovering:C.status===`recovering`,isRefreshingQuote:C.status===`refreshing_quote`,isSubmitting:ge(C),isUnresolved:C.status===`unresolved`,parsedTip:R,paymentError:Z(C),promoError:k,retryUrl:C.retryUrl,terminalMessage:ie}}}const et=b;function tt(e){let{connectedAccountId:t,publishableKey:n}=e.payment;return et(n,t?{stripeAccount:t}:void 0)}function nt(e){return e===`monthly`?{interval:`month`,label:`Monthly`}:e===`annually`?{interval:`year`,label:`Annual`}:e===`every-six-months`?{interval:`6 months`,label:`Every 6 months`}:null}function rt(e,t,n){if(n){let{connectedAccountId:e}=n;return e}if(`payment`in t){let{connectedAccountId:e}=t.payment;return e}let{connectedAccountId:r}=e.payment;return r}function it({accentColor:e,catalog:t,checkoutItems:n,client:r,appearanceRoot:i,initialCustomFieldValues:a,metadata:o,onPaymentComplete:s,onResumePaymentFailed:c,onPaymentRecoveryChange:l,onPaymentUncertain:u,onQuoteChange:d,quote:f,resumePayment:p,onStateChange:m,stripeLoader:g,theme:_,visualStyle:y}){let[b,ee]=D(()=>Y(!!p)),C=E(b);C.current=b;let T=x((e,t=!1)=>{let n=he(C.current,e);n!==C.current&&(C.current=n,ee(n),t&&m(Q(n)))},[m]),O=rt(t,f,p),A=E({connectedAccountId:O,paymentOption:f.paymentOption});b.status!==`submitting`&&b.status!==`recovering`&&(A.current={connectedAccountId:O,paymentOption:f.paymentOption});let{connectedAccountId:j,paymentOption:M}=A.current,N=w(()=>g(t.payment.publishableKey,j?{stripeAccount:j}:void 0).catch(()=>null),[t.payment.publishableKey,j,g]),[F,I]=D(!1);S(()=>{let e=!0;return I(!1),N.then(t=>{e&&t===null&&I(!0)}),()=>{e=!1}},[N]);let L=v(i,_,y,b.status===`submitting`||b.status===`recovering`,e);return L?k(P,{options:{amount:Math.max(f.totalCents,100),appearance:L,currency:t.payment.currency,mode:M===`one-time`?`payment`:`subscription`,paymentMethodTypes:t.community?.widgetAchEnabled?[`card`,`link`,`us_bank_account`]:[`card`,`link`],setupFutureUsage:`off_session`,syncAddressCheckbox:`none`},stripe:N,children:k(_t,{catalog:t,checkoutItems:n,client:r,initialCustomFieldValues:a,metadata:o,onPaymentComplete:s,onPaymentRecoveryChange:l,onPaymentUncertain:u,onQuoteChange:d,onResumePaymentFailed:c,onStateChange:m,paymentState:b,quote:f,resumePayment:p,stripeConnectedAccountId:j,stripeLoadFailed:F,updateState:T})},`${t.payment.publishableKey}:${j??`platform`}:${M}`):k(h,{fieldCount:3,label:`Loading payment form`})}function at({label:e}){return A(`div`,{className:`lockerverse-payment__stripe-loader`,role:`status`,children:[k(`p`,{children:e}),A(`div`,{"aria-hidden":`true`,children:[k(`span`,{}),k(`span`,{}),k(`span`,{})]})]})}function ot({onError:e,onReady:t,ready:n}){return A(`div`,{className:`lockerverse-payment__stripe-element`,"data-ready":n,children:[n?null:k(at,{label:`Loading payment form...`}),k(`div`,{className:`lockerverse-payment__stripe-mount`,children:k(F,{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`,card:`always`,usBankAccount:`auto`},wallets:{applePay:`auto`,googlePay:`never`}}})})]})}function st({label:e,mode:t,onChange:n,onError:r,onReady:i,ready:a}){return A(`div`,{className:`lockerverse-payment__address`,children:[k(`h2`,{children:e}),A(`div`,{className:`lockerverse-payment__stripe-element lockerverse-payment__stripe-element--address`,"data-ready":a,children:[a?null:k(at,{label:`Loading ${e.toLowerCase()}...`}),k(`div`,{className:`lockerverse-payment__stripe-mount`,children:k(N,{onChange:n,onLoadError:({error:t})=>r(t.message??`${e} failed to load.`),onReady:i,options:{autocomplete:{mode:`automatic`},mode:t}})})]})]})}function ct({message:e}){return e?k(`p`,{className:`lockerverse-payment__field-message`,role:`alert`,children:e}):null}function lt({catalog:e,displayedTotalCents:t,fieldValues:n,isBillingAddressReady:r,isPaymentReady:i,isShippingAddressReady:a,onAddressChange:o,onFieldValuesChange:s,onStripeLoadError:c,setIsBillingAddressReady:l,setIsPaymentReady:u,setIsShippingAddressReady:d}){let f=t>0;return A(O,{children:[f?k(ot,{onError:c,onReady:()=>u(!0),ready:i}):null,f||e.widget.fields.shipping?k(st,{label:f?`Billing address`:`Shipping address`,mode:`billing`,onChange:e=>o(`billing`,e),onError:c,onReady:()=>l(!0),ready:r}):null,e.widget.fields.shipping?A(`div`,{className:`lockerverse-payment__shipping`,children:[k(q,{checked:n.shippingMatchesBilling,name:`shippingMatchesBilling`,onChange:e=>{s({...n,shippingMatchesBilling:e}),e?o(`shipping`,null):d(!1)},children:`Shipping is same as billing information`}),n.shippingMatchesBilling?null:k(st,{label:`Shipping address`,mode:`shipping`,onChange:e=>o(`shipping`,e),onError:c,onReady:()=>d(!0),ready:a})]}):null]})}function ut({catalog:t,displayedTotalCents:n,fieldValues:r,isBillingAddressReady:i,isPaymentReady:a,isRequiredShippingReady:o,isSubmitting:s,onFieldValuesChange:c,quote:l}){let u=n===0,d=u?!t.widget.fields.shipping||i&&o:a&&i&&o,f=nt(l.paymentOption),p=u?`Complete order`:`Pay ${e(n)}`;!u&&f&&(p=`Subscribe for ${e(n)}/${f.interval}`),s&&(p=u?`Completing…`:`Processing…`);let m=`Process payment for ${e(n)} total`;return u?m=`Complete order`:f&&(m=`Start ${f.label.toLowerCase()} subscription for ${e(n)}`),A(`div`,{className:`lockerverse-payment__actions`,children:[k(J,{amountCents:l.serviceFeeCents||Math.round(l.subtotalCents*t.pricingPolicy.serviceFeeRateBasisPoints/1e4),enabled:t.widget.fields.serviceFee,onChange:c,values:r}),k(`button`,{"aria-busy":s,"aria-label":m,disabled:s||!d,type:`submit`,children:p})]})}function dt(e,t){let n=e.elements.namedItem(t);if(n instanceof HTMLElement){n.focus();return}n instanceof RadioNodeList&&Array.from(n).find(e=>e instanceof HTMLElement)?.focus()}function ft({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&&dt(n,`custom:${o}`)}function pt(t){let n=t.appliedDiscount;if(n?.source!==`email_list`)return;let r=n.percentageOff===void 0?e(t.discountCents):`${n.percentageOff}%`;return n.message??`Your email qualifies for ${r} off.`}function mt({email:e,emailDiscountMessage:t,emailErrorId:n,emailId:r,emailRef:a,errors:o,onEmailBlur:l,onEmailChange:u,onPhoneChange:d,phone:f,phoneCountry:p,phoneEnabled:m,phoneErrorId:h,phoneId:g,phoneRef:_}){return A(`div`,{className:`lockerverse-payment__contact`,children:[k(i,{error:o.email,errorId:n,id:r,label:`Email`,name:`email`,onBlur:l,onChange:e=>u(e.currentTarget.value),ref:a,required:!0,value:e}),t===void 0?null:k(`p`,{className:`lockerverse-payment__discount-message`,role:`status`,children:t}),m?k(s,{error:o.phone,errorId:h,id:g,label:`Phone`,children:k(c,{country:p,error:o.phone,errorId:h,id:g,inputRef:_,name:`phone`,onChange:d,required:!0,value:f})}):null]})}function ht({message:e}){return e?A(`div`,{className:`lockerverse-payment__actions`,children:[k(`p`,{className:`lockerverse-payment__field-message`,role:`alert`,children:e}),k(`button`,{className:`lockerverse-payment__status-check`,onClick:()=>window.location.reload(),type:`button`,children:`Reload checkout`})]}):null}function gt({paymentRequired:e,shippingRequired:t,isPaymentReady:n,isBillingAddressReady:r,isRequiredShippingReady:i,isSubmitting:a,scriptFailed:o,elementError:s,clearElementError:c}){let[l,u]=D(!1),d=e||t,f=(!e||n)&&(!d||r)&&i;if(S(()=>{if(u(!1),f&&c(void 0),!d||f||a)return;let e=window.setTimeout(()=>u(!0),3e4);return()=>window.clearTimeout(e)},[d,f,a,c]),!(!d||f||a)){if(o||s)return`The secure checkout fields could not load. Check your connection, then reload the checkout.`;if(l)return`The secure checkout fields are taking longer than expected. You can wait or reload the checkout.`}}function _t({catalog:e,checkoutItems:t,client:n,initialCustomFieldValues:r,metadata:i,onPaymentComplete:a,onResumePaymentFailed:s,onPaymentRecoveryChange:c,onPaymentUncertain:l,onQuoteChange:f,onStateChange:p,quote:h,resumePayment:v,stripeConnectedAccountId:y,stripeLoadFailed:b,paymentState:x,updateState:C}){let w=u(e,t),[T,j]=D(``),[M,N]=D(``),[P,F]=D(`US`),[R,z]=D({}),[te,B]=D({}),[ne,re]=D(),[ie,V]=D(),[H,U]=D(!1),[W,ae]=D(!1),[oe,se]=D(!1),[G,ce]=D(()=>({customFields:d(w,r),customTip:``,includeServiceFee:e.widget.fields.serviceFee,memberId:``,merchSize:`M`,promoCode:``,shippingMatchesBilling:!0,tipPercent:`10`})),le=E({billing:null,shipping:null}),ue=E(null),de=E(null),fe=E(null),K=E(h.totalCents>0),q=$e({catalog:e,checkoutItems:t,client:n,elements:I(),email:T,fieldValues:G,metadata:i,onPaymentComplete:a,onPaymentRecoveryChange:c,onPaymentUncertain:l,onQuoteChange:f,onResumePaymentFailed:s,onStateChange:p,paymentState:x,quote:h,resumePayment:v,stripe:L(),stripeConnectedAccountId:y,stripeLoadFailed:b,updateState:C}),{displayedTotalCents:J,isRecovering:Y,isUnresolved:X,isRefreshingQuote:he,isSubmitting:Z,parsedTip:Q,paymentError:ge,promoError:_e,terminalMessage:ve,retryUrl:ye}=q.state,be=`lockerverse-${ee()}`,xe=`${be}-email`,Se=`${xe}-error`,Ce=`${be}-phone`,we=`${Ce}-error`,Te=`${be}-tip-error`,Ee=(Q.success?Q.cents:null)??0,De=J-Ee,Oe=!e.widget.fields.shipping||G.shippingMatchesBilling||oe,ke=gt({clearElementError:V,elementError:ie,isBillingAddressReady:W,isPaymentReady:H,isRequiredShippingReady:Oe,isSubmitting:Z,paymentRequired:J>0,scriptFailed:b,shippingRequired:e.widget.fields.shipping});S(()=>{Z&&fe.current?.focus({preventScroll:!0})},[Z]),S(()=>{Z||R.email||!R.phone||de.current?.focus()},[R.email,R.phone,Z]),S(()=>{let e=J>0;e&&!K.current&&(U(!1),ae(!1)),K.current=e},[J]);function Ae(e){q.commands.fieldChanged(!1,e!==`email`),z(t=>{let n={...t};return delete n[e],n})}function je(e){let t=e.promoCode!==G.promoCode,n=e.includeServiceFee!==G.includeServiceFee;q.commands.fieldChanged(t,!(t||n)),ce(e),B({}),re(void 0)}async function Me(t){t.preventDefault();let n=e.widget.fields.phone?o(M,P):``,r=_({email:T,phone:n},e.widget.fields.phone),i=m(w,G.customFields);if(!(r.value&&Q.success)||Object.keys(i).length>0){z(r.errors),B(i),re(Q.success?void 0:Q.message),q.commands.reportValidationFailure();let e=t.currentTarget;queueMicrotask(()=>{ft({customFieldErrors:i,emailRef:ue,form:e,parsedTipSuccess:Q.success,phoneRef:de,validationErrors:r.errors})});return}z({}),B({});let a=await q.commands.submit({addresses:le.current,phone:n});a?.phoneError&&z({phone:a.phoneError})}return ve||Y?A(`div`,{className:`lockerverse-payment__actions`,children:[A(`p`,{className:`lockerverse-payment__payment-status`,ref:fe,role:`status`,tabIndex:-1,children:[Y?`Recovering payment…`:ve,ye?A(O,{children:[` `,k(`a`,{href:ye,rel:`noopener noreferrer`,target:`_blank`,children:`Complete payment`})]}):null]}),X||Y?k(`button`,{"aria-busy":Y,className:`lockerverse-payment__status-check`,disabled:Y,onClick:q.commands.checkPaymentStatus,type:`button`,children:Y?`Checking payment status…`:`Check payment status`}):null]}):A(`form`,{"aria-busy":Z,className:`lockerverse-payment__form`,noValidate:!0,onSubmit:Me,children:[k(`div`,{"data-lockerverse-input-region":``,inert:Z?!0:void 0,children:A(`fieldset`,{className:`lockerverse-payment__input-fieldset`,disabled:Z,children:[k(g,{displayedBaseCents:De,displayedTipCents:Ee,displayedTotalCents:J,quote:h}),k(pe,{enabled:e.widget.fields.tipping,error:ne,errorId:Te,onChange:je,values:G}),k(mt,{email:T,emailDiscountMessage:pt(h),emailErrorId:Se,emailId:xe,emailRef:ue,errors:R,onEmailBlur:()=>q.commands.refreshAuthoritativeTotal(),onEmailChange:e=>{j(e),Ae(`email`)},onPhoneChange:({value:e,country:t})=>{N(e),F(t),Ae(`phone`)},phone:M,phoneCountry:P,phoneEnabled:e.widget.fields.phone,phoneErrorId:we,phoneId:Ce,phoneRef:de}),k(ht,{message:ke}),k(lt,{catalog:e,displayedTotalCents:J,fieldValues:G,isBillingAddressReady:W,isPaymentReady:H,isShippingAddressReady:oe,onAddressChange:(e,t)=>{le.current[e]=t},onFieldValuesChange:je,onStripeLoadError:V,setIsBillingAddressReady:ae,setIsPaymentReady:U,setIsShippingAddressReady:se}),k(me,{customFields:w,errors:te,fields:e.widget.fields,idPrefix:be,isPromoApplying:he,memberIdLabel:e.community?.memberIdLabel,onApplyPromo:q.commands.applyPromo,onChange:je,promoError:_e,values:G}),k(ut,{catalog:e,displayedTotalCents:J,fieldValues:G,isBillingAddressReady:W,isPaymentReady:H,isRequiredShippingReady:Oe,isSubmitting:Z,onFieldValuesChange:je,quote:h})]})}),Z?k(`p`,{className:`lockerverse-payment__sr-only`,ref:fe,role:`status`,tabIndex:-1,children:J===0?`Completing order…`:`Processing payment…`}):null,k(ct,{message:ge})]})}function vt(){return k(h,{fieldCount:2,label:`Loading payment…`,sectionCount:2,showCheckbox:!0})}function yt(e,t){switch(t.type){case`loading`:return{phase:`loading`,revision:e.revision};case`ready`:return St(t.displayedQuote,e.revision+1);case`error`:return{failure:t.failure,phase:`error`,revision:e.revision};case`checkout`:return e.phase===`ready`?{...e,displayedQuote:t.checkout,quoteFailure:void 0}:e;case`quote-error`:return e.phase===`ready`?{...e,quoteFailure:t.failure}:e;default:return e}}function $(e,t,n){return e?.catalog===t&&e.selectionKey===n}function bt({checkout:e}){return{displayedQuote:e,type:`ready`}}function xt(e){return e instanceof Error?e.message:`Lockerverse payment could not load.`}function St(e,t){return{checkoutItems:[...e.items],displayedQuote:e,phase:`ready`,quoteFailure:void 0,revision:t}}function Ct(e,t){let n=e.widget.fields.serviceFee;return M(e,{includeServiceFee:n,selection:t})}function wt(e,t){try{return St(Ct(e,t),1)}catch(e){return{failure:xt(e),phase:`error`,revision:0}}}function Tt({catalog:e,client:t,paymentState:n,selection:r}){let i=ke(r),a=i.success?JSON.stringify(i.value):`invalid-selection`,o=w(()=>i.success?i.value:[],[i.success,a]),[s,c]=T(yt,void 0,()=>i.success?wt(e,o):{phase:`loading`,revision:0}),l=E(void 0),u=E(0),d=E(s.phase===`ready`?{catalog:e,selectionKey:a}:void 0),f=E(s.phase===`error`?{catalog:e,selectionKey:a}:void 0),p=n===`submitting`||n===`success`||n===`unresolved`;S(()=>{if(!i.success||p||$(f.current,e,a)||$(l.current,e,a))return;let n=!0;l.current={catalog:e,selectionKey:a};let r=$(d.current,e,a);r||c({type:`loading`});function s(e){n&&c(e)}function m(){n&&(l.current=void 0,f.current={catalog:e,selectionKey:a})}let h;function g(t){if(!n||(l.current=void 0,f.current={catalog:e,selectionKey:a},r&&h!==void 0&&u.current!==h))return;let i=xt(t);if(i===`This option is sold out.`){c({failure:i,type:`error`});return}c(r?{failure:i,type:`quote-error`}:{failure:i,type:`error`})}async function _(){try{h=u.current;let n=e.widget.fields.serviceFee;if(!r){let t=Ct(e,o);r=!0,d.current={catalog:e,selectionKey:a},s(bt({checkout:t}))}let i=await t.calculateTotal({catalog:e,includeServiceFee:n,selection:o});m(),u.current===h&&s({checkout:i,type:`checkout`})}catch(e){g(e)}}return _(),()=>{n=!1,$(l.current,e,a)&&(l.current=void 0)}},[e,t,i.success,p,a,o]);let m=$(d.current,e,a)||$(f.current,e,a)||$(l.current,e,a),h=p||m?s:{phase:`loading`,revision:s.revision};return{selectionError:i.success?void 0:i.message,session:h,updateCheckout:e=>{u.current+=1,c({checkout:e,type:`checkout`})}}}const Et=V({recovery:V({connectedAccountId:re(G()),paymentReference:U(G(),ce(),ne())}),selectionFingerprint:G(),version:le([z(1),z(2)]),widgetId:H(G())});function Dt(e){let t=ke(e);return t.success?JSON.stringify(t.value.map(e=>{let t=e.productSlug.trim();return`quantity`in e?[`quantity`,t,e.quantity]:`amountCents`in e?[`amount`,t,e.amountCents]:[`product`,t]})):null}const Ot=`A previous payment uses different checkout details. Return to its original checkout to check the payment before you pay again.`;function kt(e,t,n){let r;try{r=window.sessionStorage.getItem(e)}catch{return{recovery:null}}if(!r)return{recovery:null};try{let e=oe(Et,JSON.parse(r));if(!e.success)throw Error(`Invalid recovery record`);let i=e.output;return i.selectionFingerprint!==t||i.version===2&&i.widgetId!==n?{error:Ot,recovery:null}:{recovery:{connectedAccountId:i.recovery.connectedAccountId,paymentReference:i.recovery.paymentReference}}}catch{return{error:`The saved payment could not be read. Contact support to check it before you pay again.`,recovery:null}}}function At({selection:e,storageKey:t,widgetId:n}){let r=Dt(e),i=JSON.stringify([t,r,n]),[a,o]=D(null),s=E(null);S(()=>{if(!t)return;let e=s.current,a={recovery:null};e?.recovery?a=e.identity===i?{recovery:e.recovery}:{error:Ot,recovery:null}:r!==null&&(a=kt(t,r,n)),a.recovery&&(s.current={identity:i,recovery:a.recovery}),o({identity:i,...a})},[r,i,t,n]);let c=x(e=>{if(!(!t||r===null)){s.current=e?{identity:i,recovery:e}:null;try{e?window.sessionStorage.setItem(t,JSON.stringify({recovery:e,selectionFingerprint:r,version:2,widgetId:n})):window.sessionStorage.removeItem(t)}catch{}}},[r,i,t,n]);return{error:t&&a?.identity===i?a.error:void 0,ready:!t||a?.identity===i,recovery:t&&a?.identity===i?a.recovery:null,remember:c}}const jt={annually:`/year`,"every-six-months":` every 6 months`,monthly:`/month`,"one-time":``};function Mt({branding:e,catalog:t}){return A(`header`,{children:[t.widget.showCommunityBranding&&e?A(`div`,{className:`lockerverse-payment__branding`,children:[e.imageUrl?k(`img`,{alt:e.name,height:`48`,src:e.imageUrl,width:`48`}):null,k(`strong`,{children:e.name})]}):null,k(`h1`,{children:t.widget.title??t.widget.name}),t.widget.description?k(`p`,{children:t.widget.description}):null]})}function Nt({catalog:t,selection:n}){let r=n?.length?t.products.filter(e=>n.some(t=>t.productSlug===e.slug)):t.products.filter(e=>e.id!==t.widget.requiredShipping?.productId);return r.length===0?null:A(`div`,{className:`lockerverse-payment__payment-summary`,children:[k(`h2`,{children:`Products`}),k(`div`,{className:`lockerverse-payment__payment-summary-items`,children:r.map(t=>{let n=t.pricingMode===`fixed`?t.amountCents:t.minimumAmountCents,r=jt[t.paymentOption];return A(`div`,{className:`lockerverse-payment__payment-summary-row`,children:[k(`span`,{children:t.name}),k(`strong`,{children:n===null?`Choose amount`:`${t.pricingMode===`custom`?`From `:``}${e(n)}${r}`})]},t.id)})}),k(`p`,{children:`Base prices. Final total is checked at checkout.`})]})}function Pt(e,t){let i=n(e?.[`--lockerverse-accent`]??t?.accentColor??`#38d77a`),a=r(i),o={...e};return(e?.[`--lockerverse-accent`]!==void 0||t?.accentColor)&&(o[`--lockerverse-accent`]=i),a&&e?.[`--lockerverse-accent-contrast`]===void 0&&(o[`--lockerverse-accent-contrast`]=a),{accent:i,rootStyle:o}}function Ft({catalog:e,client:n,loadError:r,onRetry:i,...a}){let{branding:o,className:s,completionView:c,recoveryStorageKey:l,initialCustomFieldValues:u,metadata:d,onPaymentComplete:f,onPaymentRecoveryChange:p,onPaymentUncertain:m,resumePayment:h,selection:g,style:_,stripeLoader:v=et,theme:y=`dark`,...b}=a,[ee,w]=D(h),T=E(null),[O,j]=D(null),M=x(e=>{j(e),t(f,e)},[f]),[N,P]=D(),[F,I]=D(`idle`),L=E(void 0),{selectionError:R,session:z,updateCheckout:te}=Tt({catalog:e,client:n,paymentState:F,selection:g}),B=z.phase===`ready`?z.revision:void 0,ne=x(e=>{B!==void 0&&(L.current=B),I(e)},[B]),re=x(e=>p?.(e),[p]),ie=x(()=>{w(void 0)},[]);S(()=>{z.phase===`loading`&&P(void 0)},[z.phase]),C(()=>{z.phase===`ready`&&L.current!==z.revision&&I(e=>e===`success`||e===`unresolved`?e:`idle`)},[z.phase,z.revision]);let V=[`lockerverse-payment`,s].filter(Boolean).join(` `),H=o??e.community,{accent:U,rootStyle:W}=Pt(_,H);return O&&c===`summary`?k(`section`,{...b,className:V,"data-lockerverse-theme":y,"data-payment-state":`success`,style:W,children:A(`div`,{className:`lockerverse-payment__completion`,role:`status`,children:[k(`span`,{"aria-hidden":`true`,className:`lockerverse-payment__completion-icon`,children:k(`svg`,{"aria-hidden":`true`,fill:`none`,height:`28`,stroke:`currentColor`,strokeWidth:`2`,viewBox:`0 0 24 24`,width:`28`,children:k(`path`,{d:`m5 12 4 4L19 6`})})}),k(`h1`,{children:O.paymentRequired?`Thank you`:`Order confirmed`}),k(`p`,{children:O.paymentRequired?`Your payment has been received.`:`Your order is confirmed. No payment was required.`})]})}):R?k(`section`,{...b,className:V,"data-lockerverse-theme":y,role:`alert`,style:W,children:R}):z.phase===`error`&&z.failure===`This option is sold out.`||F===`sold_out`?A(`section`,{...b,className:V,"data-lockerverse-theme":y,role:`alert`,style:W,children:[k(`h1`,{children:`Sold out`}),k(`p`,{children:`This option is sold out.`})]}):z.phase===`error`?k(`section`,{...b,className:V,"data-lockerverse-theme":y,style:W,children:k(`p`,{role:`alert`,children:z.failure})}):z.phase===`ready`?A(`section`,{...b,"aria-label":`Payment`,className:V,"data-lockerverse-theme":y,"data-payment-state":F,ref:T,style:W,children:[k(Mt,{branding:H,catalog:e}),r?A(`div`,{role:`alert`,children:[k(`p`,{children:r.message}),k(`button`,{onClick:i,type:`button`,children:`Retry`})]}):null,N?k(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:N}):null,z.quoteFailure?A(`div`,{className:`lockerverse-payment__payment-status`,role:`alert`,children:[k(`span`,{children:z.quoteFailure}),k(`span`,{children:` The final total will be checked when you submit.`})]}):null,k(it,{accentColor:U,appearanceRoot:T,catalog:e,checkoutItems:z.checkoutItems,client:n,initialCustomFieldValues:u,metadata:d,onPaymentComplete:M,onPaymentRecoveryChange:re,onPaymentUncertain:m,onQuoteChange:(e,t)=>{P(t),te(e)},onResumePaymentFailed:ie,onStateChange:ne,quote:z.displayedQuote,resumePayment:ee,stripeLoader:v,theme:y,visualStyle:W},z.revision)]}):A(`section`,{...b,"aria-busy":`true`,"aria-label":`Payment`,className:V,"data-lockerverse-theme":y,style:W,children:[k(Mt,{branding:H,catalog:e}),r?A(`div`,{role:`alert`,children:[k(`p`,{children:r.message}),k(`button`,{onClick:i,type:`button`,children:`Retry`})]}):null,k(vt,{})]})}function It({children:e,loading:t=!1,viewProps:i}){let{branding:a,className:o,completionView:s,recoveryStorageKey:c,initialCustomFieldValues:l,metadata:u,onPaymentComplete:d,onPaymentRecoveryChange:f,onPaymentUncertain:p,resumePayment:m,selection:h,stripeLoader:g,style:_,theme:v=`dark`,...y}=i,b=n(_?.[`--lockerverse-accent`]??a?.accentColor??`#38d77a`),x=r(b),S={..._};return(_?.[`--lockerverse-accent`]!==void 0||a?.accentColor)&&(S[`--lockerverse-accent`]=b),x&&_?.[`--lockerverse-accent-contrast`]===void 0&&(S[`--lockerverse-accent-contrast`]=x),k(`section`,{...y,...t?{"aria-busy":!0,"aria-label":`Payment`}:{},className:[`lockerverse-payment`,o].filter(Boolean).join(` `),"data-lockerverse-theme":v,style:S,children:e})}function Lt(e){let{catalog:n,client:r,loadError:i,onRetry:a,...o}=e,{onPaymentRecoveryChange:s,recoveryStorageKey:c,resumePayment:l,selection:u}=o,d=At({selection:u,storageKey:c,widgetId:n.widget.id}),f=x(e=>{d.remember(e),t(s,e)},[s,d.remember]);return!d.ready||d.error?k(It,{loading:!d.ready,viewProps:o,children:d.error?k(`p`,{role:`alert`,children:d.error}):k(vt,{})}):k(Ft,{...e,onPaymentRecoveryChange:f,resumePayment:l??d.recovery})}function Rt({widget:e,...t}){return e.error&&!e.catalog?A(It,{viewProps:t,children:[k(`p`,{role:`alert`,children:e.error.message}),k(`button`,{onClick:e.refresh,type:`button`,children:`Retry`})]}):e.loading?A(It,{loading:!0,viewProps:t,children:[e.catalog?A(O,{children:[k(Mt,{branding:t.branding??e.catalog.community,catalog:e.catalog}),k(Nt,{catalog:e.catalog,selection:t.selection})]}):null,k(vt,{})]}):e.catalog?k(Lt,{catalog:e.catalog,client:e.client,loadError:e.error,onRetry:e.refresh,...t}):k(It,{loading:!0,viewProps:t,children:k(vt,{})})}export{tt as n,Rt as t};
2
2
  //# sourceMappingURL=lockerverse-payment.js.map