@lockerverse/react 0.2.153 → 0.2.155
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 +74 -0
- package/dist/auction-item.js +1 -1
- package/dist/auction-item.js.map +1 -1
- package/dist/custom-fields.d.ts +31 -0
- package/dist/custom-fields.d.ts.map +1 -0
- package/dist/custom-fields.js +2 -0
- package/dist/custom-fields.js.map +1 -0
- package/dist/form-skeleton.js +1 -1
- package/dist/form-skeleton.js.map +1 -1
- package/dist/host-callback.js +1 -1
- package/dist/host-callback.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/lockerverse-payment.js +1 -1
- package/dist/lockerverse-payment.js.map +1 -1
- package/dist/payment-form.d.ts +2 -2
- package/dist/payment-form.d.ts.map +1 -1
- package/dist/payment-primitives.d.ts +113 -0
- package/dist/payment-primitives.d.ts.map +1 -0
- package/dist/payment-primitives.js +1 -0
- package/dist/payment-summary.js +2 -0
- package/dist/payment-summary.js.map +1 -0
- package/dist/payment.d.ts +2 -1
- package/dist/phone-field.js +2 -0
- package/dist/phone-field.js.map +1 -0
- package/dist/signup.js +1 -1
- package/dist/signup.js.map +1 -1
- package/dist/stripe-loader.js +1 -1
- package/dist/stripe-loader.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -2
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { LockerverseCatalog, LockerverseCheckoutItem, LockerverseCustomField, LockerverseCustomFieldAnswer } from "@lockerverse/sdk/checkout";
|
|
2
|
+
//#region src/custom-fields.d.ts
|
|
3
|
+
type CustomFieldValues = Record<string, boolean | string | string[]>;
|
|
4
|
+
declare function getCheckoutCustomFields(catalog: LockerverseCatalog, items: readonly LockerverseCheckoutItem[]): LockerverseCustomField[];
|
|
5
|
+
/** Normalize initial values against configured fields; unknown fields and options are discarded. */
|
|
6
|
+
declare function createCustomFieldValues(fields: LockerverseCustomField[], initialValues?: CustomFieldValues): CustomFieldValues;
|
|
7
|
+
declare function reconcileCustomFieldValues(fields: LockerverseCustomField[], values: CustomFieldValues): CustomFieldValues;
|
|
8
|
+
declare function buildCustomFieldAnswers(fields: LockerverseCustomField[], values: CustomFieldValues): LockerverseCustomFieldAnswer[];
|
|
9
|
+
declare function validateCustomFields(fields: LockerverseCustomField[], values: CustomFieldValues): Record<string, string>;
|
|
10
|
+
declare function CustomFields({ choiceClassName, errorClassName, errors, fields, idPrefix, onChange, values }: {
|
|
11
|
+
choiceClassName?: string;
|
|
12
|
+
errorClassName?: string;
|
|
13
|
+
errors?: Record<string, string>;
|
|
14
|
+
fields: LockerverseCustomField[];
|
|
15
|
+
idPrefix?: string | undefined;
|
|
16
|
+
onChange: (values: CustomFieldValues) => void;
|
|
17
|
+
values: CustomFieldValues;
|
|
18
|
+
}): import("react").JSX.Element[];
|
|
19
|
+
type CustomFieldProps = {
|
|
20
|
+
choiceClassName?: string;
|
|
21
|
+
error?: string | undefined;
|
|
22
|
+
errorClassName?: string;
|
|
23
|
+
field: LockerverseCustomField;
|
|
24
|
+
idPrefix?: string | undefined;
|
|
25
|
+
onChange: (value: boolean | string | string[]) => void;
|
|
26
|
+
value: boolean | string | string[] | undefined;
|
|
27
|
+
};
|
|
28
|
+
declare function CustomField({ choiceClassName, errorClassName, ...props }: CustomFieldProps): import("react").JSX.Element | null;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { createCustomFieldValues as a, validateCustomFields as c, buildCustomFieldAnswers as i, CustomFieldValues as n, getCheckoutCustomFields as o, CustomFields as r, reconcileCustomFieldValues as s, CustomField as t };
|
|
31
|
+
//# sourceMappingURL=custom-fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-fields.d.ts","names":[],"sources":["../src/custom-fields.tsx"],"mappings":";;KAqBY,oBAAoB;iBAEhB,wBACd,SAAS,oBACT,gBAAgB,4BAAyB;;iBAW3B,wBACd,QAAQ,0BACR,gBAAe,oBACd;iBAca,2BACd,QAAQ,0BACR,QAAQ,oBAAiB;iBA2DX,wBACd,QAAQ,0BACR,QAAQ,oBACP;iBAgBa,qBACd,QAAQ,0BACR,QAAQ,oBAAiB;iBA6BX,eACd,iBACA,gBACA,QACA,QACA,UACA,UACA;EAEA;EACA;EACA,SAAS;EACT,QAAQ;EACR;EACA,WAAW,QAAQ;EACnB,QAAQ;oBACT,IAAA;KAeW;EACV;EACA;EACA;EACA,OAAO;EACP;EACA,WAAW;EACX;;iBAGc,cACd,iBACA,mBACG,SACF,mCAAgB,IAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{f as e,m as t,p as n,u as r}from"./phone-field.js";import{useId as i}from"react";import{jsx as a,jsxs as o}from"react/jsx-runtime";import{array as s,minLength as c,nonEmpty as l,pipe as u,safeParse as d,string as f,trim as p}from"valibot";function m(e,t){let n=new Set(t.map(e=>e.productId));return e.widget.customFields.filter(e=>!e.paymentOptionIds?.length||e.paymentOptionIds.some(e=>n.has(e)))}function h(e,t={}){return Object.fromEntries(e.map(e=>[e.id,_(e,Object.hasOwn(t,e.id)?t[e.id]:void 0)]))}function g(e,t){let n={};for(let r of e){let e=t[r.id];n[r.id]=_(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)&&v(r,i)})?t:n}function _(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=y(t);return e.type===`radio`||e.type===`select`?e.options.some(e=>e.id===n)?n:``:n}function v(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((e,n)=>e===t[n]):e===t}function y(e){let t=d(f(),e);return t.success?t.output:``}function b(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:y(n)}})}function x(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`?d(u(s(f()),c(1,e)),i??[]):d(u(f(),p(),l(e)),y(i));a.success||(n[r.id]=a.issues[0]?.message??e)}return n}function S({choiceClassName:e=`lockerverse-payment__check-row`,errorClassName:t=`lockerverse-payment__field-message`,errors:n={},fields:r,idPrefix:i,onChange:o,values:s}){return r.map(r=>a(C,{choiceClassName:e,error:n[r.id],errorClassName:t,field:r,idPrefix:i,onChange:e=>o({...s,[r.id]:e}),value:s[r.id]},r.id))}function C({choiceClassName:e=`lockerverse-payment__check-row`,errorClassName:t=`lockerverse-payment__field-message`,...n}){let r=i(),{field:o,idPrefix:s=`lockerverse-${r}`}=n,c=`${s}-custom-${o.id}`,l=`${c}-error`,u={...n,choiceClassName:e,controlId:c,errorClassName:t,errorId:l};switch(o.type){case`checkbox`:return a(w,{...u,field:o});case`text`:case`textarea`:return a(T,{...u,field:o});case`select`:case`multi_select`:return a(E,{...u,field:o});case`radio`:case`checkboxes`:return a(D,{...u,field:o});default:return null}}function w({choiceClassName:t,controlId:n,error:i,errorClassName:s,errorId:c,field:l,onChange:u,value:d}){return o(`label`,{className:t,htmlFor:n,children:[a(r,{"aria-describedby":i?c:void 0,"aria-invalid":i?`true`:void 0,checked:d===!0,id:n,name:`custom:${l.id}`,onChange:e=>u(e.currentTarget.checked),required:l.required}),a(`span`,{children:l.label}),a(e,{className:s,error:i,id:c})]})}function T({controlId:e,error:r,errorId:i,field:o,onChange:s,value:c}){let l={"aria-describedby":r?i:void 0,"aria-invalid":r?`true`:void 0,id:e,name:`custom:${o.id}`,onChange:e=>s(e.currentTarget.value),required:o.required,value:y(c)};return o.type===`textarea`?a(n,{error:r,errorId:i,id:e,label:o.label,children:a(`textarea`,{...l,className:`lockerverse-form__control`})}):a(t,{...l,error:r,errorId:i,label:o.label})}function E({controlId:e,error:t,errorId:r,field:i,onChange:s,value:c}){return a(n,{error:t,errorId:r,id:e,label:i.label,children:o(`select`,{"aria-describedby":t?r:void 0,"aria-invalid":t?`true`:void 0,className:`lockerverse-form__control`,id:e,multiple:i.type===`multi_select`,name:`custom:${i.id}`,onChange:e=>s(i.type===`multi_select`?[...e.currentTarget.selectedOptions].map(e=>e.value):e.currentTarget.value),required:i.required,value:c===!0||c===!1?``:c??(i.type===`multi_select`?[]:``),children:[i.type===`select`?a(`option`,{value:``,children:`Select…`}):null,i.options.map(e=>a(`option`,{value:e.id,children:e.label},e.id))]})})}function D({choiceClassName:t,controlId:n,error:r,errorClassName:i,errorId:s,field:c,onChange:l,value:u}){let d=Array.isArray(u)?u:[];return o(`fieldset`,{"aria-describedby":r?s:void 0,"aria-invalid":r?`true`:void 0,children:[a(`legend`,{children:c.label}),c.options.map((e,r)=>o(`label`,{className:t,children:[a(`input`,{checked:Array.isArray(u)?u.includes(e.id):u===e.id,className:c.type===`checkboxes`?`lockerverse-form__checkbox`:void 0,id:`${n}-${r}`,name:`custom:${c.id}`,onChange:t=>{if(c.type===`radio`){l(e.id);return}l(t.currentTarget.checked?[...d,e.id]:d.filter(t=>t!==e.id))},required:c.required&&c.type===`radio`,type:c.type===`radio`?`radio`:`checkbox`,value:e.id}),a(`span`,{children:e.label})]},e.id)),a(e,{className:i,error:r,id:s})]})}export{m as a,h as i,S as n,g as o,b as r,x as s,C as t};
|
|
2
|
+
//# sourceMappingURL=custom-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-fields.js","names":[],"sources":["../src/custom-fields.tsx"],"sourcesContent":["import type {\n LockerverseBooleanCustomField,\n LockerverseCatalog,\n LockerverseCheckoutItem,\n LockerverseCustomField,\n LockerverseCustomFieldAnswer,\n LockerverseMultiOptionCustomField,\n LockerverseSingleOptionCustomField,\n} from \"@lockerverse/sdk/checkout\";\nimport { useId } from \"react\";\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\nexport function getCheckoutCustomFields(\n catalog: LockerverseCatalog,\n items: readonly LockerverseCheckoutItem[]\n) {\n const selectedOptionIds = new Set(items.map((item) => item.productId));\n return catalog.widget.customFields.filter(\n (field) =>\n !field.paymentOptionIds?.length ||\n field.paymentOptionIds.some((id) => selectedOptionIds.has(id))\n );\n}\n\n/** Normalize initial values against configured fields; unknown fields and options are discarded. */\nexport function createCustomFieldValues(\n fields: LockerverseCustomField[],\n initialValues: CustomFieldValues = {}\n): CustomFieldValues {\n return Object.fromEntries(\n fields.map((field) => [\n field.id,\n reconcileCustomFieldValue(\n field,\n Object.hasOwn(initialValues, field.id)\n ? initialValues[field.id]\n : undefined\n ),\n ])\n );\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 = \"lockerverse-payment__check-row\",\n errorClassName = \"lockerverse-payment__field-message\",\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 | undefined;\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\nexport type CustomFieldProps = {\n choiceClassName?: string;\n error?: string | undefined;\n errorClassName?: string;\n field: LockerverseCustomField;\n idPrefix?: string | undefined;\n onChange: (value: boolean | string | string[]) => void;\n value: boolean | string | string[] | undefined;\n};\n\nexport function CustomField({\n choiceClassName = \"lockerverse-payment__check-row\",\n errorClassName = \"lockerverse-payment__field-message\",\n ...props\n}: CustomFieldProps) {\n const generatedId = useId();\n const { field, idPrefix = `lockerverse-${generatedId}` } = props;\n const controlId = `${idPrefix}-custom-${field.id}`;\n const errorId = `${controlId}-error`;\n const controlProps = {\n ...props,\n choiceClassName,\n controlId,\n errorClassName,\n errorId,\n };\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 choiceClassName: string;\n errorClassName: string;\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"],"mappings":"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"}
|
package/dist/form-skeleton.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{jsx as e,jsxs as t}from"react/jsx-runtime";function n({fieldCount:n,label:r,sectionCount:i=0,showCheckbox:a=!1}){return t(`div`,{className:`lockerverse-form-skeleton__loading`,children:[e(`span`,{className:`lockerverse-form-skeleton__sr-only`,role:`status`,children:r}),t(`div`,{"aria-hidden":`true`,className:`lockerverse-form-skeleton`,children:[t(`div`,{className:`lockerverse-form-skeleton__branding`,children:[e(`span`,{className:`lockerverse-form-skeleton__avatar`}),e(`span`,{className:`lockerverse-form-skeleton__community`})]}),e(`div`,{className:`lockerverse-form-skeleton__fields`,children:Array.from({length:n},(n,r)=>t(`div`,{className:`lockerverse-form-skeleton__field`,children:[e(`span`,{className:`lockerverse-form-skeleton__label`}),e(`span`,{className:`lockerverse-form-skeleton__input`})]},r))}),Array.from({length:i},(n,r)=>t(`div`,{className:`lockerverse-form-skeleton__section`,children:[e(`span`,{className:`lockerverse-form-skeleton__section-label`}),t(`div`,{className:`lockerverse-form-skeleton__section-content`,children:[e(`span`,{className:`lockerverse-form-skeleton__section-full`}),t(`div`,{className:`lockerverse-form-skeleton__section-grid`,children:[e(`span`,{className:`lockerverse-form-skeleton__section-half`}),e(`span`,{className:`lockerverse-form-skeleton__section-half`})]})]})]},r)),t(`div`,{className:`lockerverse-form-skeleton__actions`,children:[a?e(`span`,{className:`lockerverse-form-skeleton__check-line`}):null,e(`span`,{className:`lockerverse-form-skeleton__button`})]})]})]})}export{n 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 LockerverseCatalog,\n LockerverseCheckoutItem,\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\nexport function getCheckoutCustomFields(\n catalog: LockerverseCatalog,\n items: readonly LockerverseCheckoutItem[]\n) {\n const selectedOptionIds = new Set(items.map((item) => item.productId));\n return catalog.widget.customFields.filter(\n (field) =>\n !field.paymentOptionIds?.length ||\n field.paymentOptionIds.some((id) => selectedOptionIds.has(id))\n );\n}\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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"}
|
|
1
|
+
{"version":3,"file":"form-skeleton.js","names":[],"sources":["../src/form-skeleton.tsx"],"sourcesContent":["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":"kDAAA,SAAgB,EAAa,CAC3B,aACA,QACA,eAAe,EACf,eAAe,IAMd,CACD,OACE,EAAC,MAAD,CAAK,UAAU,qCAAf,SAAA,CACE,EAAC,OAAD,CAAM,UAAU,qCAAqC,KAAK,SACvD,SAAA,CACG,CAAA,EACN,EAAC,MAAD,CAAK,cAAY,OAAO,UAAU,4BAAlC,SAAA,CACE,EAAC,MAAD,CAAK,UAAU,sCAAf,SAAA,CACE,EAAC,OAAD,CAAM,UAAU,mCAAqC,CAAA,EACrD,EAAC,OAAD,CAAM,UAAU,sCAAwC,CAAA,CACrD,IACL,EAAC,MAAD,CAAK,UAAU,oCACZ,SAAA,MAAM,KAAK,CAAE,OAAQ,CAAW,GAAI,EAAG,IACtC,EAAC,MAAD,CAAK,UAAU,mCAAf,SAAA,CACE,EAAC,OAAD,CAAM,UAAU,kCAAoC,CAAA,EACpD,EAAC,OAAD,CAAM,UAAU,kCAAoC,CAAA,CACjD,CAHkD,EAAA,CAGlD,CACN,CACE,CAAA,EACJ,MAAM,KAAK,CAAE,OAAQ,CAAa,GAAI,EAAG,IACxC,EAAC,MAAD,CAAK,UAAU,qCAAf,SAAA,CACE,EAAC,OAAD,CAAM,UAAU,0CAA4C,CAAA,EAC5D,EAAC,MAAD,CAAK,UAAU,6CAAf,SAAA,CACE,EAAC,OAAD,CAAM,UAAU,yCAA2C,CAAA,EAC3D,EAAC,MAAD,CAAK,UAAU,0CAAf,SAAA,CACE,EAAC,OAAD,CAAM,UAAU,yCAA2C,CAAA,EAC3D,EAAC,OAAD,CAAM,UAAU,yCAA2C,CAAA,CACxD,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAToD,EAAA,CASpD,CACN,EACD,EAAC,MAAD,CAAK,UAAU,qCAAf,SAAA,CACG,EACC,EAAC,OAAD,CAAM,UAAU,uCAAyC,CAAA,EACvD,KACJ,EAAC,OAAD,CAAM,UAAU,mCAAqC,CAAA,CAClD,GACF,CACF,CAAA,CAAA,GAET"}
|
package/dist/host-callback.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
function e(e,t){if(e)try{Promise.resolve(e(t)).catch(()=>void 0)}catch{}}export{e as t};
|
|
2
2
|
//# sourceMappingURL=host-callback.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-callback.js","names":[],"sources":["../src/form-field.tsx","../src/contact-validation.ts","../src/phone.ts","../src/phone-field.tsx","../src/host-callback.ts"],"sourcesContent":["import type { ComponentProps, ReactNode } from \"react\";\n\nexport function FieldError({\n className,\n error,\n id,\n}: {\n className?: string;\n error: string | undefined;\n id: string;\n}) {\n return error ? (\n <span\n className={`lockerverse-form__error ${className ?? \"\"}`}\n id={id}\n role=\"alert\"\n >\n {error}\n </span>\n ) : null;\n}\n\nexport function FormField({\n children,\n error,\n errorId,\n id,\n label,\n}: {\n children: ReactNode;\n error?: string | undefined;\n errorId?: string | undefined;\n id: string;\n label: string;\n}) {\n return (\n <div className=\"lockerverse-form__field\">\n <label htmlFor={id}>{label}</label>\n {children}\n <FieldError error={error} id={errorId ?? `${id}-error`} />\n </div>\n );\n}\n\ntype TextFieldProps = ComponentProps<\"input\"> & {\n error?: string | undefined;\n errorId?: string | undefined;\n id: string;\n label: string;\n};\n\nexport function TextField({\n className,\n error,\n errorId,\n id,\n label,\n ...inputProps\n}: TextFieldProps) {\n const messageId = errorId ?? `${id}-error`;\n return (\n <FormField error={error} errorId={messageId} id={id} label={label}>\n <input\n {...inputProps}\n aria-describedby={error ? messageId : inputProps[\"aria-describedby\"]}\n aria-invalid={error ? \"true\" : inputProps[\"aria-invalid\"]}\n className={`lockerverse-form__control ${className ?? \"\"}`}\n id={id}\n />\n </FormField>\n );\n}\n\nexport function EmailField(props: Omit<TextFieldProps, \"type\">) {\n return (\n <TextField\n autoComplete=\"email\"\n placeholder=\"name@example.com\"\n {...props}\n type=\"email\"\n />\n );\n}\n\n/** Native checkbox semantics with the shared SDK control appearance. */\nexport function Checkbox({\n className,\n ...props\n}: Omit<ComponentProps<\"input\">, \"type\">) {\n return (\n <input\n {...props}\n className={[\"lockerverse-form__checkbox\", className]\n .filter(Boolean)\n .join(\" \")}\n type=\"checkbox\"\n />\n );\n}\n","import {\n check,\n email,\n nonEmpty,\n pipe,\n regex,\n string,\n transform,\n trim,\n} from \"valibot\";\n\nexport const EMAIL_REQUIRED_MESSAGE = \"Email is required.\";\nexport const EMAIL_INVALID_MESSAGE = \"Enter a valid email address.\";\nexport const PHONE_REQUIRED_MESSAGE = \"Phone is required.\";\nexport const PHONE_INVALID_MESSAGE = \"Enter a valid phone number.\";\n\nconst OPTIONAL_EMAIL_PATTERN = /^(?:$|[^\\s@]+@[^\\s@]+\\.[^\\s@]+)$/;\nconst INTERNATIONAL_PHONE_PATTERN = /^\\+[1-9]\\d{6,14}$/;\n\nfunction isValidInternationalPhone(value: string) {\n return INTERNATIONAL_PHONE_PATTERN.test(value);\n}\n\nexport function normalizePhone(input: string) {\n return input.trim().replace(/[().\\s-]/g, \"\");\n}\n\nexport const optionalEmailSchema = pipe(\n string(),\n trim(),\n regex(OPTIONAL_EMAIL_PATTERN, EMAIL_INVALID_MESSAGE)\n);\n\nexport const requiredEmailSchema = pipe(\n string(),\n trim(),\n nonEmpty(EMAIL_REQUIRED_MESSAGE),\n email(EMAIL_INVALID_MESSAGE)\n);\n\nexport const optionalPhoneSchema = pipe(\n string(),\n trim(),\n check(\n (value) => value === \"\" || normalizePhone(value) !== \"\",\n PHONE_INVALID_MESSAGE\n ),\n transform(normalizePhone),\n check(\n (value) => value === \"\" || isValidInternationalPhone(value),\n PHONE_INVALID_MESSAGE\n )\n);\n\nexport const requiredPhoneSchema = pipe(\n string(),\n trim(),\n nonEmpty(PHONE_REQUIRED_MESSAGE),\n transform(normalizePhone),\n check(isValidInternationalPhone, PHONE_INVALID_MESSAGE)\n);\n\nexport function getPhoneServerError(serverCode: string | undefined) {\n if (\n serverCode === \"PAYMENT_WIDGET_PHONE_REQUIRED\" ||\n serverCode === \"SIGN_UP_WIDGET_PHONE_REQUIRED\"\n ) {\n return PHONE_REQUIRED_MESSAGE;\n }\n if (\n serverCode === \"PAYMENT_WIDGET_PHONE_INVALID\" ||\n serverCode === \"SIGN_UP_WIDGET_PHONE_INVALID\"\n ) {\n return PHONE_INVALID_MESSAGE;\n }\n}\n","import { normalizePhone } from \"./contact-validation.ts\";\n\nexport const PHONE_COUNTRIES = [\n {\n callingCode: \"+1\",\n label: \"🇺🇸 +1\",\n value: \"US\",\n },\n {\n callingCode: \"+52\",\n label: \"🇲🇽 +52\",\n value: \"MX\",\n },\n {\n callingCode: \"+380\",\n label: \"🇺🇦 +380\",\n value: \"UA\",\n },\n {\n callingCode: \"+48\",\n label: \"🇵🇱 +48\",\n value: \"PL\",\n },\n {\n callingCode: \"+1\",\n label: \"🇨🇦 +1\",\n value: \"CA\",\n },\n {\n callingCode: \"+49\",\n label: \"🇩🇪 +49\",\n value: \"DE\",\n },\n {\n callingCode: \"+44\",\n label: \"🇬🇧 +44\",\n value: \"GB\",\n },\n {\n callingCode: \"+46\",\n label: \"🇸🇪 +46\",\n value: \"SE\",\n },\n {\n callingCode: \"+358\",\n label: \"🇫🇮 +358\",\n value: \"FI\",\n },\n {\n callingCode: \"+1\",\n label: \"🇵🇷 +1\",\n value: \"PR\",\n },\n] as const;\n\nexport type PhoneCountry = (typeof PHONE_COUNTRIES)[number][\"value\"];\n\nexport function getPhoneCountry(country: string) {\n return (\n PHONE_COUNTRIES.find((option) => option.value === country) ??\n PHONE_COUNTRIES[0]\n );\n}\n\nfunction removeRepeatedCallingCode(phone: string, callingCode: string) {\n const repeatedCallingCode = `${callingCode}${callingCode}`;\n let normalizedPhone = phone;\n while (normalizedPhone.startsWith(repeatedCallingCode)) {\n normalizedPhone = `${callingCode}${normalizedPhone.slice(repeatedCallingCode.length)}`;\n }\n return normalizedPhone;\n}\n\nexport function getInternationalPhone(phone: string, country: string) {\n const normalizedPhone = normalizePhone(phone);\n if (!normalizedPhone) {\n return \"\";\n }\n\n const selectedCountry = getPhoneCountry(country);\n const phoneWithOneCallingCode = removeRepeatedCallingCode(\n normalizedPhone,\n selectedCountry.callingCode\n );\n\n return phoneWithOneCallingCode.startsWith(\"+\")\n ? phoneWithOneCallingCode\n : `${selectedCountry.callingCode}${phoneWithOneCallingCode}`;\n}\n\nexport function resolvePhoneCountry(phone: string, country = \"US\") {\n const normalized = normalizePhone(phone);\n const current = getPhoneCountry(country);\n return normalized.startsWith(\"+\") &&\n !normalized.startsWith(current.callingCode)\n ? (PHONE_COUNTRIES.find((option) =>\n normalized.startsWith(option.callingCode)\n )?.value ?? current.value)\n : current.value;\n}\n","import { ChevronDown } from \"lucide-react\";\nimport { type RefObject, useRef } from \"react\";\nimport {\n getPhoneCountry,\n PHONE_COUNTRIES,\n resolvePhoneCountry,\n} from \"./phone.ts\";\n\nexport type PhoneInputValue = { value: string; country: string };\n\nexport type PhoneInputProps = {\n country: string;\n disabled?: boolean | undefined;\n error?: string | boolean | undefined;\n errorId?: string | undefined;\n id: string;\n inputRef?: RefObject<HTMLInputElement | null> | undefined;\n name?: string | undefined;\n onChange: (value: PhoneInputValue) => void;\n placeholder?: string | undefined;\n required?: boolean | undefined;\n value: string;\n};\n\n/** Controlled raw input. The caller validates and normalizes it on submission. */\nexport function PhoneInput({\n id,\n name,\n value,\n onChange,\n country,\n required,\n disabled,\n inputRef,\n error,\n errorId,\n placeholder = \"(201) 555-0123\",\n}: PhoneInputProps) {\n const input = useRef<HTMLInputElement>(null);\n const selectedCountry = getPhoneCountry(country);\n\n return (\n <div className=\"lockerverse-form__phone\" dir=\"ltr\">\n <div className=\"lockerverse-form__phone-country\">\n <span aria-hidden=\"true\">\n <span className=\"lockerverse-form__phone-flag\">\n {selectedCountry.label.split(\" \")[0]}\n </span>\n {selectedCountry.callingCode}\n <ChevronDown aria-hidden=\"true\" size={14} />\n </span>\n <select\n aria-label=\"Phone number country\"\n disabled={disabled}\n name=\"phoneCountry\"\n onChange={(event) => {\n const nextCountry = getPhoneCountry(event.target.value);\n onChange({ country: nextCountry.value, value });\n input.current?.focus();\n }}\n value={selectedCountry.value}\n >\n {PHONE_COUNTRIES.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n <input\n aria-describedby={error ? errorId : undefined}\n aria-invalid={error ? true : undefined}\n autoComplete=\"tel-national\"\n disabled={disabled}\n id={id}\n name={name}\n onChange={(event) => {\n const raw = event.target.value;\n onChange({ country: resolvePhoneCountry(raw, country), value: raw });\n }}\n placeholder={placeholder}\n ref={(element) => {\n input.current = element;\n if (inputRef) {\n inputRef.current = element;\n }\n }}\n required={required}\n type=\"tel\"\n value={value}\n />\n </div>\n );\n}\n","export function notifyHostCallback<Value>(\n callback: ((value: Value) => void) | undefined,\n value: Value\n) {\n if (!callback) {\n return;\n }\n try {\n Promise.resolve(callback(value)).catch(() => undefined);\n } catch {\n // Host callback failures must not change completed SDK state.\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"host-callback.js","names":[],"sources":["../src/host-callback.ts"],"sourcesContent":["export function notifyHostCallback<Value>(\n callback: ((value: Value) => void) | undefined,\n value: Value\n) {\n if (!callback) {\n return;\n }\n try {\n Promise.resolve(callback(value)).catch(() => undefined);\n } catch {\n // Host callback failures must not change completed SDK state.\n }\n}\n"],"mappings":"AAAA,SAAgB,EACd,EACA,EACA,CACK,KAGL,GAAI,CACF,QAAQ,QAAQ,EAAS,CAAK,CAAC,CAAC,CAAC,UAAY,IAAA,EAAS,CACxD,MAAQ,CAER,CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { n as LockerverseTheme, t as LockerverseStyle } from "./theme.js";
|
|
2
|
+
import { n as CustomFieldValues } from "./custom-fields.js";
|
|
2
3
|
import { n as UseLockerverseWidgetResult, r as useLockerverseWidget, t as UseLockerverseWidgetOptions } from "./use-lockerverse-widget.js";
|
|
3
4
|
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
5
|
import { t as LockerverseDonateLauncher } from "./lockerverse-donate-launcher.js";
|
|
5
6
|
import { n as LockerversePayment, t as preloadLockerversePayment } from "./payment-form.js";
|
|
6
7
|
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 UseLockerverseWidgetOptions, type UseLockerverseWidgetResult, preloadLockerversePayment, useLockerverseWidget };
|
|
8
|
+
export { type CustomFieldValues, 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 _,s as v,t as y}from"./form-skeleton.js";import{useCallback as b,useEffect as x,useId as S,useLayoutEffect as C,useMemo as w,useReducer as T,useRef as E,useState as D}from"react";import{Fragment as O,jsx as k,jsxs as A}from"react/jsx-runtime";import{AddressElement as j,Elements as M,PaymentElement as N,useElements as P,useStripe as F}from"@stripe/react-stripe-js";import{array as I,minLength as L,minValue as R,nonEmpty as z,number as B,pipe as V,regex as H,safeInteger as ee,safeParse as te,strictObject as U,string as ne,trim as re,union as W}from"valibot";import{LockerverseSdkError as ie,estimateLockerverseCheckout as ae}from"@lockerverse/sdk/checkout";function oe({ariaDescribedBy:e,ariaLabel:t,ariaLabelledBy:n,className:r,id:i,invalid:a=!1,name:o,onValueChange:s,options:c,value:l}){return k(`select`,{"aria-describedby":e,"aria-invalid":a||void 0,"aria-label":t,"aria-labelledby":n,className:[`lockerverse-form__control`,`lockerverse-form__select`,r].filter(Boolean).join(` `),id:i,name:o,onChange:e=>s(e.currentTarget.value),value:l,children:c.map(e=>k(`option`,{value:e.value,children:e.label},e.value))})}const G=[`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`],K=[`15`,`12`,`10`,`5`],q=[...K,`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=q.indexOf(t),r;switch(e.key){case`ArrowDown`:case`ArrowRight`:r=(n+1)%q.length;break;case`ArrowLeft`:case`ArrowUp`:r=(n-1+q.length)%q.length;break;case`Home`:r=0;break;case`End`:r=q.length-1;break;default:return}e.preventDefault();let i=q[r];i&&((e.currentTarget.closest(`[role="radiogroup"]`)?.querySelectorAll(`input[type="radio"]`))?.[r]?.focus(),a({tipPercent:i}))};return A(`div`,{className:`lockerverse-payment__tip-box`,children:[k(`p`,{children:`Add a tip to support the Lockerverse platform`}),A(`div`,{"aria-label":`Tip amount`,role:`radiogroup`,children:[K.map(e=>A(`label`,{className:`lockerverse-payment__tip-choice`,children:[k(`input`,{checked:i.tipPercent===e,name:`tipPercent`,onChange:()=>a({tipPercent:e}),onKeyDown:t=>o(t,e),tabIndex:i.tipPercent===e?0:-1,type:`radio`,value:e}),A(`span`,{children:[e,`%`]})]},e)),A(`label`,{className:`lockerverse-payment__tip-choice`,children:[k(`input`,{checked:i.tipPercent===`custom`,name:`tipPercent`,onChange:()=>a({tipPercent:`custom`}),onKeyDown:e=>o(e,`custom`),tabIndex:i.tipPercent===`custom`?0:-1,type:`radio`,value:`custom`}),k(`span`,{children:`Other`})]})]}),i.tipPercent===`custom`?A(`label`,{children:[k(`span`,{children:`Custom tip`}),A(`span`,{className:`lockerverse-payment__money-input`,children:[k(`span`,{"aria-hidden":`true`,children:`$`}),k(`input`,{"aria-describedby":t?n:void 0,"aria-invalid":t?`true`:void 0,inputMode:`decimal`,name:`tip`,onChange:e=>a({customTip:e.currentTarget.value}),placeholder:`0.00`,value:i.customTip})]}),t?k(`span`,{className:`lockerverse-payment__field-message`,id:n,children:t}):null]}):k(`input`,{name:`tip`,type:`hidden`,value:i.tipPercent})]})}function J({checked:e,children:t,name:r,onChange:i}){let a=S();return A(`label`,{className:`lockerverse-payment__check-row`,htmlFor:a,children:[k(n,{checked:e,id:a,name:r,onChange:e=>i(e.currentTarget.checked)}),k(`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 A(`div`,{className:`lockerverse-payment__additional-fields`,children:[n.memberId?A(`label`,{children:[k(`span`,{children:a?.trim()||`Member ID`}),k(`input`,{name:`memberId`,onChange:e=>u({memberId:e.currentTarget.value}),placeholder:`Optional`,value:l.memberId})]}):null,n.merchSize?A(`div`,{className:`lockerverse-payment__field`,children:[k(`span`,{id:`${r}-merch-size-label`,children:`Size`}),k(oe,{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?A(`div`,{className:`lockerverse-payment__field`,children:[k(`span`,{id:`${r}-promo-code-label`,children:`Promo code`}),A(`div`,{className:`lockerverse-payment__promo-control`,children:[k(`input`,{"aria-describedby":c?`${r}-promo-code-error`:void 0,"aria-invalid":c?`true`:void 0,"aria-labelledby":`${r}-promo-code-label`,name:`promoCode`,onChange:e=>u({promoCode:e.currentTarget.value}),placeholder:`Optional`,value:l.promoCode}),k(`button`,{disabled:!l.promoCode.trim()||i,onClick:s,type:`button`,children:i?`Applying…`:`Apply`})]}),c?k(`p`,{className:`lockerverse-payment__field-message`,id:`${r}-promo-code-error`,role:`alert`,children:c}):null]}):null,k(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 Y({amountCents:t,enabled:n,onChange:r,values:i}){return n?A(J,{checked:i.includeServiceFee,name:`includeServiceFee`,onChange:e=>r({...i,includeServiceFee:e}),children:[`Add `,e(t),` to help cover processing fees`]}):null}function le(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 Q(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`:Q(e)?`error`:`idle`}function de(e){return e.status===`submitting`}const fe=[`amountCents`,`discountableSubtotalCents`,`discountCents`,`serviceFeeCents`,`subtotalCents`,`tipCents`,`totalCents`],pe=[`discountableSubtotalCents`,`discountCents`,`subtotalCents`];function me(e,t,n,r){return(n===t.totalCents?pe:fe).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 he(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 ge(e,t,n){if(t.checkoutStatus!==`action_required`)return he(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 he(await e.getPaymentStatus(t.paymentReference))}catch{return{kind:`unresolved`,paymentReference:t.paymentReference,reason:`action_required`}}}async function _e(e,t,n){let r;try{r=await e.submitPayment(t)}catch(n){if(!(n instanceof ie&&n.recoveryRecommended))throw n;try{r=await e.getPaymentStatus(t.checkout.paymentReference)}catch{return{kind:`unresolved`,paymentReference:t.checkout.paymentReference,reason:`recovery_failed`}}}return ge(e,r,n)}async function ve(e,t,n){try{return ge(e,await e.getPaymentStatus(t),n)}catch{return{kind:`unresolved`,paymentReference:t,reason:`recovery_failed`}}}const ye=V(ne(),re(),z()),be=V(B(),ee(),R(1)),xe=V(I(W([U({amountCents:be,productSlug:ye}),U({productSlug:ye,quantity:be}),U({productSlug:ye})])),L(1)),Se=V(ne(),re(),H(/^(?:0|[1-9]\d*)(?:\.\d{1,2})?$/,`Enter a valid tip amount.`));function Ce(e){let t=te(Se,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=te(xe,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,checkoutItems:t,confirmationToken:n,email:r,fieldValues:i,metadata:a,phone:o,shippingAddress:s}){let c={customFieldAnswers:_(m(e,t),i.customFields),email:r};if(n&&(c.confirmationToken=n),a&&(c.metadata=a),e.widget.fields.memberId&&i.memberId.trim()&&(c.memberId=i.memberId.trim()),e.widget.fields.merchSize&&(c.merchSize=i.merchSize),e.widget.fields.phone&&(c.phone=o),s){let e={city:s.address.city??``,country:s.address.country,line1:s.address.line1??``,postal_code:s.address.postal_code??``,state:s.address.state??``};s.address.line2&&(e.line2=s.address.line2),c.shipping={address:e,name:s.name}}return c}function Fe(e){if(!e())throw Error(`Payment component is no longer active.`)}function Ie(e,t){s(e,t)}function Le(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 Re({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(Fe(s),y.totalCents>0&&me(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}),Fe(s);let n=await i.submit();if(Fe(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(Fe(s),a.error)throw Error(a.error.message);x=a.confirmationToken.id}Ie(d,{connectedAccountId:y.payment.connectedAccountId,paymentReference:y.paymentReference});let S=await _e(r,{checkout:y,submission:Pe({catalog:t,checkoutItems:n,confirmationToken:x,email:g,fieldValues:o,metadata:l,phone:_,shippingAddress:b})},m);return Fe(s),Le(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 ze(e,t){s(e,t)}function Be(e,t){s(e,t)}function Ve(e,t){return{...e,...t}}function He(e,t,n){return e.kind===`unresolved`&&e.reason===`action_required`&&!t&&!n}function Ue(e){return e instanceof ie&&e.serverCode===`PAYMENT_WIDGET_SALES_LIMIT_REACHED`}function We({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 Ge({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 Ke({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`){ze(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`}),Be(r,{paymentReference:a.paymentReference,reason:a.reason});return}i(a.quote),ze(n,null),c({message:a.payment.paymentRequired?`Payment completed successfully.`:`Order confirmed. No payment was required.`,type:`succeeded`}),s(t,Ve(a.payment,{email:a.email,lineItems:a.quote.lineItems}))}function qe(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:y,stripeConnectedAccountId:S,stripeLoadFailed:C,paymentState:w,updateState:T}=e,[O,k]=D(_.totalCents),[A,j]=D(),M=E(!1),N=E(0),P=E(0),F=b(e=>T(e,!0),[T]),I=b(()=>{let e=P.current+1;return P.current=e,()=>P.current===e},[]);x(()=>()=>{P.current+=1,N.current+=1},[]);let{parsedTip:L,totalCents:R}=Oe(n,l,_);x(()=>{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]),x(()=>{if(!v||M.current||w.status!==`recovering`)return;M.current=!0;let e=I();return g(ue(w)),ve(i,v.paymentReference,y).then(t=>{if(e()&&!He(t,y,C)){if(t.kind===`failed`){ze(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`}),Be(m,{paymentReference:t.paymentReference,reason:t.reason});return}ze(p,null),F({message:t.payment.paymentRequired?`Payment completed successfully.`:`Order confirmed. No payment was required.`,type:`succeeded`}),s(d,Ve(t.payment,{email:null,lineItems:null}))}}),()=>{e()&&(P.current+=1),M.current=!1}},[i,d,f,p,m,g,v,y,C,I,F,w]);let z=b((e=!1,t=!1)=>{t||(N.current+=1),e&&j(void 0),T({type:`field_changed`})},[T]);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;T({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;We({nextQuote:e,onQuoteChange:h,setDisplayedTotalCents:k,setPromoError:j,updateState:T,validatePromo:t})}catch(e){if(u!==N.current)return;if(Ue(e)){T({type:`sold_out`});return}Ge({error:e,setPromoError:j,updateState:T,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 Re({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:y,stripeConnectedAccountId:S});if(!c())return;Ke({dispatchState:F,onPaymentComplete:d,onPaymentRecoveryChange:p,onPaymentUncertain:m,onQuoteChange:h,result:t,setDisplayedTotalCents:k})}catch(e){if(!c())return;if(ze(p,null),Ue(e)){F({type:`sold_out`});return}let n=e instanceof ie?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 ee=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:Q(w),promoError:A,terminalMessage:ee}}}const Je=d;function Ye(e){let{connectedAccountId:t,publishableKey:n}=e.payment;return Je(n,t?{stripeAccount:t}:void 0)}function Xe(e){return e===`monthly`?{interval:`month`,label:`Monthly`}:e===`annually`?{interval:`year`,label:`Annual`}:null}function Ze(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 Qe({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[v,S]=D(()=>le(!!p)),C=E(v);C.current=v;let T=b((e,t=!1)=>{let n=Z(C.current,e);n!==C.current&&(C.current=n,S(n),t&&m(ue(n)))},[m]),O=Ze(t,f,p),A=E({connectedAccountId:O,paymentOption:f.paymentOption});v.status!==`submitting`&&v.status!==`recovering`&&(A.current={connectedAccountId:O,paymentOption:f.paymentOption});let{connectedAccountId:j,paymentOption:N}=A.current,P=w(()=>h(t.payment.publishableKey,j?{stripeAccount:j}:void 0).catch(()=>null),[t.payment.publishableKey,j,h]),[F,I]=D(!1);x(()=>{let e=!0;return I(!1),P.then(t=>{e&&t===null&&I(!0)}),()=>{e=!1}},[P]);let L=l(i,g,_,v.status===`submitting`||v.status===`recovering`,e);return L?k(M,{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:k(lt,{catalog:t,checkoutItems:n,client:r,metadata:a,onPaymentComplete:o,onPaymentRecoveryChange:c,onPaymentUncertain:u,onQuoteChange:d,onResumePaymentFailed:s,onStateChange:m,paymentState:v,quote:f,resumePayment:p,stripeConnectedAccountId:j,stripeLoadFailed:F,updateState:T})},`${t.payment.publishableKey}:${j??`platform`}:${N}`):k(y,{fieldCount:3,label:`Loading payment form`})}function $e({label:e}){return A(`div`,{className:`lockerverse-payment__stripe-loader`,role:`status`,children:[k(`p`,{children:e}),A(`div`,{"aria-hidden":`true`,children:[k(`span`,{}),k(`span`,{}),k(`span`,{})]})]})}function et({onError:e,onReady:t,ready:n}){return A(`div`,{className:`lockerverse-payment__stripe-element`,"data-ready":n,children:[n?null:k($e,{label:`Loading payment form...`}),k(`div`,{className:`lockerverse-payment__stripe-mount`,children:k(N,{onLoadError:({error:t})=>e(t.message??`Payment form failed to load.`),onReady:t,options:{business:{name:`Lockerverse`},fields:{billingDetails:{address:`never`,email:`never`,name:`never`,phone:`never`}},layout:`tabs`,terms:{applePay:`auto`,auBecsDebit:`never`,bancontact:`never`,card:`always`,cashapp:`never`,googlePay:`never`,ideal:`never`,paypal:`auto`,sepaDebit:`never`,sofort:`never`,usBankAccount:`never`},wallets:{applePay:`auto`,googlePay:`never`}}})})]})}function tt({label:e,mode:t,onChange:n,onError:r,onReady:i,ready:a}){return A(`div`,{className:`lockerverse-payment__address`,children:[k(`h2`,{children:e}),A(`div`,{className:`lockerverse-payment__stripe-element lockerverse-payment__stripe-element--address`,"data-ready":a,children:[a?null:k($e,{label:`Loading ${e.toLowerCase()}...`}),k(`div`,{className:`lockerverse-payment__stripe-mount`,children:k(j,{onChange:n,onLoadError:({error:t})=>r(t.message??`${e} failed to load.`),onReady:i,options:{autocomplete:{mode:`automatic`},mode:t}})})]})]})}function nt({message:e}){return e?k(`p`,{className:`lockerverse-payment__field-message`,role:`alert`,children:e}):null}function rt({catalog:e,displayedTotalCents:t,fieldValues:n,isBillingAddressReady:r,isPaymentReady:i,isShippingAddressReady:a,onAddressChange:o,onFieldValuesChange:s,onStripeLoadError:c,setIsBillingAddressReady:l,setIsPaymentReady:u,setIsShippingAddressReady:d}){let f=t>0;return A(O,{children:[f?k(et,{onError:c,onReady:()=>u(!0),ready:i}):null,f||e.widget.fields.shipping?k(tt,{label:f?`Billing address`:`Shipping address`,mode:`billing`,onChange:e=>o(`billing`,e),onError:c,onReady:()=>l(!0),ready:r}):null,e.widget.fields.shipping?A(`div`,{className:`lockerverse-payment__shipping`,children:[k(J,{checked:n.shippingMatchesBilling,name:`shippingMatchesBilling`,onChange:e=>{s({...n,shippingMatchesBilling:e}),e?o(`shipping`,null):d(!1)},children:`Shipping is same as billing information`}),n.shippingMatchesBilling?null:k(tt,{label:`Shipping address`,mode:`shipping`,onChange:e=>o(`shipping`,e),onError:c,onReady:()=>d(!0),ready:a})]}):null]})}function it({displayedBaseCents:t,displayedTipCents:n,displayedTotalCents:r,quote:i}){let a=Xe(i.paymentOption),o=Math.max(0,t-i.subtotalCents+i.discountCents);return A(`section`,{"aria-label":`Payment summary`,className:`lockerverse-payment__payment-summary`,children:[k(`h2`,{children:`Order summary`}),k(`div`,{className:`lockerverse-payment__payment-summary-items`,children:i.lineItems.map(t=>A(`div`,{className:`lockerverse-payment__payment-summary-row`,children:[A(`span`,{children:[t.productName,t.quantity>1?A(O,{children:[` `,A(`small`,{children:[`× `,t.quantity]})]}):null,t.paymentOption===`monthly`?k(`small`,{children:` · Monthly`}):null,t.paymentOption===`annually`?k(`small`,{children:` · Annual`}):null]}),k(`strong`,{children:e(t.subtotalCents)})]},t.listingId))}),A(`div`,{className:`lockerverse-payment__payment-summary-totals`,children:[o>0?A(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-detail`,children:[k(`span`,{children:`Service fee`}),k(`strong`,{children:e(o)})]}):null,i.discountCents>0&&i.appliedDiscount?A(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-discount`,children:[A(`span`,{children:[i.appliedDiscount.source===`email_list`?`Email discount`:`Promo code discount`,` `,`(`,i.appliedDiscount.percentageOff,`% off)`]}),A(`strong`,{children:[`-`,e(i.discountCents)]})]}):null,n>0?A(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-detail lockerverse-payment__payment-summary-tip`,children:[k(`span`,{children:`Tip`}),k(`strong`,{children:e(n)})]}):null,A(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-total`,children:[k(`span`,{children:a?`${a.label} total`:`Total`}),k(`strong`,{children:e(r)})]})]})]})}function at({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=Xe(l.paymentOption),p=u?`Complete order`:`Pay ${e(n)}`;!u&&f&&(p=`Subscribe for ${e(n)}/${f.interval}`),s&&(p=u?`Completing…`:`Processing…`);let m=`Process payment for ${e(n)} total`;return u?m=`Complete order`:f&&(m=`Start ${f.label.toLowerCase()} subscription for ${e(n)}`),A(`div`,{className:`lockerverse-payment__actions`,children:[k(Y,{amountCents:l.serviceFeeCents||Math.round(l.subtotalCents*t.pricingPolicy.serviceFeeRateBasisPoints/1e4),enabled:t.widget.fields.serviceFee,onChange:c,values:r}),k(`button`,{"aria-busy":s,"aria-label":m,disabled:s||!d,type:`submit`,children:p})]})}function ot(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 st({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&&ot(n,`custom:${o}`)}function ct({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 A(`div`,{className:`lockerverse-payment__contact`,children:[k(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:A(`p`,{className:`lockerverse-payment__discount-message`,role:`status`,children:[`Your email qualifies for `,t,`% off.`]}),m?k(i,{error:c.phone,errorId:h,id:g,label:`Phone`,children:k(a,{country:p,error:c.phone,errorId:h,id:g,inputRef:_,name:`phone`,onChange:d,required:!0,value:f})}):null]})}function lt({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:y,updateState:b}){let C=m(e,t),[w,T]=D(``),[O,j]=D(``),[M,N]=D(`US`),[I,L]=D({}),[R,z]=D({}),[B,V]=D(),[H,ee]=D(!1),[te,U]=D(!1),[ne,re]=D(!1),[W,ie]=D({customFields:h(C),customTip:``,includeServiceFee:e.widget.fields.serviceFee,memberId:``,merchSize:`M`,promoCode:``,shippingMatchesBilling:!0,tipPercent:`10`}),ae=E({billing:null,shipping:null}),oe=E(null),G=E(null),K=E(null),q=E(f.totalCents>0),J=qe({catalog:e,checkoutItems:t,client:n,elements:P(),email:w,fieldValues:W,metadata:r,onPaymentComplete:i,onPaymentRecoveryChange:s,onPaymentUncertain:l,onQuoteChange:u,onResumePaymentFailed:a,onStateChange:d,paymentState:y,quote:f,resumePayment:p,stripe:F(),stripeConnectedAccountId:g,stripeLoadFailed:_,updateState:b}),{displayedTotalCents:Y,isRecovering:le,isRefreshingQuote:X,isSubmitting:Z,parsedTip:Q,paymentError:ue,promoError:de,terminalMessage:fe}=J.state,pe=`lockerverse-${S()}`,me=`${pe}-email`,he=`${me}-error`,ge=`${pe}-phone`,_e=`${ge}-error`,ve=`${pe}-tip-error`,ye=(Q.success?Q.cents:null)??0,be=Y-ye,xe=!e.widget.fields.shipping||W.shippingMatchesBilling||ne;x(()=>{Z&&K.current?.focus({preventScroll:!0})},[Z]),x(()=>{Z||I.email||!I.phone||G.current?.focus()},[I.email,I.phone,Z]),x(()=>{let e=Y>0;e&&!q.current&&(ee(!1),U(!1)),q.current=e},[Y]);function Se(e){J.commands.fieldChanged(!1,e!==`email`),L(t=>{let n={...t};return delete n[e],n})}function Ce(e){let t=e.promoCode!==W.promoCode,n=e.includeServiceFee!==W.includeServiceFee;J.commands.fieldChanged(t,!(t||n)),ie(e),z({}),V(void 0)}async function we(t){t.preventDefault();let n=e.widget.fields.phone?o(O,M):``,r=c({email:w,phone:n},e.widget.fields.phone),i=v(C,W.customFields);if(!(r.value&&Q.success)||Object.keys(i).length>0){L(r.errors),z(i),V(Q.success?void 0:Q.message),J.commands.reportValidationFailure();let e=t.currentTarget;queueMicrotask(()=>{st({customFieldErrors:i,emailRef:oe,form:e,parsedTipSuccess:Q.success,phoneRef:G,validationErrors:r.errors})});return}L({}),z({});let a=await J.commands.submit({addresses:ae.current,phone:n});a?.phoneError&&L({phone:a.phoneError})}return fe?k(`p`,{className:`lockerverse-payment__payment-status`,ref:K,role:`status`,tabIndex:-1,children:fe}):le?k(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:`Recovering payment…`}):A(`form`,{"aria-busy":Z,className:`lockerverse-payment__form`,noValidate:!0,onSubmit:we,children:[k(`div`,{"data-lockerverse-input-region":``,inert:Z?!0:void 0,children:A(`fieldset`,{className:`lockerverse-payment__input-fieldset`,disabled:Z,children:[k(it,{displayedBaseCents:be,displayedTipCents:ye,displayedTotalCents:Y,quote:f}),k(se,{enabled:e.widget.fields.tipping,error:B,errorId:ve,onChange:Ce,values:W}),k(ct,{email:w,emailDiscountPercentOff:f.appliedDiscount?.source===`email_list`?f.appliedDiscount.percentageOff:void 0,emailErrorId:he,emailId:me,emailRef:oe,errors:I,onEmailBlur:()=>J.commands.refreshAuthoritativeTotal(),onEmailChange:e=>{T(e),Se(`email`)},onPhoneChange:({value:e,country:t})=>{j(e),N(t),Se(`phone`)},phone:O,phoneCountry:M,phoneEnabled:e.widget.fields.phone,phoneErrorId:_e,phoneId:ge,phoneRef:G}),k(rt,{catalog:e,displayedTotalCents:Y,fieldValues:W,isBillingAddressReady:te,isPaymentReady:H,isShippingAddressReady:ne,onAddressChange:(e,t)=>{ae.current[e]=t},onFieldValuesChange:Ce,onStripeLoadError:J.commands.reportStripeLoadError,setIsBillingAddressReady:U,setIsPaymentReady:ee,setIsShippingAddressReady:re}),k(ce,{customFields:C,errors:R,fields:e.widget.fields,idPrefix:pe,isPromoApplying:X,memberIdLabel:e.community?.memberIdLabel,onApplyPromo:J.commands.applyPromo,onChange:Ce,promoError:de,values:W}),k(at,{catalog:e,displayedTotalCents:Y,fieldValues:W,isBillingAddressReady:te,isPaymentReady:H,isRequiredShippingReady:xe,isSubmitting:Z,onFieldValuesChange:Ce,quote:f})]})}),Z?k(`p`,{className:`lockerverse-payment__sr-only`,ref:K,role:`status`,tabIndex:-1,children:Y===0?`Completing order…`:`Processing payment…`}):null,k(nt,{message:ue})]})}function ut(){return k(y,{fieldCount:2,label:`Loading payment…`,sectionCount:2,showCheckbox:!0})}function dt(e,t){switch(t.type){case`loading`:return{phase:`loading`,revision:e.revision};case`ready`:return mt(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 ft({checkout:e}){return{displayedQuote:e,type:`ready`}}function pt(e){return e instanceof Error?e.message:`Lockerverse payment could not load.`}function mt(e,t){return{checkoutItems:[...e.items],displayedQuote:e,phase:`ready`,quoteFailure:void 0,revision:t}}function ht(e,t){let n=e.widget.fields.serviceFee;return ae(e,{includeServiceFee:n,selection:t})}function gt(e,t){try{return mt(ht(e,t),1)}catch(e){return{failure:pt(e),phase:`error`,revision:0}}}function _t({catalog:e,client:t,paymentState:n,selection:r}){let i=we(r),a=i.success?JSON.stringify(i.value):`invalid-selection`,o=w(()=>i.success?i.value:[],[i.success,a]),[s,c]=T(dt,void 0,()=>i.success?gt(e,o):{phase:`loading`,revision:0}),l=E(void 0),u=E(0),d=E(s.phase===`ready`?{catalog:e,selectionKey:a}:void 0),f=E(s.phase===`error`?{catalog:e,selectionKey:a}:void 0),p=n===`submitting`||n===`success`||n===`unresolved`;x(()=>{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=pt(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=ht(e,o);r=!0,d.current={catalog:e,selectionKey:a},s(ft({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 vt={annually:`/year`,monthly:`/month`,"one-time":``};function yt({branding:e,catalog:t}){return A(`header`,{children:[t.widget.showCommunityBranding&&e?A(`div`,{className:`lockerverse-payment__branding`,children:[e.imageUrl?k(`img`,{alt:e.name,height:`48`,src:e.imageUrl,width:`48`}):null,k(`strong`,{children:e.name})]}):null,k(`h1`,{children:t.widget.title??t.widget.name}),t.widget.description?k(`p`,{children:t.widget.description}):null]})}function bt({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:A(`div`,{className:`lockerverse-payment__payment-summary`,children:[k(`h2`,{children:`Products`}),k(`div`,{className:`lockerverse-payment__payment-summary-items`,children:r.map(t=>{let n=t.pricingMode===`fixed`?t.amountCents:t.minimumAmountCents,r=vt[t.paymentOption];return A(`div`,{className:`lockerverse-payment__payment-summary-row`,children:[k(`span`,{children:t.name}),k(`strong`,{children:n===null?`Choose amount`:`${t.pricingMode===`custom`?`From `:``}${e(n)}${r}`})]},t.id)})}),k(`p`,{children:`Base prices. Final total is checked at checkout.`})]})}function xt(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 St({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=Je,theme:h=`dark`,...g}=i,[_,v]=D(d),y=E(null),[S,w]=D(),[T,O]=D(`idle`),j=E(void 0),{selectionError:M,session:N,updateCheckout:P}=_t({catalog:e,client:t,paymentState:T,selection:f}),F=N.phase===`ready`?N.revision:void 0,I=b(e=>{F!==void 0&&(j.current=F),O(e)},[F]),L=b(e=>l?.(e),[l]),R=b(()=>{v(void 0)},[]);x(()=>{N.phase===`loading`&&w(void 0)},[N.phase]),C(()=>{N.phase===`ready`&&j.current!==N.revision&&O(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}=xt(p,B);return M?k(`section`,{...g,className:z,"data-lockerverse-theme":h,role:`alert`,style:H,children:M}):N.phase===`error`&&N.failure===`This option is sold out.`||T===`sold_out`?A(`section`,{...g,className:z,"data-lockerverse-theme":h,role:`alert`,style:H,children:[k(`h1`,{children:`Sold out`}),k(`p`,{children:`This option is sold out.`})]}):N.phase===`error`?k(`section`,{...g,className:z,"data-lockerverse-theme":h,style:H,children:k(`p`,{role:`alert`,children:N.failure})}):N.phase===`ready`?A(`section`,{...g,"aria-label":`Payment`,className:z,"data-lockerverse-theme":h,"data-payment-state":T,ref:y,style:H,children:[k(yt,{branding:B,catalog:e}),n?A(`div`,{role:`alert`,children:[k(`p`,{children:n.message}),k(`button`,{onClick:r,type:`button`,children:`Retry`})]}):null,S?k(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:S}):null,N.quoteFailure?A(`div`,{className:`lockerverse-payment__payment-status`,role:`alert`,children:[k(`span`,{children:N.quoteFailure}),k(`span`,{children:` The final total will be checked when you submit.`})]}):null,k(Qe,{accentColor:V,appearanceRoot:y,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)]}):A(`section`,{...g,"aria-busy":`true`,"aria-label":`Payment`,className:z,"data-lockerverse-theme":h,style:H,children:[k(yt,{branding:B,catalog:e}),n?A(`div`,{role:`alert`,children:[k(`p`,{children:n.message}),k(`button`,{onClick:r,type:`button`,children:`Retry`})]}):null,k(ut,{})]})}function Ct({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),k(`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 wt({widget:e,...t}){return e.error&&!e.catalog?A(Ct,{viewProps:t,children:[k(`p`,{role:`alert`,children:e.error.message}),k(`button`,{onClick:e.refresh,type:`button`,children:`Retry`})]}):e.loading?A(Ct,{loading:!0,viewProps:t,children:[e.catalog?A(O,{children:[k(yt,{branding:t.branding??e.catalog.community,catalog:e.catalog}),k(bt,{catalog:e.catalog,selection:t.selection})]}):null,k(ut,{})]}):e.catalog?k(St,{catalog:e.catalog,client:e.client,loadError:e.error,onRetry:e.refresh,...t}):k(Ct,{loading:!0,viewProps:t,children:k(ut,{})})}export{Ye as n,wt as t};
|
|
1
|
+
import{t as e}from"./format-money.js";import{d as t,i as n,n as r,p as i,t as a,u as o}from"./phone-field.js";import{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 _,s as v}from"./custom-fields.js";import{t as y}from"./form-skeleton.js";import{t as b}from"./payment-summary.js";import{useCallback as x,useEffect as S,useId as C,useLayoutEffect as w,useMemo as T,useReducer as E,useRef as D,useState as O}from"react";import{Fragment as k,jsx as A,jsxs as j}from"react/jsx-runtime";import{AddressElement as M,Elements as N,PaymentElement as P,useElements as F,useStripe as I}from"@stripe/react-stripe-js";import{array as L,minLength as R,minValue as z,nonEmpty as B,number as V,pipe as H,regex as U,safeInteger as ee,safeParse as te,strictObject as ne,string as re,trim as ie,union as ae}from"valibot";import{LockerverseSdkError as W,estimateLockerverseCheckout as oe}from"@lockerverse/sdk/checkout";function se({ariaDescribedBy:e,ariaLabel:t,ariaLabelledBy:n,className:r,id:i,invalid:a=!1,name:o,onValueChange:s,options:c,value:l}){return A(`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=>A(`option`,{value:e.value,children:e.label},e.value))})}const ce=[`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`],G=[`15`,`12`,`10`,`5`],K=[...G,`custom`];function le({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 j(`div`,{className:`lockerverse-payment__tip-box`,children:[A(`p`,{children:`Add a tip to support the Lockerverse platform`}),j(`div`,{"aria-label":`Tip amount`,role:`radiogroup`,children:[G.map(e=>j(`label`,{className:`lockerverse-payment__tip-choice`,children:[A(`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}),j(`span`,{children:[e,`%`]})]},e)),j(`label`,{className:`lockerverse-payment__tip-choice`,children:[A(`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`}),A(`span`,{children:`Other`})]})]}),i.tipPercent===`custom`?j(`label`,{children:[A(`span`,{children:`Custom tip`}),j(`span`,{className:`lockerverse-payment__money-input`,children:[A(`span`,{"aria-hidden":`true`,children:`$`}),A(`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?A(`span`,{className:`lockerverse-payment__field-message`,id:n,children:t}):null]}):A(`input`,{name:`tip`,type:`hidden`,value:i.tipPercent})]})}function ue({checked:e,children:t,name:n,onChange:r}){let i=C();return j(`label`,{className:`lockerverse-payment__check-row`,htmlFor:i,children:[A(o,{checked:e,id:i,name:n,onChange:e=>r(e.currentTarget.checked)}),A(`span`,{children:t})]})}function de({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 j(`div`,{className:`lockerverse-payment__additional-fields`,children:[n.memberId?j(`label`,{children:[A(`span`,{children:a?.trim()||`Member ID`}),A(`input`,{name:`memberId`,onChange:e=>u({memberId:e.currentTarget.value}),placeholder:`Optional`,value:l.memberId})]}):null,n.merchSize?j(`div`,{className:`lockerverse-payment__field`,children:[A(`span`,{id:`${r}-merch-size-label`,children:`Size`}),A(se,{ariaLabelledBy:`${r}-merch-size-label`,name:`merchSize`,onValueChange:e=>{let t=ce.find(t=>t===e);t&&u({merchSize:t})},options:ce.map(e=>({label:e,value:e})),value:l.merchSize})]}):null,n.promoCode?j(`div`,{className:`lockerverse-payment__field`,children:[A(`span`,{id:`${r}-promo-code-label`,children:`Promo code`}),j(`div`,{className:`lockerverse-payment__promo-control`,children:[A(`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}),A(`button`,{disabled:!l.promoCode.trim()||i,onClick:s,type:`button`,children:i?`Applying…`:`Apply`})]}),c?A(`p`,{className:`lockerverse-payment__field-message`,id:`${r}-promo-code-error`,role:`alert`,children:c}):null]}):null,A(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 q({amountCents:t,enabled:n,onChange:r,values:i}){return n?j(ue,{checked:i.includeServiceFee,name:`includeServiceFee`,onChange:e=>r({...i,includeServiceFee:e}),children:[`Add `,e(t),` to help cover processing fees`]}):null}function J(e){return{error:void 0,message:void 0,status:e?`recovering`:`editing`}}function Y(e,t,n){return t.includes(e.status)?{...e,...n}:e}function fe(e,t){if(e.status===`sold_out`||e.status===`succeeded`||e.status===`unresolved`)return e;switch(t.type){case`field_changed`:return Y(e,[`editing`,`invalid`,`refreshing_quote`],{error:void 0,status:`editing`});case`validation_failed`:return Y(e,[`editing`],{status:`invalid`});case`quote_refresh_started`:return Y(e,[`editing`,`invalid`],{status:`refreshing_quote`});case`quote_refresh_succeeded`:return Y(e,[`refreshing_quote`],{error:void 0,status:`editing`});case`quote_refresh_failed`:return Y(e,[`refreshing_quote`],{error:t.error??e.error,status:`editing`});case`submission_started`:return Y(e,[`editing`,`invalid`,`refreshing_quote`],{error:void 0,status:`submitting`});case`submission_validation_failed`:return Y(e,[`submitting`],{error:void 0,status:`invalid`});case`quote_changed`:return Y(e,[`submitting`],{status:`editing`});case`retryable_failure`:return Y(e,[`editing`,`invalid`,`submitting`],{error:t.error,status:`editing`});case`recovery_failed`:return Y(e,[`recovering`],{error:t.error,status:`editing`});case`sold_out`:return{error:void 0,message:void 0,status:`sold_out`};case`succeeded`:return Y(e,[`recovering`,`submitting`],{message:t.message,status:`succeeded`});case`unresolved`:return Y(e,[`recovering`,`submitting`],{message:t.message,status:`unresolved`});default:return e}}function X(e){return e.status===`editing`||e.status===`invalid`||e.status===`refreshing_quote`?e.error:void 0}function Z(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`:X(e)?`error`:`idle`}function pe(e){return e.status===`submitting`}const me=[`amountCents`,`discountableSubtotalCents`,`discountCents`,`serviceFeeCents`,`subtotalCents`,`tipCents`,`totalCents`],he=[`discountableSubtotalCents`,`discountCents`,`subtotalCents`];function ge(e,t,n,r){return(n===t.totalCents?he:me).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 _e(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 ve(e,t,n){if(t.checkoutStatus!==`action_required`)return _e(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 _e(await e.getPaymentStatus(t.paymentReference))}catch{return{kind:`unresolved`,paymentReference:t.paymentReference,reason:`action_required`}}}async function ye(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 ve(e,r,n)}async function be(e,t,n){try{return ve(e,await e.getPaymentStatus(t),n)}catch{return{kind:`unresolved`,paymentReference:t,reason:`recovery_failed`}}}const xe=H(re(),ie(),B()),Se=H(V(),ee(),z(1)),Ce=H(L(ae([ne({amountCents:Se,productSlug:xe}),ne({productSlug:xe,quantity:Se}),ne({productSlug:xe})])),R(1)),we=H(re(),ie(),U(/^(?:0|[1-9]\d*)(?:\.\d{1,2})?$/,`Enter a valid tip amount.`));function Te(e){let t=te(we,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 Q(e){let t=te(Ce,e);return t.success?{success:!0,value:t.output}:{message:`Lockerverse payment configuration is invalid.`,success:!1}}const Ee=`This promo code is invalid or cannot be applied.`;function De(e,t){return t.tipPercent===`custom`?t.customTip.trim()?Te(t.customTip):{cents:0,success:!0}:{cents:Math.round(e*Number(t.tipPercent)/100),success:!0}}function Oe(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 ke(e,t,n){let r=e.widget.fields.tipping?De(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 Ae(e,t){return{displayedTotalCents:e.totalCents,promoError:t&&e.appliedDiscount?.source!==`promo_code`?Ee:void 0}}function je(e,t){let n;return t||(n=e instanceof Error?e.message:`The order total could not be updated.`),{paymentError:n,promoError:t?Ee:void 0}}function Me(e,t){if(!e?.complete)throw Error(`${t} address is required.`);return e.value}function Ne(e,t,n,r){if(e.widget.fields.shipping)return t.shippingMatchesBilling?n:Me(r.shipping,`Shipping`)}function Pe({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 Fe({catalog:e,checkoutItems:t,confirmationToken:n,email:r,fieldValues:i,metadata:a,phone:o,shippingAddress:s}){let c={customFieldAnswers:_(m(e,t),i.customFields),email:r};if(n&&(c.confirmationToken=n),a&&(c.metadata=a),e.widget.fields.memberId&&i.memberId.trim()&&(c.memberId=i.memberId.trim()),e.widget.fields.merchSize&&(c.merchSize=i.merchSize),e.widget.fields.phone&&(c.phone=o),s){let e={city:s.address.city??``,country:s.address.country,line1:s.address.line1??``,postal_code:s.address.postal_code??``,state:s.address.state??``};s.address.line2&&(e.line2=s.address.line2),c.shipping={address:e,name:s.name}}return c}function Ie(e){if(!e())throw Error(`Payment component is no longer active.`)}function Le(e,t){s(e,t)}function Re(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 ze({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=De(p.subtotalCents,o);if(!v.success)throw Error(v.message);let y=await r.calculateTotal({...Oe(t,o,g,v.cents),catalog:t,items:n});if(Ie(s),y.totalCents>0&&ge(p,y,c,h))return{kind:`quote_changed`,quote:y};let b,x;if(y.totalCents===0)t.widget.fields.shipping&&(b=Ne(t,o,Me(e.billing,`Billing`),e));else{if(!(i&&m))throw Error(`Payment form is still loading.`);await i.update({amount:y.totalCents}),Ie(s);let n=await i.submit();if(Ie(s),n.error)throw Error(n.error.message);let r=Me(e.billing,`Billing`);b=Ne(t,o,r,e);let a=await m.createConfirmationToken({elements:i,params:Pe({billingAddress:r,catalog:t,email:g,phone:_,shippingAddress:b})});if(Ie(s),a.error)throw Error(a.error.message);x=a.confirmationToken.id}Le(d,{connectedAccountId:y.payment.connectedAccountId,paymentReference:y.paymentReference});let S=await ye(r,{checkout:y,submission:Fe({catalog:t,checkoutItems:n,confirmationToken:x,email:g,fieldValues:o,metadata:l,phone:_,shippingAddress:b})},m);return Ie(s),Re(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 Be(e,t){s(e,t)}function Ve(e,t){s(e,t)}function He(e,t){return{...e,...t}}function Ue(e,t,n){return e.kind===`unresolved`&&e.reason===`action_required`&&!t&&!n}function We(e){return e instanceof W&&e.serverCode===`PAYMENT_WIDGET_SALES_LIMIT_REACHED`}function Ge({nextQuote:e,onQuoteChange:t,setDisplayedTotalCents:n,setPromoError:r,updateState:i,validatePromo:a}){let o=Ae(e,a);i({type:`quote_refresh_succeeded`}),n(o.displayedTotalCents),t(e),a&&r(o.promoError)}function Ke({error:e,setPromoError:t,updateState:n,validatePromo:r}){let i=je(e,r);r&&t(i.promoError),n(i.paymentError===void 0?{type:`quote_refresh_failed`}:{error:i.paymentError,type:`quote_refresh_failed`})}function qe({onPaymentComplete: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`){Be(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`}),Ve(r,{paymentReference:a.paymentReference,reason:a.reason});return}i(a.quote),Be(n,null),c({message:a.payment.paymentRequired?`Payment completed successfully.`:`Order confirmed. No payment was required.`,type:`succeeded`}),s(t,He(a.payment,{email:a.email,lineItems:a.quote.lineItems}))}function Je(e){let{catalog:t,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:y,stripeConnectedAccountId:b,stripeLoadFailed:C,paymentState:w,updateState:T}=e,[E,k]=O(_.totalCents),[A,j]=O(),M=D(!1),N=D(0),P=D(0),F=x(e=>T(e,!0),[T]),I=x(()=>{let e=P.current+1;return P.current=e,()=>P.current===e},[]);S(()=>()=>{P.current+=1,N.current+=1},[]);let{parsedTip:L,totalCents:R}=ke(t,l,_);S(()=>{R!==null&&(k(R),R>0&&a?.update({amount:R}))},[t.pricingPolicy.serviceFeeRateBasisPoints,t.widget.fields.serviceFee,a,l.includeServiceFee,R,_.serviceFeeCents,_.tipCents,_.totalCents,_.subtotalCents]),S(()=>{if(!v||M.current||w.status!==`recovering`)return;M.current=!0;let e=I();return g(Z(w)),be(i,v.paymentReference,y).then(t=>{if(e()&&!Ue(t,y,C)){if(t.kind===`failed`){Be(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`}),Ve(m,{paymentReference:t.paymentReference,reason:t.reason});return}Be(p,null),F({message:t.payment.paymentRequired?`Payment completed successfully.`:`Order confirmed. No payment was required.`,type:`succeeded`}),s(d,He(t.payment,{email:null,lineItems:null}))}}),()=>{e()&&(P.current+=1),M.current=!1}},[i,d,f,p,m,g,v,y,C,I,F,w]);let z=x((e=!1,t=!1)=>{t||(N.current+=1),e&&j(void 0),T({type:`field_changed`})},[T]);async function B(e=!1,n=!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;T({type:`quote_refresh_started`});try{let e=await i.calculateTotal({...Oe(t,l,s.value?.email??``,L.cents),catalog:t,items:r});if(u!==N.current)return;Ge({nextQuote:e,onQuoteChange:h,setDisplayedTotalCents:k,setPromoError:j,updateState:T,validatePromo:n})}catch(e){if(u!==N.current)return;if(We(e)){T({type:`sold_out`});return}Ke({error:e,setPromoError:j,updateState:T,validatePromo:n})}}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 n=await ze({addresses:e,catalog:t,checkoutItems:r,client:i,elements:a,email:o,fieldValues:l,isAttemptActive:c,locallyPreviewedTotalCents:E,metadata:u,onPaymentRecoveryChange:p,phone:s,quote:_,stripe:y,stripeConnectedAccountId:b});if(!c())return;qe({dispatchState:F,onPaymentComplete:d,onPaymentRecoveryChange:p,onPaymentUncertain:m,onQuoteChange:h,result:n,setDisplayedTotalCents:k})}catch(e){if(!c())return;if(Be(p,null),We(e)){F({type:`sold_out`});return}let t=e instanceof W?n(e.serverCode):void 0;if(t)return F({type:`submission_validation_failed`}),{phoneError:t};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:E,isRecovering:w.status===`recovering`,isRefreshingQuote:w.status===`refreshing_quote`,isSubmitting:pe(w),parsedTip:L,paymentError:X(w),promoError:A,terminalMessage:U}}}const Ye=d;function Xe(e){let{connectedAccountId:t,publishableKey:n}=e.payment;return Ye(n,t?{stripeAccount:t}:void 0)}function Ze(e){return e===`monthly`?{interval:`month`,label:`Monthly`}:e===`annually`?{interval:`year`,label:`Annual`}:null}function Qe(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 $e({accentColor:e,catalog:t,checkoutItems:n,client:r,appearanceRoot:i,initialCustomFieldValues:a,metadata:o,onPaymentComplete:s,onResumePaymentFailed:c,onPaymentRecoveryChange:u,onPaymentUncertain:d,onQuoteChange:f,quote:p,resumePayment:m,onStateChange:h,stripeLoader:g,theme:_,visualStyle:v}){let[b,C]=O(()=>J(!!m)),w=D(b);w.current=b;let E=x((e,t=!1)=>{let n=fe(w.current,e);n!==w.current&&(w.current=n,C(n),t&&h(Z(n)))},[h]),k=Qe(t,p,m),j=D({connectedAccountId:k,paymentOption:p.paymentOption});b.status!==`submitting`&&b.status!==`recovering`&&(j.current={connectedAccountId:k,paymentOption:p.paymentOption});let{connectedAccountId:M,paymentOption:P}=j.current,F=T(()=>g(t.payment.publishableKey,M?{stripeAccount:M}:void 0).catch(()=>null),[t.payment.publishableKey,M,g]),[I,L]=O(!1);S(()=>{let e=!0;return L(!1),F.then(t=>{e&&t===null&&L(!0)}),()=>{e=!1}},[F]);let R=l(i,_,v,b.status===`submitting`||b.status===`recovering`,e);return R?A(N,{options:{amount:Math.max(p.totalCents,100),appearance:R,currency:t.payment.currency,excludedPaymentMethodTypes:[`us_bank_account`],mode:P===`one-time`?`payment`:`subscription`,syncAddressCheckbox:`none`},stripe:F,children:A(lt,{catalog:t,checkoutItems:n,client:r,initialCustomFieldValues:a,metadata:o,onPaymentComplete:s,onPaymentRecoveryChange:u,onPaymentUncertain:d,onQuoteChange:f,onResumePaymentFailed:c,onStateChange:h,paymentState:b,quote:p,resumePayment:m,stripeConnectedAccountId:M,stripeLoadFailed:I,updateState:E})},`${t.payment.publishableKey}:${M??`platform`}:${P}`):A(y,{fieldCount:3,label:`Loading payment form`})}function et({label:e}){return j(`div`,{className:`lockerverse-payment__stripe-loader`,role:`status`,children:[A(`p`,{children:e}),j(`div`,{"aria-hidden":`true`,children:[A(`span`,{}),A(`span`,{}),A(`span`,{})]})]})}function tt({onError:e,onReady:t,ready:n}){return j(`div`,{className:`lockerverse-payment__stripe-element`,"data-ready":n,children:[n?null:A(et,{label:`Loading payment form...`}),A(`div`,{className:`lockerverse-payment__stripe-mount`,children:A(P,{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 nt({label:e,mode:t,onChange:n,onError:r,onReady:i,ready:a}){return j(`div`,{className:`lockerverse-payment__address`,children:[A(`h2`,{children:e}),j(`div`,{className:`lockerverse-payment__stripe-element lockerverse-payment__stripe-element--address`,"data-ready":a,children:[a?null:A(et,{label:`Loading ${e.toLowerCase()}...`}),A(`div`,{className:`lockerverse-payment__stripe-mount`,children:A(M,{onChange:n,onLoadError:({error:t})=>r(t.message??`${e} failed to load.`),onReady:i,options:{autocomplete:{mode:`automatic`},mode:t}})})]})]})}function rt({message:e}){return e?A(`p`,{className:`lockerverse-payment__field-message`,role:`alert`,children:e}):null}function it({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 j(k,{children:[f?A(tt,{onError:c,onReady:()=>u(!0),ready:i}):null,f||e.widget.fields.shipping?A(nt,{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?j(`div`,{className:`lockerverse-payment__shipping`,children:[A(ue,{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:A(nt,{label:`Shipping address`,mode:`shipping`,onChange:e=>o(`shipping`,e),onError:c,onReady:()=>d(!0),ready:a})]}):null]})}function at({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=Ze(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)}`),j(`div`,{className:`lockerverse-payment__actions`,children:[A(q,{amountCents:l.serviceFeeCents||Math.round(l.subtotalCents*t.pricingPolicy.serviceFeeRateBasisPoints/1e4),enabled:t.widget.fields.serviceFee,onChange:c,values:r}),A(`button`,{"aria-busy":s,"aria-label":m,disabled:s||!d,type:`submit`,children:p})]})}function ot(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 st({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&&ot(n,`custom:${o}`)}function ct({email:e,emailDiscountPercentOff:n,emailErrorId:r,emailId:o,emailRef:s,errors:c,onEmailBlur:l,onEmailChange:u,onPhoneChange:d,phone:f,phoneCountry:p,phoneEnabled:m,phoneErrorId:h,phoneId:g,phoneRef:_}){return j(`div`,{className:`lockerverse-payment__contact`,children:[A(t,{error:c.email,errorId:r,id:o,label:`Email`,name:`email`,onBlur:l,onChange:e=>u(e.currentTarget.value),ref:s,required:!0,value:e}),n===void 0?null:j(`p`,{className:`lockerverse-payment__discount-message`,role:`status`,children:[`Your email qualifies for `,n,`% off.`]}),m?A(i,{error:c.phone,errorId:h,id:g,label:`Phone`,children:A(a,{country:p,error:c.phone,errorId:h,id:g,inputRef:_,name:`phone`,onChange:d,required:!0,value:f})}):null]})}function lt({catalog:e,checkoutItems:t,client:n,initialCustomFieldValues:i,metadata:a,onPaymentComplete:o,onResumePaymentFailed:s,onPaymentRecoveryChange:l,onPaymentUncertain:u,onQuoteChange:d,onStateChange:f,quote:p,resumePayment:g,stripeConnectedAccountId:_,stripeLoadFailed:y,paymentState:x,updateState:w}){let T=m(e,t),[E,k]=O(``),[M,N]=O(``),[P,L]=O(`US`),[R,z]=O({}),[B,V]=O({}),[H,U]=O(),[ee,te]=O(!1),[ne,re]=O(!1),[ie,ae]=O(!1),[W,oe]=O(()=>({customFields:h(T,i),customTip:``,includeServiceFee:e.widget.fields.serviceFee,memberId:``,merchSize:`M`,promoCode:``,shippingMatchesBilling:!0,tipPercent:`10`})),se=D({billing:null,shipping:null}),ce=D(null),G=D(null),K=D(null),ue=D(p.totalCents>0),q=Je({catalog:e,checkoutItems:t,client:n,elements:F(),email:E,fieldValues:W,metadata:a,onPaymentComplete:o,onPaymentRecoveryChange:l,onPaymentUncertain:u,onQuoteChange:d,onResumePaymentFailed:s,onStateChange:f,paymentState:x,quote:p,resumePayment:g,stripe:I(),stripeConnectedAccountId:_,stripeLoadFailed:y,updateState:w}),{displayedTotalCents:J,isRecovering:Y,isRefreshingQuote:fe,isSubmitting:X,parsedTip:Z,paymentError:pe,promoError:me,terminalMessage:he}=q.state,ge=`lockerverse-${C()}`,_e=`${ge}-email`,ve=`${_e}-error`,ye=`${ge}-phone`,be=`${ye}-error`,xe=`${ge}-tip-error`,Se=(Z.success?Z.cents:null)??0,Ce=J-Se,we=!e.widget.fields.shipping||W.shippingMatchesBilling||ie;S(()=>{X&&K.current?.focus({preventScroll:!0})},[X]),S(()=>{X||R.email||!R.phone||G.current?.focus()},[R.email,R.phone,X]),S(()=>{let e=J>0;e&&!ue.current&&(te(!1),re(!1)),ue.current=e},[J]);function Te(e){q.commands.fieldChanged(!1,e!==`email`),z(t=>{let n={...t};return delete n[e],n})}function Q(e){let t=e.promoCode!==W.promoCode,n=e.includeServiceFee!==W.includeServiceFee;q.commands.fieldChanged(t,!(t||n)),oe(e),V({}),U(void 0)}async function Ee(t){t.preventDefault();let n=e.widget.fields.phone?r(M,P):``,i=c({email:E,phone:n},e.widget.fields.phone),a=v(T,W.customFields);if(!(i.value&&Z.success)||Object.keys(a).length>0){z(i.errors),V(a),U(Z.success?void 0:Z.message),q.commands.reportValidationFailure();let e=t.currentTarget;queueMicrotask(()=>{st({customFieldErrors:a,emailRef:ce,form:e,parsedTipSuccess:Z.success,phoneRef:G,validationErrors:i.errors})});return}z({}),V({});let o=await q.commands.submit({addresses:se.current,phone:n});o?.phoneError&&z({phone:o.phoneError})}return he?A(`p`,{className:`lockerverse-payment__payment-status`,ref:K,role:`status`,tabIndex:-1,children:he}):Y?A(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:`Recovering payment…`}):j(`form`,{"aria-busy":X,className:`lockerverse-payment__form`,noValidate:!0,onSubmit:Ee,children:[A(`div`,{"data-lockerverse-input-region":``,inert:X?!0:void 0,children:j(`fieldset`,{className:`lockerverse-payment__input-fieldset`,disabled:X,children:[A(b,{displayedBaseCents:Ce,displayedTipCents:Se,displayedTotalCents:J,quote:p}),A(le,{enabled:e.widget.fields.tipping,error:H,errorId:xe,onChange:Q,values:W}),A(ct,{email:E,emailDiscountPercentOff:p.appliedDiscount?.source===`email_list`?p.appliedDiscount.percentageOff:void 0,emailErrorId:ve,emailId:_e,emailRef:ce,errors:R,onEmailBlur:()=>q.commands.refreshAuthoritativeTotal(),onEmailChange:e=>{k(e),Te(`email`)},onPhoneChange:({value:e,country:t})=>{N(e),L(t),Te(`phone`)},phone:M,phoneCountry:P,phoneEnabled:e.widget.fields.phone,phoneErrorId:be,phoneId:ye,phoneRef:G}),A(it,{catalog:e,displayedTotalCents:J,fieldValues:W,isBillingAddressReady:ne,isPaymentReady:ee,isShippingAddressReady:ie,onAddressChange:(e,t)=>{se.current[e]=t},onFieldValuesChange:Q,onStripeLoadError:q.commands.reportStripeLoadError,setIsBillingAddressReady:re,setIsPaymentReady:te,setIsShippingAddressReady:ae}),A(de,{customFields:T,errors:B,fields:e.widget.fields,idPrefix:ge,isPromoApplying:fe,memberIdLabel:e.community?.memberIdLabel,onApplyPromo:q.commands.applyPromo,onChange:Q,promoError:me,values:W}),A(at,{catalog:e,displayedTotalCents:J,fieldValues:W,isBillingAddressReady:ne,isPaymentReady:ee,isRequiredShippingReady:we,isSubmitting:X,onFieldValuesChange:Q,quote:p})]})}),X?A(`p`,{className:`lockerverse-payment__sr-only`,ref:K,role:`status`,tabIndex:-1,children:J===0?`Completing order…`:`Processing payment…`}):null,A(rt,{message:pe})]})}function ut(){return A(y,{fieldCount:2,label:`Loading payment…`,sectionCount:2,showCheckbox:!0})}function dt(e,t){switch(t.type){case`loading`:return{phase:`loading`,revision:e.revision};case`ready`:return mt(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 ft({checkout:e}){return{displayedQuote:e,type:`ready`}}function pt(e){return e instanceof Error?e.message:`Lockerverse payment could not load.`}function mt(e,t){return{checkoutItems:[...e.items],displayedQuote:e,phase:`ready`,quoteFailure:void 0,revision:t}}function ht(e,t){let n=e.widget.fields.serviceFee;return oe(e,{includeServiceFee:n,selection:t})}function gt(e,t){try{return mt(ht(e,t),1)}catch(e){return{failure:pt(e),phase:`error`,revision:0}}}function _t({catalog:e,client:t,paymentState:n,selection:r}){let i=Q(r),a=i.success?JSON.stringify(i.value):`invalid-selection`,o=T(()=>i.success?i.value:[],[i.success,a]),[s,c]=E(dt,void 0,()=>i.success?gt(e,o):{phase:`loading`,revision:0}),l=D(void 0),u=D(0),d=D(s.phase===`ready`?{catalog:e,selectionKey:a}:void 0),f=D(s.phase===`error`?{catalog:e,selectionKey:a}:void 0),p=n===`submitting`||n===`success`||n===`unresolved`;S(()=>{if(!i.success||p||$(f.current,e,a)||$(l.current,e,a))return;let n=!0;l.current={catalog:e,selectionKey:a};let r=$(d.current,e,a);r||c({type:`loading`});function s(e){n&&c(e)}function m(){n&&(l.current=void 0,f.current={catalog:e,selectionKey:a})}let h;function g(t){if(!n||(l.current=void 0,f.current={catalog:e,selectionKey:a},r&&h!==void 0&&u.current!==h))return;let i=pt(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=ht(e,o);r=!0,d.current={catalog:e,selectionKey:a},s(ft({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 vt={annually:`/year`,monthly:`/month`,"one-time":``};function yt({branding:e,catalog:t}){return j(`header`,{children:[t.widget.showCommunityBranding&&e?j(`div`,{className:`lockerverse-payment__branding`,children:[e.imageUrl?A(`img`,{alt:e.name,height:`48`,src:e.imageUrl,width:`48`}):null,A(`strong`,{children:e.name})]}):null,A(`h1`,{children:t.widget.title??t.widget.name}),t.widget.description?A(`p`,{children:t.widget.description}):null]})}function bt({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:j(`div`,{className:`lockerverse-payment__payment-summary`,children:[A(`h2`,{children:`Products`}),A(`div`,{className:`lockerverse-payment__payment-summary-items`,children:r.map(t=>{let n=t.pricingMode===`fixed`?t.amountCents:t.minimumAmountCents,r=vt[t.paymentOption];return j(`div`,{className:`lockerverse-payment__payment-summary-row`,children:[A(`span`,{children:t.name}),A(`strong`,{children:n===null?`Choose amount`:`${t.pricingMode===`custom`?`From `:``}${e(n)}${r}`})]},t.id)})}),A(`p`,{children:`Base prices. Final total is checked at checkout.`})]})}function xt(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 St({catalog:e,client:t,loadError:n,onRetry:r,...i}){let{branding:a,className:o,initialCustomFieldValues:s,metadata:c,onPaymentComplete:l,onPaymentRecoveryChange:u,onPaymentUncertain:d,resumePayment:f,selection:p,style:m,stripeLoader:h=Ye,theme:g=`dark`,..._}=i,[v,y]=O(f),b=D(null),[C,T]=O(),[E,k]=O(`idle`),M=D(void 0),{selectionError:N,session:P,updateCheckout:F}=_t({catalog:e,client:t,paymentState:E,selection:p}),I=P.phase===`ready`?P.revision:void 0,L=x(e=>{I!==void 0&&(M.current=I),k(e)},[I]),R=x(e=>u?.(e),[u]),z=x(()=>{y(void 0)},[]);S(()=>{P.phase===`loading`&&T(void 0)},[P.phase]),w(()=>{P.phase===`ready`&&M.current!==P.revision&&k(e=>e===`success`||e===`unresolved`?e:`idle`)},[P.phase,P.revision]);let B=[`lockerverse-payment`,o].filter(Boolean).join(` `),V=a??e.community,{accent:H,rootStyle:U}=xt(m,V);return N?A(`section`,{..._,className:B,"data-lockerverse-theme":g,role:`alert`,style:U,children:N}):P.phase===`error`&&P.failure===`This option is sold out.`||E===`sold_out`?j(`section`,{..._,className:B,"data-lockerverse-theme":g,role:`alert`,style:U,children:[A(`h1`,{children:`Sold out`}),A(`p`,{children:`This option is sold out.`})]}):P.phase===`error`?A(`section`,{..._,className:B,"data-lockerverse-theme":g,style:U,children:A(`p`,{role:`alert`,children:P.failure})}):P.phase===`ready`?j(`section`,{..._,"aria-label":`Payment`,className:B,"data-lockerverse-theme":g,"data-payment-state":E,ref:b,style:U,children:[A(yt,{branding:V,catalog:e}),n?j(`div`,{role:`alert`,children:[A(`p`,{children:n.message}),A(`button`,{onClick:r,type:`button`,children:`Retry`})]}):null,C?A(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:C}):null,P.quoteFailure?j(`div`,{className:`lockerverse-payment__payment-status`,role:`alert`,children:[A(`span`,{children:P.quoteFailure}),A(`span`,{children:` The final total will be checked when you submit.`})]}):null,A($e,{accentColor:H,appearanceRoot:b,catalog:e,checkoutItems:P.checkoutItems,client:t,initialCustomFieldValues:s,metadata:c,onPaymentComplete:l,onPaymentRecoveryChange:R,onPaymentUncertain:d,onQuoteChange:(e,t)=>{T(t),F(e)},onResumePaymentFailed:z,onStateChange:L,quote:P.displayedQuote,resumePayment:v,stripeLoader:h,theme:g,visualStyle:U},P.revision)]}):j(`section`,{..._,"aria-busy":`true`,"aria-label":`Payment`,className:B,"data-lockerverse-theme":g,style:U,children:[A(yt,{branding:V,catalog:e}),n?j(`div`,{role:`alert`,children:[A(`p`,{children:n.message}),A(`button`,{onClick:r,type:`button`,children:`Retry`})]}):null,A(ut,{})]})}function Ct({children:e,loading:t=!1,viewProps:n}){let{branding:r,className:i,initialCustomFieldValues:a,metadata:o,onPaymentComplete:s,onPaymentRecoveryChange:c,onPaymentUncertain:l,resumePayment:u,selection:d,stripeLoader:m,style:h,theme:g=`dark`,..._}=n,v=f(h?.[`--lockerverse-accent`]??r?.accentColor??`#38d77a`),y=p(v),b={...h};return(h?.[`--lockerverse-accent`]!==void 0||r?.accentColor)&&(b[`--lockerverse-accent`]=v),y&&h?.[`--lockerverse-accent-contrast`]===void 0&&(b[`--lockerverse-accent-contrast`]=y),A(`section`,{..._,...t?{"aria-busy":!0,"aria-label":`Payment`}:{},className:[`lockerverse-payment`,i].filter(Boolean).join(` `),"data-lockerverse-theme":g,style:b,children:e})}function wt({widget:e,...t}){return e.error&&!e.catalog?j(Ct,{viewProps:t,children:[A(`p`,{role:`alert`,children:e.error.message}),A(`button`,{onClick:e.refresh,type:`button`,children:`Retry`})]}):e.loading?j(Ct,{loading:!0,viewProps:t,children:[e.catalog?j(k,{children:[A(yt,{branding:t.branding??e.catalog.community,catalog:e.catalog}),A(bt,{catalog:e.catalog,selection:t.selection})]}):null,A(ut,{})]}):e.catalog?A(St,{catalog:e.catalog,client:e.client,loadError:e.error,onRetry:e.refresh,...t}):A(Ct,{loading:!0,viewProps:t,children:A(ut,{})})}export{Xe as n,wt as t};
|
|
2
2
|
//# sourceMappingURL=lockerverse-payment.js.map
|