@lockerverse/react 0.2.135-dev.1 → 0.2.136-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -318,10 +318,62 @@ const widget = useLockerverseWidget({
318
318
 
319
319
  ## Server rendering
320
320
 
321
- Use the host framework's client component or client-only boundary for browser
322
- payment UI. Keep browser storage access in an effect, not at module scope or
321
+ Load public data with the matching core SDK client in a server route or loader,
322
+ then pass that validated snapshot to the React hook. The second argument is
323
+ optional; without it, the hook keeps its loading state until the browser read
324
+ completes. The seed is read once on mount and is retained if revalidation
325
+ fails. A later seed prop change does not replace live data. Remount with a new
326
+ React `key` when the resource identity changes.
327
+
328
+ ```tsx
329
+ import { createLockerversePublicEventsClient } from "@lockerverse/sdk/public-events";
330
+
331
+ // Call this from a server route or loader.
332
+ export async function loadPublicEvents() {
333
+ return createLockerversePublicEventsClient({ communitySlug: "auburn" }).list();
334
+ }
335
+ ```
336
+
337
+ ```tsx
338
+ import type { LockerversePublicEvent } from "@lockerverse/sdk/public-events";
339
+ import { useLockerversePublicEvents } from "@lockerverse/react/public-events";
340
+
341
+ export function CommunityEvents({ initialEvents }: { initialEvents: LockerversePublicEvent[] }) {
342
+ const events = useLockerversePublicEvents(
343
+ { communitySlug: "auburn" },
344
+ { initialEvents }
345
+ );
346
+ return <h1>{events.events?.[0]?.name ?? "Events"}</h1>;
347
+ }
348
+ ```
349
+
350
+ Payment uses `createLockerverseCheckoutClient(options).load()` on the server
351
+ and `useLockerverseWidget(options, { initialCatalog })` in the React component.
352
+ Signup uses `createLockerverseSignupClient(options).load()` and
353
+ `useLockerverseSignup(options, { initialSignup })`. Use matching options on
354
+ both sides. An empty `initialEvents: []` is valid. Use the exact public SDK
355
+ client result, not unvalidated server JSON or a stored payment quote. Do not
356
+ put personal information, secret keys, or payment recovery data in the seed.
357
+ The browser still requests current public data after mount. A failed refresh
358
+ retains the last good snapshot and exposes `error` and `refresh`; loading means
359
+ a read is in progress, not that the snapshot is unavailable. Signup and event
360
+ content remain visible during refresh. Payment shows the seeded catalog heading
361
+ and public base product prices, but keeps submit controls behind a loading state
362
+ until the catalog refresh finishes. Payment quotes remain authoritative from
363
+ the checkout client. A refreshed signup definition removes obsolete custom
364
+ field choices from the form and submission while preserving valid answers.
365
+
366
+ In Next.js, use a request-local server loader (for example, `React.cache`) to
367
+ avoid duplicate reads in one request. Use `no-store` for changing public
368
+ auction data and allow the auction hook to refresh after mount. A static site
369
+ can refresh after hydration but cannot produce item-specific first-response
370
+ metadata without a build or server response for each item.
371
+
372
+ Keep browser storage and payment recovery behind a client-only boundary where
373
+ the host needs one. Keep those accesses in effects, not at module scope or
323
374
  during server rendering. For TanStack Router, import `ClientOnly` from
324
- `@tanstack/react-router` and put the component that owns checkout inside it:
375
+ `@tanstack/react-router` and put the recovery owner and checkout interaction
376
+ inside it:
325
377
 
326
378
  ```tsx
327
379
  import { ClientOnly } from "@tanstack/react-router";
@@ -332,8 +384,9 @@ import { ClientOnly } from "@tanstack/react-router";
332
384
  ```
333
385
 
334
386
  The host supplies this boundary; TanStack Router is not an SDK dependency.
335
- Wait for saved recovery state to load before mounting payment. Remount the
336
- recovery owner when its resource or recovery key changes.
387
+ Public catalog and item content can remain outside it. Wait for saved recovery
388
+ state to load before mounting payment. Remount the recovery owner when its
389
+ resource or recovery key changes.
337
390
 
338
391
  ## Styling
339
392
 
@@ -1,2 +1,2 @@
1
- import{d as e,h as t,m as n,p as r}from"./host-callback.js";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{array as o,minLength as s,nonEmpty as c,pipe as l,safeParse as u,string as d,trim as f}from"valibot";function p(e){return e.type===`checkbox`?!1:e.type===`checkboxes`||e.type===`multi_select`?[]:``}function m(e){let t={};for(let n of e)t[n.id]=p(n);return t}function h(e){let t=u(d(),e);return t.success?t.output:``}function g(e,t){return e.map(e=>{let n=t[e.id];return e.type===`checkbox`?{fieldId:e.id,value:n===!0}:e.type===`checkboxes`||e.type===`multi_select`?{fieldId:e.id,value:Array.isArray(n)?n:[]}:{fieldId:e.id,value:h(n)}})}function _(e,t){let n={};for(let r of e){if(!r.required)continue;let e=`${r.label} is required.`,i=t[r.id];if(r.type===`checkbox`){i!==!0&&(n[r.id]=e);continue}let a=r.type===`checkboxes`||r.type===`multi_select`?u(l(o(d()),s(1,e)),i??[]):u(l(d(),f(),c(e)),h(i));a.success||(n[r.id]=a.issues[0]?.message??e)}return n}function v({choiceClassName:e,errorClassName:t,errors:n,fields:r,idPrefix:a,onChange:o,values:s}){return r.map(r=>i(y,{choiceClassName:e,error:n[r.id],errorClassName:t,field:r,idPrefix:a,onChange:e=>o({...s,[r.id]:e}),value:s[r.id]},r.id))}function y(e){let{field:t,idPrefix:n}=e,r=`${n}-custom-${t.id}`,a=`${r}-error`,o={...e,controlId:r,errorId:a};switch(t.type){case`checkbox`:return i(b,{...o,field:t});case`text`:case`textarea`:return i(x,{...o,field:t});case`select`:case`multi_select`:return i(S,{...o,field:t});case`radio`:case`checkboxes`:return i(C,{...o,field:t});default:return null}}function b({choiceClassName:t,controlId:n,error:o,errorClassName:s,errorId:c,field:l,onChange:u,value:d}){return a(`label`,{className:t,htmlFor:n,children:[i(e,{"aria-describedby":o?c:void 0,"aria-invalid":o?`true`:void 0,checked:d===!0,id:n,name:`custom:${l.id}`,onChange:e=>u(e.currentTarget.checked),required:l.required}),i(`span`,{children:l.label}),i(r,{className:s,error:o,id:c})]})}function x({controlId:e,error:r,errorId:a,field:o,onChange:s,value:c}){let l={"aria-describedby":r?a:void 0,"aria-invalid":r?`true`:void 0,id:e,name:`custom:${o.id}`,onChange:e=>s(e.currentTarget.value),required:o.required,value:h(c)};return o.type===`textarea`?i(n,{error:r,errorId:a,id:e,label:o.label,children:i(`textarea`,{...l,className:`lockerverse-form__control`})}):i(t,{...l,error:r,errorId:a,label:o.label})}function S({controlId:e,error:t,errorId:r,field:o,onChange:s,value:c}){return i(n,{error:t,errorId:r,id:e,label:o.label,children:a(`select`,{"aria-describedby":t?r:void 0,"aria-invalid":t?`true`:void 0,className:`lockerverse-form__control`,id:e,multiple:o.type===`multi_select`,name:`custom:${o.id}`,onChange:e=>s(o.type===`multi_select`?[...e.currentTarget.selectedOptions].map(e=>e.value):e.currentTarget.value),required:o.required,value:c===!0||c===!1?``:c??(o.type===`multi_select`?[]:``),children:[o.type===`select`?i(`option`,{value:``,children:`Select…`}):null,o.options.map(e=>i(`option`,{value:e.id,children:e.label},e.id))]})})}function C({choiceClassName:e,controlId:t,error:n,errorClassName:o,errorId:s,field:c,onChange:l,value:u}){let d=Array.isArray(u)?u:[];return a(`fieldset`,{"aria-describedby":n?s:void 0,"aria-invalid":n?`true`:void 0,children:[i(`legend`,{children:c.label}),c.options.map((n,r)=>a(`label`,{className:e,children:[i(`input`,{checked:Array.isArray(u)?u.includes(n.id):u===n.id,className:c.type===`checkboxes`?`lockerverse-form__checkbox`:void 0,id:`${t}-${r}`,name:`custom:${c.id}`,onChange:e=>{if(c.type===`radio`){l(n.id);return}l(e.currentTarget.checked?[...d,n.id]:d.filter(e=>e!==n.id))},required:c.required&&c.type===`radio`,type:c.type===`radio`?`radio`:`checkbox`,value:n.id}),i(`span`,{children:n.label})]},n.id)),i(r,{className:o,error:n,id:s})]})}function w({fieldCount:e,label:t,sectionCount:n=0,showCheckbox:r=!1}){return a(`div`,{className:`lockerverse-form-skeleton__loading`,children:[i(`span`,{className:`lockerverse-form-skeleton__sr-only`,role:`status`,children:t}),a(`div`,{"aria-hidden":`true`,className:`lockerverse-form-skeleton`,children:[a(`div`,{className:`lockerverse-form-skeleton__branding`,children:[i(`span`,{className:`lockerverse-form-skeleton__avatar`}),i(`span`,{className:`lockerverse-form-skeleton__community`})]}),i(`div`,{className:`lockerverse-form-skeleton__fields`,children:Array.from({length:e},(e,t)=>a(`div`,{className:`lockerverse-form-skeleton__field`,children:[i(`span`,{className:`lockerverse-form-skeleton__label`}),i(`span`,{className:`lockerverse-form-skeleton__input`})]},t))}),Array.from({length:n},(e,t)=>a(`div`,{className:`lockerverse-form-skeleton__section`,children:[i(`span`,{className:`lockerverse-form-skeleton__section-label`}),a(`div`,{className:`lockerverse-form-skeleton__section-content`,children:[i(`span`,{className:`lockerverse-form-skeleton__section-full`}),a(`div`,{className:`lockerverse-form-skeleton__section-grid`,children:[i(`span`,{className:`lockerverse-form-skeleton__section-half`}),i(`span`,{className:`lockerverse-form-skeleton__section-half`})]})]})]},t)),a(`div`,{className:`lockerverse-form-skeleton__actions`,children:[r?i(`span`,{className:`lockerverse-form-skeleton__check-line`}):null,i(`span`,{className:`lockerverse-form-skeleton__button`})]})]})]})}export{_ as a,m as i,v as n,g as r,w as t};
1
+ import{d as e,h as t,m as n,p as r}from"./host-callback.js";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{array as o,minLength as s,nonEmpty as c,pipe as l,safeParse as u,string as d,trim as f}from"valibot";function p(e){return e.type===`checkbox`?!1:e.type===`checkboxes`||e.type===`multi_select`?[]:``}function m(e){let t={};for(let n of e)t[n.id]=p(n);return t}function h(e,t){let n={};for(let r of e){let e=t[r.id];n[r.id]=g(r,e)}return Object.keys(t).length===e.length&&e.every(e=>{let r=t[e.id],i=n[e.id];return Object.hasOwn(t,e.id)&&_(r,i)})?t:n}function g(e,t){if(e.type===`checkbox`)return t===!0;if(e.type===`checkboxes`||e.type===`multi_select`){let n=new Set(e.options.map(e=>e.id));return Array.isArray(t)?t.filter(e=>n.has(e)):[]}let n=v(t);return e.type===`radio`||e.type===`select`?e.options.some(e=>e.id===n)?n:``:n}function _(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((e,n)=>e===t[n]):e===t}function v(e){let t=u(d(),e);return t.success?t.output:``}function y(e,t){return e.map(e=>{let n=t[e.id];return e.type===`checkbox`?{fieldId:e.id,value:n===!0}:e.type===`checkboxes`||e.type===`multi_select`?{fieldId:e.id,value:Array.isArray(n)?n:[]}:{fieldId:e.id,value:v(n)}})}function b(e,t){let n={};for(let r of e){if(!r.required)continue;let e=`${r.label} is required.`,i=t[r.id];if(r.type===`checkbox`){i!==!0&&(n[r.id]=e);continue}let a=r.type===`checkboxes`||r.type===`multi_select`?u(l(o(d()),s(1,e)),i??[]):u(l(d(),f(),c(e)),v(i));a.success||(n[r.id]=a.issues[0]?.message??e)}return n}function x({choiceClassName:e,errorClassName:t,errors:n,fields:r,idPrefix:a,onChange:o,values:s}){return r.map(r=>i(S,{choiceClassName:e,error:n[r.id],errorClassName:t,field:r,idPrefix:a,onChange:e=>o({...s,[r.id]:e}),value:s[r.id]},r.id))}function S(e){let{field:t,idPrefix:n}=e,r=`${n}-custom-${t.id}`,a=`${r}-error`,o={...e,controlId:r,errorId:a};switch(t.type){case`checkbox`:return i(C,{...o,field:t});case`text`:case`textarea`:return i(w,{...o,field:t});case`select`:case`multi_select`:return i(T,{...o,field:t});case`radio`:case`checkboxes`:return i(E,{...o,field:t});default:return null}}function C({choiceClassName:t,controlId:n,error:o,errorClassName:s,errorId:c,field:l,onChange:u,value:d}){return a(`label`,{className:t,htmlFor:n,children:[i(e,{"aria-describedby":o?c:void 0,"aria-invalid":o?`true`:void 0,checked:d===!0,id:n,name:`custom:${l.id}`,onChange:e=>u(e.currentTarget.checked),required:l.required}),i(`span`,{children:l.label}),i(r,{className:s,error:o,id:c})]})}function w({controlId:e,error:r,errorId:a,field:o,onChange:s,value:c}){let l={"aria-describedby":r?a:void 0,"aria-invalid":r?`true`:void 0,id:e,name:`custom:${o.id}`,onChange:e=>s(e.currentTarget.value),required:o.required,value:v(c)};return o.type===`textarea`?i(n,{error:r,errorId:a,id:e,label:o.label,children:i(`textarea`,{...l,className:`lockerverse-form__control`})}):i(t,{...l,error:r,errorId:a,label:o.label})}function T({controlId:e,error:t,errorId:r,field:o,onChange:s,value:c}){return i(n,{error:t,errorId:r,id:e,label:o.label,children:a(`select`,{"aria-describedby":t?r:void 0,"aria-invalid":t?`true`:void 0,className:`lockerverse-form__control`,id:e,multiple:o.type===`multi_select`,name:`custom:${o.id}`,onChange:e=>s(o.type===`multi_select`?[...e.currentTarget.selectedOptions].map(e=>e.value):e.currentTarget.value),required:o.required,value:c===!0||c===!1?``:c??(o.type===`multi_select`?[]:``),children:[o.type===`select`?i(`option`,{value:``,children:`Select…`}):null,o.options.map(e=>i(`option`,{value:e.id,children:e.label},e.id))]})})}function E({choiceClassName:e,controlId:t,error:n,errorClassName:o,errorId:s,field:c,onChange:l,value:u}){let d=Array.isArray(u)?u:[];return a(`fieldset`,{"aria-describedby":n?s:void 0,"aria-invalid":n?`true`:void 0,children:[i(`legend`,{children:c.label}),c.options.map((n,r)=>a(`label`,{className:e,children:[i(`input`,{checked:Array.isArray(u)?u.includes(n.id):u===n.id,className:c.type===`checkboxes`?`lockerverse-form__checkbox`:void 0,id:`${t}-${r}`,name:`custom:${c.id}`,onChange:e=>{if(c.type===`radio`){l(n.id);return}l(e.currentTarget.checked?[...d,n.id]:d.filter(e=>e!==n.id))},required:c.required&&c.type===`radio`,type:c.type===`radio`?`radio`:`checkbox`,value:n.id}),i(`span`,{children:n.label})]},n.id)),i(r,{className:o,error:n,id:s})]})}function D({fieldCount:e,label:t,sectionCount:n=0,showCheckbox:r=!1}){return a(`div`,{className:`lockerverse-form-skeleton__loading`,children:[i(`span`,{className:`lockerverse-form-skeleton__sr-only`,role:`status`,children:t}),a(`div`,{"aria-hidden":`true`,className:`lockerverse-form-skeleton`,children:[a(`div`,{className:`lockerverse-form-skeleton__branding`,children:[i(`span`,{className:`lockerverse-form-skeleton__avatar`}),i(`span`,{className:`lockerverse-form-skeleton__community`})]}),i(`div`,{className:`lockerverse-form-skeleton__fields`,children:Array.from({length:e},(e,t)=>a(`div`,{className:`lockerverse-form-skeleton__field`,children:[i(`span`,{className:`lockerverse-form-skeleton__label`}),i(`span`,{className:`lockerverse-form-skeleton__input`})]},t))}),Array.from({length:n},(e,t)=>a(`div`,{className:`lockerverse-form-skeleton__section`,children:[i(`span`,{className:`lockerverse-form-skeleton__section-label`}),a(`div`,{className:`lockerverse-form-skeleton__section-content`,children:[i(`span`,{className:`lockerverse-form-skeleton__section-full`}),a(`div`,{className:`lockerverse-form-skeleton__section-grid`,children:[i(`span`,{className:`lockerverse-form-skeleton__section-half`}),i(`span`,{className:`lockerverse-form-skeleton__section-half`})]})]})]},t)),a(`div`,{className:`lockerverse-form-skeleton__actions`,children:[r?i(`span`,{className:`lockerverse-form-skeleton__check-line`}):null,i(`span`,{className:`lockerverse-form-skeleton__button`})]})]})]})}export{h as a,m as i,x as n,b as o,y as r,D as t};
2
2
  //# sourceMappingURL=form-skeleton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-skeleton.js","names":[],"sources":["../src/custom-fields.tsx","../src/form-skeleton.tsx"],"sourcesContent":["import type {\n LockerverseBooleanCustomField,\n LockerverseCustomField,\n LockerverseCustomFieldAnswer,\n LockerverseMultiOptionCustomField,\n LockerverseSingleOptionCustomField,\n} from \"@lockerverse/sdk/checkout\";\nimport {\n array,\n minLength,\n nonEmpty,\n pipe,\n safeParse,\n string,\n trim,\n} from \"valibot\";\nimport { Checkbox, FieldError, FormField, TextField } from \"./form-field.tsx\";\n\nexport type CustomFieldValues = Record<string, boolean | string | string[]>;\n\nfunction createCustomFieldValue(field: LockerverseCustomField) {\n if (field.type === \"checkbox\") {\n return false;\n }\n if (field.type === \"checkboxes\" || field.type === \"multi_select\") {\n return [];\n }\n return \"\";\n}\n\nexport function createCustomFieldValues(fields: LockerverseCustomField[]) {\n const values: CustomFieldValues = {};\n for (const field of fields) {\n values[field.id] = createCustomFieldValue(field);\n }\n return values;\n}\n\nfunction getStringValue(value: CustomFieldValues[string] | undefined) {\n const result = safeParse(string(), value);\n return result.success ? result.output : \"\";\n}\n\nexport function buildCustomFieldAnswers(\n fields: LockerverseCustomField[],\n values: CustomFieldValues\n): LockerverseCustomFieldAnswer[] {\n return fields.map((field): LockerverseCustomFieldAnswer => {\n const value = values[field.id];\n if (field.type === \"checkbox\") {\n return { fieldId: field.id, value: value === true };\n }\n if (field.type === \"checkboxes\" || field.type === \"multi_select\") {\n return { fieldId: field.id, value: Array.isArray(value) ? value : [] };\n }\n return {\n fieldId: field.id,\n value: getStringValue(value),\n };\n });\n}\n\nexport function validateCustomFields(\n fields: LockerverseCustomField[],\n values: CustomFieldValues\n) {\n const errors: Record<string, string> = {};\n for (const field of fields) {\n if (!field.required) {\n continue;\n }\n const message = `${field.label} is required.`;\n const value = values[field.id];\n if (field.type === \"checkbox\") {\n if (value !== true) {\n errors[field.id] = message;\n }\n continue;\n }\n const result =\n field.type === \"checkboxes\" || field.type === \"multi_select\"\n ? safeParse(pipe(array(string()), minLength(1, message)), value ?? [])\n : safeParse(\n pipe(string(), trim(), nonEmpty(message)),\n getStringValue(value)\n );\n if (!result.success) {\n errors[field.id] = result.issues[0]?.message ?? message;\n }\n }\n return errors;\n}\n\nexport function CustomFields({\n choiceClassName,\n errorClassName,\n errors,\n fields,\n idPrefix,\n onChange,\n values,\n}: {\n choiceClassName: string;\n errorClassName: string;\n errors: Record<string, string>;\n fields: LockerverseCustomField[];\n idPrefix: string;\n onChange: (values: CustomFieldValues) => void;\n values: CustomFieldValues;\n}) {\n return fields.map((field) => (\n <CustomField\n choiceClassName={choiceClassName}\n error={errors[field.id]}\n errorClassName={errorClassName}\n field={field}\n idPrefix={idPrefix}\n key={field.id}\n onChange={(value) => onChange({ ...values, [field.id]: value })}\n value={values[field.id]}\n />\n ));\n}\n\ntype CustomFieldProps = {\n choiceClassName: string;\n error: string | undefined;\n errorClassName: string;\n field: LockerverseCustomField;\n idPrefix: string;\n onChange: (value: boolean | string | string[]) => void;\n value: boolean | string | string[] | undefined;\n};\n\nfunction CustomField(props: CustomFieldProps) {\n const { field, idPrefix } = props;\n const controlId = `${idPrefix}-custom-${field.id}`;\n const errorId = `${controlId}-error`;\n const controlProps = { ...props, controlId, errorId };\n switch (field.type) {\n case \"checkbox\":\n return <BooleanCustomField {...controlProps} field={field} />;\n case \"text\":\n case \"textarea\":\n return <TextCustomField {...controlProps} field={field} />;\n case \"select\":\n case \"multi_select\":\n return <SelectCustomField {...controlProps} field={field} />;\n case \"radio\":\n case \"checkboxes\":\n return <ChoiceCustomField {...controlProps} field={field} />;\n default:\n return null;\n }\n}\n\nfunction BooleanCustomField({\n choiceClassName,\n controlId,\n error,\n errorClassName,\n errorId,\n field,\n onChange,\n value,\n}: ControlProps & { field: LockerverseBooleanCustomField }) {\n return (\n <label className={choiceClassName} htmlFor={controlId}>\n <Checkbox\n aria-describedby={error ? errorId : undefined}\n aria-invalid={error ? \"true\" : undefined}\n checked={value === true}\n id={controlId}\n name={`custom:${field.id}`}\n onChange={(event) => onChange(event.currentTarget.checked)}\n required={field.required}\n />\n <span>{field.label}</span>\n <FieldError className={errorClassName} error={error} id={errorId} />\n </label>\n );\n}\n\ntype ControlProps = CustomFieldProps & {\n controlId: string;\n errorId: string;\n};\n\nfunction TextCustomField({\n controlId,\n error,\n errorId,\n field,\n onChange,\n value,\n}: ControlProps & {\n field: Extract<LockerverseCustomField, { type: \"text\" | \"textarea\" }>;\n}) {\n const commonProps = {\n \"aria-describedby\": error ? errorId : undefined,\n \"aria-invalid\": error ? (\"true\" as const) : undefined,\n id: controlId,\n name: `custom:${field.id}`,\n onChange: (\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n ) => onChange(event.currentTarget.value),\n required: field.required,\n value: getStringValue(value),\n };\n return field.type === \"textarea\" ? (\n <FormField\n error={error}\n errorId={errorId}\n id={controlId}\n label={field.label}\n >\n <textarea {...commonProps} className=\"lockerverse-form__control\" />\n </FormField>\n ) : (\n <TextField\n {...commonProps}\n error={error}\n errorId={errorId}\n label={field.label}\n />\n );\n}\n\nfunction SelectCustomField({\n controlId,\n error,\n errorId,\n field,\n onChange,\n value,\n}: ControlProps & {\n field: LockerverseMultiOptionCustomField | LockerverseSingleOptionCustomField;\n}) {\n return (\n <FormField\n error={error}\n errorId={errorId}\n id={controlId}\n label={field.label}\n >\n <select\n aria-describedby={error ? errorId : undefined}\n aria-invalid={error ? \"true\" : undefined}\n className=\"lockerverse-form__control\"\n id={controlId}\n multiple={field.type === \"multi_select\"}\n name={`custom:${field.id}`}\n onChange={(event) =>\n onChange(\n field.type === \"multi_select\"\n ? [...event.currentTarget.selectedOptions].map(\n (option) => option.value\n )\n : event.currentTarget.value\n )\n }\n required={field.required}\n value={\n value === true || value === false\n ? \"\"\n : (value ?? (field.type === \"multi_select\" ? [] : \"\"))\n }\n >\n {field.type === \"select\" ? <option value=\"\">Select…</option> : null}\n {field.options.map((option) => (\n <option key={option.id} value={option.id}>\n {option.label}\n </option>\n ))}\n </select>\n </FormField>\n );\n}\n\nfunction ChoiceCustomField({\n choiceClassName,\n controlId,\n error,\n errorClassName,\n errorId,\n field,\n onChange,\n value,\n}: ControlProps & {\n field: LockerverseMultiOptionCustomField | LockerverseSingleOptionCustomField;\n}) {\n const selectedValues = Array.isArray(value) ? value : [];\n return (\n <fieldset\n aria-describedby={error ? errorId : undefined}\n aria-invalid={error ? \"true\" : undefined}\n >\n <legend>{field.label}</legend>\n {field.options.map((option, index) => (\n <label className={choiceClassName} key={option.id}>\n <input\n checked={\n Array.isArray(value)\n ? value.includes(option.id)\n : value === option.id\n }\n className={\n field.type === \"checkboxes\"\n ? \"lockerverse-form__checkbox\"\n : undefined\n }\n id={`${controlId}-${index}`}\n name={`custom:${field.id}`}\n onChange={(event) => {\n if (field.type === \"radio\") {\n onChange(option.id);\n return;\n }\n onChange(\n event.currentTarget.checked\n ? [...selectedValues, option.id]\n : selectedValues.filter((id) => id !== option.id)\n );\n }}\n required={field.required && field.type === \"radio\"}\n type={field.type === \"radio\" ? \"radio\" : \"checkbox\"}\n value={option.id}\n />\n <span>{option.label}</span>\n </label>\n ))}\n <FieldError className={errorClassName} error={error} id={errorId} />\n </fieldset>\n );\n}\n","export function FormSkeleton({\n fieldCount,\n label,\n sectionCount = 0,\n showCheckbox = false,\n}: {\n fieldCount: number;\n label: string;\n sectionCount?: number;\n showCheckbox?: boolean;\n}) {\n return (\n <div className=\"lockerverse-form-skeleton__loading\">\n <span className=\"lockerverse-form-skeleton__sr-only\" role=\"status\">\n {label}\n </span>\n <div aria-hidden=\"true\" className=\"lockerverse-form-skeleton\">\n <div className=\"lockerverse-form-skeleton__branding\">\n <span className=\"lockerverse-form-skeleton__avatar\" />\n <span className=\"lockerverse-form-skeleton__community\" />\n </div>\n <div className=\"lockerverse-form-skeleton__fields\">\n {Array.from({ length: fieldCount }, (_, index) => (\n <div className=\"lockerverse-form-skeleton__field\" key={index}>\n <span className=\"lockerverse-form-skeleton__label\" />\n <span className=\"lockerverse-form-skeleton__input\" />\n </div>\n ))}\n </div>\n {Array.from({ length: sectionCount }, (_, index) => (\n <div className=\"lockerverse-form-skeleton__section\" key={index}>\n <span className=\"lockerverse-form-skeleton__section-label\" />\n <div className=\"lockerverse-form-skeleton__section-content\">\n <span className=\"lockerverse-form-skeleton__section-full\" />\n <div className=\"lockerverse-form-skeleton__section-grid\">\n <span className=\"lockerverse-form-skeleton__section-half\" />\n <span className=\"lockerverse-form-skeleton__section-half\" />\n </div>\n </div>\n </div>\n ))}\n <div className=\"lockerverse-form-skeleton__actions\">\n {showCheckbox ? (\n <span className=\"lockerverse-form-skeleton__check-line\" />\n ) : null}\n <span className=\"lockerverse-form-skeleton__button\" />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"form-skeleton.js","names":[],"sources":["../src/custom-fields.tsx","../src/form-skeleton.tsx"],"sourcesContent":["import type {\n LockerverseBooleanCustomField,\n LockerverseCustomField,\n LockerverseCustomFieldAnswer,\n LockerverseMultiOptionCustomField,\n LockerverseSingleOptionCustomField,\n} from \"@lockerverse/sdk/checkout\";\nimport {\n array,\n minLength,\n nonEmpty,\n pipe,\n safeParse,\n string,\n trim,\n} from \"valibot\";\nimport { Checkbox, FieldError, FormField, TextField } from \"./form-field.tsx\";\n\nexport type CustomFieldValues = Record<string, boolean | string | string[]>;\n\nfunction createCustomFieldValue(field: LockerverseCustomField) {\n if (field.type === \"checkbox\") {\n return false;\n }\n if (field.type === \"checkboxes\" || field.type === \"multi_select\") {\n return [];\n }\n return \"\";\n}\n\nexport function createCustomFieldValues(fields: LockerverseCustomField[]) {\n const values: CustomFieldValues = {};\n for (const field of fields) {\n values[field.id] = createCustomFieldValue(field);\n }\n return values;\n}\n\nexport function reconcileCustomFieldValues(\n fields: LockerverseCustomField[],\n values: CustomFieldValues\n) {\n const next: CustomFieldValues = {};\n for (const field of fields) {\n const value = values[field.id];\n next[field.id] = reconcileCustomFieldValue(field, value);\n }\n const oldKeys = Object.keys(values);\n if (\n oldKeys.length === fields.length &&\n fields.every((field) => {\n const before = values[field.id];\n const after = next[field.id];\n return (\n Object.hasOwn(values, field.id) && sameCustomFieldValue(before, after)\n );\n })\n ) {\n return values;\n }\n return next;\n}\n\nfunction reconcileCustomFieldValue(\n field: LockerverseCustomField,\n value: CustomFieldValues[string] | undefined\n) {\n if (field.type === \"checkbox\") {\n return value === true;\n }\n if (field.type === \"checkboxes\" || field.type === \"multi_select\") {\n const optionIds = new Set(field.options.map((option) => option.id));\n return Array.isArray(value) ? value.filter((id) => optionIds.has(id)) : [];\n }\n const text = getStringValue(value);\n if (field.type === \"radio\" || field.type === \"select\") {\n return field.options.some((option) => option.id === text) ? text : \"\";\n }\n return text;\n}\n\nfunction sameCustomFieldValue(\n before: CustomFieldValues[string] | undefined,\n after: CustomFieldValues[string] | undefined\n) {\n if (Array.isArray(before) && Array.isArray(after)) {\n return (\n before.length === after.length &&\n before.every((id, index) => id === after[index])\n );\n }\n return before === after;\n}\n\nfunction getStringValue(value: CustomFieldValues[string] | undefined) {\n const result = safeParse(string(), value);\n return result.success ? result.output : \"\";\n}\n\nexport function buildCustomFieldAnswers(\n fields: LockerverseCustomField[],\n values: CustomFieldValues\n): LockerverseCustomFieldAnswer[] {\n return fields.map((field): LockerverseCustomFieldAnswer => {\n const value = values[field.id];\n if (field.type === \"checkbox\") {\n return { fieldId: field.id, value: value === true };\n }\n if (field.type === \"checkboxes\" || field.type === \"multi_select\") {\n return { fieldId: field.id, value: Array.isArray(value) ? value : [] };\n }\n return {\n fieldId: field.id,\n value: getStringValue(value),\n };\n });\n}\n\nexport function validateCustomFields(\n fields: LockerverseCustomField[],\n values: CustomFieldValues\n) {\n const errors: Record<string, string> = {};\n for (const field of fields) {\n if (!field.required) {\n continue;\n }\n const message = `${field.label} is required.`;\n const value = values[field.id];\n if (field.type === \"checkbox\") {\n if (value !== true) {\n errors[field.id] = message;\n }\n continue;\n }\n const result =\n field.type === \"checkboxes\" || field.type === \"multi_select\"\n ? safeParse(pipe(array(string()), minLength(1, message)), value ?? [])\n : safeParse(\n pipe(string(), trim(), nonEmpty(message)),\n getStringValue(value)\n );\n if (!result.success) {\n errors[field.id] = result.issues[0]?.message ?? message;\n }\n }\n return errors;\n}\n\nexport function CustomFields({\n choiceClassName,\n errorClassName,\n errors,\n fields,\n idPrefix,\n onChange,\n values,\n}: {\n choiceClassName: string;\n errorClassName: string;\n errors: Record<string, string>;\n fields: LockerverseCustomField[];\n idPrefix: string;\n onChange: (values: CustomFieldValues) => void;\n values: CustomFieldValues;\n}) {\n return fields.map((field) => (\n <CustomField\n choiceClassName={choiceClassName}\n error={errors[field.id]}\n errorClassName={errorClassName}\n field={field}\n idPrefix={idPrefix}\n key={field.id}\n onChange={(value) => onChange({ ...values, [field.id]: value })}\n value={values[field.id]}\n />\n ));\n}\n\ntype CustomFieldProps = {\n choiceClassName: string;\n error: string | undefined;\n errorClassName: string;\n field: LockerverseCustomField;\n idPrefix: string;\n onChange: (value: boolean | string | string[]) => void;\n value: boolean | string | string[] | undefined;\n};\n\nfunction CustomField(props: CustomFieldProps) {\n const { field, idPrefix } = props;\n const controlId = `${idPrefix}-custom-${field.id}`;\n const errorId = `${controlId}-error`;\n const controlProps = { ...props, controlId, errorId };\n switch (field.type) {\n case \"checkbox\":\n return <BooleanCustomField {...controlProps} field={field} />;\n case \"text\":\n case \"textarea\":\n return <TextCustomField {...controlProps} field={field} />;\n case \"select\":\n case \"multi_select\":\n return <SelectCustomField {...controlProps} field={field} />;\n case \"radio\":\n case \"checkboxes\":\n return <ChoiceCustomField {...controlProps} field={field} />;\n default:\n return null;\n }\n}\n\nfunction BooleanCustomField({\n choiceClassName,\n controlId,\n error,\n errorClassName,\n errorId,\n field,\n onChange,\n value,\n}: ControlProps & { field: LockerverseBooleanCustomField }) {\n return (\n <label className={choiceClassName} htmlFor={controlId}>\n <Checkbox\n aria-describedby={error ? errorId : undefined}\n aria-invalid={error ? \"true\" : undefined}\n checked={value === true}\n id={controlId}\n name={`custom:${field.id}`}\n onChange={(event) => onChange(event.currentTarget.checked)}\n required={field.required}\n />\n <span>{field.label}</span>\n <FieldError className={errorClassName} error={error} id={errorId} />\n </label>\n );\n}\n\ntype ControlProps = CustomFieldProps & {\n controlId: string;\n errorId: string;\n};\n\nfunction TextCustomField({\n controlId,\n error,\n errorId,\n field,\n onChange,\n value,\n}: ControlProps & {\n field: Extract<LockerverseCustomField, { type: \"text\" | \"textarea\" }>;\n}) {\n const commonProps = {\n \"aria-describedby\": error ? errorId : undefined,\n \"aria-invalid\": error ? (\"true\" as const) : undefined,\n id: controlId,\n name: `custom:${field.id}`,\n onChange: (\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n ) => onChange(event.currentTarget.value),\n required: field.required,\n value: getStringValue(value),\n };\n return field.type === \"textarea\" ? (\n <FormField\n error={error}\n errorId={errorId}\n id={controlId}\n label={field.label}\n >\n <textarea {...commonProps} className=\"lockerverse-form__control\" />\n </FormField>\n ) : (\n <TextField\n {...commonProps}\n error={error}\n errorId={errorId}\n label={field.label}\n />\n );\n}\n\nfunction SelectCustomField({\n controlId,\n error,\n errorId,\n field,\n onChange,\n value,\n}: ControlProps & {\n field: LockerverseMultiOptionCustomField | LockerverseSingleOptionCustomField;\n}) {\n return (\n <FormField\n error={error}\n errorId={errorId}\n id={controlId}\n label={field.label}\n >\n <select\n aria-describedby={error ? errorId : undefined}\n aria-invalid={error ? \"true\" : undefined}\n className=\"lockerverse-form__control\"\n id={controlId}\n multiple={field.type === \"multi_select\"}\n name={`custom:${field.id}`}\n onChange={(event) =>\n onChange(\n field.type === \"multi_select\"\n ? [...event.currentTarget.selectedOptions].map(\n (option) => option.value\n )\n : event.currentTarget.value\n )\n }\n required={field.required}\n value={\n value === true || value === false\n ? \"\"\n : (value ?? (field.type === \"multi_select\" ? [] : \"\"))\n }\n >\n {field.type === \"select\" ? <option value=\"\">Select…</option> : null}\n {field.options.map((option) => (\n <option key={option.id} value={option.id}>\n {option.label}\n </option>\n ))}\n </select>\n </FormField>\n );\n}\n\nfunction ChoiceCustomField({\n choiceClassName,\n controlId,\n error,\n errorClassName,\n errorId,\n field,\n onChange,\n value,\n}: ControlProps & {\n field: LockerverseMultiOptionCustomField | LockerverseSingleOptionCustomField;\n}) {\n const selectedValues = Array.isArray(value) ? value : [];\n return (\n <fieldset\n aria-describedby={error ? errorId : undefined}\n aria-invalid={error ? \"true\" : undefined}\n >\n <legend>{field.label}</legend>\n {field.options.map((option, index) => (\n <label className={choiceClassName} key={option.id}>\n <input\n checked={\n Array.isArray(value)\n ? value.includes(option.id)\n : value === option.id\n }\n className={\n field.type === \"checkboxes\"\n ? \"lockerverse-form__checkbox\"\n : undefined\n }\n id={`${controlId}-${index}`}\n name={`custom:${field.id}`}\n onChange={(event) => {\n if (field.type === \"radio\") {\n onChange(option.id);\n return;\n }\n onChange(\n event.currentTarget.checked\n ? [...selectedValues, option.id]\n : selectedValues.filter((id) => id !== option.id)\n );\n }}\n required={field.required && field.type === \"radio\"}\n type={field.type === \"radio\" ? \"radio\" : \"checkbox\"}\n value={option.id}\n />\n <span>{option.label}</span>\n </label>\n ))}\n <FieldError className={errorClassName} error={error} id={errorId} />\n </fieldset>\n );\n}\n","export function FormSkeleton({\n fieldCount,\n label,\n sectionCount = 0,\n showCheckbox = false,\n}: {\n fieldCount: number;\n label: string;\n sectionCount?: number;\n showCheckbox?: boolean;\n}) {\n return (\n <div className=\"lockerverse-form-skeleton__loading\">\n <span className=\"lockerverse-form-skeleton__sr-only\" role=\"status\">\n {label}\n </span>\n <div aria-hidden=\"true\" className=\"lockerverse-form-skeleton\">\n <div className=\"lockerverse-form-skeleton__branding\">\n <span className=\"lockerverse-form-skeleton__avatar\" />\n <span className=\"lockerverse-form-skeleton__community\" />\n </div>\n <div className=\"lockerverse-form-skeleton__fields\">\n {Array.from({ length: fieldCount }, (_, index) => (\n <div className=\"lockerverse-form-skeleton__field\" key={index}>\n <span className=\"lockerverse-form-skeleton__label\" />\n <span className=\"lockerverse-form-skeleton__input\" />\n </div>\n ))}\n </div>\n {Array.from({ length: sectionCount }, (_, index) => (\n <div className=\"lockerverse-form-skeleton__section\" key={index}>\n <span className=\"lockerverse-form-skeleton__section-label\" />\n <div className=\"lockerverse-form-skeleton__section-content\">\n <span className=\"lockerverse-form-skeleton__section-full\" />\n <div className=\"lockerverse-form-skeleton__section-grid\">\n <span className=\"lockerverse-form-skeleton__section-half\" />\n <span className=\"lockerverse-form-skeleton__section-half\" />\n </div>\n </div>\n </div>\n ))}\n <div className=\"lockerverse-form-skeleton__actions\">\n {showCheckbox ? (\n <span className=\"lockerverse-form-skeleton__check-line\" />\n ) : null}\n <span className=\"lockerverse-form-skeleton__button\" />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { n as LockerverseTheme, t as LockerverseStyle } from "./theme.js";
2
- import { n as useLockerverseWidget, t as UseLockerverseWidgetResult } from "./use-lockerverse-widget.js";
2
+ import { n as UseLockerverseWidgetResult, r as useLockerverseWidget, t as UseLockerverseWidgetOptions } from "./use-lockerverse-widget.js";
3
3
  import { a as LockerversePaymentRecovery, c as LockerversePaymentTheme, i as LockerversePaymentProps, l as LockerversePaymentUncertain, n as LockerverseDonateLauncherProps, o as LockerversePaymentSelectionItem, r as LockerversePaymentBranding, s as LockerversePaymentStyle, t as LockerverseDonateLauncherPosition, u as LockerverseStripeLoader } from "./types.js";
4
4
  import { t as LockerverseDonateLauncher } from "./lockerverse-donate-launcher.js";
5
5
  import { n as LockerversePayment, t as preloadLockerversePayment } from "./payment-form.js";
6
6
  import { LockerversePaymentCompletion } from "@lockerverse/sdk/checkout";
7
- export { LockerverseDonateLauncher, type LockerverseDonateLauncherPosition, type LockerverseDonateLauncherProps, LockerversePayment, type LockerversePaymentBranding, type LockerversePaymentCompletion, type LockerversePaymentProps, type LockerversePaymentRecovery, type LockerversePaymentSelectionItem, type LockerversePaymentStyle, type LockerversePaymentTheme, type LockerversePaymentUncertain, type LockerverseStripeLoader, type LockerverseStyle, type LockerverseTheme, type UseLockerverseWidgetResult, preloadLockerversePayment, useLockerverseWidget };
7
+ export { LockerverseDonateLauncher, type LockerverseDonateLauncherPosition, type LockerverseDonateLauncherProps, LockerversePayment, type LockerversePaymentBranding, type LockerversePaymentCompletion, type LockerversePaymentProps, type LockerversePaymentRecovery, type LockerversePaymentSelectionItem, type LockerversePaymentStyle, type LockerversePaymentTheme, type LockerversePaymentUncertain, type LockerverseStripeLoader, type LockerverseStyle, type LockerverseTheme, type UseLockerverseWidgetOptions, type UseLockerverseWidgetResult, preloadLockerversePayment, useLockerverseWidget };
@@ -1,2 +1,2 @@
1
- import{t as e}from"./format-money.js";import{a as t,d as n,f as r,m as i,n as a,r as o,t as s}from"./host-callback.js";import{i as c,n as l,r as u,t as d}from"./stripe-loader.js";import{n as f,t as p}from"./accent-contrast.js";import{a as m,i as h,n as g,r as _,t as v}from"./form-skeleton.js";import{useCallback as y,useEffect as b,useId as x,useLayoutEffect as S,useMemo as C,useReducer as w,useRef as T,useState as E}from"react";import{Fragment as D,jsx as O,jsxs as k}from"react/jsx-runtime";import{AddressElement as A,Elements as j,PaymentElement as M,useElements as N,useStripe as P}from"@stripe/react-stripe-js";import{array as F,minLength as I,minValue as L,nonEmpty as R,number as z,pipe as B,regex as ee,safeInteger as te,safeParse as V,strictObject as H,string as ne,trim as U,union as re}from"valibot";import{LockerverseSdkError as W,estimateLockerverseCheckout as ie}from"@lockerverse/sdk/checkout";function ae({ariaDescribedBy:e,ariaLabel:t,ariaLabelledBy:n,className:r,id:i,invalid:a=!1,name:o,onValueChange:s,options:c,value:l}){return O(`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=>O(`option`,{value:e.value,children:e.label},e.value))})}const G=[`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`],oe=[`15`,`12`,`10`,`5`],K=[...oe,`custom`];function se({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 k(`div`,{className:`lockerverse-payment__tip-box`,children:[O(`p`,{children:`Add a tip to support the Lockerverse platform`}),k(`div`,{"aria-label":`Tip amount`,role:`radiogroup`,children:[oe.map(e=>k(`label`,{className:`lockerverse-payment__tip-choice`,children:[O(`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}),k(`span`,{children:[e,`%`]})]},e)),k(`label`,{className:`lockerverse-payment__tip-choice`,children:[O(`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`}),O(`span`,{children:`Other`})]})]}),i.tipPercent===`custom`?k(`label`,{children:[O(`span`,{children:`Custom tip`}),k(`span`,{className:`lockerverse-payment__money-input`,children:[O(`span`,{"aria-hidden":`true`,children:`$`}),O(`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?O(`span`,{className:`lockerverse-payment__field-message`,id:n,children:t}):null]}):O(`input`,{name:`tip`,type:`hidden`,value:i.tipPercent})]})}function q({checked:e,children:t,name:r,onChange:i}){let a=x();return k(`label`,{className:`lockerverse-payment__check-row`,htmlFor:a,children:[O(n,{checked:e,id:a,name:r,onChange:e=>i(e.currentTarget.checked)}),O(`span`,{children:t})]})}function ce({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 k(`div`,{className:`lockerverse-payment__additional-fields`,children:[n.memberId?k(`label`,{children:[O(`span`,{children:a?.trim()||`Member ID`}),O(`input`,{name:`memberId`,onChange:e=>u({memberId:e.currentTarget.value}),placeholder:`Optional`,value:l.memberId})]}):null,n.merchSize?k(`div`,{className:`lockerverse-payment__field`,children:[O(`span`,{id:`${r}-merch-size-label`,children:`Size`}),O(ae,{ariaLabelledBy:`${r}-merch-size-label`,name:`merchSize`,onValueChange:e=>{let t=G.find(t=>t===e);t&&u({merchSize:t})},options:G.map(e=>({label:e,value:e})),value:l.merchSize})]}):null,n.promoCode?k(`div`,{className:`lockerverse-payment__field`,children:[O(`span`,{id:`${r}-promo-code-label`,children:`Promo code`}),k(`div`,{className:`lockerverse-payment__promo-control`,children:[O(`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}),O(`button`,{disabled:!l.promoCode.trim()||i,onClick:s,type:`button`,children:i?`Applying…`:`Apply`})]}),c?O(`p`,{className:`lockerverse-payment__field-message`,id:`${r}-promo-code-error`,role:`alert`,children:c}):null]}):null,O(g,{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 le({amountCents:t,enabled:n,onChange:r,values:i}){return n?k(q,{checked:i.includeServiceFee,name:`includeServiceFee`,onChange:e=>r({...i,includeServiceFee:e}),children:[`Add `,e(t),` to help cover processing fees`]}):null}function ue(e){return{error:void 0,message:void 0,status:e?`recovering`:`editing`}}function J(e,t,n){return t.includes(e.status)?{...e,...n}:e}function Y(e,t){if(e.status===`sold_out`||e.status===`succeeded`||e.status===`unresolved`)return e;switch(t.type){case`field_changed`:return J(e,[`editing`,`invalid`,`refreshing_quote`],{error:void 0,status:`editing`});case`validation_failed`:return J(e,[`editing`],{status:`invalid`});case`quote_refresh_started`:return J(e,[`editing`,`invalid`],{status:`refreshing_quote`});case`quote_refresh_succeeded`:return J(e,[`refreshing_quote`],{error:void 0,status:`editing`});case`quote_refresh_failed`:return J(e,[`refreshing_quote`],{error:t.error??e.error,status:`editing`});case`submission_started`:return J(e,[`editing`,`invalid`,`refreshing_quote`],{error:void 0,status:`submitting`});case`submission_validation_failed`:return J(e,[`submitting`],{error:void 0,status:`invalid`});case`quote_changed`:return J(e,[`submitting`],{status:`editing`});case`retryable_failure`:return J(e,[`editing`,`invalid`,`submitting`],{error:t.error,status:`editing`});case`recovery_failed`:return J(e,[`recovering`],{error:t.error,status:`editing`});case`sold_out`:return{error:void 0,message:void 0,status:`sold_out`};case`succeeded`:return J(e,[`recovering`,`submitting`],{message:t.message,status:`succeeded`});case`unresolved`:return J(e,[`recovering`,`submitting`],{message:t.message,status:`unresolved`});default:return e}}function de(e){return e.status===`editing`||e.status===`invalid`||e.status===`refreshing_quote`?e.error:void 0}function fe(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`:de(e)?`error`:`idle`}function pe(e){return e.status===`submitting`}const X=[`amountCents`,`discountableSubtotalCents`,`discountCents`,`serviceFeeCents`,`subtotalCents`,`tipCents`,`totalCents`],me=[`discountableSubtotalCents`,`discountCents`,`subtotalCents`];function he(e,t,n,r){return(n===t.totalCents?me:X).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 ge(e){return e.checkoutStatus===`success`?{kind:`success`,payment:e}:e.checkoutStatus===`failed`?{kind:`failed`,payment:e}:{kind:`unresolved`,paymentReference:e.paymentReference,reason:e.checkoutStatus===`action_required`?`action_required`:`pending`}}async function _e(e,t,n){if(t.checkoutStatus!==`action_required`)return ge(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 ge(await e.getPaymentStatus(t.paymentReference))}catch{return{kind:`unresolved`,paymentReference:t.paymentReference,reason:`action_required`}}}async function ve(e,t,n){let r;try{r=await e.submitPayment(t)}catch(n){if(!(n instanceof W&&n.recoveryRecommended))throw n;try{r=await e.getPaymentStatus(t.checkout.paymentReference)}catch{return{kind:`unresolved`,paymentReference:t.checkout.paymentReference,reason:`recovery_failed`}}}return _e(e,r,n)}async function ye(e,t,n){try{return _e(e,await e.getPaymentStatus(t),n)}catch{return{kind:`unresolved`,paymentReference:t,reason:`recovery_failed`}}}const be=B(ne(),U(),R()),xe=B(z(),te(),L(1)),Se=B(F(re([H({amountCents:xe,productSlug:be}),H({productSlug:be,quantity:xe}),H({productSlug:be})])),I(1)),Z=B(ne(),U(),ee(/^(?:0|[1-9]\d*)(?:\.\d{1,2})?$/,`Enter a valid tip amount.`));function Ce(e){let t=V(Z,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 we(e){let t=V(Se,e);return t.success?{success:!0,value:t.output}:{message:`Lockerverse payment configuration is invalid.`,success:!1}}const Te=`This promo code is invalid or cannot be applied.`;function Ee(e,t){return t.tipPercent===`custom`?t.customTip.trim()?Ce(t.customTip):{cents:0,success:!0}:{cents:Math.round(e*Number(t.tipPercent)/100),success:!0}}function De(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 Oe(e,t,n){let r=e.widget.fields.tipping?Ee(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 ke(e,t){return{displayedTotalCents:e.totalCents,promoError:t&&e.appliedDiscount?.source!==`promo_code`?Te:void 0}}function Ae(e,t){let n;return t||(n=e instanceof Error?e.message:`The order total could not be updated.`),{paymentError:n,promoError:t?Te:void 0}}function je(e,t){if(!e?.complete)throw Error(`${t} address is required.`);return e.value}function Me(e,t,n,r){if(e.widget.fields.shipping)return t.shippingMatchesBilling?n:je(r.shipping,`Shipping`)}function Ne({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 Pe({catalog:e,confirmationToken:t,email:n,fieldValues:r,metadata:i,phone:a,shippingAddress:o}){let s={customFieldAnswers:_(e.widget.customFields,r.customFields),email:n};if(t&&(s.confirmationToken=t),i&&(s.metadata=i),e.widget.fields.memberId&&r.memberId.trim()&&(s.memberId=r.memberId.trim()),e.widget.fields.merchSize&&(s.merchSize=r.merchSize),e.widget.fields.phone&&(s.phone=a),o){let e={city:o.address.city??``,country:o.address.country,line1:o.address.line1??``,postal_code:o.address.postal_code??``,state:o.address.state??``};o.address.line2&&(e.line2=o.address.line2),s.shipping={address:e,name:o.name}}return s}function Q(e){if(!e())throw Error(`Payment component is no longer active.`)}function Fe(e,t){s(e,t)}function Ie(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}:{email:n,kind:`payment`,payment:e.payment,quote:t}}async function Le({addresses:e,catalog:t,checkoutItems:n,client:r,elements:i,email:a,fieldValues:o,isAttemptActive:s,locallyPreviewedTotalCents:c,metadata:l,onPaymentRecoveryChange:d,phone:f,quote:p,stripe:m,stripeConnectedAccountId:h}){let g=a.trim().toLowerCase(),_=u(f),v=Ee(p.subtotalCents,o);if(!v.success)throw Error(v.message);let y=await r.calculateTotal({...De(t,o,g,v.cents),catalog:t,items:n});if(Q(s),y.totalCents>0&&he(p,y,c,h))return{kind:`quote_changed`,quote:y};let b,x;if(y.totalCents===0)t.widget.fields.shipping&&(b=Me(t,o,je(e.billing,`Billing`),e));else{if(!(i&&m))throw Error(`Payment form is still loading.`);await i.update({amount:y.totalCents}),Q(s);let n=await i.submit();if(Q(s),n.error)throw Error(n.error.message);let r=je(e.billing,`Billing`);b=Me(t,o,r,e);let a=await m.createConfirmationToken({elements:i,params:Ne({billingAddress:r,catalog:t,email:g,phone:_,shippingAddress:b})});if(Q(s),a.error)throw Error(a.error.message);x=a.confirmationToken.id}Fe(d,{connectedAccountId:y.payment.connectedAccountId,paymentReference:y.paymentReference});let S=await ve(r,{checkout:y,submission:Pe({catalog:t,confirmationToken:x,email:g,fieldValues:o,metadata:l,phone:_,shippingAddress:b})},m);return Q(s),Ie(S,y,g,y.totalCents===0?`Order could not be completed. Review the details and try again.`:`Payment was declined. Check your payment details and try again.`)}function Re(e,t){s(e,t)}function ze(e,t){s(e,t)}function Be(e,t){return{...e,...t}}function Ve(e,t,n){return e.kind===`unresolved`&&e.reason===`action_required`&&!t&&!n}function He(e){return e instanceof W&&e.serverCode===`PAYMENT_WIDGET_SALES_LIMIT_REACHED`}function Ue({nextQuote:e,onQuoteChange:t,setDisplayedTotalCents:n,setPromoError:r,updateState:i,validatePromo:a}){let o=ke(e,a);i({type:`quote_refresh_succeeded`}),n(o.displayedTotalCents),t(e),a&&r(o.promoError)}function We({error:e,setPromoError:t,updateState:n,validatePromo:r}){let i=Ae(e,r);r&&t(i.promoError),n(i.paymentError===void 0?{type:`quote_refresh_failed`}:{error:i.paymentError,type:`quote_refresh_failed`})}function Ge({onPaymentComplete:t,onPaymentRecoveryChange:n,onPaymentUncertain:r,onQuoteChange:i,result:a,setDisplayedTotalCents:o,dispatchState:c}){if(a.kind===`quote_changed`){let t=`The total changed to ${e(a.quote.totalCents)}. Review it and pay again.`;i(a.quote,t),o(a.quote.totalCents),c({type:`quote_changed`});return}if(a.kind===`payment_failed`){Re(n,null),c({error:a.message,type:`retryable_failure`});return}if(a.kind===`payment_unresolved`){c({message:`Payment is still processing. Do not submit it again.`,type:`unresolved`}),ze(r,{paymentReference:a.paymentReference,reason:a.reason});return}i(a.quote),Re(n,null),c({message:a.payment.paymentRequired?`Payment completed successfully.`:`Order confirmed. No payment was required.`,type:`succeeded`}),s(t,Be(a.payment,{email:a.email,lineItems:a.quote.lineItems}))}function Ke(e){let{catalog:n,checkoutItems:r,client:i,elements:a,email:o,fieldValues:l,metadata:u,onPaymentComplete:d,onResumePaymentFailed:f,onPaymentRecoveryChange:p,onPaymentUncertain:m,onQuoteChange:h,onStateChange:g,quote:_,resumePayment:v,stripe:x,stripeConnectedAccountId:S,stripeLoadFailed:C,paymentState:w,updateState:D}=e,[O,k]=E(_.totalCents),[A,j]=E(),M=T(!1),N=T(0),P=T(0),F=y(e=>D(e,!0),[D]),I=y(()=>{let e=P.current+1;return P.current=e,()=>P.current===e},[]);b(()=>()=>{P.current+=1,N.current+=1},[]);let{parsedTip:L,totalCents:R}=Oe(n,l,_);b(()=>{R!==null&&(k(R),R>0&&a?.update({amount:R}))},[n.pricingPolicy.serviceFeeRateBasisPoints,n.widget.fields.serviceFee,a,l.includeServiceFee,R,_.serviceFeeCents,_.tipCents,_.totalCents,_.subtotalCents]),b(()=>{if(!v||M.current||w.status!==`recovering`)return;M.current=!0;let e=I();return g(fe(w)),ye(i,v.paymentReference,x).then(t=>{if(e()&&!Ve(t,x,C)){if(t.kind===`failed`){Re(p,null),f(),F({error:`The previous payment failed. Check your details and try again.`,type:`recovery_failed`});return}if(t.kind===`unresolved`){F({message:`Payment is still processing. Do not submit it again.`,type:`unresolved`}),ze(m,{paymentReference:t.paymentReference,reason:t.reason});return}Re(p,null),F({message:t.payment.paymentRequired?`Payment completed successfully.`:`Order confirmed. No payment was required.`,type:`succeeded`}),s(d,Be(t.payment,{email:null,lineItems:null}))}}),()=>{e()&&(P.current+=1),M.current=!1}},[i,d,f,p,m,g,v,x,C,I,F,w]);let z=y((e=!1,t=!1)=>{t||(N.current+=1),e&&j(void 0),D({type:`field_changed`})},[D]);async function B(e=!1,t=!1){let a=o.trim().toLowerCase(),s=c({email:a,phone:``},!1);if(!(L.success&&(s.value||e)))return;N.current+=1;let u=N.current;D({type:`quote_refresh_started`});try{let e=await i.calculateTotal({...De(n,l,s.value?.email??``,L.cents),catalog:n,items:r});if(u!==N.current)return;Ue({nextQuote:e,onQuoteChange:h,setDisplayedTotalCents:k,setPromoError:j,updateState:D,validatePromo:t})}catch(e){if(u!==N.current)return;if(He(e)){D({type:`sold_out`});return}We({error:e,setPromoError:j,updateState:D,validatePromo:t})}}async function ee(){j(void 0),await B(!0,!0)}async function te({addresses:e,phone:s}){F({type:`submission_started`});let c=I();try{let t=await Le({addresses:e,catalog:n,checkoutItems:r,client:i,elements:a,email:o,fieldValues:l,isAttemptActive:c,locallyPreviewedTotalCents:O,metadata:u,onPaymentRecoveryChange:p,phone:s,quote:_,stripe:x,stripeConnectedAccountId:S});if(!c())return;Ge({dispatchState:F,onPaymentComplete:d,onPaymentRecoveryChange:p,onPaymentUncertain:m,onQuoteChange:h,result:t,setDisplayedTotalCents:k})}catch(e){if(!c())return;if(Re(p,null),He(e)){F({type:`sold_out`});return}let n=e instanceof W?t(e.serverCode):void 0;if(n)return F({type:`submission_validation_failed`}),{phoneError:n};F({error:e instanceof Error?e.message:`Payment could not be completed.`,type:`retryable_failure`})}}let V=w.status===`succeeded`||w.status===`unresolved`?w.message:void 0;return{commands:{applyPromo:ee,fieldChanged:z,refreshAuthoritativeTotal:B,reportStripeLoadError:e=>F({error:e,type:`retryable_failure`}),reportValidationFailure:()=>F({type:`validation_failed`}),submit:te},state:{displayedTotalCents:O,isRecovering:w.status===`recovering`,isRefreshingQuote:w.status===`refreshing_quote`,isSubmitting:pe(w),parsedTip:L,paymentError:de(w),promoError:A,terminalMessage:V}}}const qe=d;function Je(e){let{connectedAccountId:t,publishableKey:n}=e.payment;return qe(n,t?{stripeAccount:t}:void 0)}function Ye(e){return e===`monthly`?{interval:`month`,label:`Monthly`}:e===`annually`?{interval:`year`,label:`Annual`}:null}function Xe(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 Ze({accentColor:e,catalog:t,checkoutItems:n,client:r,appearanceRoot:i,metadata:a,onPaymentComplete:o,onResumePaymentFailed:s,onPaymentRecoveryChange:c,onPaymentUncertain:u,onQuoteChange:d,quote:f,resumePayment:p,onStateChange:m,stripeLoader:h,theme:g,visualStyle:_}){let[x,S]=E(()=>ue(!!p)),w=T(x);w.current=x;let D=y((e,t=!1)=>{let n=Y(w.current,e);n!==w.current&&(w.current=n,S(n),t&&m(fe(n)))},[m]),k=Xe(t,f,p),A=T({connectedAccountId:k,paymentOption:f.paymentOption});x.status!==`submitting`&&x.status!==`recovering`&&(A.current={connectedAccountId:k,paymentOption:f.paymentOption});let{connectedAccountId:M,paymentOption:N}=A.current,P=C(()=>h(t.payment.publishableKey,M?{stripeAccount:M}:void 0).catch(()=>null),[t.payment.publishableKey,M,h]),[F,I]=E(!1);b(()=>{let e=!0;return I(!1),P.then(t=>{e&&t===null&&I(!0)}),()=>{e=!1}},[P]);let L=l(i,g,_,x.status===`submitting`||x.status===`recovering`,e);return L?O(j,{options:{amount:Math.max(f.totalCents,100),appearance:L,currency:t.payment.currency,excludedPaymentMethodTypes:[`us_bank_account`],mode:N===`one-time`?`payment`:`subscription`,syncAddressCheckbox:`none`},stripe:P,children:O(ct,{catalog:t,checkoutItems:n,client:r,metadata:a,onPaymentComplete:o,onPaymentRecoveryChange:c,onPaymentUncertain:u,onQuoteChange:d,onResumePaymentFailed:s,onStateChange:m,paymentState:x,quote:f,resumePayment:p,stripeConnectedAccountId:M,stripeLoadFailed:F,updateState:D})},`${t.payment.publishableKey}:${M??`platform`}:${N}`):O(v,{fieldCount:3,label:`Loading payment form`})}function Qe({label:e}){return k(`div`,{className:`lockerverse-payment__stripe-loader`,role:`status`,children:[O(`p`,{children:e}),k(`div`,{"aria-hidden":`true`,children:[O(`span`,{}),O(`span`,{}),O(`span`,{})]})]})}function $e({onError:e,onReady:t,ready:n}){return k(`div`,{className:`lockerverse-payment__stripe-element`,"data-ready":n,children:[n?null:O(Qe,{label:`Loading payment form...`}),O(`div`,{className:`lockerverse-payment__stripe-mount`,children:O(M,{onLoadError:({error:t})=>e(t.message??`Payment form failed to load.`),onReady:t,options:{business:{name:`Lockerverse`},fields:{billingDetails:{address:`never`,email:`never`,name:`never`,phone:`never`}},layout:`tabs`,terms:{applePay:`auto`,auBecsDebit:`never`,bancontact:`never`,card:`always`,cashapp:`never`,googlePay:`never`,ideal:`never`,paypal:`auto`,sepaDebit:`never`,sofort:`never`,usBankAccount:`never`},wallets:{applePay:`auto`,googlePay:`never`}}})})]})}function et({label:e,mode:t,onChange:n,onError:r,onReady:i,ready:a}){return k(`div`,{className:`lockerverse-payment__address`,children:[O(`h2`,{children:e}),k(`div`,{className:`lockerverse-payment__stripe-element lockerverse-payment__stripe-element--address`,"data-ready":a,children:[a?null:O(Qe,{label:`Loading ${e.toLowerCase()}...`}),O(`div`,{className:`lockerverse-payment__stripe-mount`,children:O(A,{onChange:n,onLoadError:({error:t})=>r(t.message??`${e} failed to load.`),onReady:i,options:{autocomplete:{mode:`automatic`},mode:t}})})]})]})}function tt({message:e}){return e?O(`p`,{className:`lockerverse-payment__field-message`,role:`alert`,children:e}):null}function nt({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 k(D,{children:[f?O($e,{onError:c,onReady:()=>u(!0),ready:i}):null,f||e.widget.fields.shipping?O(et,{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?k(`div`,{className:`lockerverse-payment__shipping`,children:[O(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:O(et,{label:`Shipping address`,mode:`shipping`,onChange:e=>o(`shipping`,e),onError:c,onReady:()=>d(!0),ready:a})]}):null]})}function rt({displayedBaseCents:t,displayedTipCents:n,displayedTotalCents:r,quote:i}){let a=Ye(i.paymentOption),o=Math.max(0,t-i.subtotalCents+i.discountCents);return k(`section`,{"aria-label":`Payment summary`,className:`lockerverse-payment__payment-summary`,children:[O(`h2`,{children:`Order summary`}),O(`div`,{className:`lockerverse-payment__payment-summary-items`,children:i.lineItems.map(t=>k(`div`,{className:`lockerverse-payment__payment-summary-row`,children:[k(`span`,{children:[t.productName,t.quantity>1?k(D,{children:[` `,k(`small`,{children:[`× `,t.quantity]})]}):null,t.paymentOption===`monthly`?O(`small`,{children:` · Monthly`}):null,t.paymentOption===`annually`?O(`small`,{children:` · Annual`}):null]}),O(`strong`,{children:e(t.subtotalCents)})]},t.listingId))}),k(`div`,{className:`lockerverse-payment__payment-summary-totals`,children:[o>0?k(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-detail`,children:[O(`span`,{children:`Service fee`}),O(`strong`,{children:e(o)})]}):null,i.discountCents>0&&i.appliedDiscount?k(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-discount`,children:[k(`span`,{children:[i.appliedDiscount.source===`email_list`?`Email discount`:`Promo code discount`,` `,`(`,i.appliedDiscount.percentageOff,`% off)`]}),k(`strong`,{children:[`-`,e(i.discountCents)]})]}):null,n>0?k(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-detail lockerverse-payment__payment-summary-tip`,children:[O(`span`,{children:`Tip`}),O(`strong`,{children:e(n)})]}):null,k(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-total`,children:[O(`span`,{children:a?`${a.label} total`:`Total`}),O(`strong`,{children:e(r)})]})]})]})}function it({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=Ye(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)}`),k(`div`,{className:`lockerverse-payment__actions`,children:[O(le,{amountCents:l.serviceFeeCents||Math.round(l.subtotalCents*t.pricingPolicy.serviceFeeRateBasisPoints/1e4),enabled:t.widget.fields.serviceFee,onChange:c,values:r}),O(`button`,{"aria-busy":s,"aria-label":m,disabled:s||!d,type:`submit`,children:p})]})}function at(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 ot({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&&at(n,`custom:${o}`)}function st({email:e,emailDiscountPercentOff:t,emailErrorId:n,emailId:o,emailRef:s,errors:c,onEmailBlur:l,onEmailChange:u,onPhoneChange:d,phone:f,phoneCountry:p,phoneEnabled:m,phoneErrorId:h,phoneId:g,phoneRef:_}){return k(`div`,{className:`lockerverse-payment__contact`,children:[O(r,{error:c.email,errorId:n,id:o,label:`Email`,name:`email`,onBlur:l,onChange:e=>u(e.currentTarget.value),ref:s,required:!0,value:e}),t===void 0?null:k(`p`,{className:`lockerverse-payment__discount-message`,role:`status`,children:[`Your email qualifies for `,t,`% off.`]}),m?O(i,{error:c.phone,errorId:h,id:g,label:`Phone`,children:O(a,{country:p,error:c.phone,errorId:h,id:g,inputRef:_,name:`phone`,onChange:d,required:!0,value:f})}):null]})}function ct({catalog:e,checkoutItems:t,client:n,metadata:r,onPaymentComplete:i,onResumePaymentFailed:a,onPaymentRecoveryChange:s,onPaymentUncertain:l,onQuoteChange:u,onStateChange:d,quote:f,resumePayment:p,stripeConnectedAccountId:g,stripeLoadFailed:_,paymentState:v,updateState:y}){let[S,C]=E(``),[w,D]=E(``),[A,j]=E(`US`),[M,F]=E({}),[I,L]=E({}),[R,z]=E(),[B,ee]=E(!1),[te,V]=E(!1),[H,ne]=E(!1),[U,re]=E({customFields:h(e.widget.customFields),customTip:``,includeServiceFee:e.widget.fields.serviceFee,memberId:``,merchSize:`M`,promoCode:``,shippingMatchesBilling:!0,tipPercent:`10`}),W=T({billing:null,shipping:null}),ie=T(null),ae=T(null),G=T(null),oe=T(f.totalCents>0),K=Ke({catalog:e,checkoutItems:t,client:n,elements:N(),email:S,fieldValues:U,metadata:r,onPaymentComplete:i,onPaymentRecoveryChange:s,onPaymentUncertain:l,onQuoteChange:u,onResumePaymentFailed:a,onStateChange:d,paymentState:v,quote:f,resumePayment:p,stripe:P(),stripeConnectedAccountId:g,stripeLoadFailed:_,updateState:y}),{displayedTotalCents:q,isRecovering:le,isRefreshingQuote:ue,isSubmitting:J,parsedTip:Y,paymentError:de,promoError:fe,terminalMessage:pe}=K.state,X=`lockerverse-${x()}`,me=`${X}-email`,he=`${me}-error`,ge=`${X}-phone`,_e=`${ge}-error`,ve=`${X}-tip-error`,ye=(Y.success?Y.cents:null)??0,be=q-ye,xe=!e.widget.fields.shipping||U.shippingMatchesBilling||H;b(()=>{J&&G.current?.focus({preventScroll:!0})},[J]),b(()=>{J||M.email||!M.phone||ae.current?.focus()},[M.email,M.phone,J]),b(()=>{let e=q>0;e&&!oe.current&&(ee(!1),V(!1)),oe.current=e},[q]);function Se(e){K.commands.fieldChanged(!1,e!==`email`),F(t=>{let n={...t};return delete n[e],n})}function Z(e){let t=e.promoCode!==U.promoCode,n=e.includeServiceFee!==U.includeServiceFee;K.commands.fieldChanged(t,!(t||n)),re(e),L({}),z(void 0)}async function Ce(t){t.preventDefault();let n=e.widget.fields.phone?o(w,A):``,r=c({email:S,phone:n},e.widget.fields.phone),i=m(e.widget.customFields,U.customFields);if(!(r.value&&Y.success)||Object.keys(i).length>0){F(r.errors),L(i),z(Y.success?void 0:Y.message),K.commands.reportValidationFailure();let e=t.currentTarget;queueMicrotask(()=>{ot({customFieldErrors:i,emailRef:ie,form:e,parsedTipSuccess:Y.success,phoneRef:ae,validationErrors:r.errors})});return}F({}),L({});let a=await K.commands.submit({addresses:W.current,phone:n});a?.phoneError&&F({phone:a.phoneError})}return pe?O(`p`,{className:`lockerverse-payment__payment-status`,ref:G,role:`status`,tabIndex:-1,children:pe}):le?O(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:`Recovering payment…`}):k(`form`,{"aria-busy":J,className:`lockerverse-payment__form`,noValidate:!0,onSubmit:Ce,children:[O(`div`,{"data-lockerverse-input-region":``,inert:J?!0:void 0,children:k(`fieldset`,{className:`lockerverse-payment__input-fieldset`,disabled:J,children:[O(rt,{displayedBaseCents:be,displayedTipCents:ye,displayedTotalCents:q,quote:f}),O(se,{enabled:e.widget.fields.tipping,error:R,errorId:ve,onChange:Z,values:U}),O(st,{email:S,emailDiscountPercentOff:f.appliedDiscount?.source===`email_list`?f.appliedDiscount.percentageOff:void 0,emailErrorId:he,emailId:me,emailRef:ie,errors:M,onEmailBlur:()=>K.commands.refreshAuthoritativeTotal(),onEmailChange:e=>{C(e),Se(`email`)},onPhoneChange:({value:e,country:t})=>{D(e),j(t),Se(`phone`)},phone:w,phoneCountry:A,phoneEnabled:e.widget.fields.phone,phoneErrorId:_e,phoneId:ge,phoneRef:ae}),O(nt,{catalog:e,displayedTotalCents:q,fieldValues:U,isBillingAddressReady:te,isPaymentReady:B,isShippingAddressReady:H,onAddressChange:(e,t)=>{W.current[e]=t},onFieldValuesChange:Z,onStripeLoadError:K.commands.reportStripeLoadError,setIsBillingAddressReady:V,setIsPaymentReady:ee,setIsShippingAddressReady:ne}),O(ce,{customFields:e.widget.customFields,errors:I,fields:e.widget.fields,idPrefix:X,isPromoApplying:ue,memberIdLabel:e.community?.memberIdLabel,onApplyPromo:K.commands.applyPromo,onChange:Z,promoError:fe,values:U}),O(it,{catalog:e,displayedTotalCents:q,fieldValues:U,isBillingAddressReady:te,isPaymentReady:B,isRequiredShippingReady:xe,isSubmitting:J,onFieldValuesChange:Z,quote:f})]})}),J?O(`p`,{className:`lockerverse-payment__sr-only`,ref:G,role:`status`,tabIndex:-1,children:q===0?`Completing order…`:`Processing payment…`}):null,O(tt,{message:de})]})}function lt(){return O(v,{fieldCount:2,label:`Loading payment…`,sectionCount:2,showCheckbox:!0})}function ut(e,t){switch(t.type){case`loading`:return{phase:`loading`,revision:e.revision};case`ready`:return pt(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){return e===t}function dt({checkout:e}){return{displayedQuote:e,type:`ready`}}function ft(e){return e instanceof Error?e.message:`Lockerverse payment could not load.`}function pt(e,t){return{checkoutItems:[...e.items],displayedQuote:e,phase:`ready`,quoteFailure:void 0,revision:t}}function mt(e,t){let n=e.widget.fields.serviceFee;return ie(e,{includeServiceFee:n,selection:t})}function ht(e,t){try{return pt(mt(e,t),1)}catch(e){return{failure:ft(e),phase:`error`,revision:0}}}function gt({catalog:e,client:t,paymentState:n,selection:r}){let i=we(r),a=i.success?JSON.stringify(i.value):`invalid-selection`,o=C(()=>i.success?i.value:[],[i.success,a]),[s,c]=w(ut,void 0,()=>i.success?ht(e,o):{phase:`loading`,revision:0}),l=T(void 0),u=T(0),d=T(s.phase===`ready`?a:void 0),f=T(s.phase===`error`?a:void 0),p=n===`submitting`||n===`success`||n===`unresolved`;b(()=>{if(!i.success||p||$(f.current,a)||$(l.current,a))return;let n=!0;l.current=a;let r=d.current===a;r||c({type:`loading`});function s(e){n&&c(e)}function m(){n&&(l.current=void 0,f.current=a)}let h;function g(e){if(!n||(l.current=void 0,f.current=a,r&&h!==void 0&&u.current!==h))return;let t=ft(e);if(t===`This option is sold out.`){c({failure:t,type:`error`});return}c(r?{failure:t,type:`quote-error`}:{failure:t,type:`error`})}async function _(){try{h=u.current;let n=e.widget.fields.serviceFee;if(!r){let t=mt(e,o);r=!0,d.current=a,s(dt({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,a)&&(l.current=void 0)}},[e,t,i.success,p,a,o]);let m=$(d.current,a)||$(f.current,a)||$(l.current,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`})}}}function _t(e,t){let n=f(e?.[`--lockerverse-accent`]??t?.accentColor??`#38d77a`),r=p(n),i={...e};return(e?.[`--lockerverse-accent`]!==void 0||t?.accentColor)&&(i[`--lockerverse-accent`]=n),r&&e?.[`--lockerverse-accent-contrast`]===void 0&&(i[`--lockerverse-accent-contrast`]=r),{accent:n,rootStyle:i}}function vt({catalog:e,client:t,...n}){let{branding:r,className:i,metadata:a,onPaymentComplete:o,onPaymentRecoveryChange:s,onPaymentUncertain:c,resumePayment:l,selection:u,style:d,stripeLoader:f=qe,theme:p=`dark`,...m}=n,[h,g]=E(l),_=T(null),[v,x]=E(),[C,w]=E(`idle`),D=T(void 0),{selectionError:A,session:j,updateCheckout:M}=gt({catalog:e,client:t,paymentState:C,selection:u}),N=j.phase===`ready`?j.revision:void 0,P=y(e=>{N!==void 0&&(D.current=N),w(e)},[N]),F=y(e=>s?.(e),[s]),I=y(()=>{g(void 0)},[]);b(()=>{j.phase===`loading`&&x(void 0)},[j.phase]),S(()=>{j.phase===`ready`&&D.current!==j.revision&&w(e=>e===`success`||e===`unresolved`?e:`idle`)},[j.phase,j.revision]);let L=[`lockerverse-payment`,i].filter(Boolean).join(` `),R=r??e.community,{accent:z,rootStyle:B}=_t(d,R);return A?O(`section`,{...m,className:L,"data-lockerverse-theme":p,role:`alert`,style:B,children:A}):j.phase===`error`&&j.failure===`This option is sold out.`||C===`sold_out`?k(`section`,{...m,className:L,"data-lockerverse-theme":p,role:`alert`,style:B,children:[O(`h1`,{children:`Sold out`}),O(`p`,{children:`This option is sold out.`})]}):j.phase===`error`?O(`section`,{...m,className:L,"data-lockerverse-theme":p,style:B,children:O(`p`,{role:`alert`,children:j.failure})}):j.phase===`ready`?k(`section`,{...m,"aria-label":`Payment`,className:L,"data-lockerverse-theme":p,"data-payment-state":C,ref:_,style:B,children:[k(`header`,{children:[e.widget.showCommunityBranding&&R?k(`div`,{className:`lockerverse-payment__branding`,children:[R.imageUrl?O(`img`,{alt:R.name,height:`48`,src:R.imageUrl,width:`48`}):null,O(`strong`,{children:R.name})]}):null,O(`h1`,{children:e.widget.title??e.widget.name}),e.widget.description?O(`p`,{children:e.widget.description}):null]}),v?O(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:v}):null,j.quoteFailure?k(`div`,{className:`lockerverse-payment__payment-status`,role:`alert`,children:[O(`span`,{children:j.quoteFailure}),O(`span`,{children:` The final total will be checked when you submit.`})]}):null,O(Ze,{accentColor:z,appearanceRoot:_,catalog:e,checkoutItems:j.checkoutItems,client:t,metadata:a,onPaymentComplete:o,onPaymentRecoveryChange:F,onPaymentUncertain:c,onQuoteChange:(e,t)=>{x(t),M(e)},onResumePaymentFailed:I,onStateChange:P,quote:j.displayedQuote,resumePayment:h,stripeLoader:f,theme:p,visualStyle:B},j.revision)]}):O(`section`,{...m,"aria-busy":`true`,"aria-label":`Payment`,className:L,"data-lockerverse-theme":p,style:B,children:O(lt,{})})}function yt({children:e,loading:t=!1,viewProps:n}){let{branding:r,className:i,metadata:a,onPaymentComplete:o,onPaymentRecoveryChange:s,onPaymentUncertain:c,resumePayment:l,selection:u,stripeLoader:d,style:m,theme:h=`dark`,...g}=n,_=f(m?.[`--lockerverse-accent`]??r?.accentColor??`#38d77a`),v=p(_),y={...m};return(m?.[`--lockerverse-accent`]!==void 0||r?.accentColor)&&(y[`--lockerverse-accent`]=_),v&&m?.[`--lockerverse-accent-contrast`]===void 0&&(y[`--lockerverse-accent-contrast`]=v),O(`section`,{...g,...t?{"aria-busy":!0,"aria-label":`Payment`}:{},className:[`lockerverse-payment`,i].filter(Boolean).join(` `),"data-lockerverse-theme":h,style:y,children:e})}function bt({widget:e,...t}){return e.error?k(yt,{viewProps:t,children:[O(`p`,{role:`alert`,children:e.error.message}),O(`button`,{onClick:e.refresh,type:`button`,children:`Retry`})]}):e.loading||!e.catalog?O(yt,{loading:!0,viewProps:t,children:O(lt,{})}):O(vt,{catalog:e.catalog,client:e.client,...t})}export{Je as n,bt as t};
1
+ import{t as e}from"./format-money.js";import{a as t,d as n,f as r,m as i,n as a,r as o,t as s}from"./host-callback.js";import{i as c,n as l,r as u,t as d}from"./stripe-loader.js";import{n as f,t as p}from"./accent-contrast.js";import{i as m,n as h,o as g,r as _,t as v}from"./form-skeleton.js";import{useCallback as y,useEffect as b,useId as x,useLayoutEffect as S,useMemo as C,useReducer as w,useRef as T,useState as E}from"react";import{Fragment as D,jsx as O,jsxs as k}from"react/jsx-runtime";import{AddressElement as A,Elements as j,PaymentElement as M,useElements as N,useStripe as P}from"@stripe/react-stripe-js";import{array as F,minLength as I,minValue as L,nonEmpty as R,number as z,pipe as B,regex as V,safeInteger as H,safeParse as U,strictObject as W,string as ee,trim as G,union as te}from"valibot";import{LockerverseSdkError as K,estimateLockerverseCheckout as ne}from"@lockerverse/sdk/checkout";function re({ariaDescribedBy:e,ariaLabel:t,ariaLabelledBy:n,className:r,id:i,invalid:a=!1,name:o,onValueChange:s,options:c,value:l}){return O(`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=>O(`option`,{value:e.value,children:e.label},e.value))})}const q=[`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`],ie=[`15`,`12`,`10`,`5`],J=[...ie,`custom`];function ae({enabled:e,error:t,errorId:n,onChange:r,values:i}){if(!e)return null;let a=e=>r({...i,...e}),o=(e,t)=>{let n=J.indexOf(t),r;switch(e.key){case`ArrowDown`:case`ArrowRight`:r=(n+1)%J.length;break;case`ArrowLeft`:case`ArrowUp`:r=(n-1+J.length)%J.length;break;case`Home`:r=0;break;case`End`:r=J.length-1;break;default:return}e.preventDefault();let i=J[r];i&&((e.currentTarget.closest(`[role="radiogroup"]`)?.querySelectorAll(`input[type="radio"]`))?.[r]?.focus(),a({tipPercent:i}))};return k(`div`,{className:`lockerverse-payment__tip-box`,children:[O(`p`,{children:`Add a tip to support the Lockerverse platform`}),k(`div`,{"aria-label":`Tip amount`,role:`radiogroup`,children:[ie.map(e=>k(`label`,{className:`lockerverse-payment__tip-choice`,children:[O(`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}),k(`span`,{children:[e,`%`]})]},e)),k(`label`,{className:`lockerverse-payment__tip-choice`,children:[O(`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`}),O(`span`,{children:`Other`})]})]}),i.tipPercent===`custom`?k(`label`,{children:[O(`span`,{children:`Custom tip`}),k(`span`,{className:`lockerverse-payment__money-input`,children:[O(`span`,{"aria-hidden":`true`,children:`$`}),O(`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?O(`span`,{className:`lockerverse-payment__field-message`,id:n,children:t}):null]}):O(`input`,{name:`tip`,type:`hidden`,value:i.tipPercent})]})}function Y({checked:e,children:t,name:r,onChange:i}){let a=x();return k(`label`,{className:`lockerverse-payment__check-row`,htmlFor:a,children:[O(n,{checked:e,id:a,name:r,onChange:e=>i(e.currentTarget.checked)}),O(`span`,{children:t})]})}function oe({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 k(`div`,{className:`lockerverse-payment__additional-fields`,children:[n.memberId?k(`label`,{children:[O(`span`,{children:a?.trim()||`Member ID`}),O(`input`,{name:`memberId`,onChange:e=>u({memberId:e.currentTarget.value}),placeholder:`Optional`,value:l.memberId})]}):null,n.merchSize?k(`div`,{className:`lockerverse-payment__field`,children:[O(`span`,{id:`${r}-merch-size-label`,children:`Size`}),O(re,{ariaLabelledBy:`${r}-merch-size-label`,name:`merchSize`,onValueChange:e=>{let t=q.find(t=>t===e);t&&u({merchSize:t})},options:q.map(e=>({label:e,value:e})),value:l.merchSize})]}):null,n.promoCode?k(`div`,{className:`lockerverse-payment__field`,children:[O(`span`,{id:`${r}-promo-code-label`,children:`Promo code`}),k(`div`,{className:`lockerverse-payment__promo-control`,children:[O(`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}),O(`button`,{disabled:!l.promoCode.trim()||i,onClick:s,type:`button`,children:i?`Applying…`:`Apply`})]}),c?O(`p`,{className:`lockerverse-payment__field-message`,id:`${r}-promo-code-error`,role:`alert`,children:c}):null]}):null,O(h,{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 se({amountCents:t,enabled:n,onChange:r,values:i}){return n?k(Y,{checked:i.includeServiceFee,name:`includeServiceFee`,onChange:e=>r({...i,includeServiceFee:e}),children:[`Add `,e(t),` to help cover processing fees`]}):null}function ce(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 Z(e,t){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,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,status:`succeeded`});case`unresolved`:return X(e,[`recovering`,`submitting`],{message:t.message,status:`unresolved`});default:return e}}function le(e){return e.status===`editing`||e.status===`invalid`||e.status===`refreshing_quote`?e.error:void 0}function ue(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`:le(e)?`error`:`idle`}function de(e){return e.status===`submitting`}const Q=[`amountCents`,`discountableSubtotalCents`,`discountCents`,`serviceFeeCents`,`subtotalCents`,`tipCents`,`totalCents`],fe=[`discountableSubtotalCents`,`discountCents`,`subtotalCents`];function pe(e,t,n,r){return(n===t.totalCents?fe:Q).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 me(e){return e.checkoutStatus===`success`?{kind:`success`,payment:e}:e.checkoutStatus===`failed`?{kind:`failed`,payment:e}:{kind:`unresolved`,paymentReference:e.paymentReference,reason:e.checkoutStatus===`action_required`?`action_required`:`pending`}}async function he(e,t,n){if(t.checkoutStatus!==`action_required`)return me(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 me(await e.getPaymentStatus(t.paymentReference))}catch{return{kind:`unresolved`,paymentReference:t.paymentReference,reason:`action_required`}}}async function ge(e,t,n){let r;try{r=await e.submitPayment(t)}catch(n){if(!(n instanceof K&&n.recoveryRecommended))throw n;try{r=await e.getPaymentStatus(t.checkout.paymentReference)}catch{return{kind:`unresolved`,paymentReference:t.checkout.paymentReference,reason:`recovery_failed`}}}return he(e,r,n)}async function _e(e,t,n){try{return he(e,await e.getPaymentStatus(t),n)}catch{return{kind:`unresolved`,paymentReference:t,reason:`recovery_failed`}}}const ve=B(ee(),G(),R()),ye=B(z(),H(),L(1)),be=B(F(te([W({amountCents:ye,productSlug:ve}),W({productSlug:ve,quantity:ye}),W({productSlug:ve})])),I(1)),xe=B(ee(),G(),V(/^(?:0|[1-9]\d*)(?:\.\d{1,2})?$/,`Enter a valid tip amount.`));function Se(e){let t=U(xe,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 Ce(e){let t=U(be,e);return t.success?{success:!0,value:t.output}:{message:`Lockerverse payment configuration is invalid.`,success:!1}}const we=`This promo code is invalid or cannot be applied.`;function Te(e,t){return t.tipPercent===`custom`?t.customTip.trim()?Se(t.customTip):{cents:0,success:!0}:{cents:Math.round(e*Number(t.tipPercent)/100),success:!0}}function Ee(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 De(e,t,n){let r=e.widget.fields.tipping?Te(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 Oe(e,t){return{displayedTotalCents:e.totalCents,promoError:t&&e.appliedDiscount?.source!==`promo_code`?we:void 0}}function ke(e,t){let n;return t||(n=e instanceof Error?e.message:`The order total could not be updated.`),{paymentError:n,promoError:t?we:void 0}}function Ae(e,t){if(!e?.complete)throw Error(`${t} address is required.`);return e.value}function je(e,t,n,r){if(e.widget.fields.shipping)return t.shippingMatchesBilling?n:Ae(r.shipping,`Shipping`)}function Me({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 Ne({catalog:e,confirmationToken:t,email:n,fieldValues:r,metadata:i,phone:a,shippingAddress:o}){let s={customFieldAnswers:_(e.widget.customFields,r.customFields),email:n};if(t&&(s.confirmationToken=t),i&&(s.metadata=i),e.widget.fields.memberId&&r.memberId.trim()&&(s.memberId=r.memberId.trim()),e.widget.fields.merchSize&&(s.merchSize=r.merchSize),e.widget.fields.phone&&(s.phone=a),o){let e={city:o.address.city??``,country:o.address.country,line1:o.address.line1??``,postal_code:o.address.postal_code??``,state:o.address.state??``};o.address.line2&&(e.line2=o.address.line2),s.shipping={address:e,name:o.name}}return s}function Pe(e){if(!e())throw Error(`Payment component is no longer active.`)}function Fe(e,t){s(e,t)}function Ie(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}:{email:n,kind:`payment`,payment:e.payment,quote:t}}async function Le({addresses:e,catalog:t,checkoutItems:n,client:r,elements:i,email:a,fieldValues:o,isAttemptActive:s,locallyPreviewedTotalCents:c,metadata:l,onPaymentRecoveryChange:d,phone:f,quote:p,stripe:m,stripeConnectedAccountId:h}){let g=a.trim().toLowerCase(),_=u(f),v=Te(p.subtotalCents,o);if(!v.success)throw Error(v.message);let y=await r.calculateTotal({...Ee(t,o,g,v.cents),catalog:t,items:n});if(Pe(s),y.totalCents>0&&pe(p,y,c,h))return{kind:`quote_changed`,quote:y};let b,x;if(y.totalCents===0)t.widget.fields.shipping&&(b=je(t,o,Ae(e.billing,`Billing`),e));else{if(!(i&&m))throw Error(`Payment form is still loading.`);await i.update({amount:y.totalCents}),Pe(s);let n=await i.submit();if(Pe(s),n.error)throw Error(n.error.message);let r=Ae(e.billing,`Billing`);b=je(t,o,r,e);let a=await m.createConfirmationToken({elements:i,params:Me({billingAddress:r,catalog:t,email:g,phone:_,shippingAddress:b})});if(Pe(s),a.error)throw Error(a.error.message);x=a.confirmationToken.id}Fe(d,{connectedAccountId:y.payment.connectedAccountId,paymentReference:y.paymentReference});let S=await ge(r,{checkout:y,submission:Ne({catalog:t,confirmationToken:x,email:g,fieldValues:o,metadata:l,phone:_,shippingAddress:b})},m);return Pe(s),Ie(S,y,g,y.totalCents===0?`Order could not be completed. Review the details and try again.`:`Payment was declined. Check your payment details and try again.`)}function Re(e,t){s(e,t)}function ze(e,t){s(e,t)}function Be(e,t){return{...e,...t}}function Ve(e,t,n){return e.kind===`unresolved`&&e.reason===`action_required`&&!t&&!n}function He(e){return e instanceof K&&e.serverCode===`PAYMENT_WIDGET_SALES_LIMIT_REACHED`}function Ue({nextQuote:e,onQuoteChange:t,setDisplayedTotalCents:n,setPromoError:r,updateState:i,validatePromo:a}){let o=Oe(e,a);i({type:`quote_refresh_succeeded`}),n(o.displayedTotalCents),t(e),a&&r(o.promoError)}function We({error:e,setPromoError:t,updateState:n,validatePromo:r}){let i=ke(e,r);r&&t(i.promoError),n(i.paymentError===void 0?{type:`quote_refresh_failed`}:{error:i.paymentError,type:`quote_refresh_failed`})}function Ge({onPaymentComplete:t,onPaymentRecoveryChange:n,onPaymentUncertain:r,onQuoteChange:i,result:a,setDisplayedTotalCents:o,dispatchState:c}){if(a.kind===`quote_changed`){let t=`The total changed to ${e(a.quote.totalCents)}. Review it and pay again.`;i(a.quote,t),o(a.quote.totalCents),c({type:`quote_changed`});return}if(a.kind===`payment_failed`){Re(n,null),c({error:a.message,type:`retryable_failure`});return}if(a.kind===`payment_unresolved`){c({message:`Payment is still processing. Do not submit it again.`,type:`unresolved`}),ze(r,{paymentReference:a.paymentReference,reason:a.reason});return}i(a.quote),Re(n,null),c({message:a.payment.paymentRequired?`Payment completed successfully.`:`Order confirmed. No payment was required.`,type:`succeeded`}),s(t,Be(a.payment,{email:a.email,lineItems:a.quote.lineItems}))}function Ke(e){let{catalog:n,checkoutItems:r,client:i,elements:a,email:o,fieldValues:l,metadata:u,onPaymentComplete:d,onResumePaymentFailed:f,onPaymentRecoveryChange:p,onPaymentUncertain:m,onQuoteChange:h,onStateChange:g,quote:_,resumePayment:v,stripe:x,stripeConnectedAccountId:S,stripeLoadFailed:C,paymentState:w,updateState:D}=e,[O,k]=E(_.totalCents),[A,j]=E(),M=T(!1),N=T(0),P=T(0),F=y(e=>D(e,!0),[D]),I=y(()=>{let e=P.current+1;return P.current=e,()=>P.current===e},[]);b(()=>()=>{P.current+=1,N.current+=1},[]);let{parsedTip:L,totalCents:R}=De(n,l,_);b(()=>{R!==null&&(k(R),R>0&&a?.update({amount:R}))},[n.pricingPolicy.serviceFeeRateBasisPoints,n.widget.fields.serviceFee,a,l.includeServiceFee,R,_.serviceFeeCents,_.tipCents,_.totalCents,_.subtotalCents]),b(()=>{if(!v||M.current||w.status!==`recovering`)return;M.current=!0;let e=I();return g(ue(w)),_e(i,v.paymentReference,x).then(t=>{if(e()&&!Ve(t,x,C)){if(t.kind===`failed`){Re(p,null),f(),F({error:`The previous payment failed. Check your details and try again.`,type:`recovery_failed`});return}if(t.kind===`unresolved`){F({message:`Payment is still processing. Do not submit it again.`,type:`unresolved`}),ze(m,{paymentReference:t.paymentReference,reason:t.reason});return}Re(p,null),F({message:t.payment.paymentRequired?`Payment completed successfully.`:`Order confirmed. No payment was required.`,type:`succeeded`}),s(d,Be(t.payment,{email:null,lineItems:null}))}}),()=>{e()&&(P.current+=1),M.current=!1}},[i,d,f,p,m,g,v,x,C,I,F,w]);let z=y((e=!1,t=!1)=>{t||(N.current+=1),e&&j(void 0),D({type:`field_changed`})},[D]);async function B(e=!1,t=!1){let a=o.trim().toLowerCase(),s=c({email:a,phone:``},!1);if(!(L.success&&(s.value||e)))return;N.current+=1;let u=N.current;D({type:`quote_refresh_started`});try{let e=await i.calculateTotal({...Ee(n,l,s.value?.email??``,L.cents),catalog:n,items:r});if(u!==N.current)return;Ue({nextQuote:e,onQuoteChange:h,setDisplayedTotalCents:k,setPromoError:j,updateState:D,validatePromo:t})}catch(e){if(u!==N.current)return;if(He(e)){D({type:`sold_out`});return}We({error:e,setPromoError:j,updateState:D,validatePromo:t})}}async function V(){j(void 0),await B(!0,!0)}async function H({addresses:e,phone:s}){F({type:`submission_started`});let c=I();try{let t=await Le({addresses:e,catalog:n,checkoutItems:r,client:i,elements:a,email:o,fieldValues:l,isAttemptActive:c,locallyPreviewedTotalCents:O,metadata:u,onPaymentRecoveryChange:p,phone:s,quote:_,stripe:x,stripeConnectedAccountId:S});if(!c())return;Ge({dispatchState:F,onPaymentComplete:d,onPaymentRecoveryChange:p,onPaymentUncertain:m,onQuoteChange:h,result:t,setDisplayedTotalCents:k})}catch(e){if(!c())return;if(Re(p,null),He(e)){F({type:`sold_out`});return}let n=e instanceof K?t(e.serverCode):void 0;if(n)return F({type:`submission_validation_failed`}),{phoneError:n};F({error:e instanceof Error?e.message:`Payment could not be completed.`,type:`retryable_failure`})}}let U=w.status===`succeeded`||w.status===`unresolved`?w.message:void 0;return{commands:{applyPromo:V,fieldChanged:z,refreshAuthoritativeTotal:B,reportStripeLoadError:e=>F({error:e,type:`retryable_failure`}),reportValidationFailure:()=>F({type:`validation_failed`}),submit:H},state:{displayedTotalCents:O,isRecovering:w.status===`recovering`,isRefreshingQuote:w.status===`refreshing_quote`,isSubmitting:de(w),parsedTip:L,paymentError:le(w),promoError:A,terminalMessage:U}}}const qe=d;function Je(e){let{connectedAccountId:t,publishableKey:n}=e.payment;return qe(n,t?{stripeAccount:t}:void 0)}function Ye(e){return e===`monthly`?{interval:`month`,label:`Monthly`}:e===`annually`?{interval:`year`,label:`Annual`}:null}function Xe(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 Ze({accentColor:e,catalog:t,checkoutItems:n,client:r,appearanceRoot:i,metadata:a,onPaymentComplete:o,onResumePaymentFailed:s,onPaymentRecoveryChange:c,onPaymentUncertain:u,onQuoteChange:d,quote:f,resumePayment:p,onStateChange:m,stripeLoader:h,theme:g,visualStyle:_}){let[x,S]=E(()=>ce(!!p)),w=T(x);w.current=x;let D=y((e,t=!1)=>{let n=Z(w.current,e);n!==w.current&&(w.current=n,S(n),t&&m(ue(n)))},[m]),k=Xe(t,f,p),A=T({connectedAccountId:k,paymentOption:f.paymentOption});x.status!==`submitting`&&x.status!==`recovering`&&(A.current={connectedAccountId:k,paymentOption:f.paymentOption});let{connectedAccountId:M,paymentOption:N}=A.current,P=C(()=>h(t.payment.publishableKey,M?{stripeAccount:M}:void 0).catch(()=>null),[t.payment.publishableKey,M,h]),[F,I]=E(!1);b(()=>{let e=!0;return I(!1),P.then(t=>{e&&t===null&&I(!0)}),()=>{e=!1}},[P]);let L=l(i,g,_,x.status===`submitting`||x.status===`recovering`,e);return L?O(j,{options:{amount:Math.max(f.totalCents,100),appearance:L,currency:t.payment.currency,excludedPaymentMethodTypes:[`us_bank_account`],mode:N===`one-time`?`payment`:`subscription`,syncAddressCheckbox:`none`},stripe:P,children:O(ct,{catalog:t,checkoutItems:n,client:r,metadata:a,onPaymentComplete:o,onPaymentRecoveryChange:c,onPaymentUncertain:u,onQuoteChange:d,onResumePaymentFailed:s,onStateChange:m,paymentState:x,quote:f,resumePayment:p,stripeConnectedAccountId:M,stripeLoadFailed:F,updateState:D})},`${t.payment.publishableKey}:${M??`platform`}:${N}`):O(v,{fieldCount:3,label:`Loading payment form`})}function Qe({label:e}){return k(`div`,{className:`lockerverse-payment__stripe-loader`,role:`status`,children:[O(`p`,{children:e}),k(`div`,{"aria-hidden":`true`,children:[O(`span`,{}),O(`span`,{}),O(`span`,{})]})]})}function $e({onError:e,onReady:t,ready:n}){return k(`div`,{className:`lockerverse-payment__stripe-element`,"data-ready":n,children:[n?null:O(Qe,{label:`Loading payment form...`}),O(`div`,{className:`lockerverse-payment__stripe-mount`,children:O(M,{onLoadError:({error:t})=>e(t.message??`Payment form failed to load.`),onReady:t,options:{business:{name:`Lockerverse`},fields:{billingDetails:{address:`never`,email:`never`,name:`never`,phone:`never`}},layout:`tabs`,terms:{applePay:`auto`,auBecsDebit:`never`,bancontact:`never`,card:`always`,cashapp:`never`,googlePay:`never`,ideal:`never`,paypal:`auto`,sepaDebit:`never`,sofort:`never`,usBankAccount:`never`},wallets:{applePay:`auto`,googlePay:`never`}}})})]})}function et({label:e,mode:t,onChange:n,onError:r,onReady:i,ready:a}){return k(`div`,{className:`lockerverse-payment__address`,children:[O(`h2`,{children:e}),k(`div`,{className:`lockerverse-payment__stripe-element lockerverse-payment__stripe-element--address`,"data-ready":a,children:[a?null:O(Qe,{label:`Loading ${e.toLowerCase()}...`}),O(`div`,{className:`lockerverse-payment__stripe-mount`,children:O(A,{onChange:n,onLoadError:({error:t})=>r(t.message??`${e} failed to load.`),onReady:i,options:{autocomplete:{mode:`automatic`},mode:t}})})]})]})}function tt({message:e}){return e?O(`p`,{className:`lockerverse-payment__field-message`,role:`alert`,children:e}):null}function nt({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 k(D,{children:[f?O($e,{onError:c,onReady:()=>u(!0),ready:i}):null,f||e.widget.fields.shipping?O(et,{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?k(`div`,{className:`lockerverse-payment__shipping`,children:[O(Y,{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:O(et,{label:`Shipping address`,mode:`shipping`,onChange:e=>o(`shipping`,e),onError:c,onReady:()=>d(!0),ready:a})]}):null]})}function rt({displayedBaseCents:t,displayedTipCents:n,displayedTotalCents:r,quote:i}){let a=Ye(i.paymentOption),o=Math.max(0,t-i.subtotalCents+i.discountCents);return k(`section`,{"aria-label":`Payment summary`,className:`lockerverse-payment__payment-summary`,children:[O(`h2`,{children:`Order summary`}),O(`div`,{className:`lockerverse-payment__payment-summary-items`,children:i.lineItems.map(t=>k(`div`,{className:`lockerverse-payment__payment-summary-row`,children:[k(`span`,{children:[t.productName,t.quantity>1?k(D,{children:[` `,k(`small`,{children:[`× `,t.quantity]})]}):null,t.paymentOption===`monthly`?O(`small`,{children:` · Monthly`}):null,t.paymentOption===`annually`?O(`small`,{children:` · Annual`}):null]}),O(`strong`,{children:e(t.subtotalCents)})]},t.listingId))}),k(`div`,{className:`lockerverse-payment__payment-summary-totals`,children:[o>0?k(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-detail`,children:[O(`span`,{children:`Service fee`}),O(`strong`,{children:e(o)})]}):null,i.discountCents>0&&i.appliedDiscount?k(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-discount`,children:[k(`span`,{children:[i.appliedDiscount.source===`email_list`?`Email discount`:`Promo code discount`,` `,`(`,i.appliedDiscount.percentageOff,`% off)`]}),k(`strong`,{children:[`-`,e(i.discountCents)]})]}):null,n>0?k(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-detail lockerverse-payment__payment-summary-tip`,children:[O(`span`,{children:`Tip`}),O(`strong`,{children:e(n)})]}):null,k(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-total`,children:[O(`span`,{children:a?`${a.label} total`:`Total`}),O(`strong`,{children:e(r)})]})]})]})}function it({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=Ye(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)}`),k(`div`,{className:`lockerverse-payment__actions`,children:[O(se,{amountCents:l.serviceFeeCents||Math.round(l.subtotalCents*t.pricingPolicy.serviceFeeRateBasisPoints/1e4),enabled:t.widget.fields.serviceFee,onChange:c,values:r}),O(`button`,{"aria-busy":s,"aria-label":m,disabled:s||!d,type:`submit`,children:p})]})}function at(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 ot({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&&at(n,`custom:${o}`)}function st({email:e,emailDiscountPercentOff:t,emailErrorId:n,emailId:o,emailRef:s,errors:c,onEmailBlur:l,onEmailChange:u,onPhoneChange:d,phone:f,phoneCountry:p,phoneEnabled:m,phoneErrorId:h,phoneId:g,phoneRef:_}){return k(`div`,{className:`lockerverse-payment__contact`,children:[O(r,{error:c.email,errorId:n,id:o,label:`Email`,name:`email`,onBlur:l,onChange:e=>u(e.currentTarget.value),ref:s,required:!0,value:e}),t===void 0?null:k(`p`,{className:`lockerverse-payment__discount-message`,role:`status`,children:[`Your email qualifies for `,t,`% off.`]}),m?O(i,{error:c.phone,errorId:h,id:g,label:`Phone`,children:O(a,{country:p,error:c.phone,errorId:h,id:g,inputRef:_,name:`phone`,onChange:d,required:!0,value:f})}):null]})}function ct({catalog:e,checkoutItems:t,client:n,metadata:r,onPaymentComplete:i,onResumePaymentFailed:a,onPaymentRecoveryChange:s,onPaymentUncertain:l,onQuoteChange:u,onStateChange:d,quote:f,resumePayment:p,stripeConnectedAccountId:h,stripeLoadFailed:_,paymentState:v,updateState:y}){let[S,C]=E(``),[w,D]=E(``),[A,j]=E(`US`),[M,F]=E({}),[I,L]=E({}),[R,z]=E(),[B,V]=E(!1),[H,U]=E(!1),[W,ee]=E(!1),[G,te]=E({customFields:m(e.widget.customFields),customTip:``,includeServiceFee:e.widget.fields.serviceFee,memberId:``,merchSize:`M`,promoCode:``,shippingMatchesBilling:!0,tipPercent:`10`}),K=T({billing:null,shipping:null}),ne=T(null),re=T(null),q=T(null),ie=T(f.totalCents>0),J=Ke({catalog:e,checkoutItems:t,client:n,elements:N(),email:S,fieldValues:G,metadata:r,onPaymentComplete:i,onPaymentRecoveryChange:s,onPaymentUncertain:l,onQuoteChange:u,onResumePaymentFailed:a,onStateChange:d,paymentState:v,quote:f,resumePayment:p,stripe:P(),stripeConnectedAccountId:h,stripeLoadFailed:_,updateState:y}),{displayedTotalCents:Y,isRecovering:se,isRefreshingQuote:ce,isSubmitting:X,parsedTip:Z,paymentError:le,promoError:ue,terminalMessage:de}=J.state,Q=`lockerverse-${x()}`,fe=`${Q}-email`,pe=`${fe}-error`,me=`${Q}-phone`,he=`${me}-error`,ge=`${Q}-tip-error`,_e=(Z.success?Z.cents:null)??0,ve=Y-_e,ye=!e.widget.fields.shipping||G.shippingMatchesBilling||W;b(()=>{X&&q.current?.focus({preventScroll:!0})},[X]),b(()=>{X||M.email||!M.phone||re.current?.focus()},[M.email,M.phone,X]),b(()=>{let e=Y>0;e&&!ie.current&&(V(!1),U(!1)),ie.current=e},[Y]);function be(e){J.commands.fieldChanged(!1,e!==`email`),F(t=>{let n={...t};return delete n[e],n})}function xe(e){let t=e.promoCode!==G.promoCode,n=e.includeServiceFee!==G.includeServiceFee;J.commands.fieldChanged(t,!(t||n)),te(e),L({}),z(void 0)}async function Se(t){t.preventDefault();let n=e.widget.fields.phone?o(w,A):``,r=c({email:S,phone:n},e.widget.fields.phone),i=g(e.widget.customFields,G.customFields);if(!(r.value&&Z.success)||Object.keys(i).length>0){F(r.errors),L(i),z(Z.success?void 0:Z.message),J.commands.reportValidationFailure();let e=t.currentTarget;queueMicrotask(()=>{ot({customFieldErrors:i,emailRef:ne,form:e,parsedTipSuccess:Z.success,phoneRef:re,validationErrors:r.errors})});return}F({}),L({});let a=await J.commands.submit({addresses:K.current,phone:n});a?.phoneError&&F({phone:a.phoneError})}return de?O(`p`,{className:`lockerverse-payment__payment-status`,ref:q,role:`status`,tabIndex:-1,children:de}):se?O(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:`Recovering payment…`}):k(`form`,{"aria-busy":X,className:`lockerverse-payment__form`,noValidate:!0,onSubmit:Se,children:[O(`div`,{"data-lockerverse-input-region":``,inert:X?!0:void 0,children:k(`fieldset`,{className:`lockerverse-payment__input-fieldset`,disabled:X,children:[O(rt,{displayedBaseCents:ve,displayedTipCents:_e,displayedTotalCents:Y,quote:f}),O(ae,{enabled:e.widget.fields.tipping,error:R,errorId:ge,onChange:xe,values:G}),O(st,{email:S,emailDiscountPercentOff:f.appliedDiscount?.source===`email_list`?f.appliedDiscount.percentageOff:void 0,emailErrorId:pe,emailId:fe,emailRef:ne,errors:M,onEmailBlur:()=>J.commands.refreshAuthoritativeTotal(),onEmailChange:e=>{C(e),be(`email`)},onPhoneChange:({value:e,country:t})=>{D(e),j(t),be(`phone`)},phone:w,phoneCountry:A,phoneEnabled:e.widget.fields.phone,phoneErrorId:he,phoneId:me,phoneRef:re}),O(nt,{catalog:e,displayedTotalCents:Y,fieldValues:G,isBillingAddressReady:H,isPaymentReady:B,isShippingAddressReady:W,onAddressChange:(e,t)=>{K.current[e]=t},onFieldValuesChange:xe,onStripeLoadError:J.commands.reportStripeLoadError,setIsBillingAddressReady:U,setIsPaymentReady:V,setIsShippingAddressReady:ee}),O(oe,{customFields:e.widget.customFields,errors:I,fields:e.widget.fields,idPrefix:Q,isPromoApplying:ce,memberIdLabel:e.community?.memberIdLabel,onApplyPromo:J.commands.applyPromo,onChange:xe,promoError:ue,values:G}),O(it,{catalog:e,displayedTotalCents:Y,fieldValues:G,isBillingAddressReady:H,isPaymentReady:B,isRequiredShippingReady:ye,isSubmitting:X,onFieldValuesChange:xe,quote:f})]})}),X?O(`p`,{className:`lockerverse-payment__sr-only`,ref:q,role:`status`,tabIndex:-1,children:Y===0?`Completing order…`:`Processing payment…`}):null,O(tt,{message:le})]})}function lt(){return O(v,{fieldCount:2,label:`Loading payment…`,sectionCount:2,showCheckbox:!0})}function ut(e,t){switch(t.type){case`loading`:return{phase:`loading`,revision:e.revision};case`ready`:return pt(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 dt({checkout:e}){return{displayedQuote:e,type:`ready`}}function ft(e){return e instanceof Error?e.message:`Lockerverse payment could not load.`}function pt(e,t){return{checkoutItems:[...e.items],displayedQuote:e,phase:`ready`,quoteFailure:void 0,revision:t}}function mt(e,t){let n=e.widget.fields.serviceFee;return ne(e,{includeServiceFee:n,selection:t})}function ht(e,t){try{return pt(mt(e,t),1)}catch(e){return{failure:ft(e),phase:`error`,revision:0}}}function gt({catalog:e,client:t,paymentState:n,selection:r}){let i=Ce(r),a=i.success?JSON.stringify(i.value):`invalid-selection`,o=C(()=>i.success?i.value:[],[i.success,a]),[s,c]=w(ut,void 0,()=>i.success?ht(e,o):{phase:`loading`,revision:0}),l=T(void 0),u=T(0),d=T(s.phase===`ready`?{catalog:e,selectionKey:a}:void 0),f=T(s.phase===`error`?{catalog:e,selectionKey:a}:void 0),p=n===`submitting`||n===`success`||n===`unresolved`;b(()=>{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=ft(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=mt(e,o);r=!0,d.current={catalog:e,selectionKey:a},s(dt({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 _t={annually:`/year`,monthly:`/month`,"one-time":``};function vt({branding:e,catalog:t}){return k(`header`,{children:[t.widget.showCommunityBranding&&e?k(`div`,{className:`lockerverse-payment__branding`,children:[e.imageUrl?O(`img`,{alt:e.name,height:`48`,src:e.imageUrl,width:`48`}):null,O(`strong`,{children:e.name})]}):null,O(`h1`,{children:t.widget.title??t.widget.name}),t.widget.description?O(`p`,{children:t.widget.description}):null]})}function yt({catalog:t,selection:n}){let r=n?.length?t.products.filter(e=>n.some(t=>t.productSlug===e.slug)):t.products;return r.length===0?null:k(`div`,{className:`lockerverse-payment__payment-summary`,children:[O(`h2`,{children:`Products`}),O(`div`,{className:`lockerverse-payment__payment-summary-items`,children:r.map(t=>{let n=t.pricingMode===`fixed`?t.amountCents:t.minimumAmountCents,r=_t[t.paymentOption];return k(`div`,{className:`lockerverse-payment__payment-summary-row`,children:[O(`span`,{children:t.name}),O(`strong`,{children:n===null?`Choose amount`:`${t.pricingMode===`custom`?`From `:``}${e(n)}${r}`})]},t.id)})}),O(`p`,{children:`Base prices. Final total is checked at checkout.`})]})}function bt(e,t){let n=f(e?.[`--lockerverse-accent`]??t?.accentColor??`#38d77a`),r=p(n),i={...e};return(e?.[`--lockerverse-accent`]!==void 0||t?.accentColor)&&(i[`--lockerverse-accent`]=n),r&&e?.[`--lockerverse-accent-contrast`]===void 0&&(i[`--lockerverse-accent-contrast`]=r),{accent:n,rootStyle:i}}function xt({catalog:e,client:t,loadError:n,onRetry:r,...i}){let{branding:a,className:o,metadata:s,onPaymentComplete:c,onPaymentRecoveryChange:l,onPaymentUncertain:u,resumePayment:d,selection:f,style:p,stripeLoader:m=qe,theme:h=`dark`,...g}=i,[_,v]=E(d),x=T(null),[C,w]=E(),[D,A]=E(`idle`),j=T(void 0),{selectionError:M,session:N,updateCheckout:P}=gt({catalog:e,client:t,paymentState:D,selection:f}),F=N.phase===`ready`?N.revision:void 0,I=y(e=>{F!==void 0&&(j.current=F),A(e)},[F]),L=y(e=>l?.(e),[l]),R=y(()=>{v(void 0)},[]);b(()=>{N.phase===`loading`&&w(void 0)},[N.phase]),S(()=>{N.phase===`ready`&&j.current!==N.revision&&A(e=>e===`success`||e===`unresolved`?e:`idle`)},[N.phase,N.revision]);let z=[`lockerverse-payment`,o].filter(Boolean).join(` `),B=a??e.community,{accent:V,rootStyle:H}=bt(p,B);return M?O(`section`,{...g,className:z,"data-lockerverse-theme":h,role:`alert`,style:H,children:M}):N.phase===`error`&&N.failure===`This option is sold out.`||D===`sold_out`?k(`section`,{...g,className:z,"data-lockerverse-theme":h,role:`alert`,style:H,children:[O(`h1`,{children:`Sold out`}),O(`p`,{children:`This option is sold out.`})]}):N.phase===`error`?O(`section`,{...g,className:z,"data-lockerverse-theme":h,style:H,children:O(`p`,{role:`alert`,children:N.failure})}):N.phase===`ready`?k(`section`,{...g,"aria-label":`Payment`,className:z,"data-lockerverse-theme":h,"data-payment-state":D,ref:x,style:H,children:[O(vt,{branding:B,catalog:e}),n?k(`div`,{role:`alert`,children:[O(`p`,{children:n.message}),O(`button`,{onClick:r,type:`button`,children:`Retry`})]}):null,C?O(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:C}):null,N.quoteFailure?k(`div`,{className:`lockerverse-payment__payment-status`,role:`alert`,children:[O(`span`,{children:N.quoteFailure}),O(`span`,{children:` The final total will be checked when you submit.`})]}):null,O(Ze,{accentColor:V,appearanceRoot:x,catalog:e,checkoutItems:N.checkoutItems,client:t,metadata:s,onPaymentComplete:c,onPaymentRecoveryChange:L,onPaymentUncertain:u,onQuoteChange:(e,t)=>{w(t),P(e)},onResumePaymentFailed:R,onStateChange:I,quote:N.displayedQuote,resumePayment:_,stripeLoader:m,theme:h,visualStyle:H},N.revision)]}):k(`section`,{...g,"aria-busy":`true`,"aria-label":`Payment`,className:z,"data-lockerverse-theme":h,style:H,children:[O(vt,{branding:B,catalog:e}),n?k(`div`,{role:`alert`,children:[O(`p`,{children:n.message}),O(`button`,{onClick:r,type:`button`,children:`Retry`})]}):null,O(lt,{})]})}function St({children:e,loading:t=!1,viewProps:n}){let{branding:r,className:i,metadata:a,onPaymentComplete:o,onPaymentRecoveryChange:s,onPaymentUncertain:c,resumePayment:l,selection:u,stripeLoader:d,style:m,theme:h=`dark`,...g}=n,_=f(m?.[`--lockerverse-accent`]??r?.accentColor??`#38d77a`),v=p(_),y={...m};return(m?.[`--lockerverse-accent`]!==void 0||r?.accentColor)&&(y[`--lockerverse-accent`]=_),v&&m?.[`--lockerverse-accent-contrast`]===void 0&&(y[`--lockerverse-accent-contrast`]=v),O(`section`,{...g,...t?{"aria-busy":!0,"aria-label":`Payment`}:{},className:[`lockerverse-payment`,i].filter(Boolean).join(` `),"data-lockerverse-theme":h,style:y,children:e})}function Ct({widget:e,...t}){return e.error&&!e.catalog?k(St,{viewProps:t,children:[O(`p`,{role:`alert`,children:e.error.message}),O(`button`,{onClick:e.refresh,type:`button`,children:`Retry`})]}):e.loading?k(St,{loading:!0,viewProps:t,children:[e.catalog?k(D,{children:[O(vt,{branding:t.branding??e.catalog.community,catalog:e.catalog}),O(yt,{catalog:e.catalog,selection:t.selection})]}):null,O(lt,{})]}):e.catalog?O(xt,{catalog:e.catalog,client:e.client,loadError:e.error,onRetry:e.refresh,...t}):O(St,{loading:!0,viewProps:t,children:O(lt,{})})}export{Je as n,Ct as t};
2
2
  //# sourceMappingURL=lockerverse-payment.js.map