{"version":3,"sources":["locale/I18n.js","redux/modules/user.js","locale/languages/de.js","locale/languages/en.js","locale/languages/es.js","locale/languages/fr.js","locale/languages/it.js","locale/languages/pt.js","locale/languages/zh.js","env.js","redux/modules/tunnels.js","util/Context.js","components/Layout.js","components/misc/error/SystemError.js","components/misc/loading/Loading.js","util/UserInfo.js","components/misc/KioskWrapper.js","components/buttons/StartOverButton.js","components/Heading.js","components/misc/TimeoutModal.js","components/Confirmation.js","components/buttons/GoBackButton.js","components/fields/Field.js","components/fields/RadioButton.js","components/minors/FlyingPerson.js","components/minors/FlyingPeople.js","util/StringUtil.js","components/fields/FieldError.js","components/waiver/ClickToInitial.js","components/waiver/PopupIf.js","components/waiver/ReplaceWithMinors.js","components/waiver/ShowIfMinors.js","components/waiver/ShowIf.js","components/waiver/YesNo.js","util/Transformer.js","components/Link.js","util/WaiverTransformer.js","util/DomUtil.js","components/minors/MinorWaiver.js","util/DateUtil.js","components/fields/Birthdate.js","components/minors/MinorDetail.js","components/minors/Minor.js","components/misc/WarnOnUnload.js","components/Flyers.js","util/Constants.js","redux/modules/languages.js","components/common/Svg.js","components/KioskStartPage.js","components/TunnelSelector.js","util/StatesByCountry.js","components/fields/AutocompleteField.js","components/UserAddDetailsForm.js","components/fields/PhoneInput.js","components/UserLookupForm.js","components/WaiverSignaturePad.js","components/WaiverForm.js","components/Waiver.js","test/Test.js","Routes.js","App.js","redux/reducers.js","redux/sagas.js","redux/create.js","serviceWorker.js","webpack:///./src/index.js?b635","redux/modules/waiver.js"],"names":["addBundle","de","en","es","fr","it","pt","zh","waiverSourceKey","waiverSource","SOURCE_KIOSK","SOURCE_KIOSK_TUNNEL_OVERRIDE","SOURCE_WEB","Module","createModule","name","actions","addUserDetails","dispatch","clearUserDetails","reducer","requestUserLookup","loadingUserLookup","successUserLookup","failureUserLookup","loadingMinors","successMinors","failureMinors","clearState","replacementReducer","updateState","updateReservationUser","UserSaga","all","takeLatest","constants","clearDetails","lookupUser","put","data","undefined","details","select","selector","default","state","Object","values","forEach","value","hasOwnProperty","error","action","userId","id","minors","isLoading","call","axios","get","Qs","stringify","user","response","Waiver","reservationMinors","userMinors","map","length","reservationMinor","matchingUserMinor","find","userMinor","firstName","lastName","birthDay","birthMonth","birthYear","WaiverSaga","setMinors","message","query","appState","waiver","session","needsAddInfo","fetchMinors","email","$","code","buttons","addMinor","checkIn","clearSignature","close","continue","goBack","startOver","submit","labels","YES","NO","messages","birthDateRequired","systemError","welcome","startOverConfirm","blocker","initialsAccepted","invalidEmail","invalidDate","invalidPhone","enterCountryCode","noOptions","youMustInitial","youMustSign","mustBeAdult","mustBeMinor","tooYoungToFly","selectionRequired","valueRequired","Confirmation","title","subtitle","WEB","KIOSK","flyers","Timeout","stillHere","instructions","closeButton","TunnelSelector","placeholder","checkInHere","touchScreenToBegin","selectYourTunnel","selectYourLanguage","FlyersForm","isPersonFlying","noFlyers","optionFlying","optionNotFlying","enterMinorInformation","UserLookupForm","needBasicInformation","ifYouAreFlyingWithMinor","fields","birthday","UserDetailsForm","firstTimeFlying","needMoreInfo","address1","address2","city","zip","country","phone","WaiverForm","clickToInitial","pleaseSign","kiosk","prompt","choose_an_action","qrcode","new_waiver","keyboard","Environment","process","requestTunnels","loadingTunnels","successTunnels","failureTunnels","TunnelsSaga","fetchTunnels","UiContext","React","createContext","mode","isKiosk","tunnel","displayName","Layout","tunnels","isLoadingTunnels","cartContextValue","cartItems","cartLimit","addToCart","removeFromCart","viewCart","isAccountHidden","headerButton","onChangeLocation","tunnelCode","isFullWebPage","context","isIframe","this","props","className","Provider","toLowerCase","replace","children","Component","contextType","Tunnels","connect","SystemError","timeoutRef","backupSteps","history","timeout","window","setTimeout","clearErrors","go","clearTimeout","I18n","defaultProps","withRouter","Loading","getContainer","document","querySelector","ct","classList","add","remove","parseName","flyerDetail","split","parseDate","strict","result","Date","parseInt","setMonth","setFullYear","setDate","getFullYear","getMonth","getDate","Error","calculateAge","birthDate","today","age","m","KioskWrapper","StartOverButton","isOpen","defaultStartOver","evt","preventDefault","push","dismiss","setState","open","onStartOverConfirm","confirm","onStartOver","tabIndex","button","onClick","i18n","xmlns","viewBox","x1","y1","x2","y2","stroke","strokeWidth","strokeLinecap","strokeMiterlimit","onRequestClose","style","popupStyle","localize","content","top","left","right","bottom","marginRight","transform","overlay","backgroundColor","WELCOME","Heading","TimeoutModal","startTimeout","timeoutDelay","timedOut","triggerTimeout","dismissed","isEnabled","resetEvents","event","addEventListener","removeEventListener","onAfterOpen","onPrevious","path","location","getFlyers","index","key","createSelector","User","WaiverModule","GoBackButton","defaultGoBack","handleClick","disabled","onPress","type","classNames","Field","formik","form","defaultValue","setFieldValue","component","handleBlur","handleChange","createElement","field","onBlur","onChange","RadioButton","fieldProps","touched","errors","currentValue","checked","RADIO_BUTTON_SVG","fill","preserveAspectRatio","cx","cy","r","FlyingPerson","target","flyer","onSetFlying","isFlying","fieldName","generateFieldNameFor","FORM_VALUE_YES","required","FORM_VALUE_NO","PureComponent","FlyingPeople","getInitialValues","memoize","keys","JSON","parse","scrollTo","onAddMinor","onSubmit","initialValues","f","validate","StringUtil","concat","isEmpty","isNotBlank","isNotEmpty","trim","isNaN","parseFloat","FieldError","dirty","submitCount","fieldNames","myErrors","includes","myTouched","entries","ClickToInitial","hasSubmitted","val","isSubmitting","initials","ARROW_SVG","isBlank","d","PopupIf","fieldMatches","normalizeValue","ReplaceWithMinors","tagName","pastResponses","templateMinors","selectFlyingMinors","minor","responses","OneMinor","culture","defaultLanguageTag","template","html","templateData","options","readOnly","tokens","WaiverTransformer","buildTokens","transformer","preprocess","ReactHtmlParser","ShowIfMinors","ShowIf","showByDefault","trackMaybeOnValue","formValue","mapMaybeResponse","YesNo","changeCount","isMaybe","trackChanges","originalHandler","trackMaybe","prevState","idYes","idNo","TrackableField","v","_onChange","fieldValue","Transformer","transformImpl","node","by","recursive","filter","child","eval","findChildren","Fragment","transformChildren","convertNodeToElement","Link","href","attribs","passthrough","obj","transformDefault","dataWaiverFeature","dataWaiverField","dataWaiverValue","optionTrackMaybeOnValue","featureInitialToAccept","addInitials","featureReplaceWith","token","dataWaiverToken","replacement","featureReplaceWithMinors","featureSelectYesOrNo","featureShowConditional","hidden","class","featureShowConditionalPopup","addBlocker","featureShowIfMinors","console","warn","maybes","commentRegex","blockers","locale","franchiseCompanyName","date","toLocaleDateString","year","month","day","full_name","date_of_birth","franchise_company_name","scrollToError","header","headerOffset","offsetHeight","scrollBy","getBoundingClientRect","behavior","MinorWaiver","requestPastResponses","onCancel","mapApiResponsesToForm","noValidate","DateUtil","isNumeric","currentYear","providedYear","Birthdate","maskedValue","maskNonNumeric","autoAdvanceLengths","currentField","closest","nextField","getElementsByTagName","sort","a","b","shift","focus","autoFocus","dateFieldLocations","sampleDate","locales","sampleFormatted","formatDate","sampleDateParts","splitDate","findDatePart","determineDateFieldLocations","dateFields","Array","maxLength","max","data-input-type","dateStr","parts","part","i","segment","freeze","input","MinorDetail","birthDateOnly","isFourDigitYear","requiredField","data-kiosk-auto-capitalize","formId","Minor","handleMinorDetail","other","detailsSubmitted","handleMinorWaiver","onComplete","handleWaiverCancel","rewaiver","birthDateMissing","isBirthDateMissing","handleUnload","returnValue","WarnOnUnload","Flyers","addingMinor","setFlying","setIsFlying","handleMinorCancel","defaultHandler","isNewMinor","externalSourceId","queueReservationMinor","queueRewaiver","completeWaivers","handleSubmit","isNewWaiverRequired","isExpired","minorToRewaiver","language","requestTemplateMinors","minorsIsLoading","waiverError","getParticipants","requestLanguages","loadingLanguages","successLanguages","failureLanguages","LanguagesSaga","fetchLanguages","Svg","memo","i18n_sign_waiver","attr","role","version","width","height","x","y","logoSvg","signatureSvg","StartPage","onClickLanguage","setLanguage","enterKiosk","languageLabels","host","hostname","desktopUrl","iFlyUpperCase","size","renderAs","languages","selected","flagUrlRoot","flags","extractLanguage","handleSelectLanguage","selection","handleSelectTunnel","setTunnel","waiverPath","setLocale","extractedLanguage","selectedTunnel","t","url","Image","src","defaultLanguage","contextTunnel","TunnelSelect","LanguageSelect","Languages","label","styles","option","backgroundImage","paddingLeft","backgroundPositionX","backgroundPositionY","backgroundRepeat","backgroundSize","classNamePrefix","menuPortalTarget","body","CA","US","AutocompleteField","selectedOption","handleFocus","selectRef","createRef","isSearchable","noOptionsMessage","onFocus","ref","menuPlacement","maxMenuHeight","UserAddDetailsForm","handleCancel","renderUserAddDetailsForm","getCountryCodeFromLocale","countryOptions","getStatesForCountry","CountryCityState","getCountries","shortName","countryCode","states","States","getStatesByShort","getCountryByShort","PhoneInput","previousValue","inputValue","fieldRef","current","Math","abs","selectionStart","selectionEnd","defaultCountry","formRenderer","pop","countryName","match","onDetailsNeeded","test","isPossiblePhoneNumber","WaiverSignaturePad","recordStroke","sigPad","getTrimmedCanvas","toDataURL","canvasApiRef","onEnd","penColor","canvasProps","clear","signature","validateOnBlur","onWaiverSign","submitWaiver","getAdultParticipant","isMinor","requestTemplate","newWaiverRequired","userIsFlying","Test","Routes","to","render","exact","env","App","keepSessionAlive","requestHeartbeat","uiContextValue","keepAlive","requestSession","setInterval","SESSION_KEEP_ALIVE_INTERVAL","clearInterval","PRODUCTION","LOCAL","STAGING","DEVELOPMENT","Helmet","contextualize","combineReducers","saga","watcher","preloadedState","Boolean","polyfillElementClosest","baseUrl","getAttribute","rootElement","getElementById","store","sagaMiddleware","createSagaMiddleware","middleware","thunk","applyMiddleware","_createStore","finalCreateStore","__REDUX_DEVTOOLS_EXTENSION__","trace","run","createStore","Modal","setAppElement","ReactDOM","basename","navigator","serviceWorker","ready","then","registration","unregister","smoothscroll","polyfill","overrideSessionData","minorKeyCounter","addMinorSucceeded","updateMinors","checkInLoading","checkInSucceeded","checkInFailed","loadingExpired","successExpired","failureExpired","args","loadingPastResponses","deepMergeReducer","successPastResponses","failurePastResponses","loadingTemplate","successTemplate","failureTemplate","loadingTemplateMinors","successTemplateMinors","failureTemplateMinors","loadingHeartbeat","successHeartbeat","failureHeartbeat","successIsFlying","successLanguage","startOverComplete","loadingSession","successSession","failureSession","savingWaiver","successWaiver","failureWaiver","initialState","takeEvery","fetchPastResponses","fetchTemplate","fetchTemplateMinors","updateIsFlying","updateLanguage","startSession","saveWaiver","existing","getMinorKey","UserModule","minorIds","post","isUserFlying","isParentFlying","fetchExpired","loc","endpoint","pathname","substr","lastIndexOf","responseData","isArray","String","padStart","setReservationUser","source","sendEmailCopy","payload","stringifyPayload","substituteMaybes","flyingMinors","toUpperCase","stringifyValue","responseToApiMap","elem","apiToResponsesMap","p","Number","MAX_SAFE_INTEGER","participants","participant"],"mappings":"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CPhkB,MAAO,MACT,CACEgkB,MAAO,wBACPhkB,MAAO,MACT,CACEgkB,MAAO,cACPhkB,MAAO,MACT,CACEgkB,MAAO,UACPhkB,MAAO,MACT,CACEgkB,MAAO,UACPhkB,MAAO,MACT,CACEgkB,MAAO,uBACPhkB,MAAO,MACT,CACEgkB,MAAO,SACPhkB,MAAO,MACT,CACEgkB,MAAO,eACPhkB,MAAO,MACT,CACEgkB,MAAO,kBACPhkB,MAAO,OAIX6kB,GAAI,CAAC,CACDb,MAAO,UACPhkB,MAAO,MACT,CACEgkB,MAAO,SACPhkB,MAAO,MACT,CACEgkB,MAAO,iBACPhkB,MAAO,MACT,CACEgkB,MAAO,UACPhkB,MAAO,MACT,CACEgkB,MAAO,WACPhkB,MAAO,MACT,CACEgkB,MAAO,aACPhkB,MAAO,MACT,CACEgkB,MAAO,WACPhkB,MAAO,MACT,CACEgkB,MAAO,cACPhkB,MAAO,MACT,CACEgkB,MAAO,WACPhkB,MAAO,MACT,CACEgkB,MAAO,uBACPhkB,MAAO,MACT,CACEgkB,MAAO,iCACPhkB,MAAO,MACT,CACEgkB,MAAO,UACPhkB,MAAO,MACT,CACEgkB,MAAO,UACPhkB,MAAO,MACT,CACEgkB,MAAO,OACPhkB,MAAO,MACT,CACEgkB,MAAO,SACPhkB,MAAO,MACT,CACEgkB,MAAO,QACPhkB,MAAO,MACT,CACEgkB,MAAO,WACPhkB,MAAO,MACT,CACEgkB,MAAO,UACPhkB,MAAO,MACT,CACEgkB,MAAO,OACPhkB,MAAO,MACT,CACEgkB,MAAO,SACPhkB,MAAO,MACT,CACEgkB,MAAO,WACPhkB,MAAO,MACT,CACEgkB,MAAO,YACPhkB,MAAO,MACT,CACEgkB,MAAO,QACPhkB,MAAO,MACT,CACEgkB,MAAO,mBACPhkB,MAAO,MACT,CACEgkB,MAAO,WACPhkB,MAAO,MACT,CACEgkB,MAAO,gBACPhkB,MAAO,MACT,CACEgkB,MAAO,WACPhkB,MAAO,MACT,CACEgkB,MAAO,YACPhkB,MAAO,MACT,CACEgkB,MAAO,cACPhkB,MAAO,MACT,CACEgkB,MAAO,WACPh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","file":"static/js/main.89e1c2e5.chunk.js","sourcesContent":["import { addBundle } from '@ifly/ifly-i18n'\nimport de from './languages/de'\nimport en from './languages/en'\nimport es from './languages/es'\nimport fr from './languages/fr'\nimport it from './languages/it'\nimport pt from './languages/pt'\nimport zh from './languages/zh'\nimport { SOURCE_KIOSK, SOURCE_WEB, SOURCE_KIOSK_TUNNEL_OVERRIDE } from 'redux/modules/waiver'\n\naddBundle('react-kiosk-keyboard', { de, en, es, fr, it, pt, zh });\n\nexport * from '@ifly/ifly-i18n';\nexport { default } from '@ifly/ifly-i18n';\n\n/**\n * Convert a Waiver source to the appropriate i18n key for that source.\n * Particularly, KIOSK if the source is KIOSK, otherwise all other sources\n * return WEB.\n * @param {String} waiverSource\n */\nexport const waiverSourceKey = waiverSource =>\n waiverSource === SOURCE_KIOSK || waiverSource === SOURCE_KIOSK_TUNNEL_OVERRIDE\n ? SOURCE_KIOSK\n : SOURCE_WEB;","import axios from 'axios'\nimport Qs from 'qs'\nimport { all, call, put, select, takeLatest } from 'redux-saga/effects'\nimport { createModule } from '@ifly/redux-modules'\nimport { replacementReducer } from '@ifly/redux-modules/reducers'\nimport Waiver, { WaiverSaga } from './waiver'\n\nconst Module = createModule({\n name: 'user',\n actions: {\n addUserDetails: { dispatch: true },\n clearUserDetails: { reducer: false, dispatch: true }, // reduced by saga\n \n requestUserLookup: { reducer: false, dispatch: true }, // reduced by saga\n loadingUserLookup: {},\n successUserLookup: {},\n failureUserLookup: {},\n\n loadingMinors: {},\n successMinors: {},\n failureMinors: {},\n \n clearState: { reducer: replacementReducer },\n updateState: {},\n \n updateReservationUser: {}\n }\n});\n\nexport default Module;\n\nexport class UserSaga {\n\n static* watcher() {\n yield all([\n takeLatest(Module.constants.clearUserDetails, UserSaga.clearDetails),\n takeLatest(Module.constants.requestUserLookup, UserSaga.lookupUser)\n ]);\n }\n\n static* clearDetails() {\n yield put(\n Module.actions.updateState({\n data: undefined,\n details: undefined\n })\n );\n }\n\n /**\n * Clear any errors after a System Error, so that the system can retry\n */\n static* clearErrors() {\n const state = yield select(Module.selector.default);\n Object.values(state).forEach(value => {\n if (value instanceof Object && value.hasOwnProperty('error')) {\n delete value.error;\n }\n });\n\n yield put(Module.actions.updateState(state));\n }\n\n static * fetchMinors(action) {\n let { id : userId } = action;\n let minors = { isLoading: true };\n yield put(Module.actions.loadingMinors({ minors }));\n\n try {\n const response = yield call(axios.get, '/api/User/Minors?' + Qs.stringify({ user: userId }));\n minors = { isLoading: false };\n\n yield put(Module.actions.successMinors({ minors }));\n\n // if the reservation already has minors, then we merge the existing minor records\n // with the reservation minors\n const { minors: reservationMinors } = yield select(Waiver.selector.default);\n const userMinors = response.data.map(details => ({ details }));\n\n if (reservationMinors?.length) {\n reservationMinors.forEach(reservationMinor => {\n const matchingUserMinor = userMinors.find(\n userMinor =>\n userMinor.details.firstName === reservationMinor.details.firstName &&\n userMinor.details.lastName === reservationMinor.details.lastName &&\n userMinor.details.birthDay === reservationMinor.details.birthDay &&\n userMinor.details.birthMonth === reservationMinor.details.birthMonth &&\n userMinor.details.birthYear === reservationMinor.details.birthYear\n );\n\n if (matchingUserMinor) {\n reservationMinor.details = {\n ...reservationMinor.details,\n ...matchingUserMinor.details\n };\n }\n });\n \n yield call(WaiverSaga.setMinors, reservationMinors);\n } else {\n yield call(WaiverSaga.setMinors, userMinors);\n }\n } catch (e) {\n yield put(\n Module.actions.failureMinors({\n error: e.message,\n isLoading: false\n })\n );\n }\n }\n\n /**\n * Fetch user from the local API\n * @param {Object} action The action being dispatched\n */\n static* lookupUser(action) {\n let { query } = action;\n let state = yield select(Module.selector.default);\n\n yield put(\n Module.actions.loadingUserLookup({\n isLoading: true,\n query\n })\n );\n\n let appState = yield select();\n\n // clear out any previously loaded minors\n if (appState?.waiver?.session?.data?.waiverSource !== 'EVNT_PLAN') {\n yield call(WaiverSaga.setMinors, []);\n }\n \n try {\n const response = yield call(axios.get, '/api/User/Search?' + Qs.stringify(query));\n\n yield put(\n Module.actions.successUserLookup({\n data: response.data,\n details: {\n ...state.details,\n ...query,\n ...response.data\n },\n isLoading: false\n })\n );\n\n if (response?.data?.needsAddInfo === false) {\n // if we have a user, go ahead and get the user's minors\n yield call(UserSaga.fetchMinors, response.data);\n }\n\n } catch (e) {\n yield put(\n Module.actions.failureUserLookup({\n error: e.message,\n isLoading: false\n })\n );\n }\n }\n\n /**\n * Preload a user via an externally defined reservation\n * @param {Object} action\n */\n static* setReservationUser(action) {\n let { firstName, lastName, email, birthDay, birthMonth, birthYear } = action;\n\n // Convert to proper string format\n birthDay = \"\" + birthDay;\n birthMonth = \"\" + birthMonth;\n birthYear = \"\" + birthYear;\n if (birthDay.length < 2) birthDay = \"0\" + birthDay;\n if (birthMonth.length < 2) birthMonth = \"0\" + birthMonth;\n\n yield put(\n Module.actions.updateReservationUser({\n query: {\n firstName,\n lastName,\n email,\n birthDay,\n birthMonth,\n birthYear\n }\n })\n );\n }\n}","/**\n * German language bundle module.\n *\n * @module module:locale/languages/de\n * @see module:locale/languages/bundle\n *\n */\n\n/** The language bundle. */\nexport default {\n $: {\n code: \"de\",\n name: \"German\"\n },\n buttons: {\n addMinor: \"Einen Minderjährigen hinzufügen\",\n checkIn: \"Einchecken\", // Google Translate\n clearSignature: \"Klare Unterschrift\", // Google Translate\n close: \"Schließen\", // Google Translate\n continue: \"Weiter\",\n goBack: \"Geh zurück\", // Google Translate\n startOver: \"Von vorne anfangen\",\n submit: \"Einreichen\" // Google Translate\n },\n labels: {\n YES: \"Ja\",\n NO: \"Nein\"\n },\n messages: {\n birthDateRequired: \"Bitte wählen Sie ein Geburtsdatum\", // Google Translate\n systemError:\n \"Es tut uns leid, aber wir konnten Ihre Anfrage derzeit nicht bearbeiten.Bitte versuchen Sie es später noch einmal.\", // Google Translate\n welcome: \"Willkommen bei iFLY!\", // Google Translate\n startOverConfirm: \"Wollen Sie wirklich von vorne anfangen?\", // Google Translate\n blocker: \"Sie können mit Ihrer aktuellen Auswahl nicht fliegen.\", // Google Translate\n initialsAccepted: \"Initialen akzeptiert.\", // Google Translate\n invalidEmail: \"Bitte geben Sie eine gültige E-Mail-Adresse ein.\", // Google Translate\n invalidDate: \"Bitte gib ein korrektes Datum an\", // Google Translate\n invalidPhone: \"Bitte geben Sie eine gültige Telefonnummer ein.\", // Google Translate\n enterCountryCode:\n \"Bitte beginnen Sie mit “+” und Ihrer Landesvorwahl, wenn Ihre Telefonnummer außerhalb von %{country} liegt.\", // Google Translate\n noOptions: \"Keine Optionen\", // Google Translate\n youMustInitial: \"Bitte hier initialisieren, um fortzufahren.\", // Google Translate\n youMustSign: \"Bitte unterschreiben Sie dieses Dokument, um fortzufahren.\", // Google Translate\n mustBeAdult: \"Sie müssen über 18 sein, um einzuchecken.\", // Google Translate\n mustBeMinor: \"Alle Flyer, die älter als 18 Jahre sind, sollten separat eingecheckt werden.\", // Google Translate\n tooYoungToFly: \"Personen unter drei Jahren dürfen nicht fliegen.\", // Google Translate\n selectionRequired: \"Bitte wähle eine Option.\", // Google Translate\n valueRequired: \"Bitte geben Sie einen Wert für dieses Feld ein.\" // Google Translate,\n },\n Confirmation: {\n title: \"Dankeschön.\", // Google Translate\n subtitle: {\n WEB: \"Vielen Dank! Ihr Verzicht ist vollständig.\", // Google Translate,\n KIOSK: \"Ihr Verzicht ist vollständig! Der nächste Schritt ist, sich an die Rezeption zu begeben, um einzuchecken und den Flug zu genießen!\" // Google Translate\n },\n flyers: \"Flyer\" // Google Translate\n },\n Timeout: {\n stillHere: \"Bist du noch da?\", // Google Translate\n instructions:\n \"Wenn Sie immer noch hier sind, drücken Sie bitte den Knopf unten. Andernfalls wird dieser Kiosk neu gestartet.\", // Google Translate\n closeButton: \"Ich bin noch da!\" // Google Translate\n },\n TunnelSelector: {\n placeholder: \"Wählen...\", // Google Translate\n checkInHere: \"Hier einchecken\", // Google Translate\n touchScreenToBegin: \"Touchscreen, um zu beginnen\", // Google Translate\n selectYourTunnel: \"Bitte wählen Sie Ihren Tunnel aus, um zu beginnen.\", // Google Translate\n selectYourLanguage: \"Bitte wählen Sie Ihre Sprache.\" // Google Translate\n },\n FlyersForm: {\n title: \"Wer fliegt am Tag Ihrer Reservierung?\", // Google Translate\n isPersonFlying: \"Fliegt %{firstName} %{lastName} am Tag Ihrer Reservierung?\", // Google Translate\n noFlyers: \"Bitte wählen Sie mindestens eine Person zum Fliegen aus.\", // Google Translate\n optionFlying: \"Fliegt\",\n optionNotFlying: \"Fliegt nicht\",\n enterMinorInformation: \"Bitte geben Sie unten die Daten Ihres Minderjährigen ein:\" // Google Translate\n },\n UserLookupForm: {\n title: \"Bitte einchecken\", // Google Translate\n needBasicInformation:\n \"Wir benötigen einige grundlegende Informationen von Ihnen, um loszulegen.\", // Google Translate\n ifYouAreFlyingWithMinor:\n \"Wenn Sie mit einem Minderjährigen fliegen, werden wir Sie um Informationen zu einem zukünftigen Schritt bitten.\", // Google Translate\n fields: {\n firstName: \"Vorname\",\n lastName: \"Nachname\",\n email: \"E-Mail\",\n birthday: \"Geburtstag\"\n }\n },\n UserDetailsForm: {\n title: \"Wir brauchen mehr Informationen\", // Google Translate\n firstTimeFlying: \"Sieht so aus, als fliegst du zum ersten Mal mit uns!\", // Google Translate\n needMoreInfo: \"Wir brauchen ein bisschen mehr Informationen über dich.\", // Google Translate\n fields: {\n address1: \"Adresse 1\", // Google Translate\n address2: \"Adresse 2\", // Google Translate\n city: \"Stadt\",\n state: \"Bundesland\",\n zip: \"PLZ\",\n country: \"Land\", // Google Translate\n phone: \"Telefonnummer\"\n }\n },\n WaiverForm: {\n title: \"Bitte scrollen Sie und vervollständigen Sie diesen Verzicht.\", // Google Translate\n clickToInitial: \"Klicken Sie hier, um zu initialisieren\", // Google Translate\n pleaseSign: \"Bitte unterschreiben Sie unten:\" // Google Translate\n }\n};\n","/**\n * English language bundle module.\n *\n * @module module:locale/languages/en\n * @see module:locale/languages/bundle\n *\n */\n\n/** The language bundle. */\nexport default {\n $: {\n code: 'en',\n name: 'English'\n },\n buttons: {\n addMinor: 'Add a Minor',\n checkIn: 'Check In',\n clearSignature: 'Clear Signature',\n close: 'Close',\n continue: 'Continue',\n goBack: 'Go Back',\n startOver: 'Start Over',\n submit: 'Submit'\n },\n kiosk: {\n title: 'Welcome',\n prompt: {\n choose_an_action: 'Choose an Option Below to Complete Your Waiver'\n },\n action: {\n qrcode: 'Scan QR Code To Complete on Mobile',\n new_waiver: 'Touch Here To Sign a New Waiver'\n }\n },\n labels: {\n YES: 'Yes',\n NO: 'No'\n },\n messages: {\n birthDateRequired: 'Please select a birth date',\n systemError:\n 'We\\'re sorry, but we could not complete your request at this time. Please try again later.',\n welcome: 'Welcome to iFLY!',\n startOverConfirm:\n 'Are you sure you want to completely start over from the beginning?',\n blocker: 'You cannot fly with your current selection.',\n initialsAccepted: 'Initials accepted.',\n invalidEmail: 'Please enter a valid email address.',\n enterCountryCode: 'Please begin with “+” and your country code if your phone number is outside of %{country}.',\n invalidPhone: 'Please enter a valid phone number.',\n invalidDate: 'Please enter a valid date.',\n noOptions: 'No options',\n youMustInitial: 'Please initial here to continue.',\n youMustSign: 'Please sign this document to continue.',\n mustBeAdult: 'You must be over 18 to check in.',\n mustBeMinor: 'Any flyer over 18 should check in separately.',\n tooYoungToFly: 'People under three years of age may not fly.',\n selectionRequired: 'Please select an option.',\n valueRequired: 'Please fill out this field.'\n },\n Confirmation: {\n title: 'Thank You.',\n subtitle: {\n WEB: 'Thank you! Your waiver is now complete.',\n KIOSK: 'Your waiver is complete! The next step is to head to the front desk to Check In, enjoy your flight!'\n },\n flyers: 'Flyers'\n },\n Timeout: {\n stillHere: 'Are you still here?',\n instructions:\n 'If you are still here, please press the button below. Otherwise,this kiosk will restart.',\n closeButton: 'I\\'m still here!'\n },\n TunnelSelector: {\n placeholder: 'Select...',\n checkInHere: 'Waiver Station',\n touchScreenToBegin: 'Touch screen to begin',\n selectYourTunnel: 'Please select your tunnel to get started.',\n selectYourLanguage: 'Please select your language.'\n },\n FlyersForm: {\n title: 'Who will be flying the day of your reservation?',\n isPersonFlying: 'Is %{firstName} %{lastName} flying the day of your reservation?',\n noFlyers: 'Please select at least one person to fly.',\n optionFlying: 'Flying',\n optionNotFlying: 'Not Flying',\n enterMinorInformation: 'Please enter your minor\\'s information below:'\n },\n UserLookupForm: {\n title: 'Please Check In',\n needBasicInformation:\n 'We\\'ll need some basic information from you to get started.',\n ifYouAreFlyingWithMinor:\n 'If you are flying with a minor, we\\'ll ask for their information on a future step.',\n fields: {\n firstName: 'First Name',\n lastName: 'Last Name',\n email: 'Email',\n birthday: 'Birthday'\n }\n },\n UserDetailsForm: {\n title: 'We\\'ll need some more info',\n firstTimeFlying: 'Looks like this might be your first time flying with us!',\n needMoreInfo: 'We\\'ll need a little more information about you.',\n fields: {\n address1: 'Address 1',\n address2: 'Address 2',\n city: 'City',\n state: 'State',\n zip: 'Postal Code',\n country: 'Country',\n phone: 'Phone'\n }\n },\n WaiverForm: {\n title: 'Please scroll and complete this waiver.',\n clickToInitial: 'Click here to initial',\n pleaseSign: 'Please sign below:'\n }\n};\n","/**\n * Spanish language bundle module.\n *\n * @module module:locale/languages/es\n * @see module:locale/languages/bundle\n *\n */\n\n/** The language bundle. */\nexport default {\n $: {\n code: \"es\",\n name: \"Spanish\"\n },\n buttons: {\n addMinor: \"Añadir un menor\",\n checkIn: \"Registrarse\", // Google Translate\n clearSignature: \"Firma clara\", // Google Translate\n close: \"Cerrar\", // Google Translate\n continue: \"Continuar\",\n goBack: \"Regresa\", // Google Translate\n startOver: \"Empezar de nuevo\",\n submit: \"Enviar\" // Google Translate\n },\n labels: {\n YES: \"Sí\",\n NO: \"No\"\n },\n messages: {\n birthDateRequired: \"Por favor seleccione una fecha de nacimiento\", // Google Translate\n systemError:\n \"Lo sentimos, pero no pudimos completar su solicitud en este momento.Por favor, inténtelo de nuevo más tarde.\", // Google Translate\n welcome: \"¡Bienvenido a iFLY!\", // Google Translate\n startOverConfirm: \"¿Estás seguro de que quieres volver a empezar desde el principio?\", // Google Translate\n blocker: \"No puedes volar con tu selección actual.\", // Google Translate\n initialsAccepted: \"Iniciales aceptadas.\", // Google Translate\n invalidEmail: \"Por favor, introduce una dirección de correo electrónico válida.\", // Google Translate\n invalidDate: \"Por favor introduzca una fecha valida.\", // Google Translate\n invalidPhone: \"Por favor ingrese un número de teléfono válido.\", // Google Translate\n enterCountryCode:\n \"Comience con “+” y el código de su país si su número de teléfono está fuera de %{country}.\", // Google Translate\n noOptions: \"Sin opciones\", // Google Translate\n youMustInitial: \"Inicialice aquí para continuar.\", // Google Translate\n youMustSign: \"Por favor firme este documento para continuar.\", // Google Translate\n mustBeAdult: \"Debe ser mayor de 18 años para registrarse.\", // Google Translate\n mustBeMinor: \"Cualquier participante quien tiene 18 años o mas, debe registrarse por separado.\", // Google Translate\n tooYoungToFly: \"Las personas menores de tres años no pueden participar.\", // Google Translate\n selectionRequired: \"Por favor seleccione una opción.\", // Google Translate\n valueRequired: \"Por favor, introduzca un valor para este espacio.\" // Google Translate,\n },\n Confirmation: {\n title: \"Gracias.\", // Google Translate\n subtitle: {\n WEB: \"¡Gracias! Su renuncia está completa.\", // Google Translate\n KIOSK: \"¡Su renuncia está completa! El siguiente paso es dirigirse a la recepción para registrarse, ¡disfrute de su vuelo!\" // Google Translate\n },\n flyers: \"Participantes\" // Google Translate\n },\n Timeout: {\n stillHere: \"¿Sigues aquí?\", // Google Translate\n instructions:\n \"Si todavía está aquí, presione el botón a continuación. De lo contrario, este quiosco se reiniciará.\", // Google Translate\n closeButton: \"¡Todavía estoy aquí!\" // Google Translate\n },\n TunnelSelector: {\n placeholder: \"Seleccionar...\", // Google Translate\n checkInHere: \"Registrarse aquí\", // Google Translate\n touchScreenToBegin: \"Toque la pantalla para comenzar\", // Google Translate\n selectYourTunnel: \"Seleccione su túnel para comenzar.\", // Google Translate\n selectYourLanguage: \"Por favor seleccione su idioma.\" // Google Translate\n },\n FlyersForm: {\n title: \"¿Quién volará el día de su reserva?\", // Google Translate\n isPersonFlying: \"¿%{firstName} %{lastName} volará el día de su reserva?\", // Google Translate\n noFlyers: \"Seleccione al menos una persona para volar.\", // Google Translate\n optionFlying: \"Vuela\",\n optionNotFlying: \"No vuela\",\n enterMinorInformation: \"Ingrese la información de su menor a continuación:\" // Google Translate\n },\n UserLookupForm: {\n title: \"Por favor regístrese\", // Google Translate\n needBasicInformation: \"Necesitaremos información básica de usted para comenzar.\", // Google Translate\n ifYouAreFlyingWithMinor:\n \"Si viaja con un menor, le pediremos su información en un paso futuro.\", // Google Translate\n fields: {\n firstName: \"Primer Nombre\",\n lastName: \"Apellido\",\n email: \"Correo electrónico\",\n birthday: \"Cumpleaños\"\n }\n },\n UserDetailsForm: {\n title: \"Necesitaremos más información\", // Google Translate\n firstTimeFlying: \"¡Parece que esta podría ser tu primera vez volando con nosotros!\", // Google Translate\n needMoreInfo: \"Necesitaremos un poco más de información sobre usted.\", // Google Translate\n fields: {\n address1: \"Dirección 1\", // Google Translate\n address2: \"Dirección 2\", // Google Translate\n city: \"Ciudad\",\n state: \"Estado\",\n zip: \"Código postal\",\n country: \"País\", // Google Translate\n phone: \"Número de teléfono\"\n }\n },\n WaiverForm: {\n title: \"Desplácese y complete esta exención.\", // Google Translate\n clickToInitial: \"Haga clic aquí para inicializar\", // Google Translate\n pleaseSign: \"Por favor firme abajo:\" // Google Translate\n }\n};\n","/**\n * French language bundle module.\n *\n * @module module:locale/languages/fr\n * @see module:locale/languages/bundle\n *\n */\n\n/** The language bundle. */\nexport default {\n $: {\n code: \"fr\",\n name: \"French\"\n },\n buttons: {\n addMinor: \"Ajouter un enfant mineur\",\n checkIn: \"Enregistrement\", // Google Translate\n clearSignature: \"Signature claire\", // Google Translate\n close: \"Fermer\", // Google Translate\n continue: \"Continuer\",\n goBack: \"Retourner\", // Google Translate\n startOver: \"Recommencer\",\n submit: \"Soumettre\" // Google Translate\n },\n labels: {\n YES: \"Oui\",\n NO: \"Non\"\n },\n messages: {\n birthDateRequired: \"Veuillez sélectionner une date de naissance\", // Google Translate\n systemError:\n \"Nous sommes désolés, mais nous n'avons pas pu terminer votre demande pour l'instant.Veuillez réessayer plus tard.\", // Google Translate\n welcome: \"Bienvenue sur iFLY!\", // Google Translate\n startOverConfirm: \"Êtes-vous sûr de vouloir recommencer depuis le début?\", // Google Translate\n blocker: \"Vous ne pouvez pas voler avec votre sélection actuelle.\", // Google Translate\n initialsAccepted: \"Initiales acceptées.\", // Google Translate\n invalidEmail: \"S'il vous plaît, mettez une adresse email valide.\", // Google Translate\n invalidDate: \"Veuillez entrer une date valide.\", // Google Translate\n invalidPhone: \"S'il vous plaît entrer un numéro de téléphone valide.\", // Google Translate\n enterCountryCode:\n \"Veuillez commencer par “+” et votre code de pays si votre numéro de téléphone est en dehors de %{country}.\", // Google Translate\n noOptions: \"Aucune option\", // Google Translate\n youMustInitial: \"Merci de parapher ici pour continuer.\", // Google Translate\n youMustSign: \"Veuillez signer ce document pour continuer.\", // Google Translate\n mustBeAdult: \"Vous devez avoir plus de 18 ans pour pouvoir vous enregistrer.\", // Google Translate\n mustBeMinor: \"Toute personne de plus de 18 ans doit s’inscrire séparément.\", // Google Translate\n tooYoungToFly: \"Les personnes de moins de trois ans ne peuvent pas voler.\", // Google Translate\n selectionRequired: \"Veuillez sélectionner une option.\", // Google Translate\n valueRequired: \"Veuillez entrer une valeur pour cet espace.\" // Google Translate,\n },\n Confirmation: {\n title: \"Merci.\", // Google Translate\n subtitle: {\n WEB: \"Je vous remercie! Votre renonciation est complète.\", // Google Translate\n KIOSK: \"Votre renonciation est complète! La prochaine étape est de vous diriger vers la réception pour vous enregistrer, profitez de votre vol!\" // Google Translate\n },\n flyers: \"Flyers\" // Google Translate\n },\n Timeout: {\n stillHere: \"Êtes-vous toujours là?\", // Google Translate\n instructions:\n \"Si vous êtes toujours là, appuyez sur le bouton ci-dessous. Sinon, ce kiosque va redémarrer.\", // Google Translate\n closeButton: \"Je suis encore là!\" // Google Translate\n },\n TunnelSelector: {\n placeholder: \"Choisir...\", // Google Translate\n checkInHere: \"Vérifiez ici\", // Google Translate\n touchScreenToBegin: \"Écran tactile pour commencer\", // Google Translate\n selectYourTunnel: \"Veuillez sélectionner votre tunnel pour commencer.\", // Google Translate\n selectYourLanguage: \"S'il vous plaît sélectionnez votre langue.\" // Google Translate\n },\n FlyersForm: {\n title: \"Qui volera le jour de votre réservation?\", // Google Translate\n isPersonFlying: \"Est-ce que %{firstName} %{lastName} vole le jour de votre réservation?\", // Google Translate\n noFlyers: \"Veuillez sélectionner au moins une personne pour voler.\", // Google Translate\n optionFlying: \"Vole\",\n optionNotFlying: \"Ne vole pas\",\n enterMinorInformation: \"S'il vous plaît entrer les informations de votre mineur ci-dessous:\" // Google Translate\n },\n UserLookupForm: {\n title: \"S'il vous plaît vérifier\", // Google Translate\n needBasicInformation: \"Nous aurons besoin de quelques informations de base pour commencer.\", // Google Translate\n ifYouAreFlyingWithMinor:\n \"Si vous volez avec un mineur, nous lui demanderons des informations sur une étape ultérieure.\", // Google Translate\n fields: {\n firstName: \"Prénom\",\n lastName: \"Nom de famille\",\n email: \"Email\",\n birthday: \"Anniversaire\"\n }\n },\n UserDetailsForm: {\n title: \"Nous aurons besoin de plus d'infos\", // Google Translate\n firstTimeFlying: \"On dirait que c'est peut-être votre première fois à voler avec nous!\", // Google Translate\n needMoreInfo: \"Nous aurons besoin d'un peu plus d'informations sur vous.\", // Google Translate\n fields: {\n address1: \"Adresse 1\", // Google Translate\n address2: \"Adresse 2\", // Google Translate\n city: \"Ville\",\n state: \"Etat\",\n zip: \"Code postal\",\n country: \"Pays\", // Google Translate\n phone: \"Numéro de téléphone\"\n }\n },\n WaiverForm: {\n title: \"Veuillez faire défiler et compléter cette renonciation.\", // Google Translate\n clickToInitial: \"Cliquez ici pour parapher\", // Google Translate\n pleaseSign: \"Veuillez signer ci-dessous:\" // Google Translate\n }\n};\n","/**\n * Italian language bundle module.\n *\n * @module module:locale/languages/it\n * @see module:locale/languages/bundle\n *\n */\n\n/** The language bundle. */\nexport default {\n $: {\n code: \"it\",\n name: \"Italian\"\n },\n buttons: {\n addMinor: \"Aggiungere un minore\",\n checkIn: \"Registrare\", // Google Translate\n clearSignature: \"Firma chiara\", // Google Translate\n close: \"Chiudere\", // Google Translate\n continue: \"Continua\",\n goBack: \"Torna indietro\", // Google Translate\n startOver: \"Avvio su\",\n submit: \"Sottoscrivi\" // Google Translate\n },\n keyboard: {\n // the localization keys are meaningful in react-simple-keyboard\n \"{bksp}\": \"⌫\", // Wiki - QWERTY Italian Keyboard\n \"{lock}\": \"⇪\", // Apple Italian Keyboard\n \"{shift}\": \"⇧\", // Apple Italian Keyboard\n \"{tab}\": \"Avanti\"\n },\n labels: {\n YES: \"Sì\",\n NO: \"No\"\n },\n messages: {\n birthDateRequired: \"Seleziona una data di nascita\", // Google Translate\n systemError:\n \"Siamo spiacenti, ma al momento non è stato possibile completare la richiesta. Per favore riprova più tardi.\", // Google Translate\n welcome: \"Benvenuto in iFLY!\", // Google Translate\n startOverConfirm: \"Sei sicuro di voler ricominciare completamente dall'inizio?\", // Google Translate\n blocker: \"Non puoi volare con la tua selezione attuale.\", // Google Translate\n initialsAccepted: \"Iniziali accettate.\", // Google Translate\n invalidEmail: \"Si prega di inserire un indirizzo email valido.\", // Google Translate\n invalidPhone: \"Si prega di inserire un numero di telefono valido.\", // Google Translate\n enterCountryCode:\n \"Inizia con “+” e il prefisso del tuo Paese se il tuo numero di telefono è esterno a %{country}.\", // Google Translate\n invalidDate: \"Per favore, inserisci una data valida.\", // Google Translate\n noOptions: \"Nessuna opzione\", // Google Translate\n youMustInitial: \"Si prega di inizializzare qui per continuare.\", // Google Translate\n youMustSign: \"Firma questo documento per continuare.\", // Google Translate\n mustBeAdult: \"Devi avere più di 18 anni per effettuare il check-in.\", // Google Translate\n mustBeMinor:\n \"Tutti i partecipanti di età superiore ai 18 anni devono effettuare il check-in separatamente.\", // Google Translate\n tooYoungToFly: \"Le persone di età inferiore ai tre anni non possono volare.\", // Google Translate\n selectionRequired: \"Per favore selezionate un'opzione.\", // Google Translate\n valueRequired: \"Inserisci un valore per questo spazio.\" // Google Translate,\n },\n Confirmation: {\n title: \"Grazie.\", // Google Translate\n subtitle: {\n WEB: \"Grazie! La tua rinuncia è completa.\", // Google Translate\n KIOSK: \"La tua rinuncia è completa! Il prossimo passo è andare alla reception per il check-in, goditi il tuo volo!\" // Google Translate\n },\n flyers: \"Aviatore\" // Google Translate\n },\n Timeout: {\n stillHere: \"Sei ancora qui?\", // Google Translate\n instructions:\n \"Se sei ancora qui, ti preghiamo di premere il pulsante qui sotto. Altrimenti, questo chiosco verrà riavviato.\", // Google Translate\n closeButton: \"Sono ancora qui!\" // Google Translate\n },\n TunnelSelector: {\n placeholder: \"Selezionare...\", // Google Translate\n checkInHere: \"Controlla qui\", // Google Translate\n touchScreenToBegin: \"Touch screen per iniziare\", // Google Translate\n selectYourTunnel: \"Seleziona il tunnel per iniziare.\", // Google Translate\n selectYourLanguage: \"Si prega di selezionare la lingua.\" // Google Translate\n },\n FlyersForm: {\n title: \"Chi volerà il giorno della prenotazione?\", // Google Translate\n isPersonFlying: \"%{firstName} %{lastName} è disponibile il giorno della tua prenotazione?\", // Google Translate\n noFlyers: \"Seleziona almeno una persona per volare.\", // Google Translate\n optionFlying: \"Volando\",\n optionNotFlying: \"Non volando\",\n enterMinorInformation: \"Inserisci le informazioni del tuo minore di seguito:\" // Google Translate\n },\n UserLookupForm: {\n title: \"Si prega di fare il check-in\", // Google Translate\n needBasicInformation: \"Per iniziare, avremo bisogno di alcune informazioni di base.\", // Google Translate\n ifYouAreFlyingWithMinor:\n \"Se voli con un minore, ti chiederemo le informazioni su un passaggio futuro.\", // Google Translate\n fields: {\n firstName: \"Nome\",\n lastName: \"Cognome\",\n email: \"Email\",\n birthday: \"Compleanno\"\n }\n },\n UserDetailsForm: {\n title: \"Avremo bisogno di qualche informazione in più\", // Google Translate\n firstTimeFlying: \"Sembra che questa potrebbe essere la prima volta che voli con noi!\", // Google Translate\n needMoreInfo: \"Avremo bisogno di ulteriori informazioni su di te.\", // Google Translate\n fields: {\n address1: \"Indirizzo 1\", // Google Translate\n address2: \"Indirizzo 2\", // Google Translate\n city: \"Città\",\n state: \"Stato\",\n zip: \"Codice postale\",\n country: \"Nazione\", // Google Translate\n phone: \"Numero di Telefono\"\n }\n },\n WaiverForm: {\n title: \"Si prega di scorrere e completare questa rinuncia.\", // Google Translate\n clickToInitial: \"Clicca qui per l'iniziale\", // Google Translate\n pleaseSign: \"Si prega di firmare di seguito:\" // Google Translate\n }\n};\n","/**\n * Portuguese language bundle module.\n *\n * @module module:locale/languages/pt\n * @see module:locale/languages/bundle\n *\n */\n\n/** The language bundle. */\nexport default {\n $: {\n code: \"pt\",\n name: \"Portuguese\"\n },\n buttons: {\n addMinor: \"Acrescente um menor de idade\",\n checkIn: \"Check-in\", // Google Translate\n clearSignature: \"Clear Signature\", // Google Translate\n close: \"Fechar\", // Google Translate\n continue: \"Continuar\",\n goBack: \"Volte\", // Google Translate\n startOver: \"Começar de novo\",\n submit: \"Enviar\" // Google Translate\n },\n labels: {\n YES: \"Sim\",\n NO: \"Não\"\n },\n messages: {\n birthDateRequired: \"Por favor selecione uma data de nascimento\", // Google Translate\n systemError: \"Lamentamos, mas não foi possível concluir sua solicitação no momento. Por favor, tente novamente mais tarde.\", // Google Translate\n welcome: \"Bem-vindo ao iFLY!\", // Google Translate\n startOverConfirm: \"Tem certeza de que deseja começar completamente do zero?\", // Google Translate\n blocker: \"Você não pode voar com sua seleção atual.\", // Google Translate\n initialsAccepted: \"Iniciais aceitas.\", // Google Translate\n invalidEmail: \"Por favor insira um endereço de e-mail válido.\", // Google Translate\n invalidDate: \"Por favor insira uma data válida.\", // Google Translate\n invalidPhone: \"Por favor insira um número de telefone válido.\", // Google Translate\n enterCountryCode: \"Comece com “+” e o código do seu país se o seu número de telefone estiver fora de %{country}.\", // Google Translate\n noOptions: \"Sem opções\", // Google Translate\n youMustInitial: \"Assine suas iniciais aqui para continuar.\", // Google Translate\n youMustSign: \"Por favor assine este documento para continuar.\", // Google Translate\n mustBeAdult: \"Você deve ter mais de 18 anos para fazer o check-in.\", // Google Translate\n mustBeMinor: \"Qualquer participante com mais de 18 anos deve fazer o check-in separadamente.\", // Google Translate\n tooYoungToFly: \"Pessoas com menos de três anos de idade não podem voar.\", // Google Translate\n selectionRequired: \"Por favor selecione uma opção.\", // Google Translate\n valueRequired: \"Por favor, insira um valor para este espaço.\" // Google Translate,\n },\n Confirmation: {\n title: \"Obrigado.\", // Google Translate\n subtitle: {\n WEB: \"Obrigado! Sua renúncia está completa.\", // Google Translate\n KIOSK: \"Sua renúncia está completa! O próximo passo é ir até a recepção para fazer o check-in e aproveitar o seu voo!\" // Google Translate\n },\n flyers: \"Folhetos\" // Google Translate\n },\n Timeout: {\n stillHere: \"Você ainda está aqui?\", // Google Translate\n instructions: \"Se você ainda está aqui, pressione o botão abaixo. Caso contrário, este quiosque será reiniciado.\", // Google Translate\n closeButton: \"Ainda estou aqui!\" // Google Translate\n },\n TunnelSelector: {\n placeholder: \"Selecione...\", // Google Translate\n checkInHere: \"Verifique aqui\", // Google Translate\n touchScreenToBegin: \"Tela de toque para começar\", // Google Translate\n selectYourTunnel: \"Selecione seu túnel para começar.\", // Google Translate\n selectYourLanguage: \"Por favor, selecione seu idioma.\" // Google Translate\n },\n FlyersForm: {\n title: \"Quem voará no dia da sua reserva?\", // Google Translate\n isPersonFlying: \"%{firstName} %{lastName} está voando no dia da sua reserva?\", // Google Translate\n noFlyers: \"Selecione pelo menos uma pessoa para voar.\", // Google Translate\n optionFlying: \"Vai voar\",\n optionNotFlying: \"Não vai voar\",\n enterMinorInformation: \"Digite as informações de seu menor abaixo:\"\n },\n UserLookupForm: {\n title: \"Por favor registre\", // Google Translate\n needBasicInformation: \"Precisamos de algumas informações básicas para você começar.\", // Google Translate\n ifYouAreFlyingWithMinor: \"Se você estiver viajando com um menor, solicitaremos suas informações em uma etapa futura.\", // Google Translate\n fields: {\n firstName: \"Nome\",\n lastName: \"Sobrenome\",\n email: \"E-mail\",\n birthday: \"Aniversário\"\n }\n },\n UserDetailsForm: {\n title: \"Vamos precisar de mais algumas informações\", // Google Translate\n firstTimeFlying: \"Parece que esta pode ser sua primeira vez voando conosco!\", // Google Translate\n needMoreInfo: \"Precisamos de um pouco mais de informações sobre você.\", // Google Translate\n fields: {\n address1: \"Endereço 1\", // Google Translate\n address2: \"Endereço 2\", // Google Translate\n city: \"Cidade\",\n state: \"Estado\",\n zip: \"CEP\",\n country: \"País\", // Google Translate\n phone: \"Telefone\"\n }\n },\n WaiverForm: {\n title: \"Por favor, role e complete esta renúncia.\", // Google Translate\n clickToInitial: \"Clique aqui para assinar suas iniciais\", // Google Translate\n pleaseSign: \"Por favor assine abaixo:\" // Google Translate\n }\n};","/**\n * Chinese (Simplified) language bundle module.\n *\n * @module module:locale/languages/zh\n * @see module:locale/languages/bundle\n *\n */\n\n/** The language bundle. */\nexport default {\n $: {\n code: \"zh\",\n name: \"Chinese\"\n },\n buttons: {\n addMinor: \"添加未成年人\",\n checkIn: \"报到\", // Google Translate\n clearSignature: \"清除签名\", // Google Translate\n close: \"关\", // Google Translate\n continue: \"继续\",\n goBack: \"回去\", // Google Translate\n startOver: \"重新开始\",\n submit: \"递交\" // Google Translate\n },\n labels: {\n YES: \"是\",\n NO: \"否\"\n },\n messages: {\n birthDateRequired: \"请选择出生日期\", // Google Translate\n systemError: \"很抱歉,我们目前无法完成您的请求。请稍后再试。\", // Google Translate\n welcome: \"欢迎来到iFLY!\", // Google Translate\n startOverConfirm: \"您确定要完全从头开始吗?\", // Google Translate\n blocker: \"您无法使用当前选择进行飞行。\", // Google Translate\n initialsAccepted: \"您的姓名缩写已被接受。\", // Google Translate\n invalidEmail: \"请输入有效的电子邮件地址。\", // Google Translate\n invalidDate: \"请输入一个有效的日期。\", // Google Translate\n invalidPhone: \"请输入一个有效的电话号码。\", // Google Translate\n enterCountryCode: \"如果您的电话号码不在 %{country} 之外,请以 “+” 和您的国家/地区代码开头。\", // Google Translate\n noOptions: \"没有选择\", // Google Translate\n youMustInitial: \"请在此处签名缩写以继续。\", // Google Translate\n youMustSign: \"请对此文件签名以继续。\", // Google Translate\n mustBeAdult: \"您必须年满18岁才能注册。\", // Google Translate\n mustBeMinor: \"18岁以上的任何传单必须单独注册。\", // Google Translate\n tooYoungToFly: \"三岁以下的人可能不会飞。\", // Google Translate\n selectionRequired: \"请选择一个选项。\", // Google Translate\n valueRequired: \"请为此空间输入一个值。\" // Google Translate,\n },\n Confirmation: {\n title: \"谢谢。\", // Google Translate\n subtitle: {\n WEB: \"谢谢! 您的豁免已经完成。\", // Google Translate\n KIOSK: \"您的豁免已经完成! 下一步就是前往前台办理登机手续,享受您的航班!\" // Google Translate\n },\n flyers: \"参加者\" // Google Translate\n },\n Timeout: {\n stillHere: \"你还在吗?\", // Google Translate\n instructions: \"如果您仍在这里,请按下面的按钮。否则,此信息亭将重新启动。\", // Google Translate\n closeButton: \"我还在这儿!\" // Google Translate\n },\n TunnelSelector: {\n placeholder: \"选择...\", // Google Translate\n checkInHere: \"在这里签到\", // Google Translate\n touchScreenToBegin: \"触摸屏开始\", // Google Translate\n selectYourTunnel: \"请选择您的隧道以开始。\", // Google Translate\n selectYourLanguage: \"请选择您的语言。\" // Google Translate\n },\n FlyersForm: {\n title: \"谁将在您预订的那天飞行?\", // Google Translate\n isPersonFlying: \"%{firstName} %{lastName} 是否在您预订的当天飞行?\", // Google Translate\n noFlyers: \"请选择至少一个人飞翔。\", // Google Translate\n optionFlying: \"飞行\",\n optionNotFlying: \"不飞\",\n enterMinorInformation: \"请在下面输入未成年人的信息:\" // Google Translate\n },\n UserLookupForm: {\n title: \"请签到\", // Google Translate\n needBasicInformation: \"我们需要您提供一些基本信息以开始使用。\", // Google Translate\n ifYouAreFlyingWithMinor: \"如果您与未成年人一起飞行,我们会在以后的步骤中询问他们的信息。\", // Google Translate\n fields: {\n firstName: \"名\",\n lastName: \"姓\",\n email: \"电子邮件\",\n birthday: \"出生日期\"\n }\n },\n UserDetailsForm: {\n title: \"我们需要更多信息\", // Google Translate\n firstTimeFlying: \"看来这可能是您第一次与我们同行!\", // Google Translate\n needMoreInfo: \"我们需要有关您的更多信息。\", // Google Translate\n fields: {\n address1: \"地址1\", // Google Translate\n address2: \"地址2\", // Google Translate\n city: \"市\",\n state: \"州\",\n zip: \"邮政编码\",\n country: \"国家\", // Google Translate\n phone: \"电话号码\"\n }\n },\n WaiverForm: {\n title: \"请滚动并完成此豁免。\", // Google Translate\n clickToInitial: \"单击此处签名缩写\", // Google Translate\n pleaseSign: \"请在下面签名:\" // Google Translate\n }\n};\n","/**\n * Sets up the application environment. This should be 'required' or 'import'ed\n * before any component or module needs to use the Environment class.\n */\nimport Environment from '@ifly/common-env'\n\nconst APP_ENV = process.env.REACT_APP_IFLY_ENV || process.env.NODE_ENV || Environment.PRODUCTION\n\nEnvironment.select(APP_ENV);","import axios from 'axios'\nimport { all, call, put, takeLatest } from 'redux-saga/effects'\nimport { createModule } from '@ifly/redux-modules'\n\nconst Module = createModule({\n name: 'tunnels',\n actions: {\n requestTunnels: { reducer: false, dispatch: true }, // reduced by saga\n loadingTunnels: {},\n successTunnels: {},\n failureTunnels: {}\n }\n});\n\nexport default Module;\n\nexport class TunnelsSaga {\n static* watcher() {\n yield all([\n takeLatest(Module.constants.requestTunnels, TunnelsSaga.fetchTunnels)\n ]);\n }\n\n /**\n * Fetch tunnels from the local API\n * @param {Object} action The action being dispatched\n */\n static* fetchTunnels() {\n let isLoading = true;\n\n yield put(Module.actions.loadingTunnels({ isLoading }));\n isLoading = false;\n\n try {\n let response = yield call(axios.get, '/api/Tunnels');\n let { data } = response || {};\n yield put(Module.actions.successTunnels({ data, isLoading }));\n\n } catch (e) {\n let error = e.message;\n yield put(Module.actions.failureTunnels({ error, isLoading }));\n }\n }\n}","import React from 'react'\n\n// define a UI context to distinguish between web and kiosk modes\nexport const UI_MODE_WEB = 'WEB';\nexport const UI_MODE_KIOSK = 'KIOSK';\nexport const UI_MODE_IFRAME = 'IFRAME';\n\nconst UiContext = React.createContext({\n mode: UI_MODE_WEB,\n isKiosk: false,\n tunnel: undefined\n});\n\nUiContext.displayName = 'UI Context';\nexport default UiContext; ","import { Footer, Header } from '@ifly/ifly-web-common/www'\nimport { CartContext } from '@ifly/ifly-web-common/cart'\nimport PropTypes from 'prop-types'\nimport React, { Component } from 'react'\nimport Tunnels from 'redux/modules/tunnels'\nimport UiContext from 'util/Context'\n\nclass Layout extends Component {\n static contextType = UiContext;\n \n state = {\n tunnels: null,\n isLoadingTunnels: false\n }\n\n cartContextValue = {\n cartItems: [],\n cartLimit: 500,\n addToCart: () => { },\n removeFromCart: () => { },\n viewCart: null,\n isAccountHidden: true,\n headerButton: true\n }\n\n onChangeLocation = tunnelCode => false; // no-op\n \n /* End boilerplate from ifly-web-common */\n isFullWebPage = () => {\n const { isKiosk, isIframe } = this.context;\n // if `isKiosk` is undefined, then we actually don't know the answer yet\n // because the session isn't loaded\n return isKiosk !== undefined && !isKiosk && !isIframe;\n }\n\n componentDidMount() {\n this.props.actions.requestTunnels();\n }\n\n render() {\n const isFullWebPage = this.isFullWebPage();\n const { data: tunnels } = this.props;\n\n return (\n
\n {isFullWebPage &&\n \n
\n \n }\n
\n {this.props.children}\n
\n {isFullWebPage &&
\n )\n }\n\n static propTypes = {\n tunnels: PropTypes.array\n }\n}\n\nexport default Tunnels.connect(Layout);","import React, { Component } from 'react'\nimport { withRouter } from 'react-router'\nimport I18n from 'locale/I18n'\nimport './SystemError.scss'\nimport Waiver from 'redux/modules/waiver'\nimport PropTypes from 'prop-types'\n\n/**\n * Governs how long to display the error before navigating the browser back.\n */\nconst defaultTimeout = 15000;\n\nclass SystemError extends Component {\n timeoutRef = null;\n\n componentDidMount() {\n const { backupSteps, history, timeout } = this.props;\n this.timeoutRef = window.setTimeout(() => {\n this.props.actions.clearErrors();\n history.go(-backupSteps);\n }, timeout);\n }\n\n componentWillUnmount() {\n clearTimeout(this.timeoutRef);\n }\n\n render() {\n return (\n
\n
\n
\n
\n \n
\n
\n
\n )\n }\n\n static defaultProps = {\n backupSteps: 1,\n timeout: defaultTimeout\n }\n\n static propTypes = {\n backupSteps: PropTypes.number, // the number of steps to backup after the error message times out\n timeout: PropTypes.number // the amount of time to wait before allowing retry\n }\n}\n\nexport default withRouter(Waiver.connect(SystemError));","import React, { Component } from 'react'\nimport './Loading.scss'\n\nexport default class Loading extends Component {\n\n getContainer = () => document.querySelector('.Layout');\n\n componentDidMount() {\n let ct = this.getContainer();\n if (ct) ct.classList.add('loading');\n }\n\n componentWillUnmount() {\n let ct = this.getContainer();\n if (ct) ct.classList.remove('loading');\n }\n\n render() {\n return (\n
\n
\n
\n
\n
\n
\n )\n }\n}","/**\n * Guaranteed to return an object with firstName and lastName\n * @param {object} flyerDetail\n */\nexport function parseName(flyerDetail = {}) {\n let { firstName = '', lastName = '', name = '' } = flyerDetail;\n if (name && !firstName) {\n [firstName, lastName] = name.split(' ', 2);\n }\n\n return { firstName, lastName };\n}\n\nexport function parseDate(birthYear, birthMonth, birthDay, strict = true) {\n const result = new Date();\n\n try {\n birthYear = parseInt(birthYear);\n birthMonth = parseInt(birthMonth);\n birthDay = parseInt(birthDay);\n\n // pre-load the date to a 31-day month in order to avoid unwanted date errors because of month / day combinations\n result.setMonth(0);\n\n // set the year first in case of leap-year\n result.setFullYear(birthYear);\n result.setDate(birthDay);\n result.setMonth(birthMonth - 1);\n\n // strict handles cases where we enter a date and JS interpolates it into some other plausible date,\n // e.g. 01/32/1900 => 02/01/1900\n if (strict) {\n if (\n result.getFullYear() !== birthYear ||\n result.getMonth() !== birthMonth - 1 ||\n result.getDate() !== birthDay\n ) {\n throw new Error('Improper date: ', birthYear, birthMonth, birthDay);\n }\n }\n\n return result;\n } catch (error) {\n throw new Error('Invalid date: ', 'error', error);\n }\n}\n\n/**\n * Calculate a person's age from their birthday\n * @param {string} birthDate\n */\nexport function calculateAge(birthDate) {\n if (!birthDate) {\n return undefined;\n } else {\n if (!birthDate instanceof Date) {\n birthDate = new Date(birthDate);\n }\n var today = new Date();\n var age = today.getFullYear() - birthDate.getFullYear();\n var m = today.getMonth() - birthDate.getMonth();\n if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {\n age--;\n }\n return age;\n }\n}\n\n// borrowed from https://tylermcginnis.com/validate-email-address-javascript/\nexport function emailIsValid(email) {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n}","import React, { Component } from 'react'\nimport UiContext from 'util/Context'\n\n/**\n * If the context indicates that we are running in a kiosk, wrap the content\n * in a div that has a class name \"kiosk\"\n */\nexport default class KioskWrapper extends Component {\n render() {\n const { children, className = 'kiosk' } = this.props;\n\n return this.context.isKiosk ? (\n
{children}
\n ) : (\n <>{children}\n );\n }\n\n static contextType = UiContext;\n}","import React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport I18n, { i18n, localize } from 'locale/I18n'\nimport { withRouter } from 'react-router'\nimport Waiver from 'redux/modules/waiver'\nimport Modal from 'react-modal'\nimport KioskWrapper from '../misc/KioskWrapper'\n\nclass StartOverButton extends Component {\n state = {\n isOpen: false\n }\n \n defaultStartOver = evt => {\n evt.preventDefault();\n this.props.actions.startOver();\n this.props.history.push('/');\n }\n\n dismiss = () => {\n if (this.state.isOpen) {\n this.setState({\n ...this.state,\n isOpen: false\n });\n }\n }\n\n open = () => {\n if (!this.state.isOpen) {\n this.setState({\n ...this.state,\n isOpen: true\n });\n }\n }\n\n onStartOverConfirm = evt => {\n const { confirm = true, onStartOver = this.defaultStartOver } = this.props;\n evt.preventDefault();\n\n if (confirm) {\n this.open();\n } else {\n // no confirmation, go straight to startover\n onStartOver(evt);\n }\n }\n\n render() {\n const {\n mode = '',\n className = 'btn-tertiary',\n tabIndex = 999\n } = this.props;\n const { onStartOver = this.defaultStartOver } = this.props;\n const { isOpen } = this.state;\n\n const button =\n mode === 'wizard' ? (\n \n \n \n ) : (\n
\n \n \n \n \n \n \n
\n );\n return <>\n {button}\n \n \n {/* we use KioskWrapper because the modal exists outside of the application root node */}\n
\n

\n \n

\n
\n \n \n \n \n
\n
\n
\n
\n \n }\n\n static propTypes = {\n confirm: PropTypes.bool, // If false, we do not confirm\n mode: PropTypes.string, // specify \"wizard\" or not\n onStartOver: PropTypes.func, // A custom startover function, if desired\n tabIndex: PropTypes.number // tabIndex if any\n }\n}\n\nexport default withRouter(localize(Waiver.connect(StartOverButton)));\n\nconst popupStyle = {\n content: {\n top: '50%',\n left: '50%',\n right: 'auto',\n bottom: 'auto',\n marginRight: '-50%',\n transform: 'translate(-50%, -50%)'\n },\n overlay: {\n backgroundColor: '#333'\n }\n};","import React from 'react'\nimport I18n from 'locale/I18n'\n\nconst WELCOME = \n\nconst Heading = props =>\n
\n
\n
\n

\n { props.title || WELCOME }\n

\n <>\n {props.isKiosk && \n

{props.tunnelCode}

\n }\n \n
\n
\n\nexport default Heading;","import React, { Component } from 'react'\nimport Modal from 'react-modal'\nimport { withRouter } from 'react-router'\nimport Waiver from 'redux/modules/waiver'\nimport I18n from 'locale/I18n'\nimport UiContext from 'util/Context'\nimport { PropTypes } from 'prop-types'\nimport StartOverButton from '../buttons/StartOverButton'\nimport KioskWrapper from './KioskWrapper'\n\nconst TIMEOUT_DELAY_DEFAULT = 2 * 60000;\nconst RESTART_DELAY = 60000;\n\nclass TimeoutModal extends Component {\n static contextType = UiContext;\n\n constructor(props) {\n super(props);\n this.timeout = undefined;\n\n this.state = {\n timedOut: false,\n dismissed: false\n };\n }\n\n /**\n * Starts the timeout timer on the kiosk\n */\n startTimeout = () => {\n let { timeoutDelay = TIMEOUT_DELAY_DEFAULT } = this.props;\n this.setState({\n ...this.state,\n timedOut: false\n });\n this.timeout = window.setTimeout(this.triggerTimeout, timeoutDelay);\n }\n\n /**\n * Trigger the timeout modal\n */\n triggerTimeout = () => {\n this.setState({\n ...this.state,\n timedOut: true,\n dismissed: false\n });\n this.timeout = window.setTimeout(this.startOver, RESTART_DELAY);\n }\n\n /**\n * Reset the timeout timer on the kiosk\n */\n dismiss = () => {\n clearTimeout(this.timeout);\n this.startTimeout();\n\n if (!this.state.dismissed) {\n this.setState({\n ...this.state,\n dismissed: true\n });\n }\n }\n\n componentDidMount() {\n if (this.isEnabled()) {\n this.startTimeout();\n for (let event of resetEvents) {\n window.addEventListener(event, this.dismiss);\n }\n }\n }\n\n componentWillUnmount() {\n if (this.isEnabled()) {\n clearTimeout(this.timeout);\n for (let event of resetEvents) {\n window.removeEventListener(event, this.dismiss);\n }\n }\n }\n\n /**\n * Determine if the timeout modal is enabled at all. Currently only \n * enabled if kiosk mode is on.\n */\n isEnabled = () => this.context.isKiosk;\n\n /**\n * Start the session over\n */\n startOver = () => {\n if (!this.state.dismissed) {\n this.props.actions.startOver();\n this.props.history.push('/');\n }\n };\n\n render() {\n let { confirm } = this.props;\n let { dismissed, timedOut } = this.state;\n\n return this.isEnabled() ? (\n {\n this.timeout = setTimeout(this.startOver, RESTART_DELAY);\n }}\n onRequestClose={this.dismiss}\n style={popupStyle}\n >\n \n {/* we use KioskWrapper because the modal exists outside of the application root node */}\n
\n

\n \n

\n

\n \n

\n
\n \n \n
\n
\n
\n \n ) : (\n <>\n );\n }\n\n static propTypes = {\n confirm: PropTypes.bool, // whether or not the embedded start-over button should ask for confirmation\n timeoutDelay: PropTypes.number // the amount of time to wait until the timeout pops up\n }\n}\n\nexport default withRouter(Waiver.connect(TimeoutModal));\n\nconst popupStyle = {\n content: {\n top: '50%',\n left: '50%',\n right: 'auto',\n bottom: 'auto',\n marginRight: '-50%',\n transform: 'translate(-50%, -50%)'\n },\n overlay: {\n backgroundColor: '#333'\n }\n};\n\nconst resetEvents = [\n 'blur',\n 'click',\n 'focus',\n 'keydown',\n 'keyup',\n 'mouseenter',\n 'pointerdown',\n 'pointerenter',\n 'pointerover',\n 'pointerup',\n 'scroll',\n 'touchend',\n 'touchstart'\n];","import { PropTypes } from 'prop-types'\nimport React, { Component } from 'react'\nimport { withRouter } from 'react-router'\nimport { createSelector } from 'reselect'\nimport I18n, { i18n, localize } from 'locale/I18n'\nimport User from 'redux/modules/user'\nimport WaiverModule, { getFlyers } from 'redux/modules/waiver'\nimport UiContext from 'util/Context'\nimport { parseName } from 'util/UserInfo'\nimport StartOverButton from './buttons/StartOverButton'\nimport Heading from './Heading'\nimport SystemError from './misc/error/SystemError'\nimport Loading from './misc/loading/Loading'\nimport TimeoutModal from './misc/TimeoutModal'\nimport { waiverSourceKey } from 'locale/I18n'\n\nclass Confirmation extends Component {\n static contextType = UiContext;\n timeout = undefined;\n\n componentDidMount() {\n let { user } = this.props;\n\n if (!user.details) {\n this.props.history.push(this.props.onPrevious);\n }\n\n let { isKiosk, tunnel: tunnelCode } = this.context;\n\n if (isKiosk) {\n this.timeout = setTimeout(function (actions, history) {\n let path = (tunnelCode) ? '/kiosk/' + tunnelCode : '/';\n window.location = path;\n }, 30000, this.props.actions, this.props.history);\n\n }\n }\n\n componentWillUnmount() {\n clearTimeout(this.timeout);\n }\n\n render() {\n let { isKiosk, tunnel: tunnelCode } = this.context;\n\n let {\n waiver: {\n error,\n isLoading,\n session: { data: { waiverSource } }\n }\n } = this.props;\n\n const flyers = getFlyers(this.props);\n\n return error ? (\n \n ) : isLoading ? (\n \n ) : (\n <>\n
\n \n
\n
\n

\n \n

\n
\n

\n :\n

\n
    \n {flyers.map(({ details }, index) => {\n let { firstName, lastName } = parseName(details);\n return (\n
  • \n {firstName} {lastName}\n
  • \n );\n })}\n
\n
\n
\n \n
\n
\n
\n
\n \n \n );\n }\n\n static propTypes = {\n user: PropTypes.object.isRequired,\n waiver: PropTypes.object.isRequired,\n onPrevious: PropTypes.string.isRequired\n }\n}\n\nconst selector = createSelector(\n User.selector.default,\n WaiverModule.selector.default,\n (user, waiver) => ({\n user,\n waiver\n })\n);\n\nexport default withRouter(localize(WaiverModule.connect(Confirmation, selector)));","import classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport React, { Component } from 'react'\nimport { withRouter } from 'react-router'\nimport I18n from 'locale/I18n'\n\nclass GoBackButton extends Component {\n defaultGoBack = () => {\n this.props.history.goBack();\n };\n\n handleClick = (evt) => {\n const { disabled, onPress } = this.props;\n if (!disabled) {\n if (onPress) {\n onPress(evt, this.defaultGoBack);\n } else {\n this.defaultGoBack(evt);\n }\n }\n };\n\n render() {\n const { className, disabled, tabIndex } = this.props;\n\n return (\n <>\n \n \n \n \n );\n }\n\n static propTypes = {\n className: PropTypes.string, // the CSS class to apply\n disabled: PropTypes.bool, // if true, the button will be shown but disabled\n onPress: PropTypes.func, // a function to be called when the button is pressed\n tabIndex: PropTypes.number // the tabIndex\n };\n}\n\nGoBackButton.defaultProps = {\n className: 'btn-tertiary',\n disabled: false,\n tabIndex: 999\n};\n\nexport default withRouter(GoBackButton);","import { connect } from 'formik'\nimport React, { Component } from 'react'\n\n/**\n * A customized replacement for Formik's standard Field component\n */\nclass Field extends Component {\n componentDidMount() {\n let {\n name,\n formik: { values, ...form },\n defaultValue\n } = this.props;\n\n if (defaultValue !== undefined && values[name] === undefined) {\n // apply the default value. We have to do it after a timeout\n // because formik doesn't process setFieldValue at this stage of lifecycle\n setTimeout(() => {\n form.setFieldValue(name, defaultValue);\n }, 0);\n }\n }\n\n render() {\n let { children, component, formik: form, name, type = 'text', ...props } = this.props;\n\n const { handleBlur, handleChange, values } = form;\n // also values, setXXXX, handleXXXX, dirty, isValid, status, etc.\n\n const value = values[name];\n return component ? (\n React.createElement(\n component,\n { field: { name, value }, form, type, ...props },\n children\n )\n ) : (\n \n );\n }\n}\n\nexport default connect(Field);","import React, { Component } from 'react'\n\n/**\n * This works around a bug in Formik where selected values are not initialized\n * appropriately.\n */\n\nclass RadioButton extends Component {\n componentDidMount() {\n let {\n field: { name },\n form: { values, ...form },\n defaultValue\n } = this.props;\n\n if (defaultValue !== undefined && values[name] === undefined) {\n // apply the default value. We have to do it after a timeout\n // because formik doesn't process setFieldValue at this stage of lifecycle\n setTimeout(() => {\n form.setFieldValue(name, defaultValue);\n }, 0);\n }\n }\n\n render() {\n let {\n field: { name, ...fieldProps }, // { name, value, onChange, onBlur }\n form: { touched, errors, values }, // also values, setXXXX, handleXXXX, dirty, isValid, status, etc.\n defaultValue,\n id,\n value,\n ...props\n } = this.props;\n\n const currentValue = values[name];\n let checked = false;\n\n if (currentValue !== undefined) {\n // reflect the current form value\n checked = value === currentValue;\n }\n \n return (\n \n \n { RADIO_BUTTON_SVG }\n { touched[name] && errors[name] &&\n
{errors[name]}
\n }\n
\n );\n }\n}\n\nexport default RadioButton;\n\nexport const RADIO_BUTTON_SVG = (\n \n \n \n \n);","import React, { PureComponent } from 'react'\nimport I18n from 'locale/I18n'\nimport { FORM_VALUE_NO, FORM_VALUE_YES } from 'redux/modules/waiver'\nimport { parseName } from 'util/UserInfo'\nimport Field from '../fields/Field'\nimport RadioButton from '../fields/RadioButton'\nimport { generateFieldNameFor } from './FlyingPeople'\n\n/**\n * Emit the \"Is Flying?\"\n * @param {object} props\n */\n\nexport default class FlyingPerson extends PureComponent {\n\n onChange = evt => {\n let { target } = evt,\n { form, flyer, onSetFlying } = this.props;\n \n onSetFlying(flyer.key, target.value);\n form.setFieldValue(target.name, target.value);\n }\n \n render() {\n let { key, details, isFlying } = this.props.flyer,\n fieldName = generateFieldNameFor(key);\n\n // When minors are loaded from the service, they only have a \"name\"\n // field, whereas we collect new minor information via a \"firstName\"\n // and \"lastName\" field.\n let { firstName, lastName } = parseName(details);\n\n return (\n
\n
\n \n
\n
\n
\n \n \n
\n
\n
\n )\n }\n}","import { Form, Formik } from 'formik'\nimport React, { Component } from 'react'\nimport I18n, { i18n, localize } from 'locale/I18n'\nimport GoBackButton from '../buttons/GoBackButton'\nimport StartOverButton from '../buttons/StartOverButton'\nimport memoize from 'memoize-one'\nimport { FORM_VALUE_YES } from 'redux/modules/waiver'\nimport FlyingPerson from './FlyingPerson'\n\n/**\n * Emits the form that checks who is flying and who is not flying\n */\nclass FlyingPeople extends Component {\n \n getInitialValues = memoize(\n keys => {\n let values = {};\n JSON.parse(keys).forEach(\n key => values[generateFieldNameFor(key)] = FORM_VALUE_YES\n );\n return values;\n }\n )\n \n componentDidMount() {\n // because this is a nested component, and the minor waiver may\n // require scrolling, we need to reset the scroll back\n // to the top of the window to ensure this is visible.\n window.scrollTo(0, 0);\n }\n \n render() {\n let { flyers, onAddMinor, onSetFlying, onSubmit } = this.props,\n initialValues = this.getInitialValues(JSON.stringify(flyers.map(f=>f.key)));\n \n return (\n
\n {\n const errors = {};\n\n // make sure at least one person is flying\n const flyer = Object.values(values).find(\n value => value === FORM_VALUE_YES\n );\n if (!flyer) {\n errors.form = i18n('FlyersForm.noFlyers');\n }\n return errors;\n }}\n \n >{form => \n
\n {flyers.map((flyer, index) =>\n \n )}\n\n {\n form.errors.form &&\n
{form.errors.form}
\n }\n\n
\n \n \n \n
\n \n }\n \n
\n );\n }\n}\n\nexport function generateFieldNameFor(key) {\n return `is-flying-${key}`;\n}\n\nexport default localize(FlyingPeople);","export default class StringUtil {\n /**\n * Determine if a string has some non-empty value\n * @param {*} value\n */\n static isEmpty(value = '') {\n return ''.concat(value) === '';\n }\n\n static isNotEmpty(value) {\n return !this.isEmpty(value);\n }\n\n static isBlank(value) {\n return !this.isNotBlank(value);\n }\n\n /**\n * Determine if a string contains non-whitespace values\n * @param {*} value\n */\n static isNotBlank(value = '') {\n return this.isNotEmpty(''.concat(value).trim());\n }\n\n /**\n * Determine if a string contains only numeric characters\n * @param {*} value\n */\n static isNumeric(value) {\n if (typeof value != \"string\") {\n return false;\n }\n\n // Uses type coercion to parse the _entirety_ of the string.\n // parseFloat alone does not do this\n // this method ensures strings of whitespace will fail\n return !isNaN(value) && !isNaN(parseFloat(value));\n }\n}","import React from 'react'\n\n/**\n * Checks if the errors has contains an error for that field, and if so, emit an error message.\n * If `touched` property exists, it will also check to see if the field was touched.\n */\n\nconst FieldError = props => {\n let {\n dirty, // indicates whether the form has been modified\n submitCount, // indicates how many times the form has been submitted\n errors = {},\n fieldName,\n fieldNames = [],\n touched\n } = props;\n \n // don't show anything if the form hasn't been touched or submitted\n if (dirty !== false || submitCount > 0) {\n // normalize fieldNames\n fieldNames = [fieldName, ...fieldNames];\n\n let myErrors = {};\n\n // filter the list of errors for the ones that concern my field(s)\n for (let key of Object.keys(errors)) {\n if (fieldNames.includes(key)) {\n myErrors[key] = errors[key];\n }\n }\n\n // check if a `touched` object was sent that contains all the touched fields,\n // if so check if any given field is both touched and has an error\n let myTouched = {};\n if (touched && typeof touched === 'object') {\n for (let key of Object.keys(touched)) {\n if (fieldNames.includes(key) && errors[key]) {\n myTouched[key] = touched[key];\n break;\n }\n }\n }\n\n return (touched === undefined ||\n touched === true ||\n Object.keys(myTouched).length) &&\n Object.keys(myErrors).length ? (\n
{Object.entries(myErrors)[0][1]}
\n ) : null;\n } else {\n return null;\n }\n}\n\nexport default FieldError;","import { Field, connect } from 'formik'\nimport { PropTypes } from 'prop-types'\nimport React, { Component } from 'react'\nimport I18n, { i18n, localize } from 'locale/I18n'\nimport User from 'redux/modules/user'\nimport StringUtil from 'util/StringUtil'\nimport FieldError from '../fields/FieldError'\n\n/**\n * Emit a \"click to initial\" checkbox\n */\nclass ClickToInitial extends Component {\n\n state = {\n hasSubmitted: false\n }\n \n componentDidUpdate() {\n let { formik } = this.props;\n let { hasSubmitted } = this.state;\n\n if (formik.isSubmitting && !hasSubmitted) {\n this.setState({\n ...this.state,\n hasSubmitted: true\n });\n }\n }\n \n validate = val =>\n val ? undefined : i18n('messages.youMustInitial');\n \n render() {\n let { field: name, formik, query } = this.props,\n { values } = formik;\n\n // we toggle display based on checked status.\n const checked = values[name];\n const initials = query.firstName[0].concat(query.lastName[0]);\n\n return (\n
\n {checked ? (\n
\n
{initials}
\n \n
\n ) : (\n
\n {ARROW_SVG}\n \n \n
\n )}\n
\n );\n }\n\n static propTypes = {\n field: PropTypes.string.isRequired // defines the field that we are setting\n }\n}\n\nexport default connect(localize(User.connect(ClickToInitial)));\n\nexport const ARROW_SVG = (\n \n \n \n \n \n);","import { connect } from 'formik'\nimport { PropTypes } from 'prop-types'\nimport React, { Component } from 'react'\nimport Modal from 'react-modal'\nimport { normalizeValue } from 'redux/modules/waiver'\nimport I18n from 'locale/I18n'\nimport KioskWrapper from '../misc/KioskWrapper'\n\n/**\n * Emit a popup if a given field has a specified value\n */\nclass PopupIf extends Component {\n state = {\n dismissed: false\n }\n\n /**\n * Dismiss the modal\n */\n dismiss = () => {\n this.setState({ ...this.state, dismissed: true });\n }\n\n /**\n * Determine if the field's current value matches the\n * condition to show the popup\n */\n fieldMatches = () => {\n let {\n field,\n formik: { values },\n value\n } = this.props;\n\n return !!(normalizeValue(values[field]) === normalizeValue(value));\n }\n\n render() {\n return (\n \n \n {/* we use KioskWrapper because the modal exists outside of the application root node */}\n
\n {this.props.children}\n\n
\n \n
\n
\n
\n \n )\n }\n\n static propTypes = {\n field: PropTypes.string.isRequired, // defines the field that we are setting\n value: PropTypes.string.isRequired\n }\n}\n\nexport default connect(PopupIf);\n\nconst popupStyle = {\n content: {\n top: '50%',\n left: '50%',\n right: 'auto',\n bottom: 'auto',\n marginRight: '-50%',\n transform: 'translate(-50%, -50%)'\n },\n overlay: {\n backgroundColor: '#333'\n }\n};","import { PropTypes } from 'prop-types'\nimport React, { Component } from 'react'\nimport ReactHtmlParser from 'react-html-parser'\nimport { createSelector } from 'reselect'\nimport User from 'redux/modules/user'\nimport Waiver, { getFlyers, selectFlyingMinors } from 'redux/modules/waiver'\nimport WaiverTransformer from 'util/WaiverTransformer'\n\n/**\n * Emit a list of each minor's waivers, in read-only mode\n */\nclass ReplaceWithMinors extends Component {\n render() {\n const {\n tagName = 'span',\n waiver: { pastResponses = {}, templateMinors = { data: {} }, tunnel }\n } = this.props;\n const minors = selectFlyingMinors(getFlyers(this.props));\n\n return React.createElement(\n tagName,\n null,\n minors.map((minor, index) => {\n // show the past responses if this is a re-waiver\n if (!minor.responses && minor.details.id) {\n minor.responses = pastResponses[minor.details.id];\n }\n return (\n \n );\n })\n );\n }\n\n static propTypes = {\n user: PropTypes.object.isRequired, // from redux\n waiver: PropTypes.object.isRequired // from redux\n }\n}\n\nconst selector = createSelector(\n User.selector.default,\n Waiver.selector.default,\n (user, waiver) => ({\n user,\n waiver\n })\n);\n\nexport default Waiver.connect(ReplaceWithMinors, selector);\n\nfunction OneMinor({ minor: { details, responses }, template, culture }) {\n const templateData = {\n fields: responses,\n options: {\n readOnly: true\n },\n tokens: {\n ...WaiverTransformer.buildTokens(details, culture)\n }\n };\n\n const transformer = new WaiverTransformer(templateData);\n template = transformer.preprocess(template);\n return (\n
\n {ReactHtmlParser(template, {\n transform: transformer.transform\n })}\n
\n );\n}","import { PropTypes } from 'prop-types'\nimport { Component } from 'react'\nimport { createSelector } from 'reselect'\nimport User from 'redux/modules/user'\nimport Waiver, { getFlyers, selectFlyingMinors } from 'redux/modules/waiver'\n\n/**\n * Emit the children of this element ONLY if there are minors flying\n */\nclass ShowIfMinors extends Component {\n render() {\n const { children, user, waiver } = this.props;\n const minors = selectFlyingMinors(getFlyers({ user, waiver }));\n return minors?.length ? children : null;\n }\n\n static propTypes = {\n user: PropTypes.object.isRequired, // from redux\n waiver: PropTypes.object.isRequired // from redux\n }\n}\n\nconst selector = createSelector(\n User.selector.default,\n Waiver.selector.default,\n (user, waiver) => ({\n user,\n waiver\n })\n);\n\nexport default Waiver.connect(ShowIfMinors, selector);","import { connect } from 'formik'\nimport { PropTypes } from 'prop-types'\nimport { Component } from 'react'\nimport { mapMaybeResponse, normalizeValue } from 'redux/modules/waiver'\n\n/**\n * Emit content if a given field has a specified value\n */\nclass ShowIf extends Component {\n render() {\n let {\n field,\n formik: { values },\n readOnly,\n showByDefault,\n response,\n value,\n trackMaybeOnValue\n } = this.props;\n\n const formValue = readOnly\n ? mapMaybeResponse(response, trackMaybeOnValue)\n : mapMaybeResponse(values[field], trackMaybeOnValue);\n\n const shown =\n (showByDefault && formValue === '') || // show if `showByDefault` is set and the value is unset\n formValue === normalizeValue(value); // show if the value is set and it matches the condition\n\n return shown && this.props.children;\n }\n\n static propTypes = {\n field: PropTypes.string.isRequired, // defines the field that we are setting\n readOnly: PropTypes.bool, // if read-only, it will trigger the condition based on the response object,\n // otherwise the condition is triggered based on the current form values\n response: PropTypes.string, // if read-only, this is the response that will be evaluated\n value: PropTypes.string.isRequired, // the value that triggers showing this content\n showByDefault: PropTypes.bool // if the form field is not set, show the content\n }\n}\n\nexport default connect(ShowIf);","import { connect, Field } from 'formik'\nimport { PropTypes } from 'prop-types'\nimport React, { Component } from 'react'\nimport { FORM_VALUE_NO, FORM_VALUE_YES, mapMaybeResponse } from 'redux/modules/waiver'\nimport StringUtil from 'util/StringUtil'\nimport FieldError from '../fields/FieldError'\nimport { RADIO_BUTTON_SVG } from '../fields/RadioButton'\nimport I18n, { i18n, localize } from 'locale/I18n'\n\n/**\n * Emit a Yes/No form element\n */\nclass YesNo extends Component {\n state = {\n changeCount: 0,\n isMaybe: false,\n hasSubmitted: false\n }\n\n componentDidUpdate() {\n let { formik } = this.props;\n let { hasSubmitted } = this.state;\n\n if (formik.isSubmitting && !hasSubmitted) {\n this.setState({\n ...this.state,\n hasSubmitted: true\n });\n }\n }\n\n componentWillUnmount() {\n let { field, formik } = this.props;\n\n // reset the field value because this means it was a conditional field\n // whose condition is no longer satisfied\n formik.setFieldValue(field, '');\n }\n\n trackChanges = (evt, originalHandler) => {\n let { changeCount, isMaybe } = this.state;\n let { trackMaybe, trackMaybeOnValue } = this.props;\n\n if (trackMaybeOnValue) {\n if (changeCount++ > 0) {\n isMaybe = evt.target.value === trackMaybeOnValue;\n\n if (trackMaybe) {\n trackMaybe(evt.target.name, isMaybe);\n }\n }\n\n this.setState(prevState => ({\n ...prevState,\n changeCount,\n isMaybe\n }));\n }\n\n // pass through to the original handler\n originalHandler(evt);\n };\n\n render() {\n let { field, formik, readOnly, response, trackMaybeOnValue } = this.props;\n\n const idYes = `${field}-yes`;\n const idNo = `${field}-no`;\n\n return (\n
\n {readOnly ? (\n i18n(`labels.${mapMaybeResponse(response, trackMaybeOnValue)}`)\n ) : (\n <>\n \n \n \n \n )}\n
\n )\n }\n\n static defaultProps = {\n readOnly: false,\n trackMaybe: false,\n trackMaybeOnValue: FORM_VALUE_NO\n }\n \n static propTypes = {\n field: PropTypes.string.isRequired, // defines the field that we are setting\n readOnly: PropTypes.bool, // if read-only, it will display the response rather than a form field\n response: PropTypes.string, // if read-only, this is the response that will be displayed\n trackMaybe: PropTypes.func, // (field, isMaybe) if supplied, the component will call this function everytime a maybe is possible\n trackMaybeOnValue: PropTypes.string // if supplied, and the user switches between multiple options, and finally decides on the supplied value,\n // then the choice is deemed to be a 'maybe'\n }\n}\n\n/**\n * This field allows us to decorate the onChange function\n * @param {object} params\n */\nfunction TrackableField(props) {\n let {\n onChange = () => {\n throw new Error('Please provide a custom onChange handler');\n },\n field: { onChange: _onChange, value: fieldValue, ...field },\n type = 'radio',\n value,\n trackMaybeOnValue,\n children\n } = props;\n \n fieldValue = mapMaybeResponse(fieldValue, trackMaybeOnValue);\n\n return (\n {\n onChange(evt, _onChange); // custom change handler\n }}\n >\n {children}\n \n )\n}\n\nexport default connect(localize(YesNo));","/*\n Utilty class for tranforming elements using ReactHtmlParser\n*/\n\nimport React from 'react'\nimport { convertNodeToElement } from 'react-html-parser'\n\nclass Transformer {\n /**\n * Constructor\n * @param {*} transformImpl a function that performs the specific implementation for the calling class\n */\n constructor(transformImpl) {\n if (transformImpl) {\n this.transform = transformImpl;\n }\n }\n\n /**\n * The transformation function. This can be specified in the constructor, or\n * overriden in subclasses.\n *\n * We use arrow notation so that ReactHTMLParser can receive this function as\n * an argument, and we want to retain `this` context\n */\n transform = (node, index) => {\n throw new Error('Must specify a transform function');\n };\n\n /**\n * Find all children of a node, by\n * @param {Object} node\n * @param {FindBy} by\n * @param {boolean} recursive\n */\n findChildren(node, by, recursive) {\n const children = node.children || [];\n let found = [].concat(\n ...[\n (children || []).filter(child => by.eval(child)),\n ...(recursive\n ? children.map(child => this.findChildren(child, by, recursive))\n : [])\n ]\n );\n return found;\n }\n\n /**\n * Transform the node's children without rendering the node itself\n * @param {Object} node\n * @param {int} index\n */\n passthrough(node, index) {\n return (\n \n {this.transformChildren(node)}\n \n );\n }\n\n /**\n * Transform the node's children\n * @param {Object} node\n */\n transformChildren(node) {\n if (!!!node.children) return null;\n return node.children.map((child, index) =>\n this.transform.call(this, child, index)\n );\n }\n\n /**\n * The default transformation for a node. Converts the current node\n * directly to an element, and transforms the children.\n * @param {Object} node\n * @param {int} index\n */\n transformDefault(node, index) {\n return convertNodeToElement(node, index, this.transform);\n }\n}\n\nexport default Transformer;\n\n/**\n * Find a node by various strategies\n */\nclass FindBy {\n constructor(value) {\n this.value = value;\n }\n\n eval(node) {\n throw new Error('Implement this method');\n }\n}\n\n/**\n * Find by tag name\n */\nclass FindByTag extends FindBy {\n eval(node) {\n return node.name === this.value;\n }\n}\n\n/**\n * Find by node type\n */\nclass FindByType extends FindBy {\n eval(node) {\n return node.type === this.value;\n }\n}\n\nexport const ByTag = tag => new FindByTag(tag);\nexport const ByType = tag => new FindByType(tag);","import React, { PureComponent } from 'react'\nimport UiContext from 'util/Context'\nimport { PropTypes } from 'prop-types'\n\n/**\n * Emit an HTML link via <a href...>. If the UI is a kiosk,\n * the element will not actually link anywhere.\n *\n * For any other UI context, the link will open in a new window\n * unless you specify a target.\n * @param {Object} props\n * @param {string} props.href The href to link to\n * @param {string} props.target The window target to open a link\n */\nexport default class Link extends PureComponent {\n\n static contextType = UiContext;\n \n render() {\n let { href, target, children, ...props } = this.props,\n { isKiosk } = this.context;\n\n if (isKiosk) return {children}\n\n return {children}\n }\n \n static defaultProps = {\n target: '_blank'\n }\n \n static propTypes = {\n href: PropTypes.string,\n target: PropTypes.string\n }\n}","import React from 'react'\nimport ClickToInitial from 'components/waiver/ClickToInitial'\nimport PopupIf from 'components/waiver/PopupIf'\nimport ReplaceWithMinors from 'components/waiver/ReplaceWithMinors'\nimport ShowIfMinors from 'components/waiver/ShowIfMinors'\nimport ShowIf from 'components/waiver/ShowIf'\nimport YesNo from 'components/waiver/YesNo'\nimport Transformer from './Transformer'\nimport { parseName } from './UserInfo'\nimport Link from 'components/Link'\n\n/**\n * A ReactHTMLParser transformer specialized for transforming\n * Waiver markup\n */\nexport default class WaiverTransformer extends Transformer {\n /**\n * The data object should contain the necessary keys to\n * transform the document. The expected keys are:\n *\n * - full_name\n * - date_of_birth\n *\n * The transformer will modify the data object with:\n * - one additional key for each form field that it\n * discovered in the waiver template\n * - blockers: an object that contains all the form fields that\n * can block submission of the waiver, such as an injury\n *\n * @param {object} data\n */\n constructor(data) {\n super();\n this.data = data;\n this.options = data.options || {};\n\n for (let key of ['blockers', 'fields', 'initials', 'maybes', 'tokens']) {\n if (!this.data[key]) {\n this.data[key] = {};\n }\n }\n }\n\n /**\n * Preprocess the template before processing\n * @param {string} template\n */\n preprocess(template = '') {\n // remove any comments\n let result = template.replace(commentRegex, '');\n return result;\n }\n\n /**\n * This is the main transform function. This function must conform\n * with the interfaced defined by ReactHTMLParser\n */\n transform = (node, index) => {\n let { attribs } = node;\n\n // this is going to be inserted in another document, so we don't\n // want to insert tags that should not belong in a document body\n switch (node.name) {\n case 'body': {\n return this.passthrough(node, index);\n }\n case 'head': {\n return this.passthrough(node, index);\n }\n case 'html': {\n return this.passthrough(node, index);\n }\n case 'a': {\n return (\n \n {this.transformChildren(node)}\n \n );\n }\n default: {\n if (isEmpty(attribs)) {\n return this.transformDefault(node, index);\n } else {\n if (attribs[dataWaiverFeature]) {\n const field = attribs[dataWaiverField];\n const value = attribs[dataWaiverValue];\n const trackMaybeOnValue = attribs[optionTrackMaybeOnValue];\n\n /**\n * Emit the appropriate component for the specified\n * feature\n */\n switch (attribs[dataWaiverFeature]) {\n case featureInitialToAccept: {\n // in this case, we create a \"click here to initial\" field\n this.addInitials(field);\n return ;\n }\n case featureReplaceWith: {\n const token = attribs[dataWaiverToken];\n\n // in this case, we replace the entire contents of the element\n // with a value from the data object\n const replacement = this.data.tokens[token];\n\n switch (node.name) {\n case 'div':\n return
{replacement}
;\n case 'span':\n return {replacement};\n default:\n throw new Error(`${featureReplaceWith} not supported for tag \"${node.name}\"`);\n }\n }\n case featureReplaceWithMinors: {\n return ;\n }\n case featureSelectYesOrNo: {\n // this represents a yes/no field\n return (\n \n );\n }\n case featureShowConditional: {\n // this represents a conditional block\n\n // determine if this block should be hidden by default, or shown\n const hidden = ''\n .concat(node.attribs.class)\n .toLowerCase()\n .includes('hidden');\n return (\n \n {this.transformDefault(node, index)}\n \n );\n }\n case featureShowConditionalPopup: {\n this.addBlocker(field, value);\n return (\n \n {this.transformDefault(node, index)}\n \n );\n }\n case featureShowIfMinors: {\n return (\n {this.transformDefault(node, index)}\n );\n }\n default: {\n console.warn('UNHANDLED dataWaiverFeature', attribs[dataWaiverFeature]);\n return this.transformDefault(node, index);\n }\n }\n } else {\n return this.transformDefault(node, index);\n }\n }\n }\n }\n };\n\n /**\n * Register a blocking condition on the waiver. If a waiver question is a blocker,\n * the waiver form can validate that the response to that question does not match\n * the blocking value. Example:\n *\n * shoulder-injury-confirm = NO\n *\n * Means that the waiver cannot be submitted if the user answers no to that question\n *\n * @param {string} field\n * @param {string} value\n */\n addBlocker(field, value) {\n this.data.blockers[field] = value;\n }\n\n /**\n * The initials fields that we must validate.\n */\n addInitials(field) {\n this.data.initials[field] = true;\n }\n\n /**\n * Build keys from a flyer detail\n * @param {object} flyerDetail\n */\n static buildTokens(flyerDetail = {}, locale) {\n let { birthYear, birthMonth, birthDay } = flyerDetail;\n let { firstName, lastName } = parseName(flyerDetail);\n let { franchiseCompanyName } = flyerDetail;\n\n let birthDate = undefined;\n if (birthYear) {\n try {\n const date = new Date();\n date.setFullYear(birthYear);\n date.setMonth(birthMonth - 1);\n date.setDate(birthDay);\n birthDate = date.toLocaleDateString(locale, {\n year: 'numeric',\n month: 'numeric',\n day: 'numeric'\n });\n } catch (error) {\n console.error('Couldn\\'t generate birthdate for ', flyerDetail, error);\n }\n }\n return {\n full_name: `${firstName} ${lastName}`,\n date_of_birth: birthDate || '--',\n franchise_company_name: franchiseCompanyName\n };\n }\n\n /**\n * Tracks that a field's status is MAYBE\n * @param {string} field\n */\n trackMaybe = (field, isMaybe = true) => {\n this.data.maybes[field] = isMaybe;\n };\n}\n\nconst commentRegex = /\\[\\[[^\\]]*\\]\\]/g;\n\nconst dataWaiverFeature = 'data-waiver-feature';\nconst dataWaiverField = 'data-waiver-field';\nconst dataWaiverToken = 'data-waiver-token';\nconst dataWaiverValue = 'data-waiver-value';\n\nconst featureInitialToAccept = 'initial-to-accept';\nconst featureReplaceWith = 'replace-with';\nconst featureReplaceWithMinors = 'replace-with-minors';\nconst featureSelectYesOrNo = 'select-yes-or-no';\nconst featureShowConditional = 'show-conditional';\nconst featureShowConditionalPopup = 'show-conditional-popup';\nconst featureShowIfMinors = 'show-minors';\n\nconst optionTrackMaybeOnValue = 'data-track-maybe-on-value';\n\n/**\n * Simple utility function to determine if an object is empty\n * @param {object} obj\n */\nfunction isEmpty(obj) {\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) return false;\n }\n return true;\n}","/**\n * Look for any error messages on the page, and scroll to the highest one found\n */\nexport function scrollToError() {\n // convert a NodeList to an Array\n let error = document.querySelector('.error'),\n header = document.querySelector('header'),\n fieldOffset = 125,\n headerOffset = header ? header.offsetHeight : 0;\n \n if (error) {\n window.scrollBy({\n left: 0,\n // scroll some extra pixels in order to show the offending choice\n top: error.getBoundingClientRect().top - fieldOffset - headerOffset,\n behavior: 'smooth'\n });\n }\n}","import { Form, Formik } from 'formik'\nimport React, { Component } from 'react'\nimport ReactHtmlParser from 'react-html-parser'\nimport { createSelector } from 'reselect'\nimport { i18n, localize } from 'locale/I18n'\nimport Waiver, { mapApiResponsesToForm, normalizeValue } from 'redux/modules/waiver'\nimport { scrollToError } from 'util/DomUtil'\nimport WaiverTransformer from 'util/WaiverTransformer'\nimport GoBackButton from '../buttons/GoBackButton'\nimport Loading from '../misc/loading/Loading'\n\n/**\n * Emit a waiver from a template and data object\n */\nclass MinorWaiver extends Component {\n componentDidMount() {\n let { details, waiver } = this.props;\n if (\n details.id &&\n (!waiver.pastResponses ||\n (!waiver.pastResponses.isLoading && !waiver.pastResponses[details.id]))\n ) {\n this.props.actions.requestPastResponses(details.id);\n }\n }\n\n render() {\n let {\n details,\n template,\n templateData,\n onCancel,\n onSubmit,\n waiver\n } = this.props;\n const transformer = new WaiverTransformer(templateData);\n template = transformer.preprocess(template);\n\n const validate = values => {\n const errors = {};\n\n /*\n When the form template was processed, any popups were registered\n as blockers. If the form data has a value that matches a blocker,\n then we prevent form submission.\n */\n const { blockers } = templateData;\n\n // check each of the blockers.\n for (const blocker of Object.keys(blockers)) {\n if (\n normalizeValue(values[blocker]) === normalizeValue(blockers[blocker])\n ) {\n errors[blocker] = i18n('messages.blocker');\n }\n }\n\n setTimeout(scrollToError, 0);\n\n return errors;\n };\n\n // the pastResponses object has one key per flyer ID\n let { pastResponses = {} } = waiver;\n\n return pastResponses.isLoading ? (\n \n ) : (\n <>\n
\n {template ? (\n \n \n
\n {ReactHtmlParser(template, {\n transform: transformer.transform\n })}\n
\n
\n \n \n
\n \n \n ) : null}\n
\n \n );\n }\n}\n\nconst selector = createSelector(\n Waiver.selector.default,\n waiver => ({ waiver })\n);\n\nexport default localize(Waiver.connect(MinorWaiver, selector));","import StringUtil from 'util/StringUtil'\n\nexport default class DateUtil {\n\n /**\n * Determine if a string represents a valid 4-digit-year\n * @param {*} value\n */\n static isFourDigitYear(value) {\n if (typeof value !== \"string\") {\n return false;\n }\n\n value = value.trim();\n\n if (value.length !== 4) {\n\n return false;\n }\n\n if (StringUtil.isNumeric(value) === false) {\n return false;\n }\n\n let currentYear = (new Date()).getFullYear();\n let providedYear = parseInt(value);\n if (providedYear < 1900 || providedYear > currentYear) {\n return false;\n }\n\n return true;\n }\n}","import React, { Component } from 'react'\nimport I18n from 'locale/I18n'\nimport { connect, Field } from 'formik'\nimport FieldError from './FieldError'\nimport Waiver from 'redux/modules/waiver'\nimport StringUtil from 'util/StringUtil'\n\n/**\n * Emit a set of fields to specify a birthday\n */\nclass Birthdate extends Component {\n handleChange = ({ target: { name, value } }) => {\n let { formik } = this.props;\n\n let maskedValue = maskNonNumeric(value);\n formik.setFieldValue(name, maskedValue);\n\n if (autoAdvanceLengths[name] <= maskedValue.length) {\n // find the parent form\n const currentField = document.querySelector(`#${name}`);\n const form = currentField.closest('form');\n\n // find the next field by tabIndex\n // we use the spread operator to convert an HtmlElementCollection to an Array\n const fields = [...form.getElementsByTagName('input')]\n .filter(field => field.tabIndex > currentField.tabIndex)\n .sort((a, b) => a.tabIndex - b.tabIndex);\n\n const nextField = fields.shift();\n\n // This prevents most react race conditions related to losing focus before\n // state is updated, causing an out-of-order rerender\n setTimeout(() => {\n nextField && nextField.focus();\n }, 100);\n }\n }\n\n render() {\n let { autoFocus, formik, tunnel = {}, tabIndex } = this.props;\n const dateFieldLocations = determineDateFieldLocations(tunnel.defaultLanguageTag);\n\n if (StringUtil.isNotBlank(tabIndex)) {\n try {\n tabIndex = parseInt(tabIndex);\n } catch (error) {\n console.warn('Couldn\\'t parse tabIndex', tabIndex);\n tabIndex = null;\n }\n }\n\n /*\n Dynamically generate the date fields in the correct order\n for the language of the waiver.\n */\n const dateFields = new Array(3);\n dateFields[dateFieldLocations.birthYear] =\n \n\n dateFields[dateFieldLocations.birthMonth] =\n \n \n dateFields[dateFieldLocations.birthDay] =\n \n\n return (\n
\n \n \n
\n );\n }\n}\n\nexport default connect(Waiver.connect(Birthdate));\n\n/**\n * Format a date to the short form of the current browser locale format\n * @param {Date} date\n */\nfunction formatDate(date, ...locales) {\n return date.toLocaleDateString(...locales, {\n year: 'numeric',\n month: 'numeric',\n day: 'numeric'\n });\n}\n\n/**\n * Determine the locations for the date fields, based on the given locales\n */\nfunction determineDateFieldLocations(...locales) {\n // because we don't know the locale format, we use a quick hack to determine the format\n const sampleDate = new Date('12/31/1999');\n const sampleFormatted = formatDate(sampleDate, ...locales);\n const sampleDateParts = splitDate(sampleFormatted);\n\n const birthYear = findDatePart(sampleDateParts, '1999', '99');\n const birthMonth = findDatePart(sampleDateParts, '12');\n const birthDay = findDatePart(sampleDateParts, '31');\n\n return {\n birthYear,\n birthMonth,\n birthDay\n };\n}\n\nconst dateSeparator = '/';\n\nfunction splitDate(dateStr) {\n return dateStr.replace(/[^\\d]+/g, dateSeparator).split(dateSeparator);\n}\n\nfunction findDatePart(parts, ...part) {\n for (let i = 0; i < parts.length; i++) {\n for (let segment of part) {\n if (parts[i] === segment) return i;\n }\n }\n console.warn('Could not find part', part, 'in', parts);\n return -1;\n}\n\nexport const DEFAULT_FIELD_NAME = 'birthDate';\n\n/*\n If the value of this field exceeds this, we can auto-advance\n*/\nconst autoAdvanceLengths = Object.freeze({\n birthYear: 4,\n birthMonth: 2,\n birthDay: 2\n});\n\n/**\n * Mask non-numeric fields\n * @param {string} input\n */\nfunction maskNonNumeric(input) {\n const mask = /[^\\d]+/;\n return input.replace(mask, '');\n}","import Kiosk from '@ifly/react-kiosk-keyboard'\nimport { Form, Formik } from 'formik'\nimport React, { Component } from 'react'\nimport I18n, { i18n, localize } from 'locale/I18n'\nimport UiContext from 'util/Context'\nimport { calculateAge, parseDate } from 'util/UserInfo'\nimport DateUtil from 'util/DateUtil'\nimport StringUtil from 'util/StringUtil'\nimport GoBackButton from '../buttons/GoBackButton'\nimport Birthdate from '../fields/Birthdate'\nimport Field from '../fields/Field'\nimport FieldError from '../fields/FieldError'\n\nconst initialValues = {\n firstName: '',\n lastName: '',\n birthYear: '',\n birthMonth: '',\n birthDay: ''\n};\n\n/**\n * Emit the form that gathers personal info about the minor\n * @param {object} props\n */\nclass MinorDetail extends Component {\n static contextType = UiContext;\n \n render() {\n let { birthDateOnly, details, onCancel, onSubmit } = this.props;\n const formId = 'flyer-info';\n\n const { isKiosk } = this.context;\n\n // if birthDateOnly, this means that the waiver returned a minor with a null birthday.\n // we will only allow the user to enter a birthday.\n\n return <>\n
\n {\n const errors = {};\n\n const { birthYear, birthMonth, birthDay } = values;\n if (StringUtil.isNotBlank(birthYear) && !DateUtil.isFourDigitYear(birthYear)) {\n errors.birthDay = i18n('messages.invalidDate');\n }\n if (\n StringUtil.isNotBlank(birthYear) &&\n StringUtil.isNotBlank(birthMonth) &&\n StringUtil.isNotBlank(birthDay)\n ) {\n try {\n const birthDate = parseDate(birthYear, birthMonth, birthDay);\n\n // give the user a chance to enter the full birth year\n if (birthYear > 999) {\n const age = calculateAge(birthDate);\n\n if (age < 3) {\n errors.birthDay = i18n('messages.tooYoungToFly');\n } else if (age > 17) {\n errors.birthDay = i18n('messages.mustBeMinor');\n }\n }\n } catch (error) {\n errors.birthDay = i18n('messages.invalidDate');\n }\n }\n\n // other required fields\n for (let requiredField of [\n 'birthYear',\n 'birthMonth',\n 'birthDay',\n 'firstName',\n 'lastName'\n ]) {\n if (StringUtil.isBlank(values[requiredField])) {\n errors[requiredField] = i18n('messages.valueRequired');\n }\n }\n\n return errors;\n }}\n \n >{form => <>\n
\n

\n \n

\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n
\n
\n\n
\n \n \n
\n
\n {isKiosk && }\n }\n
\n \n }\n}\n\nexport default localize(MinorDetail);","import PropTypes from 'prop-types'\nimport React, { Component } from 'react'\nimport WaiverTransformer from 'util/WaiverTransformer'\nimport MinorWaiver from './MinorWaiver'\nimport MinorDetail from './MinorDetail'\nimport { isBirthDateMissing } from 'redux/modules/waiver'\n\n/**\n * Get the minor detail and emit the waiver form for a minor\n */\nclass Minor extends Component {\n constructor(props) {\n super(props);\n\n const { minor: { details, id } = {} } = props;\n\n this.state = {\n // If the minor already has an ID, we can't change him in the system and\n // so we shouldn't show the details form.\n // If a minor has details but no ID, then that means it was preloaded\n // from a reservation.\n detailsSubmitted: !!id,\n details,\n waiver: undefined\n };\n }\n\n handleMinorDetail = (values, other) => {\n this.setState({\n ...this.state,\n details: values,\n detailsSubmitted: true\n });\n }\n\n handleMinorWaiver = (values, templateData) => {\n const { minor = {} } = this.props;\n\n this.props.onComplete({\n minor: {\n ...minor,\n details: this.state.details\n },\n responses: values,\n templateData\n });\n }\n\n handleWaiverCancel = evt => {\n const { minor: { id } = {}, onCancel, rewaiver } = this.props;\n\n if (id || rewaiver) {\n // have to back all the way out, can't edit the details of an\n // existing minor\n onCancel(evt);\n } else {\n this.setState(prevState => ({\n ...prevState,\n detailsSubmitted: false\n }));\n }\n }\n\n render() {\n const { template, culture, onCancel, rewaiver } = this.props;\n let { details, detailsSubmitted } = this.state;\n\n const birthDateMissing = details && isBirthDateMissing(details);\n\n // if the birthdate is missing, we need to ask for it again.\n // otherwise, we can't change details on a rewaiver\n if (detailsSubmitted || (rewaiver && !birthDateMissing)) {\n // waiver expects various tokens\n const templateData = {\n tokens: {\n ...WaiverTransformer.buildTokens(details, culture)\n }\n };\n\n return (\n this.handleMinorWaiver(values, templateData)}\n />\n );\n } else {\n return (\n \n );\n }\n }\n\n static propTypes = {\n culture: PropTypes.string,\n minor: PropTypes.object,\n template: PropTypes.string.isRequired\n }\n}\n\nexport default Minor;","import { PureComponent } from 'react'\n\nfunction handleUnload(evt) {\n evt.preventDefault();\n evt.returnValue = '';\n}\n\n/**\n * This component warns the user when they attempt to unload the page, either by navigating away,\n * refreshing the page, or closing the tab.\n */\nexport default class WarnOnUnload extends PureComponent {\n componentDidMount() {\n window.addEventListener('beforeunload', handleUnload);\n }\n\n componentWillUnmount() {\n window.removeEventListener('beforeunload', handleUnload);\n }\n\n render() {\n return null;\n }\n}","import PropTypes from 'prop-types'\nimport React, { Component } from 'react'\nimport { withRouter } from 'react-router'\nimport { createSelector } from 'reselect'\nimport { i18n, localize } from 'locale/I18n'\nimport User from 'redux/modules/user'\nimport UiContext from 'util/Context'\nimport Waiver, { getFlyers, isNewWaiverRequired, selectFlyingMinors, getParticipants } from 'redux/modules/waiver'\nimport { LOADING_ANIMATION_DELAY } from 'util/Constants'\nimport StartOverButton from './buttons/StartOverButton'\nimport Heading from './Heading'\nimport FlyingPeople from './minors/FlyingPeople'\nimport Minor from './minors/Minor'\nimport SystemError from './misc/error/SystemError'\nimport Loading from './misc/loading/Loading'\nimport TimeoutModal from './misc/TimeoutModal'\nimport WarnOnUnload from './misc/WarnOnUnload'\nimport { isBirthDateMissing } from 'redux/modules/waiver'\n\nclass Flyers extends Component {\n static contextType = UiContext;\n\n state = {\n addingMinor: false\n }\n\n /**\n * Set the 'is flying' state of a flyer\n */\n setFlying = (key, value) => {\n this.props.actions.setIsFlying({ key, value });\n }\n\n /**\n * Establish that we are adding a minor\n */\n addMinor = () => {\n this.setState({\n ...this.state,\n addingMinor: true\n });\n }\n\n handleMinorCancel = (evt, defaultHandler) => {\n this.setState({\n ...this.state,\n rewaiver: undefined,\n addingMinor: false\n });\n }\n\n /**\n * Once a minor is complete, we save it\n */\n handleMinorWaiver = ({ minor, responses, templateData }) => {\n const isNewMinor = !minor.details.id && !minor.details.externalSourceId;\n\n this.props.actions.addMinor({ minor, responses, templateData });\n\n if (isNewMinor) {\n /*\n This is a new minor, so we take the user back to the flyers form in case they want to \n add more minors.\n */\n this.setState(prevState => ({\n ...prevState,\n addingMinor: false\n }));\n } else {\n /*\n These are waivers for minors that are already known to the system at time\n of check-in, either due to a reservation link or because of previous\n minor-parent relationship.\n \n We cycle through the known minors after the user has already entered any new minors\n and after they submit the flyers form.\n */\n this.queueReservationMinor() || this.queueRewaiver() || this.completeWaivers();\n }\n }\n\n /**\n * Handle the final submission of the minors page\n */\n handleSubmit = (values, other) => {\n this.queueReservationMinor() || this.queueRewaiver() || this.completeWaivers();\n }\n \n /*\n check to see if any reservation minors exist. These would be minors who\n don't have an ID and also don't have waiver responses\n */\n queueReservationMinor = () => {\n const { waiver = {} } = this.props;\n\n const { minors = [] } = waiver;\n if (isNewWaiverRequired(waiver)) {\n const reservationMinor = minors.find(\n minor => (!minor.details.id && !minor.responses) || isBirthDateMissing(minor.details)\n );\n\n if (reservationMinor && !this.state.addingMinor) {\n this.setState(prevState => ({\n ...prevState,\n reservationMinor,\n addingMinor: true\n }));\n }\n\n return reservationMinor;\n } else {\n return null;\n }\n }\n\n /**\n * Checks the existing flyers to see if anyone needs to be re-waivered. If so, returns\n * the flyer object that should next be re-waivered\n */\n queueRewaiver = () => {\n const { user, waiver } = this.props;\n const { isExpired: { data: isExpired } = {} } = waiver;\n\n if (isExpired) {\n const flyers = selectFlyingMinors(getFlyers({ user, waiver }));\n\n const minorToRewaiver = flyers.find(\n flyer => !flyer.responses || isBirthDateMissing(flyer.details)\n );\n if (minorToRewaiver) {\n this.setState(prevState => ({\n ...prevState,\n rewaiver: minorToRewaiver,\n isLoading: true // turn the spinner so the user notices a transition\n }));\n\n setTimeout(() => {\n this.setState(prevState => ({\n ...prevState,\n isLoading: false\n }));\n }, LOADING_ANIMATION_DELAY);\n }\n return minorToRewaiver;\n } else {\n return null;\n }\n }\n\n /**\n * Finalize application state for flyers,\n * and move on the next wizard step\n */\n completeWaivers = () => {\n this.props.history.push(this.props.onComplete);\n }\n\n componentDidMount() {\n let { user, waiver } = this.props,\n { tunnel: { code: tunnel } = {}, language } = waiver;\n \n if (tunnel && language && user.details) {\n this.props.actions.requestTemplateMinors({ tunnel, culture: language });\n } else {\n this.props.history.push(this.props.onPrevious);\n }\n }\n\n componentDidUpdate() {\n // check to see if we recently loaded some minors,\n // if so add them to the flyers list\n const { user, waiver: { isExpired } = {} } = this.props;\n const { minors: { isLoading } = {}, details } = user;\n\n if (details && !isLoading && isExpired) {\n this.queueReservationMinor();\n }\n }\n\n render() {\n let {\n user: { minors: { isLoading: minorsIsLoading } = {} },\n waiver: { error: waiverError, templateMinors: { data, ...templateMinors } = {}, tunnel }\n } = this.props;\n\n const isLoading =\n minorsIsLoading || (templateMinors?.isLoading) || this.state.isLoading;\n\n const error = waiverError || templateMinors.error;\n\n let { addingMinor, reservationMinor, rewaiver } = this.state;\n\n let { isKiosk, tunnel: tunnelCode } = this.context;\n\n const flyers = getParticipants(this.props);\n\n return isLoading ? (\n \n ) : error ? (\n \n ) : (\n <>\n \n
\n
\n
\n {!addingMinor && !rewaiver && (\n \n )}\n\n {addingMinor && data && !isLoading && (\n \n )}\n\n {rewaiver && (\n \n )}\n
\n
\n
\n \n \n \n \n );\n }\n\n static propTypes = {\n user: PropTypes.object.isRequired, // the user state, from redux\n waiver: PropTypes.object.isRequired, // the waiver state, from redux\n onComplete: PropTypes.string.isRequired, // callback when complete\n onPrevious: PropTypes.string.isRequired // callback to go to previous\n }\n}\n\nconst selector = createSelector(\n User.selector.default,\n Waiver.selector.default,\n (user = {}, waiver = {}) => ({\n user,\n waiver\n })\n);\n\nexport default withRouter(localize(Waiver.connect(Flyers, selector)));","/**\n * Application-wide constants\n */\n\n/**\n * The time, in milliseconds, for a faux loading spinner delay\n */ \nexport const LOADING_ANIMATION_DELAY = 1000;","import axios from 'axios'\nimport { all, call, put, takeLatest } from 'redux-saga/effects'\nimport { createModule } from '@ifly/redux-modules'\n\nconst Module = createModule({\n name: 'languages',\n actions: {\n requestLanguages: { reducer: false, dispatch: true }, // reduced by saga\n loadingLanguages: {},\n successLanguages: {},\n failureLanguages: {}\n }\n});\n\nexport default Module;\n\nexport class LanguagesSaga {\n static* watcher() {\n yield all([\n takeLatest(Module.constants.requestLanguages, LanguagesSaga.fetchLanguages)\n ]);\n }\n\n /**\n * Fetch languages from the local API\n * @param {Object} action The action being dispatched\n */\n static* fetchLanguages() {\n yield put(Module.actions.loadingLanguages({\n isLoading: true\n }));\n try {\n const response = yield call(axios.get, '/api/Languages');\n yield put(\n Module.actions.successLanguages({\n data: response.data,\n isLoading: false\n })\n );\n } catch (e) {\n yield put(\n Module.actions.failureLanguages({\n error: e.message,\n isLoading: false\n })\n );\n }\n }\n}","import React from 'react'\nimport { i18n, localize } from 'locale/I18n'\n\nconst Svg = React.memo(function Svg({ id, title, ...props }) {\n\n const i18n_sign_waiver = i18n('kiosk.action.new_waiver');\n\n let attr = {\n role: 'img',\n version: '1.1',\n 'aria-hidden': true\n }; // apply default aria-hidden and role attributes\n\n if (title) attr.title = title;\n\n return (<>\n {id==='ifly-logo-box' &&\n \n \n \n \n \n \n \n \n \n \n }\n {id==='sign-waiver' &&\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n }\n );\n});\n\nexport default localize(Svg);","import React, { PureComponent } from 'react'\nimport I18n from 'locale/I18n'\n\nimport classNames from 'classnames';\n\nimport QrCode from 'qrcode.react';\nimport Svg from 'components/common/Svg'\n\nconst logoSvg = \nconst signatureSvg = \n\nexport default class StartPage extends PureComponent {\n \n onClickLanguage = evt => {\n this.props.setLanguage(evt.target.value);\n }\n \n render() {\n let { enterKiosk, language, languageLabels, tunnelCode } = this.props,\n host = window.location.hostname.replace(/-kiosk/,''),\n desktopUrl = `https://${host}/Tunnel/${tunnelCode}?source=qr`;\n \n return (\n
\n
{logoSvg}
\n
\n
\n\n
\n
\n
\n \n
\n
\n
\n { \n this.props.languages?.map(({ code, displayName }) => \n { languageLabels[code] || displayName }\n )\n }\n \n
\n
\n
\n {signatureSvg}\n
\n
\n
\n )\n }\n}","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport Select from 'react-select';\nimport { createSelector } from 'reselect';\nimport I18n, { i18n, localize } from 'locale/I18n';\nimport Languages from 'redux/modules/languages';\nimport Tunnels from 'redux/modules/tunnels';\nimport Waiver from 'redux/modules/waiver';\nimport UiContext from 'util/Context';\nimport Heading from './Heading';\nimport SystemError from './misc/error/SystemError';\nimport Loading from './misc/loading/Loading';\nimport KioskStartPage from 'components/KioskStartPage';\n\nconst flagUrlRoot = 'https://s3-us-west-1.amazonaws.com/cdn.iflyworld.com/images/flags/';\n\nconst flags = {\n de: `${flagUrlRoot}de.svg`,\n en: `${flagUrlRoot}us.svg`,\n es: `${flagUrlRoot}es.svg`,\n fr: `${flagUrlRoot}fr.svg`,\n it: `${flagUrlRoot}it.svg`,\n pt: `${flagUrlRoot}br.svg`,\n zh: `${flagUrlRoot}cn.svg`\n};\n\n/**\n * Maps the given language tag to one of the explicitly defined language\n * bundle keys or English for unrecognized tags. The language tag is case\n * insensitive and may include a dash or underscore.\n *\n * @param {string} locale - The locale code to extract from.\n * @returns {string} A language tag for a defined language bundle.\n */\nfunction extractLanguage(locale) {\n // we only support languages in this app, not locales, so we just look at the first part of the tag\n let tag = (locale || '')\n .toLowerCase()\n .replace(/_/g, '-')\n .split('-', 2)\n .shift();\n return tag;\n}\n\nclass TunnelSelector extends Component {\n static contextType = UiContext;\n\n componentDidMount() {\n this.props.actions.requestLanguages(); // redux/modules/waiver\n\n // preload images for quicker display\n for (let url of Object.values(flags)) {\n let i = new Image();\n i.src = url;\n }\n }\n\n componentDidUpdate() {\n let { language, tunnel } = this.props;\n\n if (tunnel && !language) {\n // set the default language\n let defaultLanguage = parseLanguage(tunnel.defaultLanguageTag);\n if (defaultLanguage) {\n this.setLanguage(defaultLanguage);\n }\n }\n }\n\n handleSelectLanguage = selection => {\n this.setLanguage(selection.value);\n }\n\n handleSelectTunnel = selection => {\n this.setTunnel(selection.value);\n }\n\n handleSubmit = evt => {\n let { onComplete, tunnel = {} } = this.props;\n\n evt.preventDefault();\n if (tunnel.waiverPath) {\n this.props.history.push(onComplete);\n } else {\n window.location = `/api/redirect/${tunnel.code}`;\n }\n };\n\n /**\n * Set the waiver language and the browser locale\n * @param {string} language\n */\n setLanguage = language => {\n let { locale, setLocale } = this.props;\n this.props.actions.setLanguage(language || undefined); // redux/modules/waiver\n \n let extractedLanguage = extractLanguage(language);\n if (language && extractedLanguage !== locale) {\n setLocale(extractedLanguage);\n }\n }\n \n setTunnel = tunnel => {\n let { tunnels } = this.props,\n selectedTunnel = tunnels.find(t => t.code === tunnel);\n this.props.actions.setTunnel(selectedTunnel); // redux/modules/waiver\n }\n\n render() {\n let { tunnels, error, isLoading, language, languages, tunnel } = this.props;\n\n if (isLoading) return \n if (error) return \n\n let { isKiosk, tunnel: contextTunnel } = this.context;\n\n return isKiosk\n ?\n \n :\n
\n \n
\n
\n
\n {\n tunnels && !contextTunnel &&\n \n }\n {\n // tunnels that have no waiverPath will need to be redirected to legacy app, so no point\n // in selecting a language\n tunnel?.waiverPath && languages && (\n \n )}\n {\n tunnel && (language || !tunnel.waiverPath) &&\n
\n \n
\n }\n \n
\n
\n
\n }\n\n static propTypes = {\n language: PropTypes.string, // the selected language\n // languages: PropTypes.array, // the list of supported languages\n tunnel: PropTypes.object, // the selected tunnel\n tunnels: PropTypes.array, // the available tunnels\n onComplete: PropTypes.string.isRequired // the route that we will link to on completion\n };\n}\n\nconst selector = createSelector(\n Languages.selector.default,\n Tunnels.selector.default,\n Waiver.selector.language,\n Waiver.selector.tunnel,\n (languages = {}, tunnels = {}, language, tunnel) => ({\n error: tunnels.error || languages.error,\n isLoading: tunnels.isLoading || languages.isLoading,\n languages: languages.data,\n language,\n tunnel,\n tunnels: tunnels.data\n })\n);\n\nexport default localize(Languages.connect(Waiver.connect(TunnelSelector), selector));\n\n/**\n * Parse just the language portion of a locale code\n * @param {string} locale\n */\nfunction parseLanguage(locale) {\n if (!locale) {\n return locale;\n } else {\n return locale.replace('_', '-').split('-', 1)[0];\n }\n}\n\n/**\n * Emit the languages as a select list\n * @param {object} params\n */\nfunction LanguageSelect({ languages, onChange, value }) {\n if (languages) {\n let options = languages.map(language => ({\n value: language.code,\n label: languageLabels[language.code] || language.displayName\n }));\n\n let styles = {\n option: (styles, { data }) => {\n return {\n ...styles,\n backgroundImage: `url(${flags[data.value]})`,\n paddingLeft: '2.5rem',\n backgroundPositionX: '0.5rem',\n backgroundPositionY: 'center',\n backgroundRepeat: 'no-repeat',\n backgroundSize: '1.5rem'\n };\n }\n };\n\n return <>\n

\n option.value === value)}\n onChange={onChange}\n menuPortalTarget={document.body} // prevent problems with overflow\n />\n ;\n } else {\n console.warn('No languages to display.');\n }\n}\n\n/**\n * Emit a select list of tunnels\n * @param {object} params\n */\nfunction TunnelSelect({ onChange, value, tunnels }) {\n if (tunnels) {\n let options = tunnels.map(tunnel => ({\n value: tunnel.code,\n label: tunnel.displayName\n }));\n\n return <>\n

\n option.value === value)}\n onChange={onChange}\n menuPortalTarget={document.body} // prevent problems with overflow\n />\n ;\n } else {\n console.warn('No tunnels to display.');\n }\n}\n\nconst languageLabels = Object.freeze({\n en: 'English',\n de: 'Deutsch',\n es: 'Español',\n fr: 'Français',\n it: 'Italiano',\n pt: 'Portugués',\n zh: '中文'\n});","export default {\n\n // Canada\n CA: [{\n label: 'Alberta',\n value: 'AB'\n },{\n label: 'British Columbia',\n value: 'BC'\n },{\n label: 'Manitoba',\n value: 'MB'\n },{\n label: 'New Brunswick',\n value: 'NB'\n },{\n label: 'Newfoundland and Labrador',\n value: 'NL'\n },{\n label: 'Northwest Territories',\n value: 'NT'\n },{\n label: 'Nova Scotia',\n value: 'NS'\n },{\n label: 'Nunavut',\n value: 'NU'\n },{\n label: 'Ontario',\n value: 'ON'\n },{\n label: 'Prince Edward Island',\n value: 'PE'\n },{\n label: 'Quebec',\n value: 'QC'\n },{\n label: 'Saskatchewan',\n value: 'SK'\n },{\n label: 'Yukon Territory',\n value: 'YT'\n }],\n\n // United States of America\n US: [{\n label: 'Alabama',\n value: 'AL'\n },{\n label: 'Alaska',\n value: 'AK'\n },{\n label: 'American Samoa',\n value: 'AS'\n },{\n label: 'Arizona',\n value: 'AZ'\n },{\n label: 'Arkansas',\n value: 'AR'\n },{\n label: 'California',\n value: 'CA'\n },{\n label: 'Colorado',\n value: 'CO'\n },{\n label: 'Connecticut',\n value: 'CT'\n },{\n label: 'Delaware',\n value: 'DE'\n },{\n label: 'District Of Columbia',\n value: 'DC'\n },{\n label: 'Federated States Of Micronesia',\n value: 'FM'\n },{\n label: 'Florida',\n value: 'FL'\n },{\n label: 'Georgia',\n value: 'GA'\n },{\n label: 'Guam',\n value: 'GU'\n },{\n label: 'Hawaii',\n value: 'HI'\n },{\n label: 'Idaho',\n value: 'ID'\n },{\n label: 'Illinois',\n value: 'IL'\n },{\n label: 'Indiana',\n value: 'IN'\n },{\n label: 'Iowa',\n value: 'IA'\n },{\n label: 'Kansas',\n value: 'KS'\n },{\n label: 'Kentucky',\n value: 'KY'\n },{\n label: 'Louisiana',\n value: 'LA'\n },{\n label: 'Maine',\n value: 'ME'\n },{\n label: 'Marshall Islands',\n value: 'MH'\n },{\n label: 'Maryland',\n value: 'MD'\n },{\n label: 'Massachusetts',\n value: 'MA'\n },{\n label: 'Michigan',\n value: 'MI'\n },{\n label: 'Minnesota',\n value: 'MN'\n },{\n label: 'Mississippi',\n value: 'MS'\n },{\n label: 'Missouri',\n value: 'MO'\n },{\n label: 'Montana',\n value: 'MT'\n },{\n label: 'Nebraska',\n value: 'NE'\n },{\n label: 'Nevada',\n value: 'NV'\n },{\n label: 'New Hampshire',\n value: 'NH'\n },{\n label: 'New Jersey',\n value: 'NJ'\n },{\n label: 'New Mexico',\n value: 'NM'\n },{\n label: 'New York',\n value: 'NY'\n },{\n label: 'North Carolina',\n value: 'NC'\n },{\n label: 'North Dakota',\n value: 'ND'\n },{\n label: 'Northern Mariana Islands',\n value: 'MP'\n },{\n label: 'Ohio',\n value: 'OH'\n },{\n label: 'Oklahoma',\n value: 'OK'\n },{\n label: 'Oregon',\n value: 'OR'\n },{\n label: 'Palau',\n value: 'PW'\n },{\n label: 'Pennsylvania',\n value: 'PA'\n },{\n label: 'Puerto Rico',\n value: 'PR'\n },{\n label: 'Rhode Island',\n value: 'RI'\n },{\n label: 'South Carolina',\n value: 'SC'\n },{\n label: 'South Dakota',\n value: 'SD'\n },{\n label: 'Tennessee',\n value: 'TN'\n },{\n label: 'Texas',\n value: 'TX'\n },{\n label: 'Utah',\n value: 'UT'\n },{\n label: 'Vermont',\n value: 'VT'\n },{\n label: 'Virgin Islands',\n value: 'VI'\n },{\n label: 'Virginia',\n value: 'VA'\n },{\n label: 'Washington',\n value: 'WA'\n },{\n label: 'West Virginia',\n value: 'WV'\n },{\n label: 'Wisconsin',\n value: 'WI'\n },{\n label: 'Wyoming',\n value: 'WY'\n }]\n};","import PropTypes from 'prop-types'\nimport React, { Component } from 'react'\nimport Select from 'react-select'\nimport { i18n, localize } from 'locale/I18n'\n\n/**\n * The component to render a Formik Field as a ReactAutocomplete\n * @param {object} params\n */\nclass AutocompleteField extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n selectedOption: null\n };\n\n this.selectRef = React.createRef();\n }\n\n handleBlur = event => {\n const { field } = this.props;\n field.handleBlur && field.handleBlur(event);\n this.setState({\n ...this.state\n });\n }\n\n handleChange = selectedOption => {\n const { form, field } = this.props;\n this.setState({ selectedOption }, () => {\n form.setFieldValue(field.name, selectedOption.value);\n });\n }\n\n handleFocus = event => {\n this.setState({\n ...this.state\n });\n }\n\n render() {\n const { field, options, tabIndex } = this.props;\n let { selectedOption } = this.state;\n\n if (!selectedOption) {\n selectedOption = options.find(option => option.value === field.value);\n }\n\n return (\n i18n('messages.noOptions')}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n onChange={this.handleChange}\n options={options}\n tabIndex={tabIndex}\n ref={this.selectRef}\n // Always forcing to Top as it's required for kiosk mode.\n // Website and Iframe also work better with Chrome Autocomplete when the menu is top.\n menuPlacement=\"top\" \n maxMenuHeight={175}\n />\n );\n }\n\n static propTypes = {\n field: PropTypes.object.isRequired, // from Formik\n form: PropTypes.object.isRequired, // from Formik\n options: PropTypes.array.isRequired // an array of name/value objects\n }\n}\n\nexport default localize(AutocompleteField);","import { Form, Formik } from 'formik'\nimport PropTypes from 'prop-types'\nimport React, { Component } from 'react'\nimport { withRouter } from 'react-router'\nimport { createSelector } from 'reselect'\nimport I18n, { i18n, localize } from 'locale/I18n'\nimport User from 'redux/modules/user'\nimport Waiver from 'redux/modules/waiver'\nimport Kiosk from '@ifly/react-kiosk-keyboard'\nimport UiContext from 'util/Context'\nimport Heading from './Heading'\nimport StartOverButton from './buttons/StartOverButton'\nimport TimeoutModal from './misc/TimeoutModal'\nimport CountryCityState from 'countrycitystatejson'\nimport States from 'util/StatesByCountry'\nimport AutocompleteField from './fields/AutocompleteField'\nimport GoBackButton from './buttons/GoBackButton'\nimport SystemError from './misc/error/SystemError'\nimport Field from './fields/Field'\nimport StringUtil from 'util/StringUtil'\nimport FieldError from './fields/FieldError'\nimport WarnOnUnload from './misc/WarnOnUnload'\n\nclass UserAddDetailsForm extends Component {\n static contextType = UiContext;\n\n componentDidMount() {\n let { details, tunnel, language } = this.props;\n\n if (!tunnel || !language || !details) {\n // we should at least have had some base details from the user lookup\n this.props.history.push(this.props.onPrevious);\n }\n }\n\n handleCancel = (event, defaultHandler) => {\n this.props.actions.clearUserDetails();\n defaultHandler(event);\n }\n\n handleSubmit = details => {\n this.props.actions.addUserDetails({\n details: { ...this.props.details, ...details }\n });\n\n this.props.history.push(this.props.onComplete);\n }\n\n renderUserAddDetailsForm = () => {\n const details = this.props.details || {};\n const { isKiosk } = this.context;\n const { tunnel } = this.props;\n\n const initialValues = {\n address1: '',\n address2: '',\n city: '',\n state: '',\n zip: '',\n ...details,\n country:\n details.country || getCountryCodeFromLocale(tunnel.defaultLanguageTag)\n };\n\n return <>\n

\n
\n

\n

\n
\n this.handleSubmit(values) }\n validate={values => {\n const errors = {};\n\n for (let requiredField of [\n 'address1',\n 'city',\n 'state',\n 'zip',\n 'country'\n ]) {\n if (StringUtil.isBlank(values[requiredField])) {\n errors[requiredField] = i18n('messages.valueRequired');\n }\n }\n\n return errors;\n }}\n >{form => <>\n
\n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n \n \n
\n
\n { isKiosk && }\n }\n \n \n }\n\n render() {\n const { tunnel } = this.props;\n\n let { isKiosk, tunnel: tunnelCode } = this.context;\n\n if (!tunnel) return ;\n\n return <>\n
\n \n
\n
{this.renderUserAddDetailsForm()}
\n
\n
\n \n \n ;\n }\n\n static propTypes = {\n user: PropTypes.object, // from redux\n onComplete: PropTypes.string.isRequired\n }\n}\n\nconst selector = createSelector(\n User.selector.default,\n Waiver.selector.language,\n Waiver.selector.tunnel,\n (user = {}, language, tunnel) => ({\n ...user,\n language,\n tunnel\n })\n);\n\nconst formId = 'UserDetails';\n\nexport default withRouter(localize(User.connect(UserAddDetailsForm, selector)));\n\n/**\n * Parse the locale to get a country code\n * @param {string} locale\n */\nfunction getCountryCodeFromLocale(locale = '') {\n const parts = locale.split('-', 2);\n return parts.length === 2 ? parts[1] : null;\n}\n\n/**\n * Generate all the country options\n */\nconst countryOptions = CountryCityState.getCountries()\n .map(country => ({\n value: country.shortName,\n label: country.name\n }))\n .sort((a, b) => (a.label < b.label ? -1 : a.label > b.label ? 1 : 0));\n\n/**\n * Generate the state options for a given country code\n * @param {string} countryCode\n */\nfunction getStatesForCountry(countryCode) {\n if (!countryCode) return [];\n \n let states = States[countryCode];\n\n // for USA/Canada we have unabbreviated states arrays\n if (states) return states;\n \n states = CountryCityState.getStatesByShort(countryCode) || [];\n \n if (states.length) {\n return states.map(value => ({ value, label: value }));\n }\n \n // in some rare cases, e.g. Åland, there are no states defined.\n // in those cases, we just use the country again. Don't use the country\n // code because that may be the same as a state code, and\n // that could throw off some queries downstream\n \n let label = CountryCityState.getCountryByShort(countryCode).name;\n return [{ label, value:label } ];\n}","import PropTypes from 'prop-types'\nimport React, { Component } from 'react'\nimport Input from 'react-phone-number-input/input'\nimport UiContext from 'util/Context'\n\n/**\n * A formik field that handles international phone input and supports Kiosk\n */\nclass PhoneInput extends Component {\n static contextType = UiContext;\n \n constructor(props) {\n super(props);\n\n let previousValue = props.field?.value ?? '';\n this.state = { previousValue };\n \n this.fieldRef = React.createRef();\n }\n\n handleChange = (value='') => {\n let { field, form } = this.props;\n form.setFieldValue(field.name, value);\n\n // for kiosk mode, we need to micro-manage the cursor for times\n // when the phone input field automatically adds delimiters\n if (this.context.isKiosk) {\n let { previousValue } = this.state,\n inputValue = this.fieldRef.current.value || '';\n\n // check if the field value's length has changed by more than one\n // character. If so, that means that delimiters were automatically\n // added or removed.\n if (Math.abs(inputValue.length - previousValue.length) > 1) {\n // we have to set a timeout in order to let the KIOSK handleChange\n // function to finish\n window.setTimeout(() => {\n this.fieldRef.current.selectionStart = inputValue.length;\n this.fieldRef.current.selectionEnd = inputValue.length;\n }, 0);\n }\n\n this.setState(prevState => ({\n ...prevState,\n previousValue: inputValue\n }));\n } else {\n form.handleChange(value);\n }\n }\n\n render() {\n let { defaultCountry, field, form, ...props } = this.props;\n\n return (\n \n );\n }\n\n static defaultProps = {\n defaultCountry: 'US'\n }\n \n static propTypes = {\n field: PropTypes.object.isRequired, // from formik\n form: PropTypes.object.isRequired, // from formik\n defaultCountry: PropTypes.string // the default country if no country code is entered\n }\n}\n\nexport default PhoneInput;","import Kiosk from '@ifly/react-kiosk-keyboard'\nimport classNames from 'classnames'\nimport CountryCityState from 'countrycitystatejson'\nimport { Form, Formik } from 'formik'\nimport PropTypes from 'prop-types'\nimport React, { Component } from 'react'\nimport { isPossiblePhoneNumber } from 'react-phone-number-input'\nimport { withRouter } from 'react-router'\nimport { createSelector } from 'reselect'\nimport I18n, { i18n, localize } from 'locale/I18n'\nimport User from 'redux/modules/user'\nimport Waiver from 'redux/modules/waiver'\nimport { calculateAge, emailIsValid, parseDate } from 'util/UserInfo'\nimport UiContext from 'util/Context'\nimport { scrollToError } from 'util/DomUtil'\nimport DateUtil from 'util/DateUtil'\nimport StringUtil from 'util/StringUtil'\nimport GoBackButton from './buttons/GoBackButton'\nimport StartOverButton from './buttons/StartOverButton'\nimport Birthdate from './fields/Birthdate'\nimport Field from './fields/Field'\nimport FieldError from './fields/FieldError'\nimport PhoneInput from './fields/PhoneInput'\nimport Heading from './Heading'\nimport SystemError from './misc/error/SystemError'\nimport Loading from './misc/loading/Loading'\nimport TimeoutModal from './misc/TimeoutModal'\nimport WarnOnUnload from './misc/WarnOnUnload'\n\nclass UserLookupForm extends Component {\n static contextType = UiContext;\n\n constructor(props) {\n super(props);\n this.keyboard = undefined;\n }\n\n componentDidMount() {\n const { match, tunnel, language } = this.props;\n if (match && (!tunnel || !language)) {\n this.props.history.push(this.props.onPrevious);\n }\n }\n\n componentDidUpdate() {\n const {\n data,\n error,\n history,\n isLoading,\n match,\n onPrevious,\n onComplete,\n onDetailsNeeded,\n tunnel\n } = this.props;\n\n if (match && !isLoading && !error) {\n // if tunnel is not defined, we need to go back\n if (!tunnel) {\n history.push(onPrevious);\n } else if (data !== undefined && (data === false || data.needsAddInfo)) {\n // this means the query did not find a user\n history.push(onDetailsNeeded);\n } else if (data) {\n // looks like we have a user\n history.push(onComplete);\n }\n }\n }\n\n formRenderer = formik => {\n const { tunnel: { defaultLanguageTag } = {} } = this.props;\n const { isKiosk } = this.context;\n\n // set the default country based on the tunnel's defaultLanguageTag\n const defaultCountry = defaultLanguageTag ? defaultLanguageTag.split('-').pop() : 'US';\n const countryName = CountryCityState.getCountries().find(\n country => country.shortName === defaultCountry\n ).name;\n\n return (\n <>\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n \n \n
\n
\n
\n \n \n
\n \n
\n
\n \n \n
\n
\n {isKiosk && }\n \n );\n }\n\n render() {\n const { error, isLoading, query = {} } = this.props;\n let { isKiosk, tunnel: tunnelCode } = this.context;\n\n if (error) {\n return ;\n }\n\n if (isLoading) {\n return ;\n }\n\n return (\n <>\n
\n \n
\n
\n
\n

\n

\n \n

\n

\n \n

\n

\n {\n this.props.actions.requestUserLookup({ query: values });\n }}\n validate={values => {\n const errors = {};\n const { birthYear, birthMonth, birthDay } = values;\n if (StringUtil.isNotBlank(birthYear) && !DateUtil.isFourDigitYear(birthYear)) {\n errors.birthDay = i18n('messages.invalidDate');\n }\n if (\n StringUtil.isNotBlank(birthYear) &&\n StringUtil.isNotBlank(birthMonth) &&\n StringUtil.isNotBlank(birthDay)\n ) {\n try {\n const birthDate = parseDate(birthYear, birthMonth, birthDay, true);\n const age = calculateAge(birthDate);\n if (!age || age < 18) {\n errors.birthDay = i18n('messages.mustBeAdult');\n }\n } catch (error) {\n errors.birthDay = i18n('messages.invalidDate');\n }\n }\n\n if (!emailIsValid(values.email)) {\n errors.email = i18n('messages.invalidEmail');\n }\n\n if (\n StringUtil.isNotBlank(values.phone) &&\n !isPossiblePhoneNumber(values.phone)\n ) {\n errors.phone = i18n('messages.invalidPhone');\n }\n\n // other required fields\n for (let requiredField of [\n 'birthYear',\n 'birthMonth',\n 'birthDay',\n 'firstName',\n 'lastName',\n 'phone'\n ]) {\n if (StringUtil.isBlank(values[requiredField])) {\n errors[requiredField] = i18n('messages.valueRequired');\n }\n }\n\n setTimeout(scrollToError, 0);\n return errors;\n }}\n >{this.formRenderer}\n
\n
\n
\n
\n \n \n \n \n );\n }\n\n static propTypes = {\n tunnel: PropTypes.object, // from redux\n user: PropTypes.object, // from redux\n onComplete: PropTypes.string.isRequired,\n onDetailsNeeded: PropTypes.string.isRequired,\n onPrevious: PropTypes.string.isRequired\n };\n}\n\nconst formId = 'UserLookup';\n\nconst selector = createSelector(\n User.selector.default,\n Waiver.selector.language,\n Waiver.selector.tunnel,\n (user, language, tunnel) => ({\n ...user,\n language,\n tunnel\n })\n);\n\nexport default withRouter(localize(User.connect(UserLookupForm, selector)));","import PropTypes from 'prop-types'\nimport React, { Component } from 'react'\nimport SignatureCanvas from 'react-signature-canvas'\nimport I18n from 'locale/I18n'\n\nexport default class WaiverSignaturePad extends Component {\n constructor(props) {\n super(props);\n this.sigPad = {};\n\n this.state = {\n hasSubmitted: false\n };\n }\n\n componentDidUpdate() {\n let { form } = this.props;\n let { hasSubmitted } = this.state;\n\n if (form.isSubmitting && !hasSubmitted) {\n this.setState({\n ...this.state,\n hasSubmitted: true\n });\n }\n }\n\n /**\n * Record the canvas value to the form field\n */\n recordStroke = () => {\n let { field, form } = this.props;\n const value = this.sigPad.getTrimmedCanvas().toDataURL();\n form.setFieldValue(field.name, value);\n }\n\n render() {\n let { canvasApiRef, field, form } = this.props;\n let { hasSubmitted } = this.state;\n\n const error = form.errors[field.name];\n\n return (\n <>\n
\n \n {\n this.sigPad = ref;\n canvasApiRef && canvasApiRef(ref);\n }}\n />\n {error && hasSubmitted &&
{error}
}\n
\n \n );\n }\n\n static propTypes = {\n field: PropTypes.object.isRequired, // the formik field where the value should be stored\n form: PropTypes.object.isRequired, // the formike form that is the parent of this field\n canvasApiRef: PropTypes.func // provide a ref to the SignatureCanvas API\n }\n}","import { Field, Form, Formik } from 'formik'\nimport React, { Component } from 'react'\nimport ReactHtmlParser from 'react-html-parser'\nimport I18n, { i18n, localize } from 'locale/I18n'\nimport { normalizeValue } from 'redux/modules/waiver'\nimport { scrollToError } from 'util/DomUtil'\nimport WaiverTransformer from 'util/WaiverTransformer'\nimport GoBackButton from './buttons/GoBackButton'\nimport StartOverButton from './buttons/StartOverButton'\nimport TimeoutModal from './misc/TimeoutModal'\nimport WaiverSignaturePad from './WaiverSignaturePad'\nimport WarnOnUnload from './misc/WarnOnUnload'\n\nconst signatureKey = 'signature';\n\n// QA is having trouble automating a signature on their test script,\n// so we allow any signature, even a small dot. This is not awful because\n// the previous Waiver app allowed this all along.\nconst signatureDataMinimumLength = 1;\n\n/**\n * Emit a waiver from a template and data object\n */\nclass WaiverForm extends Component {\n constructor(props) {\n super(props);\n this.sigPad = {};\n }\n\n /**\n * Clear the signature pad\n */\n clear = (evt, form) => {\n this.sigPad.clear();\n form.setFieldValue(signatureKey, undefined);\n evt.preventDefault();\n }\n\n onSubmit = values =>\n this.props.onSubmit(values, this.props.templateData);\n \n render() {\n let { template, templateData } = this.props;\n const transformer = new WaiverTransformer(templateData);\n template = transformer.preprocess(template);\n\n const validate = values => {\n const errors = {};\n const { blockers } = templateData;\n\n /**\n * When the form template was processed, any popups were registered\n * as blockers. If the form data has a value that matches a blocker,\n * then we prevent form submission.\n */\n for (const blocker of Object.keys(blockers)) {\n if (normalizeValue(values[blocker]) === normalizeValue(blockers[blocker])) {\n errors[blocker] = i18n('messages.blocker');\n }\n }\n\n /**\n * Make sure the signature is present\n */\n const signature = values[signatureKey];\n if (signature === undefined || signature.length < signatureDataMinimumLength) {\n errors[signatureKey] = i18n('messages.youMustSign');\n }\n\n setTimeout(scrollToError, 0);\n\n return errors;\n };\n\n const initialValues = {\n ...templateData.fields\n };\n\n return <>\n
\n {!!template ? (\n { form =>\n
\n { /* Apply noValidate because the behavior of radio buttons is overridden in order to style them.\n * As a result, the browser's native validation won't work and instead throws an error */ }\n \n
\n { ReactHtmlParser(template, { transform: transformer.transform }) }\n
\n { props =>\n this.sigPad=ref} />\n }\n
\n \n \n \n
\n
\n }
\n ) : null}\n
\n \n \n \n \n }\n}\n\nexport default localize(WaiverForm);","import { PropTypes } from 'prop-types'\nimport React, { Component } from 'react'\nimport { withRouter } from 'react-router'\nimport { createSelector } from 'reselect'\nimport { i18n, localize } from 'locale/I18n'\nimport User from 'redux/modules/user'\nimport WaiverModule, { getParticipants, isNewWaiverRequired, mapApiResponsesToForm, selectFlyingMinors } from 'redux/modules/waiver'\nimport UiContext from 'util/Context'\nimport WaiverTransformer from 'util/WaiverTransformer'\nimport Heading from './Heading'\nimport SystemError from './misc/error/SystemError'\nimport Loading from './misc/loading/Loading'\nimport WaiverForm from './WaiverForm'\n\nconst DEV_ALWAYS_BYPASS_WAIVER = false;\n\nclass Waiver extends Component {\n static contextType = UiContext;\n \n /**\n * Check in the current flyer(s) with the previously existing waiver\n */\n checkIn = () => {\n // move them on to check-in\n this.props.actions.checkIn();\n }\n\n componentDidMount() {\n let { history, match, flyers, user, waiver } = this.props;\n if (match && !(flyers.length && user?.details)) {\n history.push(this.props.onPrevious);\n } else {\n // get the waiver template. Previously we tried to make this\n // conditional, but there are really so many individual cases\n // that could break whenever the back-end changed its logic.\n // So to avoid that, we get the template unconditionally.\n let { tunnel: { code: tunnel } = {}, language: culture } = waiver;\n this.props.actions.requestTemplate({ tunnel, culture });\n }\n }\n\n componentDidUpdate() {\n let { waiver, user, newWaiverRequired, isLoading, error } = this.props;\n let {\n checkIn,\n submit\n } = waiver;\n\n if (!error && !isLoading) {\n if (newWaiverRequired && !DEV_ALWAYS_BYPASS_WAIVER) {\n if (\n user.data &&\n user.data.id &&\n (!waiver.pastResponses || !waiver.pastResponses[user.data.id])\n ) {\n this.props.actions.requestPastResponses(user.data.id);\n\n // make sure we have the responses for each flying minor\n let { minors, pastResponses = {} } = waiver;\n minors = selectFlyingMinors(minors);\n minors.forEach(minor => {\n minor.responses ||\n pastResponses[minor.details.id] ||\n this.props.actions.requestPastResponses(minor.details.id);\n });\n }\n } else {\n // no new waiver required, so we just checkin. First we have\n // to make sure that a checkin attempt hasn't already started.\n checkIn || this.checkIn();\n }\n\n // check if a waiver was successfully submitted or checked in\n if (submit || checkIn) {\n // move them on to confirmation\n this.props.history.push(this.props.onComplete);\n }\n }\n }\n\n /**\n * Handle a signed waiver by submitting to the API\n */\n onWaiverSign = (values, templateData) => {\n this.props.actions.submitWaiver({ values, templateData });\n }\n\n /**\n * Gets the individual flyer who is an adult\n */\n getAdultParticipant = () => {\n const { flyers } = this.props;\n return Object.values(flyers).find(flyer => !flyer.isMinor);\n }\n\n render() {\n let {\n user: { details },\n waiver = {},\n error,\n isLoading\n } = this.props;\n\n let {\n pastResponses = {},\n tunnel: { defaultLanguageTag: language } = {},\n template: { data } = {}\n } = waiver;\n\n let { isKiosk, tunnel: tunnelCode } = this.context;\n\n if (error) return ;\n\n if (isLoading) return ;\n\n if (tunnelCode === \"VB\") {\n details['franchiseCompanyName'] = \"Indoor Skydiving Virginia, LLC\";\n }\n if (tunnelCode === \"JAX\") {\n details['franchiseCompanyName'] = \"Sky Entertainment Jacksonville, LLC\";\n }\n if (tunnelCode === \"DTM\") {\n details['franchiseCompanyName'] = \"Fly Detroit Indoor Skydiving LLC\";\n }\n if (tunnelCode === \"CBAD\") {\n details['franchiseCompanyName'] = \"T Brook Inc.\";\n }\n if (tunnelCode === \"ELP\") {\n details['franchiseCompanyName'] = \"FLYZONE LLC, dba iFLY El Paso\";\n }\n if (tunnelCode === \"COSP\") {\n details['franchiseCompanyName'] = \"HiFLYght LLC\";\n }\n\n // waiver expects some few tokens\n const templateData = {\n tokens: {\n ...WaiverTransformer.buildTokens(details, language)\n },\n fields: {\n 'is-flying': waiver.userIsFlying,\n ...mapApiResponsesToForm(pastResponses[details.id])\n }\n };\n\n return (\n
\n \n
\n
\n {\n data &&\n \n }\n
\n
\n
\n )\n }\n\n static propTypes = {\n user: PropTypes.object.isRequired,\n waiver: PropTypes.object.isRequired,\n onPrevious: PropTypes.string.isRequired\n }\n\n // List of functionality to add.\n // OrderId integration? NOT MVP\n}\n\nconst selector = createSelector(\n User.selector.default,\n WaiverModule.selector.default,\n (user, waiver) => {\n const newWaiverRequired = isNewWaiverRequired(waiver);\n const flyers = getParticipants({ user, waiver });\n\n const { checkIn = {}, isExpired = {}, pastResponses = {}, submit = {}, template = {} } = waiver;\n\n const error =\n checkIn.error ||\n isExpired.error ||\n pastResponses.error ||\n submit.error ||\n template.error ||\n !flyers.length;\n\n const isLoading =\n !user ||\n !user.details ||\n newWaiverRequired === undefined ||\n isExpired.isLoading ||\n checkIn.isLoading ||\n pastResponses.isLoading ||\n submit.isLoading ||\n template.isLoading;\n\n return {\n user,\n waiver,\n flyers,\n error,\n isLoading,\n newWaiverRequired\n };\n }\n);\n\nexport default withRouter(localize(WaiverModule.connect(Waiver, selector)));","import React, { Component } from 'react'\nimport UiContext from 'util/Context'\nimport SystemError from 'components/misc/error/SystemError'\n\nexport default class Test extends Component {\n static contextType = UiContext;\n\n render() {\n return (\n
\n
\n \n
\n
\n )\n }\n}","import React from 'react'\nimport { Redirect, Route } from 'react-router'\nimport Confirmation from 'components/Confirmation'\nimport Flyers from 'components/Flyers'\nimport TunnelSelector from 'components/TunnelSelector'\nimport UserAddDetailsForm from 'components/UserAddDetailsForm'\nimport UserLookupForm from 'components/UserLookupForm'\nimport Waiver from 'components/Waiver'\nimport Test from 'test/Test'\n\nconst Routes = props => <>\n {/* This route specifies that if the wizard step is '/chooseTunnel', then \n we render the TunnelSelector component, specifying the route that we want\n to link on completion\n */}\n } />\n\n }\n />\n (\n \n )}\n />\n (\n \n )}\n />\n (\n \n )}\n />\n (\n \n )}\n />\n }\n />\n }\n />\n\n {/* Default route */}\n }/>\n\n\nexport default Routes;","import React, { Component } from 'react'\nimport { Helmet } from 'react-helmet'\nimport Layout from 'components/Layout'\nimport SystemError from 'components/misc/error/SystemError'\nimport Loading from 'components/misc/loading/Loading'\nimport WaiverModule, { SESSION_KEEP_ALIVE_INTERVAL } from 'redux/modules/waiver'\nimport Routes from './Routes'\nimport UiContext, { UI_MODE_IFRAME, UI_MODE_KIOSK, UI_MODE_WEB } from 'util/Context'\nimport { contextualize } from 'locale/I18n'\nimport Environment from '@ifly/common-env'\n\nconst env = Environment.selected();\n\nclass App extends Component {\n static contextType = UiContext;\n\n constructor(props) {\n super(props);\n this.state = {\n uiContextValue: {}\n };\n\n this.keepAlive = undefined;\n }\n\n componentDidMount() {\n this.props.actions.requestSession();\n this.keepAlive = setInterval(this.keepSessionAlive, SESSION_KEEP_ALIVE_INTERVAL);\n }\n\n componentDidUpdate() {\n let { session={}, tunnel:{ code:tunnel }={} } = this.props,\n { isIframe, isKiosk, waiverSource } = session.data || {},\n mode = isKiosk ? UI_MODE_KIOSK : isIframe ? UI_MODE_IFRAME : UI_MODE_WEB;\n \n let uiContextValue = { isKiosk, isIframe, mode, tunnel, waiverSource };\n\n if (JSON.stringify(uiContextValue) !== JSON.stringify(this.state.uiContextValue)) {\n this.setState(prevState => ({\n ...prevState,\n uiContextValue\n }));\n }\n }\n\n componentWillUnmount() {\n clearInterval(this.keepAlive);\n }\n\n /**\n * Keep the session alive\n */\n keepSessionAlive = () => {\n const { session: { data } = {} } = this.props;\n if (data) {\n this.props.actions.requestHeartbeat();\n }\n }\n\n render() {\n let { uiContextValue } = this.state,\n { tunnel, session } = this.props, \n { data, error, isLoading } = session || {},\n title = null;\n \n if (env!==Environment.PRODUCTION) {\n if (env===Environment.LOCAL) title = 'Local Waiver'; else\n if (env===Environment.STAGING) title = 'Stg Waiver'; else\n if (env===Environment.DEVELOPMENT) title = 'Dev Waiver';\n \n if (uiContextValue.isKiosk) title += ' Kiosk';\n if (tunnel?.code) title = `${tunnel.code} - ${title}`;\n }\n\n return <>\n {\n title && { title }\n } \n {\n error\n ?\n \n :\n isLoading || data === undefined\n ?\n \n :\n \n \n \n \n \n }\n \n }\n}\n\nexport default contextualize(WaiverModule.connect(App));","import { combineReducers } from 'redux'\nimport Languages from './modules/languages'\nimport Tunnels from './modules/tunnels'\nimport User from './modules/user'\nimport Waiver from './modules/waiver'\n\nexport default combineReducers({\n [Languages.name]: Languages.reducer,\n [Tunnels.name]: Tunnels.reducer,\n [User.name]: User.reducer,\n [Waiver.name]: Waiver.reducer\n});","/*\n We use Redux-Saga to assist in maintaining app state\n https://redux-saga.js.org/\n \n*/\n\nimport { all } from 'redux-saga/effects'\nimport { LanguagesSaga } from './modules/languages'\nimport { TunnelsSaga } from './modules/tunnels'\nimport { UserSaga } from './modules/user'\nimport { WaiverSaga } from './modules/waiver'\n\n\n/**\n * The root saga just consists of the sagas being\n * watched by our various modules\n */\nexport default function* saga() {\n yield all([\n LanguagesSaga.watcher(),\n TunnelsSaga.watcher(),\n UserSaga.watcher(),\n WaiverSaga.watcher()\n ]);\n}","import { applyMiddleware, createStore as _createStore } from 'redux'\nimport createSagaMiddleware from 'redux-saga'\nimport reducer from './reducers'\nimport saga from './sagas'\nimport thunk from 'redux-thunk'\nimport User from './modules/user'\nimport Waiver from './modules/waiver'\n\nconst DEV_PRELOAD_STATE = false;\n\n// FOR DEV PURPOSES ONLY. REMOVE AFTER DEVELOPMENT IS COMPLETE\nconst preloadedState = DEV_PRELOAD_STATE\n ? {\n waiver: {\n ...Waiver.initialState,\n tunnel: { code: 'AUS', defaultLanguageTag: 'en-US' },\n language: 'en'\n // templateMinors: {},\n },\n\n user: {\n ...User.initialState,\n query: {\n firstName: 'JON',\n lastName: 'DOE',\n email: 'test@iflyworld.com',\n birthDay: 11,\n birthMonth: 11,\n birthYear: 2000,\n phone: '+15555555555'\n },\n details: {\n firstName: 'JON',\n lastName: 'DOE',\n email: 'test@iflyworld.com',\n birthDay: 1,\n birthMonth: 8,\n birthYear: 2000,\n phone: '+15125551212',\n\n country: 'US',\n address1: '123 Main ST',\n address2: 'Room 203',\n city: 'Austin',\n state: 'TX',\n zip: '78701'\n }\n }\n }\n : {};\n\n/**\n * Create the redux store, along with all necessary middleware\n */\nexport default function createStore() {\n const sagaMiddleware = createSagaMiddleware();\n const middleware = [thunk, sagaMiddleware];\n\n const finalCreateStore = applyMiddleware(...middleware)(_createStore);\n const store = finalCreateStore(\n reducer,\n preloadedState,\n window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__({ trace: true })\n );\n\n sagaMiddleware.run(saga);\n return store;\n}","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}","// These must be the first lines in src/index.js\nimport 'react-app-polyfill/ie11'\nimport 'react-app-polyfill/stable'\nimport 'env'\n\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport Modal from 'react-modal'\nimport { Provider } from 'react-redux'\nimport { BrowserRouter } from 'react-router-dom'\nimport smoothscroll from 'smoothscroll-polyfill'\nimport App from './App'\nimport createStore from 'redux/create'\nimport * as serviceWorker from './serviceWorker'\nimport './styles/core.scss'\n\nimport polyfillElementClosest from 'element-closest'\n\npolyfillElementClosest(window);\n\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\nconst rootElement = document.getElementById('root');\nconst store = createStore();\n\nModal.setAppElement(rootElement);\n\nReactDOM.render(\n \n \n \n \n ,\n rootElement\n);\n\nserviceWorker.unregister();\nsmoothscroll.polyfill();","import { createModule } from '@ifly/redux-modules'\nimport { deepMergeReducer, replacementReducer } from '@ifly/redux-modules/reducers'\nimport axios from 'axios'\nimport Qs from 'qs'\nimport { all, call, put, select, takeEvery, takeLatest } from 'redux-saga/effects'\nimport UserModule, { UserSaga } from './user'\n\nconst DEV_ALWAYS_EXPIRE_WAIVER = false;\nconst DEV_ALWAYS_REQUIRE_NEW_WAIVER = false;\nconst DEV_ALWAYS_SUCCEED_WAIVER = false;\nconst DEV_ALWAYS_SUCCEED_CHECKIN = false;\n\nexport const FORM_VALUE_MAYBE = 'MAYBE';\nexport const FORM_VALUE_NO = 'NO';\nexport const FORM_VALUE_YES = 'YES';\n\nexport const SOURCE_EVENT_PLANNER = 'EVNT_PLAN';\nexport const SOURCE_KIOSK = 'KIOSK';\nexport const SOURCE_KIOSK_TUNNEL_OVERRIDE = 'KIOSK_T';\nexport const SOURCE_WEB = 'WEB';\n\nconst DEV_FORCE_KIOSK_MODE = false;\n\nconst overrideSessionData = DEV_FORCE_KIOSK_MODE\n ? Object.freeze({\n isKiosk: true,\n tunnel: {\n code: 'AUS',\n name: 'iFLY Austin',\n displayName: 'Austin',\n waiverPath: 'UnitedStates/v1.0/US-waiver.md',\n defaultLanguageTag: 'en-US'\n },\n // tunnel: {\n // code: \"CALG\",\n // name: \"iFLY Calgary\",\n // displayName: \"Calgary\",\n // waiverPath: \"Canada/v1.0/Canada-waiver.md\",\n // defaultLanguageTag: \"en-CA\"\n // },\n waiverSource: SOURCE_KIOSK\n })\n : Object.freeze({});\n\n// used to uniquely identify a participant as the user\nconst userKey = '__USER__';\n\nlet minorKeyCounter = 0;\n\nconst name = 'waiver';\nconst Module = createModule({\n name: name,\n actions: {\n addMinor: { reducer: false, dispatch: true }, // reduced by saga\n addMinorSucceeded: {},\n updateMinors: {},\n\n checkIn: { reducer: false, dispatch: true }, // reduced by saga\n checkInLoading: {},\n checkInSucceeded: {},\n checkInFailed: {},\n\n clearState: { reducer: replacementReducer },\n clearErrors: { reducer: false, dispatch: true }, // reduced by saga\n\n loadingExpired: {},\n successExpired: {},\n failureExpired: {},\n\n requestPastResponses: { args: ['id'], reducer: false, dispatch: true }, // reduced by saga\n loadingPastResponses: { reducer: deepMergeReducer },\n successPastResponses: { reducer: deepMergeReducer },\n failurePastResponses: { reducer: deepMergeReducer },\n\n requestTemplate: { reducer: false, dispatch: true }, // reduced by saga\n loadingTemplate: {},\n successTemplate: {},\n failureTemplate: {},\n \n requestTemplateMinors: { reducer: false, dispatch: true }, // reduced by saga\n loadingTemplateMinors: {},\n successTemplateMinors: {},\n failureTemplateMinors: {},\n\n requestHeartbeat: { reducer: false, dispatch: true }, // reduced by saga\n loadingHeartbeat: {},\n successHeartbeat: {},\n failureHeartbeat: {},\n\n setIsFlying: { reducer: false, dispatch: true }, // reduced by saga\n successIsFlying: {},\n\n setLanguage: { args: ['language'], reducer: false, dispatch: true }, // reduced by saga\n successLanguage: {},\n\n setTunnel: { args: ['tunnel'], dispatch: true },\n\n startOver: { reducer: false, dispatch: true }, // reduced by saga\n startOverComplete: {},\n\n requestSession: { reducer: false, dispatch: true }, // reduced by saga\n loadingSession: {},\n successSession: {},\n failureSession: {},\n\n submitWaiver: { reducer: false, dispatch: true }, // reduced by saga\n savingWaiver: {},\n successWaiver: {},\n failureWaiver: {},\n\n updateState: {}\n },\n initialState: {\n language: undefined,\n minors: undefined,\n tunnel: undefined,\n isExpired: undefined,\n pastResponses: undefined,\n userIsFlying: FORM_VALUE_YES\n },\n selector: {\n language: state => state[name].language,\n tunnel: state => state[name].tunnel\n }\n});\n\nexport default Module;\n\nexport class WaiverSaga {\n static* watcher() {\n yield all([\n takeLatest(Module.constants.addMinor, WaiverSaga.addMinor),\n takeLatest(Module.constants.checkIn, WaiverSaga.checkIn),\n takeLatest(Module.constants.clearErrors, WaiverSaga.clearErrors),\n takeEvery(Module.constants.requestPastResponses, WaiverSaga.fetchPastResponses),\n takeLatest(Module.constants.requestTemplate, WaiverSaga.fetchTemplate),\n takeLatest(Module.constants.requestTemplateMinors, WaiverSaga.fetchTemplateMinors),\n takeLatest(Module.constants.requestHeartbeat, WaiverSaga.keepSessionAlive),\n takeLatest(Module.constants.setIsFlying, WaiverSaga.updateIsFlying),\n takeLatest(Module.constants.setLanguage, WaiverSaga.updateLanguage),\n takeLatest(Module.constants.startOver, WaiverSaga.startOver),\n takeLatest(Module.constants.requestSession, WaiverSaga.startSession),\n takeLatest(Module.constants.submitWaiver, WaiverSaga.saveWaiver)\n ]);\n }\n\n static* addMinor({ minor, responses, templateData }) {\n const state = yield select(Module.selector.default);\n const { minors = [] } = state;\n\n if (minor.key) {\n // update existing minor\n const existing = minors.find(m => m.key === minor.key);\n if (existing) {\n existing.responses = responses;\n existing.isFlying = FORM_VALUE_YES;\n existing.templateData = templateData;\n\n // we allow updating of birthdays if it was previously undefined\n if (isBirthDateMissing(existing.details)) {\n existing.details.birthDay = minor.details.birthDay;\n existing.details.birthMonth = minor.details.birthMonth;\n existing.details.birthYear = minor.details.birthYear;\n }\n\n yield put(\n Module.actions.addMinorSucceeded({\n minors\n })\n );\n } else {\n console.warn('Tried to update existing minor, but could not be located by key', minor);\n }\n } else {\n // this is a new minor\n minor = {\n ...minor,\n responses,\n templateData,\n\n key: getMinorKey(),\n isFlying: FORM_VALUE_YES,\n isMinor: true\n };\n\n yield put(\n Module.actions.addMinorSucceeded({\n minors: [...minors, minor]\n })\n );\n }\n }\n\n /**\n * Checkin a user via the local API\n * @param {Object} action The action being dispatched\n */\n static* checkIn() {\n const waiver = yield select(Module.selector.default);\n const user = yield select(UserModule.selector.default);\n let {\n minors = [],\n tunnel: { code: tunnel }\n } = waiver;\n\n yield put(\n Module.actions.checkInLoading({\n checkIn: { isLoading: true }\n })\n );\n try {\n const { data: { id: userId } } = user;\n const minorIds = selectFlyingMinors(minors).map(minor => ({\n id: minor.details.id,\n externalSourceId: minor.details.externalSourceId\n }));\n const data = { minors: minorIds, user: userId };\n const response = yield call(axios.post, `/api/CheckIn/${tunnel}`, data);\n yield put(\n Module.actions.checkInSucceeded({\n checkIn: { data: response.data, isLoading: false }\n })\n );\n } catch (e) {\n console.error('Error while checking in', e);\n if (DEV_ALWAYS_SUCCEED_CHECKIN) {\n Module.actions.checkInSucceeded({\n checkIn: { data: {}, isLoading: false }\n });\n } else {\n yield put(\n Module.actions.checkInFailed({\n checkIn: { error: e.message, isLoading: false }\n })\n );\n }\n }\n }\n\n /**\n * Clear any errors after a System Error, so that the system can retry\n */\n static* clearErrors() {\n const state = yield select(Module.selector.default);\n\n // delete this altogether so that we can try a new submission\n if (state.submit) {\n delete state.submit;\n }\n\n Object.values(state).forEach(value => {\n if (value instanceof Object && value.hasOwnProperty('error')) {\n delete value.error;\n }\n });\n\n yield put(Module.actions.updateState(state));\n yield call(UserSaga.clearErrors);\n }\n\n /**\n * Fetch the expiration status of any previous waiver\n * @param {Object} action The action being dispatched\n */\n static * fetchExpired() {\n const waiver = yield select(Module.selector.default);\n const user = yield select(UserModule.selector.default);\n\n if (!user || !user.data || !user.data.id) {\n return;\n }\n\n let {\n minors = [],\n userIsFlying,\n tunnel: { code: tunnel }\n } = waiver;\n\n let { data: { id: userId } } = user;\n\n const minorIds = selectFlyingMinors(minors).map(minor => minor.details.id);\n const isUserFlying = FORM_VALUE_YES === userIsFlying;\n\n if ((isUserFlying && userId) || (minors.length)) {\n yield put(\n Module.actions.loadingExpired({\n isExpired: {\n isLoading: true\n }\n })\n );\n\n const data = { minors: minorIds, isParentFlying: isUserFlying, user: userId };\n try {\n const response = yield call(axios.post, `/api/Waiver/IsExpired/${tunnel}`, data);\n\n yield put(\n Module.actions.successExpired({\n isExpired: {\n data: DEV_ALWAYS_EXPIRE_WAIVER || response.data,\n isLoading: false\n }\n })\n );\n } catch (e) {\n yield put(\n Module.actions.failureExpired({\n isExpired: {\n error: e.message,\n isLoading: false\n }\n })\n );\n }\n }\n }\n\n /**\n * Fetch the past responses of the user's previous waiver\n * @param {Object} action The action being dispatched\n */\n static* fetchPastResponses({ id }) {\n yield put(\n Module.actions.loadingPastResponses({\n pastResponses: {\n isLoading: true\n }\n })\n );\n\n try {\n const response = yield call(axios.get, '/api/Waiver/PastResponses?' + Qs.stringify({ id }));\n\n yield put(\n Module.actions.successPastResponses({\n pastResponses: {\n [id]: response.data,\n isLoading: false\n }\n })\n );\n } catch (e) {\n yield put(\n Module.actions.failurePastResponses({\n pastResponses: {\n error: e.message,\n isLoading: false\n }\n })\n );\n }\n }\n\n /**\n * Fetch the minor waiver template from the local API\n * @param {Object} action The action being dispatched\n */\n static* fetchTemplate({ tunnel, culture }) {\n yield put(\n Module.actions.loadingTemplate({\n template: {\n isLoading: true\n }\n })\n );\n try {\n const response = yield call(axios.get, `/api/Waiver/Template/${tunnel}?culture=${culture}`);\n yield put(\n Module.actions.successTemplate({\n template: {\n data: response.data,\n isLoading: false\n }\n })\n );\n } catch (e) {\n yield put(\n Module.actions.failureTemplate({\n template: {\n error: e.message,\n isLoading: false\n }\n })\n );\n }\n }\n\n /**\n * Fetch the minor waiver template from the local API\n * @param {Object} action The action being dispatched\n */\n static* fetchTemplateMinors({ tunnel, culture }) {\n yield put(\n Module.actions.loadingTemplateMinors({\n templateMinors: {\n isLoading: true\n }\n })\n );\n try {\n const response = yield call(\n axios.get,\n `/api/Waiver/MinorTemplate/${tunnel}?culture=${culture}`\n );\n yield put(\n Module.actions.successTemplateMinors({\n templateMinors: {\n data: response.data,\n isLoading: false\n }\n })\n );\n } catch (e) {\n yield put(\n Module.actions.failureTemplateMinors({\n templateMinors: {\n error: e.message,\n isLoading: false\n }\n })\n );\n }\n }\n\n /**\n * Keeps the local API session alive\n * @param {Object} action The action being dispatched\n */\n static* keepSessionAlive(action) {\n yield put(\n Module.actions.loadingHeartbeat({\n keepAlive: { isLoading: true }\n })\n );\n try {\n const response = yield call(axios.get, '/api/Session/KeepAlive');\n yield put(\n Module.actions.successHeartbeat({\n keepAlive: { data: response.data, isLoading: false }\n })\n );\n } catch (e) {\n yield put(\n Module.actions.failureHeartbeat({\n keepAlive: { error: e.message, isLoading: false }\n })\n );\n }\n }\n\n /**\n * Set the `isFlying` status of a participant by key\n * @param {*} param0\n */\n static* updateIsFlying({ key, value }) {\n if (key === userKey) {\n let userIsFlying = value;\n yield put(Module.actions.successIsFlying({ userIsFlying }));\n \n } else {\n const { minors = [] } = yield select(Module.selector.default);\n const minor = minors.find(minor => minor.key === key);\n if (minor) {\n minor.isFlying = value;\n yield put(Module.actions.successIsFlying({ minors }));\n }\n }\n\n // since we have a new set of flyers, re-check for expiration\n yield call(WaiverSaga.fetchExpired);\n }\n\n /**\n * Set the waiver language. As a side effect, also unloads any previously\n * loaded waiver templates.\n * @param {*} param0\n */\n static* updateLanguage({ language }) {\n yield put(\n Module.actions.successLanguage({\n language,\n template: undefined,\n templateMinors: undefined\n })\n );\n }\n\n /**\n * Sets the minors for this waiver\n * @param {*} param0\n */\n static * setMinors(minors = []) {\n yield put(\n Module.actions.updateMinors({\n minors: minors.map(minor => ({\n ...minor,\n isMinor: true,\n // set a unique key for later identification\n key: minor.key || getMinorKey(),\n isFlying: minor.isFlying || FORM_VALUE_YES\n }))\n })\n );\n\n // since we have a new set of flyers, re-check for expiration\n yield call(WaiverSaga.fetchExpired);\n }\n\n /**\n * Start the session over\n * @param {Object} action The action being dispatched\n */\n static* startOver(action) {\n yield put(Module.actions.clearState(Module.initialState));\n yield put(UserModule.actions.clearState(UserModule.initialState));\n yield call(WaiverSaga.startSession)\n yield put(Module.actions.startOverComplete);\n }\n\n /**\n * Start a user session via the local API\n * @param {Object} action The action being dispatched\n */\n static* startSession(action) {\n yield put(\n Module.actions.loadingSession({\n session: { isLoading: true }\n })\n );\n try {\n let loc = window.location;\n let endpoint = '/api/Session';\n\n // Force kiosk mode like /kiosk/{tunnelCode}\n if (/-kiosk/.test(loc.hostname) && /\\/kiosk\\/[a-zA-Z]+$/.test(loc.pathname)) {\n endpoint = '/api/Session/ForceKiosk' + loc.pathname.substr(loc.pathname.lastIndexOf('/'));\n }\n\n let { data: responseData } = yield call(axios.get, endpoint);\n \n let data = {\n ...responseData,\n ...overrideSessionData\n };\n \n if (data.minors && Array.isArray(data.minors)) {\n data.minors.forEach(minor => {\n minor.birthDay = String(minor.birthDay).padStart(2, \"0\");\n minor.birthMonth = String(minor.birthMonth).padStart(2, \"0\");\n minor.birthYear = String(minor.birthYear);\n });\n }\n\n if (!responseData.isKiosk && /-kiosk/.test(loc.hostname)) {\n // if not kiosk with a kiosk url, forward to non-kiosk url\n loc.href = loc.href.replace(/-kiosk/, '');\n return;\n }\n\n const { user, minors, tunnel } = data;\n\n if (user) {\n yield call(UserSaga.setReservationUser, user);\n }\n\n if (minors?.length) {\n yield call(WaiverSaga.setMinors, minors.map(details => ({ details })));\n }\n\n if (tunnel) {\n yield put(Module.actions.setTunnel(tunnel));\n }\n\n yield put(\n Module.actions.successSession({\n session: { data, isLoading: false }\n })\n );\n } catch (e) {\n yield put(\n Module.actions.failureSession({\n session: { error: e.message, isLoading: false }\n })\n );\n }\n }\n\n /**\n * Submit a waiver via the local API\n * @param {Object} action The action being dispatched\n */\n static* saveWaiver(action) {\n const user = yield select(UserModule.selector.default);\n const waiver = yield select(Module.selector.default);\n const {\n language: culture,\n minors,\n tunnel: { code: tunnel } = {},\n pastResponses,\n session: {\n data: { waiverSource: source = SOURCE_WEB }\n }\n } = waiver;\n\n let { templateData, values, sendEmailCopy = true } = action;\n\n yield put(\n Module.actions.savingWaiver({\n submit: { isLoading: true }\n })\n );\n try {\n // map all form values to a string\n const { signature, ...responses } = values;\n\n const payload = stringifyPayload({\n user: {\n ...user.details,\n responses: substituteMaybes(responses, templateData.maybes)\n },\n tunnel,\n source,\n sendEmailCopy,\n signature\n });\n\n // transform the minor information\n const flyingMinors = selectFlyingMinors(minors);\n\n if (flyingMinors?.length) {\n payload.minors = stringifyPayload(\n flyingMinors.map(minor => {\n let { details, responses, templateData = {} } = minor;\n return {\n responses: substituteMaybes(\n responses || pastResponses[details.id],\n templateData.maybes\n ),\n ...details\n };\n })\n );\n }\n\n const { data } = yield call(axios.post, `/api/Waiver?culture=${culture}`, payload);\n yield put(\n Module.actions.successWaiver({\n submit: { data, isLoading: false }\n })\n );\n } catch (e) {\n console.error('Error while submitting waiver', e);\n if (DEV_ALWAYS_SUCCEED_WAIVER) {\n Module.actions.successWaiver({\n submit: { data: {}, isLoading: false }\n });\n } else {\n yield put(\n Module.actions.failureWaiver({\n submit: { error: e.message, isLoading: false }\n })\n );\n }\n }\n }\n}\n\n/**\n * A consistent function for normalizing similar values so that they match\n * @param {*} value\n */\nexport function normalizeValue(value) {\n return stringifyValue(value).toUpperCase();\n}\n\n/**\n * Normalizes a value and also maps \"maybe\" values back to the original response\n * @param {string} response\n * @param {string} trackMaybeOnValue\n */\nexport function mapMaybeResponse(response, trackMaybeOnValue = FORM_VALUE_NO) {\n response = normalizeValue(response);\n if (response === FORM_VALUE_MAYBE) {\n return normalizeValue(trackMaybeOnValue);\n } else {\n return response;\n }\n}\n\n/**\n * Convert form values to sensible strings\n * @param {*} value\n */\nexport function stringifyValue(value) {\n if (value === null || value === undefined) {\n return '';\n } else if (value === true || value.toUpperCase() === 'TRUE') {\n return FORM_VALUE_YES;\n } else if (value === false || value.toUpperCase() === 'FALSE') {\n return FORM_VALUE_NO;\n } else {\n return ''.concat(value);\n }\n}\n\n/**\n * Returns a stringified version of form responses\n * @param {object} payload\n */\nfunction stringifyPayload(payload) {\n let result = Array.isArray(payload) ? [] : {};\n\n for (let key in payload) {\n const value = payload[key];\n\n if (value === null || value === undefined) {\n result[key] = '';\n } else if (typeof value === 'string') {\n result[key] = responseToApiMap[value] || ''.concat(value);\n } else if (typeof value === 'number' || typeof value === 'boolean') {\n result[key] = ''.concat(value);\n } else if (Array.isArray(value)) {\n result[key] = value.map(elem => stringifyPayload(elem));\n } else if (typeof value === 'object') {\n result[key] = stringifyPayload(value);\n }\n }\n\n return result;\n}\n\n/**\n * Returns a new object where any `values` that have a corresponding entry in `maybes` will have `FORM_VALUE_MAYBE` substituted\n * @param {object} values\n * @param {object} maybes\n */\nfunction substituteMaybes(values = {}, maybes = {}) {\n const result = { ...values };\n\n // substitute \"MAYBE\" wherever such an event was recorded\n Object.entries(maybes).forEach(([field, isMaybe]) => {\n if (isMaybe) {\n result[field] = FORM_VALUE_MAYBE;\n }\n });\n return result;\n}\n\n/**\n * The form needs YES/NO, but API return true/false\n * @param {object} responses\n */\nexport function mapApiResponsesToForm(responses = {}) {\n const result = {};\n Object.keys(responses).forEach(key => {\n result[key] = apiToResponsesMap[responses[key]];\n });\n\n return result;\n}\n\n/*\nThe API expects \"true\", \"false\", \"maybe\" while the\ntemplate expects \"YES\", \"NO\", \"MAYBE\". So we create\na mapping \n*/\nconst responseToApiMap = Object.freeze({\n [FORM_VALUE_YES]: 'true',\n [FORM_VALUE_NO]: 'false',\n [FORM_VALUE_MAYBE]: 'maybe'\n});\n\n/*\nThe inverse of responseToApiMap\n*/\nconst apiToResponsesMap = {};\nObject.keys(responseToApiMap).forEach(key => (apiToResponsesMap[responseToApiMap[key]] = key));\n\n/**\n * The interval between calls to /api/Session/KeepAlive\n */\nexport const SESSION_KEEP_ALIVE_INTERVAL = 1000 * 60 * 4.9; // the session timeout is 5 minutes\n\n/**\n * Determine whether a minor's birthdate is missing\n *\n * @param {*} details The minor's details\n * @param {*} details.birthDay The birth day\n * @param {*} details.birthMonth The birth day\n * @param {*} details.birthYear The birth day\n */\nexport function isBirthDateMissing(details) {\n const { birthDay, birthMonth, birthYear } = details || {};\n return !birthDay || !birthMonth || !birthYear;\n}\n\n/**\n * Get only the flyers for this session, as a normalized array.\n * Must include the User and Waiver selectors in order for this to work\n * @param {*} param0\n */\nexport function getFlyers({ waiver, user } = {}) {\n return getParticipants({ waiver, user }).filter(p => p.isFlying === FORM_VALUE_YES);\n}\n\n/**\n * Given the current redux state, get all participants, whether user or minor, as a normalized array.\n * Must include the User and Waiver selectors in order for this to work\n * @param {Object} state\n */\nexport function getParticipants({ waiver = {}, user } = {}) {\n const { minors = [], userIsFlying } = waiver;\n if (user) {\n return [\n {\n ...user,\n isFlying: userIsFlying,\n isMinor: false, // we use this to determine if a later action\n // is against the user or a minor\n key: userKey\n },\n ...minors.map(minor => ({\n ...minor,\n isMinor: true\n }))\n ];\n } else {\n return [];\n }\n}\n\n/**\n * Generate a sequential key for identifying minors\n * in a given reservation. This key will rollover eventually.\n */\nfunction getMinorKey() {\n if (minorKeyCounter >= Number.MAX_SAFE_INTEGER) {\n minorKeyCounter = 0;\n }\n\n return ''.concat(minorKeyCounter++);\n}\n\n/**\n * Check the existing state for numerous conditions that would\n * require a new waiver\n */\nexport function isNewWaiverRequired(waiver) {\n const { minors = [] } = waiver;\n /*\n - if we don't even have an 'isExpired' object, then this session\n wasn't even in a position to check for expiration, so new waiver\n is required.\n - if we checked, and it's expired, then we need one\n */\n let result = !waiver.isExpired || waiver.isExpired.data;\n\n // if any flyer is new to the system (no ID assigned), we need a new one\n // also, if any minor is missing a birthday, we need to collect it\n result =\n result ||\n minors.filter(minor => !minor.details.id || isBirthDateMissing(minor.details)).length;\n\n return DEV_ALWAYS_REQUIRE_NEW_WAIVER || !!result;\n}\n\n/**\n * Given an map of minors, select only those that are actually flying\n * and are minors\n * @param {object} participants\n */\nexport function selectFlyingMinors(participants = []) {\n return participants.filter(\n participant => participant.isMinor && participant.isFlying === FORM_VALUE_YES\n );\n}"],"sourceRoot":""}