@lockerverse/react 0.2.22 → 0.2.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/checkout-session-payment.tsx"],"mappings":";;;;KAIY;EACN;EAAqB;;EACrB;EAAqB;;KAEf;KAEA;EACV;EACA;EACA;;KAGU;EACV;EACA;;KAGU,0BAA0B;EACpC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU,0BAA0B,iCACpC,KAAK;EACH,WAAW;EACX;EACA,qBAAqB,QAAQ;EAC7B;EACA,WAAW;EACX,+BAA+B;EAC/B,QAAQ;EACR,QAAQ;EACR;;;;KCRC,qCAAqC;KAE9B,0CACV,iCACE;EACE;EACA;EACA;EACA;EACA,WAAW;EACX,wBAAwB;EACxB;EACA;;KAUD;EACH,iBAAiB,sBAAsB;EACvC,SAAS;EACT,UAAU;IACR,qBAAqB;IACrB;IACA;IACA;IACA;QACI,QAAQ;EACd;EACA;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/checkout-session-payment.tsx"],"mappings":";;;;KAIY;EACN;EAAqB;;EACrB;EAAqB;;KAEf;KAEA;EACV;EACA;EACA;;KAGU;EACV;EACA;;KAGU,0BAA0B;EACpC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU,0BAA0B,iCACpC,KAAK;EACH,WAAW;EACX;EACA,qBAAqB,QAAQ;EAC7B;EACA,WAAW;EACX,+BAA+B;EAC/B,QAAQ;EACR,QAAQ;EACR;;;;KCRC,qCAAqC;KAE9B,0CACV,iCACE;EACE;EACA;EACA;EACA;EACA,WAAW;EACX,wBAAwB;EACxB;EACA;;KAUD;EACH,iBAAiB,sBAAsB;EACvC,SAAS;EACT,UAAU;IACR,qBAAqB;IACrB;IACA;IACA;IACA;QACI,QAAQ;EACd;EACA;;iBAsHc,mCACd,OAAO,0DAAuC,IAAA;iBA8KhC,iCAA6B;iBA4I7B,wCACd;EAEA,cAAc,QAAQ;oBACvB,IAAA;iBAiMe,mBAAmB,OAAO,0CAAuB,IAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createLockerverseCheckoutClient as e}from"@lockerverse/sdk/checkout";import{BillingAddressElement as t,CheckoutElementsProvider as n,PaymentElement as r,ShippingAddressElement as i,useCheckoutElements as a}from"@stripe/react-stripe-js/checkout";import{loadStripe as o}from"@stripe/stripe-js/pure/index.js";import{createContext as s,useContext as c,useEffect as l,useMemo as u,useRef as d,useState as f}from"react";import{jsx as p,jsxs as m}from"react/jsx-runtime";const h=s(null);function g(e,t){if(!t.length)throw Error(`Select at least one Product before opening checkout.`);return t.map(t=>{let n=e.products.find(e=>e.slug===t.productSlug);if(!n)throw Error(`Product ${t.productSlug} is unavailable.`);return`amountCents`in t?{amountCents:t.amountCents,productId:n.id}:{productId:n.id,quantity:t.quantity}})}function _(e){let t={communitySlug:e.communitySlug,...e.fetch?{fetch:e.fetch}:{},...e.onError?{onError:e.onError}:{},...e.requestTimeoutMs===void 0?{}:{requestTimeoutMs:e.requestTimeoutMs},...e.sentryDsn===void 0?{}:{sentryDsn:e.sentryDsn},widgetSlug:e.widgetSlug};return e.apiBaseUrl?{...t,apiBaseUrl:e.apiBaseUrl,environment:e.environment}:{...t,environment:`production`}}function v({children:e,loaded:t}){let n=a();if(n.type===`loading`)return p(`div`,{role:`status`,children:`Loading secure payment form…`});if(n.type===`error`)return p(`div`,{role:`alert`,children:n.error.message});let{checkout:r}=n,i={async applyPromoCode(e){let n=await r.runServerUpdate(()=>t.client.updateSessionDiscount({paymentReference:t.session.paymentReference,...e.trim()?{promoCode:e.trim()}:{}}));return n.type===`error`?n.error.message:null},catalog:t.catalog,async confirm(e){let n=await r.runServerUpdate(()=>t.client.updateSessionDetails({...e.customFieldAnswers?{customFieldAnswers:e.customFieldAnswers}:{},email:e.email,...e.memberId?{memberId:e.memberId}:{},...e.merchSize?{merchSize:e.merchSize}:{},paymentReference:t.session.paymentReference,...e.phone?{phone:e.phone}:{}}));if(n.type===`error`)throw Error(n.error.message);let i=await x(r,e.email,e.phone??``);if(`error`in i)throw Error(i.error);let a=await r.confirm({email:i.email,...i.phone?{phoneNumber:i.phone}:{},redirect:`if_required`});if(a.type===`error`)throw Error(a.error.message);return{paymentReference:t.session.paymentReference,sessionId:t.session.sessionId}},paymentReference:t.session.paymentReference,totalCents:r.total.total.minorUnitsAmount};return p(h.Provider,{value:i,children:e})}function y(t){let[r,i]=f(null),[a,s]=f(null),[c,h]=f(0),y=d(null),b=JSON.stringify({email:t.email,includeServiceFee:t.includeServiceFee,returnUrl:t.returnUrl,selection:t.selection,tipCents:t.tipCents}),x=d({email:t.email,includeServiceFee:t.includeServiceFee,key:b,requestKey:globalThis.crypto.randomUUID(),returnUrl:t.returnUrl,selection:t.selection,tipCents:t.tipCents}),S=u(()=>_(t),[t.apiBaseUrl,t.communitySlug,t.environment,t.fetch,t.onError,t.requestTimeoutMs,t.sentryDsn,t.widgetSlug]);l(()=>{let t=!0;if(y.current?.clientOptions!==S||c>0){let t=e(S),n=x.current;y.current={clientOptions:S,promise:(async()=>{let e=await t.load(),r=g(e,n.selection),i=n.includeServiceFee??e.widget.fields.serviceFee,a=await t.createSession({...n.email?{email:n.email}:{},...e.widget.fields.serviceFee?{includeServiceFee:i}:{},items:r,requestKey:n.requestKey,returnUrl:n.returnUrl,...n.tipCents===void 0?{}:{tipCents:n.tipCents}});return{catalog:e,client:t,returnUrl:n.returnUrl,session:a}})()}}return i(null),s(null),y.current.promise.then(e=>{t&&i(e)}).catch(e=>{t&&s(e instanceof Error?e.message:`Unable to load checkout.`)}),()=>{t=!1}},[S,c]);let C=u(()=>r?(t.unstable_stripeLoader??o)(r.catalog.payment.publishableKey,{betas:[`custom_checkout_server_updates_1`],...r.session.connectedAccountId?{stripeAccount:r.session.connectedAccountId}:{}}):null,[r,t.unstable_stripeLoader]),w=u(()=>r?{clientSecret:r.session.clientSecret,elementsOptions:{appearance:{theme:t.theme===`light`?`stripe`:`night`,variables:{colorBackground:`transparent`,colorPrimary:t.accentColor??`#38d77a`}}}}:null,[r,t.accentColor,t.theme]);return b===x.current.key?a?m(`div`,{className:`lockerverse-payment__payment-status`,role:`alert`,children:[p(`p`,{children:a}),p(`button`,{onClick:()=>h(e=>e+1),type:`button`,children:`Try again`})]}):r&&w?p(n,{options:w,stripe:C,children:p(v,{loaded:r,children:t.children})}):m(`div`,{className:`lockerverse-payment__loading`,children:[p(`span`,{className:`lockerverse-payment__sr-only`,role:`status`,children:`Preparing secure checkout…`}),m(`div`,{"aria-hidden":`true`,className:`lockerverse-payment__skeleton`,children:[p(`div`,{className:`lockerverse-payment__skeleton-contact`,children:m(`div`,{className:`lockerverse-payment__skeleton-field`,children:[p(`span`,{className:`lockerverse-payment__skeleton-label`}),p(`span`,{className:`lockerverse-payment__skeleton-input`})]})}),m(`div`,{className:`lockerverse-payment__skeleton-loader-block`,children:[p(`span`,{className:`lockerverse-payment__skeleton-loader-label`}),p(`span`,{className:`lockerverse-payment__skeleton-loader-full`})]}),p(`div`,{className:`lockerverse-payment__skeleton-actions`,children:p(`span`,{className:`lockerverse-payment__skeleton-button`})})]})]}):p(`div`,{className:`lockerverse-payment__payment-status`,role:`alert`,children:`Checkout selection changed. Remount this payment component for the new selection.`})}function b(){let e=c(h);if(!e)throw Error(`useLockerverseCheckoutSession must be used inside LockerverseCheckoutSessionProvider.`);return e}async function x(e,t,n){let r=t.trim().toLowerCase();if(!r)return{error:`Email is required.`};let i=await e.updateEmail(r);if(i.type===`error`)return{error:i.error.message};let a=n.trim();if(a&&(await e.updatePhoneNumber(a)).type===`error`)return{error:`Phone number is invalid.`};let o=await e.validateElements();return o.type===`error`?{error:o.error.message}:{email:r,phone:a}}function S({fields:e,onChange:t,values:n}){return e.map(e=>{let r=n[e.id]??(e.type.includes(`multi`)||e.type===`checkboxes`?[]:``);if(e.type===`textarea`)return m(`label`,{children:[p(`span`,{children:e.label}),p(`textarea`,{name:e.id,onChange:n=>t(e.id,n.currentTarget.value),required:e.required,value:String(r)})]},e.id);if(e.type===`select`)return m(`label`,{children:[p(`span`,{children:e.label}),m(`select`,{name:e.id,onChange:n=>t(e.id,n.currentTarget.value),required:e.required,value:String(r),children:[p(`option`,{value:``,children:`Select…`}),e.options.map(e=>p(`option`,{value:e.id,children:e.label},e.id))]})]},e.id);if(e.type===`radio`||e.type===`checkboxes`||e.type===`multi_select`){let n=Array.isArray(r)?r:[r];return m(`fieldset`,{children:[p(`legend`,{children:e.label}),e.options.map(r=>{let i=n.includes(r.id);return m(`label`,{className:`lockerverse-payment__choice`,children:[p(`input`,{checked:i,name:e.id,onChange:()=>{if(e.type===`radio`){t(e.id,r.id);return}t(e.id,i?n.filter(e=>e!==r.id):[...n,r.id])},required:e.required&&n.length===0,type:e.type===`radio`?`radio`:`checkbox`,value:r.id}),p(`span`,{children:r.label})]},r.id)})]},e.id)}return m(`label`,{children:[p(`span`,{children:e.label}),p(`input`,{name:e.id,onChange:n=>t(e.id,n.currentTarget.value),required:e.required,type:`text`,value:String(r)})]},e.id)})}function C({onComplete:e}){let{applyPromoCode:n,catalog:a,confirm:o,totalCents:s}=b(),[c,l]=f(``),[u,d]=f(``),[h,g]=f(``),[_,v]=f(``),[y,x]=f({}),[C,w]=f(``),[T,E]=f(null),[D,O]=f(!1);async function k(){O(!0),E(null);try{E(await n(C))}catch(e){E(e instanceof Error?e.message:`Unable to update checkout.`)}finally{O(!1)}}async function A(t){t.preventDefault(),O(!0),E(null);try{e?.(await o({customFieldAnswers:a.widget.customFields.map(e=>({fieldId:e.id,value:y[e.id]??null})),email:c,...h?{memberId:h}:{},..._?{merchSize:_}:{},...u?{phone:u}:{}}))}catch(e){E(e instanceof Error?e.message:`Unable to complete checkout.`)}finally{O(!1)}}return m(`form`,{className:`lockerverse-payment__form`,onSubmit:A,children:[m(`header`,{children:[p(`h1`,{children:a.widget.title??a.widget.name}),a.widget.description?p(`p`,{children:a.widget.description}):null]}),m(`div`,{className:`lockerverse-payment__contact`,children:[m(`label`,{children:[p(`span`,{children:`Email`}),p(`input`,{autoComplete:`email`,inputMode:`email`,name:`email`,onChange:e=>l(e.currentTarget.value),placeholder:`you@example.com`,required:!0,type:`email`,value:c})]}),a.widget.fields.phone?m(`label`,{children:[p(`span`,{children:`Phone`}),p(`input`,{autoComplete:`tel`,inputMode:`tel`,name:`phone`,onChange:e=>d(e.currentTarget.value),placeholder:`+1 555 555 5555`,required:!0,type:`tel`,value:u})]}):null,a.widget.fields.memberId?m(`label`,{children:[p(`span`,{children:`Member ID`}),p(`input`,{name:`memberId`,onChange:e=>g(e.currentTarget.value),required:!0,type:`text`,value:h})]}):null,a.widget.fields.merchSize?m(`label`,{children:[p(`span`,{children:`Merch size`}),m(`select`,{name:`merchSize`,onChange:e=>v(e.currentTarget.value),required:!0,value:_,children:[p(`option`,{value:``,children:`Select…`}),[`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`].map(e=>p(`option`,{value:e,children:e},e))]})]}):null]}),m(`div`,{className:`lockerverse-payment__address`,children:[p(`h2`,{children:`Billing information`}),p(t,{})]}),a.widget.fields.shipping?m(`div`,{className:`lockerverse-payment__shipping`,children:[p(`h2`,{children:`Shipping information`}),p(i,{})]}):null,m(`div`,{className:`lockerverse-payment__stripe-element`,hidden:s===0,children:[p(`h2`,{children:`Payment details`}),p(r,{})]}),a.widget.fields.promoCode?m(`div`,{className:`lockerverse-payment__additional-fields`,children:[m(`label`,{children:[p(`span`,{children:`Promo code`}),p(`input`,{name:`promoCode`,onChange:e=>w(e.currentTarget.value),placeholder:`Optional`,value:C})]}),p(`button`,{disabled:D,onClick:k,type:`button`,children:C.trim()?`Apply code`:`Remove code`})]}):null,a.widget.customFields.length?p(`div`,{className:`lockerverse-payment__custom-fields`,children:p(S,{fields:a.widget.customFields,onChange:(e,t)=>x(n=>({...n,[e]:t})),values:y})}):null,T?p(`div`,{role:`alert`,children:T}):null,p(`div`,{className:`lockerverse-payment__actions`,children:p(`button`,{disabled:D,type:`submit`,children:s===0?`Complete free order`:`Pay $${(s/100).toFixed(2)}`})})]})}function w(e){let{apiBaseUrl:t,branding:n,className:r,communitySlug:i,environment:a,fetch:o,includeServiceFee:s,onError:c,onPaymentComplete:l,requestTimeoutMs:u,returnUrl:d,selection:f,sentryDsn:h,unstable_stripeLoader:g,style:_,theme:v=`dark`,tipCents:b,widgetSlug:x,...S}=e,w=d??(globalThis.location===void 0?`https://lockerverse.com`:globalThis.location.href),T=[`lockerverse-payment`,r].filter(Boolean).join(` `),E=t?{apiBaseUrl:t,communitySlug:i,environment:a,widgetSlug:x}:{communitySlug:i,environment:`production`,widgetSlug:x},D=n?.accentColor?{..._,"--lockerverse-accent":n.accentColor}:_;return m(`section`,{...S,className:T,"data-lockerverse-theme":v,style:D,children:[n?m(`div`,{className:`lockerverse-payment__branding`,children:[n.imageUrl?p(`img`,{alt:``,height:`48`,src:n.imageUrl,width:`48`}):null,p(`strong`,{children:n.name})]}):null,p(y,{...E,...n?.accentColor?{accentColor:n.accentColor}:{},...o?{fetch:o}:{},...s===void 0?{}:{includeServiceFee:s},...c?{onError:c}:{},...u===void 0?{}:{requestTimeoutMs:u},returnUrl:w,selection:f,...h===void 0?{}:{sentryDsn:h},...g?{unstable_stripeLoader:g}:{},theme:v,...b===void 0?{}:{tipCents:b},children:p(C,{...l?{onComplete:l}:{}})})]})}export{C as LockerverseCheckoutSessionPaymentForm,y as LockerverseCheckoutSessionProvider,w as LockerversePayment,b as useLockerverseCheckoutSession};
|
|
1
|
+
import{createLockerverseCheckoutClient as e}from"@lockerverse/sdk/checkout";import{BillingAddressElement as t,CheckoutElementsProvider as n,PaymentElement as r,ShippingAddressElement as i,useCheckoutElements as a}from"@stripe/react-stripe-js/checkout";import{loadStripe as o}from"@stripe/stripe-js/pure/index.js";import{createContext as s,useContext as c,useEffect as l,useMemo as u,useRef as d,useState as f}from"react";import{jsx as p,jsxs as m}from"react/jsx-runtime";const h=s(null);function g(e,t){if(!t.length)throw Error(`Select at least one Product before opening checkout.`);return t.map(t=>{let n=e.products.find(e=>e.slug===t.productSlug);if(!n)throw Error(`Product ${t.productSlug} is unavailable.`);return`amountCents`in t?{amountCents:t.amountCents,productId:n.id}:{productId:n.id,quantity:t.quantity}})}function _(e){let t={communitySlug:e.communitySlug,...e.fetch?{fetch:e.fetch}:{},...e.onError?{onError:e.onError}:{},...e.requestTimeoutMs===void 0?{}:{requestTimeoutMs:e.requestTimeoutMs},...e.sentryDsn===void 0?{}:{sentryDsn:e.sentryDsn},widgetSlug:e.widgetSlug};return e.apiBaseUrl?{...t,apiBaseUrl:e.apiBaseUrl,environment:e.environment}:{...t,environment:`production`}}function v({children:e,loaded:t}){let n=a();if(n.type===`loading`)return p(`div`,{role:`status`,children:`Loading secure payment form…`});if(n.type===`error`)return p(`div`,{role:`alert`,children:n.error.message});let{checkout:r}=n,i={async applyPromoCode(e){let n=await r.runServerUpdate(()=>t.client.updateSessionDiscount({paymentReference:t.session.paymentReference,...e.trim()?{promoCode:e.trim()}:{}}));return n.type===`error`?n.error.message:null},catalog:t.catalog,async confirm(e){let n=await r.runServerUpdate(()=>t.client.updateSessionDetails({...e.customFieldAnswers?{customFieldAnswers:e.customFieldAnswers}:{},email:e.email,...e.memberId?{memberId:e.memberId}:{},...e.merchSize?{merchSize:e.merchSize}:{},paymentReference:t.session.paymentReference,...e.phone?{phone:e.phone}:{}}));if(n.type===`error`)throw Error(n.error.message);let i=await x(r,e.email,e.phone??``,r.total.total.minorUnitsAmount>0);if(`error`in i)throw Error(i.error);let a=await r.confirm({email:i.email,...i.phone?{phoneNumber:i.phone}:{},redirect:`if_required`});if(a.type===`error`)throw Error(a.error.message);return{paymentReference:t.session.paymentReference,sessionId:t.session.sessionId}},paymentReference:t.session.paymentReference,totalCents:r.total.total.minorUnitsAmount};return p(h.Provider,{value:i,children:e})}function y(t){let[r,i]=f(null),[a,s]=f(null),[c,h]=f(0),y=d(null),b=JSON.stringify({email:t.email,includeServiceFee:t.includeServiceFee,returnUrl:t.returnUrl,selection:t.selection,tipCents:t.tipCents}),x=d({email:t.email,includeServiceFee:t.includeServiceFee,key:b,requestKey:globalThis.crypto.randomUUID(),returnUrl:t.returnUrl,selection:t.selection,tipCents:t.tipCents}),S=u(()=>_(t),[t.apiBaseUrl,t.communitySlug,t.environment,t.fetch,t.onError,t.requestTimeoutMs,t.sentryDsn,t.widgetSlug]);l(()=>{let t=!0;if(y.current?.clientOptions!==S||c>0){let t=e(S),n=x.current;y.current={clientOptions:S,promise:(async()=>{let e=await t.load(),r=g(e,n.selection),i=n.includeServiceFee??e.widget.fields.serviceFee,a=await t.createSession({...n.email?{email:n.email}:{},...e.widget.fields.serviceFee?{includeServiceFee:i}:{},items:r,requestKey:n.requestKey,returnUrl:n.returnUrl,...n.tipCents===void 0?{}:{tipCents:n.tipCents}});return{catalog:e,client:t,returnUrl:n.returnUrl,session:a}})()}}return i(null),s(null),y.current.promise.then(e=>{t&&i(e)}).catch(e=>{t&&s(e instanceof Error?e.message:`Unable to load checkout.`)}),()=>{t=!1}},[S,c]);let C=u(()=>r?(t.unstable_stripeLoader??o)(r.catalog.payment.publishableKey,{betas:[`custom_checkout_server_updates_1`],...r.session.connectedAccountId?{stripeAccount:r.session.connectedAccountId}:{}}):null,[r,t.unstable_stripeLoader]),w=u(()=>r?{clientSecret:r.session.clientSecret,elementsOptions:{appearance:{theme:t.theme===`light`?`stripe`:`night`,variables:{colorBackground:`transparent`,colorPrimary:t.accentColor??`#38d77a`}}}}:null,[r,t.accentColor,t.theme]);return b===x.current.key?a?m(`div`,{className:`lockerverse-payment__payment-status`,role:`alert`,children:[p(`p`,{children:a}),p(`button`,{onClick:()=>h(e=>e+1),type:`button`,children:`Try again`})]}):r&&w?p(n,{options:w,stripe:C,children:p(v,{loaded:r,children:t.children})}):m(`div`,{className:`lockerverse-payment__loading`,children:[p(`span`,{className:`lockerverse-payment__sr-only`,role:`status`,children:`Preparing secure checkout…`}),m(`div`,{"aria-hidden":`true`,className:`lockerverse-payment__skeleton`,children:[p(`div`,{className:`lockerverse-payment__skeleton-contact`,children:m(`div`,{className:`lockerverse-payment__skeleton-field`,children:[p(`span`,{className:`lockerverse-payment__skeleton-label`}),p(`span`,{className:`lockerverse-payment__skeleton-input`})]})}),m(`div`,{className:`lockerverse-payment__skeleton-loader-block`,children:[p(`span`,{className:`lockerverse-payment__skeleton-loader-label`}),p(`span`,{className:`lockerverse-payment__skeleton-loader-full`})]}),p(`div`,{className:`lockerverse-payment__skeleton-actions`,children:p(`span`,{className:`lockerverse-payment__skeleton-button`})})]})]}):p(`div`,{className:`lockerverse-payment__payment-status`,role:`alert`,children:`Checkout selection changed. Remount this payment component for the new selection.`})}function b(){let e=c(h);if(!e)throw Error(`useLockerverseCheckoutSession must be used inside LockerverseCheckoutSessionProvider.`);return e}async function x(e,t,n,r){let i=t.trim().toLowerCase();if(!i)return{error:`Email is required.`};let a=await e.updateEmail(i);if(a.type===`error`)return{error:a.error.message};let o=n.trim();if(o&&(await e.updatePhoneNumber(o)).type===`error`)return{error:`Phone number is invalid.`};if(r){let t=await e.validateElements();if(t.type===`error`)return{error:t.error.message}}return{email:i,phone:o}}function S({fields:e,onChange:t,values:n}){return e.map(e=>{let r=n[e.id]??(e.type.includes(`multi`)||e.type===`checkboxes`?[]:``);if(e.type===`textarea`)return m(`label`,{children:[p(`span`,{children:e.label}),p(`textarea`,{name:e.id,onChange:n=>t(e.id,n.currentTarget.value),required:e.required,value:String(r)})]},e.id);if(e.type===`select`)return m(`label`,{children:[p(`span`,{children:e.label}),m(`select`,{name:e.id,onChange:n=>t(e.id,n.currentTarget.value),required:e.required,value:String(r),children:[p(`option`,{value:``,children:`Select…`}),e.options.map(e=>p(`option`,{value:e.id,children:e.label},e.id))]})]},e.id);if(e.type===`radio`||e.type===`checkboxes`||e.type===`multi_select`){let n=Array.isArray(r)?r:[r];return m(`fieldset`,{children:[p(`legend`,{children:e.label}),e.options.map(r=>{let i=n.includes(r.id);return m(`label`,{className:`lockerverse-payment__choice`,children:[p(`input`,{checked:i,name:e.id,onChange:()=>{if(e.type===`radio`){t(e.id,r.id);return}t(e.id,i?n.filter(e=>e!==r.id):[...n,r.id])},required:e.required&&n.length===0,type:e.type===`radio`?`radio`:`checkbox`,value:r.id}),p(`span`,{children:r.label})]},r.id)})]},e.id)}return m(`label`,{children:[p(`span`,{children:e.label}),p(`input`,{name:e.id,onChange:n=>t(e.id,n.currentTarget.value),required:e.required,type:`text`,value:String(r)})]},e.id)})}function C({onComplete:e}){let{applyPromoCode:n,catalog:a,confirm:o,totalCents:s}=b(),[c,l]=f(``),[u,d]=f(``),[h,g]=f(``),[_,v]=f(``),[y,x]=f({}),[C,w]=f(``),[T,E]=f(null),[D,O]=f(!1);async function k(){O(!0),E(null);try{E(await n(C))}catch(e){E(e instanceof Error?e.message:`Unable to update checkout.`)}finally{O(!1)}}async function A(t){t.preventDefault(),O(!0),E(null);try{e?.(await o({customFieldAnswers:a.widget.customFields.map(e=>({fieldId:e.id,value:y[e.id]??null})),email:c,...h?{memberId:h}:{},..._?{merchSize:_}:{},...u?{phone:u}:{}}))}catch(e){E(e instanceof Error?e.message:`Unable to complete checkout.`)}finally{O(!1)}}return m(`form`,{className:`lockerverse-payment__form`,onSubmit:A,children:[m(`header`,{children:[p(`h1`,{children:a.widget.title??a.widget.name}),a.widget.description?p(`p`,{children:a.widget.description}):null]}),m(`div`,{className:`lockerverse-payment__contact`,children:[m(`label`,{children:[p(`span`,{children:`Email`}),p(`input`,{autoComplete:`email`,inputMode:`email`,name:`email`,onChange:e=>l(e.currentTarget.value),placeholder:`you@example.com`,required:!0,type:`email`,value:c})]}),a.widget.fields.phone?m(`label`,{children:[p(`span`,{children:`Phone`}),p(`input`,{autoComplete:`tel`,inputMode:`tel`,name:`phone`,onChange:e=>d(e.currentTarget.value),placeholder:`+1 555 555 5555`,required:!0,type:`tel`,value:u})]}):null,a.widget.fields.memberId?m(`label`,{children:[p(`span`,{children:`Member ID`}),p(`input`,{name:`memberId`,onChange:e=>g(e.currentTarget.value),required:!0,type:`text`,value:h})]}):null,a.widget.fields.merchSize?m(`label`,{children:[p(`span`,{children:`Merch size`}),m(`select`,{name:`merchSize`,onChange:e=>v(e.currentTarget.value),required:!0,value:_,children:[p(`option`,{value:``,children:`Select…`}),[`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`].map(e=>p(`option`,{value:e,children:e},e))]})]}):null]}),m(`div`,{className:`lockerverse-payment__address`,children:[p(`h2`,{children:`Billing information`}),p(t,{})]}),a.widget.fields.shipping?m(`div`,{className:`lockerverse-payment__shipping`,children:[p(`h2`,{children:`Shipping information`}),p(i,{})]}):null,m(`div`,{className:`lockerverse-payment__stripe-element`,hidden:s===0,children:[p(`h2`,{children:`Payment details`}),p(r,{})]}),a.widget.fields.promoCode?m(`div`,{className:`lockerverse-payment__additional-fields`,children:[m(`label`,{children:[p(`span`,{children:`Promo code`}),p(`input`,{name:`promoCode`,onChange:e=>w(e.currentTarget.value),placeholder:`Optional`,value:C})]}),p(`button`,{disabled:D,onClick:k,type:`button`,children:C.trim()?`Apply code`:`Remove code`})]}):null,a.widget.customFields.length?p(`div`,{className:`lockerverse-payment__custom-fields`,children:p(S,{fields:a.widget.customFields,onChange:(e,t)=>x(n=>({...n,[e]:t})),values:y})}):null,T?p(`div`,{role:`alert`,children:T}):null,p(`div`,{className:`lockerverse-payment__actions`,children:p(`button`,{disabled:D,type:`submit`,children:s===0?`Complete free order`:`Pay $${(s/100).toFixed(2)}`})})]})}function w(e){let{apiBaseUrl:t,branding:n,className:r,communitySlug:i,environment:a,fetch:o,includeServiceFee:s,onError:c,onPaymentComplete:l,requestTimeoutMs:u,returnUrl:d,selection:f,sentryDsn:h,unstable_stripeLoader:g,style:_,theme:v=`dark`,tipCents:b,widgetSlug:x,...S}=e,w=d??(globalThis.location===void 0?`https://lockerverse.com`:globalThis.location.href),T=[`lockerverse-payment`,r].filter(Boolean).join(` `),E=t?{apiBaseUrl:t,communitySlug:i,environment:a,widgetSlug:x}:{communitySlug:i,environment:`production`,widgetSlug:x},D=n?.accentColor?{..._,"--lockerverse-accent":n.accentColor}:_;return m(`section`,{...S,className:T,"data-lockerverse-theme":v,style:D,children:[n?m(`div`,{className:`lockerverse-payment__branding`,children:[n.imageUrl?p(`img`,{alt:``,height:`48`,src:n.imageUrl,width:`48`}):null,p(`strong`,{children:n.name})]}):null,p(y,{...E,...n?.accentColor?{accentColor:n.accentColor}:{},...o?{fetch:o}:{},...s===void 0?{}:{includeServiceFee:s},...c?{onError:c}:{},...u===void 0?{}:{requestTimeoutMs:u},returnUrl:w,selection:f,...h===void 0?{}:{sentryDsn:h},...g?{unstable_stripeLoader:g}:{},theme:v,...b===void 0?{}:{tipCents:b},children:p(C,{...l?{onComplete:l}:{}})})]})}export{C as LockerverseCheckoutSessionPaymentForm,y as LockerverseCheckoutSessionProvider,w as LockerversePayment,b as useLockerverseCheckoutSession};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/checkout-session-payment.tsx"],"sourcesContent":["import type {\n CreateLockerverseWidgetOptions,\n LockerverseCatalog,\n LockerverseCheckoutClient,\n LockerverseCheckoutItem,\n LockerverseCheckoutSession,\n LockerverseCustomField,\n LockerverseCustomFieldAnswer,\n} from \"@lockerverse/sdk/checkout\";\nimport { createLockerverseCheckoutClient } from \"@lockerverse/sdk/checkout\";\nimport type { StripeCheckoutElementsValue } from \"@stripe/react-stripe-js/checkout\";\nimport {\n BillingAddressElement,\n CheckoutElementsProvider,\n PaymentElement,\n ShippingAddressElement,\n useCheckoutElements,\n} from \"@stripe/react-stripe-js/checkout\";\nimport { loadStripe } from \"@stripe/stripe-js/pure\";\nimport {\n createContext,\n type FormEvent,\n type PropsWithChildren,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n LockerversePaymentCompletion,\n LockerversePaymentProps,\n LockerversePaymentSelectionItem,\n} from \"./types.ts\";\n\ntype CheckoutSessionStripeLoader = typeof loadStripe;\n\nexport type LockerverseCheckoutSessionProviderProps =\n CreateLockerverseWidgetOptions &\n PropsWithChildren<{\n accentColor?: string;\n email?: string;\n includeServiceFee?: boolean;\n returnUrl: string;\n selection: LockerversePaymentSelectionItem[];\n unstable_stripeLoader?: CheckoutSessionStripeLoader;\n theme?: \"dark\" | \"light\";\n tipCents?: number;\n }>;\n\ntype LoadedCheckout = {\n catalog: LockerverseCatalog;\n client: LockerverseCheckoutClient;\n returnUrl: string;\n session: LockerverseCheckoutSession;\n};\n\ntype CheckoutContextValue = {\n applyPromoCode: (promoCode: string) => Promise<string | null>;\n catalog: LockerverseCatalog;\n confirm: (contact: {\n customFieldAnswers?: LockerverseCustomFieldAnswer[];\n email: string;\n memberId?: string;\n merchSize?: \"XS\" | \"S\" | \"M\" | \"L\" | \"XL\" | \"XXL\" | \"XXXL\";\n phone?: string;\n }) => Promise<LockerversePaymentCompletion>;\n paymentReference: string;\n totalCents: number;\n};\n\nconst CheckoutContext = createContext<CheckoutContextValue | null>(null);\n\nfunction resolveItems(\n catalog: LockerverseCatalog,\n selection: LockerversePaymentSelectionItem[]\n) {\n if (!selection.length) {\n throw new Error(\"Select at least one Product before opening checkout.\");\n }\n return selection.map((selected): LockerverseCheckoutItem => {\n const product = catalog.products.find(\n (candidate) => candidate.slug === selected.productSlug\n );\n if (!product) {\n throw new Error(`Product ${selected.productSlug} is unavailable.`);\n }\n return \"amountCents\" in selected\n ? { amountCents: selected.amountCents, productId: product.id }\n : { productId: product.id, quantity: selected.quantity };\n });\n}\n\nfunction createClientOptions(\n props: LockerverseCheckoutSessionProviderProps\n): CreateLockerverseWidgetOptions {\n const common = {\n communitySlug: props.communitySlug,\n ...(props.fetch ? { fetch: props.fetch } : {}),\n ...(props.onError ? { onError: props.onError } : {}),\n ...(props.requestTimeoutMs === undefined\n ? {}\n : { requestTimeoutMs: props.requestTimeoutMs }),\n ...(props.sentryDsn === undefined ? {} : { sentryDsn: props.sentryDsn }),\n widgetSlug: props.widgetSlug,\n };\n return props.apiBaseUrl\n ? {\n ...common,\n apiBaseUrl: props.apiBaseUrl,\n environment: props.environment,\n }\n : { ...common, environment: \"production\" };\n}\n\nfunction CheckoutBridge({\n children,\n loaded,\n}: PropsWithChildren<{ loaded: LoadedCheckout }>) {\n const result = useCheckoutElements();\n if (result.type === \"loading\") {\n return <div role=\"status\">Loading secure payment form…</div>;\n }\n if (result.type === \"error\") {\n return <div role=\"alert\">{result.error.message}</div>;\n }\n const { checkout } = result;\n const value: CheckoutContextValue = {\n async applyPromoCode(promoCode) {\n const update = await checkout.runServerUpdate(() =>\n loaded.client.updateSessionDiscount({\n paymentReference: loaded.session.paymentReference,\n ...(promoCode.trim() ? { promoCode: promoCode.trim() } : {}),\n })\n );\n return update.type === \"error\" ? update.error.message : null;\n },\n catalog: loaded.catalog,\n async confirm(contact) {\n const detailsUpdate = await checkout.runServerUpdate(() =>\n loaded.client.updateSessionDetails({\n ...(contact.customFieldAnswers\n ? { customFieldAnswers: contact.customFieldAnswers }\n : {}),\n email: contact.email,\n ...(contact.memberId ? { memberId: contact.memberId } : {}),\n ...(contact.merchSize ? { merchSize: contact.merchSize } : {}),\n paymentReference: loaded.session.paymentReference,\n ...(contact.phone ? { phone: contact.phone } : {}),\n })\n );\n if (detailsUpdate.type === \"error\") {\n throw new Error(detailsUpdate.error.message);\n }\n const prepared = await prepareCheckoutContact(\n checkout,\n contact.email,\n contact.phone ?? \"\"\n );\n if (\"error\" in prepared) {\n throw new Error(prepared.error);\n }\n const confirmation = await checkout.confirm({\n email: prepared.email,\n ...(prepared.phone ? { phoneNumber: prepared.phone } : {}),\n redirect: \"if_required\",\n });\n if (confirmation.type === \"error\") {\n throw new Error(confirmation.error.message);\n }\n return {\n paymentReference: loaded.session.paymentReference,\n sessionId: loaded.session.sessionId,\n };\n },\n paymentReference: loaded.session.paymentReference,\n totalCents: checkout.total.total.minorUnitsAmount,\n };\n return (\n <CheckoutContext.Provider value={value}>\n {children}\n </CheckoutContext.Provider>\n );\n}\n\nexport function LockerverseCheckoutSessionProvider(\n props: LockerverseCheckoutSessionProviderProps\n) {\n const [loaded, setLoaded] = useState<LoadedCheckout | null>(null);\n const [failure, setFailure] = useState<string | null>(null);\n const [revision, setRevision] = useState(0);\n const preparation = useRef<{\n clientOptions: CreateLockerverseWidgetOptions;\n promise: Promise<LoadedCheckout>;\n } | null>(null);\n const currentCheckoutKey = JSON.stringify({\n email: props.email,\n includeServiceFee: props.includeServiceFee,\n returnUrl: props.returnUrl,\n selection: props.selection,\n tipCents: props.tipCents,\n });\n const initialCheckout = useRef({\n email: props.email,\n includeServiceFee: props.includeServiceFee,\n key: currentCheckoutKey,\n requestKey: globalThis.crypto.randomUUID(),\n returnUrl: props.returnUrl,\n selection: props.selection,\n tipCents: props.tipCents,\n });\n const clientOptions = useMemo(\n () => createClientOptions(props),\n [\n props.apiBaseUrl,\n props.communitySlug,\n props.environment,\n props.fetch,\n props.onError,\n props.requestTimeoutMs,\n props.sentryDsn,\n props.widgetSlug,\n ]\n );\n\n useEffect(() => {\n let active = true;\n if (preparation.current?.clientOptions !== clientOptions || revision > 0) {\n const client = createLockerverseCheckoutClient(clientOptions);\n const checkoutInput = initialCheckout.current;\n preparation.current = {\n clientOptions,\n promise: (async () => {\n const catalog = await client.load();\n const items = resolveItems(catalog, checkoutInput.selection);\n const includeServiceFee =\n checkoutInput.includeServiceFee ?? catalog.widget.fields.serviceFee;\n const session = await client.createSession({\n ...(checkoutInput.email ? { email: checkoutInput.email } : {}),\n ...(catalog.widget.fields.serviceFee ? { includeServiceFee } : {}),\n items,\n requestKey: checkoutInput.requestKey,\n returnUrl: checkoutInput.returnUrl,\n ...(checkoutInput.tipCents === undefined\n ? {}\n : { tipCents: checkoutInput.tipCents }),\n });\n return {\n catalog,\n client,\n returnUrl: checkoutInput.returnUrl,\n session,\n };\n })(),\n };\n }\n setLoaded(null);\n setFailure(null);\n preparation.current.promise\n .then((next) => {\n if (active) {\n setLoaded(next);\n }\n })\n .catch((error: unknown) => {\n if (active) {\n setFailure(\n error instanceof Error ? error.message : \"Unable to load checkout.\"\n );\n }\n });\n return () => {\n active = false;\n };\n }, [clientOptions, revision]);\n\n const stripe = useMemo(() => {\n if (!loaded) {\n return null;\n }\n const stripeLoader = props.unstable_stripeLoader ?? loadStripe;\n return stripeLoader(loaded.catalog.payment.publishableKey, {\n betas: [\"custom_checkout_server_updates_1\"],\n ...(loaded.session.connectedAccountId\n ? { stripeAccount: loaded.session.connectedAccountId }\n : {}),\n });\n }, [loaded, props.unstable_stripeLoader]);\n const providerOptions = useMemo(\n () =>\n loaded\n ? {\n clientSecret: loaded.session.clientSecret,\n elementsOptions: {\n appearance: {\n theme:\n props.theme === \"light\"\n ? (\"stripe\" as const)\n : (\"night\" as const),\n variables: {\n colorBackground: \"transparent\",\n colorPrimary: props.accentColor ?? \"#38d77a\",\n },\n },\n },\n }\n : null,\n [loaded, props.accentColor, props.theme]\n );\n\n if (currentCheckoutKey !== initialCheckout.current.key) {\n return (\n <div className=\"lockerverse-payment__payment-status\" role=\"alert\">\n Checkout selection changed. Remount this payment component for the new\n selection.\n </div>\n );\n }\n if (failure) {\n return (\n <div className=\"lockerverse-payment__payment-status\" role=\"alert\">\n <p>{failure}</p>\n <button onClick={() => setRevision((value) => value + 1)} type=\"button\">\n Try again\n </button>\n </div>\n );\n }\n if (!(loaded && providerOptions)) {\n return (\n <div className=\"lockerverse-payment__loading\">\n <span className=\"lockerverse-payment__sr-only\" role=\"status\">\n Preparing secure checkout…\n </span>\n <div aria-hidden=\"true\" className=\"lockerverse-payment__skeleton\">\n <div className=\"lockerverse-payment__skeleton-contact\">\n <div className=\"lockerverse-payment__skeleton-field\">\n <span className=\"lockerverse-payment__skeleton-label\" />\n <span className=\"lockerverse-payment__skeleton-input\" />\n </div>\n </div>\n <div className=\"lockerverse-payment__skeleton-loader-block\">\n <span className=\"lockerverse-payment__skeleton-loader-label\" />\n <span className=\"lockerverse-payment__skeleton-loader-full\" />\n </div>\n <div className=\"lockerverse-payment__skeleton-actions\">\n <span className=\"lockerverse-payment__skeleton-button\" />\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <CheckoutElementsProvider options={providerOptions} stripe={stripe}>\n <CheckoutBridge loaded={loaded}>{props.children}</CheckoutBridge>\n </CheckoutElementsProvider>\n );\n}\n\nexport function useLockerverseCheckoutSession() {\n const value = useContext(CheckoutContext);\n if (!value) {\n throw new Error(\n \"useLockerverseCheckoutSession must be used inside LockerverseCheckoutSessionProvider.\"\n );\n }\n return value;\n}\n\nasync function prepareCheckoutContact(\n checkout: StripeCheckoutElementsValue,\n email: string,\n phone: string\n) {\n const normalizedEmail = email.trim().toLowerCase();\n if (!normalizedEmail) {\n return { error: \"Email is required.\" } as const;\n }\n const emailResult = await checkout.updateEmail(normalizedEmail);\n if (emailResult.type === \"error\") {\n return { error: emailResult.error.message } as const;\n }\n const normalizedPhone = phone.trim();\n if (normalizedPhone) {\n const phoneResult = await checkout.updatePhoneNumber(normalizedPhone);\n if (phoneResult.type === \"error\") {\n return { error: \"Phone number is invalid.\" } as const;\n }\n }\n const validation = await checkout.validateElements();\n if (validation.type === \"error\") {\n return { error: validation.error.message } as const;\n }\n return { email: normalizedEmail, phone: normalizedPhone } as const;\n}\n\nfunction LockerverseCustomFields({\n fields,\n onChange,\n values,\n}: {\n fields: LockerverseCustomField[];\n onChange: (fieldId: string, value: string | string[]) => void;\n values: Record<string, string | string[]>;\n}) {\n return fields.map((field) => {\n const value =\n values[field.id] ??\n (field.type.includes(\"multi\") || field.type === \"checkboxes\" ? [] : \"\");\n if (field.type === \"textarea\") {\n return (\n <label key={field.id}>\n <span>{field.label}</span>\n <textarea\n name={field.id}\n onChange={(event) => onChange(field.id, event.currentTarget.value)}\n required={field.required}\n value={String(value)}\n />\n </label>\n );\n }\n if (field.type === \"select\") {\n return (\n <label key={field.id}>\n <span>{field.label}</span>\n <select\n name={field.id}\n onChange={(event) => onChange(field.id, event.currentTarget.value)}\n required={field.required}\n value={String(value)}\n >\n <option value=\"\">Select…</option>\n {field.options.map((option) => (\n <option key={option.id} value={option.id}>\n {option.label}\n </option>\n ))}\n </select>\n </label>\n );\n }\n if (\n field.type === \"radio\" ||\n field.type === \"checkboxes\" ||\n field.type === \"multi_select\"\n ) {\n const selected = Array.isArray(value) ? value : [value];\n return (\n <fieldset key={field.id}>\n <legend>{field.label}</legend>\n {field.options.map((option) => {\n const checked = selected.includes(option.id);\n return (\n <label className=\"lockerverse-payment__choice\" key={option.id}>\n <input\n checked={checked}\n name={field.id}\n onChange={() => {\n if (field.type === \"radio\") {\n onChange(field.id, option.id);\n return;\n }\n onChange(\n field.id,\n checked\n ? selected.filter((id) => id !== option.id)\n : [...selected, option.id]\n );\n }}\n required={field.required && selected.length === 0}\n type={field.type === \"radio\" ? \"radio\" : \"checkbox\"}\n value={option.id}\n />\n <span>{option.label}</span>\n </label>\n );\n })}\n </fieldset>\n );\n }\n return (\n <label key={field.id}>\n <span>{field.label}</span>\n <input\n name={field.id}\n onChange={(event) => onChange(field.id, event.currentTarget.value)}\n required={field.required}\n type=\"text\"\n value={String(value)}\n />\n </label>\n );\n });\n}\n\nexport function LockerverseCheckoutSessionPaymentForm({\n onComplete,\n}: {\n onComplete?: (result: LockerversePaymentCompletion) => void;\n}) {\n const { applyPromoCode, catalog, confirm, totalCents } =\n useLockerverseCheckoutSession();\n const [email, setEmail] = useState(\"\");\n const [phone, setPhone] = useState(\"\");\n const [memberId, setMemberId] = useState(\"\");\n const [merchSize, setMerchSize] = useState(\"\");\n const [customFieldValues, setCustomFieldValues] = useState<\n Record<string, string | string[]>\n >({});\n const [promoCode, setPromoCode] = useState(\"\");\n const [message, setMessage] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n async function updateDiscount() {\n setBusy(true);\n setMessage(null);\n try {\n setMessage(await applyPromoCode(promoCode));\n } catch (error) {\n setMessage(\n error instanceof Error ? error.message : \"Unable to update checkout.\"\n );\n } finally {\n setBusy(false);\n }\n }\n\n async function submit(event: FormEvent) {\n event.preventDefault();\n setBusy(true);\n setMessage(null);\n try {\n onComplete?.(\n await confirm({\n customFieldAnswers: catalog.widget.customFields.map((field) => ({\n fieldId: field.id,\n value: customFieldValues[field.id] ?? null,\n })) as LockerverseCustomFieldAnswer[],\n email,\n ...(memberId ? { memberId } : {}),\n ...(merchSize\n ? {\n merchSize: merchSize as\n | \"XS\"\n | \"S\"\n | \"M\"\n | \"L\"\n | \"XL\"\n | \"XXL\"\n | \"XXXL\",\n }\n : {}),\n ...(phone ? { phone } : {}),\n })\n );\n } catch (error) {\n setMessage(\n error instanceof Error ? error.message : \"Unable to complete checkout.\"\n );\n } finally {\n setBusy(false);\n }\n }\n\n return (\n <form className=\"lockerverse-payment__form\" onSubmit={submit}>\n <header>\n <h1>{catalog.widget.title ?? catalog.widget.name}</h1>\n {catalog.widget.description ? (\n <p>{catalog.widget.description}</p>\n ) : null}\n </header>\n <div className=\"lockerverse-payment__contact\">\n <label>\n <span>Email</span>\n <input\n autoComplete=\"email\"\n inputMode=\"email\"\n name=\"email\"\n onChange={(event) => setEmail(event.currentTarget.value)}\n placeholder=\"you@example.com\"\n required\n type=\"email\"\n value={email}\n />\n </label>\n {catalog.widget.fields.phone ? (\n <label>\n <span>Phone</span>\n <input\n autoComplete=\"tel\"\n inputMode=\"tel\"\n name=\"phone\"\n onChange={(event) => setPhone(event.currentTarget.value)}\n placeholder=\"+1 555 555 5555\"\n required\n type=\"tel\"\n value={phone}\n />\n </label>\n ) : null}\n {catalog.widget.fields.memberId ? (\n <label>\n <span>Member ID</span>\n <input\n name=\"memberId\"\n onChange={(event) => setMemberId(event.currentTarget.value)}\n required\n type=\"text\"\n value={memberId}\n />\n </label>\n ) : null}\n {catalog.widget.fields.merchSize ? (\n <label>\n <span>Merch size</span>\n <select\n name=\"merchSize\"\n onChange={(event) => setMerchSize(event.currentTarget.value)}\n required\n value={merchSize}\n >\n <option value=\"\">Select…</option>\n {([\"XS\", \"S\", \"M\", \"L\", \"XL\", \"XXL\", \"XXXL\"] as const).map(\n (size) => (\n <option key={size} value={size}>\n {size}\n </option>\n )\n )}\n </select>\n </label>\n ) : null}\n </div>\n <div className=\"lockerverse-payment__address\">\n <h2>Billing information</h2>\n <BillingAddressElement />\n </div>\n {catalog.widget.fields.shipping ? (\n <div className=\"lockerverse-payment__shipping\">\n <h2>Shipping information</h2>\n <ShippingAddressElement />\n </div>\n ) : null}\n <div\n className=\"lockerverse-payment__stripe-element\"\n hidden={totalCents === 0}\n >\n <h2>Payment details</h2>\n <PaymentElement />\n </div>\n {catalog.widget.fields.promoCode ? (\n <div className=\"lockerverse-payment__additional-fields\">\n <label>\n <span>Promo code</span>\n <input\n name=\"promoCode\"\n onChange={(event) => setPromoCode(event.currentTarget.value)}\n placeholder=\"Optional\"\n value={promoCode}\n />\n </label>\n <button disabled={busy} onClick={updateDiscount} type=\"button\">\n {promoCode.trim() ? \"Apply code\" : \"Remove code\"}\n </button>\n </div>\n ) : null}\n {catalog.widget.customFields.length ? (\n <div className=\"lockerverse-payment__custom-fields\">\n <LockerverseCustomFields\n fields={catalog.widget.customFields}\n onChange={(fieldId, value) =>\n setCustomFieldValues((current) => ({\n ...current,\n [fieldId]: value,\n }))\n }\n values={customFieldValues}\n />\n </div>\n ) : null}\n {message ? <div role=\"alert\">{message}</div> : null}\n <div className=\"lockerverse-payment__actions\">\n <button disabled={busy} type=\"submit\">\n {totalCents === 0\n ? \"Complete free order\"\n : `Pay $${(totalCents / 100).toFixed(2)}`}\n </button>\n </div>\n </form>\n );\n}\n\nexport function LockerversePayment(props: LockerversePaymentProps) {\n const {\n apiBaseUrl,\n branding,\n className,\n communitySlug,\n environment,\n fetch,\n includeServiceFee,\n onError,\n onPaymentComplete,\n requestTimeoutMs,\n returnUrl,\n selection,\n sentryDsn,\n unstable_stripeLoader,\n style,\n theme = \"dark\",\n tipCents,\n widgetSlug,\n ...sectionProps\n } = props;\n const destination =\n returnUrl ??\n (typeof globalThis.location === \"undefined\"\n ? \"https://lockerverse.com\"\n : globalThis.location.href);\n const rootClassName = [\"lockerverse-payment\", className]\n .filter(Boolean)\n .join(\" \");\n const clientOptions = apiBaseUrl\n ? { apiBaseUrl, communitySlug, environment, widgetSlug }\n : { communitySlug, environment: \"production\" as const, widgetSlug };\n const rootStyle = branding?.accentColor\n ? ({ ...style, \"--lockerverse-accent\": branding.accentColor } as const)\n : style;\n\n return (\n <section\n {...sectionProps}\n className={rootClassName}\n data-lockerverse-theme={theme}\n style={rootStyle}\n >\n {branding ? (\n <div className=\"lockerverse-payment__branding\">\n {branding.imageUrl ? (\n <img alt=\"\" height=\"48\" src={branding.imageUrl} width=\"48\" />\n ) : null}\n <strong>{branding.name}</strong>\n </div>\n ) : null}\n <LockerverseCheckoutSessionProvider\n {...clientOptions}\n {...(branding?.accentColor\n ? { accentColor: branding.accentColor }\n : {})}\n {...(fetch ? { fetch } : {})}\n {...(includeServiceFee === undefined ? {} : { includeServiceFee })}\n {...(onError ? { onError } : {})}\n {...(requestTimeoutMs === undefined ? {} : { requestTimeoutMs })}\n returnUrl={destination}\n selection={selection}\n {...(sentryDsn === undefined ? {} : { sentryDsn })}\n {...(unstable_stripeLoader ? { unstable_stripeLoader } : {})}\n theme={theme}\n {...(tipCents === undefined ? {} : { tipCents })}\n >\n <LockerverseCheckoutSessionPaymentForm\n {...(onPaymentComplete ? { onComplete: onPaymentComplete } : {})}\n />\n </LockerverseCheckoutSessionProvider>\n </section>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/checkout-session-payment.tsx"],"sourcesContent":["import type {\n CreateLockerverseWidgetOptions,\n LockerverseCatalog,\n LockerverseCheckoutClient,\n LockerverseCheckoutItem,\n LockerverseCheckoutSession,\n LockerverseCustomField,\n LockerverseCustomFieldAnswer,\n} from \"@lockerverse/sdk/checkout\";\nimport { createLockerverseCheckoutClient } from \"@lockerverse/sdk/checkout\";\nimport type { StripeCheckoutElementsValue } from \"@stripe/react-stripe-js/checkout\";\nimport {\n BillingAddressElement,\n CheckoutElementsProvider,\n PaymentElement,\n ShippingAddressElement,\n useCheckoutElements,\n} from \"@stripe/react-stripe-js/checkout\";\nimport { loadStripe } from \"@stripe/stripe-js/pure\";\nimport {\n createContext,\n type FormEvent,\n type PropsWithChildren,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n LockerversePaymentCompletion,\n LockerversePaymentProps,\n LockerversePaymentSelectionItem,\n} from \"./types.ts\";\n\ntype CheckoutSessionStripeLoader = typeof loadStripe;\n\nexport type LockerverseCheckoutSessionProviderProps =\n CreateLockerverseWidgetOptions &\n PropsWithChildren<{\n accentColor?: string;\n email?: string;\n includeServiceFee?: boolean;\n returnUrl: string;\n selection: LockerversePaymentSelectionItem[];\n unstable_stripeLoader?: CheckoutSessionStripeLoader;\n theme?: \"dark\" | \"light\";\n tipCents?: number;\n }>;\n\ntype LoadedCheckout = {\n catalog: LockerverseCatalog;\n client: LockerverseCheckoutClient;\n returnUrl: string;\n session: LockerverseCheckoutSession;\n};\n\ntype CheckoutContextValue = {\n applyPromoCode: (promoCode: string) => Promise<string | null>;\n catalog: LockerverseCatalog;\n confirm: (contact: {\n customFieldAnswers?: LockerverseCustomFieldAnswer[];\n email: string;\n memberId?: string;\n merchSize?: \"XS\" | \"S\" | \"M\" | \"L\" | \"XL\" | \"XXL\" | \"XXXL\";\n phone?: string;\n }) => Promise<LockerversePaymentCompletion>;\n paymentReference: string;\n totalCents: number;\n};\n\nconst CheckoutContext = createContext<CheckoutContextValue | null>(null);\n\nfunction resolveItems(\n catalog: LockerverseCatalog,\n selection: LockerversePaymentSelectionItem[]\n) {\n if (!selection.length) {\n throw new Error(\"Select at least one Product before opening checkout.\");\n }\n return selection.map((selected): LockerverseCheckoutItem => {\n const product = catalog.products.find(\n (candidate) => candidate.slug === selected.productSlug\n );\n if (!product) {\n throw new Error(`Product ${selected.productSlug} is unavailable.`);\n }\n return \"amountCents\" in selected\n ? { amountCents: selected.amountCents, productId: product.id }\n : { productId: product.id, quantity: selected.quantity };\n });\n}\n\nfunction createClientOptions(\n props: LockerverseCheckoutSessionProviderProps\n): CreateLockerverseWidgetOptions {\n const common = {\n communitySlug: props.communitySlug,\n ...(props.fetch ? { fetch: props.fetch } : {}),\n ...(props.onError ? { onError: props.onError } : {}),\n ...(props.requestTimeoutMs === undefined\n ? {}\n : { requestTimeoutMs: props.requestTimeoutMs }),\n ...(props.sentryDsn === undefined ? {} : { sentryDsn: props.sentryDsn }),\n widgetSlug: props.widgetSlug,\n };\n return props.apiBaseUrl\n ? {\n ...common,\n apiBaseUrl: props.apiBaseUrl,\n environment: props.environment,\n }\n : { ...common, environment: \"production\" };\n}\n\nfunction CheckoutBridge({\n children,\n loaded,\n}: PropsWithChildren<{ loaded: LoadedCheckout }>) {\n const result = useCheckoutElements();\n if (result.type === \"loading\") {\n return <div role=\"status\">Loading secure payment form…</div>;\n }\n if (result.type === \"error\") {\n return <div role=\"alert\">{result.error.message}</div>;\n }\n const { checkout } = result;\n const value: CheckoutContextValue = {\n async applyPromoCode(promoCode) {\n const update = await checkout.runServerUpdate(() =>\n loaded.client.updateSessionDiscount({\n paymentReference: loaded.session.paymentReference,\n ...(promoCode.trim() ? { promoCode: promoCode.trim() } : {}),\n })\n );\n return update.type === \"error\" ? update.error.message : null;\n },\n catalog: loaded.catalog,\n async confirm(contact) {\n const detailsUpdate = await checkout.runServerUpdate(() =>\n loaded.client.updateSessionDetails({\n ...(contact.customFieldAnswers\n ? { customFieldAnswers: contact.customFieldAnswers }\n : {}),\n email: contact.email,\n ...(contact.memberId ? { memberId: contact.memberId } : {}),\n ...(contact.merchSize ? { merchSize: contact.merchSize } : {}),\n paymentReference: loaded.session.paymentReference,\n ...(contact.phone ? { phone: contact.phone } : {}),\n })\n );\n if (detailsUpdate.type === \"error\") {\n throw new Error(detailsUpdate.error.message);\n }\n const prepared = await prepareCheckoutContact(\n checkout,\n contact.email,\n contact.phone ?? \"\",\n checkout.total.total.minorUnitsAmount > 0\n );\n if (\"error\" in prepared) {\n throw new Error(prepared.error);\n }\n const confirmation = await checkout.confirm({\n email: prepared.email,\n ...(prepared.phone ? { phoneNumber: prepared.phone } : {}),\n redirect: \"if_required\",\n });\n if (confirmation.type === \"error\") {\n throw new Error(confirmation.error.message);\n }\n return {\n paymentReference: loaded.session.paymentReference,\n sessionId: loaded.session.sessionId,\n };\n },\n paymentReference: loaded.session.paymentReference,\n totalCents: checkout.total.total.minorUnitsAmount,\n };\n return (\n <CheckoutContext.Provider value={value}>\n {children}\n </CheckoutContext.Provider>\n );\n}\n\nexport function LockerverseCheckoutSessionProvider(\n props: LockerverseCheckoutSessionProviderProps\n) {\n const [loaded, setLoaded] = useState<LoadedCheckout | null>(null);\n const [failure, setFailure] = useState<string | null>(null);\n const [revision, setRevision] = useState(0);\n const preparation = useRef<{\n clientOptions: CreateLockerverseWidgetOptions;\n promise: Promise<LoadedCheckout>;\n } | null>(null);\n const currentCheckoutKey = JSON.stringify({\n email: props.email,\n includeServiceFee: props.includeServiceFee,\n returnUrl: props.returnUrl,\n selection: props.selection,\n tipCents: props.tipCents,\n });\n const initialCheckout = useRef({\n email: props.email,\n includeServiceFee: props.includeServiceFee,\n key: currentCheckoutKey,\n requestKey: globalThis.crypto.randomUUID(),\n returnUrl: props.returnUrl,\n selection: props.selection,\n tipCents: props.tipCents,\n });\n const clientOptions = useMemo(\n () => createClientOptions(props),\n [\n props.apiBaseUrl,\n props.communitySlug,\n props.environment,\n props.fetch,\n props.onError,\n props.requestTimeoutMs,\n props.sentryDsn,\n props.widgetSlug,\n ]\n );\n\n useEffect(() => {\n let active = true;\n if (preparation.current?.clientOptions !== clientOptions || revision > 0) {\n const client = createLockerverseCheckoutClient(clientOptions);\n const checkoutInput = initialCheckout.current;\n preparation.current = {\n clientOptions,\n promise: (async () => {\n const catalog = await client.load();\n const items = resolveItems(catalog, checkoutInput.selection);\n const includeServiceFee =\n checkoutInput.includeServiceFee ?? catalog.widget.fields.serviceFee;\n const session = await client.createSession({\n ...(checkoutInput.email ? { email: checkoutInput.email } : {}),\n ...(catalog.widget.fields.serviceFee ? { includeServiceFee } : {}),\n items,\n requestKey: checkoutInput.requestKey,\n returnUrl: checkoutInput.returnUrl,\n ...(checkoutInput.tipCents === undefined\n ? {}\n : { tipCents: checkoutInput.tipCents }),\n });\n return {\n catalog,\n client,\n returnUrl: checkoutInput.returnUrl,\n session,\n };\n })(),\n };\n }\n setLoaded(null);\n setFailure(null);\n preparation.current.promise\n .then((next) => {\n if (active) {\n setLoaded(next);\n }\n })\n .catch((error: unknown) => {\n if (active) {\n setFailure(\n error instanceof Error ? error.message : \"Unable to load checkout.\"\n );\n }\n });\n return () => {\n active = false;\n };\n }, [clientOptions, revision]);\n\n const stripe = useMemo(() => {\n if (!loaded) {\n return null;\n }\n const stripeLoader = props.unstable_stripeLoader ?? loadStripe;\n return stripeLoader(loaded.catalog.payment.publishableKey, {\n betas: [\"custom_checkout_server_updates_1\"],\n ...(loaded.session.connectedAccountId\n ? { stripeAccount: loaded.session.connectedAccountId }\n : {}),\n });\n }, [loaded, props.unstable_stripeLoader]);\n const providerOptions = useMemo(\n () =>\n loaded\n ? {\n clientSecret: loaded.session.clientSecret,\n elementsOptions: {\n appearance: {\n theme:\n props.theme === \"light\"\n ? (\"stripe\" as const)\n : (\"night\" as const),\n variables: {\n colorBackground: \"transparent\",\n colorPrimary: props.accentColor ?? \"#38d77a\",\n },\n },\n },\n }\n : null,\n [loaded, props.accentColor, props.theme]\n );\n\n if (currentCheckoutKey !== initialCheckout.current.key) {\n return (\n <div className=\"lockerverse-payment__payment-status\" role=\"alert\">\n Checkout selection changed. Remount this payment component for the new\n selection.\n </div>\n );\n }\n if (failure) {\n return (\n <div className=\"lockerverse-payment__payment-status\" role=\"alert\">\n <p>{failure}</p>\n <button onClick={() => setRevision((value) => value + 1)} type=\"button\">\n Try again\n </button>\n </div>\n );\n }\n if (!(loaded && providerOptions)) {\n return (\n <div className=\"lockerverse-payment__loading\">\n <span className=\"lockerverse-payment__sr-only\" role=\"status\">\n Preparing secure checkout…\n </span>\n <div aria-hidden=\"true\" className=\"lockerverse-payment__skeleton\">\n <div className=\"lockerverse-payment__skeleton-contact\">\n <div className=\"lockerverse-payment__skeleton-field\">\n <span className=\"lockerverse-payment__skeleton-label\" />\n <span className=\"lockerverse-payment__skeleton-input\" />\n </div>\n </div>\n <div className=\"lockerverse-payment__skeleton-loader-block\">\n <span className=\"lockerverse-payment__skeleton-loader-label\" />\n <span className=\"lockerverse-payment__skeleton-loader-full\" />\n </div>\n <div className=\"lockerverse-payment__skeleton-actions\">\n <span className=\"lockerverse-payment__skeleton-button\" />\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <CheckoutElementsProvider options={providerOptions} stripe={stripe}>\n <CheckoutBridge loaded={loaded}>{props.children}</CheckoutBridge>\n </CheckoutElementsProvider>\n );\n}\n\nexport function useLockerverseCheckoutSession() {\n const value = useContext(CheckoutContext);\n if (!value) {\n throw new Error(\n \"useLockerverseCheckoutSession must be used inside LockerverseCheckoutSessionProvider.\"\n );\n }\n return value;\n}\n\nasync function prepareCheckoutContact(\n checkout: StripeCheckoutElementsValue,\n email: string,\n phone: string,\n requirePaymentDetails: boolean\n) {\n const normalizedEmail = email.trim().toLowerCase();\n if (!normalizedEmail) {\n return { error: \"Email is required.\" } as const;\n }\n const emailResult = await checkout.updateEmail(normalizedEmail);\n if (emailResult.type === \"error\") {\n return { error: emailResult.error.message } as const;\n }\n const normalizedPhone = phone.trim();\n if (normalizedPhone) {\n const phoneResult = await checkout.updatePhoneNumber(normalizedPhone);\n if (phoneResult.type === \"error\") {\n return { error: \"Phone number is invalid.\" } as const;\n }\n }\n if (requirePaymentDetails) {\n const validation = await checkout.validateElements();\n if (validation.type === \"error\") {\n return { error: validation.error.message } as const;\n }\n }\n return { email: normalizedEmail, phone: normalizedPhone } as const;\n}\n\nfunction LockerverseCustomFields({\n fields,\n onChange,\n values,\n}: {\n fields: LockerverseCustomField[];\n onChange: (fieldId: string, value: string | string[]) => void;\n values: Record<string, string | string[]>;\n}) {\n return fields.map((field) => {\n const value =\n values[field.id] ??\n (field.type.includes(\"multi\") || field.type === \"checkboxes\" ? [] : \"\");\n if (field.type === \"textarea\") {\n return (\n <label key={field.id}>\n <span>{field.label}</span>\n <textarea\n name={field.id}\n onChange={(event) => onChange(field.id, event.currentTarget.value)}\n required={field.required}\n value={String(value)}\n />\n </label>\n );\n }\n if (field.type === \"select\") {\n return (\n <label key={field.id}>\n <span>{field.label}</span>\n <select\n name={field.id}\n onChange={(event) => onChange(field.id, event.currentTarget.value)}\n required={field.required}\n value={String(value)}\n >\n <option value=\"\">Select…</option>\n {field.options.map((option) => (\n <option key={option.id} value={option.id}>\n {option.label}\n </option>\n ))}\n </select>\n </label>\n );\n }\n if (\n field.type === \"radio\" ||\n field.type === \"checkboxes\" ||\n field.type === \"multi_select\"\n ) {\n const selected = Array.isArray(value) ? value : [value];\n return (\n <fieldset key={field.id}>\n <legend>{field.label}</legend>\n {field.options.map((option) => {\n const checked = selected.includes(option.id);\n return (\n <label className=\"lockerverse-payment__choice\" key={option.id}>\n <input\n checked={checked}\n name={field.id}\n onChange={() => {\n if (field.type === \"radio\") {\n onChange(field.id, option.id);\n return;\n }\n onChange(\n field.id,\n checked\n ? selected.filter((id) => id !== option.id)\n : [...selected, option.id]\n );\n }}\n required={field.required && selected.length === 0}\n type={field.type === \"radio\" ? \"radio\" : \"checkbox\"}\n value={option.id}\n />\n <span>{option.label}</span>\n </label>\n );\n })}\n </fieldset>\n );\n }\n return (\n <label key={field.id}>\n <span>{field.label}</span>\n <input\n name={field.id}\n onChange={(event) => onChange(field.id, event.currentTarget.value)}\n required={field.required}\n type=\"text\"\n value={String(value)}\n />\n </label>\n );\n });\n}\n\nexport function LockerverseCheckoutSessionPaymentForm({\n onComplete,\n}: {\n onComplete?: (result: LockerversePaymentCompletion) => void;\n}) {\n const { applyPromoCode, catalog, confirm, totalCents } =\n useLockerverseCheckoutSession();\n const [email, setEmail] = useState(\"\");\n const [phone, setPhone] = useState(\"\");\n const [memberId, setMemberId] = useState(\"\");\n const [merchSize, setMerchSize] = useState(\"\");\n const [customFieldValues, setCustomFieldValues] = useState<\n Record<string, string | string[]>\n >({});\n const [promoCode, setPromoCode] = useState(\"\");\n const [message, setMessage] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n async function updateDiscount() {\n setBusy(true);\n setMessage(null);\n try {\n setMessage(await applyPromoCode(promoCode));\n } catch (error) {\n setMessage(\n error instanceof Error ? error.message : \"Unable to update checkout.\"\n );\n } finally {\n setBusy(false);\n }\n }\n\n async function submit(event: FormEvent) {\n event.preventDefault();\n setBusy(true);\n setMessage(null);\n try {\n onComplete?.(\n await confirm({\n customFieldAnswers: catalog.widget.customFields.map((field) => ({\n fieldId: field.id,\n value: customFieldValues[field.id] ?? null,\n })) as LockerverseCustomFieldAnswer[],\n email,\n ...(memberId ? { memberId } : {}),\n ...(merchSize\n ? {\n merchSize: merchSize as\n | \"XS\"\n | \"S\"\n | \"M\"\n | \"L\"\n | \"XL\"\n | \"XXL\"\n | \"XXXL\",\n }\n : {}),\n ...(phone ? { phone } : {}),\n })\n );\n } catch (error) {\n setMessage(\n error instanceof Error ? error.message : \"Unable to complete checkout.\"\n );\n } finally {\n setBusy(false);\n }\n }\n\n return (\n <form className=\"lockerverse-payment__form\" onSubmit={submit}>\n <header>\n <h1>{catalog.widget.title ?? catalog.widget.name}</h1>\n {catalog.widget.description ? (\n <p>{catalog.widget.description}</p>\n ) : null}\n </header>\n <div className=\"lockerverse-payment__contact\">\n <label>\n <span>Email</span>\n <input\n autoComplete=\"email\"\n inputMode=\"email\"\n name=\"email\"\n onChange={(event) => setEmail(event.currentTarget.value)}\n placeholder=\"you@example.com\"\n required\n type=\"email\"\n value={email}\n />\n </label>\n {catalog.widget.fields.phone ? (\n <label>\n <span>Phone</span>\n <input\n autoComplete=\"tel\"\n inputMode=\"tel\"\n name=\"phone\"\n onChange={(event) => setPhone(event.currentTarget.value)}\n placeholder=\"+1 555 555 5555\"\n required\n type=\"tel\"\n value={phone}\n />\n </label>\n ) : null}\n {catalog.widget.fields.memberId ? (\n <label>\n <span>Member ID</span>\n <input\n name=\"memberId\"\n onChange={(event) => setMemberId(event.currentTarget.value)}\n required\n type=\"text\"\n value={memberId}\n />\n </label>\n ) : null}\n {catalog.widget.fields.merchSize ? (\n <label>\n <span>Merch size</span>\n <select\n name=\"merchSize\"\n onChange={(event) => setMerchSize(event.currentTarget.value)}\n required\n value={merchSize}\n >\n <option value=\"\">Select…</option>\n {([\"XS\", \"S\", \"M\", \"L\", \"XL\", \"XXL\", \"XXXL\"] as const).map(\n (size) => (\n <option key={size} value={size}>\n {size}\n </option>\n )\n )}\n </select>\n </label>\n ) : null}\n </div>\n <div className=\"lockerverse-payment__address\">\n <h2>Billing information</h2>\n <BillingAddressElement />\n </div>\n {catalog.widget.fields.shipping ? (\n <div className=\"lockerverse-payment__shipping\">\n <h2>Shipping information</h2>\n <ShippingAddressElement />\n </div>\n ) : null}\n <div\n className=\"lockerverse-payment__stripe-element\"\n hidden={totalCents === 0}\n >\n <h2>Payment details</h2>\n <PaymentElement />\n </div>\n {catalog.widget.fields.promoCode ? (\n <div className=\"lockerverse-payment__additional-fields\">\n <label>\n <span>Promo code</span>\n <input\n name=\"promoCode\"\n onChange={(event) => setPromoCode(event.currentTarget.value)}\n placeholder=\"Optional\"\n value={promoCode}\n />\n </label>\n <button disabled={busy} onClick={updateDiscount} type=\"button\">\n {promoCode.trim() ? \"Apply code\" : \"Remove code\"}\n </button>\n </div>\n ) : null}\n {catalog.widget.customFields.length ? (\n <div className=\"lockerverse-payment__custom-fields\">\n <LockerverseCustomFields\n fields={catalog.widget.customFields}\n onChange={(fieldId, value) =>\n setCustomFieldValues((current) => ({\n ...current,\n [fieldId]: value,\n }))\n }\n values={customFieldValues}\n />\n </div>\n ) : null}\n {message ? <div role=\"alert\">{message}</div> : null}\n <div className=\"lockerverse-payment__actions\">\n <button disabled={busy} type=\"submit\">\n {totalCents === 0\n ? \"Complete free order\"\n : `Pay $${(totalCents / 100).toFixed(2)}`}\n </button>\n </div>\n </form>\n );\n}\n\nexport function LockerversePayment(props: LockerversePaymentProps) {\n const {\n apiBaseUrl,\n branding,\n className,\n communitySlug,\n environment,\n fetch,\n includeServiceFee,\n onError,\n onPaymentComplete,\n requestTimeoutMs,\n returnUrl,\n selection,\n sentryDsn,\n unstable_stripeLoader,\n style,\n theme = \"dark\",\n tipCents,\n widgetSlug,\n ...sectionProps\n } = props;\n const destination =\n returnUrl ??\n (typeof globalThis.location === \"undefined\"\n ? \"https://lockerverse.com\"\n : globalThis.location.href);\n const rootClassName = [\"lockerverse-payment\", className]\n .filter(Boolean)\n .join(\" \");\n const clientOptions = apiBaseUrl\n ? { apiBaseUrl, communitySlug, environment, widgetSlug }\n : { communitySlug, environment: \"production\" as const, widgetSlug };\n const rootStyle = branding?.accentColor\n ? ({ ...style, \"--lockerverse-accent\": branding.accentColor } as const)\n : style;\n\n return (\n <section\n {...sectionProps}\n className={rootClassName}\n data-lockerverse-theme={theme}\n style={rootStyle}\n >\n {branding ? (\n <div className=\"lockerverse-payment__branding\">\n {branding.imageUrl ? (\n <img alt=\"\" height=\"48\" src={branding.imageUrl} width=\"48\" />\n ) : null}\n <strong>{branding.name}</strong>\n </div>\n ) : null}\n <LockerverseCheckoutSessionProvider\n {...clientOptions}\n {...(branding?.accentColor\n ? { accentColor: branding.accentColor }\n : {})}\n {...(fetch ? { fetch } : {})}\n {...(includeServiceFee === undefined ? {} : { includeServiceFee })}\n {...(onError ? { onError } : {})}\n {...(requestTimeoutMs === undefined ? {} : { requestTimeoutMs })}\n returnUrl={destination}\n selection={selection}\n {...(sentryDsn === undefined ? {} : { sentryDsn })}\n {...(unstable_stripeLoader ? { unstable_stripeLoader } : {})}\n theme={theme}\n {...(tipCents === undefined ? {} : { tipCents })}\n >\n <LockerverseCheckoutSessionPaymentForm\n {...(onPaymentComplete ? { onComplete: onPaymentComplete } : {})}\n />\n </LockerverseCheckoutSessionProvider>\n </section>\n );\n}\n"],"mappings":"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"}
|