@lockerverse/react 0.2.135-dev.1 → 0.2.137
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 +58 -5
- package/dist/form-skeleton.js +1 -1
- package/dist/form-skeleton.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/lockerverse-payment.js +1 -1
- package/dist/lockerverse-payment.js.map +1 -1
- package/dist/payment-form.d.ts.map +1 -1
- package/dist/public-events.d.ts +6 -2
- package/dist/public-events.d.ts.map +1 -1
- package/dist/public-events.js +1 -1
- package/dist/public-events.js.map +1 -1
- package/dist/signup.d.ts +6 -2
- package/dist/signup.d.ts.map +1 -1
- package/dist/signup.js +1 -1
- package/dist/signup.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/use-lockerverse-widget.d.ts +6 -2
- package/dist/use-lockerverse-widget.d.ts.map +1 -1
- package/dist/use-lockerverse-widget.js +1 -1
- package/dist/use-lockerverse-widget.js.map +1 -1
- package/dist/widget.d.ts +2 -2
- package/package.json +2 -2
package/dist/signup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signup.js","names":["googleWindow"],"sources":["../src/signup-address-field.tsx","../src/signup-validation.ts","../src/lockerverse-signup.tsx","../src/use-lockerverse-signup.ts"],"sourcesContent":["import { type KeyboardEvent, useEffect, useId, useRef, useState } from \"react\";\nimport type { SignupAddressValues } from \"./signup-validation.ts\";\n\ntype GoogleAddressComponent = {\n longText?: string;\n shortText?: string;\n types: string[];\n};\n\ntype GoogleSessionToken = Record<never, never>;\n\ntype GooglePlace = {\n addressComponents?: GoogleAddressComponent[];\n formattedAddress?: string;\n fetchFields: (options: { fields: string[] }) => Promise<void>;\n};\n\ntype GooglePlacePrediction = {\n placeId: string;\n mainText?: { text: string };\n secondaryText?: { text: string };\n text: { text: string };\n toPlace: () => GooglePlace;\n};\n\ntype GooglePlacesLibrary = {\n AutocompleteSessionToken: new () => GoogleSessionToken;\n AutocompleteSuggestion: {\n fetchAutocompleteSuggestions: (options: {\n input: string;\n includedPrimaryTypes: string[];\n includedRegionCodes: string[];\n region: string;\n sessionToken: GoogleSessionToken;\n }) => Promise<{\n suggestions: { placePrediction?: GooglePlacePrediction }[];\n }>;\n };\n};\n\ntype GoogleMapsWindow = Window & {\n google?: {\n maps?: {\n __lockerverseSignupReady?: () => void;\n importLibrary?: (libraryName: string) => Promise<GooglePlacesLibrary>;\n };\n };\n};\n\ntype AddressSuggestion = {\n id: string;\n label: string;\n secondaryLabel: string;\n prediction: GooglePlacePrediction;\n};\n\nconst GOOGLE_MAPS_SCRIPT_ID = \"lockerverse-signup-google-places\";\nconst GOOGLE_ADDRESS_TYPES = [\n \"premise\",\n \"subpremise\",\n \"street_address\",\n \"route\",\n];\nlet googlePlacesLoader: Promise<GooglePlacesLibrary> | null = null;\n\nfunction installGoogleMaps(apiKey: string) {\n const googleWindow: GoogleMapsWindow = window;\n if (googleWindow.google?.maps?.importLibrary) {\n return;\n }\n googleWindow.google ||= {};\n const googleObject = googleWindow.google;\n googleObject.maps ||= {};\n const mapsObject = googleObject.maps;\n let scriptPromise: Promise<void> | null = null;\n mapsObject.importLibrary = (libraryName: string) => {\n scriptPromise ||= new Promise((resolve, reject) => {\n const existingScript = document.getElementById(GOOGLE_MAPS_SCRIPT_ID);\n mapsObject.__lockerverseSignupReady = resolve;\n if (existingScript) {\n existingScript.addEventListener(\n \"error\",\n () => reject(new Error(\"Unable to load Google Places.\")),\n { once: true }\n );\n return;\n }\n const script = document.createElement(\"script\");\n const parameters = new URLSearchParams({\n callback: \"google.maps.__lockerverseSignupReady\",\n key: apiKey,\n libraries: libraryName,\n v: \"weekly\",\n });\n script.async = true;\n script.id = GOOGLE_MAPS_SCRIPT_ID;\n script.src = `https://maps.googleapis.com/maps/api/js?${parameters}`;\n script.onerror = () => reject(new Error(\"Unable to load Google Places.\"));\n document.head.append(script);\n });\n return scriptPromise\n .then(() => {\n const importLibrary = googleWindow.google?.maps?.importLibrary;\n if (!importLibrary) {\n throw new Error(\"Unable to load Google Places.\");\n }\n return importLibrary(libraryName);\n })\n .catch((error) => {\n scriptPromise = null;\n document.getElementById(GOOGLE_MAPS_SCRIPT_ID)?.remove();\n throw error;\n });\n };\n}\n\nfunction loadGooglePlaces(apiKey: string) {\n googlePlacesLoader ||= (async () => {\n try {\n installGoogleMaps(apiKey);\n const googleWindow: GoogleMapsWindow = window;\n const importLibrary = googleWindow.google?.maps?.importLibrary;\n if (!importLibrary) {\n throw new Error(\"Unable to load Google Places.\");\n }\n return await importLibrary(\"places\");\n } catch (error) {\n googlePlacesLoader = null;\n throw error;\n }\n })();\n return googlePlacesLoader;\n}\n\nfunction getAddressPart(\n components: GoogleAddressComponent[],\n type: string,\n key: \"longText\" | \"shortText\" = \"longText\"\n) {\n return (\n components.find((component) => component.types.includes(type))?.[key] ?? \"\"\n );\n}\n\nfunction parseAddress(current: SignupAddressValues, place: GooglePlace) {\n const components = place.addressComponents ?? [];\n const street = [\n getAddressPart(components, \"street_number\"),\n getAddressPart(components, \"route\"),\n ]\n .filter(Boolean)\n .join(\" \");\n return {\n ...current,\n city:\n getAddressPart(components, \"locality\") ||\n getAddressPart(components, \"postal_town\") ||\n getAddressPart(components, \"sublocality_level_1\"),\n country: getAddressPart(components, \"country\", \"shortText\") || \"US\",\n line1: street || place.formattedAddress?.split(\",\")[0] || \"\",\n line2: getAddressPart(components, \"subpremise\"),\n postalCode: [\n getAddressPart(components, \"postal_code\"),\n getAddressPart(components, \"postal_code_suffix\"),\n ]\n .filter(Boolean)\n .join(\"-\"),\n state: getAddressPart(\n components,\n \"administrative_area_level_1\",\n \"shortText\"\n ),\n } satisfies SignupAddressValues;\n}\n\nexport function SignupAddressField({\n apiKey,\n errorId,\n invalid,\n onChange,\n required,\n value,\n}: {\n apiKey: string | undefined;\n errorId: string | undefined;\n invalid: boolean;\n onChange: (address: SignupAddressValues) => void;\n required: boolean;\n value: SignupAddressValues;\n}) {\n const id = useId();\n const listboxId = `${id}-suggestions`;\n const [activeSuggestionIndex, setActiveSuggestionIndex] = useState(-1);\n const [focused, setFocused] = useState(false);\n const [loading, setLoading] = useState(false);\n const [suggestions, setSuggestions] = useState<AddressSuggestion[]>([]);\n const detailRequestGeneration = useRef(0);\n const searchGeneration = useRef(0);\n const sessionToken = useRef<GoogleSessionToken | null>(null);\n\n useEffect(\n () => () => {\n detailRequestGeneration.current += 1;\n },\n []\n );\n\n useEffect(() => {\n const generation = searchGeneration.current + 1;\n searchGeneration.current = generation;\n const query = value.line1.trim();\n setActiveSuggestionIndex(-1);\n setLoading(false);\n if (!(apiKey && focused && query.length >= 3)) {\n setSuggestions([]);\n return;\n }\n const timeout = window.setTimeout(async () => {\n if (generation !== searchGeneration.current) {\n return;\n }\n setLoading(true);\n try {\n const { AutocompleteSessionToken, AutocompleteSuggestion } =\n await loadGooglePlaces(apiKey);\n sessionToken.current ??= new AutocompleteSessionToken();\n const response =\n await AutocompleteSuggestion.fetchAutocompleteSuggestions({\n includedPrimaryTypes: GOOGLE_ADDRESS_TYPES,\n includedRegionCodes: [\"US\"],\n input: query,\n region: \"US\",\n sessionToken: sessionToken.current,\n });\n if (generation === searchGeneration.current) {\n setSuggestions(\n response.suggestions.flatMap(({ placePrediction }) =>\n placePrediction\n ? [\n {\n id: placePrediction.placeId,\n label:\n placePrediction.mainText?.text ??\n placePrediction.text.text,\n prediction: placePrediction,\n secondaryLabel: placePrediction.secondaryText?.text ?? \"\",\n },\n ]\n : []\n )\n );\n }\n } catch {\n if (generation === searchGeneration.current) {\n setSuggestions([]);\n }\n } finally {\n if (generation === searchGeneration.current) {\n setLoading(false);\n }\n }\n }, 250);\n return () => {\n window.clearTimeout(timeout);\n };\n }, [apiKey, focused, value.line1]);\n\n const update = (patch: Partial<SignupAddressValues>) => {\n detailRequestGeneration.current += 1;\n onChange({ ...value, ...patch });\n };\n\n const selectSuggestion = async (suggestion: AddressSuggestion) => {\n const generation = detailRequestGeneration.current + 1;\n detailRequestGeneration.current = generation;\n const place = suggestion.prediction.toPlace();\n try {\n await place.fetchFields({\n fields: [\"addressComponents\", \"formattedAddress\"],\n });\n if (generation !== detailRequestGeneration.current) {\n return;\n }\n onChange(parseAddress(value, place));\n sessionToken.current = null;\n setSuggestions([]);\n setActiveSuggestionIndex(-1);\n setFocused(false);\n } catch {\n if (generation !== detailRequestGeneration.current) {\n return;\n }\n setSuggestions([]);\n setActiveSuggestionIndex(-1);\n }\n };\n\n const handleAddressKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setSuggestions([]);\n setActiveSuggestionIndex(-1);\n return;\n }\n if (suggestions.length === 0) {\n return;\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setActiveSuggestionIndex((current) =>\n current < suggestions.length - 1 ? current + 1 : 0\n );\n return;\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setActiveSuggestionIndex((current) =>\n current > 0 ? current - 1 : suggestions.length - 1\n );\n return;\n }\n const suggestion = suggestions[activeSuggestionIndex];\n if (event.key === \"Enter\" && suggestion) {\n event.preventDefault();\n selectSuggestion(suggestion).catch(() => undefined);\n }\n };\n\n return (\n <fieldset\n aria-describedby={invalid ? errorId : undefined}\n aria-invalid={invalid ? \"true\" : undefined}\n className=\"lockerverse-signup__address\"\n >\n <legend>Address</legend>\n <label htmlFor={`${id}-line1`}>\n <span>Street address</span>\n <div className=\"lockerverse-signup__address-search\">\n <input\n aria-activedescendant={\n activeSuggestionIndex >= 0\n ? `${id}-suggestion-${activeSuggestionIndex}`\n : undefined\n }\n aria-autocomplete=\"list\"\n aria-controls={listboxId}\n aria-describedby={invalid ? errorId : undefined}\n aria-expanded={focused && suggestions.length > 0}\n aria-invalid={invalid ? \"true\" : undefined}\n autoComplete=\"street-address\"\n id={`${id}-line1`}\n name=\"address.line1\"\n onBlur={() => window.setTimeout(() => setFocused(false), 120)}\n onChange={(event) => update({ line1: event.currentTarget.value })}\n onFocus={() => setFocused(true)}\n onKeyDown={handleAddressKeyDown}\n required={required}\n role=\"combobox\"\n value={value.line1}\n />\n {loading ? (\n <span className=\"lockerverse-signup__address-loading\">\n Searching…\n </span>\n ) : null}\n {suggestions.length > 0 ? (\n <div\n className=\"lockerverse-signup__address-suggestions\"\n id={listboxId}\n role=\"listbox\"\n >\n {suggestions.map((suggestion, index) => (\n <button\n aria-selected={activeSuggestionIndex === index}\n id={`${id}-suggestion-${index}`}\n key={suggestion.id}\n onMouseDown={(event) => {\n event.preventDefault();\n selectSuggestion(suggestion).catch(() => undefined);\n }}\n role=\"option\"\n type=\"button\"\n >\n <strong>{suggestion.label}</strong>\n {suggestion.secondaryLabel ? (\n <span>{suggestion.secondaryLabel}</span>\n ) : null}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </label>\n <label htmlFor={`${id}-line2`}>\n <span>Apartment, suite, or unit</span>\n <input\n autoComplete=\"address-line2\"\n id={`${id}-line2`}\n onChange={(event) => update({ line2: event.currentTarget.value })}\n placeholder=\"Optional\"\n value={value.line2 ?? \"\"}\n />\n </label>\n <div className=\"lockerverse-signup__address-row\">\n <label htmlFor={`${id}-city`}>\n <span>City</span>\n <input\n autoComplete=\"address-level2\"\n id={`${id}-city`}\n onChange={(event) => update({ city: event.currentTarget.value })}\n required={required}\n value={value.city}\n />\n </label>\n <label htmlFor={`${id}-state`}>\n <span>State</span>\n <input\n autoComplete=\"address-level1\"\n id={`${id}-state`}\n onChange={(event) => update({ state: event.currentTarget.value })}\n required={required}\n value={value.state}\n />\n </label>\n </div>\n <div className=\"lockerverse-signup__address-row\">\n <label htmlFor={`${id}-postal`}>\n <span>Postal code</span>\n <input\n autoComplete=\"postal-code\"\n id={`${id}-postal`}\n onChange={(event) =>\n update({ postalCode: event.currentTarget.value })\n }\n required={required}\n value={value.postalCode}\n />\n </label>\n <label htmlFor={`${id}-country`}>\n <span>Country</span>\n <input\n autoComplete=\"country\"\n id={`${id}-country`}\n maxLength={2}\n onChange={(event) =>\n update({ country: event.currentTarget.value.toUpperCase() })\n }\n required={required}\n value={value.country}\n />\n </label>\n </div>\n </fieldset>\n );\n}\n","import type {\n LockerverseSignup,\n LockerverseSignupAddress,\n} from \"@lockerverse/sdk/signup\";\nimport {\n check,\n nonEmpty,\n nullable,\n object,\n pipe,\n regex,\n safeParse,\n string,\n transform,\n trim,\n} from \"valibot\";\nimport {\n optionalEmailSchema,\n optionalPhoneSchema,\n requiredEmailSchema,\n requiredPhoneSchema,\n} from \"./contact-validation.ts\";\nimport {\n type CustomFieldValues,\n validateCustomFields,\n} from \"./custom-fields.tsx\";\n\nconst POSITIVE_INTEGER_PATTERN = /^[1-9]\\d*$/;\nconst OPTIONAL_POSITIVE_INTEGER_PATTERN = /^(?:$|[1-9]\\d*)$/;\n\nexport type SignupAddressValues = Omit<LockerverseSignupAddress, \"line2\"> & {\n line2: string | null;\n};\n\nexport type SignupFormValues = {\n address: SignupAddressValues;\n customFields: CustomFieldValues;\n email: string;\n honeypot: string;\n name: string;\n participantCount: string;\n phone: string;\n phoneCountry: string;\n};\n\nconst nameSchema = pipe(string(), trim(), nonEmpty(\"Name is required.\"));\nconst optionalParticipantCountSchema = pipe(\n string(),\n trim(),\n regex(\n OPTIONAL_POSITIVE_INTEGER_PATTERN,\n \"Guest count must be a positive whole number.\"\n ),\n transform((value) => (value ? Number(value) : null)),\n check(\n (value) => value === null || Number.isSafeInteger(value),\n \"Guest count must be a positive whole number.\"\n )\n);\nconst requiredParticipantCountSchema = pipe(\n string(),\n trim(),\n nonEmpty(\"Guest count is required.\"),\n regex(\n POSITIVE_INTEGER_PATTERN,\n \"Guest count must be a positive whole number.\"\n ),\n transform(Number),\n check(\n (value) => Number.isSafeInteger(value),\n \"Guest count must be a positive whole number.\"\n )\n);\nconst addressFieldsSchema = object({\n city: string(),\n country: string(),\n line1: string(),\n line2: nullable(string()),\n postalCode: string(),\n state: string(),\n});\nconst requiredAddressSchema = pipe(\n addressFieldsSchema,\n check(isAddressComplete, \"Complete the address.\")\n);\n\nconst EMPTY_ADDRESS: SignupAddressValues = {\n city: \"\",\n country: \"US\",\n line1: \"\",\n line2: null,\n postalCode: \"\",\n state: \"\",\n};\nconst optionalAddressSchema = pipe(\n addressFieldsSchema,\n check(\n (address) => isAddressEmpty(address) || isAddressComplete(address),\n \"Complete the address or leave it blank.\"\n )\n);\n\nexport function isAddressEmpty(address: SignupAddressValues) {\n return ![\n address.city,\n address.line1,\n address.line2,\n address.postalCode,\n address.state,\n ].some((value) => value?.trim());\n}\n\nfunction isAddressComplete(address: SignupAddressValues) {\n return [\n address.city,\n address.country,\n address.line1,\n address.postalCode,\n address.state,\n ].every((value) => value.trim());\n}\n\n/** Phone must already be normalized by the shared phone helper when enabled. */\nexport function validateSignupForm(\n signup: LockerverseSignup,\n values: SignupFormValues\n) {\n const normalizedValues = {\n ...values,\n address: signup.fields.address.enabled ? values.address : EMPTY_ADDRESS,\n email: signup.fields.email.enabled ? values.email : \"\",\n participantCount: signup.fields.participantCount.enabled\n ? values.participantCount\n : \"\",\n phone: signup.fields.phone.enabled ? values.phone : \"\",\n };\n const schema = object({\n address:\n signup.fields.address.enabled && signup.fields.address.required\n ? requiredAddressSchema\n : optionalAddressSchema,\n email:\n signup.fields.email.enabled && signup.fields.email.required\n ? requiredEmailSchema\n : optionalEmailSchema,\n name: nameSchema,\n participantCount:\n signup.fields.participantCount.enabled &&\n signup.fields.participantCount.required\n ? requiredParticipantCountSchema\n : optionalParticipantCountSchema,\n phone:\n signup.fields.phone.enabled && signup.fields.phone.required\n ? requiredPhoneSchema\n : optionalPhoneSchema,\n });\n const result = safeParse(schema, normalizedValues);\n const errors = validateCustomFields(signup.customFields, values.customFields);\n if (!result.success) {\n for (const issue of result.issues) {\n const field = issue.path?.[0]?.key;\n const fieldName = [\n \"address\",\n \"email\",\n \"name\",\n \"participantCount\",\n \"phone\",\n ].find((name) => name === field);\n if (fieldName && !errors[fieldName]) {\n errors[fieldName] = issue.message;\n }\n }\n }\n return result.success\n ? { errors, value: { ...values, ...result.output } }\n : { errors, value: null };\n}\n","import type {\n LockerverseSdkError,\n LockerverseSignupClient,\n LockerverseSignup as LockerverseSignupDefinition,\n LockerverseSignupSubmissionResult,\n} from \"@lockerverse/sdk/signup\";\nimport {\n type FormEvent,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { getAccentContrast, normalizeAccentColor } from \"./accent-contrast.ts\";\nimport { getPhoneServerError } from \"./contact-validation.ts\";\nimport {\n buildCustomFieldAnswers,\n CustomFields,\n createCustomFieldValues,\n} from \"./custom-fields.tsx\";\nimport { EmailField, FieldError, FormField } from \"./form-field.tsx\";\nimport { FormSkeleton } from \"./form-skeleton.tsx\";\nimport { notifyHostCallback } from \"./host-callback.ts\";\nimport { getInternationalPhone } from \"./phone.ts\";\nimport { PhoneInput } from \"./phone-field.tsx\";\nimport { SignupAddressField } from \"./signup-address-field.tsx\";\nimport type { LockerverseSignupProps } from \"./signup-types.ts\";\nimport {\n type SignupFormValues as FormValues,\n isAddressEmpty,\n type SignupAddressValues,\n validateSignupForm,\n} from \"./signup-validation.ts\";\n\nconst DEFAULT_ADDRESS: SignupAddressValues = {\n city: \"\",\n country: \"US\",\n line1: \"\",\n line2: \"\",\n postalCode: \"\",\n state: \"\",\n};\n\nconst DEFAULT_ACCENT = \"#5751f2\";\n\nfunction createInitialValues(signup: LockerverseSignupDefinition): FormValues {\n return {\n address: DEFAULT_ADDRESS,\n customFields: createCustomFieldValues(signup.customFields),\n email: \"\",\n honeypot: \"\",\n name: \"\",\n participantCount: \"\",\n phone: \"\",\n phoneCountry: \"US\",\n };\n}\n\nfunction focusNamedControl(form: HTMLFormElement, name: string) {\n const control = form.elements.namedItem(name);\n if (control instanceof HTMLElement) {\n if (!control.matches(\":disabled\")) {\n control.focus();\n return true;\n }\n return false;\n }\n if (control instanceof RadioNodeList) {\n const focusable = Array.from(control).find(\n (item) => item instanceof HTMLElement && !item.matches(\":disabled\")\n );\n focusable?.focus();\n return Boolean(focusable);\n }\n return false;\n}\n\nfunction focusFirstSignupValidationError(\n form: HTMLFormElement,\n errors: Record<string, string>\n) {\n const builtInFields: [string, string][] = [\n [\"name\", \"name\"],\n [\"email\", \"email\"],\n [\"phone\", \"phone\"],\n [\"participantCount\", \"participantCount\"],\n [\"address\", \"address.line1\"],\n ];\n for (const [errorKey, controlName] of builtInFields) {\n if (errors[errorKey] && focusNamedControl(form, controlName)) {\n return;\n }\n }\n const builtInKeys = new Set(builtInFields.map(([errorKey]) => errorKey));\n const customFieldId = Object.keys(errors).find(\n (errorKey) => !builtInKeys.has(errorKey)\n );\n if (customFieldId) {\n focusNamedControl(form, `custom:${customFieldId}`);\n }\n}\n\ntype SignupViewProps = Omit<LockerverseSignupProps, \"widget\">;\n\nfunction SignupShell({\n children,\n loading = false,\n status = false,\n viewProps,\n}: {\n children: ReactNode;\n loading?: boolean;\n status?: boolean;\n viewProps: SignupViewProps;\n}) {\n const {\n branding,\n className,\n googlePlacesApiKey: _googlePlacesApiKey,\n onSignupComplete: _onSignupComplete,\n style,\n theme = \"dark\",\n ...sectionProps\n } = viewProps;\n const accent = normalizeAccentColor(\n style?.[\"--lockerverse-accent\"] ??\n style?.[\"--lockerverse-signup-accent\"] ??\n branding?.accentColor ??\n DEFAULT_ACCENT\n );\n const signupStyle: LockerverseSignupProps[\"style\"] = { ...style };\n if (\n style?.[\"--lockerverse-accent\"] !== undefined ||\n style?.[\"--lockerverse-signup-accent\"] !== undefined ||\n branding?.accentColor\n ) {\n signupStyle[\"--lockerverse-accent\"] = accent;\n }\n if (\n style?.[\"--lockerverse-accent-contrast\"] === undefined &&\n style?.[\"--lockerverse-signup-accent-contrast\"] === undefined\n ) {\n const accentContrast = getAccentContrast(accent);\n if (accentContrast) {\n signupStyle[\"--lockerverse-accent-contrast\"] = accentContrast;\n }\n }\n return (\n <section\n {...sectionProps}\n {...(loading ? { \"aria-busy\": true } : {})}\n className={[\n \"lockerverse-signup\",\n status ? \"lockerverse-signup__status\" : null,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={signupStyle}\n >\n {children}\n </section>\n );\n}\n\ntype SignupSubmissionState =\n | { phase: \"idle\" }\n | { phase: \"submitting\" }\n | {\n error: LockerverseSdkError;\n phase: \"submit_error\";\n }\n | {\n phase: \"submitted\";\n };\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: The component renders server-defined field branches in one public form boundary.\nfunction SignupForm({\n client,\n signup,\n ...viewProps\n}: SignupViewProps & {\n client: LockerverseSignupClient;\n signup: LockerverseSignupDefinition;\n}) {\n const { branding, googlePlacesApiKey, onSignupComplete } = viewProps;\n const idPrefix = useId();\n const mountedRef = useRef(true);\n const phoneRef = useRef<HTMLInputElement>(null);\n const submittingRef = useRef(false);\n const [state, setState] = useState<SignupSubmissionState>({ phase: \"idle\" });\n const [values, setValues] = useState<FormValues>(() =>\n createInitialValues(signup)\n );\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [submissionRetry, setSubmissionRetry] = useState<{\n payloadKey: string;\n reference: string;\n }>();\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n if (state.phase !== \"submitting\" && errors.phone) {\n phoneRef.current?.focus();\n }\n }, [errors.phone, state.phase]);\n\n if (!signup.isActive) {\n return (\n <SignupShell status viewProps={viewProps}>\n <h1>Signup closed</h1>\n <p>This signup is not accepting submissions.</p>\n </SignupShell>\n );\n }\n\n if (state.phase === \"submitted\") {\n return (\n <SignupShell status viewProps={viewProps}>\n {branding ? <Branding branding={branding} /> : null}\n <span aria-hidden=\"true\" className=\"lockerverse-signup__success\">\n ✓\n </span>\n <h1>Thank you</h1>\n <p>Your signup has been received.</p>\n </SignupShell>\n );\n }\n\n const update = (patch: Partial<FormValues>) =>\n setValues((current) => ({ ...current, ...patch }));\n const submitting = state.phase === \"submitting\";\n const submitError =\n state.phase === \"submit_error\" ? state.error.message : undefined;\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Submission maps the enabled server-defined fields to one SDK request.\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n // biome-ignore lint/suspicious/noUnnecessaryConditions: The ref blocks a second submit before React commits the submitting state.\n if (submittingRef.current) {\n return;\n }\n const validation = validateSignupForm(signup, {\n ...values,\n phone: signup.fields.phone.enabled\n ? getInternationalPhone(values.phone, values.phoneCountry)\n : \"\",\n });\n setErrors(validation.errors);\n if (Object.keys(validation.errors).length > 0 || !validation.value) {\n const form = event.currentTarget;\n queueMicrotask(() =>\n focusFirstSignupValidationError(form, validation.errors)\n );\n return;\n }\n const validatedValues = validation.value;\n const submission = {\n address:\n signup.fields.address.enabled &&\n !isAddressEmpty(validatedValues.address)\n ? validatedValues.address\n : null,\n answers: buildCustomFieldAnswers(\n signup.customFields,\n validatedValues.customFields\n ),\n email: signup.fields.email.enabled ? validatedValues.email || null : null,\n honeypot: validatedValues.honeypot,\n name: validatedValues.name,\n participantCount: signup.fields.participantCount.enabled\n ? validatedValues.participantCount\n : null,\n phone: signup.fields.phone.enabled ? validatedValues.phone || null : null,\n };\n const payloadKey = JSON.stringify(submission);\n const submissionReference =\n submissionRetry?.payloadKey === payloadKey\n ? submissionRetry.reference\n : globalThis.crypto.randomUUID();\n let result: LockerverseSignupSubmissionResult;\n submittingRef.current = true;\n setState({ phase: \"submitting\" });\n try {\n result = await client.submit(submission, { submissionReference });\n } catch (error) {\n if (!mountedRef.current) {\n return;\n }\n // SAFETY: LockerverseSignupClient normalizes each submission rejection to LockerverseSdkError.\n const sdkError = error as LockerverseSdkError;\n const phoneError = getPhoneServerError(sdkError.serverCode);\n if (phoneError) {\n setErrors((current) => ({ ...current, phone: phoneError }));\n setState({ phase: \"idle\" });\n setSubmissionRetry(undefined);\n return;\n }\n setState({ error: sdkError, phase: \"submit_error\" });\n if (sdkError.recoveryRecommended) {\n setSubmissionRetry({\n payloadKey,\n reference: submissionReference,\n });\n } else {\n setSubmissionRetry(undefined);\n }\n return;\n } finally {\n submittingRef.current = false;\n }\n // biome-ignore lint/suspicious/noUnnecessaryConditions: The ref changes during unmount while this request is pending.\n if (!mountedRef.current) {\n return;\n }\n setSubmissionRetry(undefined);\n setState({ phase: \"submitted\" });\n notifyHostCallback(onSignupComplete, result);\n };\n\n return (\n <SignupShell viewProps={viewProps}>\n {signup.coverImageUrl ? (\n <img\n alt=\"\"\n className=\"lockerverse-signup__cover\"\n height={192}\n src={signup.coverImageUrl}\n width={440}\n />\n ) : null}\n {branding ? <Branding branding={branding} /> : null}\n <header>\n {signup.title?.trim() ? <h1>{signup.title}</h1> : null}\n {signup.description ? <p>{signup.description}</p> : null}\n </header>\n <form noValidate onSubmit={handleSubmit}>\n <input\n aria-hidden=\"true\"\n autoComplete=\"off\"\n className=\"lockerverse-signup__honeypot\"\n onChange={(event) => update({ honeypot: event.currentTarget.value })}\n tabIndex={-1}\n value={values.honeypot}\n />\n <div className=\"lockerverse-signup__fields\">\n <label htmlFor={`${idPrefix}-name`}>\n <span>Name</span>\n <input\n aria-describedby={\n errors.name ? `${idPrefix}-name-error` : undefined\n }\n aria-invalid={errors.name ? \"true\" : undefined}\n autoComplete=\"name\"\n id={`${idPrefix}-name`}\n name=\"name\"\n onChange={(event) => update({ name: event.currentTarget.value })}\n required\n value={values.name}\n />\n <FieldError error={errors.name} id={`${idPrefix}-name-error`} />\n </label>\n {signup.fields.email.enabled ? (\n <EmailField\n error={errors.email}\n id={`${idPrefix}-email`}\n label=\"Email\"\n name=\"email\"\n onChange={(event) => update({ email: event.currentTarget.value })}\n required={signup.fields.email.required}\n value={values.email}\n />\n ) : null}\n {signup.fields.phone.enabled ? (\n <FormField\n error={errors.phone}\n id={`${idPrefix}-phone`}\n label=\"Phone\"\n >\n <PhoneInput\n country={values.phoneCountry}\n error={errors.phone}\n errorId={`${idPrefix}-phone-error`}\n id={`${idPrefix}-phone`}\n inputRef={phoneRef}\n name=\"phone\"\n onChange={({ value, country }) =>\n update({ phone: value, phoneCountry: country })\n }\n required={signup.fields.phone.required}\n value={values.phone}\n />\n </FormField>\n ) : null}\n {signup.fields.participantCount.enabled ? (\n <label htmlFor={`${idPrefix}-participant-count`}>\n <span>Guest count</span>\n <input\n aria-describedby={\n errors.participantCount\n ? `${idPrefix}-participant-count-error`\n : undefined\n }\n aria-invalid={errors.participantCount ? \"true\" : undefined}\n id={`${idPrefix}-participant-count`}\n min={1}\n name=\"participantCount\"\n onChange={(event) =>\n update({ participantCount: event.currentTarget.value })\n }\n required={signup.fields.participantCount.required}\n type=\"number\"\n value={values.participantCount}\n />\n <FieldError\n error={errors.participantCount}\n id={`${idPrefix}-participant-count-error`}\n />\n </label>\n ) : null}\n {signup.fields.address.enabled ? (\n <div className=\"lockerverse-signup__field-group\">\n <SignupAddressField\n apiKey={googlePlacesApiKey}\n errorId={\n errors.address ? `${idPrefix}-address-error` : undefined\n }\n invalid={Boolean(errors.address)}\n onChange={(address) => update({ address })}\n required={signup.fields.address.required}\n value={values.address}\n />\n <FieldError\n error={errors.address}\n id={`${idPrefix}-address-error`}\n />\n </div>\n ) : null}\n <CustomFields\n choiceClassName=\"lockerverse-signup__choice\"\n errorClassName=\"lockerverse-signup__field-error\"\n errors={errors}\n fields={signup.customFields}\n idPrefix={idPrefix}\n onChange={(customFields) => update({ customFields })}\n values={values.customFields}\n />\n </div>\n {submitError ? (\n <p className=\"lockerverse-signup__submit-error\" role=\"alert\">\n {submitError} Try again.\n </p>\n ) : null}\n <button\n className=\"lockerverse-signup__submit\"\n disabled={submitting}\n type=\"submit\"\n >\n {submitting ? \"Submitting…\" : \"Submit\"}\n </button>\n </form>\n </SignupShell>\n );\n}\n\nexport function LockerverseSignup({\n widget,\n ...viewProps\n}: LockerverseSignupProps) {\n if (widget.error) {\n return (\n <SignupShell status viewProps={viewProps}>\n <h1>Signup unavailable</h1>\n <p role=\"alert\">{widget.error.message}</p>\n <button onClick={widget.refresh} type=\"button\">\n Retry\n </button>\n </SignupShell>\n );\n }\n if (widget.loading || !widget.signup) {\n return (\n <SignupShell loading viewProps={viewProps}>\n <FormSkeleton fieldCount={4} label=\"Loading signup…\" />\n </SignupShell>\n );\n }\n return (\n <SignupForm client={widget.client} signup={widget.signup} {...viewProps} />\n );\n}\n\nfunction Branding({\n branding,\n}: {\n branding: NonNullable<LockerverseSignupProps[\"branding\"]>;\n}) {\n return (\n <div className=\"lockerverse-signup__branding\">\n {branding.imageUrl ? (\n <img alt=\"\" height={48} src={branding.imageUrl} width={48} />\n ) : null}\n <strong>{branding.name}</strong>\n </div>\n );\n}\n","import {\n type CreateLockerverseSignupOptions,\n createLockerverseSignupClient,\n type LockerverseSdkError,\n type LockerverseSignup,\n type LockerverseSignupClient,\n} from \"@lockerverse/sdk/signup\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useImmutableResourceIdentity } from \"./immutable-resource-identity.ts\";\n\ntype SignupLoadState = {\n error: LockerverseSdkError | null;\n signup: LockerverseSignup | null;\n};\n\nexport type UseLockerverseSignupResult = {\n client: LockerverseSignupClient;\n error: LockerverseSdkError | null;\n loading: boolean;\n refresh: () => void;\n signup: LockerverseSignup | null;\n};\n\nexport function useLockerverseSignup(\n options: CreateLockerverseSignupOptions\n): UseLockerverseSignupResult {\n const { onError } = options;\n useImmutableResourceIdentity(\"signup\", {\n apiBaseUrl: options.apiBaseUrl,\n communitySlug: options.communitySlug,\n environment: options.environment,\n slug: options.signupSlug,\n });\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const [client] = useState(() => {\n const clientOptions: CreateLockerverseSignupOptions = {\n ...options,\n onError: (error) => onErrorRef.current?.(error),\n };\n return createLockerverseSignupClient(clientOptions);\n });\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<SignupLoadState>({\n error: null,\n signup: null,\n });\n\n useEffect(() => {\n let active = true;\n client.load().then(\n (signup) => {\n if (active) {\n setState({\n error: null,\n signup,\n });\n }\n },\n (error: LockerverseSdkError) => {\n if (active) {\n setState({\n error,\n signup: null,\n });\n }\n }\n );\n return () => {\n active = false;\n };\n }, [client, revision]);\n\n const refresh = useCallback(() => {\n setState({\n error: null,\n signup: null,\n });\n setRevision((value) => value + 1);\n }, []);\n\n return {\n client,\n error: state.error,\n loading: state.signup === null && state.error === null,\n refresh,\n signup: state.signup,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"signup.js","names":["googleWindow"],"sources":["../src/signup-address-field.tsx","../src/signup-validation.ts","../src/lockerverse-signup.tsx","../src/use-lockerverse-signup.ts"],"sourcesContent":["import {\n type FocusEvent,\n type KeyboardEvent,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport type { SignupAddressValues } from \"./signup-validation.ts\";\n\ntype GoogleAddressComponent = {\n longText?: string;\n shortText?: string;\n types: string[];\n};\n\ntype GoogleSessionToken = Record<never, never>;\n\ntype GooglePlace = {\n addressComponents?: GoogleAddressComponent[];\n formattedAddress?: string;\n fetchFields: (options: { fields: string[] }) => Promise<void>;\n};\n\ntype GooglePlacePrediction = {\n placeId: string;\n mainText?: { text: string };\n secondaryText?: { text: string };\n text: { text: string };\n toPlace: () => GooglePlace;\n};\n\ntype GooglePlacesLibrary = {\n AutocompleteSessionToken: new () => GoogleSessionToken;\n AutocompleteSuggestion: {\n fetchAutocompleteSuggestions: (options: {\n input: string;\n includedPrimaryTypes: string[];\n includedRegionCodes: string[];\n region: string;\n sessionToken: GoogleSessionToken;\n }) => Promise<{\n suggestions: { placePrediction?: GooglePlacePrediction }[];\n }>;\n };\n};\n\ntype GoogleMapsWindow = Window & {\n google?: {\n maps?: {\n __lockerverseSignupReady?: () => void;\n importLibrary?: (libraryName: string) => Promise<GooglePlacesLibrary>;\n };\n };\n};\n\ntype AddressSuggestion = {\n id: string;\n label: string;\n secondaryLabel: string;\n prediction: GooglePlacePrediction;\n};\n\nconst GOOGLE_MAPS_SCRIPT_ID = \"lockerverse-signup-google-places\";\nconst GOOGLE_ADDRESS_TYPES = [\n \"premise\",\n \"subpremise\",\n \"street_address\",\n \"route\",\n];\nlet googlePlacesLoader: Promise<GooglePlacesLibrary> | null = null;\n\nfunction installGoogleMaps(apiKey: string) {\n const googleWindow: GoogleMapsWindow = window;\n if (googleWindow.google?.maps?.importLibrary) {\n return;\n }\n googleWindow.google ||= {};\n const googleObject = googleWindow.google;\n googleObject.maps ||= {};\n const mapsObject = googleObject.maps;\n let scriptPromise: Promise<void> | null = null;\n mapsObject.importLibrary = (libraryName: string) => {\n scriptPromise ||= new Promise((resolve, reject) => {\n const existingScript = document.getElementById(GOOGLE_MAPS_SCRIPT_ID);\n mapsObject.__lockerverseSignupReady = resolve;\n if (existingScript) {\n existingScript.addEventListener(\n \"error\",\n () => reject(new Error(\"Unable to load Google Places.\")),\n { once: true }\n );\n return;\n }\n const script = document.createElement(\"script\");\n const parameters = new URLSearchParams({\n callback: \"google.maps.__lockerverseSignupReady\",\n key: apiKey,\n libraries: libraryName,\n v: \"weekly\",\n });\n script.async = true;\n script.id = GOOGLE_MAPS_SCRIPT_ID;\n script.src = `https://maps.googleapis.com/maps/api/js?${parameters}`;\n script.onerror = () => reject(new Error(\"Unable to load Google Places.\"));\n document.head.append(script);\n });\n return scriptPromise\n .then(() => {\n const importLibrary = googleWindow.google?.maps?.importLibrary;\n if (!importLibrary) {\n throw new Error(\"Unable to load Google Places.\");\n }\n return importLibrary(libraryName);\n })\n .catch((error) => {\n scriptPromise = null;\n document.getElementById(GOOGLE_MAPS_SCRIPT_ID)?.remove();\n throw error;\n });\n };\n}\n\nfunction loadGooglePlaces(apiKey: string) {\n googlePlacesLoader ||= (async () => {\n try {\n installGoogleMaps(apiKey);\n const googleWindow: GoogleMapsWindow = window;\n const importLibrary = googleWindow.google?.maps?.importLibrary;\n if (!importLibrary) {\n throw new Error(\"Unable to load Google Places.\");\n }\n return await importLibrary(\"places\");\n } catch (error) {\n googlePlacesLoader = null;\n throw error;\n }\n })();\n return googlePlacesLoader;\n}\n\nfunction getAddressPart(\n components: GoogleAddressComponent[],\n type: string,\n key: \"longText\" | \"shortText\" = \"longText\"\n) {\n return (\n components.find((component) => component.types.includes(type))?.[key] ?? \"\"\n );\n}\n\nfunction parseAddress(current: SignupAddressValues, place: GooglePlace) {\n const components = place.addressComponents ?? [];\n const street = [\n getAddressPart(components, \"street_number\"),\n getAddressPart(components, \"route\"),\n ]\n .filter(Boolean)\n .join(\" \");\n return {\n ...current,\n city:\n getAddressPart(components, \"locality\") ||\n getAddressPart(components, \"postal_town\") ||\n getAddressPart(components, \"sublocality_level_1\"),\n country: getAddressPart(components, \"country\", \"shortText\") || \"US\",\n line1: street || place.formattedAddress?.split(\",\")[0] || \"\",\n line2: getAddressPart(components, \"subpremise\"),\n postalCode: [\n getAddressPart(components, \"postal_code\"),\n getAddressPart(components, \"postal_code_suffix\"),\n ]\n .filter(Boolean)\n .join(\"-\"),\n state: getAddressPart(\n components,\n \"administrative_area_level_1\",\n \"shortText\"\n ),\n } satisfies SignupAddressValues;\n}\n\nexport function SignupAddressField({\n apiKey,\n errorId,\n invalid,\n onChange,\n required,\n value,\n}: {\n apiKey: string | undefined;\n errorId: string | undefined;\n invalid: boolean;\n onChange: (address: SignupAddressValues) => void;\n required: boolean;\n value: SignupAddressValues;\n}) {\n const id = useId();\n const listboxId = `${id}-suggestions`;\n const [activeSuggestionIndex, setActiveSuggestionIndex] = useState(-1);\n const [focused, setFocused] = useState(false);\n const [loading, setLoading] = useState(false);\n const [suggestions, setSuggestions] = useState<AddressSuggestion[]>([]);\n const detailRequestGeneration = useRef(0);\n const searchGeneration = useRef(0);\n const sessionToken = useRef<GoogleSessionToken | null>(null);\n\n useEffect(\n () => () => {\n detailRequestGeneration.current += 1;\n },\n []\n );\n\n useEffect(() => {\n const generation = searchGeneration.current + 1;\n searchGeneration.current = generation;\n const query = value.line1.trim();\n setActiveSuggestionIndex(-1);\n setLoading(false);\n if (!(apiKey && focused && query.length >= 3)) {\n setSuggestions([]);\n return;\n }\n const timeout = window.setTimeout(async () => {\n if (generation !== searchGeneration.current) {\n return;\n }\n setLoading(true);\n try {\n const { AutocompleteSessionToken, AutocompleteSuggestion } =\n await loadGooglePlaces(apiKey);\n sessionToken.current ??= new AutocompleteSessionToken();\n const response =\n await AutocompleteSuggestion.fetchAutocompleteSuggestions({\n includedPrimaryTypes: GOOGLE_ADDRESS_TYPES,\n includedRegionCodes: [\"US\"],\n input: query,\n region: \"US\",\n sessionToken: sessionToken.current,\n });\n if (generation === searchGeneration.current) {\n setSuggestions(\n response.suggestions.flatMap(({ placePrediction }) =>\n placePrediction\n ? [\n {\n id: placePrediction.placeId,\n label:\n placePrediction.mainText?.text ??\n placePrediction.text.text,\n prediction: placePrediction,\n secondaryLabel: placePrediction.secondaryText?.text ?? \"\",\n },\n ]\n : []\n )\n );\n }\n } catch {\n if (generation === searchGeneration.current) {\n setSuggestions([]);\n }\n } finally {\n if (generation === searchGeneration.current) {\n setLoading(false);\n }\n }\n }, 250);\n return () => {\n window.clearTimeout(timeout);\n };\n }, [apiKey, focused, value.line1]);\n\n const update = (patch: Partial<SignupAddressValues>) => {\n detailRequestGeneration.current += 1;\n onChange({ ...value, ...patch });\n };\n\n const selectSuggestion = async (suggestion: AddressSuggestion) => {\n const generation = detailRequestGeneration.current + 1;\n detailRequestGeneration.current = generation;\n const place = suggestion.prediction.toPlace();\n try {\n await place.fetchFields({\n fields: [\"addressComponents\", \"formattedAddress\"],\n });\n if (generation !== detailRequestGeneration.current) {\n return;\n }\n onChange(parseAddress(value, place));\n sessionToken.current = null;\n setSuggestions([]);\n setActiveSuggestionIndex(-1);\n setFocused(false);\n } catch {\n if (generation !== detailRequestGeneration.current) {\n return;\n }\n setSuggestions([]);\n setActiveSuggestionIndex(-1);\n }\n };\n\n const handleAddressKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setSuggestions([]);\n setActiveSuggestionIndex(-1);\n return;\n }\n if (suggestions.length === 0) {\n return;\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setActiveSuggestionIndex((current) =>\n current < suggestions.length - 1 ? current + 1 : 0\n );\n return;\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setActiveSuggestionIndex((current) =>\n current > 0 ? current - 1 : suggestions.length - 1\n );\n return;\n }\n const suggestion = suggestions[activeSuggestionIndex];\n if (event.key === \"Enter\" && suggestion) {\n event.preventDefault();\n selectSuggestion(suggestion).catch(() => undefined);\n }\n };\n\n const handleAddressBlur = (event: FocusEvent<HTMLElement>) => {\n const search = event.currentTarget.closest(\n \".lockerverse-signup__address-search\"\n );\n if (search?.contains(event.relatedTarget)) {\n return;\n }\n window.setTimeout(() => setFocused(false), 120);\n };\n\n return (\n <fieldset\n aria-describedby={invalid ? errorId : undefined}\n aria-invalid={invalid ? \"true\" : undefined}\n className=\"lockerverse-signup__address\"\n >\n <legend>Address</legend>\n <label htmlFor={`${id}-line1`}>\n <span>Street address</span>\n <div className=\"lockerverse-signup__address-search\">\n <input\n aria-activedescendant={\n activeSuggestionIndex >= 0\n ? `${id}-suggestion-${activeSuggestionIndex}`\n : undefined\n }\n aria-autocomplete=\"list\"\n aria-controls={listboxId}\n aria-describedby={invalid ? errorId : undefined}\n aria-expanded={focused && suggestions.length > 0}\n aria-invalid={invalid ? \"true\" : undefined}\n autoComplete=\"street-address\"\n id={`${id}-line1`}\n name=\"address.line1\"\n onBlur={handleAddressBlur}\n onChange={(event) => update({ line1: event.currentTarget.value })}\n onFocus={() => setFocused(true)}\n onKeyDown={handleAddressKeyDown}\n required={required}\n role=\"combobox\"\n value={value.line1}\n />\n {loading ? (\n <span className=\"lockerverse-signup__address-loading\">\n Searching…\n </span>\n ) : null}\n {suggestions.length > 0 ? (\n <div\n className=\"lockerverse-signup__address-suggestions\"\n id={listboxId}\n role=\"listbox\"\n >\n {suggestions.map((suggestion, index) => (\n <button\n aria-selected={activeSuggestionIndex === index}\n id={`${id}-suggestion-${index}`}\n key={suggestion.id}\n onBlur={handleAddressBlur}\n onClick={(event) => {\n // Keyboard activation fires click without a prior mouse down.\n if (event.detail === 0) {\n selectSuggestion(suggestion).catch(() => undefined);\n }\n }}\n onMouseDown={(event) => {\n event.preventDefault();\n selectSuggestion(suggestion).catch(() => undefined);\n }}\n role=\"option\"\n type=\"button\"\n >\n <strong>{suggestion.label}</strong>\n {suggestion.secondaryLabel ? (\n <span>{suggestion.secondaryLabel}</span>\n ) : null}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </label>\n <label htmlFor={`${id}-line2`}>\n <span>Apartment, suite, or unit</span>\n <input\n autoComplete=\"address-line2\"\n id={`${id}-line2`}\n onChange={(event) => update({ line2: event.currentTarget.value })}\n placeholder=\"Optional\"\n value={value.line2 ?? \"\"}\n />\n </label>\n <div className=\"lockerverse-signup__address-row\">\n <label htmlFor={`${id}-city`}>\n <span>City</span>\n <input\n autoComplete=\"address-level2\"\n id={`${id}-city`}\n onChange={(event) => update({ city: event.currentTarget.value })}\n required={required}\n value={value.city}\n />\n </label>\n <label htmlFor={`${id}-state`}>\n <span>State</span>\n <input\n autoComplete=\"address-level1\"\n id={`${id}-state`}\n onChange={(event) => update({ state: event.currentTarget.value })}\n required={required}\n value={value.state}\n />\n </label>\n </div>\n <div className=\"lockerverse-signup__address-row\">\n <label htmlFor={`${id}-postal`}>\n <span>Postal code</span>\n <input\n autoComplete=\"postal-code\"\n id={`${id}-postal`}\n onChange={(event) =>\n update({ postalCode: event.currentTarget.value })\n }\n required={required}\n value={value.postalCode}\n />\n </label>\n <label htmlFor={`${id}-country`}>\n <span>Country</span>\n <input\n autoComplete=\"country\"\n id={`${id}-country`}\n maxLength={2}\n onChange={(event) =>\n update({ country: event.currentTarget.value.toUpperCase() })\n }\n required={required}\n value={value.country}\n />\n </label>\n </div>\n </fieldset>\n );\n}\n","import type {\n LockerverseSignup,\n LockerverseSignupAddress,\n} from \"@lockerverse/sdk/signup\";\nimport {\n check,\n nonEmpty,\n nullable,\n object,\n pipe,\n regex,\n safeParse,\n string,\n transform,\n trim,\n} from \"valibot\";\nimport {\n optionalEmailSchema,\n optionalPhoneSchema,\n requiredEmailSchema,\n requiredPhoneSchema,\n} from \"./contact-validation.ts\";\nimport {\n type CustomFieldValues,\n reconcileCustomFieldValues,\n validateCustomFields,\n} from \"./custom-fields.tsx\";\n\nconst POSITIVE_INTEGER_PATTERN = /^[1-9]\\d*$/;\nconst OPTIONAL_POSITIVE_INTEGER_PATTERN = /^(?:$|[1-9]\\d*)$/;\n\nexport type SignupAddressValues = Omit<LockerverseSignupAddress, \"line2\"> & {\n line2: string | null;\n};\n\nexport type SignupFormValues = {\n address: SignupAddressValues;\n customFields: CustomFieldValues;\n email: string;\n honeypot: string;\n name: string;\n participantCount: string;\n phone: string;\n phoneCountry: string;\n};\n\nconst nameSchema = pipe(string(), trim(), nonEmpty(\"Name is required.\"));\nconst optionalParticipantCountSchema = pipe(\n string(),\n trim(),\n regex(\n OPTIONAL_POSITIVE_INTEGER_PATTERN,\n \"Guest count must be a positive whole number.\"\n ),\n transform((value) => (value ? Number(value) : null)),\n check(\n (value) => value === null || Number.isSafeInteger(value),\n \"Guest count must be a positive whole number.\"\n )\n);\nconst requiredParticipantCountSchema = pipe(\n string(),\n trim(),\n nonEmpty(\"Guest count is required.\"),\n regex(\n POSITIVE_INTEGER_PATTERN,\n \"Guest count must be a positive whole number.\"\n ),\n transform(Number),\n check(\n (value) => Number.isSafeInteger(value),\n \"Guest count must be a positive whole number.\"\n )\n);\nconst addressFieldsSchema = object({\n city: string(),\n country: string(),\n line1: string(),\n line2: nullable(string()),\n postalCode: string(),\n state: string(),\n});\nconst requiredAddressSchema = pipe(\n addressFieldsSchema,\n check(isAddressComplete, \"Complete the address.\")\n);\n\nconst EMPTY_ADDRESS: SignupAddressValues = {\n city: \"\",\n country: \"US\",\n line1: \"\",\n line2: null,\n postalCode: \"\",\n state: \"\",\n};\nconst optionalAddressSchema = pipe(\n addressFieldsSchema,\n check(\n (address) => isAddressEmpty(address) || isAddressComplete(address),\n \"Complete the address or leave it blank.\"\n )\n);\n\nexport function isAddressEmpty(address: SignupAddressValues) {\n return ![\n address.city,\n address.line1,\n address.line2,\n address.postalCode,\n address.state,\n ].some((value) => value?.trim());\n}\n\nfunction isAddressComplete(address: SignupAddressValues) {\n return [\n address.city,\n address.country,\n address.line1,\n address.postalCode,\n address.state,\n ].every((value) => value.trim());\n}\n\n/** Phone must already be normalized by the shared phone helper when enabled. */\nexport function validateSignupForm(\n signup: LockerverseSignup,\n values: SignupFormValues\n) {\n const normalizedValues = {\n ...values,\n address: signup.fields.address.enabled ? values.address : EMPTY_ADDRESS,\n customFields: reconcileCustomFieldValues(\n signup.customFields,\n values.customFields\n ),\n email: signup.fields.email.enabled ? values.email : \"\",\n participantCount: signup.fields.participantCount.enabled\n ? values.participantCount\n : \"\",\n phone: signup.fields.phone.enabled ? values.phone : \"\",\n };\n const schema = object({\n address:\n signup.fields.address.enabled && signup.fields.address.required\n ? requiredAddressSchema\n : optionalAddressSchema,\n email:\n signup.fields.email.enabled && signup.fields.email.required\n ? requiredEmailSchema\n : optionalEmailSchema,\n name: nameSchema,\n participantCount:\n signup.fields.participantCount.enabled &&\n signup.fields.participantCount.required\n ? requiredParticipantCountSchema\n : optionalParticipantCountSchema,\n phone:\n signup.fields.phone.enabled && signup.fields.phone.required\n ? requiredPhoneSchema\n : optionalPhoneSchema,\n });\n const result = safeParse(schema, normalizedValues);\n const errors = validateCustomFields(\n signup.customFields,\n normalizedValues.customFields\n );\n if (!result.success) {\n for (const issue of result.issues) {\n const field = issue.path?.[0]?.key;\n const fieldName = [\n \"address\",\n \"email\",\n \"name\",\n \"participantCount\",\n \"phone\",\n ].find((name) => name === field);\n if (fieldName && !errors[fieldName]) {\n errors[fieldName] = issue.message;\n }\n }\n }\n return result.success\n ? { errors, value: { ...normalizedValues, ...result.output } }\n : { errors, value: null };\n}\n","import type {\n LockerverseSdkError,\n LockerverseSignupClient,\n LockerverseSignup as LockerverseSignupDefinition,\n LockerverseSignupSubmissionResult,\n} from \"@lockerverse/sdk/signup\";\nimport {\n type FormEvent,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { getAccentContrast, normalizeAccentColor } from \"./accent-contrast.ts\";\nimport { getPhoneServerError } from \"./contact-validation.ts\";\nimport {\n buildCustomFieldAnswers,\n CustomFields,\n createCustomFieldValues,\n reconcileCustomFieldValues,\n} from \"./custom-fields.tsx\";\nimport { EmailField, FieldError, FormField } from \"./form-field.tsx\";\nimport { FormSkeleton } from \"./form-skeleton.tsx\";\nimport { notifyHostCallback } from \"./host-callback.ts\";\nimport { getInternationalPhone } from \"./phone.ts\";\nimport { PhoneInput } from \"./phone-field.tsx\";\nimport { SignupAddressField } from \"./signup-address-field.tsx\";\nimport type { LockerverseSignupProps } from \"./signup-types.ts\";\nimport {\n type SignupFormValues as FormValues,\n isAddressEmpty,\n type SignupAddressValues,\n validateSignupForm,\n} from \"./signup-validation.ts\";\n\nconst DEFAULT_ADDRESS: SignupAddressValues = {\n city: \"\",\n country: \"US\",\n line1: \"\",\n line2: \"\",\n postalCode: \"\",\n state: \"\",\n};\n\nconst DEFAULT_ACCENT = \"#5751f2\";\n\nfunction createInitialValues(signup: LockerverseSignupDefinition): FormValues {\n return {\n address: DEFAULT_ADDRESS,\n customFields: createCustomFieldValues(signup.customFields),\n email: \"\",\n honeypot: \"\",\n name: \"\",\n participantCount: \"\",\n phone: \"\",\n phoneCountry: \"US\",\n };\n}\n\nfunction focusNamedControl(form: HTMLFormElement, name: string) {\n const control = form.elements.namedItem(name);\n if (control instanceof HTMLElement) {\n if (!control.matches(\":disabled\")) {\n control.focus();\n return true;\n }\n return false;\n }\n if (control instanceof RadioNodeList) {\n const focusable = Array.from(control).find(\n (item) => item instanceof HTMLElement && !item.matches(\":disabled\")\n );\n focusable?.focus();\n return Boolean(focusable);\n }\n return false;\n}\n\nfunction focusFirstSignupValidationError(\n form: HTMLFormElement,\n errors: Record<string, string>\n) {\n const builtInFields: [string, string][] = [\n [\"name\", \"name\"],\n [\"email\", \"email\"],\n [\"phone\", \"phone\"],\n [\"participantCount\", \"participantCount\"],\n [\"address\", \"address.line1\"],\n ];\n for (const [errorKey, controlName] of builtInFields) {\n if (errors[errorKey] && focusNamedControl(form, controlName)) {\n return;\n }\n }\n const builtInKeys = new Set(builtInFields.map(([errorKey]) => errorKey));\n const customFieldId = Object.keys(errors).find(\n (errorKey) => !builtInKeys.has(errorKey)\n );\n if (customFieldId) {\n focusNamedControl(form, `custom:${customFieldId}`);\n }\n}\n\ntype SignupViewProps = Omit<LockerverseSignupProps, \"widget\">;\n\nfunction SignupShell({\n children,\n loading = false,\n status = false,\n viewProps,\n}: {\n children: ReactNode;\n loading?: boolean;\n status?: boolean;\n viewProps: SignupViewProps;\n}) {\n const {\n branding,\n className,\n googlePlacesApiKey: _googlePlacesApiKey,\n onSignupComplete: _onSignupComplete,\n style,\n theme = \"dark\",\n ...sectionProps\n } = viewProps;\n const accent = normalizeAccentColor(\n style?.[\"--lockerverse-accent\"] ??\n style?.[\"--lockerverse-signup-accent\"] ??\n branding?.accentColor ??\n DEFAULT_ACCENT\n );\n const signupStyle: LockerverseSignupProps[\"style\"] = { ...style };\n if (\n style?.[\"--lockerverse-accent\"] !== undefined ||\n style?.[\"--lockerverse-signup-accent\"] !== undefined ||\n branding?.accentColor\n ) {\n signupStyle[\"--lockerverse-accent\"] = accent;\n }\n if (\n style?.[\"--lockerverse-accent-contrast\"] === undefined &&\n style?.[\"--lockerverse-signup-accent-contrast\"] === undefined\n ) {\n const accentContrast = getAccentContrast(accent);\n if (accentContrast) {\n signupStyle[\"--lockerverse-accent-contrast\"] = accentContrast;\n }\n }\n return (\n <section\n {...sectionProps}\n {...(loading ? { \"aria-busy\": true } : {})}\n className={[\n \"lockerverse-signup\",\n status ? \"lockerverse-signup__status\" : null,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={signupStyle}\n >\n {children}\n </section>\n );\n}\n\ntype SignupSubmissionState =\n | { phase: \"idle\" }\n | { phase: \"submitting\" }\n | {\n error: LockerverseSdkError;\n phase: \"submit_error\";\n }\n | {\n phase: \"submitted\";\n };\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: The component renders server-defined field branches in one public form boundary.\nfunction SignupForm({\n client,\n loadError,\n onRetry,\n signup,\n ...viewProps\n}: SignupViewProps & {\n client: LockerverseSignupClient;\n loadError?: LockerverseSdkError | null;\n onRetry?: () => void;\n signup: LockerverseSignupDefinition;\n}) {\n const { branding, googlePlacesApiKey, onSignupComplete } = viewProps;\n const idPrefix = useId();\n const mountedRef = useRef(true);\n const phoneRef = useRef<HTMLInputElement>(null);\n const submittingRef = useRef(false);\n const [state, setState] = useState<SignupSubmissionState>({ phase: \"idle\" });\n const [values, setValues] = useState<FormValues>(() =>\n createInitialValues(signup)\n );\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [submissionRetry, setSubmissionRetry] = useState<{\n payloadKey: string;\n reference: string;\n }>();\n const customFieldValues = reconcileCustomFieldValues(\n signup.customFields,\n values.customFields\n );\n\n useEffect(() => {\n if (customFieldValues !== values.customFields) {\n setValues((current) => ({\n ...current,\n customFields: reconcileCustomFieldValues(\n signup.customFields,\n current.customFields\n ),\n }));\n }\n }, [customFieldValues, signup.customFields, values.customFields]);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n if (state.phase !== \"submitting\" && errors.phone) {\n phoneRef.current?.focus();\n }\n }, [errors.phone, state.phase]);\n\n if (!signup.isActive) {\n return (\n <SignupShell status viewProps={viewProps}>\n <h1>Signup closed</h1>\n <p>This signup is not accepting submissions.</p>\n </SignupShell>\n );\n }\n\n if (state.phase === \"submitted\") {\n return (\n <SignupShell status viewProps={viewProps}>\n {branding ? <Branding branding={branding} /> : null}\n <span aria-hidden=\"true\" className=\"lockerverse-signup__success\">\n ✓\n </span>\n <h1>Thank you</h1>\n <p>Your signup has been received.</p>\n </SignupShell>\n );\n }\n\n const update = (patch: Partial<FormValues>) =>\n setValues((current) => ({ ...current, ...patch }));\n const submitting = state.phase === \"submitting\";\n const submitError =\n state.phase === \"submit_error\" ? state.error.message : undefined;\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Submission maps the enabled server-defined fields to one SDK request.\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n // biome-ignore lint/suspicious/noUnnecessaryConditions: The ref blocks a second submit before React commits the submitting state.\n if (submittingRef.current) {\n return;\n }\n const validation = validateSignupForm(signup, {\n ...values,\n customFields: customFieldValues,\n phone: signup.fields.phone.enabled\n ? getInternationalPhone(values.phone, values.phoneCountry)\n : \"\",\n });\n setErrors(validation.errors);\n if (Object.keys(validation.errors).length > 0 || !validation.value) {\n const form = event.currentTarget;\n queueMicrotask(() =>\n focusFirstSignupValidationError(form, validation.errors)\n );\n return;\n }\n const validatedValues = validation.value;\n const submission = {\n address:\n signup.fields.address.enabled &&\n !isAddressEmpty(validatedValues.address)\n ? validatedValues.address\n : null,\n answers: buildCustomFieldAnswers(\n signup.customFields,\n validatedValues.customFields\n ),\n email: signup.fields.email.enabled ? validatedValues.email || null : null,\n honeypot: validatedValues.honeypot,\n name: validatedValues.name,\n participantCount: signup.fields.participantCount.enabled\n ? validatedValues.participantCount\n : null,\n phone: signup.fields.phone.enabled ? validatedValues.phone || null : null,\n };\n const payloadKey = JSON.stringify(submission);\n const submissionReference =\n submissionRetry?.payloadKey === payloadKey\n ? submissionRetry.reference\n : globalThis.crypto.randomUUID();\n let result: LockerverseSignupSubmissionResult;\n submittingRef.current = true;\n setState({ phase: \"submitting\" });\n try {\n result = await client.submit(submission, { submissionReference });\n } catch (error) {\n if (!mountedRef.current) {\n return;\n }\n // SAFETY: LockerverseSignupClient normalizes each submission rejection to LockerverseSdkError.\n const sdkError = error as LockerverseSdkError;\n const phoneError = getPhoneServerError(sdkError.serverCode);\n if (phoneError) {\n setErrors((current) => ({ ...current, phone: phoneError }));\n setState({ phase: \"idle\" });\n setSubmissionRetry(undefined);\n return;\n }\n setState({ error: sdkError, phase: \"submit_error\" });\n if (sdkError.recoveryRecommended) {\n setSubmissionRetry({\n payloadKey,\n reference: submissionReference,\n });\n } else {\n setSubmissionRetry(undefined);\n }\n return;\n } finally {\n submittingRef.current = false;\n }\n // biome-ignore lint/suspicious/noUnnecessaryConditions: The ref changes during unmount while this request is pending.\n if (!mountedRef.current) {\n return;\n }\n setSubmissionRetry(undefined);\n setState({ phase: \"submitted\" });\n notifyHostCallback(onSignupComplete, result);\n };\n\n return (\n <SignupShell viewProps={viewProps}>\n {signup.coverImageUrl ? (\n <img\n alt=\"\"\n className=\"lockerverse-signup__cover\"\n height={192}\n src={signup.coverImageUrl}\n width={440}\n />\n ) : null}\n {branding ? <Branding branding={branding} /> : null}\n <header>\n {signup.title?.trim() ? <h1>{signup.title}</h1> : null}\n {signup.description ? <p>{signup.description}</p> : null}\n </header>\n {loadError ? (\n <div role=\"alert\">\n <p>{loadError.message}</p>\n <button onClick={onRetry} type=\"button\">\n Retry\n </button>\n </div>\n ) : null}\n <form noValidate onSubmit={handleSubmit}>\n <input\n aria-hidden=\"true\"\n autoComplete=\"off\"\n className=\"lockerverse-signup__honeypot\"\n onChange={(event) => update({ honeypot: event.currentTarget.value })}\n tabIndex={-1}\n value={values.honeypot}\n />\n <div className=\"lockerverse-signup__fields\">\n <label htmlFor={`${idPrefix}-name`}>\n <span>Name</span>\n <input\n aria-describedby={\n errors.name ? `${idPrefix}-name-error` : undefined\n }\n aria-invalid={errors.name ? \"true\" : undefined}\n autoComplete=\"name\"\n id={`${idPrefix}-name`}\n name=\"name\"\n onChange={(event) => update({ name: event.currentTarget.value })}\n required\n value={values.name}\n />\n <FieldError error={errors.name} id={`${idPrefix}-name-error`} />\n </label>\n {signup.fields.email.enabled ? (\n <EmailField\n error={errors.email}\n id={`${idPrefix}-email`}\n label=\"Email\"\n name=\"email\"\n onChange={(event) => update({ email: event.currentTarget.value })}\n required={signup.fields.email.required}\n value={values.email}\n />\n ) : null}\n {signup.fields.phone.enabled ? (\n <FormField\n error={errors.phone}\n id={`${idPrefix}-phone`}\n label=\"Phone\"\n >\n <PhoneInput\n country={values.phoneCountry}\n error={errors.phone}\n errorId={`${idPrefix}-phone-error`}\n id={`${idPrefix}-phone`}\n inputRef={phoneRef}\n name=\"phone\"\n onChange={({ value, country }) =>\n update({ phone: value, phoneCountry: country })\n }\n required={signup.fields.phone.required}\n value={values.phone}\n />\n </FormField>\n ) : null}\n {signup.fields.participantCount.enabled ? (\n <label htmlFor={`${idPrefix}-participant-count`}>\n <span>Guest count</span>\n <input\n aria-describedby={\n errors.participantCount\n ? `${idPrefix}-participant-count-error`\n : undefined\n }\n aria-invalid={errors.participantCount ? \"true\" : undefined}\n id={`${idPrefix}-participant-count`}\n min={1}\n name=\"participantCount\"\n onChange={(event) =>\n update({ participantCount: event.currentTarget.value })\n }\n required={signup.fields.participantCount.required}\n type=\"number\"\n value={values.participantCount}\n />\n <FieldError\n error={errors.participantCount}\n id={`${idPrefix}-participant-count-error`}\n />\n </label>\n ) : null}\n {signup.fields.address.enabled ? (\n <div className=\"lockerverse-signup__field-group\">\n <SignupAddressField\n apiKey={googlePlacesApiKey}\n errorId={\n errors.address ? `${idPrefix}-address-error` : undefined\n }\n invalid={Boolean(errors.address)}\n onChange={(address) => update({ address })}\n required={signup.fields.address.required}\n value={values.address}\n />\n <FieldError\n error={errors.address}\n id={`${idPrefix}-address-error`}\n />\n </div>\n ) : null}\n <CustomFields\n choiceClassName=\"lockerverse-signup__choice\"\n errorClassName=\"lockerverse-signup__field-error\"\n errors={errors}\n fields={signup.customFields}\n idPrefix={idPrefix}\n onChange={(customFields) => update({ customFields })}\n values={customFieldValues}\n />\n </div>\n {submitError ? (\n <p className=\"lockerverse-signup__submit-error\" role=\"alert\">\n {submitError} Try again.\n </p>\n ) : null}\n <button\n className=\"lockerverse-signup__submit\"\n disabled={submitting}\n type=\"submit\"\n >\n {submitting ? \"Submitting…\" : \"Submit\"}\n </button>\n </form>\n </SignupShell>\n );\n}\n\nexport function LockerverseSignup({\n widget,\n ...viewProps\n}: LockerverseSignupProps) {\n if (widget.error && !widget.signup) {\n return (\n <SignupShell status viewProps={viewProps}>\n <h1>Signup unavailable</h1>\n <p role=\"alert\">{widget.error.message}</p>\n <button onClick={widget.refresh} type=\"button\">\n Retry\n </button>\n </SignupShell>\n );\n }\n if (!widget.signup) {\n return (\n <SignupShell loading viewProps={viewProps}>\n <FormSkeleton fieldCount={4} label=\"Loading signup…\" />\n </SignupShell>\n );\n }\n return (\n <SignupForm\n client={widget.client}\n loadError={widget.error}\n onRetry={widget.refresh}\n signup={widget.signup}\n {...viewProps}\n />\n );\n}\n\nfunction Branding({\n branding,\n}: {\n branding: NonNullable<LockerverseSignupProps[\"branding\"]>;\n}) {\n return (\n <div className=\"lockerverse-signup__branding\">\n {branding.imageUrl ? (\n <img alt=\"\" height={48} src={branding.imageUrl} width={48} />\n ) : null}\n <strong>{branding.name}</strong>\n </div>\n );\n}\n","import {\n type CreateLockerverseSignupOptions,\n createLockerverseSignupClient,\n type LockerverseSdkError,\n type LockerverseSignup,\n type LockerverseSignupClient,\n} from \"@lockerverse/sdk/signup\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useImmutableResourceIdentity } from \"./immutable-resource-identity.ts\";\n\ntype SignupLoadState = {\n error: LockerverseSdkError | null;\n loading: boolean;\n signup: LockerverseSignup | null;\n};\n\nexport type UseLockerverseSignupOptions = {\n /** Initial public SDK snapshot. The hook still refreshes on mount. */\n initialSignup?: LockerverseSignup;\n};\n\nexport type UseLockerverseSignupResult = {\n client: LockerverseSignupClient;\n error: LockerverseSdkError | null;\n loading: boolean;\n refresh: () => void;\n signup: LockerverseSignup | null;\n};\n\nexport function useLockerverseSignup(\n options: CreateLockerverseSignupOptions,\n { initialSignup }: UseLockerverseSignupOptions = {}\n): UseLockerverseSignupResult {\n const { onError } = options;\n useImmutableResourceIdentity(\"signup\", {\n apiBaseUrl: options.apiBaseUrl,\n communitySlug: options.communitySlug,\n environment: options.environment,\n slug: options.signupSlug,\n });\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const [client] = useState(() => {\n const clientOptions: CreateLockerverseSignupOptions = {\n ...options,\n onError: (error) => onErrorRef.current?.(error),\n };\n return createLockerverseSignupClient(clientOptions);\n });\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<SignupLoadState>(() => ({\n error: null,\n loading: true,\n signup: initialSignup ?? null,\n }));\n\n useEffect(() => {\n let active = true;\n client.load().then(\n (signup) => {\n if (active) {\n setState({\n error: null,\n loading: false,\n signup,\n });\n }\n },\n (error: LockerverseSdkError) => {\n if (active) {\n setState((current) => ({ ...current, error, loading: false }));\n }\n }\n );\n return () => {\n active = false;\n };\n }, [client, revision]);\n\n const refresh = useCallback(() => {\n setState((current) => ({ ...current, error: null, loading: true }));\n setRevision((value) => value + 1);\n }, []);\n\n return {\n client,\n error: state.error,\n loading: state.loading,\n refresh,\n signup: state.signup,\n };\n}\n"],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as LockerverseTheme, t as LockerverseStyle } from "./theme.js";
|
|
2
|
-
import {
|
|
2
|
+
import { n as UseLockerverseWidgetResult } from "./use-lockerverse-widget.js";
|
|
3
3
|
import { ComponentPropsWithoutRef } from "react";
|
|
4
4
|
import { LockerversePaymentCompletion } from "@lockerverse/sdk/checkout";
|
|
5
5
|
import { loadStripe } from "@stripe/stripe-js";
|
|
@@ -7,7 +7,11 @@ type UseLockerverseWidgetResult = {
|
|
|
7
7
|
loading: boolean;
|
|
8
8
|
refresh: () => void;
|
|
9
9
|
};
|
|
10
|
-
|
|
10
|
+
type UseLockerverseWidgetOptions = {
|
|
11
|
+
/** Initial public SDK catalog. The hook still refreshes on mount. */
|
|
12
|
+
initialCatalog?: LockerverseCatalog;
|
|
13
|
+
};
|
|
14
|
+
declare function useLockerverseWidget(options: CreateLockerverseWidgetOptions, { initialCatalog }?: UseLockerverseWidgetOptions): UseLockerverseWidgetResult;
|
|
11
15
|
//#endregion
|
|
12
|
-
export {
|
|
16
|
+
export { UseLockerverseWidgetResult as n, useLockerverseWidget as r, UseLockerverseWidgetOptions as t };
|
|
13
17
|
//# sourceMappingURL=use-lockerverse-widget.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-lockerverse-widget.d.ts","names":[],"sources":["../src/use-lockerverse-widget.ts"],"mappings":";;KASY;EACV,SAAS;EACT,QAAQ;EACR,OAAO;EACP;EACA;;
|
|
1
|
+
{"version":3,"file":"use-lockerverse-widget.d.ts","names":[],"sources":["../src/use-lockerverse-widget.ts"],"mappings":";;KASY;EACV,SAAS;EACT,QAAQ;EACR,OAAO;EACP;EACA;;KAGU;;EAEV,iBAAiB;;iBAeH,qBACd,SAAS,kCACP,mBAAkB,8BACnB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./immutable-resource-identity.js";import{useCallback as t,useEffect as n,useRef as r,useState as i}from"react";import{createLockerverseCheckoutClient as a}from"@lockerverse/sdk/checkout";function o(e){return e instanceof Error?e:Error(`Unable to load the Lockerverse widget.`)}function s(s){let{apiBaseUrl:
|
|
1
|
+
import{t as e}from"./immutable-resource-identity.js";import{useCallback as t,useEffect as n,useRef as r,useState as i}from"react";import{createLockerverseCheckoutClient as a}from"@lockerverse/sdk/checkout";function o(e){return e instanceof Error?e:Error(`Unable to load the Lockerverse widget.`)}function s(s,{initialCatalog:c}={}){let{apiBaseUrl:l,communitySlug:u,environment:d,onError:f,widgetSlug:p}=s;e(`payment widget`,{apiBaseUrl:l,communitySlug:u,environment:d,slug:p});let[m,h]=i(0),[g,_]=i(()=>({catalog:c??null,error:null,loading:!0})),v=r(f);v.current=f;let[y]=i(()=>a({...s,onError:e=>v.current?.(e)}));n(()=>{let e=!0;async function t(){try{let t=await y.load();e&&_({catalog:t,error:null,loading:!1})}catch(t){e&&_(e=>({...e,error:o(t),loading:!1}))}}return t(),()=>{e=!1}},[y,m]);let b=t(()=>{_(e=>({...e,error:null,loading:!0})),h(e=>e+1)},[]),{catalog:x,error:S}=g;return{catalog:x,client:y,error:S,loading:g.loading,refresh:b}}export{s as t};
|
|
2
2
|
//# sourceMappingURL=use-lockerverse-widget.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-lockerverse-widget.js","names":[],"sources":["../src/use-lockerverse-widget.ts"],"sourcesContent":["import type {\n CreateLockerverseWidgetOptions,\n LockerverseCatalog,\n LockerverseCheckoutClient,\n} from \"@lockerverse/sdk/checkout\";\nimport { createLockerverseCheckoutClient } from \"@lockerverse/sdk/checkout\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useImmutableResourceIdentity } from \"./immutable-resource-identity.ts\";\n\nexport type UseLockerverseWidgetResult = {\n catalog: LockerverseCatalog | null;\n client: LockerverseCheckoutClient;\n error: Error | null;\n loading: boolean;\n refresh: () => void;\n};\n\ntype WidgetLoadState = {\n catalog: LockerverseCatalog | null;\n error: Error | null;\n};\n\nfunction toError<ErrorValue>(error: ErrorValue) {\n return error instanceof Error\n ? error\n : new Error(\"Unable to load the Lockerverse widget.\");\n}\n\nexport function useLockerverseWidget(\n options: CreateLockerverseWidgetOptions\n): UseLockerverseWidgetResult {\n const { apiBaseUrl, communitySlug, environment, onError, widgetSlug } =\n options;\n useImmutableResourceIdentity(\"payment widget\", {\n apiBaseUrl,\n communitySlug,\n environment,\n slug: widgetSlug,\n });\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<WidgetLoadState>({\n catalog: null,\n error: null,\n });\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const [client] = useState(() =>\n createLockerverseCheckoutClient({\n ...options,\n onError: (reportedError) => onErrorRef.current?.(reportedError),\n })\n );\n\n useEffect(() => {\n let active = true;\n\n async function loadWidget() {\n try {\n const catalog = await client.load();\n if (active) {\n setState({\n catalog,\n error: null,\n });\n }\n } catch (cause) {\n if (active) {\n setState({\n
|
|
1
|
+
{"version":3,"file":"use-lockerverse-widget.js","names":[],"sources":["../src/use-lockerverse-widget.ts"],"sourcesContent":["import type {\n CreateLockerverseWidgetOptions,\n LockerverseCatalog,\n LockerverseCheckoutClient,\n} from \"@lockerverse/sdk/checkout\";\nimport { createLockerverseCheckoutClient } from \"@lockerverse/sdk/checkout\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useImmutableResourceIdentity } from \"./immutable-resource-identity.ts\";\n\nexport type UseLockerverseWidgetResult = {\n catalog: LockerverseCatalog | null;\n client: LockerverseCheckoutClient;\n error: Error | null;\n loading: boolean;\n refresh: () => void;\n};\n\nexport type UseLockerverseWidgetOptions = {\n /** Initial public SDK catalog. The hook still refreshes on mount. */\n initialCatalog?: LockerverseCatalog;\n};\n\ntype WidgetLoadState = {\n catalog: LockerverseCatalog | null;\n error: Error | null;\n loading: boolean;\n};\n\nfunction toError<ErrorValue>(error: ErrorValue) {\n return error instanceof Error\n ? error\n : new Error(\"Unable to load the Lockerverse widget.\");\n}\n\nexport function useLockerverseWidget(\n options: CreateLockerverseWidgetOptions,\n { initialCatalog }: UseLockerverseWidgetOptions = {}\n): UseLockerverseWidgetResult {\n const { apiBaseUrl, communitySlug, environment, onError, widgetSlug } =\n options;\n useImmutableResourceIdentity(\"payment widget\", {\n apiBaseUrl,\n communitySlug,\n environment,\n slug: widgetSlug,\n });\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<WidgetLoadState>(() => ({\n catalog: initialCatalog ?? null,\n error: null,\n loading: true,\n }));\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const [client] = useState(() =>\n createLockerverseCheckoutClient({\n ...options,\n onError: (reportedError) => onErrorRef.current?.(reportedError),\n })\n );\n\n useEffect(() => {\n let active = true;\n\n async function loadWidget() {\n try {\n const catalog = await client.load();\n if (active) {\n setState({\n catalog,\n error: null,\n loading: false,\n });\n }\n } catch (cause) {\n if (active) {\n setState((current) => ({\n ...current,\n error: toError(cause),\n loading: false,\n }));\n }\n }\n }\n\n loadWidget();\n return () => {\n active = false;\n };\n }, [client, revision]);\n\n const refresh = useCallback(() => {\n setState((current) => ({ ...current, error: null, loading: true }));\n setRevision((value) => value + 1);\n }, []);\n const { catalog, error: loadError } = state;\n\n return {\n catalog,\n client,\n error: loadError,\n loading: state.loading,\n refresh,\n };\n}\n"],"mappings":"8MA4BA,SAAS,EAAoB,EAAmB,CAC9C,OAAO,aAAiB,MACpB,EACI,MAAM,wCAAwC,CACxD,CAEA,SAAgB,EACd,EACA,CAAE,kBAAgD,CAAC,EACvB,CAC5B,GAAM,CAAE,aAAY,gBAAe,cAAa,UAAS,cACvD,EACF,EAA6B,iBAAkB,CAC7C,aACA,gBACA,cACA,KAAM,CACR,CAAC,EACD,GAAM,CAAC,EAAU,GAAe,EAAS,CAAC,EACpC,CAAC,EAAO,GAAY,OAAiC,CACzD,QAAS,GAAkB,KAC3B,MAAO,KACP,QAAS,EACX,EAAE,EACI,EAAa,EAAO,CAAO,EACjC,EAAW,QAAU,EACrB,GAAM,CAAC,GAAU,MACf,EAAgC,CAC9B,GAAG,EACH,QAAU,GAAkB,EAAW,UAAU,CAAa,CAChE,CAAC,CACH,EAEA,MAAgB,CACd,IAAI,EAAS,GAEb,eAAe,GAAa,CAC1B,GAAI,CACF,IAAM,EAAU,MAAM,EAAO,KAAK,EAC9B,GACF,EAAS,CACP,UACA,MAAO,KACP,QAAS,EACX,CAAC,CAEL,OAAS,EAAO,CACV,GACF,EAAU,IAAa,CACrB,GAAG,EACH,MAAO,EAAQ,CAAK,EACpB,QAAS,EACX,EAAE,CAEN,CACF,CAGA,OADA,EAAW,MACE,CACX,EAAS,EACX,CACF,EAAG,CAAC,EAAQ,CAAQ,CAAC,EAErB,IAAM,EAAU,MAAkB,CAChC,EAAU,IAAa,CAAE,GAAG,EAAS,MAAO,KAAM,QAAS,EAAK,EAAE,EAClE,EAAa,GAAU,EAAQ,CAAC,CAClC,EAAG,CAAC,CAAC,EACC,CAAE,UAAS,MAAO,GAAc,EAEtC,MAAO,CACL,UACA,SACA,MAAO,EACP,QAAS,EAAM,QACf,SACF,CACF"}
|
package/dist/widget.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as useLockerverseWidget, t as
|
|
2
|
-
export { type UseLockerverseWidgetResult, useLockerverseWidget };
|
|
1
|
+
import { n as UseLockerverseWidgetResult, r as useLockerverseWidget, t as UseLockerverseWidgetOptions } from "./use-lockerverse-widget.js";
|
|
2
|
+
export { type UseLockerverseWidgetOptions, type UseLockerverseWidgetResult, useLockerverseWidget };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lockerverse/react",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.137",
|
|
4
4
|
"description": "Tree-shakable React payment and signup UI for Lockerverse",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -127,7 +127,7 @@
|
|
|
127
127
|
"embla-carousel-react": "8.6.0",
|
|
128
128
|
"lucide-react": "0.536.0",
|
|
129
129
|
"valibot": "1.4.2",
|
|
130
|
-
"@lockerverse/sdk": "0.2.
|
|
130
|
+
"@lockerverse/sdk": "0.2.137"
|
|
131
131
|
},
|
|
132
132
|
"devDependencies": {
|
|
133
133
|
"@size-limit/file": "13.0.3",
|