@lockerverse/react 0.2.61 → 0.2.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/signup.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,u as c}from"./contact-validation.js";import{useEffect as l,useId as u,useMemo as d,useRef as f,useState as p}from"react";import{check as m,nonEmpty as h,nullable as g,object as _,pipe as v,regex as y,safeParse as b,string as x,transform as S,trim as C}from"valibot";import{jsx as w,jsxs as T}from"react/jsx-runtime";import{createLockerverseSignupClient as E}from"@lockerverse/sdk/signup";const D=`lockerverse-signup-google-places`,O=[`premise`,`subpremise`,`street_address`,`route`];let k=null;function A(e){let t=window;if(t.google?.maps?.importLibrary)return;t.google||={};let n=t.google;n.maps||={};let r=n.maps,i=null;r.importLibrary=n=>(i||=new Promise((t,i)=>{let a=document.getElementById(D);if(r.__lockerverseSignupReady=t,a){a.addEventListener(`error`,()=>i(Error(`Unable to load Google Places.`)),{once:!0});return}let o=document.createElement(`script`),s=new URLSearchParams({callback:`google.maps.__lockerverseSignupReady`,key:e,libraries:n,v:`weekly`});o.async=!0,o.id=D,o.src=`https://maps.googleapis.com/maps/api/js?${s}`,o.onerror=()=>i(Error(`Unable to load Google Places.`)),document.head.append(o)}),i.then(()=>t.google?.maps?.importLibrary?.(n)).catch(e=>{throw i=null,document.getElementById(D)?.remove(),e}))}function j(e){return k||=(async()=>{try{return A(e),await window.google?.maps?.importLibrary?.(`places`)}catch(e){throw k=null,e}})(),k}function M(e,t,n=`longText`){return e.find(e=>e.types.includes(t))?.[n]??``}function N(e,t){let n=t.addressComponents??[],r=[M(n,`street_number`),M(n,`route`)].filter(Boolean).join(` `);return{...e,city:M(n,`locality`)||M(n,`postal_town`)||M(n,`sublocality_level_1`),country:M(n,`country`,`shortText`)||`US`,line1:r||t.formattedAddress?.split(`,`)[0]||``,line2:M(n,`subpremise`),postalCode:[M(n,`postal_code`),M(n,`postal_code_suffix`)].filter(Boolean).join(`-`),state:M(n,`administrative_area_level_1`,`shortText`)}}function ee({apiKey:e,errorId:t,invalid:n,onChange:r,required:i,value:a}){let o=u(),s=`${o}-suggestions`,[c,d]=p(-1),[m,h]=p(!1),[g,_]=p(!1),[v,y]=p([]),b=f(null);l(()=>{let t=a.line1.trim();if(d(-1),!(e&&m&&t.length>=3)){y([]);return}let n=!0,r=window.setTimeout(async()=>{_(!0);try{let{AutocompleteSessionToken:r,AutocompleteSuggestion:i}=await j(e);b.current??=new r;let a=await i.fetchAutocompleteSuggestions({includedPrimaryTypes:O,includedRegionCodes:[`US`],input:t,region:`US`,sessionToken:b.current});n&&y(a.suggestions.flatMap(({placePrediction:e})=>e?[{id:e.placeId,label:e.mainText?.text??e.text.text,prediction:e,secondaryLabel:e.secondaryText?.text??``}]:[]))}catch{n&&y([])}finally{n&&_(!1)}},250);return()=>{n=!1,window.clearTimeout(r)}},[e,m,a.line1]);let x=e=>r({...a,...e}),S=async e=>{let t=e.prediction.toPlace();try{await t.fetchFields({fields:[`addressComponents`,`formattedAddress`]}),r(N(a,t)),b.current=null,y([]),d(-1),h(!1)}catch{y([]),d(-1)}};return T(`fieldset`,{"aria-describedby":n?t:void 0,"aria-invalid":n?`true`:void 0,className:`lockerverse-signup__address`,children:[w(`legend`,{children:`Address`}),T(`label`,{htmlFor:`${o}-line1`,children:[w(`span`,{children:`Street address`}),T(`div`,{className:`lockerverse-signup__address-search`,children:[w(`input`,{"aria-activedescendant":c>=0?`${o}-suggestion-${c}`:void 0,"aria-autocomplete":`list`,"aria-controls":s,"aria-describedby":n?t:void 0,"aria-expanded":m&&v.length>0,"aria-invalid":n?`true`:void 0,autoComplete:`street-address`,id:`${o}-line1`,name:`address.line1`,onBlur:()=>window.setTimeout(()=>h(!1),120),onChange:e=>x({line1:e.currentTarget.value}),onFocus:()=>h(!0),onKeyDown:e=>{if(e.key===`Escape`){e.preventDefault(),y([]),d(-1);return}if(v.length===0)return;if(e.key===`ArrowDown`){e.preventDefault(),d(e=>e<v.length-1?e+1:0);return}if(e.key===`ArrowUp`){e.preventDefault(),d(e=>e>0?e-1:v.length-1);return}let t=v[c];e.key===`Enter`&&t&&(e.preventDefault(),S(t).catch(()=>void 0))},required:i,role:`combobox`,value:a.line1}),g?w(`span`,{className:`lockerverse-signup__address-loading`,children:`Searching…`}):null,v.length>0?w(`div`,{className:`lockerverse-signup__address-suggestions`,id:s,role:`listbox`,children:v.map((e,t)=>T(`button`,{"aria-selected":c===t,id:`${o}-suggestion-${t}`,onMouseDown:t=>{t.preventDefault(),S(e).catch(()=>void 0)},role:`option`,type:`button`,children:[w(`strong`,{children:e.label}),e.secondaryLabel?w(`span`,{children:e.secondaryLabel}):null]},e.id))}):null]})]}),T(`label`,{htmlFor:`${o}-line2`,children:[w(`span`,{children:`Apartment, suite, or unit`}),w(`input`,{autoComplete:`address-line2`,id:`${o}-line2`,onChange:e=>x({line2:e.currentTarget.value}),placeholder:`Optional`,value:a.line2??``})]}),T(`div`,{className:`lockerverse-signup__address-row`,children:[T(`label`,{htmlFor:`${o}-city`,children:[w(`span`,{children:`City`}),w(`input`,{autoComplete:`address-level2`,id:`${o}-city`,onChange:e=>x({city:e.currentTarget.value}),required:i,value:a.city})]}),T(`label`,{htmlFor:`${o}-state`,children:[w(`span`,{children:`State`}),w(`input`,{autoComplete:`address-level1`,id:`${o}-state`,onChange:e=>x({state:e.currentTarget.value}),required:i,value:a.state})]})]}),T(`div`,{className:`lockerverse-signup__address-row`,children:[T(`label`,{htmlFor:`${o}-postal`,children:[w(`span`,{children:`Postal code`}),w(`input`,{autoComplete:`postal-code`,id:`${o}-postal`,onChange:e=>x({postalCode:e.currentTarget.value}),required:i,value:a.postalCode})]}),T(`label`,{htmlFor:`${o}-country`,children:[w(`span`,{children:`Country`}),w(`input`,{autoComplete:`country`,id:`${o}-country`,maxLength:2,onChange:e=>x({country:e.currentTarget.value.toUpperCase()}),required:i,value:a.country})]})]})]})}const P=/^[1-9]\d*$/,F=/^(?:$|[1-9]\d*)$/,I=v(x(),C(),h(`Name is required.`)),L=v(x(),C(),y(F,`Guest count must be a positive whole number.`),S(e=>e?Number(e):null),m(e=>e===null||Number.isSafeInteger(e),`Guest count must be a positive whole number.`)),R=v(x(),C(),h(`Guest count is required.`),y(P,`Guest count must be a positive whole number.`),S(Number),m(e=>Number.isSafeInteger(e),`Guest count must be a positive whole number.`)),z=_({city:x(),country:x(),line1:x(),line2:g(x()),postalCode:x(),state:x()}),B=v(z,m(U,`Complete the address.`)),V=v(z,m(e=>H(e)||U(e),`Complete the address or leave it blank.`));function H(e){return![e.city,e.line1,e.line2,e.postalCode,e.state].some(e=>e?.trim())}function U(e){return[e.city,e.country,e.line1,e.postalCode,e.state].every(e=>e.trim())}function W(t,a){let s=_({address:t.fields.address.required?B:V,email:t.fields.email.required?n:i,name:I,participantCount:t.fields.participantCount.required?R:L,phone:t.fields.phone.required?e:o}),c=b(s,a),l=r(t.customFields,a.customFields);if(!c.success)for(let e of c.issues){let t=e.path?.[0]?.key;typeof t==`string`&&!l[t]&&(l[t]=e.message)}return c.success?{errors:l,value:{...a,...c.output}}:{errors:l,value:null}}const G={city:``,country:`US`,line1:``,line2:``,postalCode:``,state:``};function te(e){return{address:G,customFields:t(e.customFields),email:``,honeypot:``,name:``,participantCount:``,phone:``}}function K({error:e,id:t}){return e?w(`span`,{className:`lockerverse-signup__field-error`,id:t,role:`alert`,children:e}):null}function q(e,t){let n=e.elements.namedItem(t);if(n instanceof HTMLElement)return!n.matches(`:disabled`)&&(n.focus(),!0);if(n instanceof RadioNodeList){let e=Array.from(n).find(e=>e instanceof HTMLElement&&!e.matches(`:disabled`));return e?.focus(),!!e}return!1}function ne(e,t){let n=[[`name`,`name`],[`email`,`email`],[`phone`,`phone`],[`participantCount`,`participantCount`],[`address`,`address.line1`]];for(let[r,i]of n)if(t[r]&&q(e,i))return;let r=new Set(n.map(([e])=>e)),i=Object.keys(t).find(e=>!r.has(e));i&&q(e,`custom:${i}`)}function J(){return T(`section`,{"aria-busy":`true`,className:`lockerverse-signup lockerverse-signup__status`,children:[w(`span`,{className:`lockerverse-signup__spinner`}),w(`p`,{children:`Loading signup…`})]})}function re({message:e,onRetry:t}){return T(`section`,{className:`lockerverse-signup lockerverse-signup__status`,children:[w(`h1`,{children:`Signup unavailable`}),w(`p`,{role:`alert`,children:e}),w(`button`,{onClick:t,type:`button`,children:`Retry`})]})}function Y(e){let{apiBaseUrl:t,branding:n,className:r,communitySlug:i,environment:o,fetch:m,googlePlacesApiKey:h,onError:g,onSignupComplete:_,requestTimeoutMs:v,sentryDsn:y,signupSlug:b,style:x,theme:S=`dark`,...C}=e,D=u(),O=f(g);O.current=g;let k=d(()=>E({apiBaseUrl:t,communitySlug:i,environment:o,fetch:m,onError:e=>O.current?.(e),requestTimeoutMs:v,sentryDsn:y,signupSlug:b}),[t,i,o,m,v,y,b]),A=f(k);A.current=k;let j=f(!0),M=f(!1),[N,P]=p(0),[F,I]=p({phase:`loading`}),[L,R]=p(null),[z,B]=p({}),[V,U]=p();l(()=>(j.current=!0,()=>{j.current=!1}),[]),l(()=>{let e=!0;return M.current=!1,I({phase:`loading`}),R(null),B({}),U(void 0),k.load().then(t=>{e&&(R(te(t)),I({phase:`ready`,signup:t}))},t=>{e&&I({error:t,phase:`load_error`})}),()=>{e=!1}},[k,N]);let G=`signup`in F?F.signup:null;if(F.phase===`loading`||G&&!L)return w(J,{});if(F.phase===`load_error`)return w(re,{message:F.error.message,onRetry:()=>P(e=>e+1)});if(!(G&&L))return w(J,{});let q=n?.accentColor??`#5751f2`,Y={"--lockerverse-signup-accent":q,"--lockerverse-signup-accent-contrast":c(q),...x};if(!G.isActive)return T(`section`,{...C,className:[`lockerverse-signup`,`lockerverse-signup__status`,r].filter(Boolean).join(` `),"data-lockerverse-theme":S,style:Y,children:[w(`h1`,{children:`Signup closed`}),w(`p`,{children:`This signup is not accepting submissions.`})]});if(F.phase===`submitted`)return T(`section`,{...C,className:[`lockerverse-signup`,`lockerverse-signup__status`,r].filter(Boolean).join(` `),"data-lockerverse-theme":S,style:Y,children:[n?w(X,{branding:n}):null,w(`span`,{"aria-hidden":`true`,className:`lockerverse-signup__success`,children:`✓`}),w(`h1`,{children:`Thank you`}),w(`p`,{children:`Your signup has been received.`})]});let Z=e=>R({...L,...e}),Q=F.phase===`submitting`,$=F.phase===`submit_error`?F.error.message:void 0,ie=async e=>{if(e.preventDefault(),M.current)return;let t=W(G,L);if(B(t.errors),Object.keys(t.errors).length>0||!t.value){let n=e.currentTarget;queueMicrotask(()=>ne(n,t.errors));return}let n=t.value,r={address:G.fields.address.enabled&&!H(n.address)?n.address:null,answers:s(G.customFields,n.customFields),email:G.fields.email.enabled&&n.email||null,honeypot:n.honeypot,name:n.name,participantCount:G.fields.participantCount.enabled?n.participantCount:null,phone:G.fields.phone.enabled&&n.phone||null},i=JSON.stringify(r),a=V?.payloadKey===i?V.reference:globalThis.crypto.randomUUID(),o;M.current=!0,I({phase:`submitting`,signup:G});try{o=await k.submit(r,{submissionReference:a})}catch(e){if(!(j.current&&A.current===k))return;let t=e;I({error:t,phase:`submit_error`,signup:G}),t.recoveryRecommended?U({payloadKey:i,reference:a}):U(void 0);return}finally{M.current=!1}j.current&&A.current===k&&(U(void 0),I({phase:`submitted`,signup:G,submission:o}),_?.(o))};return T(`section`,{...C,className:[`lockerverse-signup`,r].filter(Boolean).join(` `),"data-lockerverse-theme":S,style:Y,children:[G.coverImageUrl?w(`img`,{alt:``,className:`lockerverse-signup__cover`,height:192,src:G.coverImageUrl,width:440}):null,n?w(X,{branding:n}):null,T(`header`,{children:[G.title?.trim()?w(`h1`,{children:G.title}):null,G.description?w(`p`,{children:G.description}):null]}),T(`form`,{noValidate:!0,onSubmit:ie,children:[w(`input`,{"aria-hidden":`true`,autoComplete:`off`,className:`lockerverse-signup__honeypot`,onChange:e=>Z({honeypot:e.currentTarget.value}),tabIndex:-1,value:L.honeypot}),T(`div`,{className:`lockerverse-signup__fields`,children:[T(`label`,{htmlFor:`${D}-name`,children:[w(`span`,{children:`Name`}),w(`input`,{"aria-describedby":z.name?`${D}-name-error`:void 0,"aria-invalid":z.name?`true`:void 0,autoComplete:`name`,id:`${D}-name`,name:`name`,onChange:e=>Z({name:e.currentTarget.value}),required:!0,value:L.name}),w(K,{error:z.name,id:`${D}-name-error`})]}),G.fields.email.enabled?T(`label`,{htmlFor:`${D}-email`,children:[w(`span`,{children:`Email`}),w(`input`,{"aria-describedby":z.email?`${D}-email-error`:void 0,"aria-invalid":z.email?`true`:void 0,autoComplete:`email`,id:`${D}-email`,name:`email`,onChange:e=>Z({email:e.currentTarget.value}),required:G.fields.email.required,type:`email`,value:L.email}),w(K,{error:z.email,id:`${D}-email-error`})]}):null,G.fields.phone.enabled?T(`label`,{htmlFor:`${D}-phone`,children:[w(`span`,{children:`Phone`}),w(`input`,{"aria-describedby":z.phone?`${D}-phone-error`:void 0,"aria-invalid":z.phone?`true`:void 0,autoComplete:`tel`,id:`${D}-phone`,name:`phone`,onChange:e=>Z({phone:e.currentTarget.value}),placeholder:`+1 555 555 0123`,required:G.fields.phone.required,type:`tel`,value:L.phone}),w(K,{error:z.phone,id:`${D}-phone-error`})]}):null,G.fields.participantCount.enabled?T(`label`,{htmlFor:`${D}-participant-count`,children:[w(`span`,{children:`Guest count`}),w(`input`,{"aria-describedby":z.participantCount?`${D}-participant-count-error`:void 0,"aria-invalid":z.participantCount?`true`:void 0,id:`${D}-participant-count`,min:1,name:`participantCount`,onChange:e=>Z({participantCount:e.currentTarget.value}),required:G.fields.participantCount.required,type:`number`,value:L.participantCount}),w(K,{error:z.participantCount,id:`${D}-participant-count-error`})]}):null,G.fields.address.enabled?T(`div`,{className:`lockerverse-signup__field-group`,children:[w(ee,{apiKey:h,errorId:z.address?`${D}-address-error`:void 0,invalid:!!z.address,onChange:e=>Z({address:e}),required:G.fields.address.required,value:L.address}),w(K,{error:z.address,id:`${D}-address-error`})]}):null,w(a,{choiceClassName:`lockerverse-signup__choice`,errorClassName:`lockerverse-signup__field-error`,errors:z,fields:G.customFields,idPrefix:D,onChange:e=>Z({customFields:e}),values:L.customFields})]}),$?T(`p`,{className:`lockerverse-signup__submit-error`,role:`alert`,children:[$,` Try again.`]}):null,w(`button`,{className:`lockerverse-signup__submit`,disabled:Q,type:`submit`,children:Q?`Submitting…`:`Submit`})]})]})}function X({branding:e}){return T(`div`,{className:`lockerverse-signup__branding`,children:[e.imageUrl?w(`img`,{alt:``,height:48,src:e.imageUrl,width:48}):null,w(`strong`,{children:e.name})]})}export{Y as LockerverseSignup};
|
|
1
|
+
import{a as e,c as t,d as n,i as r,l as i,n as a,o,r as s,s as c,u as l}from"./contact-validation.js";import{useEffect as u,useId as d,useMemo as f,useRef as p,useState as m}from"react";import{check as h,nonEmpty as g,nullable as _,object as v,pipe as y,regex as b,safeParse as x,string as S,transform as C,trim as w}from"valibot";import{jsx as T,jsxs as E}from"react/jsx-runtime";import{createLockerverseSignupClient as ee}from"@lockerverse/sdk/signup";const D=`lockerverse-signup-google-places`,O=[`premise`,`subpremise`,`street_address`,`route`];let k=null;function A(e){let t=window;if(t.google?.maps?.importLibrary)return;t.google||={};let n=t.google;n.maps||={};let r=n.maps,i=null;r.importLibrary=n=>(i||=new Promise((t,i)=>{let a=document.getElementById(D);if(r.__lockerverseSignupReady=t,a){a.addEventListener(`error`,()=>i(Error(`Unable to load Google Places.`)),{once:!0});return}let o=document.createElement(`script`),s=new URLSearchParams({callback:`google.maps.__lockerverseSignupReady`,key:e,libraries:n,v:`weekly`});o.async=!0,o.id=D,o.src=`https://maps.googleapis.com/maps/api/js?${s}`,o.onerror=()=>i(Error(`Unable to load Google Places.`)),document.head.append(o)}),i.then(()=>t.google?.maps?.importLibrary?.(n)).catch(e=>{throw i=null,document.getElementById(D)?.remove(),e}))}function j(e){return k||=(async()=>{try{return A(e),await window.google?.maps?.importLibrary?.(`places`)}catch(e){throw k=null,e}})(),k}function M(e,t,n=`longText`){return e.find(e=>e.types.includes(t))?.[n]??``}function N(e,t){let n=t.addressComponents??[],r=[M(n,`street_number`),M(n,`route`)].filter(Boolean).join(` `);return{...e,city:M(n,`locality`)||M(n,`postal_town`)||M(n,`sublocality_level_1`),country:M(n,`country`,`shortText`)||`US`,line1:r||t.formattedAddress?.split(`,`)[0]||``,line2:M(n,`subpremise`),postalCode:[M(n,`postal_code`),M(n,`postal_code_suffix`)].filter(Boolean).join(`-`),state:M(n,`administrative_area_level_1`,`shortText`)}}function P({apiKey:e,errorId:t,invalid:n,onChange:r,required:i,value:a}){let o=d(),s=`${o}-suggestions`,[c,l]=m(-1),[f,h]=m(!1),[g,_]=m(!1),[v,y]=m([]),b=p(null);u(()=>{let t=a.line1.trim();if(l(-1),!(e&&f&&t.length>=3)){y([]);return}let n=!0,r=window.setTimeout(async()=>{_(!0);try{let{AutocompleteSessionToken:r,AutocompleteSuggestion:i}=await j(e);b.current??=new r;let a=await i.fetchAutocompleteSuggestions({includedPrimaryTypes:O,includedRegionCodes:[`US`],input:t,region:`US`,sessionToken:b.current});n&&y(a.suggestions.flatMap(({placePrediction:e})=>e?[{id:e.placeId,label:e.mainText?.text??e.text.text,prediction:e,secondaryLabel:e.secondaryText?.text??``}]:[]))}catch{n&&y([])}finally{n&&_(!1)}},250);return()=>{n=!1,window.clearTimeout(r)}},[e,f,a.line1]);let x=e=>r({...a,...e}),S=async e=>{let t=e.prediction.toPlace();try{await t.fetchFields({fields:[`addressComponents`,`formattedAddress`]}),r(N(a,t)),b.current=null,y([]),l(-1),h(!1)}catch{y([]),l(-1)}};return E(`fieldset`,{"aria-describedby":n?t:void 0,"aria-invalid":n?`true`:void 0,className:`lockerverse-signup__address`,children:[T(`legend`,{children:`Address`}),E(`label`,{htmlFor:`${o}-line1`,children:[T(`span`,{children:`Street address`}),E(`div`,{className:`lockerverse-signup__address-search`,children:[T(`input`,{"aria-activedescendant":c>=0?`${o}-suggestion-${c}`:void 0,"aria-autocomplete":`list`,"aria-controls":s,"aria-describedby":n?t:void 0,"aria-expanded":f&&v.length>0,"aria-invalid":n?`true`:void 0,autoComplete:`street-address`,id:`${o}-line1`,name:`address.line1`,onBlur:()=>window.setTimeout(()=>h(!1),120),onChange:e=>x({line1:e.currentTarget.value}),onFocus:()=>h(!0),onKeyDown:e=>{if(e.key===`Escape`){e.preventDefault(),y([]),l(-1);return}if(v.length===0)return;if(e.key===`ArrowDown`){e.preventDefault(),l(e=>e<v.length-1?e+1:0);return}if(e.key===`ArrowUp`){e.preventDefault(),l(e=>e>0?e-1:v.length-1);return}let t=v[c];e.key===`Enter`&&t&&(e.preventDefault(),S(t).catch(()=>void 0))},required:i,role:`combobox`,value:a.line1}),g?T(`span`,{className:`lockerverse-signup__address-loading`,children:`Searching…`}):null,v.length>0?T(`div`,{className:`lockerverse-signup__address-suggestions`,id:s,role:`listbox`,children:v.map((e,t)=>E(`button`,{"aria-selected":c===t,id:`${o}-suggestion-${t}`,onMouseDown:t=>{t.preventDefault(),S(e).catch(()=>void 0)},role:`option`,type:`button`,children:[T(`strong`,{children:e.label}),e.secondaryLabel?T(`span`,{children:e.secondaryLabel}):null]},e.id))}):null]})]}),E(`label`,{htmlFor:`${o}-line2`,children:[T(`span`,{children:`Apartment, suite, or unit`}),T(`input`,{autoComplete:`address-line2`,id:`${o}-line2`,onChange:e=>x({line2:e.currentTarget.value}),placeholder:`Optional`,value:a.line2??``})]}),E(`div`,{className:`lockerverse-signup__address-row`,children:[E(`label`,{htmlFor:`${o}-city`,children:[T(`span`,{children:`City`}),T(`input`,{autoComplete:`address-level2`,id:`${o}-city`,onChange:e=>x({city:e.currentTarget.value}),required:i,value:a.city})]}),E(`label`,{htmlFor:`${o}-state`,children:[T(`span`,{children:`State`}),T(`input`,{autoComplete:`address-level1`,id:`${o}-state`,onChange:e=>x({state:e.currentTarget.value}),required:i,value:a.state})]})]}),E(`div`,{className:`lockerverse-signup__address-row`,children:[E(`label`,{htmlFor:`${o}-postal`,children:[T(`span`,{children:`Postal code`}),T(`input`,{autoComplete:`postal-code`,id:`${o}-postal`,onChange:e=>x({postalCode:e.currentTarget.value}),required:i,value:a.postalCode})]}),E(`label`,{htmlFor:`${o}-country`,children:[T(`span`,{children:`Country`}),T(`input`,{autoComplete:`country`,id:`${o}-country`,maxLength:2,onChange:e=>x({country:e.currentTarget.value.toUpperCase()}),required:i,value:a.country})]})]})]})}const F=/^[1-9]\d*$/,I=/^(?:$|[1-9]\d*)$/,L=y(S(),w(),g(`Name is required.`)),R=y(S(),w(),b(I,`Guest count must be a positive whole number.`),C(e=>e?Number(e):null),h(e=>e===null||Number.isSafeInteger(e),`Guest count must be a positive whole number.`)),z=y(S(),w(),g(`Guest count is required.`),b(F,`Guest count must be a positive whole number.`),C(Number),h(e=>Number.isSafeInteger(e),`Guest count must be a positive whole number.`)),B=v({city:S(),country:S(),line1:S(),line2:_(S()),postalCode:S(),state:S()}),V=y(B,h(W,`Complete the address.`)),H=y(B,h(e=>U(e)||W(e),`Complete the address or leave it blank.`));function U(e){return![e.city,e.line1,e.line2,e.postalCode,e.state].some(e=>e?.trim())}function W(e){return[e.city,e.country,e.line1,e.postalCode,e.state].every(e=>e.trim())}function te(t,n){let o=v({address:t.fields.address.required?V:H,email:t.fields.email.required?r:a,name:L,participantCount:t.fields.participantCount.required?z:R,phone:t.fields.phone.required?e:s}),c=x(o,n),l=i(t.customFields,n.customFields);if(!c.success)for(let e of c.issues){let t=e.path?.[0]?.key;typeof t==`string`&&!l[t]&&(l[t]=e.message)}return c.success?{errors:l,value:{...n,...c.output}}:{errors:l,value:null}}const G={city:``,country:`US`,line1:``,line2:``,postalCode:``,state:``};function ne(e){return{address:G,customFields:t(e.customFields),email:``,honeypot:``,name:``,participantCount:``,phone:``}}function K({error:e,id:t}){return e?T(`span`,{className:`lockerverse-signup__field-error`,id:t,role:`alert`,children:e}):null}function q(e,t){let n=e.elements.namedItem(t);if(n instanceof HTMLElement)return!n.matches(`:disabled`)&&(n.focus(),!0);if(n instanceof RadioNodeList){let e=Array.from(n).find(e=>e instanceof HTMLElement&&!e.matches(`:disabled`));return e?.focus(),!!e}return!1}function re(e,t){let n=[[`name`,`name`],[`email`,`email`],[`phone`,`phone`],[`participantCount`,`participantCount`],[`address`,`address.line1`]];for(let[r,i]of n)if(t[r]&&q(e,i))return;let r=new Set(n.map(([e])=>e)),i=Object.keys(t).find(e=>!r.has(e));i&&q(e,`custom:${i}`)}function J(){return E(`section`,{"aria-busy":`true`,className:`lockerverse-signup lockerverse-signup__status`,children:[T(`span`,{className:`lockerverse-signup__spinner`}),T(`p`,{children:`Loading signup…`})]})}function ie({message:e,onRetry:t}){return E(`section`,{className:`lockerverse-signup lockerverse-signup__status`,children:[T(`h1`,{children:`Signup unavailable`}),T(`p`,{role:`alert`,children:e}),T(`button`,{onClick:t,type:`button`,children:`Retry`})]})}function Y(e){let{apiBaseUrl:t,branding:r,className:i,communitySlug:a,environment:s,fetch:h,googlePlacesApiKey:g,onError:_,onSignupComplete:v,requestTimeoutMs:y,sentryDsn:b,signupSlug:x,style:S,theme:C=`dark`,...w}=e,D=d(),O=p(_);O.current=_;let k=f(()=>ee({apiBaseUrl:t,communitySlug:a,environment:s,fetch:h,onError:e=>O.current?.(e),requestTimeoutMs:y,sentryDsn:b,signupSlug:x}),[t,a,s,h,y,b,x]),A=p(k);A.current=k;let j=p(!0),M=p(!1),[N,F]=m(0),[I,L]=m({phase:`loading`}),[R,z]=m(null),[B,V]=m({}),[H,W]=m();u(()=>(j.current=!0,()=>{j.current=!1}),[]),u(()=>{let e=!0;return M.current=!1,L({phase:`loading`}),z(null),V({}),W(void 0),k.load().then(t=>{e&&(z(ne(t)),L({phase:`ready`,signup:t}))},t=>{e&&L({error:t,phase:`load_error`})}),()=>{e=!1}},[k,N]);let G=`signup`in I?I.signup:null;if(I.phase===`loading`||G&&!R)return T(J,{});if(I.phase===`load_error`)return T(ie,{message:I.error.message,onRetry:()=>F(e=>e+1)});if(!(G&&R))return T(J,{});let q=n(r?.accentColor??`#5751f2`),Y={"--lockerverse-signup-accent":q,"--lockerverse-signup-accent-contrast":l(q),...S};if(!G.isActive)return E(`section`,{...w,className:[`lockerverse-signup`,`lockerverse-signup__status`,i].filter(Boolean).join(` `),"data-lockerverse-theme":C,style:Y,children:[T(`h1`,{children:`Signup closed`}),T(`p`,{children:`This signup is not accepting submissions.`})]});if(I.phase===`submitted`)return E(`section`,{...w,className:[`lockerverse-signup`,`lockerverse-signup__status`,i].filter(Boolean).join(` `),"data-lockerverse-theme":C,style:Y,children:[r?T(X,{branding:r}):null,T(`span`,{"aria-hidden":`true`,className:`lockerverse-signup__success`,children:`✓`}),T(`h1`,{children:`Thank you`}),T(`p`,{children:`Your signup has been received.`})]});let Z=e=>z({...R,...e}),Q=I.phase===`submitting`,$=I.phase===`submit_error`?I.error.message:void 0,ae=async e=>{if(e.preventDefault(),M.current)return;let t=te(G,R);if(V(t.errors),Object.keys(t.errors).length>0||!t.value){let n=e.currentTarget;queueMicrotask(()=>re(n,t.errors));return}let n=t.value,r={address:G.fields.address.enabled&&!U(n.address)?n.address:null,answers:c(G.customFields,n.customFields),email:G.fields.email.enabled&&n.email||null,honeypot:n.honeypot,name:n.name,participantCount:G.fields.participantCount.enabled?n.participantCount:null,phone:G.fields.phone.enabled&&n.phone||null},i=JSON.stringify(r),a=H?.payloadKey===i?H.reference:globalThis.crypto.randomUUID(),o;M.current=!0,L({phase:`submitting`,signup:G});try{o=await k.submit(r,{submissionReference:a})}catch(e){if(!(j.current&&A.current===k))return;let t=e;L({error:t,phase:`submit_error`,signup:G}),t.recoveryRecommended?W({payloadKey:i,reference:a}):W(void 0);return}finally{M.current=!1}j.current&&A.current===k&&(W(void 0),L({phase:`submitted`,signup:G,submission:o}),v?.(o))};return E(`section`,{...w,className:[`lockerverse-signup`,i].filter(Boolean).join(` `),"data-lockerverse-theme":C,style:Y,children:[G.coverImageUrl?T(`img`,{alt:``,className:`lockerverse-signup__cover`,height:192,src:G.coverImageUrl,width:440}):null,r?T(X,{branding:r}):null,E(`header`,{children:[G.title?.trim()?T(`h1`,{children:G.title}):null,G.description?T(`p`,{children:G.description}):null]}),E(`form`,{noValidate:!0,onSubmit:ae,children:[T(`input`,{"aria-hidden":`true`,autoComplete:`off`,className:`lockerverse-signup__honeypot`,onChange:e=>Z({honeypot:e.currentTarget.value}),tabIndex:-1,value:R.honeypot}),E(`div`,{className:`lockerverse-signup__fields`,children:[E(`label`,{htmlFor:`${D}-name`,children:[T(`span`,{children:`Name`}),T(`input`,{"aria-describedby":B.name?`${D}-name-error`:void 0,"aria-invalid":B.name?`true`:void 0,autoComplete:`name`,id:`${D}-name`,name:`name`,onChange:e=>Z({name:e.currentTarget.value}),required:!0,value:R.name}),T(K,{error:B.name,id:`${D}-name-error`})]}),G.fields.email.enabled?E(`label`,{htmlFor:`${D}-email`,children:[T(`span`,{children:`Email`}),T(`input`,{"aria-describedby":B.email?`${D}-email-error`:void 0,"aria-invalid":B.email?`true`:void 0,autoComplete:`email`,id:`${D}-email`,name:`email`,onChange:e=>Z({email:e.currentTarget.value}),required:G.fields.email.required,type:`email`,value:R.email}),T(K,{error:B.email,id:`${D}-email-error`})]}):null,G.fields.phone.enabled?E(`label`,{htmlFor:`${D}-phone`,children:[T(`span`,{children:`Phone`}),T(`input`,{"aria-describedby":B.phone?`${D}-phone-error`:void 0,"aria-invalid":B.phone?`true`:void 0,autoComplete:`tel`,id:`${D}-phone`,name:`phone`,onChange:e=>Z({phone:e.currentTarget.value}),placeholder:`+1 555 555 0123`,required:G.fields.phone.required,type:`tel`,value:R.phone}),T(K,{error:B.phone,id:`${D}-phone-error`})]}):null,G.fields.participantCount.enabled?E(`label`,{htmlFor:`${D}-participant-count`,children:[T(`span`,{children:`Guest count`}),T(`input`,{"aria-describedby":B.participantCount?`${D}-participant-count-error`:void 0,"aria-invalid":B.participantCount?`true`:void 0,id:`${D}-participant-count`,min:1,name:`participantCount`,onChange:e=>Z({participantCount:e.currentTarget.value}),required:G.fields.participantCount.required,type:`number`,value:R.participantCount}),T(K,{error:B.participantCount,id:`${D}-participant-count-error`})]}):null,G.fields.address.enabled?E(`div`,{className:`lockerverse-signup__field-group`,children:[T(P,{apiKey:g,errorId:B.address?`${D}-address-error`:void 0,invalid:!!B.address,onChange:e=>Z({address:e}),required:G.fields.address.required,value:R.address}),T(K,{error:B.address,id:`${D}-address-error`})]}):null,T(o,{choiceClassName:`lockerverse-signup__choice`,errorClassName:`lockerverse-signup__field-error`,errors:B,fields:G.customFields,idPrefix:D,onChange:e=>Z({customFields:e}),values:R.customFields})]}),$?E(`p`,{className:`lockerverse-signup__submit-error`,role:`alert`,children:[$,` Try again.`]}):null,T(`button`,{className:`lockerverse-signup__submit`,disabled:Q,type:`submit`,children:Q?`Submitting…`:`Submit`})]})]})}function X({branding:e}){return E(`div`,{className:`lockerverse-signup__branding`,children:[e.imageUrl?T(`img`,{alt:``,height:48,src:e.imageUrl,width:48}):null,T(`strong`,{children:e.name})]})}export{Y as LockerverseSignup};
|
|
2
2
|
//# sourceMappingURL=signup.js.map
|
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"],"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 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 () => unknown;\n AutocompleteSuggestion: {\n fetchAutocompleteSuggestions: (options: {\n input: string;\n includedPrimaryTypes: string[];\n includedRegionCodes: string[];\n region: string;\n sessionToken: unknown;\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<unknown>;\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 = window as GoogleMapsWindow;\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(() => googleWindow.google?.maps?.importLibrary?.(libraryName))\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 = window as GoogleMapsWindow;\n return (await googleWindow.google?.maps?.importLibrary?.(\n \"places\"\n )) as GooglePlacesLibrary;\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 sessionToken = useRef<unknown>(null);\n\n useEffect(() => {\n const query = value.line1.trim();\n setActiveSuggestionIndex(-1);\n if (!(apiKey && focused && query.length >= 3)) {\n setSuggestions([]);\n return;\n }\n let current = true;\n const timeout = window.setTimeout(async () => {\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 (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 (current) {\n setSuggestions([]);\n }\n } finally {\n if (current) {\n setLoading(false);\n }\n }\n }, 250);\n return () => {\n current = false;\n window.clearTimeout(timeout);\n };\n }, [apiKey, focused, value.line1]);\n\n const update = (patch: Partial<SignupAddressValues>) =>\n onChange({ ...value, ...patch });\n\n const selectSuggestion = async (suggestion: AddressSuggestion) => {\n const place = suggestion.prediction.toPlace();\n try {\n await place.fetchFields({\n fields: [\"addressComponents\", \"formattedAddress\"],\n });\n onChange(parseAddress(value, place));\n sessionToken.current = null;\n setSuggestions([]);\n setActiveSuggestionIndex(-1);\n setFocused(false);\n } catch {\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 { validateCustomFields } 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: Record<string, string | string[]>;\n email: string;\n honeypot: string;\n name: string;\n participantCount: string;\n phone: 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 addressShape = 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 addressShape,\n check(isAddressComplete, \"Complete the address.\")\n);\nconst optionalAddressSchema = pipe(\n addressShape,\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\nexport function validateSignupForm(\n signup: LockerverseSignup,\n values: SignupFormValues\n) {\n const schema = object({\n address: signup.fields.address.required\n ? requiredAddressSchema\n : optionalAddressSchema,\n email: signup.fields.email.required\n ? requiredEmailSchema\n : optionalEmailSchema,\n name: nameSchema,\n participantCount: signup.fields.participantCount.required\n ? requiredParticipantCountSchema\n : optionalParticipantCountSchema,\n phone: signup.fields.phone.required\n ? requiredPhoneSchema\n : optionalPhoneSchema,\n });\n const result = safeParse(schema, values);\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 if (typeof field === \"string\" && !errors[field]) {\n errors[field] = issue.message;\n }\n }\n }\n return result.success\n ? { errors, value: { ...values, ...result.output } }\n : { errors, value: null };\n}\n","import {\n type CreateLockerverseSignupOptions,\n createLockerverseSignupClient,\n type LockerverseSdkError,\n type LockerverseSignup as LockerverseSignupDefinition,\n type LockerverseSignupSubmissionResult,\n} from \"@lockerverse/sdk/signup\";\nimport {\n type FormEvent,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { getAccentContrast } from \"./accent-contrast.ts\";\nimport {\n buildCustomFieldAnswers,\n CustomFields,\n createCustomFieldValues,\n} from \"./custom-fields.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 };\n}\n\nfunction FieldError({ error, id }: { error: string | undefined; id: string }) {\n return error ? (\n <span className=\"lockerverse-signup__field-error\" id={id} role=\"alert\">\n {error}\n </span>\n ) : null;\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\nfunction Loading() {\n return (\n <section\n aria-busy=\"true\"\n className=\"lockerverse-signup lockerverse-signup__status\"\n >\n <span className=\"lockerverse-signup__spinner\" />\n <p>Loading signup…</p>\n </section>\n );\n}\n\nfunction LoadError({\n message,\n onRetry,\n}: {\n message: string;\n onRetry: () => void;\n}) {\n return (\n <section className=\"lockerverse-signup lockerverse-signup__status\">\n <h1>Signup unavailable</h1>\n <p role=\"alert\">{message}</p>\n <button onClick={onRetry} type=\"button\">\n Retry\n </button>\n </section>\n );\n}\n\ntype SignupWorkflowState =\n | { phase: \"loading\" }\n | { error: LockerverseSdkError; phase: \"load_error\" }\n | { phase: \"ready\"; signup: LockerverseSignupDefinition }\n | { phase: \"submitting\"; signup: LockerverseSignupDefinition }\n | {\n error: LockerverseSdkError;\n phase: \"submit_error\";\n signup: LockerverseSignupDefinition;\n }\n | {\n phase: \"submitted\";\n signup: LockerverseSignupDefinition;\n submission: LockerverseSignupSubmissionResult;\n };\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: The component renders server-defined field branches in one public form boundary.\nexport function LockerverseSignup(props: LockerverseSignupProps) {\n const {\n apiBaseUrl,\n branding,\n className,\n communitySlug,\n environment,\n fetch,\n googlePlacesApiKey,\n onError,\n onSignupComplete,\n requestTimeoutMs,\n sentryDsn,\n signupSlug,\n style,\n theme = \"dark\",\n ...sectionProps\n } = props;\n const idPrefix = useId();\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const client = useMemo(\n () =>\n createLockerverseSignupClient({\n apiBaseUrl,\n communitySlug,\n environment,\n fetch,\n onError: (error) => onErrorRef.current?.(error),\n requestTimeoutMs,\n sentryDsn,\n signupSlug,\n } as CreateLockerverseSignupOptions),\n [\n apiBaseUrl,\n communitySlug,\n environment,\n fetch,\n requestTimeoutMs,\n sentryDsn,\n signupSlug,\n ]\n );\n const clientRef = useRef(client);\n clientRef.current = client;\n const mountedRef = useRef(true);\n const submittingRef = useRef(false);\n const [loadAttempt, setLoadAttempt] = useState(0);\n const [state, setState] = useState<SignupWorkflowState>({\n phase: \"loading\",\n });\n const [values, setValues] = useState<FormValues | null>(null);\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 let active = true;\n submittingRef.current = false;\n setState({ phase: \"loading\" });\n setValues(null);\n setErrors({});\n setSubmissionRetry(undefined);\n client.load().then(\n (loadedSignup) => {\n if (active) {\n setValues(createInitialValues(loadedSignup));\n setState({ phase: \"ready\", signup: loadedSignup });\n }\n },\n (error: LockerverseSdkError) => {\n if (active) {\n setState({ error, phase: \"load_error\" });\n }\n }\n );\n return () => {\n active = false;\n };\n }, [client, loadAttempt]);\n\n const signup = \"signup\" in state ? state.signup : null;\n\n if (state.phase === \"loading\" || (signup && !values)) {\n return <Loading />;\n }\n if (state.phase === \"load_error\") {\n return (\n <LoadError\n message={state.error.message}\n onRetry={() => setLoadAttempt((attempt) => attempt + 1)}\n />\n );\n }\n if (!(signup && values)) {\n return <Loading />;\n }\n\n const accent = branding?.accentColor ?? DEFAULT_ACCENT;\n const signupStyle = {\n \"--lockerverse-signup-accent\": accent,\n \"--lockerverse-signup-accent-contrast\": getAccentContrast(accent),\n ...style,\n } as React.CSSProperties;\n\n if (!signup.isActive) {\n return (\n <section\n {...sectionProps}\n className={[\n \"lockerverse-signup\",\n \"lockerverse-signup__status\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={signupStyle}\n >\n <h1>Signup closed</h1>\n <p>This signup is not accepting submissions.</p>\n </section>\n );\n }\n\n if (state.phase === \"submitted\") {\n return (\n <section\n {...sectionProps}\n className={[\n \"lockerverse-signup\",\n \"lockerverse-signup__status\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={signupStyle}\n >\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 </section>\n );\n }\n\n const update = (patch: Partial<FormValues>) =>\n setValues({ ...values, ...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, values);\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\", signup });\n try {\n result = await client.submit(submission, { submissionReference });\n } catch (error) {\n if (!(mountedRef.current && clientRef.current === client)) {\n return;\n }\n const sdkError = error as LockerverseSdkError;\n setState({ error: sdkError, phase: \"submit_error\", signup });\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 && clientRef.current === client)) {\n return;\n }\n setSubmissionRetry(undefined);\n setState({ phase: \"submitted\", signup, submission: result });\n onSignupComplete?.(result);\n };\n\n return (\n <section\n {...sectionProps}\n className={[\"lockerverse-signup\", className].filter(Boolean).join(\" \")}\n data-lockerverse-theme={theme}\n style={signupStyle}\n >\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 <label htmlFor={`${idPrefix}-email`}>\n <span>Email</span>\n <input\n aria-describedby={\n errors.email ? `${idPrefix}-email-error` : undefined\n }\n aria-invalid={errors.email ? \"true\" : undefined}\n autoComplete=\"email\"\n id={`${idPrefix}-email`}\n name=\"email\"\n onChange={(event) =>\n update({ email: event.currentTarget.value })\n }\n required={signup.fields.email.required}\n type=\"email\"\n value={values.email}\n />\n <FieldError error={errors.email} id={`${idPrefix}-email-error`} />\n </label>\n ) : null}\n {signup.fields.phone.enabled ? (\n <label htmlFor={`${idPrefix}-phone`}>\n <span>Phone</span>\n <input\n aria-describedby={\n errors.phone ? `${idPrefix}-phone-error` : undefined\n }\n aria-invalid={errors.phone ? \"true\" : undefined}\n autoComplete=\"tel\"\n id={`${idPrefix}-phone`}\n name=\"phone\"\n onChange={(event) =>\n update({ phone: event.currentTarget.value })\n }\n placeholder=\"+1 555 555 0123\"\n required={signup.fields.phone.required}\n type=\"tel\"\n value={values.phone}\n />\n <FieldError error={errors.phone} id={`${idPrefix}-phone-error`} />\n </label>\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 </section>\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"],"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"],"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 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 () => unknown;\n AutocompleteSuggestion: {\n fetchAutocompleteSuggestions: (options: {\n input: string;\n includedPrimaryTypes: string[];\n includedRegionCodes: string[];\n region: string;\n sessionToken: unknown;\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<unknown>;\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 = window as GoogleMapsWindow;\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(() => googleWindow.google?.maps?.importLibrary?.(libraryName))\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 = window as GoogleMapsWindow;\n return (await googleWindow.google?.maps?.importLibrary?.(\n \"places\"\n )) as GooglePlacesLibrary;\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 sessionToken = useRef<unknown>(null);\n\n useEffect(() => {\n const query = value.line1.trim();\n setActiveSuggestionIndex(-1);\n if (!(apiKey && focused && query.length >= 3)) {\n setSuggestions([]);\n return;\n }\n let current = true;\n const timeout = window.setTimeout(async () => {\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 (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 (current) {\n setSuggestions([]);\n }\n } finally {\n if (current) {\n setLoading(false);\n }\n }\n }, 250);\n return () => {\n current = false;\n window.clearTimeout(timeout);\n };\n }, [apiKey, focused, value.line1]);\n\n const update = (patch: Partial<SignupAddressValues>) =>\n onChange({ ...value, ...patch });\n\n const selectSuggestion = async (suggestion: AddressSuggestion) => {\n const place = suggestion.prediction.toPlace();\n try {\n await place.fetchFields({\n fields: [\"addressComponents\", \"formattedAddress\"],\n });\n onChange(parseAddress(value, place));\n sessionToken.current = null;\n setSuggestions([]);\n setActiveSuggestionIndex(-1);\n setFocused(false);\n } catch {\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 { validateCustomFields } 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: Record<string, string | string[]>;\n email: string;\n honeypot: string;\n name: string;\n participantCount: string;\n phone: 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 addressShape = 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 addressShape,\n check(isAddressComplete, \"Complete the address.\")\n);\nconst optionalAddressSchema = pipe(\n addressShape,\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\nexport function validateSignupForm(\n signup: LockerverseSignup,\n values: SignupFormValues\n) {\n const schema = object({\n address: signup.fields.address.required\n ? requiredAddressSchema\n : optionalAddressSchema,\n email: signup.fields.email.required\n ? requiredEmailSchema\n : optionalEmailSchema,\n name: nameSchema,\n participantCount: signup.fields.participantCount.required\n ? requiredParticipantCountSchema\n : optionalParticipantCountSchema,\n phone: signup.fields.phone.required\n ? requiredPhoneSchema\n : optionalPhoneSchema,\n });\n const result = safeParse(schema, values);\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 if (typeof field === \"string\" && !errors[field]) {\n errors[field] = issue.message;\n }\n }\n }\n return result.success\n ? { errors, value: { ...values, ...result.output } }\n : { errors, value: null };\n}\n","import {\n type CreateLockerverseSignupOptions,\n createLockerverseSignupClient,\n type LockerverseSdkError,\n type LockerverseSignup as LockerverseSignupDefinition,\n type LockerverseSignupSubmissionResult,\n} from \"@lockerverse/sdk/signup\";\nimport {\n type FormEvent,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { getAccentContrast, normalizeAccentColor } from \"./accent-contrast.ts\";\nimport {\n buildCustomFieldAnswers,\n CustomFields,\n createCustomFieldValues,\n} from \"./custom-fields.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 };\n}\n\nfunction FieldError({ error, id }: { error: string | undefined; id: string }) {\n return error ? (\n <span className=\"lockerverse-signup__field-error\" id={id} role=\"alert\">\n {error}\n </span>\n ) : null;\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\nfunction Loading() {\n return (\n <section\n aria-busy=\"true\"\n className=\"lockerverse-signup lockerverse-signup__status\"\n >\n <span className=\"lockerverse-signup__spinner\" />\n <p>Loading signup…</p>\n </section>\n );\n}\n\nfunction LoadError({\n message,\n onRetry,\n}: {\n message: string;\n onRetry: () => void;\n}) {\n return (\n <section className=\"lockerverse-signup lockerverse-signup__status\">\n <h1>Signup unavailable</h1>\n <p role=\"alert\">{message}</p>\n <button onClick={onRetry} type=\"button\">\n Retry\n </button>\n </section>\n );\n}\n\ntype SignupWorkflowState =\n | { phase: \"loading\" }\n | { error: LockerverseSdkError; phase: \"load_error\" }\n | { phase: \"ready\"; signup: LockerverseSignupDefinition }\n | { phase: \"submitting\"; signup: LockerverseSignupDefinition }\n | {\n error: LockerverseSdkError;\n phase: \"submit_error\";\n signup: LockerverseSignupDefinition;\n }\n | {\n phase: \"submitted\";\n signup: LockerverseSignupDefinition;\n submission: LockerverseSignupSubmissionResult;\n };\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: The component renders server-defined field branches in one public form boundary.\nexport function LockerverseSignup(props: LockerverseSignupProps) {\n const {\n apiBaseUrl,\n branding,\n className,\n communitySlug,\n environment,\n fetch,\n googlePlacesApiKey,\n onError,\n onSignupComplete,\n requestTimeoutMs,\n sentryDsn,\n signupSlug,\n style,\n theme = \"dark\",\n ...sectionProps\n } = props;\n const idPrefix = useId();\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const client = useMemo(\n () =>\n createLockerverseSignupClient({\n apiBaseUrl,\n communitySlug,\n environment,\n fetch,\n onError: (error) => onErrorRef.current?.(error),\n requestTimeoutMs,\n sentryDsn,\n signupSlug,\n } as CreateLockerverseSignupOptions),\n [\n apiBaseUrl,\n communitySlug,\n environment,\n fetch,\n requestTimeoutMs,\n sentryDsn,\n signupSlug,\n ]\n );\n const clientRef = useRef(client);\n clientRef.current = client;\n const mountedRef = useRef(true);\n const submittingRef = useRef(false);\n const [loadAttempt, setLoadAttempt] = useState(0);\n const [state, setState] = useState<SignupWorkflowState>({\n phase: \"loading\",\n });\n const [values, setValues] = useState<FormValues | null>(null);\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 let active = true;\n submittingRef.current = false;\n setState({ phase: \"loading\" });\n setValues(null);\n setErrors({});\n setSubmissionRetry(undefined);\n client.load().then(\n (loadedSignup) => {\n if (active) {\n setValues(createInitialValues(loadedSignup));\n setState({ phase: \"ready\", signup: loadedSignup });\n }\n },\n (error: LockerverseSdkError) => {\n if (active) {\n setState({ error, phase: \"load_error\" });\n }\n }\n );\n return () => {\n active = false;\n };\n }, [client, loadAttempt]);\n\n const signup = \"signup\" in state ? state.signup : null;\n\n if (state.phase === \"loading\" || (signup && !values)) {\n return <Loading />;\n }\n if (state.phase === \"load_error\") {\n return (\n <LoadError\n message={state.error.message}\n onRetry={() => setLoadAttempt((attempt) => attempt + 1)}\n />\n );\n }\n if (!(signup && values)) {\n return <Loading />;\n }\n\n const accent = normalizeAccentColor(branding?.accentColor ?? DEFAULT_ACCENT);\n const signupStyle = {\n \"--lockerverse-signup-accent\": accent,\n \"--lockerverse-signup-accent-contrast\": getAccentContrast(accent),\n ...style,\n } as React.CSSProperties;\n\n if (!signup.isActive) {\n return (\n <section\n {...sectionProps}\n className={[\n \"lockerverse-signup\",\n \"lockerverse-signup__status\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={signupStyle}\n >\n <h1>Signup closed</h1>\n <p>This signup is not accepting submissions.</p>\n </section>\n );\n }\n\n if (state.phase === \"submitted\") {\n return (\n <section\n {...sectionProps}\n className={[\n \"lockerverse-signup\",\n \"lockerverse-signup__status\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={signupStyle}\n >\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 </section>\n );\n }\n\n const update = (patch: Partial<FormValues>) =>\n setValues({ ...values, ...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, values);\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\", signup });\n try {\n result = await client.submit(submission, { submissionReference });\n } catch (error) {\n if (!(mountedRef.current && clientRef.current === client)) {\n return;\n }\n const sdkError = error as LockerverseSdkError;\n setState({ error: sdkError, phase: \"submit_error\", signup });\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 && clientRef.current === client)) {\n return;\n }\n setSubmissionRetry(undefined);\n setState({ phase: \"submitted\", signup, submission: result });\n onSignupComplete?.(result);\n };\n\n return (\n <section\n {...sectionProps}\n className={[\"lockerverse-signup\", className].filter(Boolean).join(\" \")}\n data-lockerverse-theme={theme}\n style={signupStyle}\n >\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 <label htmlFor={`${idPrefix}-email`}>\n <span>Email</span>\n <input\n aria-describedby={\n errors.email ? `${idPrefix}-email-error` : undefined\n }\n aria-invalid={errors.email ? \"true\" : undefined}\n autoComplete=\"email\"\n id={`${idPrefix}-email`}\n name=\"email\"\n onChange={(event) =>\n update({ email: event.currentTarget.value })\n }\n required={signup.fields.email.required}\n type=\"email\"\n value={values.email}\n />\n <FieldError error={errors.email} id={`${idPrefix}-email-error`} />\n </label>\n ) : null}\n {signup.fields.phone.enabled ? (\n <label htmlFor={`${idPrefix}-phone`}>\n <span>Phone</span>\n <input\n aria-describedby={\n errors.phone ? `${idPrefix}-phone-error` : undefined\n }\n aria-invalid={errors.phone ? \"true\" : undefined}\n autoComplete=\"tel\"\n id={`${idPrefix}-phone`}\n name=\"phone\"\n onChange={(event) =>\n update({ phone: event.currentTarget.value })\n }\n placeholder=\"+1 555 555 0123\"\n required={signup.fields.phone.required}\n type=\"tel\"\n value={values.phone}\n />\n <FieldError error={errors.phone} id={`${idPrefix}-phone-error`} />\n </label>\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 </section>\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"],"mappings":"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"}
|