@clickview/lite 0.72.0 → 0.72.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/scripts/1109-4f5b0dab9b-lite.chunk.js +2 -0
- package/dist/scripts/1109-4f5b0dab9b-lite.chunk.js.map +1 -0
- package/dist/scripts/1667-fcdff22585-lite.chunk.js +3 -0
- package/dist/scripts/1667-fcdff22585-lite.chunk.js.map +1 -0
- package/dist/scripts/{3596-d760a67a58-lite.chunk.js → 3596-89a39d3781-lite.chunk.js} +3 -3
- package/dist/scripts/{3596-d760a67a58-lite.chunk.js.map → 3596-89a39d3781-lite.chunk.js.map} +1 -1
- package/dist/scripts/3816-ca44792dca-lite.chunk.js +2 -0
- package/dist/scripts/3816-ca44792dca-lite.chunk.js.map +1 -0
- package/dist/scripts/7601-c1b07b72c6-lite.chunk.js +2 -0
- package/dist/scripts/7601-c1b07b72c6-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-6e723fdeb1.min.js → bundle-23f3b64e36.min.js} +3 -3
- package/dist/scripts/{bundle-6e723fdeb1.min.js.map → bundle-23f3b64e36.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/1109-98508a03fe-lite.chunk.js +0 -2
- package/dist/scripts/1109-98508a03fe-lite.chunk.js.map +0 -1
- package/dist/scripts/1667-ac162f04d0-lite.chunk.js +0 -3
- package/dist/scripts/1667-ac162f04d0-lite.chunk.js.map +0 -1
- package/dist/scripts/3816-abed23a1ce-lite.chunk.js +0 -2
- package/dist/scripts/3816-abed23a1ce-lite.chunk.js.map +0 -1
- package/dist/scripts/7601-b439c82e82-lite.chunk.js +0 -2
- package/dist/scripts/7601-b439c82e82-lite.chunk.js.map +0 -1
- /package/dist/scripts/{1667-ac162f04d0-lite.chunk.js.LICENSE.txt → 1667-fcdff22585-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{3596-d760a67a58-lite.chunk.js.LICENSE.txt → 3596-89a39d3781-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-6e723fdeb1.min.js.LICENSE.txt → bundle-23f3b64e36.min.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/1667-fcdff22585-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/images/components/CloseIcon.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/general/clear-input/ClearableInput.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/general/clear-input/clearable-input.scss","file:///app/packages/libs/shared/src/apps/sign-up/components/general/existing-account-sign-in/ExistingAccountSignIn.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/general/idp-button/idp-button.scss","file:///app/packages/libs/shared/src/apps/sign-up/components/general/idp-button/IdpButton.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/general/global-idps/global-idps.scss","file:///app/packages/libs/shared/src/apps/sign-up/components/general/global-idps/GlobalIdps.tsx","file:///app/packages/libs/shared/src/apps/sign-up/utils/signUpSplitNames.ts","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/add-to-braze-step-item/AddToBrazeForm.tsx","file:///app/packages/libs/shared/src/apps/sign-up/enums/TrialStatus.ts","file:///app/packages/libs/shared/src/apps/sign-up/enums/UserType.ts","file:///app/node_modules/@googlemaps/js-api-loader/dist/index.esm.js","file:///app/packages/libs/shared/src/apps/sign-up/hooks/useGoogleApi.tsx","file:///app/packages/libs/shared/src/apps/sign-up/hooks/useAutoCompleteService.ts","file:///app/packages/libs/shared/src/apps/sign-up/hooks/useCountryPlaceholder.tsx","file:///app/packages/libs/shared/src/apps/sign-up/hooks/useDropdownEvents.tsx","file:///app/packages/libs/shared/src/apps/sign-up/helpers/PlaceHelper.ts","file:///app/packages/libs/shared/src/apps/sign-up/hooks/useGeocoder.tsx","file:///app/packages/libs/shared/src/images/components/CrosshairIcon.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/search-school-step-item/search-school-step-item.scss","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/search-school-step-item/SearchLocalityInput.tsx","file:///app/packages/libs/shared/src/apps/sign-up/hooks/useLocalitySearch.tsx","file:///app/packages/libs/shared/src/apps/sign-up/errors/ApiError.ts","file:///app/packages/libs/shared/src/apps/sign-up/helpers/FetchHelper.ts","file:///app/packages/libs/shared/src/apps/sign-up/helpers/UrlHelper.ts","file:///app/packages/libs/shared/src/enums/ProspectStatus.ts","file:///app/packages/libs/shared/src/apps/sign-up/fetch-requests/ProspectRequests.ts","file:///app/packages/libs/shared/src/apps/sign-up/fetch-requests/UserRequests.ts","file:///app/packages/libs/shared/src/apps/sign-up/helpers/SchoolTypeHelper.ts","file:///app/packages/libs/shared/src/apps/sign-up/components/general/completed.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/completed-step-item/trial-status-completion/StatusImage.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/completed-step-item/existing-customer/ExistingCustomer.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/completed-step-item/trial-status-completion/StatusMessage.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/completed-step-item/verify-account/VerifyAccount.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/completed-step-item/expired-trial/ExpiredTrial.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/completed-step-item/trial-not-available/TrialNotAvailable.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/completed-step-item/unsupported/Unsupported.tsx","file:///app/packages/libs/shared/src/apps/sign-up/constants/YoungStudentStorageKey.ts","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/completed-step-item/CompletedStepItem.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/completed-step-item/trial-status-completion/TrialStatusCompletion.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/completed-step-item/added-to-braze/AddedToBraze.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/completed-step-item/young-student/YoungStudent.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/completed-step-item/requested-access/RequestedAccess.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/enter-age-step-item/EnterAgeStepItem.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/enter-email-step-item/EnterEmailStepItem.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/request-access/getJoinRequestError.ts","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/search-school-step-item/SearchSchoolInput.tsx","file:///app/packages/libs/shared/src/components/searchable-select/searchable-select.scss","file:///app/packages/libs/shared/src/components/searchable-select/SearchableSelect.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/select-idp-step-item/SelectIdpStepItem.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/select-user-type-step-item/UserTypeOptions.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/select-user-type-step-item/user-type-option.scss","file:///app/packages/libs/shared/src/apps/sign-up/components/multi-step-form/ActiveStep.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/select-user-type-step-item/SelectUserTypeStepItem.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/search-school-step-item/SearchSchoolStepItem.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/search-school-step-item/requestTrial.ts","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/cant-find-school-step-item/CantFindSchoolStepItem.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/add-to-braze-step-item/AddToBrazeStepItem.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/enter-age-step-item/enter-age-step-item.scss","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/request-access/RequestAccess.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/request-bdm-trial-step-item/RequestBdmTrialStepItem.tsx","file:///app/packages/libs/shared/src/apps/sign-up/fetch-requests/BrazeRequests.ts","file:///app/packages/libs/shared/src/apps/sign-up/components/multi-step-form/form-debugger/form-debugger.scss","file:///app/packages/libs/shared/src/apps/sign-up/components/multi-step-form/form-debugger/FormDebugger.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/general/dot-crumbs/DotCrumbs.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/general/terms-and-conditions/TermsAndConditions.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/multi-step-form/MultiStepBackButton.tsx","file:///app/packages/libs/shared/src/apps/sign-up/layouts/full-page-layout/FullPageLayout.tsx","file:///app/packages/libs/shared/src/apps/sign-up/layouts/full-page-layout/full-page-layout.scss","file:///app/packages/libs/shared/src/apps/sign-up/layouts/popup-layout/PopupLayout.tsx","file:///app/packages/libs/shared/src/apps/sign-up/helpers/LayoutHelper.ts","file:///app/packages/libs/shared/src/apps/sign-up/hooks/useSignUpSteps/reducers/NextStepReducer.ts","file:///app/packages/libs/shared/src/apps/sign-up/hooks/useSignUpSteps/reducers/SignUpReducer.ts","file:///app/packages/libs/shared/src/apps/sign-up/hooks/useSignUpSteps/reducers/BackReducer.ts","file:///app/packages/libs/shared/src/apps/sign-up/hooks/useSignUpSteps/useSignUpSteps.ts","file:///app/packages/libs/shared/src/apps/sign-up/components/multi-step-form/MultiStepForm.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/steps/add-to-braze-step-item/JobTitleInput.tsx","file:///app/packages/libs/shared/src/apps/sign-up/enums/MultiStepFormTypes.ts","file:///app/packages/libs/shared/src/apps/sign-up/enums/ProspectLookup.ts","file:///app/packages/libs/shared/src/apps/sign-up/enums/SignUpProduct.ts","file:///app/packages/libs/shared/src/apps/sign-up/helpers/BrazeHelper.ts","file:///app/packages/libs/shared/src/apps/sign-up/helpers/DataHelper.ts","file:///app/packages/libs/shared/src/apps/sign-up/helpers/ExternalLinkHelper.ts","file:///app/packages/libs/shared/src/apps/sign-up/utils/getJobTitles.ts","file:///app/packages/libs/shared/src/components/forms/form-feedback/FormFeedback.tsx","file:///app/packages/libs/shared/src/flight-requests/AuthRequests.ts","file:///app/packages/libs/shared/src/hooks/UseProfileApiClient.ts","file:///app/packages/libs/shared/src/hooks/useGeoLocation.ts","file:///app/packages/projects/lite/src/apps/sign-up/helpers/SignUpImages.ts","file:///app/packages/projects/lite/src/apps/sign-up/hooks/useGetSignUpAjaxUrls.ts","file:///app/packages/libs/shared/src/apps/sign-up/layouts/popup-layout/popup-layout.scss"],"sourcesContent":["import React from 'react';\n\nexport function CloseIcon(): JSX.Element {\n return (\n <svg viewBox='0 0 24 24'>\n <path d='M11.959 10.641l4.402-4.296a.964.964 0 0 1 1.358 0 .951.951 0 0 1 0 1.35l-4.403 4.297 4.403 4.378a.951.951 0 0 1 0 1.35.964.964 0 0 1-1.358 0l-4.402-4.378-4.32 4.378a.964.964 0 0 1-1.358 0 .951.951 0 0 1 0-1.35l4.32-4.378-4.32-4.362a.951.951 0 0 1 0-1.35.964.964 0 0 1 1.358 0l4.32 4.361z'/>\n </svg>\n );\n}","import React from 'react';\n\nimport { CloseIcon } from 'libs/shared/images/components/CloseIcon';\n\nimport styles from './clearable-input.scss';\n\ninterface ClearInputProps extends React.HTMLProps<HTMLInputElement> {\n showClearButton?: boolean;\n onClickClear: () => void;\n clearClassName?: string;\n}\n\nexport const ClearableInput = React.forwardRef((\n props: ClearInputProps,\n ref: React.ForwardedRef<HTMLInputElement>\n) => {\n const { onClickClear, showClearButton, clearClassName, ...inputProps } = props;\n\n return (\n <div className='position-relative'>\n <input\n {...inputProps}\n ref={ref}\n className={`${props.className} ${styles.clearableInput}`}\n />\n {(!!props.value || showClearButton) &&\n <span\n className={`${styles.clearInput} position-absolute cursor-pointer text-secondary ${clearClassName || ''}`}\n role='button'\n onClick={onClickClear}\n onKeyDown={(e: React.KeyboardEvent) => e.key === 'Enter' && onClickClear()}\n tabIndex={0}\n >\n <div className='d-inline-block svg-container md'>\n <CloseIcon />\n </div>\n </span>\n }\n </div>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"clearInput\":\"ygMgF\",\"clearableInput\":\"aYpO7\"};","import React from 'react';\n\ninterface ExistingAccountSignInProps {\n onClick: (e: React.MouseEvent<Element, MouseEvent>) => void;\n link: string;\n}\n\nexport function ExistingAccountSignIn(props: ExistingAccountSignInProps): JSX.Element {\n return (\n <>\n Have a ClickView account already?\n <a href={props.link} className='info-link ms-1' onClick={props.onClick}>\n Sign in\n </a>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"globalIdpButton\":\"tAlj0\",\"globalIdpImage\":\"O94yo\"};","import * as React from 'react';\n\nimport { IdentityProvider } from 'libs/shared/apps/sign-up/interfaces/IdentityProvider';\n\nimport styles from './idp-button.scss';\n\ninterface IdpButtonProps {\n idp: IdentityProvider;\n onClick: (provider: IdentityProvider) => void;\n backgroundColour?: string;\n foregroundColour?: string;\n attribution?: string;\n\n isGlobalIdp: boolean;\n\n /**\n * Because rendering globalIdps is conditional. We have a \"Don't have an account\" link at the bottom\n * which uses margin top. So the last item in this view must not have a margin bottom. - Sha\n */\n last?: boolean;\n}\n\nexport function IdpButton(props: IdpButtonProps): React.ReactElement {\n const {\n idp,\n onClick,\n backgroundColour = 'F8981D',\n foregroundColour = 'FFF',\n last,\n isGlobalIdp\n } = props;\n\n const lastButtonClassName = last ? '' : 'mb-3';\n\n const defaultStyle: React.CSSProperties = {\n backgroundColor: `#${idp.backgroundColour || backgroundColour}`,\n color: `#${idp.foregroundColour || foregroundColour}`\n };\n\n const globalStyle: React.CSSProperties = {};\n\n const buttonClass = isGlobalIdp\n ? `btn btn-lg btn-outline-dark w-100 ${lastButtonClassName} ${styles.globalIdpButton}`\n : `btn btn-lg w-100 ${lastButtonClassName}`;\n\n const buttonStyle = isGlobalIdp ? globalStyle : defaultStyle;\n\n const buttonLabel = isGlobalIdp ? `Continue with ${idp.name}` : idp.name;\n\n return (\n <button className={buttonClass} style={buttonStyle} onClick={() => onClick(idp)}>\n {isGlobalIdp && idp.logoUrl && (\n <img src={idp.logoUrl} className={styles.globalIdpImage} alt={`${idp.name} logo`} />\n )}\n {buttonLabel}\n </button>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"divider\":\"FfyN0\"};","import React from 'react';\n\nimport { IdpButton } from 'libs/shared/apps/sign-up/components/general/idp-button/IdpButton';\nimport { IdentityProvider } from 'libs/shared/apps/sign-up/interfaces/IdentityProvider';\n\nimport styles from './global-idps.scss';\n\ninterface AuthIdpProps {\n idps: IdentityProvider[];\n onClick: (idp: IdentityProvider) => void;\n className?: string;\n}\n\ninterface LiteIdpProps {\n idps: IdentityProvider[];\n className?: string;\n attribution: string;\n}\n\ntype GlobalIdpsProps = AuthIdpProps | LiteIdpProps\n\nexport function GlobalIdps(props: GlobalIdpsProps): JSX.Element {\n if (!props.idps?.length)\n return <></>;\n\n function onClick(idp: IdentityProvider): void {\n const currentPathAndQuery = window.location.pathname + window.location.search;\n\n /**\n * Intentionally not using LocationUtils as to not bring a large number of dependencies into Auth - Sha\n */\n let href = `/challenge?idp=${idp.id}`\n + '&redirectUrl=' + encodeURIComponent(currentPathAndQuery);\n \n if ('attribution' in props)\n href += '&attribution=' + encodeURIComponent(props.attribution);\n\n window.location.href = href;\n }\n\n return (\n <div className={`${props.className ? props.className : ''}`}>\n <div className={`my-3 border-bottom position-relative ${styles.divider}`}></div>\n {props.idps.map((p, i) => (\n <IdpButton\n key={i}\n idp={p}\n onClick={'onClick' in props ? props.onClick : onClick}\n attribution={'attribution' in props ? props.attribution : null}\n isGlobalIdp\n />\n ))}\n </div>\n );\n}","export function signUpSplitName(fullName: string) {\n if (!fullName)\n return { firstName: '', surname: '' };\n\n const [ firstName, ...surnames ] = fullName.split(' ').filter(x => x.length);\n\n return {\n firstName: firstName,\n surname: surnames?.join(' ')\n };\n}","import React from 'react';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { ClearableInput } from 'libs/shared/apps/sign-up/components/general/clear-input/ClearableInput';\nimport { JobTitleInput } from 'libs/shared/apps/sign-up/components/steps/add-to-braze-step-item/JobTitleInput';\nimport { LocalityHelper } from 'libs/shared/apps/sign-up/helpers/LocalityHelper';\nimport { signUpSplitName } from 'libs/shared/apps/sign-up/utils/signUpSplitNames';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\n\nconst INVALID_STRING_REGEX = /\\$+[\\w\\s]?/;\nconst PHONE_REGEX = /^\\+?\\d{4,255}$/;\n\nconst MAX_STRING_LENGTH = 255;\n\nexport interface AddToBrazeFormData {\n fullname: string;\n jobTitle: string;\n phone: string;\n}\n\nexport interface AddToBrazeFormErrors {\n fullname?: string;\n jobTitle?: string;\n phone?: string;\n submission?: string;\n}\n\ninterface AddToBrazeFormProps {\n country: string;\n loading: boolean;\n isTertiary: boolean;\n errors: AddToBrazeFormErrors;\n setErrors: (errors: AddToBrazeFormErrors) => void;\n\n handleSubmitForm: (data: AddToBrazeFormData) => void;\n logUserAction(data: HashObject | HashObject[], analyticsOptions: AnalyticsOptions): void;\n}\n\nexport function AddToBrazeForm(props: AddToBrazeFormProps): JSX.Element {\n const [ data, setData ] = React.useState<AddToBrazeFormData>({\n fullname: '',\n jobTitle: '',\n phone: ''\n });\n\n function onSubmitForm(event?: React.FormEvent): void {\n event?.preventDefault();\n\n if (!validate(data)) return;\n\n props.handleSubmitForm(data);\n }\n\n function handleOnChangeFullName(event: React.ChangeEvent<HTMLInputElement>): void {\n event.preventDefault();\n setDataForKey('fullname', event.target.value);\n removeErrorForKey('fullname');\n removeErrorForKey('submission');\n }\n\n function handleOnChangePhone(event: React.ChangeEvent<HTMLInputElement>): void {\n event.preventDefault();\n setDataForKey('phone', event.target.value.trim());\n removeErrorForKey('phone');\n removeErrorForKey('submission');\n }\n \n function handleOnChangeRole(value: string): void {\n setDataForKey('jobTitle', value);\n removeErrorForKey('jobTitle');\n removeErrorForKey('submission');\n }\n\n function clearFullNameInput(): void {\n setDataForKey('fullname', '');\n removeErrorForKey('fullname');\n removeErrorForKey('submission');\n }\n\n function clearPhoneInput(): void {\n setDataForKey('phone', '');\n removeErrorForKey('phone');\n removeErrorForKey('submission');\n }\n\n function setDataForKey<X extends keyof AddToBrazeFormData>(key: X, value: AddToBrazeFormData[X]) {\n setData(data => ({\n ...data,\n [key]: value\n }));\n }\n\n function removeErrorForKey(key: keyof AddToBrazeFormErrors) {\n if (!Object.keys(props.errors).length) return;\n\n if (!props.errors[key]) return;\n\n const errorObject = { ...props.errors };\n\n delete errorObject[key];\n\n props.setErrors(errorObject);\n }\n\n function validate(data: AddToBrazeFormData): boolean {\n const { fullname, jobTitle, phone } = data;\n const { firstName, surname } = signUpSplitName(fullname);\n\n const errorObject: AddToBrazeFormErrors = {};\n\n \n if (!firstName || !surname)\n errorObject.fullname = 'Please enter your full name.';\n \n if (INVALID_STRING_REGEX.test(firstName) || INVALID_STRING_REGEX.test(surname))\n errorObject.fullname = 'Please enter your full name.';\n \n if (fullname.length > MAX_STRING_LENGTH)\n errorObject.fullname = `Full name cannot exceed max length of ${MAX_STRING_LENGTH} characters.`;\n\n if (!jobTitle?.length)\n errorObject.jobTitle = 'Please enter your job title.';\n\n if (INVALID_STRING_REGEX.test(jobTitle))\n errorObject.jobTitle = 'Please enter a valid job title.';\n\n if (jobTitle.length > MAX_STRING_LENGTH)\n errorObject.jobTitle = `Job title cannot exceed max length of ${MAX_STRING_LENGTH} characters.`;\n\n if (!phone?.length)\n errorObject.phone = 'Please enter your phone number.';\n\n if (INVALID_STRING_REGEX.test(phone) || !PHONE_REGEX.test(phone))\n errorObject.phone = 'Please enter a valid phone number.';\n\n props.setErrors(errorObject);\n\n return !Object.keys(errorObject).length;\n }\n\n function canRequestTrial(): boolean {\n const { fullname, jobTitle, phone } = data;\n if (!fullname.length || !jobTitle.length || !phone.length) return false;\n \n if (Object.keys(props.errors).length) return false;\n \n return true;\n }\n\n return (\n <div className='text-center'>\n <h1 className='text-center h4'>\n A little more about you\n </h1>\n <p>\n Please enter your details.\n </p>\n <form onSubmit={onSubmitForm} aria-errormessage='brazeFormError'>\n <div className='form-group text-start'>\n <label\n className='d-block fw-bold mb-1'\n htmlFor='fullname-input'\n >\n Full name\n </label>\n <ClearableInput\n value={data.fullname}\n onChange={handleOnChangeFullName}\n name='fullname-input'\n id='fullname-input'\n type='text'\n className={`form-control form-control-lg ${props.errors.fullname?.length ? 'is-invalid' : ''}`}\n placeholder='Enter your name'\n onClickClear={clearFullNameInput}\n autoFocus\n aria-errormessage={'fullname-inputError'}\n />\n {props.errors.fullname &&\n <FormFeedback name='fullname-input'>{props.errors.fullname}</FormFeedback>\n }\n </div>\n <div className='form-group text-start'>\n <label\n className='d-block fw-bold mb-1'\n htmlFor='phone-input'\n >\n Contact number\n </label>\n <ClearableInput\n value={data.phone}\n onChange={handleOnChangePhone}\n name='phone-input'\n id='phone-input'\n type='tel'\n className={`form-control form-control-lg ${props.errors.phone?.length ? 'is-invalid' : ''}`}\n placeholder='Enter your phone number'\n onClickClear={clearPhoneInput}\n aria-errormessage={'phone-inputError'}\n />\n {props.errors.phone &&\n <FormFeedback name='phone-input'>{props.errors.phone}</FormFeedback>\n }\n </div>\n <div className='form-group text-start'>\n <label\n className='d-block fw-bold mb-1'\n htmlFor='jobTitle-select'\n >\n Job title\n </label>\n <JobTitleInput\n id='jobTitle-select'\n countryCode={LocalityHelper.getCountryCode(props.country)}\n onChange={handleOnChangeRole}\n error={props.errors?.jobTitle}\n size='lg'\n labelClassName='d-none'\n isTertiary={props.isTertiary}\n />\n </div>\n {!!props.errors?.submission &&\n <FormFeedback name='brazeForm' className='form-group'>\n {props.errors.submission}\n </FormFeedback>\n }\n <div className='form-group mb-1'>\n <SpinnerButton\n className='btn-lg w-100'\n variant='dark'\n onClick={() => onSubmitForm()}\n showSpinner={props.loading}\n disabled={props.loading || !canRequestTrial()}\n >\n Submit\n </SpinnerButton>\n </div>\n </form>\n </div>\n );\n}","/**\n * User Trial status states.\n * @readonly\n * @enum {string}\n */\nexport enum TrialStatus {\n /** @member {string} */\n /** The user does not qualify for a trial */\n Unavailable = 'unavailable',\n\n /** @member {string} */\n /** The user's trial expired */\n Expired = 'expired',\n\n /** @member {string} */\n /** The user is currently trialling - add the user to the active trial school */\n Active = 'active',\n\n /** @member {string} */\n /** The user already has full access */\n NotRequired = 'not-required',\n\n /** @member {string} */\n /** The user qualifies for a trial */\n Available = 'available',\n\n /** @member {string} */\n /** The prospects region is not supported */\n Unsupported = 'unsupported',\n\n /** @member {string} */\n /** The prospect has full access and allows user to auto join */\n UserAutoJoinAllowed = 'user-auto-join-allowed',\n\n /** @member {string} */\n /** The prospect has full access and allows user to request for join */\n UserJoinApprovalRequired = 'user-join-approval-required',\n\n /** @member {string} */\n /** The user does not qualify for a trial */\n InvalidEmail = 'invalid-email',\n\n\n /** @member {string} */\n /** The user qualifies for a bdm trial */\n BdmTrialAvailable = 'bdm-trial-available',\n}","export enum UserType {\n Staff = 'staff',\n Learner = 'learner'\n}","// do not edit .js files directly - edit src/index.jst\n\n\n\nvar fastDeepEqual = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n\n/**\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at.\n *\n * Http://www.apache.org/licenses/LICENSE-2.0.\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst DEFAULT_ID = \"__googleMapsScriptId\";\n/**\n * The status of the [[Loader]].\n */\nvar LoaderStatus;\n(function (LoaderStatus) {\n LoaderStatus[LoaderStatus[\"INITIALIZED\"] = 0] = \"INITIALIZED\";\n LoaderStatus[LoaderStatus[\"LOADING\"] = 1] = \"LOADING\";\n LoaderStatus[LoaderStatus[\"SUCCESS\"] = 2] = \"SUCCESS\";\n LoaderStatus[LoaderStatus[\"FAILURE\"] = 3] = \"FAILURE\";\n})(LoaderStatus || (LoaderStatus = {}));\n/**\n * [[Loader]] makes it easier to add Google Maps JavaScript API to your application\n * dynamically using\n * [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).\n * It works by dynamically creating and appending a script node to the the\n * document head and wrapping the callback function so as to return a promise.\n *\n * ```\n * const loader = new Loader({\n * apiKey: \"\",\n * version: \"weekly\",\n * libraries: [\"places\"]\n * });\n *\n * loader.load().then((google) => {\n * const map = new google.maps.Map(...)\n * })\n * ```\n */\nclass Loader {\n /**\n * Creates an instance of Loader using [[LoaderOptions]]. No defaults are set\n * using this library, instead the defaults are set by the Google Maps\n * JavaScript API server.\n *\n * ```\n * const loader = Loader({apiKey, version: 'weekly', libraries: ['places']});\n * ```\n */\n constructor({ apiKey, authReferrerPolicy, channel, client, id = DEFAULT_ID, language, libraries = [], mapIds, nonce, region, retries = 3, url = \"https://maps.googleapis.com/maps/api/js\", version, }) {\n this.CALLBACK = \"__googleMapsCallback\";\n this.callbacks = [];\n this.done = false;\n this.loading = false;\n this.errors = [];\n this.apiKey = apiKey;\n this.authReferrerPolicy = authReferrerPolicy;\n this.channel = channel;\n this.client = client;\n this.id = id || DEFAULT_ID; // Do not allow empty string\n this.language = language;\n this.libraries = libraries;\n this.mapIds = mapIds;\n this.nonce = nonce;\n this.region = region;\n this.retries = retries;\n this.url = url;\n this.version = version;\n if (Loader.instance) {\n if (!fastDeepEqual(this.options, Loader.instance.options)) {\n throw new Error(`Loader must not be called again with different options. ${JSON.stringify(this.options)} !== ${JSON.stringify(Loader.instance.options)}`);\n }\n return Loader.instance;\n }\n Loader.instance = this;\n }\n get options() {\n return {\n version: this.version,\n apiKey: this.apiKey,\n channel: this.channel,\n client: this.client,\n id: this.id,\n libraries: this.libraries,\n language: this.language,\n region: this.region,\n mapIds: this.mapIds,\n nonce: this.nonce,\n url: this.url,\n authReferrerPolicy: this.authReferrerPolicy,\n };\n }\n get status() {\n if (this.errors.length) {\n return LoaderStatus.FAILURE;\n }\n if (this.done) {\n return LoaderStatus.SUCCESS;\n }\n if (this.loading) {\n return LoaderStatus.LOADING;\n }\n return LoaderStatus.INITIALIZED;\n }\n get failed() {\n return this.done && !this.loading && this.errors.length >= this.retries + 1;\n }\n /**\n * CreateUrl returns the Google Maps JavaScript API script url given the [[LoaderOptions]].\n *\n * @ignore\n */\n createUrl() {\n let url = this.url;\n url += `?callback=${this.CALLBACK}`;\n if (this.apiKey) {\n url += `&key=${this.apiKey}`;\n }\n if (this.channel) {\n url += `&channel=${this.channel}`;\n }\n if (this.client) {\n url += `&client=${this.client}`;\n }\n if (this.libraries.length > 0) {\n url += `&libraries=${this.libraries.join(\",\")}`;\n }\n if (this.language) {\n url += `&language=${this.language}`;\n }\n if (this.region) {\n url += `®ion=${this.region}`;\n }\n if (this.version) {\n url += `&v=${this.version}`;\n }\n if (this.mapIds) {\n url += `&map_ids=${this.mapIds.join(\",\")}`;\n }\n if (this.authReferrerPolicy) {\n url += `&auth_referrer_policy=${this.authReferrerPolicy}`;\n }\n return url;\n }\n deleteScript() {\n const script = document.getElementById(this.id);\n if (script) {\n script.remove();\n }\n }\n /**\n * Load the Google Maps JavaScript API script and return a Promise.\n */\n load() {\n return this.loadPromise();\n }\n /**\n * Load the Google Maps JavaScript API script and return a Promise.\n *\n * @ignore\n */\n loadPromise() {\n return new Promise((resolve, reject) => {\n this.loadCallback((err) => {\n if (!err) {\n resolve(window.google);\n }\n else {\n reject(err.error);\n }\n });\n });\n }\n /**\n * Load the Google Maps JavaScript API script with a callback.\n */\n loadCallback(fn) {\n this.callbacks.push(fn);\n this.execute();\n }\n /**\n * Set the script on document.\n */\n setScript() {\n if (document.getElementById(this.id)) {\n // TODO wrap onerror callback for cases where the script was loaded elsewhere\n this.callback();\n return;\n }\n const url = this.createUrl();\n const script = document.createElement(\"script\");\n script.id = this.id;\n script.type = \"text/javascript\";\n script.src = url;\n script.onerror = this.loadErrorCallback.bind(this);\n script.defer = true;\n script.async = true;\n if (this.nonce) {\n script.nonce = this.nonce;\n }\n document.head.appendChild(script);\n }\n /**\n * Reset the loader state.\n */\n reset() {\n this.deleteScript();\n this.done = false;\n this.loading = false;\n this.errors = [];\n this.onerrorEvent = null;\n }\n resetIfRetryingFailed() {\n if (this.failed) {\n this.reset();\n }\n }\n loadErrorCallback(e) {\n this.errors.push(e);\n if (this.errors.length <= this.retries) {\n const delay = this.errors.length * Math.pow(2, this.errors.length);\n console.log(`Failed to load Google Maps script, retrying in ${delay} ms.`);\n setTimeout(() => {\n this.deleteScript();\n this.setScript();\n }, delay);\n }\n else {\n this.onerrorEvent = e;\n this.callback();\n }\n }\n setCallback() {\n window.__googleMapsCallback = this.callback.bind(this);\n }\n callback() {\n this.done = true;\n this.loading = false;\n this.callbacks.forEach((cb) => {\n cb(this.onerrorEvent);\n });\n this.callbacks = [];\n }\n execute() {\n this.resetIfRetryingFailed();\n if (this.done) {\n this.callback();\n }\n else {\n // short circuit and warn if google.maps is already loaded\n if (window.google && window.google.maps && window.google.maps.version) {\n console.warn(\"Google Maps already loaded outside @googlemaps/js-api-loader.\" +\n \"This may result in undesirable behavior as options and script parameters may not match.\");\n this.callback();\n return;\n }\n if (this.loading) ;\n else {\n this.loading = true;\n this.setCallback();\n this.setScript();\n }\n }\n }\n}\n\nexport { DEFAULT_ID, Loader, LoaderStatus };\n//# sourceMappingURL=index.esm.js.map\n","import React from 'react';\nimport { Loader } from '@googlemaps/js-api-loader';\n\ntype LibrariesType = 'drawing' | 'geometry' | 'places' | 'visualization';\n\ninterface UseGoogleApiOptions {\n libraries?: LibrariesType[];\n apiKey: string;\n}\n\nfunction setupLoader(config: UseGoogleApiOptions) {\n return new Loader({\n apiKey: config.apiKey,\n version: 'weekly',\n libraries: config.libraries,\n retries: 3\n });\n}\n\nexport function useGoogleApi(options: UseGoogleApiOptions) {\n const config = {\n apiKey: options.apiKey,\n libraries: options.libraries || ['places']\n };\n\n const [ loaded, setLoaded ] = React.useState(false);\n const [ loader, setLoader ] = React.useState<Loader>(setupLoader(config));\n\n React.useEffect(() => {\n loaderCallback();\n }, []);\n\n function loaderCallback(onLoad?: () => void, onError?: (error: ErrorEvent) => void): void {\n if (!loader) {\n setLoader(setupLoader(config));\n return;\n }\n \n loader.loadCallback(error => {\n if (error) {\n setLoaded(false);\n onError && onError(error);\n return;\n }\n\n setLoaded(true);\n onLoad && onLoad();\n });\n }\n\n return {\n loader,\n scriptLoaded: loaded,\n onGoogleApiReady: loaderCallback\n };\n}","import React from 'react';\n\nimport { useGoogleApi } from 'libs/shared/apps/sign-up/hooks/useGoogleApi';\n\ninterface AutoCompleteServiceOptions {\n googleApiKey: string;\n}\n\nexport function useAutoCompleteService(options: AutoCompleteServiceOptions) {\n const { scriptLoaded } = useGoogleApi({ apiKey: options.googleApiKey });\n const [ autoCompleteService, setAutocompleteService ] = React.useState<google.maps.places.AutocompleteService>();\n\n React.useEffect(() => {\n if (!scriptLoaded)\n return;\n\n setAutocompleteService(new google.maps.places.AutocompleteService());\n }, [scriptLoaded]);\n\n return autoCompleteService;\n}","import React from 'react';\n\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { RandomHelper } from 'libs/common/react/utils/RandomHelper';\n\nimport { LocalityHelper } from 'libs/shared/apps/sign-up/helpers/LocalityHelper';\nimport { useAutoCompleteService } from 'libs/shared/apps/sign-up/hooks/useAutoCompleteService';\nimport { GeoLocation } from 'libs/shared/interfaces/responses/GeoLocation';\n\nconst DEFAULT_COUNTRY_CODE = 'us';\nconst STORAGE_KEY = 'country:placeholder:text';\n\ninterface CountryPlaceholderParams {\n geoLocation: GeoLocation;\n apiKey: string;\n makeRequest?: boolean;\n template?: string;\n templateKey?: string;\n}\n\nfunction getCachedPlaceholder(geoLocation: GeoLocation): string {\n const supportedPlaceholder = LocalityHelper.getLocalizedLocalityPlaceholderText(geoLocation?.countryCode);\n if (supportedPlaceholder)\n return supportedPlaceholder;\n\n const cachedPlaceholder: string = LocalStorageHelper.cacheGet(`${STORAGE_KEY}:${geoLocation?.countryCode}`);\n if (cachedPlaceholder)\n return cachedPlaceholder;\n\n return undefined;\n}\n\nfunction getRandomLowerCaseLetter() {\n return String.fromCharCode(96 + RandomHelper.getRandomInt(26));\n}\n\nexport function useCountryPlaceholder({\n apiKey,\n geoLocation,\n makeRequest = true,\n template = 'E.g. [placeholder]',\n templateKey = '[placeholder]'\n}: CountryPlaceholderParams) {\n const autoCompleteService = useAutoCompleteService({ googleApiKey: apiKey });\n const [ placeholder, setPlaceholder ] = React.useState<string>(() => getCachedPlaceholder(geoLocation));\n\n\n React.useEffect(() => {\n if (placeholder || !autoCompleteService || !makeRequest)\n return;\n\n const countryCode = geoLocation?.countryCode || DEFAULT_COUNTRY_CODE;\n\n const searchInput = getRandomLowerCaseLetter();\n\n const request: google.maps.places.AutocompletionRequest = {\n input: searchInput,\n types: ['(cities)'],\n region: countryCode,\n componentRestrictions: { country: countryCode }\n };\n\n autoCompleteService.getPlacePredictions(\n request,\n (result, status) => getRandomLocality(result, status, countryCode)\n );\n }, [ placeholder, autoCompleteService, geoLocation, makeRequest ]);\n\n function setCachedPlaceholder(placeholder: string, countryCode: string) {\n LocalStorageHelper.cacheSet(`${STORAGE_KEY}:${countryCode}`, placeholder, 86400); // 24 hour\n setPlaceholder(placeholder);\n }\n\n function getRandomLocality(\n results: google.maps.places.AutocompletePrediction[],\n status: google.maps.places.PlacesServiceStatus,\n countryCode: string\n ) {\n if (status !== google.maps.places.PlacesServiceStatus.OK || !results) {\n setCachedPlaceholder(LocalityHelper.getLocalizedLocalityPlaceholderText(DEFAULT_COUNTRY_CODE), countryCode);\n return;\n }\n\n const randomIndex = RandomHelper.getRandomInt(results.length);\n const randomCity = results[randomIndex].description;\n\n setCachedPlaceholder(template.replace(templateKey, randomCity), countryCode);\n }\n\n return placeholder;\n}","import React from 'react';\n\ninterface UseDropdownEventsOptions {\n onSelected: (index: number) => void;\n itemCount: number;\n hideOnBlur: boolean;\n hideInitially?: boolean;\n hideOnEnter?: boolean;\n}\n\nexport function useDropdownEvents(options: UseDropdownEventsOptions) {\n const [ selectedIndex, setSelectedIndex ] = React.useState<number>(0);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const [ hide, setHide ] = React.useState(!!options.hideInitially);\n\n // eslint-disable-next-line rulesdir/require-view-title\n function scrollIntoView(): void {\n if (!containerRef.current)\n return;\n\n containerRef.current.children[selectedIndex - 1]?.scrollIntoView({ block: 'center' });\n }\n\n function onKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void {\n if (options.hideOnEnter)\n setHide(false);\n\n if (event.code === 'ArrowDown') {\n event.stopPropagation();\n event.preventDefault();\n\n let newIndex = selectedIndex + 1;\n if (newIndex > options.itemCount)\n newIndex = 1;\n\n setSelectedIndex(newIndex);\n scrollIntoView();\n return;\n }\n\n if (event.code === 'ArrowUp') {\n event.stopPropagation();\n event.preventDefault();\n\n let newIndex = selectedIndex - 1;\n if (newIndex <= 0)\n newIndex = options.itemCount;\n\n setSelectedIndex(newIndex);\n scrollIntoView();\n return;\n }\n\n if (event.code === 'Enter' && selectedIndex > 0) {\n event.stopPropagation();\n event.preventDefault();\n\n options.onSelected(selectedIndex - 1);\n\n if (options.hideOnEnter)\n setHide(true);\n return;\n }\n\n setSelectedIndex(0);\n }\n \n function onFocus() {\n if (!options.hideOnBlur)\n return;\n\n setHide(false);\n }\n\n function onBlur() {\n if (!options.hideOnBlur)\n return;\n \n setHide(true);\n }\n\n return {\n selectedIndex,\n onKeyDown,\n containerRef,\n hide,\n onFocus,\n onBlur\n };\n}","export interface PlaceDetailsType {\n locality?: string;\n country?: string;\n city?: string;\n province?: string;\n postalCode?: string;\n longitude?: number;\n latitude?: number;\n}\n\nexport const PlaceHelper = {\n getPlaceDetails(result: google.maps.GeocoderResult | google.maps.places.PlaceResult): PlaceDetailsType {\n let city: string;\n let province: string;\n let country: string;\n let postalCode: string;\n\n const locality = result.formatted_address;\n \n for (const component of result.address_components) {\n for (const type of component.types) {\n /**\n * @todo if we cant find any of these type we will return an empty value so we need to look for more types (eg for. Austin Township, IL)\n */\n\n if (type === 'locality') {\n // locality = component.short_name;\n city = component.short_name;\n }\n\n if (type === 'administrative_area_level_1') {\n // locality += ', ' + component.short_name;\n province = component.short_name;\n }\n\n if (type === 'postal_code') {\n // locality += ', ' + component.short_name;\n postalCode = component.short_name;\n }\n\n if (type === 'country')\n country = component.short_name;\n }\n }\n return { locality, country, postalCode, city, province };\n }\n};","import React from 'react';\n\nimport { PlaceDetailsType, PlaceHelper } from 'libs/shared/apps/sign-up/helpers/PlaceHelper';\nimport { useGoogleApi } from 'libs/shared/apps/sign-up/hooks/useGoogleApi';\n\n/**\n * @note\n * In version 4.1.x the types have been changed to:\n * PositionError = GeolocationPositionError\n * Position = GeolocationPosition\n */\n\nconst ErrorPhraseMap: {[key: number]: string} = {\n 1: 'geocoderPermissionDenied',\n 2: 'geocoderUnavailable',\n 3: 'geocoderTimeout'\n};\n\ninterface UseGeocoderOptions {\n apiKey: string;\n onPositionError: (error: string) => void;\n}\n\nexport function useGeocoder(options: UseGeocoderOptions) {\n const [ details, setDetails ] = React.useState<PlaceDetailsType>({});\n\n const { onGoogleApiReady } = useGoogleApi(options);\n\n function onClickGetCurrentLocation() {\n onGoogleApiReady(() => {\n window.navigator.geolocation.getCurrentPosition(\n onPositionSuccess,\n onPositionError\n );\n });\n }\n\n function onPositionSuccess(position: GeolocationPosition) {\n const { latitude, longitude } = position.coords;\n \n const location = new google.maps.LatLng(latitude, longitude);\n const geocoder = new google.maps.Geocoder();\n\n geocoder.geocode(\n { location },\n (result, status) => {\n /**\n * @todo Handle state when status is other than OK\n */\n if (status !== google.maps.GeocoderStatus.OK)\n return;\n\n /**\n * @todo Handle state if this returns undefined\n */\n const place = result.find(item => {\n return item.types.includes('locality') || item.types.includes('administrative_area_level_2');\n });\n \n const details = PlaceHelper.getPlaceDetails(place);\n setDetails({\n ...details,\n longitude: longitude,\n latitude: latitude\n });\n }\n );\n }\n\n function onPositionError(error: GeolocationPositionError): void {\n let errorMessagePhrase = ErrorPhraseMap[error.code];\n if (!errorMessagePhrase) {\n errorMessagePhrase = 'geocoderUnknown';\n }\n options.onPositionError('We are unable to access your location. Please try again later.');\n }\n\n return {\n placeDetails: details,\n onClickGetCurrentLocation\n };\n}","import React from 'react';\n\nexport function CrosshairIcon(): JSX.Element {\n return (\n <svg viewBox='0 0 24 24'>\n <path d='m12.00559,20.40189c4.60881,0 8.37242,-3.78424 8.37242,-8.40189c0,-4.61764 -3.76361,-8.40187 -8.37242,-8.40187c-4.62002,0 -8.38365,3.78422 -8.38365,8.40187c0,4.61765 3.76364,8.40189 8.38365,8.40189zm0,-1.65557c-3.75235,0 -6.67085,-2.96208 -6.67085,-6.74632c0,-3.7842 2.91851,-6.74625 6.67085,-6.74625c3.74105,0 6.67084,2.96206 6.67084,6.74625c0,3.78424 -2.92978,6.74632 -6.67084,6.74632zm-10.14151,-6.02552l6.01731,0c0.40566,0 0.72118,-0.31536 0.72118,-0.7208c0,-0.40544 -0.31552,-0.7208 -0.72118,-0.7208l-6.01731,0c-0.40566,0 -0.72117,0.31536 -0.72117,0.7208c0,0.40544 0.31551,0.7208 0.72118,0.7208l-0.00001,0zm14.25442,0l6.0174,0c0.40565,0 0.72118,-0.31536 0.72118,-0.7208c0,-0.40544 -0.31553,-0.7208 -0.72118,-0.7208l-6.0174,0c-0.40565,0 -0.72118,0.31536 -0.72118,0.7208c0,0.40544 0.31553,0.7208 0.72118,0.7208zm-4.12417,-4.1221c0.40566,0 0.72118,-0.31534 0.72118,-0.70952l0,-6.02547c0,-0.40544 -0.31552,-0.7208 -0.72118,-0.7208c-0.3944,0 -0.7099,0.31536 -0.7099,0.7208l0,6.02547c0,0.39418 0.31551,0.70952 0.7099,0.70952zm0,14.25838c0.40566,0 0.72118,-0.3154 0.72118,-0.72077l0,-6.02541c0,-0.39425 -0.31552,-0.70965 -0.72118,-0.70965c-0.3944,0 -0.7099,0.3154 -0.7099,0.70965l0,6.02541c0,0.40538 0.31551,0.72077 0.7099,0.72077z'/>\n </svg>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"baseText\":\"KL3Q_\",\"inputFocused\":\"I6wQy\",\"dropdown\":\"oI3z7\",\"suggestionContainer\":\"Y78ea\",\"suggestionItem\":\"magL7\",\"suggestionLoading\":\"W7rH_\",\"noSuggestion\":\"XXSnS\",\"large\":\"b0Mz9\",\"input\":\"ChY5L\",\"selected\":\"snnHR\",\"useMyLocation\":\"dwmvC\"};","import React from 'react';\n\nimport { AnalyticsOptions, HashObject, SignUpDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { ClearableInput } from 'libs/shared/apps/sign-up/components/general/clear-input/ClearableInput';\nimport { PlaceDetailsType } from 'libs/shared/apps/sign-up/helpers/PlaceHelper';\nimport { useCountryPlaceholder } from 'libs/shared/apps/sign-up/hooks/useCountryPlaceholder';\nimport { useDropdownEvents } from 'libs/shared/apps/sign-up/hooks/useDropdownEvents';\nimport { useGeocoder } from 'libs/shared/apps/sign-up/hooks/useGeocoder';\nimport { useLocalitySearch } from 'libs/shared/apps/sign-up/hooks/useLocalitySearch';\nimport { SearchSchoolData } from 'libs/shared/apps/sign-up/interfaces/SearchSchoolData';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { CrosshairIcon } from 'libs/shared/images/components/CrosshairIcon';\nimport { GeoLocation } from 'libs/shared/interfaces/responses/GeoLocation';\n\nimport styles from './search-school-step-item.scss';\n\ninterface SearchLocalityInputProps {\n data: SearchSchoolData;\n disabled?: boolean;\n geoLocation: GeoLocation;\n googleMapsApiKey: string;\n \n setData: (placeData: SearchSchoolData) => void;\n clearData: () => void;\n logUserAction?: (data: HashObject | HashObject[], analyticsOptions: AnalyticsOptions) => void;\n\n labelClassName?: string;\n required?: boolean\n autoFocus?: boolean;\n size?: 'lg'\n useGeoLocationApi?: boolean;\n hideOnBlur?: boolean;\n}\n\ninterface LocalityPredictionsProps {\n predictions: google.maps.places.QueryAutocompletePrediction[];\n getPlaceInfo: (predicition: google.maps.places.QueryAutocompletePrediction) => void;\n selectedIndex: number;\n}\n\nfunction LocalityPredicitions(props: LocalityPredictionsProps): JSX.Element {\n const { predictions, getPlaceInfo, selectedIndex } = props;\n return (\n <>\n {predictions.map((predicition, index) => (\n <DivButton\n className={`${styles.suggestionItem} ${selectedIndex - 1 === index ? styles.selected : ''}`}\n key={predicition.place_id}\n onKeyDown={e => e.key === 'Enter' && getPlaceInfo(predicition)}\n onMouseDown={() => getPlaceInfo(predicition)}\n onClick={() => getPlaceInfo(predicition)}\n >\n {predicition.description}\n </DivButton>\n ))}\n </>\n );\n}\n\nexport function SearchLocalityInput(props: SearchLocalityInputProps): JSX.Element {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [ locality, setLocality ] = React.useState<string>(props.data?.schoolLocality || '');\n const [ makePredicition, setMakePredicition ] = React.useState(false);\n const countryPlaceholderText = useCountryPlaceholder({\n apiKey: props.googleMapsApiKey,\n geoLocation: props.geoLocation\n });\n const { localityPredicitions, getPlaceInfo } = useLocalitySearch({\n search: locality,\n makePredicition,\n geoLocation: props.geoLocation,\n apiKey: props.googleMapsApiKey\n });\n const { placeDetails, onClickGetCurrentLocation } = useGeocoder({\n apiKey: props.googleMapsApiKey,\n onPositionError\n });\n const extraItem = window.navigator.geolocation ? 1 : 0;\n const { selectedIndex, onKeyDown, containerRef, hide, onBlur, onFocus } = useDropdownEvents({\n onSelected, itemCount: localityPredicitions?.length + extraItem ?? 0, hideOnBlur: props.hideOnBlur\n });\n const [ geocoderError, setGeocoderError ] = React.useState<string>();\n\n React.useEffect(() => {\n setData(placeDetails);\n }, [placeDetails]);\n\n function onPositionError(error: string) {\n setMakePredicition(true);\n setGeocoderError(error);\n }\n\n function onSetLocality(localityValue: string): void {\n if (geocoderError) {\n setGeocoderError(undefined);\n }\n \n if (!makePredicition) {\n setMakePredicition(true);\n }\n if (props.data?.longitude || props.data?.latitude || props.data?.schoolLocality) {\n props.clearData();\n }\n setLocality(localityValue);\n }\n\n function onClickClearLocality(): void {\n onSetLocality('');\n inputRef.current.focus();\n }\n\n function onSelected(index: number): void {\n if (!localityPredicitions)\n return;\n\n if (index === localityPredicitions.length) {\n handleOnClickGetCurrentLocation();\n return;\n }\n\n const selected = localityPredicitions[index];\n\n if (selected)\n handleGetPlaceInfo(selected);\n }\n\n function setData(placeData: PlaceDetailsType) {\n props.setData({\n schoolLocality: placeData.locality,\n country: placeData.country,\n province: placeData.province,\n schoolPostCode: placeData.postalCode,\n longitude: placeData.longitude,\n latitude: placeData.latitude\n });\n placeData.locality && setLocality(placeData.locality);\n }\n\n function handleGetPlaceInfo(predicition: google.maps.places.QueryAutocompletePrediction) {\n if (makePredicition) setMakePredicition(false);\n\n getPlaceInfo(\n predicition,\n inputRef,\n setData\n );\n }\n\n function handleOnClickGetCurrentLocation(event?: React.MouseEvent) {\n event?.preventDefault();\n setMakePredicition(false);\n onClickGetCurrentLocation();\n\n props.logUserAction?.({}, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.UseMyLocation\n });\n }\n\n function getInputClass() {\n let baseClass = 'form-control';\n\n if (props.size === 'lg')\n baseClass += ' form-control-lg';\n\n if (!isInputFocused || hide) {\n return `${baseClass} ${styles.input}`;\n }\n\n return `${baseClass} ${styles.inputFocused}`;\n }\n\n const isInputFocused = localityPredicitions?.length && !props.data?.schoolLocality?.length;\n const geoLocationEnabled = window.navigator.geolocation && !props.data?.schoolLocality?.length;\n\n const labelClassName = props.labelClassName || `d-block text-center mb-3 fw-normal ${styles.baseText}`;\n let className = 'form-group position-relative';\n\n if (props.size === 'lg')\n className += ` ${styles.large}`;\n\n return (\n <div className={className}>\n <label\n className={labelClassName}\n htmlFor='locality-input'\n >\n ZIP code or city\n {props.required && <span className='text-danger'>*</span>}\n </label>\n <ClearableInput\n type='text'\n value={locality}\n onChange={e => onSetLocality(e.currentTarget.value)}\n id='locality-input'\n className={getInputClass()}\n ref={inputRef}\n autoComplete='off'\n placeholder={countryPlaceholderText || 'Loading...'}\n disabled={props.disabled || !countryPlaceholderText}\n autoFocus={props?.autoFocus}\n onClickClear={onClickClearLocality}\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n onBlur={onBlur}\n />\n <div className={`position-absolute z-1 w-100 ${styles.dropdown} ${hide ? 'd-none' : ''}`}>\n {!!isInputFocused &&\n <div className={styles.suggestionContainer} ref={containerRef}>\n <LocalityPredicitions\n predictions={localityPredicitions}\n getPlaceInfo={handleGetPlaceInfo}\n selectedIndex={selectedIndex}\n />\n {window.navigator.geolocation && props.useGeoLocationApi &&\n <DivButton\n className={`${styles.suggestionItem} px-1 ${selectedIndex - 1 === localityPredicitions.length ? styles.selected : ''}`}\n onClick={handleOnClickGetCurrentLocation}\n >\n <div className='btn btn-link info-link btn-with-icon bg-transparent py-0 pe-1'>\n <CrosshairIcon />\n Use my current location\n </div>\n </DivButton>\n }\n </div>\n }\n {geoLocationEnabled && !isInputFocused && props.useGeoLocationApi &&\n <div className={`d-flex ${styles.useMyLocation}`}>\n <button onClick={handleOnClickGetCurrentLocation} className='btn btn-link info-link bg-white btn-with-icon'>\n <CrosshairIcon />\n Use my current location\n </button>\n </div>\n }\n {!!geocoderError && (\n <div className='text-danger p-2'>\n {geocoderError}\n </div>\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { PlaceDetailsType, PlaceHelper } from 'libs/shared/apps/sign-up/helpers/PlaceHelper';\nimport { useAutoCompleteService } from 'libs/shared/apps/sign-up/hooks/useAutoCompleteService';\nimport { useDebounce } from 'libs/shared/hooks/UseDebounce';\nimport { GeoLocation } from 'libs/shared/interfaces/responses/GeoLocation';\n\ninterface LocalitySearchParams {\n search: string;\n makePredicition: boolean;\n geoLocation: GeoLocation;\n apiKey: string;\n}\n\nexport function useLocalitySearch({\n search,\n makePredicition,\n geoLocation,\n apiKey\n}: LocalitySearchParams) {\n const autoCompleteService = useAutoCompleteService({ googleApiKey: apiKey });\n const debouncedSearch: string = useDebounce(search, 300);\n const [ localityPredicitions, setLocalityPredicitions ] =\n React.useState<google.maps.places.QueryAutocompletePrediction[]>();\n\n React.useEffect(() => {\n if (!autoCompleteService)\n return;\n\n if (debouncedSearch?.length === 0 || !makePredicition) {\n setLocalityPredicitions(undefined);\n return;\n }\n\n const countryCode = geoLocation?.countryCode || 'us';\n autoCompleteService.getPlacePredictions({\n input: debouncedSearch,\n componentRestrictions: geoLocation?.isFallback ? undefined : {\n country: countryCode\n },\n region: countryCode,\n types: [ 'locality', 'sublocality', 'postal_code' ]\n }, getLocalityPredictions);\n }, [ debouncedSearch, makePredicition, autoCompleteService ]);\n\n function getLocalityPredictions(\n predicitions: google.maps.places.QueryAutocompletePrediction[] | null,\n status: google.maps.places.PlacesServiceStatus\n ) {\n /**\n * @todo Handle state when status is other than OK\n */\n if (status !== google.maps.places.PlacesServiceStatus.OK || !predicitions) {\n setLocalityPredicitions(undefined);\n return;\n }\n setLocalityPredicitions(predicitions);\n }\n\n function getPlaceInfo(\n predicition: google.maps.places.QueryAutocompletePrediction,\n inputRef: React.MutableRefObject<HTMLInputElement>,\n callback: (placeData: PlaceDetailsType) => void\n ) {\n const placeService = new google.maps.places.PlacesService(inputRef.current);\n placeService.getDetails({\n placeId: predicition.place_id,\n fields: [ 'geometry', 'address_components', 'formatted_address' ],\n region: geoLocation.countryCode\n }, (place, status) => {\n if (status !== google.maps.places.PlacesServiceStatus.OK) return;\n const longitude = place.geometry.location.lng();\n const latitude = place.geometry.location.lat();\n const { locality, country, postalCode, city, province } = PlaceHelper.getPlaceDetails(place);\n callback({ longitude, latitude, locality, country, city, postalCode, province });\n });\n }\n\n return { localityPredicitions, getPlaceInfo };\n}","export class ApiError<T> extends Error {\n public body: T;\n \n constructor(body: T, message: string = 'Error') {\n super(message);\n this.body = body;\n }\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { ApiError } from 'libs/shared/apps/sign-up/errors/ApiError';\nimport { UrlHelper } from 'libs/shared/apps/sign-up/helpers/UrlHelper';\n\ninterface FetchOptions<T, X> {\n url: string;\n method?: HttpVerbs;\n data?: HashObject;\n init?: RequestInit;\n success?: (data: T) => void;\n error?: (data?: X) => void;\n always?: () => void;\n}\n\nfunction prepareRequest<T, X = any>(options: FetchOptions<T, X>) {\n let init: RequestInit = {\n method: HttpVerbs.GET,\n headers: {\n 'Content-type': 'application/json'\n }\n };\n\n if (options.method) {\n init = { ...init, method: options.method };\n }\n\n if (options.init) {\n init = { ...init, ...options.init };\n }\n\n let url = options.url;\n\n if (init.method === HttpVerbs.GET && options.data) {\n url = UrlHelper.prepareQuery(url, options.data);\n } else if (options.data) {\n init = {\n ...init,\n body: JSON.stringify(options.data)\n };\n }\n return {\n init,\n url\n };\n}\n\nexport const FetchHelper = {\n async asyncFetch<T, X = any>(options: FetchOptions<T, X>) {\n const request = prepareRequest<T, X>(options);\n const response = await fetch(request.url, request.init);\n\n if (!response.ok) {\n const json: X = await response.json();\n throw new ApiError<X>(json);\n }\n // No content response\n if (response.status === 204) {\n return;\n }\n \n return await response.json() as T;\n },\n\n async asyncFetchPlain<T, X>(options: FetchOptions<T, X>) {\n const request = prepareRequest<T, X>(options);\n const response = await fetch(request.url, request.init);\n\n if (!response.ok) {\n return;\n }\n return await response.text();\n },\n\n fetch<T, X = any>(options: FetchOptions<T, X>): Promise<T> {\n const request = prepareRequest<T, X>(options);\n \n return fetch(request.url, request.init)\n .then<T>(response => {\n if (response.status === 204) {\n return;\n }\n return response.json();\n })\n .then<T>((data: T) => {\n if (options.success)\n options.success(data);\n\n return data;\n })\n .catch<T>((reason: any) => {\n if (options.error)\n options.error();\n\n return reason;\n })\n .finally(() => {\n if (options.always)\n options.always();\n });\n }\n};","import { HashObject } from 'libs/analytics/interfaces';\n\nexport const UrlHelper = {\n prepareQuery(baseUrl: string, requestData: HashObject): string {\n let finalUrl = baseUrl;\n Object.keys(requestData).forEach((key: string, index: number) => {\n if (requestData[key]) {\n if (index === 0) {\n finalUrl += '?';\n } else {\n finalUrl += '&';\n }\n finalUrl += `${key}=${encodeURIComponent(requestData[key])}`;\n }\n });\n\n return finalUrl;\n }\n};","export enum ProspectStatus {\n Published = 'Published',\n Draft = 'Draft'\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { ProspectLookup } from 'libs/shared/apps/sign-up/enums/ProspectLookup';\nimport { FetchHelper } from 'libs/shared/apps/sign-up/helpers/FetchHelper';\nimport { CreateProspectRequest } from 'libs/shared/apps/sign-up/interfaces/requests/CreateProspectRequest';\nimport { SearchProspectRequest } from 'libs/shared/apps/sign-up/interfaces/requests/SearchProspectRequest';\nimport { CreateProspectErrorResponse, CreateProspectSuccessResponse } from 'libs/shared/apps/sign-up/interfaces/response/CreateProspectResponse';\nimport { SearchProspectResponseItem } from 'libs/shared/apps/sign-up/interfaces/response/SearchProspectResponse';\nimport { SignUpAjaxUrls } from 'libs/shared/apps/sign-up/interfaces/SignUpAjaxUrls';\n\nexport const ProspectRequests = {\n search(\n url: string,\n data: SearchProspectRequest,\n success?: (data: SearchProspectResponseItem[]) => void,\n error?: () => void,\n always?: () => void\n ) {\n const requestData: HashObject = {\n longitude: data.longitude,\n latitude: data.latitude\n };\n\n if (data.query) {\n requestData.query = data.query;\n }\n \n FetchHelper.fetch<SearchProspectResponseItem[]>({\n url: url,\n data: requestData,\n success,\n error,\n always\n });\n },\n async create(\n urls: SignUpAjaxUrls,\n data: CreateProspectRequest\n ) {\n return FetchHelper.asyncFetch<CreateProspectSuccessResponse, CreateProspectErrorResponse>({\n url: urls.createProspect,\n method: HttpVerbs.POST,\n data: data\n });\n },\n getLookups(urls: SignUpAjaxUrls, prospectId: string) {\n return FetchHelper.asyncFetch<ProspectLookup[]>({\n url: urls.prospectLookups(prospectId)\n });\n }\n};","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { SignUpProduct } from 'libs/shared/apps/sign-up/enums/SignUpProduct';\nimport { FetchHelper } from 'libs/shared/apps/sign-up/helpers/FetchHelper';\nimport { IdentityProvider } from 'libs/shared/apps/sign-up/interfaces/IdentityProvider';\nimport { AutoJoinRequest } from 'libs/shared/apps/sign-up/interfaces/requests/AutoJoinRequest';\nimport { CheckProspectTrialStatusRequest } from 'libs/shared/apps/sign-up/interfaces/requests/CheckProspectTrialStatusRequest';\nimport { CheckTrialStatusRequest } from 'libs/shared/apps/sign-up/interfaces/requests/CheckTrialStatusRequest';\nimport { CreateTrialRequest } from 'libs/shared/apps/sign-up/interfaces/requests/CreateTrialRequest';\nimport { JoinRequest } from 'libs/shared/apps/sign-up/interfaces/requests/JoinRequest';\nimport { ResendTrialEmailRequest } from 'libs/shared/apps/sign-up/interfaces/requests/ResendTrialEmailRequest';\nimport { CheckTrialStatusResponse } from 'libs/shared/apps/sign-up/interfaces/response/CheckTrialStatusResponse';\nimport { CreateTrialErrorResponse, CreateTrialSuccessResponse } from 'libs/shared/apps/sign-up/interfaces/response/CreateTrialResponse';\nimport { SignUpAjaxUrls } from 'libs/shared/apps/sign-up/interfaces/SignUpAjaxUrls';\n\nexport const UserRequests = {\n checkTrialStatus(\n urls: SignUpAjaxUrls,\n data: CheckTrialStatusRequest\n ) {\n if (urls.productName !== SignUpProduct.Lite)\n return Promise.reject();\n\n const requestData: HashObject = {\n email: data.email\n };\n\n return FetchHelper.asyncFetch<CheckTrialStatusResponse>({\n url: urls.userStatus,\n data: requestData\n });\n },\n\n checkUserIdps(\n urls: SignUpAjaxUrls,\n email: string\n ) {\n if (urls.productName !== SignUpProduct.Lite)\n return Promise.reject();\n\n return FetchHelper.asyncFetch<IdentityProvider[]>({\n url: urls.idps,\n data: { email }\n });\n },\n\n checkProspectTrialStatus(\n urls: SignUpAjaxUrls,\n data: CheckProspectTrialStatusRequest,\n success?: (data: CheckTrialStatusResponse) => void,\n error?: () => void,\n always?: () => void\n ) {\n let fetchUrl = urls.prospectStatus(data.prospectId);\n fetchUrl = UrlHelper.urlBuilder(fetchUrl, { email: data.email });\n FetchHelper.fetch<CheckTrialStatusResponse>({\n url: fetchUrl,\n success,\n error,\n always\n });\n },\n \n createTrial(\n urls: SignUpAjaxUrls,\n data: CreateTrialRequest\n ) {\n const requestData: HashObject = {\n prospectId: data.prospectId,\n email: data.email,\n userType: data.userType,\n appLink: data?.appLink,\n attribution: data?.attribution\n };\n\n return FetchHelper.asyncFetch<CreateTrialSuccessResponse, CreateTrialErrorResponse>({\n url: urls.createTrial,\n method: HttpVerbs.POST,\n data: requestData\n });\n },\n\n resendTrialEmail(\n urls: SignUpAjaxUrls,\n userId: string,\n data: ResendTrialEmailRequest\n ) {\n if (urls.productName !== SignUpProduct.Lite)\n return Promise.reject();\n\n const requestData: HashObject = {\n email: data.email,\n appLink: data?.appLink\n };\n\n // The success response is just an empty 204\n return FetchHelper.asyncFetch<never, any>({\n url: urls.resendTrialEmail(userId),\n method: HttpVerbs.POST,\n data: requestData\n });\n },\n\n createJoinRequest(\n urls: SignUpAjaxUrls,\n request: JoinRequest\n ) {\n const url = urls.productName === SignUpProduct.Auth ?\n urls.joinRequest :\n urls.joinRequest(request.customerId);\n\n const data = urls.productName === SignUpProduct.Auth ?\n request :\n { email: request.email };\n\n return FetchHelper.asyncFetch({\n url,\n method: HttpVerbs.POST,\n data\n });\n },\n\n createAutoJoinRequest(\n urls: SignUpAjaxUrls,\n request: AutoJoinRequest\n ) {\n if (urls.productName !== SignUpProduct.Lite)\n return Promise.reject();\n\n return FetchHelper.asyncFetch({\n url: urls.autoJoin,\n method: HttpVerbs.POST,\n data: request\n });\n }\n};","import { LocalityHelper } from 'libs/shared/apps/sign-up/helpers/LocalityHelper';\nimport { CountryCode } from 'libs/shared/enums/CountryCode';\n\nconst AU_SCHOOL_TYPES = [\n 'Primary',\n 'Secondary',\n 'K12',\n 'Special',\n 'TAFE',\n 'University'\n];\n\nconst UK_SCHOOL_TYPES = [\n 'Primary',\n 'Secondary',\n 'Primary & Secondary',\n 'Special',\n 'Sixth Form College',\n 'FE College',\n 'University',\n 'Other'\n];\n\nconst US_SCHOOL_TYPES = [\n 'Elementary',\n 'Middle School',\n 'High School',\n 'College',\n 'Other'\n];\n\nconst SCHOOL_TYPES: {[key in CountryCode]: string[]} = {\n au: AU_SCHOOL_TYPES,\n nz: AU_SCHOOL_TYPES,\n uk: UK_SCHOOL_TYPES,\n us: US_SCHOOL_TYPES\n};\n\nexport function getSchoolTypesByGeoLocation(geoLocation: string): string[] {\n const countryCode = LocalityHelper.getCountryCode(geoLocation);\n const schoolTypes = SCHOOL_TYPES[countryCode];\n\n // default to US school types\n if (!schoolTypes)\n return US_SCHOOL_TYPES;\n\n return schoolTypes;\n}","import React from 'react';\n\ninterface CompletedProps {\n className?: string;\n}\n\nfunction getClassName(baseClass: string, className: string): string {\n return className ? `${baseClass} ${className}` : baseClass;\n}\n\nfunction Heading(props: React.PropsWithChildren<CompletedProps>): JSX.Element {\n const baseClass = 'text-center mb-2 h4';\n return (\n <h1 className={getClassName(baseClass, props.className)}>\n {props.children}\n </h1>\n );\n}\n\nfunction Body(props: React.PropsWithChildren<CompletedProps>): JSX.Element {\n const baseClass = 'text-center text-sm px-2 px-lg-4';\n return (\n <div className={getClassName(baseClass, props.className)}>\n {props.children}\n </div>\n );\n}\n\nfunction Message(props: React.PropsWithChildren<CompletedProps>): JSX.Element {\n const baseClass = '';\n return (\n <p className={getClassName(baseClass, props.className)}>\n {props.children}\n </p>\n );\n}\n\nexport const Completed = {\n Heading,\n Body,\n Message\n};\n","import React from 'react';\n\nimport { TrialStatus } from 'libs/shared/apps/sign-up/enums/TrialStatus';\nimport { SignUpImageUrls } from 'libs/shared/apps/sign-up/interfaces/SignUpImageUrls';\n\ninterface StatusImageProps {\n trialStatus: TrialStatus;\n imageUrls: SignUpImageUrls;\n}\n\nexport function StatusImage(props: StatusImageProps): JSX.Element {\n const StatusImageMap = {\n [TrialStatus.Available]: props.imageUrls.statusImages.available,\n [TrialStatus.Active]: props.imageUrls.statusImages.active,\n [TrialStatus.Expired]: props.imageUrls.statusImages.expired,\n [TrialStatus.NotRequired]: props.imageUrls.statusImages.notRequired,\n [TrialStatus.Unavailable]: props.imageUrls.statusImages.unavailable,\n [TrialStatus.Unsupported]: props.imageUrls.statusImages.unsupported,\n [TrialStatus.UserAutoJoinAllowed]: props.imageUrls.statusImages.notRequired,\n [TrialStatus.UserJoinApprovalRequired]: props.imageUrls.statusImages.notRequired,\n [TrialStatus.InvalidEmail]: '',\n [TrialStatus.BdmTrialAvailable]: ''\n };\n\n return (\n <div className='d-flex justify-content-center my-4 px-2 px-lg-4'>\n <img src={StatusImageMap[props.trialStatus]} className='w-100 h-auto' />\n </div>\n );\n}","import React from 'react';\n\nimport { Completed } from 'libs/shared/apps/sign-up/components/general/completed';\nimport { ExternalLinkHelper } from 'libs/shared/apps/sign-up/helpers/ExternalLinkHelper';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\n\ninterface ExistingCustomerProps extends BaseStepItemProps {\n email: string;\n schoolName: string;\n customerId: string;\n}\n\nexport function ExistingCustomer(props: ExistingCustomerProps): JSX.Element {\n const isLastStepFindSchool = props?.previousStepIds && props.previousStepIds[props.previousStepIds.length - 1] === 'find-school';\n const schoolName = props?.schoolName || 'Your school';\n\n return (\n <Completed.Body className='mb-3'>\n {(() => {\n if (isLastStepFindSchool) {\n return (\n <>\n <Completed.Heading>\n {schoolName}<br/>already has ClickView 🎉\n </Completed.Heading>\n <Completed.Message className='mt-3'>\n If your school has SSO \n <a\n href={props.getSignInUrl({ email: props.email, customerId: props.customerId })}\n className='info-link'\n >\n click here to sign in.\n </a>\n </Completed.Message>\n <Completed.Message>\n Otherwise please contact your school admin for access.\n </Completed.Message>\n </>\n );\n }\n\n return (\n <>\n <Completed.Heading>\n Good News!\n </Completed.Heading>\n <Completed.Message>\n An account already exists for:<br /> <strong>{props.email}</strong>\n </Completed.Message>\n <Completed.Message>\n <a\n href={props.getSignInUrl({ email: props.email })}\n className='btn btn-dark btn-lg w-100'\n >\n Sign into ClickView\n </a>\n </Completed.Message>\n </>\n );\n })()}\n \n <Completed.Message>\n Need Help? \n <a href={ExternalLinkHelper.getSupportUrlForGeoLocation(props.geoLocation)} className='info-link' target='_blank'>\n Contact our Help Centre.\n </a>\n </Completed.Message>\n\n </Completed.Body>\n );\n}","import React from 'react';\n\nimport { ExistingCustomer } from 'libs/shared/apps/sign-up/components/steps/completed-step-item/existing-customer/ExistingCustomer';\nimport { ExpiredTrial } from 'libs/shared/apps/sign-up/components/steps/completed-step-item/expired-trial/ExpiredTrial';\nimport { TrialNotAvailable } from 'libs/shared/apps/sign-up/components/steps/completed-step-item/trial-not-available/TrialNotAvailable';\nimport { Unsupported } from 'libs/shared/apps/sign-up/components/steps/completed-step-item/unsupported/Unsupported';\nimport { VerifyAccount } from 'libs/shared/apps/sign-up/components/steps/completed-step-item/verify-account/VerifyAccount';\nimport { TrialStatus } from 'libs/shared/apps/sign-up/enums/TrialStatus';\nimport { UserType } from 'libs/shared/apps/sign-up/enums/UserType';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\n\ninterface StatusMessageProps extends BaseStepItemProps {\n email: string;\n userId: string;\n customerId: string;\n prospectId: string;\n schoolName: string;\n\n userType: UserType;\n trialStatus: TrialStatus;\n}\n\nconst StatusMessageMap: Record<TrialStatus, (props: StatusMessageProps) => JSX.Element> = {\n [TrialStatus.Available]: VerifyAccount,\n [TrialStatus.Active]: ExistingCustomer,\n [TrialStatus.Expired]: ExpiredTrial,\n [TrialStatus.NotRequired]: ExistingCustomer,\n [TrialStatus.Unavailable]: TrialNotAvailable,\n [TrialStatus.Unsupported]: Unsupported,\n [TrialStatus.UserAutoJoinAllowed]: ExistingCustomer,\n [TrialStatus.UserJoinApprovalRequired]: ExistingCustomer,\n [TrialStatus.InvalidEmail]: null,\n [TrialStatus.BdmTrialAvailable]: null\n};\n\nexport function StatusMessage(props: StatusMessageProps): JSX.Element {\n const Message = StatusMessageMap[props.trialStatus];\n\n /**\n * We shouldn't end up on status message with a trial status of InvalidEmail or BdmTrialAvailable. - Sha\n */\n if (!Message)\n return <></>;\n\n return <Message {...props} />;\n}","import React from 'react';\n\nimport { SignUpDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { Completed } from 'libs/shared/apps/sign-up/components/general/completed';\nimport { UserType } from 'libs/shared/apps/sign-up/enums/UserType';\nimport { UserRequests } from 'libs/shared/apps/sign-up/fetch-requests/UserRequests';\nimport { ExternalLinkHelper } from 'libs/shared/apps/sign-up/helpers/ExternalLinkHelper';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\n\nconst MAX_EMAIL_RESEND_COUNT = 1;\n\ninterface VerifyAccountProps extends BaseStepItemProps {\n userId: string;\n email: string;\n}\n\nexport function VerifyAccount(props: VerifyAccountProps): JSX.Element {\n const [ resendEmailCount, setResendEmailCount ] = React.useState<number>(0);\n const [ hasResendError, setHasResendError ] = React.useState<boolean>(false);\n \n async function onClickResend(event?: React.MouseEvent): Promise<void> {\n event?.preventDefault();\n\n try {\n await UserRequests.resendTrialEmail(\n props.ajaxUrls,\n props.userId,\n {\n email: props.email,\n appLink: props.pageAppLinkString\n }\n );\n setResendEmailCount(resendEmailCount + 1);\n } catch (e) {\n setHasResendError(true);\n }\n props.logUserAction({}, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.ResendEmail\n });\n }\n\n function onClickWrongEmail(event?: React.MouseEvent): void {\n event?.preventDefault();\n\n props.logUserAction({}, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.WrongEmail\n });\n\n props.nextStep({\n step: 'enter-email',\n userType: UserType.Staff\n });\n }\n\n if (!props?.email) return;\n\n return (\n <Completed.Body>\n\n <Completed.Heading>\n Check your inbox!\n </Completed.Heading>\n\n <Completed.Message>\n An email has been sent to <strong>{props.email}</strong>.\n </Completed.Message>\n\n {!!props.userId &&\n <>\n {resendEmailCount < MAX_EMAIL_RESEND_COUNT ? (\n <button onClick={onClickResend} className='btn btn-outline-dark btn-lg mb-3'>\n Resend verification email\n </button>\n ) : (\n <Completed.Message>\n ✅ Email has been resent!\n </Completed.Message>\n )}\n\n <Completed.Message>\n Wrong email? \n <button onClick={onClickWrongEmail} className='btn info-link p-0'>\n Update email address\n </button>\n </Completed.Message>\n\n {hasResendError &&\n <Completed.Message className='mb-0 text-danger'>\n ❌ There was a problem resending the email. Please try again later or contact our\n \n <a href={ExternalLinkHelper.getSupportUrlForGeoLocation(props.geoLocation)} className='info-link'>\n support\n </a>\n </Completed.Message>\n }\n </>\n }\n \n \n </Completed.Body>\n );\n}","import React from 'react';\n\nimport { Completed } from 'libs/shared/apps/sign-up/components/general/completed';\nimport { ExternalLinkHelper } from 'libs/shared/apps/sign-up/helpers/ExternalLinkHelper';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\n\ninterface ExpiredTrialProps extends BaseStepItemProps {\n schoolName: string;\n}\n\nexport function ExpiredTrial(props: ExpiredTrialProps): JSX.Element {\n const salesContactLink = ExternalLinkHelper.getMarketingSalesContactForGeoLocation(props.geoLocation);\n const isLastStepFindSchool = props?.previousStepIds && props.previousStepIds[props.previousStepIds.length - 1] === 'find-school';\n const schoolName = props?.schoolName || 'Your school';\n\n return (\n <Completed.Body>\n\n <Completed.Heading>\n {\n isLastStepFindSchool ?\n `${schoolName} trial has expired`\n :\n 'Your trial has expired'\n }\n </Completed.Heading>\n \n <Completed.Message>\n Please contact our \n <a href={salesContactLink} className='info-link' target='_blank'>\n ClickView Sales Team\n </a>\n </Completed.Message>\n \n </Completed.Body>\n );\n}","import React from 'react';\n\nimport { Completed } from 'libs/shared/apps/sign-up/components/general/completed';\nimport { ExternalLinkHelper } from 'libs/shared/apps/sign-up/helpers/ExternalLinkHelper';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\n\ninterface TrialNotAvailableProps extends BaseStepItemProps {\n schoolName: string;\n}\n\nexport function TrialNotAvailable(props: TrialNotAvailableProps): JSX.Element {\n const salesContactLink = ExternalLinkHelper.getMarketingSalesContactForGeoLocation(props.geoLocation);\n\n return (\n <Completed.Body>\n <Completed.Heading>\n Your school no longer<br /> has access to ClickView\n </Completed.Heading>\n\n <Completed.Message>\n Please contact our <a href={salesContactLink} className='info-link'>ClickView Sales Team</a> for more information.\n </Completed.Message>\n </Completed.Body>\n );\n}","import React from 'react';\n\nimport { Completed } from 'libs/shared/apps/sign-up/components/general/completed';\n\nexport function Unsupported(): JSX.Element {\n return (\n <Completed.Body>\n\n <Completed.Heading className='px-2 px-lg-4'>\n ClickView isn't currently <br/> available for your school\n </Completed.Heading>\n\n <Completed.Message>\n We're working hard to get ClickView ready for more people.\n </Completed.Message>\n </Completed.Body>\n );\n}","export const YOUNG_STUDENT_STORAGE_KEY = 'young-student';","import React from 'react';\n\nimport { AddedToBraze } from 'libs/shared/apps/sign-up/components/steps/completed-step-item/added-to-braze/AddedToBraze';\nimport { RequestedAccess } from 'libs/shared/apps/sign-up/components/steps/completed-step-item/requested-access/RequestedAccess';\nimport { TrialStatusCompletion } from 'libs/shared/apps/sign-up/components/steps/completed-step-item/trial-status-completion/TrialStatusCompletion';\nimport { YoungStudent } from 'libs/shared/apps/sign-up/components/steps/completed-step-item/young-student/YoungStudent';\nimport { TrialStatus } from 'libs/shared/apps/sign-up/enums/TrialStatus';\nimport { UserType } from 'libs/shared/apps/sign-up/enums/UserType';\nimport { BaseStepItemProps, CompletionStepIds } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\n\nconst CompletedStepMap: {[key in CompletionStepIds]: (props: BaseStepItemProps) => JSX.Element} = {\n 'trial-status': TrialStatusCompletion,\n 'added-to-braze': AddedToBraze,\n 'young-student': YoungStudent,\n 'requested-access': RequestedAccess\n};\n\ninterface CompletedStepItemProps extends BaseStepItemProps {\n email: string;\n userType: UserType;\n trialStatus: TrialStatus;\n trialCreated: boolean;\n \n userId: string;\n customerId: string;\n prospectId: string;\n schoolName: string;\n schoolType: string;\n schoolPostCode: string;\n country: string;\n completionStep: CompletionStepIds;\n}\n\nexport function CompletedStepItem(props: CompletedStepItemProps): JSX.Element {\n const Step = CompletedStepMap[props.completionStep];\n\n return (\n <div className='d-flex justify-content-center flex-column mx-auto px-2'>\n <Step {...props} />\n </div>\n );\n}","import React from 'react';\n\nimport { AnalyticsOptions, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { StatusImage } from 'libs/shared/apps/sign-up/components/steps/completed-step-item/trial-status-completion/StatusImage';\nimport { StatusMessage } from 'libs/shared/apps/sign-up/components/steps/completed-step-item/trial-status-completion/StatusMessage';\nimport { TrialStatus } from 'libs/shared/apps/sign-up/enums/TrialStatus';\nimport { UserType } from 'libs/shared/apps/sign-up/enums/UserType';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\nimport { SignUpImageUrls } from 'libs/shared/apps/sign-up/interfaces/SignUpImageUrls';\n\ninterface TrialStatusCompletionProps extends BaseStepItemProps {\n email: string;\n userId: string;\n customerId: string;\n prospectId: string;\n schoolName: string;\n userType: UserType;\n trialStatus: TrialStatus;\n trialCreated: boolean;\n imageUrls: SignUpImageUrls;\n}\n\nexport function TrialStatusCompletion(props: TrialStatusCompletionProps): JSX.Element {\n React.useEffect(() => {\n const analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Create,\n descriptor: SignUpDescriptors.DeadEnd,\n workflowPhase: WorkflowPhase.Discard\n };\n\n if (props.trialCreated) {\n analyticsOptions.descriptor = SignUpDescriptors.TrialCreated;\n analyticsOptions.workflowPhase = WorkflowPhase.Complete;\n }\n\n props.logUserAction({}, analyticsOptions);\n }, []);\n\n return (\n <>\n <StatusImage trialStatus={props.trialStatus} imageUrls={props.imageUrls} />\n <StatusMessage {...props} />\n </>\n );\n}","import React from 'react';\n\nimport { SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { Completed } from 'libs/shared/apps/sign-up/components/general/completed';\nimport { StatusImage } from 'libs/shared/apps/sign-up/components/steps/completed-step-item/trial-status-completion/StatusImage';\nimport { TrialStatus } from 'libs/shared/apps/sign-up/enums/TrialStatus';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\n\nexport function AddedToBraze(props: BaseStepItemProps): JSX.Element {\n React.useEffect(() => {\n props.logUserAction({}, {\n actionType: UserAction.Create,\n descriptor: SignUpDescriptors.TrialRequested,\n workflowPhase: WorkflowPhase.Complete\n });\n }, []);\n \n return (\n <>\n <StatusImage trialStatus={TrialStatus.Available} imageUrls={props.imageUrls} />\n <Completed.Body className='mb-3'>\n \n <Completed.Heading>\n Submitted!\n </Completed.Heading>\n \n <Completed.Message>\n Thank you for your interest in trialing ClickView. We will be in touch with you as soon as possible.\n </Completed.Message>\n \n </Completed.Body>\n </>\n );\n}","import React from 'react';\n\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\n\nimport { Completed } from 'libs/shared/apps/sign-up/components/general/completed';\nimport { StatusImage } from 'libs/shared/apps/sign-up/components/steps/completed-step-item/trial-status-completion/StatusImage';\nimport { YOUNG_STUDENT_STORAGE_KEY } from 'libs/shared/apps/sign-up/constants/YoungStudentStorageKey';\nimport { TrialStatus } from 'libs/shared/apps/sign-up/enums/TrialStatus';\nimport { ExternalLinkHelper } from 'libs/shared/apps/sign-up/helpers/ExternalLinkHelper';\nimport { SignUpImageUrls } from 'libs/shared/apps/sign-up/interfaces/SignUpImageUrls';\nimport { GeoLocation } from 'libs/shared/interfaces/responses/GeoLocation';\n\ninterface YoungStudentProps {\n geoLocation: GeoLocation;\n imageUrls: SignUpImageUrls;\n}\n\nexport function YoungStudent(props: YoungStudentProps): JSX.Element {\n const link = ExternalLinkHelper.getFreeResourcesForGeoLocation(props.geoLocation);\n\n /**\n * This value is set here and read in by the `<MultiStepform />`\n * essentially locking out the student from signing up. - Sha\n */\n React.useEffect(() => {\n LocalStorageHelper.set(YOUNG_STUDENT_STORAGE_KEY, true);\n }, []);\n\n return (\n <>\n <StatusImage trialStatus={TrialStatus.Active} imageUrls={props.imageUrls} />\n <Completed.Body className='mb-3'>\n <Completed.Heading>\n Discover our free content\n </Completed.Heading>\n <Completed.Message>\n Click the button below to explore our videos\n </Completed.Message>\n\n <a href={link} className='btn btn-lg btn-dark w-100' target='_blank'>\n Start watching now\n </a>\n </Completed.Body>\n </>\n );\n}","import React from 'react';\n\nimport { Completed } from 'libs/shared/apps/sign-up/components/general/completed';\nimport { StatusImage } from 'libs/shared/apps/sign-up/components/steps/completed-step-item/trial-status-completion/StatusImage';\nimport { TrialStatus } from 'libs/shared/apps/sign-up/enums/TrialStatus';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\n\nexport function RequestedAccess(props: BaseStepItemProps): JSX.Element {\n return (\n <>\n <StatusImage trialStatus={TrialStatus.Available} imageUrls={props.imageUrls} />\n <Completed.Body className='mb-3'>\n <Completed.Heading>\n You've requested access!\n </Completed.Heading>\n <Completed.Message>\n We've sent a request to your ClickView admin.\n Once your account is ready, you'll receive an email notification\n with instructions on how to get started with ClickView.\n </Completed.Message>\n </Completed.Body>\n </>\n );\n}","import React from 'react';\n\nimport { UserType } from 'libs/shared/apps/sign-up/enums/UserType';\nimport { LocalityHelper } from 'libs/shared/apps/sign-up/helpers/LocalityHelper';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\n\nimport styles from './enter-age-step-item.scss';\n\nconst MAX_AGE = 120;\nconst AGE_CUT_OFF = 13;\n\n/**\n * Poor mans moment().isValid();\n */\nfunction isDateValid(year: string, month: string, day: string): boolean {\n const date = new Date(getDateString(year, month, day));\n return !isNaN(+date);\n}\n\nfunction getDateString(year: string, month: string, day: string): string {\n return `${year.padStart(4, '0')}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;\n}\n\ninterface EnterAgeStepItemProps extends BaseStepItemProps {\n userType: UserType;\n}\n\nexport function EnterAgeStepItem(props: EnterAgeStepItemProps): JSX.Element {\n const [ day, setDay ] = React.useState<string>('');\n const [ month, setMonth ] = React.useState<string>('');\n const [ year, setYear ] = React.useState<string>('');\n const [ error, setError ] = React.useState<string>(null);\n\n function onChangeDay(event: React.ChangeEvent<HTMLInputElement>): void {\n setDay(event.target.value);\n setError(null);\n }\n\n function onChangeMonth(event: React.ChangeEvent<HTMLInputElement>): void {\n setMonth(event.target.value);\n setError(null);\n }\n\n function onChangeYear(event: React.ChangeEvent<HTMLInputElement>): void {\n setYear(event.target.value);\n setError(null);\n }\n\n function validate(): boolean {\n if (!day || !month || !year) {\n setError('Please enter your date of birth');\n return false;\n }\n\n if (!isDateValid(year, month, day)) {\n setError('Please enter a valid date');\n return false;\n }\n\n if (+year > currentYear) {\n setError('Please enter a date in the past');\n return false;\n }\n\n if (+year < currentYear - MAX_AGE) {\n setError('Please enter a realistic date of birth');\n return false;\n }\n\n return true;\n }\n\n function onSubmit(event: React.FormEvent): void {\n event.preventDefault();\n\n if (!validate())\n return;\n\n const dateOfBith = new Date(getDateString(year, month, day));\n const cutOffYear = currentYear - AGE_CUT_OFF;\n const cutOff = new Date();\n cutOff.setFullYear(cutOffYear);\n\n if (dateOfBith > cutOff) {\n props.complete({\n completionStep: 'young-student',\n trialCreated: false,\n trialStatus: null\n });\n return;\n }\n \n props.nextStep({\n step: 'enter-email',\n userType: props.userType\n });\n }\n\n const currentYear = new Date().getFullYear();\n const containerClassName = 'mx-2 d-inline-block text-start';\n const inputClassName = `form-control form-control-lg ${error ? 'is-invalid' : ''}`;\n\n let dayOrder = 'order-0';\n let monthOrder = 'order-3';\n\n const isUs = LocalityHelper.isCountryCodeUS(props.geoLocation.countryCode);\n if (isUs) {\n dayOrder = 'order-3';\n monthOrder = 'order-0';\n }\n\n return (\n <form className='text-center' onSubmit={onSubmit} noValidate>\n <h1 className='h4'>\n Tell us a little about yourself\n </h1>\n <p>\n Please enter your date of birth\n </p>\n\n <div className='my-4'>\n <fieldset className='d-flex justify-content-center' aria-describedby='dateOfBirthError'>\n <div className={`${containerClassName} ${dayOrder}`}>\n <label className='mb-0' htmlFor='day'>\n Day\n </label>\n <input\n id='day'\n type='number'\n className={`${inputClassName} ${styles.day}`}\n min='1'\n max='31'\n placeholder='DD'\n value={day}\n onChange={onChangeDay}\n autoFocus={!isUs}\n tabIndex={isUs ? 2 : 1}\n />\n </div>\n\n <span className={`h1 fw-normal mt-3 mb-0 order-1 ${error ? 'text-danger' : ''}`}>/</span>\n\n <div className={`${containerClassName} ${monthOrder}`}>\n <label className='mb-0' htmlFor='month'>\n Month\n </label>\n <input\n id='month'\n type='number'\n className={`${inputClassName} ${styles.month}`}\n min='1'\n max='12'\n placeholder='MM'\n value={month}\n onChange={onChangeMonth}\n autoFocus={isUs}\n tabIndex={isUs ? 1 : 2}\n />\n </div>\n \n <span className={`h1 fw-normal mt-3 mb-0 order-4 ${error ? 'text-danger' : ''}`}>/</span>\n\n <div className={`${containerClassName} order-5`}>\n <label className='mb-0' htmlFor='year'>\n Year\n </label>\n <input\n id='year'\n name='year'\n type='number'\n className={`${inputClassName} ${styles.year}`}\n min={currentYear - 120}\n max={currentYear}\n placeholder='YYYY'\n value={year}\n onChange={onChangeYear}\n tabIndex={3}\n />\n </div>\n </fieldset>\n {!!error && <FormFeedback name='dateofBirth'>{error}</FormFeedback>}\n </div>\n\n <button type='submit' className='btn btn-lg btn-dark w-100'>\n Continue\n </button>\n </form>\n );\n}","import React from 'react';\n\nimport { SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ClearableInput } from 'libs/shared/apps/sign-up/components/general/clear-input/ClearableInput';\nimport { ExistingAccountSignIn } from 'libs/shared/apps/sign-up/components/general/existing-account-sign-in/ExistingAccountSignIn';\nimport { GlobalIdps } from 'libs/shared/apps/sign-up/components/general/global-idps/GlobalIdps';\nimport { TrialStatus } from 'libs/shared/apps/sign-up/enums/TrialStatus';\nimport { UserType } from 'libs/shared/apps/sign-up/enums/UserType';\nimport { UserRequests } from 'libs/shared/apps/sign-up/fetch-requests/UserRequests';\nimport { ExternalLinkHelper } from 'libs/shared/apps/sign-up/helpers/ExternalLinkHelper';\nimport { LocalityHelper } from 'libs/shared/apps/sign-up/helpers/LocalityHelper';\nimport { IdentityProvider } from 'libs/shared/apps/sign-up/interfaces/IdentityProvider';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\nimport { CheckTrialStatusResponse } from 'libs/shared/apps/sign-up/interfaces/response/CheckTrialStatusResponse';\nimport { getLiteAttributionForAuth } from 'libs/shared/apps/sign-up/utils/getLiteAttributionForAuth';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { CountryCode } from 'libs/shared/enums/CountryCode';\nimport { GeoLocation } from 'libs/shared/interfaces/responses/GeoLocation';\n\ninterface EnterEmailStepItemProps extends BaseStepItemProps {\n email?: string;\n userType: UserType;\n globalIdps: IdentityProvider[];\n}\n\nconst emailRegex = new RegExp(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/);\n\nconst EMAIL_PLACEHOLDERS: {[key: string]: string} = {\n [CountryCode.AU]: 'valerie.frizzle@school.edu.au',\n [CountryCode.UK]: 'valerie.frizzle@school.gov.uk',\n [CountryCode.US]: 'valerie.frizzle@school.gov',\n [CountryCode.NZ]: 'valerie.frizzle@school.nz'\n};\n\nconst marketingContactTechnicalPathname: {[key in CountryCode]: string} = {\n [CountryCode.AU]: '/contact-us/support',\n [CountryCode.US]: '/contact-us/support',\n [CountryCode.NZ]: '/contact-us/',\n // @todo update after new UK website is released\n [CountryCode.UK]: '/contact-us/technical/'\n};\n\nfunction getContactLink(geoLocation: GeoLocation): string {\n const baseLink = ExternalLinkHelper.getMarketingUrlForGeoLocation(geoLocation);\n const countryCode = LocalityHelper.getCountryCode(geoLocation?.countryCode);\n const pathname = marketingContactTechnicalPathname[countryCode];\n\n return `${baseLink}${pathname}`;\n}\n\nfunction getPlaceholderText(geoLocation: GeoLocation): string {\n const placeholder = EMAIL_PLACEHOLDERS[LocalityHelper.getCountryCode(geoLocation.countryCode)];\n\n if (placeholder)\n return placeholder;\n\n return EMAIL_PLACEHOLDERS.us;\n}\n\nconst completionStatuses = [\n TrialStatus.Expired,\n TrialStatus.NotRequired,\n TrialStatus.Unavailable,\n TrialStatus.Unsupported,\n TrialStatus.Active\n];\n\nexport function EnterEmailStepItem(props: EnterEmailStepItemProps): JSX.Element {\n const [ loading, setLoading ] = React.useState(false);\n const [ email, setEmail ] = React.useState<string>(props?.email || '');\n const [ error, setError ] = React.useState<string>();\n\n const contactLink = getContactLink(props.geoLocation);\n\n async function handleSubmitForm() {\n setError('');\n \n let userEmail: CheckTrialStatusResponse;\n try {\n userEmail = await UserRequests.checkTrialStatus(props.ajaxUrls, { email });\n } catch (e) {\n setError('Something went wrong! Please try again later.');\n return;\n }\n\n if (userEmail.status === TrialStatus.InvalidEmail) {\n setError('Please use your school email address.');\n return;\n }\n\n props.logUserAction({}, {\n actionType: UserAction.Click,\n workflowPhase: WorkflowPhase.Next,\n descriptor: SignUpDescriptors.EnterEmail\n });\n \n if (completionStatuses.includes(userEmail.status)) {\n props.complete({\n completionStep: 'trial-status',\n email,\n trialStatus: userEmail.status,\n trialCreated: false\n });\n return;\n }\n\n try {\n const idps = await UserRequests.checkUserIdps(props.ajaxUrls, email);\n\n if (idps.length) {\n props.nextStep({\n step: 'select-idp',\n email,\n userTrialStatus: userEmail.status,\n idps\n });\n return;\n }\n } catch {\n setError('Something went wrong! Please try again later.');\n return;\n }\n \n props.nextStep({\n step: 'find-school',\n email,\n userTrialStatus: userEmail.status\n });\n }\n\n function onClickContactUs(): void {\n props.logUserAction({}, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.ContactUs\n });\n }\n\n function validateEmail(): boolean {\n if (!email.length) {\n setError('Please enter your school email address.');\n return false;\n }\n\n if (!emailRegex.test(email)) {\n setError('Please use your school email address.');\n return false;\n }\n\n return true;\n }\n\n function onClickSignIn(): void {\n props.logUserAction({}, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.SignIn\n });\n }\n\n function handleOnChangeEmail(e: React.ChangeEvent<HTMLInputElement>) {\n e.preventDefault();\n setEmail(e.target.value);\n setError('');\n }\n\n async function onFormSubmit(event?: React.FormEvent): Promise<void> {\n event?.preventDefault();\n\n if (!validateEmail()) return;\n\n setLoading(true);\n await handleSubmitForm();\n setLoading(false);\n }\n\n return (\n <>\n <div className='text-center'>\n <h1 className='h4'>\n Let's set up your account\n </h1>\n <p>\n Enter your school email address\n </p>\n </div>\n \n <form onSubmit={onFormSubmit} noValidate>\n <div className='form-group mb-3'>\n <ClearableInput\n value={email}\n onChange={handleOnChangeEmail}\n name='email-input'\n id='email-input'\n type='email'\n className={`form-control form-control-lg ${error ? 'is-invalid' : ''}`}\n placeholder={getPlaceholderText(props.geoLocation)}\n autoComplete='false'\n autoCorrect='false'\n autoFocus\n onClickClear={() => setEmail('')}\n aria-errormessage='email-inputError'\n />\n {error &&\n <>\n <FormFeedback name='error-input'>{error}</FormFeedback>\n <small>\n Having an issue with your email?\n <a href={contactLink} className='info-link ps-1' target='_blank' onClick={onClickContactUs}>\n Contact our team\n </a>\n </small>\n </>\n }\n </div>\n <SpinnerButton showSpinner={loading} variant='dark' className='btn-lg mb-3 w-100' disabled={loading} onClick={onFormSubmit}>\n Continue\n </SpinnerButton>\n </form>\n {props.userType === UserType.Staff &&\n <GlobalIdps idps={props.globalIdps} className='mt-n3' attribution={getLiteAttributionForAuth()} />\n }\n <div className='text-center'>\n <ExistingAccountSignIn\n link={props.getSignInUrl({ email })}\n onClick={onClickSignIn}\n />\n </div>\n </>\n );\n}","import { ApiError } from 'libs/shared/apps/sign-up/errors/ApiError';\n\nexport interface JoinRequestError {\n type: string;\n}\n\nexport function getJoinRequestError(error: ApiError<JoinRequestError>): string {\n switch (error?.body?.type) {\n case 'user-type-not-supported':\n return 'Students may not request to join schools.';\n case 'join-request-already-pending':\n return 'Your request is awaiting administrator approval.';\n case 'join-request-already-denied':\n return 'Your request has been denied by an administrator.';\n\n /**\n * Technically the UI should't allow any of these\n * but adding them here for completeness if we want to add\n * custom errors messages for them in future - Sha.\n */\n case 'join-request-not-allowed':\n case 'user-email-domain-not-approved':\n case 'user-email-invalid':\n case 'create-join-request-failed':\n case 'join-not-required':\n default:\n return 'Something went wrong.';\n }\n}","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { ClearableInput } from 'libs/shared/apps/sign-up/components/general/clear-input/ClearableInput';\nimport { ProspectRequests } from 'libs/shared/apps/sign-up/fetch-requests/ProspectRequests';\nimport { useDropdownEvents } from 'libs/shared/apps/sign-up/hooks/useDropdownEvents';\nimport { SearchProspectRequest } from 'libs/shared/apps/sign-up/interfaces/requests/SearchProspectRequest';\nimport { SearchProspectResponseItem } from 'libs/shared/apps/sign-up/interfaces/response/SearchProspectResponse';\nimport { SearchSchoolData } from 'libs/shared/apps/sign-up/interfaces/SearchSchoolData';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { useDebounce } from 'libs/shared/hooks/UseDebounce';\n\nimport styles from './search-school-step-item.scss';\n\ninterface SearchSchoolInputProps {\n disabled: boolean;\n data: SearchSchoolData,\n setData: (data: SearchSchoolData) => void;\n\n clearData: () => void;\n searchUrl: string;\n onClickNoSuggestions: (name: string) => void;\n size?: 'lg';\n labelClassName?: string;\n required?: boolean;\n placeholder?: string;\n hideOnBlur?: boolean;\n}\n\ninterface SchoolSuggestionsProps {\n filteredSchoolsList: SearchProspectResponseItem[];\n getSchoolName: (item: SearchProspectResponseItem) => string;\n onSchoolSuggestionClick: (item: SearchProspectResponseItem) => void;\n selectedIndex: number;\n}\n\ninterface CantFindSchoolProps {\n selected: boolean;\n handleNoSuggestion: () => void;\n}\n\n/**\n * Unfortunately our cities in prospect db are a mix\n * of title case and full caps, here I just make everything title case - Sha\n */\nfunction decapitalise(city: string): string {\n return city\n .toLowerCase()\n .split(' ')\n .map(c => c.charAt(0).toUpperCase() + c.slice(1))\n .join(' ');\n}\n\nfunction getDisplayLocation(item: SearchProspectResponseItem): string {\n const displayItems: string[] = [];\n\n if (item.city)\n displayItems.push(decapitalise(item.city));\n\n if (item.province)\n displayItems.push(item.province);\n\n if (item.postCode)\n displayItems.push(item.postCode);\n\n return displayItems.join(' ');\n}\n\nfunction SchoolSuggestions(props: SchoolSuggestionsProps): JSX.Element {\n const { filteredSchoolsList, getSchoolName, onSchoolSuggestionClick, selectedIndex } = props;\n\n return (\n <>\n {filteredSchoolsList.map((item, index) => {\n return (\n <DivButton\n className={`${styles.suggestionItem} ${selectedIndex - 1 === index ? styles.selected : ''}`}\n key={item.id}\n onKeyDown={e => e.key === 'Enter' && onSchoolSuggestionClick(item)}\n onMouseDown={() => onSchoolSuggestionClick(item)}\n onClick={() => onSchoolSuggestionClick(item)}\n >\n {getSchoolName(item)} <br />\n <small className='text-secondary'>{getDisplayLocation(item)}</small>\n </DivButton>\n );\n })}\n </>\n );\n}\n\nfunction CantFindSchool(props: CantFindSchoolProps): JSX.Element {\n return (\n <div\n className={`info-link ${styles.suggestionItem} ${styles.noSuggestion} ${props.selected ? styles.selected : ''}`}\n onKeyDown={e => e.key === 'Enter' && props.handleNoSuggestion()}\n onMouseDown={props.handleNoSuggestion}\n onClick={props.handleNoSuggestion}\n >\n Can't find your school?\n </div>\n );\n}\n\nexport function SearchSchoolInput(props: SearchSchoolInputProps): JSX.Element {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [ loading, setLoading ] = React.useState(true);\n const [ name, setName ] = React.useState<string>(\n (props.data.schoolName && props.data.schoolPostCode)\n ? props.data.schoolName + ', ' + props.data.schoolPostCode\n : props.data.schoolName ? props.data.schoolName : ''\n );\n const [ schoolsList, setSchoolsList ] = React.useState<SearchProspectResponseItem[]>();\n const debouncedName = useDebounce(name, 250);\n const { selectedIndex, onKeyDown, containerRef, hide, onBlur, onFocus } = useDropdownEvents({\n onSelected, itemCount: schoolsList?.length + 1 ?? 0, hideOnBlur: props.hideOnBlur\n });\n\n function onSelected(index: number): void {\n if (!schoolsList && !index)\n return;\n\n if (index === schoolsList.length) {\n props.onClickNoSuggestions(name);\n return;\n }\n\n const selected = schoolsList[index];\n\n if (selected)\n onSchoolSuggestionClick(selected);\n }\n\n const schoolSelected = !!props.data?.prospectId;\n const isLoading = loading && !schoolSelected;\n const showCantFindSchool = !loading && !schoolSelected && schoolsList?.length < 5;\n const showSuggestions = schoolsList?.length && !schoolSelected;\n \n React.useEffect(() => {\n if (schoolSelected) return;\n\n if (!debouncedName.length) {\n fetchSchools();\n return;\n }\n /* \n * (debouncedName === name) makes sure that we do not send extra fetch request for the same query\n * Without this when we select a school and delete all text, it will send a request for stale\n */\n if (!schoolSelected && debouncedName.length > 1 && debouncedName === name) {\n fetchSchools(debouncedName);\n return;\n }\n }, [ debouncedName, schoolSelected ]);\n\n function onSetSchoolName(schoolNameValue: string): void {\n if (props.data.schoolName || props.data.prospectId) {\n props.clearData();\n }\n \n if (schoolNameValue !== name) {\n setName(schoolNameValue);\n }\n }\n\n function onClickClearSchoolName(): void {\n onSetSchoolName('');\n inputRef.current.focus();\n }\n\n function fetchSchools(query?: string) {\n if (!props.data.latitude && !props.data.longitude) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n const request: SearchProspectRequest = {\n latitude: props.data.latitude,\n longitude: props.data.longitude\n };\n if (query && query.length) {\n request.query = query;\n }\n\n ProspectRequests.search(\n props.searchUrl,\n request,\n data => setSchoolsList(data),\n null,\n () => setLoading(false)\n );\n }\n\n function onSchoolSuggestionClick(item: SearchProspectResponseItem): void {\n setName(getSchoolName(item));\n props.setData({\n prospectId: item.id,\n schoolName: item.name,\n schoolPostCode: item.postCode,\n schoolType: item.prospectType,\n province: item.province,\n city: item.city,\n country: item.countryCode\n });\n }\n\n function getSchoolName(item: SearchProspectResponseItem): string {\n const schoolText = item.name;\n // if (item.postCode.length) {\n // schoolText += ', ' + item.postCode;\n // }\n return schoolText;\n }\n\n \n const showSuggestionsContainer = (showSuggestions || isLoading || showCantFindSchool) && !props.disabled && !hide;\n\n let inputClassName = `form-control ${showSuggestionsContainer ? styles.inputFocused : styles.input}`;\n let className = 'form-group position-relative';\n\n if (props.size === 'lg') {\n inputClassName += ' form-control-lg';\n className += ` ${styles.large}`;\n }\n\n return (\n <div className={className}>\n <label\n className={props.labelClassName}\n htmlFor='school-input'\n >\n School\n {props.required && <span className='text-danger'>*</span>}\n </label>\n <ClearableInput\n id='school-input'\n value={name}\n onChange={e => onSetSchoolName(e.currentTarget.value)}\n ref={inputRef}\n className={inputClassName}\n type='text'\n autoComplete='off'\n placeholder={props.placeholder || 'Select your school below'}\n disabled={props.disabled}\n autoFocus\n onClickClear={onClickClearSchoolName}\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n onBlur={onBlur}\n />\n <div className={`position-absolute z-1 w-100 ${styles.dropdown} ${hide ? 'd-none' : ''}`}>\n <div className={`${styles.suggestionContainer} ${!showSuggestionsContainer ? 'd-none' : ''}`} ref={containerRef}>\n {showSuggestions ?\n <SchoolSuggestions\n filteredSchoolsList={schoolsList}\n onSchoolSuggestionClick={onSchoolSuggestionClick}\n getSchoolName={getSchoolName}\n selectedIndex={selectedIndex}\n /> :\n isLoading && (\n <div className={`${styles.suggestionLoading} py-4 d-flex justify-content-center`}>\n <Spinner animation='border' />\n </div>\n )\n }\n {\n !isLoading && showCantFindSchool && (\n <CantFindSchool\n selected={selectedIndex === schoolsList.length + 1}\n handleNoSuggestion={() => {\n props.onClickNoSuggestions(name);\n }}\n />\n )\n }\n </div>\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"inputFocused\":\"W4fIm\",\"dropdown\":\"VoOjY\",\"suggestionContainer\":\"oFNpM\",\"suggestionItem\":\"DvShO\",\"large\":\"gDUIS\",\"input\":\"C5let\",\"selected\":\"WoB0p\",\"clearInput\":\"n4gn0\",\"clear\":\"A6Y6R\"};","import React from 'react';\n\nimport { ClearableInput } from 'libs/shared/apps/sign-up/components/general/clear-input/ClearableInput';\nimport { useDropdownEvents } from 'libs/shared/apps/sign-up/hooks/useDropdownEvents';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport styles from './searchable-select.scss';\n\ninterface SuggestionsProps<T> {\n items: T[];\n getName: (item: T) => string;\n onItemClick: (item: T) => void;\n selectedIndex: number;\n}\n\nfunction Suggestions<T>(props: SuggestionsProps<T>): JSX.Element {\n const { items, getName, onItemClick, selectedIndex } = props;\n\n return (\n <>\n {items.map((item, index) => {\n return (\n <DivButton\n className={`${styles.suggestionItem} ${selectedIndex - 1 === index ? styles.selected : ''}`}\n key={index}\n onKeyDown={e => e.key === 'Enter' && onItemClick(item)}\n onMouseDown={() => onItemClick(item)}\n onClick={() => onItemClick(item)}\n >\n {getName(item)}\n </DivButton>\n );\n })}\n </>\n );\n}\n\ninterface SearchableSelectProps<T> {\n id: string;\n item: T;\n items: T[];\n onSelect: (item: T) => void;\n getName: (item: T) => string;\n clearData: () => void;\n placeholder: string;\n disabled?: boolean;\n size?: 'lg';\n cantFindText?: string;\n onCantFind?: () => void;\n}\n\nexport function SearchableSelect<T>(props: SearchableSelectProps<T>): JSX.Element {\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const [ name, setName ] = React.useState<string>('');\n\n const [ suggestionList, setSuggestionList ] = React.useState<T[]>([]);\n \n const { selectedIndex, onKeyDown, containerRef, hide, onBlur, onFocus } = useDropdownEvents({\n onSelected,\n itemCount: props.cantFindText ?\n props.items.length + 1 :\n props.items.length,\n hideOnBlur: true,\n hideInitially: true,\n hideOnEnter: true\n });\n\n function onSelected(index: number): void {\n if (index === suggestionList.length) {\n props.onCantFind();\n return;\n }\n\n const selected = suggestionList[index];\n\n if (selected)\n onSuggestionClick(selected);\n }\n\n const itemSelected = !!props.item;\n const showSuggestions = props.cantFindText ?\n suggestionList?.length + 1 :\n suggestionList?.length;\n \n React.useEffect(() => {\n if (itemSelected)\n return;\n\n if (!name.length) {\n searchItems();\n return;\n }\n \n if (!itemSelected && name.length > 1) {\n searchItems(name);\n return;\n }\n }, [ name, itemSelected ]);\n\n function onChange(value: string): void {\n if (props.item)\n props.clearData();\n \n if (value !== name)\n setName(value);\n }\n\n function onClickClear(): void {\n onChange('');\n inputRef.current.focus();\n }\n\n function searchItems(query?: string) {\n if (!query) {\n setSuggestionList(props.items);\n return;\n }\n\n const suggestions = props.items.filter(i => props.getName(i).toLowerCase().includes(query.toLowerCase()));\n setSuggestionList(suggestions);\n }\n\n function onSuggestionClick(item: T): void {\n setName(props.getName(item));\n props.onSelect(item);\n setSuggestionList(props.items);\n }\n \n const showSuggestionsContainer = showSuggestions && !props.disabled && !hide;\n\n let inputClassName = `form-select ${showSuggestionsContainer ? styles.inputFocused : styles.input} ${styles.clearInput} cursor-pointer`;\n let className = 'form-group position-relative';\n\n if (props.size === 'lg') {\n inputClassName += ' form-select-lg';\n className += ` ${styles.large}`;\n }\n\n return (\n <div className={className}>\n <ClearableInput\n id={props.id}\n value={name}\n onChange={e => onChange(e.currentTarget.value)}\n ref={inputRef}\n className={inputClassName}\n type='text'\n autoComplete='off'\n placeholder={props.placeholder}\n disabled={props.disabled}\n onClickClear={onClickClear}\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n onBlur={onBlur}\n clearClassName={styles.clear}\n />\n <div className={`position-absolute z-1 w-100 ${styles.dropdown} ${hide ? 'd-none' : ''}`}>\n <div className={`${styles.suggestionContainer} ${!showSuggestionsContainer ? 'd-none' : ''}`} ref={containerRef}>\n {showSuggestions &&\n <Suggestions\n items={suggestionList}\n onItemClick={onSuggestionClick}\n getName={props.getName}\n selectedIndex={selectedIndex}\n />\n }\n {\n props.cantFindText && (\n <div\n className={`info-link ${styles.suggestionItem} ${selectedIndex === suggestionList.length + 1 ? styles.selected : ''}`}\n onKeyDown={e => e.key === 'Enter' && props.onCantFind()}\n onMouseDown={props.onCantFind}\n onClick={props.onCantFind}\n >\n {props.cantFindText}\n </div>\n )\n }\n </div>\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { TrialStatus } from 'libs/shared/apps/sign-up/enums/TrialStatus';\nimport { IdentityProvider } from 'libs/shared/apps/sign-up/interfaces/IdentityProvider';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\nimport { SearchableSelect } from 'libs/shared/components/searchable-select/SearchableSelect';\n\nexport const BACKGROUND_COLORS = [\n '38A2E8',\n '7A76E8',\n '40BCC3',\n 'F7847B'\n];\n\ninterface SelectIdpStepItemProps extends BaseStepItemProps {\n idps: IdentityProvider[];\n email: string;\n userTrialStatus: TrialStatus;\n}\n\nexport function SelectIdpStepItem(props: SelectIdpStepItemProps): JSX.Element {\n const [ provider, setProvider ] = React.useState<IdentityProvider>(null);\n \n function redirect(selectedProvider: IdentityProvider): void {\n if (!selectedProvider) {\n return;\n }\n\n const currentPathAndQuery = window.location.pathname + window.location.search;\n\n /**\n * Intentionally not using LocationUtils as to not bring a large number of dependencies into Auth - Sha\n */\n window.location.href = `/challenge?idp=${selectedProvider.id}`\n + '&redirectUrl=' + encodeURIComponent(currentPathAndQuery);\n }\n\n function onClickNoSSO(): void {\n props.logUserAction({}, {\n actionType: UserAction.Click,\n workflowPhase: WorkflowPhase.Next,\n descriptor: SignUpDescriptors.SkipIdpSelect\n });\n\n props.nextStep({\n step: 'find-school',\n email: props.email,\n userTrialStatus: props.userTrialStatus\n });\n }\n\n return (\n <>\n <div className='text-center'>\n <h1 className='h4'>\n Does your school already have ClickView?\n </h1>\n <p>\n Find your school from the list below\n </p>\n </div>\n {props.idps.length > 4 ?\n <>\n <SearchableSelect\n id='idp'\n item={provider}\n items={props.idps}\n onSelect={setProvider}\n getName={c => c.name}\n clearData={() => setProvider(null)}\n placeholder='Select a school'\n size='lg'\n />\n <button\n className='btn btn-lg btn-dark w-100 mb-3'\n disabled={!provider}\n onClick={() => redirect(provider)}\n >Continue</button>\n </>\n : props.idps.map((idp, i) => (\n <button\n key={i}\n className='btn btn-lg w-100 mb-3'\n onClick={() => redirect(idp)}\n style={{\n backgroundColor: `#${BACKGROUND_COLORS[i % BACKGROUND_COLORS.length]}`,\n color: `#FFF`\n }}>\n {idp.name}\n </button>\n ))\n }\n <button\n className={'btn btn-link text-info w-100 no-sso-link'}\n onClick={onClickNoSSO}\n >\n My school does not have ClickView\n </button>\n </>\n );\n}","import React from 'react';\n\nimport { UserType } from 'libs/shared/apps/sign-up/enums/UserType';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport styles from './user-type-option.scss';\n\ninterface UserTypeOptionProps {\n type: UserType;\n imageSrc: string;\n buttonText: string;\n onClick: (type: UserType) => void;\n selected: boolean;\n}\n\nexport function UserTypeOption(props: UserTypeOptionProps): JSX.Element {\n return (\n <>\n <DivButton\n className={`\n d-flex\n flex-column\n justify-content-between\n h-100\n p-3\n border\n rounded\n rounded-3\n mx-auto\n d-sm-block\n d-none\n ${styles.userTypeOption} ${props.selected ? styles.selected : ''}`\n }\n onClick={() => props.onClick(props.type)}\n >\n <img\n src={props.imageSrc}\n className='rounded-top mx-auto pb-2'\n />\n <div className='py-2'>\n <span className='h4'>{props.buttonText}</span>\n </div>\n </DivButton>\n <DivButton\n className={`btn btn-lg btn-outline-dark w-100 d-sm-none d-block mx-auto ${styles.mobileButtons}`}\n onClick={() => props.onClick(props.type)}\n >\n {props.buttonText}\n </DivButton>\n </>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"userTypeOption\":\"R8ZPi\",\"selected\":\"SNEmW\",\"mobileButtons\":\"BSfO7\"};","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { ProfileProperties } from 'libs/analytics/clients/ProfileApiClient';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { AddToBrazeStepItem } from 'libs/shared/apps/sign-up/components/steps/add-to-braze-step-item/AddToBrazeStepItem';\nimport { CantFindSchoolStepItem } from 'libs/shared/apps/sign-up/components/steps/cant-find-school-step-item/CantFindSchoolStepItem';\nimport { CompletedStepItem } from 'libs/shared/apps/sign-up/components/steps/completed-step-item/CompletedStepItem';\nimport { EnterAgeStepItem } from 'libs/shared/apps/sign-up/components/steps/enter-age-step-item/EnterAgeStepItem';\nimport { EnterEmailStepItem } from 'libs/shared/apps/sign-up/components/steps/enter-email-step-item/EnterEmailStepItem';\nimport { RequestAccess } from 'libs/shared/apps/sign-up/components/steps/request-access/RequestAccess';\nimport { RequestBdmTrialStepItem } from 'libs/shared/apps/sign-up/components/steps/request-bdm-trial-step-item/RequestBdmTrialStepItem';\nimport { SearchSchoolStepItem } from 'libs/shared/apps/sign-up/components/steps/search-school-step-item/SearchSchoolStepItem';\nimport { SelectIdpStepItem } from 'libs/shared/apps/sign-up/components/steps/select-idp-step-item/SelectIdpStepItem';\nimport { SelectUserTypeStepItem } from 'libs/shared/apps/sign-up/components/steps/select-user-type-step-item/SelectUserTypeStepItem';\nimport { SignUpProduct } from 'libs/shared/apps/sign-up/enums/SignUpProduct';\nimport { StepActions } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/actions/StepActions';\nimport { SignUpState, SignUpStepsDataState } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/interfaces/SignUpState';\nimport { GetSignInUrl } from 'libs/shared/apps/sign-up/interfaces/GetSignInUrl';\nimport { IdentityProvider } from 'libs/shared/apps/sign-up/interfaces/IdentityProvider';\nimport { LayoutMappingType } from 'libs/shared/apps/sign-up/interfaces/Layout';\nimport { BaseStepItemProps, LogBrazeEventOptions, StepIds } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\nimport { SignUpAjaxUrls } from 'libs/shared/apps/sign-up/interfaces/SignUpAjaxUrls';\nimport { SignUpImageUrls } from 'libs/shared/apps/sign-up/interfaces/SignUpImageUrls';\nimport { GeoLocation } from 'libs/shared/interfaces/responses/GeoLocation';\n\nexport interface ActiveStepProps {\n state: SignUpState;\n layout?: LayoutMappingType;\n googleMapsApiKey: string;\n geoLocation: GeoLocation;\n\n back: () => void;\n nextStep: (action: StepActions) => void;\n complete: (data: SignUpStepsDataState) => void;\n hasPreviousStep: boolean;\n logUserAction: (data: HashObject | HashObject[], analyticsOptions: AnalyticsOptions) => void;\n logBrazeEvent: (options: LogBrazeEventOptions) => void;\n createOrUpdateProfile?: (properties: ProfileProperties) => void;\n\n showBreadCrumbs?: boolean;\n pageAppLinkString?: string;\n close?: () => void;\n imageUrls: SignUpImageUrls;\n ajaxUrls: SignUpAjaxUrls;\n productName: SignUpProduct;\n getSignInUrl: GetSignInUrl;\n globalIdps?: IdentityProvider[];\n}\n\nconst stepsMapping: {[key in StepIds]: (props: BaseStepItemProps) => JSX.Element} = {\n 'select-type': SelectUserTypeStepItem,\n 'enter-email': EnterEmailStepItem,\n 'find-school': SearchSchoolStepItem,\n 'cant-find-school': CantFindSchoolStepItem,\n 'completed': CompletedStepItem,\n 'add-to-braze': AddToBrazeStepItem,\n 'enter-age': EnterAgeStepItem,\n 'request-access': RequestAccess,\n 'request-bdm-trial': RequestBdmTrialStepItem,\n 'select-idp': SelectIdpStepItem\n};\n\nexport function ActiveStep(props: React.PropsWithChildren<ActiveStepProps>): JSX.Element {\n const {\n state,\n geoLocation,\n layout,\n hasPreviousStep,\n googleMapsApiKey,\n pageAppLinkString,\n back,\n nextStep,\n complete,\n logUserAction,\n logBrazeEvent,\n imageUrls,\n ajaxUrls,\n productName,\n getSignInUrl,\n globalIdps,\n createOrUpdateProfile\n } = props;\n \n const CurrentStep = stepsMapping[state.currentStepId];\n\n const stepProps = {\n ...state,\n geoLocation,\n googleMapsApiKey,\n pageAppLinkString,\n back,\n nextStep,\n complete,\n logUserAction,\n imageUrls,\n ajaxUrls,\n productName,\n getSignInUrl,\n logBrazeEvent,\n globalIdps,\n createOrUpdateProfile\n };\n\n const Layout = layout;\n\n // If the step doesnot have a layout mapping\n if (!Layout) {\n return <CurrentStep {...stepProps} />;\n }\n \n return (\n <Layout\n geoLocation={props.geoLocation}\n currentStep={state.currentStepId}\n\n previousStep={back}\n closeApp={props.close}\n logUserAction={logUserAction}\n hasPreviousStep={hasPreviousStep}\n imageUrls={props.imageUrls}\n getSignInUrl={getSignInUrl}\n >\n <CurrentStep {...stepProps} />\n </Layout>\n );\n}","import React from 'react';\n\nimport { SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { UserTypeOption } from 'libs/shared/apps/sign-up/components/steps/select-user-type-step-item/UserTypeOptions';\nimport { UserType } from 'libs/shared/apps/sign-up/enums/UserType';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\nimport { SignUpImageUrls } from 'libs/shared/apps/sign-up/interfaces/SignUpImageUrls';\n\ninterface SelectUserTypeStepItemProps extends BaseStepItemProps {\n userType?: UserType;\n imageUrls: SignUpImageUrls;\n}\n\nexport function SelectUserTypeStepItem(props: SelectUserTypeStepItemProps): JSX.Element {\n function selectAndNextStep(userType: UserType): void {\n props.logUserAction({ userType }, {\n actionType: UserAction.Click,\n workflowPhase: WorkflowPhase.Next,\n descriptor: userType === UserType.Staff ?\n SignUpDescriptors.Educator :\n SignUpDescriptors.Student\n });\n\n if (userType === UserType.Staff) {\n props.nextStep({\n step: 'enter-email',\n userType\n });\n return;\n }\n\n props.nextStep({\n step: 'enter-age',\n userType\n });\n }\n \n return (\n <div className='text-center'>\n <h1 className='h4'>\n Access educational videos at your fingertips\n </h1>\n <p className='mb-3'>\n Let's get you set up so you can access ClickView.\n </p>\n\n <div className='row'>\n <div className='col-lg-6 mb-3'>\n <UserTypeOption\n type={UserType.Staff}\n buttonText={'I\\'m an educator'}\n imageSrc={props.imageUrls.educator}\n onClick={selectAndNextStep}\n selected={props.userType === UserType.Staff}\n />\n </div>\n <div className='col-lg-6 mb-3'>\n <UserTypeOption\n type={UserType.Learner}\n buttonText={'I\\'m a student'}\n imageSrc={props.imageUrls.student}\n onClick={selectAndNextStep}\n selected={props.userType === UserType.Learner}\n />\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { ProfileProperties } from 'libs/analytics/clients/ProfileApiClient';\nimport { AnalyticsOptions, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { getRequestTrial } from 'libs/shared/apps/sign-up/components/steps/search-school-step-item/requestTrial';\nimport { SearchLocalityInput } from 'libs/shared/apps/sign-up/components/steps/search-school-step-item/SearchLocalityInput';\nimport { SearchSchoolInput } from 'libs/shared/apps/sign-up/components/steps/search-school-step-item/SearchSchoolInput';\nimport { TrialStatus } from 'libs/shared/apps/sign-up/enums/TrialStatus';\nimport { UserType } from 'libs/shared/apps/sign-up/enums/UserType';\nimport { UserRequests } from 'libs/shared/apps/sign-up/fetch-requests/UserRequests';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\nimport { SearchSchoolData } from 'libs/shared/apps/sign-up/interfaces/SearchSchoolData';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\n\nfunction getLocalisedPrompt(countryCode: string) {\n if (countryCode?.toLowerCase() === 'au')\n return 'Enter your school postcode or suburb';\n\n if (countryCode?.toLowerCase() === 'us')\n return 'Enter your school ZIP code or city';\n\n return 'Enter your school postcode or city';\n}\n\ninterface SearchSchoolStepItemProps extends BaseStepItemProps {\n email: string;\n userType: UserType;\n userTrialStatus: TrialStatus;\n\n prospectId?: string;\n schoolLocality?: string;\n country?: string;\n longitude?: number;\n latitude?: number;\n city?: string;\n province?: string;\n schoolName?: string;\n schoolType?: string;\n schoolPostCode?: string;\n trialStatus?: TrialStatus;\n createOrUpdateProfile: (properties: ProfileProperties) => void;\n}\n\nexport function SearchSchoolStepItem(props: SearchSchoolStepItemProps): JSX.Element {\n const { email, userType } = props;\n\n const [ data, setData ] = React.useState<SearchSchoolData>({\n schoolLocality: props.schoolLocality,\n country: props.country,\n longitude: props.longitude,\n latitude: props.latitude,\n city: props.city,\n province: props.province,\n prospectId: props.prospectId,\n schoolName: props.schoolName,\n schoolType: props.schoolType,\n schoolPostCode: props.schoolPostCode\n });\n\n const [ prospectStatus, setProspectStatus ] = React.useState<TrialStatus>(props.trialStatus);\n const [ submissionError, setSubmissionError ] = React.useState<string>();\n \n const [ loading, setLoading ] = React.useState(false);\n const [ disableLocality, setDisableLocality ] = React.useState(false);\n const [ disableSchoolSearch, setDisableSchoolSearch ] = React.useState(false);\n\n const requestTrial = getRequestTrial({\n // Props\n ...props,\n\n // Local State\n prospectStatus,\n loading,\n data,\n\n // Functions\n canSubmitForm,\n setSubmissionError,\n logStepEvent,\n setLoadingState,\n setProperty\n });\n\n function canSearchSchool(): boolean {\n return !!(data && data.schoolLocality && data.longitude && data.latitude);\n }\n\n function canSubmitForm(): boolean {\n if (!data || !email || !userType) {\n return false;\n }\n \n const { prospectId } = data;\n \n return !!(\n email &&\n userType &&\n prospectId\n );\n }\n\n function logStepEvent() {\n const analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.FindSchool,\n workflowPhase: WorkflowPhase.Next\n };\n\n props.logUserAction(data || {}, analyticsOptions);\n }\n\n function setLoadingState(value: boolean): void {\n setDisableLocality(value);\n setDisableSchoolSearch(value);\n setLoading(value);\n }\n\n function setProperty<X extends keyof SearchSchoolData>(key: X, value: SearchSchoolData[X]) {\n if (key === 'prospectId' && value) {\n setLoading(true);\n UserRequests.checkProspectTrialStatus(props.ajaxUrls, {\n prospectId: value.toString(),\n email: props.email\n }, data => {\n setProspectStatus(data.status);\n }, () => {\n console.log('error');\n }, () => {\n setLoading(false);\n });\n }\n\n setData(data => ({\n ...data,\n [key]: value\n }));\n }\n\n function clearStepGroupData(): void {\n setProperty('schoolLocality', undefined);\n setProperty('longitude', undefined);\n setProperty('latitude', undefined);\n setProperty('city', undefined);\n setProperty('province', undefined);\n setProperty('country', undefined);\n clearSchoolStepItemData();\n }\n\n function clearSchoolStepItemData(): void {\n setProperty('prospectId', undefined);\n setProperty('schoolName', '');\n setProperty('schoolPostCode', undefined);\n setSubmissionError(undefined);\n }\n\n function onClickNoSuggestions(name: string): void {\n props.nextStep({\n step: 'cant-find-school',\n prospectId: data.prospectId,\n schoolName: name,\n schoolLocality: data.schoolLocality,\n longitude: data.longitude,\n latitude: data.latitude,\n country: data.country,\n city: data.city,\n province: data.province\n });\n\n props.logUserAction({}, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.CantFindSchool,\n workflowPhase: WorkflowPhase.Next\n });\n }\n\n function setSchoolData(schoolData: SearchSchoolData): void {\n setProperty('prospectId', schoolData.prospectId);\n setProperty('schoolName', schoolData.schoolName);\n setProperty('schoolPostCode', schoolData.schoolPostCode);\n setProperty('schoolType', schoolData.schoolType);\n setProperty('province', schoolData.province);\n setProperty('city', schoolData.city);\n setProperty('country', schoolData.country);\n }\n\n function setLocalityData(localityData: SearchSchoolData): void {\n const {\n longitude,\n latitude,\n schoolLocality,\n country,\n city,\n province\n } = localityData;\n longitude && setProperty('longitude', longitude);\n latitude && setProperty('latitude', latitude);\n country && setProperty('country', country);\n city && setProperty('city', city);\n province && setProperty('province', province);\n schoolLocality && setProperty('schoolLocality', schoolLocality);\n }\n\n return (\n <>\n <div className='text-center'>\n <h1 className='h4'>\n Let's find your school\n </h1>\n <p>\n {getLocalisedPrompt(props.geoLocation?.countryCode)}\n </p>\n </div>\n <SearchLocalityInput\n data={data}\n setData={setLocalityData}\n clearData={clearStepGroupData}\n disabled={disableLocality}\n geoLocation={props.geoLocation}\n labelClassName='d-none'\n logUserAction={props.logUserAction}\n googleMapsApiKey={props.googleMapsApiKey}\n autoFocus\n size='lg'\n useGeoLocationApi\n />\n {canSearchSchool() &&\n <SearchSchoolInput\n data={data}\n setData={setSchoolData}\n clearData={clearSchoolStepItemData}\n disabled={disableSchoolSearch}\n searchUrl={props.ajaxUrls.searchProspect}\n onClickNoSuggestions={onClickNoSuggestions}\n size='lg'\n labelClassName='d-none'\n />\n }\n {submissionError &&\n <p className='text-danger mb-2'>{submissionError}</p>\n }\n {canSubmitForm() &&\n <SpinnerButton\n className='btn-lg w-100'\n variant='dark'\n onClick={requestTrial}\n showSpinner={disableLocality || disableSchoolSearch || loading}\n disabled={disableLocality || disableSchoolSearch || loading}\n >\n Get started\n </SpinnerButton>\n }\n </>\n );\n}","import { type BrazeUser, ProductFormEvent } from '@clickview/braze-client';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { ProfileProperties } from 'libs/analytics/clients/ProfileApiClient';\nimport { AnalyticsOptions, SignUpDescriptors, UserAction } from 'libs/analytics/interfaces';\nimport { AttributionHelper } from 'libs/analytics/utils/AttributionHelper';\nimport { UtmHelper } from 'libs/analytics/utils/UtmHelper';\n\nimport { ProspectLookupType } from 'libs/shared/apps/sign-up/enums/ProspectLookup';\nimport { SignUpProduct } from 'libs/shared/apps/sign-up/enums/SignUpProduct';\nimport { TrialStatus } from 'libs/shared/apps/sign-up/enums/TrialStatus';\nimport { UserType } from 'libs/shared/apps/sign-up/enums/UserType';\nimport { ProspectRequests } from 'libs/shared/apps/sign-up/fetch-requests/ProspectRequests';\nimport { UserRequests } from 'libs/shared/apps/sign-up/fetch-requests/UserRequests';\nimport { BrazeHelper } from 'libs/shared/apps/sign-up/helpers/BrazeHelper';\nimport { StepActions } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/actions/StepActions';\nimport { CompletionData } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/interfaces/SignUpState';\nimport { LogBrazeEventOptions } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\nimport { CreateTrialSuccessResponse } from 'libs/shared/apps/sign-up/interfaces/response/CreateTrialResponse';\nimport { SearchSchoolData } from 'libs/shared/apps/sign-up/interfaces/SearchSchoolData';\nimport { SignUpAjaxUrls } from 'libs/shared/apps/sign-up/interfaces/SignUpAjaxUrls';\nimport { GeoLocation } from 'libs/shared/interfaces/responses/GeoLocation';\n\n/**\n * Yes currying over this many variables is gross,\n * but this was the quickest and easiest way to make \n * SearchSchoolStepItem somewhat manageable - Sha\n */\ninterface GetRequestTrialOptions {\n // SearchSchoolStepItem props\n email: string;\n userTrialStatus: TrialStatus;\n pageAppLinkString?: string;\n userType: UserType;\n nextStep: (action: StepActions) => void;\n complete: (data: CompletionData) => void;\n productName: SignUpProduct;\n ajaxUrls: SignUpAjaxUrls;\n geoLocation: GeoLocation;\n \n // Local state\n loading: boolean;\n prospectStatus: TrialStatus;\n data: SearchSchoolData;\n \n // SearchSchoolStepItem local functions \n logStepEvent: () => void;\n logUserAction: (data: HashObject | HashObject[], analyticsOptions: AnalyticsOptions) => void;\n logBrazeEvent: (options: LogBrazeEventOptions) => void;\n setLoadingState: (loading: boolean) => void;\n canSubmitForm: () => boolean;\n setSubmissionError: (error: string) => void;\n setProperty<X extends keyof SearchSchoolData>(key: X, value: SearchSchoolData[X]): void;\n createOrUpdateProfile: (properties: ProfileProperties) => void;\n}\n\nexport function getRequestTrial(options: GetRequestTrialOptions): () => Promise<void> {\n const {\n loading,\n canSubmitForm,\n setSubmissionError,\n prospectStatus,\n userType,\n logStepEvent,\n logUserAction,\n nextStep,\n data,\n productName,\n ajaxUrls,\n complete,\n setLoadingState,\n email,\n userTrialStatus,\n pageAppLinkString,\n setProperty,\n logBrazeEvent,\n createOrUpdateProfile\n } = options;\n\n function addToBraze(): void {\n nextStep({\n step: 'add-to-braze',\n trialStatus: prospectStatus,\n ...data\n });\n logStepEvent();\n }\n\n function requestBdmTrial(): void {\n logStepEvent();\n\n if (userType !== UserType.Staff) {\n complete({\n completionStep: 'added-to-braze',\n trialCreated: false,\n trialStatus: null\n });\n return;\n }\n \n nextStep({\n step: 'request-bdm-trial',\n ...data\n });\n }\n\n function requestAccess(): void {\n nextStep({\n step: 'request-access',\n ...data\n });\n logStepEvent();\n }\n\n async function autoJoinLite(): Promise<void> {\n try {\n await UserRequests.createAutoJoinRequest(ajaxUrls, {\n prospectId: data.prospectId,\n email\n });\n\n logUserAction({}, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.AutoJoin\n });\n\n complete({\n completionStep: 'trial-status',\n trialCreated: true,\n trialStatus: TrialStatus.Available,\n ...data\n });\n } catch {\n setSubmissionError('Something went wrong! Please try again later.');\n setLoadingState(false);\n return;\n }\n }\n\n async function trialStatus(): Promise<void> {\n let customerId: string = undefined;\n\n if (data?.prospectId && prospectStatus === TrialStatus.NotRequired) {\n const lookups = await ProspectRequests.getLookups(ajaxUrls, data.prospectId);\n customerId = lookups.find(p => p.type === ProspectLookupType.MasterId)?.externalId;\n }\n\n complete({\n completionStep: 'trial-status',\n trialStatus: prospectStatus,\n trialCreated: false,\n customerId,\n ...data\n });\n logStepEvent();\n }\n\n function canRequestTrial(): boolean {\n if (prospectStatus === TrialStatus.Active)\n return true;\n\n if (prospectStatus === TrialStatus.Available)\n return true;\n\n if (prospectStatus === TrialStatus.UserAutoJoinAllowed) {\n return productName === SignUpProduct.Auth;\n }\n\n return false;\n }\n\n async function brazeFormSubmissionEvent(): Promise<void> {\n if (userType !== UserType.Staff)\n return;\n \n const brazeUser: BrazeUser = {\n email: email,\n custom: {\n accountName: data?.schoolName,\n accountAddress: {\n countryCode: data?.country,\n province: BrazeHelper.parseProvince(data.province)\n },\n orgSubType: BrazeHelper.getSchoolType(data?.schoolType),\n syncToCrm: true\n },\n event: {\n accountCountry: data?.country,\n accountPostCode: data?.schoolPostCode,\n accountState: BrazeHelper.parseProvince(data.province)\n }\n };\n const additionalData: HashObject<any> = {\n form_type: 'trial-sign-up',\n prospect_id: data?.prospectId\n };\n\n logBrazeEvent({\n user: brazeUser,\n event: {\n eventType: ProductFormEvent.FormSubmission,\n additionalData: additionalData\n }\n });\n }\n\n async function requestTrial(): Promise<void> {\n setLoadingState(true);\n\n let response: CreateTrialSuccessResponse;\n try {\n response = await UserRequests.createTrial(ajaxUrls, {\n userType,\n email,\n prospectId: data?.prospectId,\n appLink: pageAppLinkString,\n attribution: {\n ...AttributionHelper.getDecodedAttributionData(),\n utms: UtmHelper.getUtmParameters()\n }\n });\n } catch (error) {\n setSubmissionError('Something went wrong! Please try again later.');\n setLoadingState(false);\n return;\n }\n\n if (prospectStatus === TrialStatus.UserAutoJoinAllowed) {\n logUserAction({}, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.AutoJoin\n });\n }\n \n setProperty('userId', response.id);\n complete({\n completionStep: 'trial-status',\n userId: response.id,\n trialCreated: true,\n trialStatus: TrialStatus.Available,\n customerId: (response as any).data?.customerId,\n ...data\n });\n\n brazeFormSubmissionEvent();\n\n if (createOrUpdateProfile) {\n createOrUpdateProfile({\n masterId: response.id,\n email,\n countryCode: data?.country\n });\n }\n\n logStepEvent();\n }\n\n return async function(): Promise<void> {\n if (loading) return;\n\n if (!canSubmitForm()) {\n setSubmissionError('Something went wrong! Please try again later.');\n return;\n }\n\n if (userTrialStatus === TrialStatus.BdmTrialAvailable)\n return requestBdmTrial();\n\n if (userType === UserType.Staff) {\n if (prospectStatus === TrialStatus.Unsupported)\n return addToBraze();\n\n if (prospectStatus === TrialStatus.UserJoinApprovalRequired)\n return requestAccess();\n\n if (prospectStatus === TrialStatus.UserAutoJoinAllowed && productName === SignUpProduct.Lite)\n return await autoJoinLite();\n }\n\n if (!canRequestTrial())\n return await trialStatus();\n\n return await requestTrial();\n };\n}","import React from 'react';\nimport { type BrazeUser, ProductFormEvent } from '@clickview/braze-client';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { ProfileProperties } from 'libs/analytics/clients/ProfileApiClient';\nimport { SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\nimport { AttributionHelper } from 'libs/analytics/utils/AttributionHelper';\nimport { UtmHelper } from 'libs/analytics/utils/UtmHelper';\n\nimport { SearchLocalityInput } from 'libs/shared/apps/sign-up/components/steps/search-school-step-item/SearchLocalityInput';\nimport { TrialStatus } from 'libs/shared/apps/sign-up/enums/TrialStatus';\nimport { UserType } from 'libs/shared/apps/sign-up/enums/UserType';\nimport { ApiError } from 'libs/shared/apps/sign-up/errors/ApiError';\nimport { ProspectRequests } from 'libs/shared/apps/sign-up/fetch-requests/ProspectRequests';\nimport { UserRequests } from 'libs/shared/apps/sign-up/fetch-requests/UserRequests';\nimport { BrazeHelper } from 'libs/shared/apps/sign-up/helpers/BrazeHelper';\nimport { getSchoolTypesByGeoLocation } from 'libs/shared/apps/sign-up/helpers/SchoolTypeHelper';\nimport { CompletionData } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/interfaces/SignUpState';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\nimport { CreateTrialRequest } from 'libs/shared/apps/sign-up/interfaces/requests/CreateTrialRequest';\nimport { CreateProspectSuccessResponse } from 'libs/shared/apps/sign-up/interfaces/response/CreateProspectResponse';\nimport { CreateTrialErrorResponse } from 'libs/shared/apps/sign-up/interfaces/response/CreateTrialResponse';\nimport { SearchSchoolData } from 'libs/shared/apps/sign-up/interfaces/SearchSchoolData';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { ProspectStatus } from 'libs/shared/enums/ProspectStatus';\n\ninterface CantFindSchoolStepItemProps extends BaseStepItemProps {\n prospectId?: string;\n email?: string;\n userType?: UserType;\n schoolName?: string;\n schoolType?: string;\n schoolLocality?: string;\n city?: string;\n province?: string;\n country?: string;\n longitude?: number;\n latitude?: number;\n trialStatus?: TrialStatus;\n userTrialStatus: TrialStatus;\n createOrUpdateProfile: (properties: ProfileProperties) => void;\n}\n\nexport function CantFindSchoolStepItem(props: CantFindSchoolStepItemProps): JSX.Element {\n const [ data, setData ] = React.useState<SearchSchoolData>({\n prospectId: props.prospectId,\n schoolName: props.schoolName,\n schoolType: props.schoolType,\n schoolLocality: props.schoolLocality,\n country: props.country,\n province: props.province,\n city: props.city,\n longitude: props.longitude,\n latitude: props.latitude\n });\n const [ submissionError, setSubmissionError ] = React.useState<string>();\n const [ loading, setLoading ] = React.useState(false);\n\n const schoolTypes = getSchoolTypesByGeoLocation(data.country || props.geoLocation?.countryCode);\n\n function canCreateSchool(): boolean {\n const { schoolName, schoolType, country } = data;\n\n return !!(\n schoolName &&\n schoolType &&\n country\n );\n }\n\n function setProperty<X extends keyof SearchSchoolData>(key: X, value: SearchSchoolData[X]) {\n setData(data => ({\n ...data,\n [key]: value\n }));\n }\n\n function setLocalityData(localityData: SearchSchoolData): void {\n const {\n longitude,\n latitude,\n schoolLocality,\n country,\n city,\n province\n } = localityData;\n longitude && setProperty('longitude', longitude);\n latitude && setProperty('latitude', latitude);\n country && setProperty('country', country);\n city && setProperty('city', city);\n province && setProperty('province', province);\n schoolLocality && setProperty('schoolLocality', schoolLocality);\n }\n\n function clearLocalityData(): void {\n setProperty('schoolLocality', undefined);\n setProperty('longitude', undefined);\n setProperty('latitude', undefined);\n setProperty('city', undefined);\n setProperty('province', undefined);\n setProperty('country', undefined);\n setSubmissionError('');\n }\n\n\n function handleSchoolTypeChange(event: React.ChangeEvent<HTMLSelectElement>) {\n const type = event.target.value;\n setProperty('schoolType', type);\n }\n\n function handleSchoolNameChange(event: React.ChangeEvent<HTMLInputElement>) {\n setProperty('schoolName', event.target.value);\n }\n\n async function brazeFormSubmissionEvent(callback?: (success: boolean) => void): Promise<void> {\n const brazeUser: BrazeUser = {\n email: props.email,\n custom: {\n accountName: data?.schoolName,\n accountAddress: {\n countryCode: data?.country,\n province: BrazeHelper.parseProvince(data.province)\n },\n orgSubType: BrazeHelper.getSchoolType(data?.schoolType),\n syncToCrm: true\n },\n event: {\n accountCountry: data?.country,\n accountPostCode: data?.schoolPostCode,\n accountState: BrazeHelper.parseProvince(data.province)\n }\n };\n const additionalData: HashObject<any> = {\n form_type: 'trial-sign-up',\n prospect_id: data?.prospectId\n };\n props.logBrazeEvent({\n user: brazeUser,\n event: {\n eventType: ProductFormEvent.FormSubmission,\n additionalData: additionalData,\n callback: callback\n }\n });\n }\n\n async function handleSubmission(event?: React.FormEvent): Promise<void> {\n event.preventDefault();\n\n if (!canCreateSchool()) return;\n\n props.logUserAction(data, {\n actionType: UserAction.Click,\n workflowPhase: WorkflowPhase.Next,\n descriptor: SignUpDescriptors.CantFindSchool\n });\n \n setLoading(true);\n // Create a prospect first\n let prospectResponse: CreateProspectSuccessResponse;\n try {\n prospectResponse = await ProspectRequests.create(\n props.ajaxUrls,\n {\n name: data.schoolName,\n status: ProspectStatus.Draft,\n countryCode: data.country,\n prospectType: data.schoolType,\n city: data.city,\n postCode: data.schoolPostCode,\n province: BrazeHelper.parseProvince(data.province)\n }\n );\n\n if (!prospectResponse.id) {\n setLoading(false);\n setSubmissionError('Error. Something went wrong.');\n return;\n }\n } catch (e) {\n setLoading(false);\n setSubmissionError('Error. Something went wrong.');\n return;\n }\n\n if (props.userTrialStatus === TrialStatus.BdmTrialAvailable) {\n if (props.userType !== UserType.Staff) {\n props.complete({\n completionStep: 'added-to-braze',\n trialCreated: false,\n trialStatus: null\n });\n return;\n }\n \n props.nextStep({\n step: 'request-bdm-trial',\n ...data\n });\n return;\n }\n\n // Create a trial for the newly created prospect if possible\n try {\n const trialRequest: CreateTrialRequest = {\n prospectId: prospectResponse.id,\n email: props.email,\n userType: props.userType,\n appLink: props.pageAppLinkString,\n attribution: {\n ...AttributionHelper.getDecodedAttributionData(),\n utms: UtmHelper.getUtmParameters()\n }\n };\n\n const trialResponse = await UserRequests.createTrial(\n props.ajaxUrls,\n trialRequest\n );\n\n if (props.createOrUpdateProfile) {\n props.createOrUpdateProfile({\n masterId: trialResponse.id,\n email: props.email,\n countryCode: data?.country\n });\n }\n\n const completionData: CompletionData = {\n completionStep: 'trial-status',\n email: props.email,\n userId: trialResponse.id,\n prospectId: prospectResponse.id,\n schoolName: data.schoolName,\n schoolLocality: data.schoolLocality,\n country: data.country,\n schoolType: data.schoolType,\n city: data.city,\n schoolPostCode: data.schoolPostCode,\n latitude: data.latitude,\n longitude: data.longitude,\n province: data.province,\n trialStatus: TrialStatus.Available,\n trialCreated: true,\n customerId: (trialResponse as any).data?.customerId\n };\n\n if (props?.userType === UserType.Staff) {\n /**\n * We immediately flush the braze data and complete \n * the step. If the flush fails, we'll continue exectution\n * and not block the user.\n */\n await brazeFormSubmissionEvent((flushSuccess: boolean) => {\n if (!flushSuccess)\n console.error('Failed to submit create trial data to braze.');\n \n props.complete(completionData);\n });\n\n return;\n }\n\n props.complete(completionData);\n } catch (e) {\n if (!e.body) {\n setLoading(false);\n setSubmissionError('Error. Something went wrong.');\n return;\n }\n \n const error = e as ApiError<CreateTrialErrorResponse>;\n if (error.body.status === 400 && error.body.type === 'trial-not-available') {\n props.nextStep({\n step: 'add-to-braze',\n ...data,\n prospectId: prospectResponse.id,\n trialStatus: TrialStatus.Unavailable\n });\n return;\n }\n\n console.error(e);\n }\n }\n\n return (\n <>\n <div className='text-center'>\n <h1 className='h4'>\n Tell us more about your school\n </h1>\n <p>\n Please enter your school details.\n </p>\n </div>\n <div className='form-group'>\n <label\n className='d-block'\n htmlFor='school-name-input'\n >\n Name of school\n </label>\n <input\n type='text'\n value={data?.schoolName || ''}\n onChange={handleSchoolNameChange}\n id='school-name-input'\n className='form-control form-control-lg'\n autoComplete='off'\n placeholder='Enter name of school'\n autoFocus\n />\n </div>\n <div className='form-group'>\n <label\n className='d-block'\n htmlFor='school-type-select'\n >\n Type of school\n </label>\n <select id='school-type-select' className={`form-select form-select-lg ${!data.schoolType ? 'text-secondary' : ''}`} autoComplete='off' value={data.schoolType || 'none'} onChange={handleSchoolTypeChange}>\n <option value='none' className='text-secondary' disabled>Select type of school</option>\n {schoolTypes.map(item => {\n return <option value={item} key={item} className='text-dark'>{item}</option>;\n })}\n </select>\n </div>\n <SearchLocalityInput\n data={data}\n setData={setLocalityData}\n clearData={clearLocalityData}\n disabled={false}\n labelClassName='d-block'\n geoLocation={props.geoLocation}\n logUserAction={props.logUserAction}\n googleMapsApiKey={props.googleMapsApiKey}\n autoFocus={false}\n size='lg'\n useGeoLocationApi\n />\n {submissionError &&\n <div className='text-danger mb-3'>\n {submissionError}\n </div>\n }\n {canCreateSchool() &&\n <SpinnerButton\n className='btn-lg w-100'\n variant='dark'\n onClick={handleSubmission}\n showSpinner={loading}\n disabled={loading}\n >\n Get started\n </SpinnerButton>\n }\n </>\n );\n}","import React from 'react';\nimport { type BrazeUser, ProductFormEvent } from '@clickview/braze-client';\n\nimport { SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces/AnalyticsTypes';\nimport { HashObject } from 'libs/analytics/interfaces/HashObject';\n\nimport { AddToBrazeForm, AddToBrazeFormData, AddToBrazeFormErrors } from 'libs/shared/apps/sign-up/components/steps/add-to-braze-step-item/AddToBrazeForm';\nimport { TrialStatus } from 'libs/shared/apps/sign-up/enums/TrialStatus';\nimport { UserType } from 'libs/shared/apps/sign-up/enums/UserType';\nimport { BrazeHelper } from 'libs/shared/apps/sign-up/helpers/BrazeHelper';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\nimport { isLearnerJobTitle } from 'libs/shared/apps/sign-up/utils/getJobTitles';\nimport { signUpSplitName } from 'libs/shared/apps/sign-up/utils/signUpSplitNames';\n\ninterface AddToBrazeStepItemProps extends BaseStepItemProps {\n email: string;\n trialStatus: TrialStatus;\n trialCreated: boolean;\n userType: UserType;\n\n prospectId?: string;\n schoolName?: string;\n schoolType?: string;\n schoolPostCode?: string;\n province?: string;\n country?: string;\n}\n\nexport function AddToBrazeStepItem(props: AddToBrazeStepItemProps): JSX.Element {\n const [ loading, setLoading ] = React.useState(false);\n const [ errors, setErrors ] = React.useState<AddToBrazeFormErrors>({});\n\n React.useEffect(() => {\n if (props.userType !== UserType.Learner)\n return;\n \n props.complete({\n completionStep: 'trial-status',\n trialCreated: false,\n trialStatus: TrialStatus.Unsupported\n });\n }, []);\n\n function handleSubmitForm(data: AddToBrazeFormData): void {\n if (isLearnerJobTitle(data.jobTitle)) {\n onComplete();\n return;\n }\n\n addToBraze(data);\n }\n\n async function addToBraze(data: AddToBrazeFormData) {\n if (loading) return;\n\n if (props.userType === UserType.Learner) {\n setErrors({\n ...errors,\n submission: 'Something went wrong! Please try again later.'\n });\n return;\n }\n \n props.logUserAction({}, {\n actionType: UserAction.Click,\n workflowPhase: WorkflowPhase.Next,\n descriptor: SignUpDescriptors.AddToBraze\n });\n\n setLoading(true);\n\n const { firstName, surname } = signUpSplitName(data.fullname);\n try {\n const brazeUser: BrazeUser = {\n email: props.email,\n firstName: firstName,\n lastName: surname,\n phone: data.phone,\n custom: {\n orgSubType: BrazeHelper.getSchoolType(props?.schoolType),\n accountName: props?.schoolName,\n jobTitle: data.jobTitle,\n accountAddress: {\n countryCode: props?.country,\n province: BrazeHelper.parseProvince(props?.province || '')\n },\n syncToCrm: true,\n source: BrazeHelper.SOURCE\n },\n event: {\n accountCountry: props?.country,\n accountPostCode: props?.schoolPostCode,\n eventTopic: BrazeHelper.EVENT_TOPIC\n }\n };\n\n const additionalData: HashObject<any> = {\n prospect_id: props?.prospectId\n };\n \n props.logBrazeEvent({\n user: brazeUser,\n event: {\n eventType: ProductFormEvent.ProductTrailRequested,\n additionalData: additionalData,\n callback: postSubmission\n }\n });\n } catch {\n setErrors({\n ...errors,\n submission: 'Something went wrong! Please try again later.'\n });\n }\n\n if (!Object.keys(errors).length) {\n onComplete();\n }\n }\n\n function postSubmission(success: boolean): void {\n if (!success) {\n setErrors({\n ...errors,\n submission: 'Something went wrong! Please try again later.'\n });\n } else {\n setErrors({});\n }\n setLoading(false);\n }\n\n function onComplete(): void {\n props.complete({\n completionStep: 'added-to-braze',\n trialCreated: false,\n trialStatus: null\n });\n }\n\n return (\n <AddToBrazeForm\n loading={loading}\n errors={errors}\n setErrors={setErrors}\n country={props.country || props.geoLocation?.countryCode}\n logUserAction={props.logUserAction}\n handleSubmitForm={handleSubmitForm}\n isTertiary={BrazeHelper.isTertiarySchool(props.schoolType)}\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"day\":\"e0Dbj\",\"month\":\"zLcQr\",\"year\":\"XiXPP\"};","import React from 'react';\n\nimport { SignUpDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { Completed } from 'libs/shared/apps/sign-up/components/general/completed';\nimport { StatusImage } from 'libs/shared/apps/sign-up/components/steps/completed-step-item/trial-status-completion/StatusImage';\nimport { getJoinRequestError } from 'libs/shared/apps/sign-up/components/steps/request-access/getJoinRequestError';\nimport { ProspectLookupType } from 'libs/shared/apps/sign-up/enums/ProspectLookup';\nimport { TrialStatus } from 'libs/shared/apps/sign-up/enums/TrialStatus';\nimport { ProspectRequests } from 'libs/shared/apps/sign-up/fetch-requests/ProspectRequests';\nimport { UserRequests } from 'libs/shared/apps/sign-up/fetch-requests/UserRequests';\nimport { ExternalLinkHelper } from 'libs/shared/apps/sign-up/helpers/ExternalLinkHelper';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\nimport { SignUpImageUrls } from 'libs/shared/apps/sign-up/interfaces/SignUpImageUrls';\n\ninterface RequestAccessProps extends BaseStepItemProps {\n imageUrls: SignUpImageUrls;\n schoolName: string;\n prospectId: string;\n email: string;\n}\n\nexport function RequestAccess(props: RequestAccessProps): JSX.Element {\n const [ error, setError ] = React.useState<string>(null);\n\n async function onClickRequestAccess(): Promise<void> {\n try {\n const lookups = await ProspectRequests.getLookups(props.ajaxUrls, props.prospectId);\n const customerId = lookups.find(p => p.type === ProspectLookupType.MasterId)?.externalId;\n\n if (!customerId) {\n setError('Something went wrong.');\n return;\n }\n\n await UserRequests.createJoinRequest(props.ajaxUrls, {\n customerId,\n email: props.email\n });\n\n props.logUserAction({}, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.RequestAccess\n });\n\n props.complete({\n completionStep: 'requested-access',\n trialCreated: false,\n trialStatus: TrialStatus.UserJoinApprovalRequired\n });\n } catch (err) {\n setError(getJoinRequestError(err));\n }\n }\n\n return (\n <>\n <StatusImage trialStatus={TrialStatus.UserJoinApprovalRequired} imageUrls={props.imageUrls} />\n <Completed.Body className='mb-3'>\n <Completed.Heading>\n {props.schoolName}<br/>already has ClickView 🎉\n </Completed.Heading>\n </Completed.Body>\n <button className='btn btn-lg btn-dark w-100 mb-3' onClick={onClickRequestAccess}>\n Request access\n </button>\n {error && <p className='text-danger text-center mb-2'>{error}</p>}\n <Completed.Message className='text-center'>\n Need Help? \n <a href={ExternalLinkHelper.getSupportUrlForGeoLocation(props.geoLocation)} className='info-link' target='_blank'>\n Contact our Help Centre.\n </a>\n </Completed.Message>\n </>\n );\n}","import React from 'react';\nimport { BrazeUser, ProductFormEvent } from '@clickview/braze-client';\n\nimport { SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\nimport { HashObject } from 'libs/analytics/interfaces/HashObject';\n\nimport { AddToBrazeForm, AddToBrazeFormData, AddToBrazeFormErrors } from 'libs/shared/apps/sign-up/components/steps/add-to-braze-step-item/AddToBrazeForm';\nimport { UserType } from 'libs/shared/apps/sign-up/enums/UserType';\nimport { BrazeRequests } from 'libs/shared/apps/sign-up/fetch-requests/BrazeRequests';\nimport { BrazeHelper } from 'libs/shared/apps/sign-up/helpers/BrazeHelper';\nimport { LocalityHelper } from 'libs/shared/apps/sign-up/helpers/LocalityHelper';\nimport { BaseStepItemProps } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\nimport { isLearnerJobTitle } from 'libs/shared/apps/sign-up/utils/getJobTitles';\nimport { signUpSplitName } from 'libs/shared/apps/sign-up/utils/signUpSplitNames';\n\ninterface RequestBdmTrialStepItemProps extends BaseStepItemProps {\n email: string;\n userType: UserType;\n\n prospectId?: string;\n schoolName?: string;\n schoolType?: string;\n schoolPostCode?: string;\n province?: string;\n country?: string;\n}\n\nexport function RequestBdmTrialStepItem(props: RequestBdmTrialStepItemProps): JSX.Element {\n const [ loading, setLoading ] = React.useState(false);\n const [ errors, setErrors ] = React.useState<AddToBrazeFormErrors>({});\n\n function handleSubmitForm(data: AddToBrazeFormData): void {\n if (isLearnerJobTitle(data.jobTitle)) {\n onComplete();\n return;\n }\n\n addToBraze(data);\n }\n\n function getInstanceRegion(): string {\n const countryCode = LocalityHelper.getCountryCode(props.country || props.geoLocation?.countryCode);\n return LocalityHelper.getInstanceRegion(countryCode);\n }\n\n async function addToBraze(data: AddToBrazeFormData) {\n if (loading) return;\n\n if (props.userType === UserType.Learner) {\n setErrors({\n ...errors,\n submission: 'Something went wrong! Please try again later.'\n });\n return;\n }\n \n props.logUserAction({}, {\n actionType: UserAction.Click,\n workflowPhase: WorkflowPhase.Next,\n descriptor: SignUpDescriptors.RequestBdmTrial\n });\n\n setLoading(true);\n\n const { firstName, surname } = signUpSplitName(data.fullname);\n try {\n const checkEmail = await BrazeRequests.checkEmail(props.ajaxUrls, props.email, getInstanceRegion());\n\n const brazeUser: BrazeUser = {\n email: props.email,\n firstName: firstName,\n lastName: surname,\n phone: data.phone,\n custom: {\n orgSubType: BrazeHelper.getSchoolType(props?.schoolType),\n accountName: props?.schoolName,\n jobTitle: data.jobTitle,\n accountAddress: {\n countryCode: props?.country,\n province: BrazeHelper.parseProvince(props?.province || '')\n },\n syncToCrm: checkEmail.users?.length === 0 ? true : undefined,\n source: BrazeHelper.BDM_SOURCE\n },\n event: {\n eventTopic: BrazeHelper.BDM_EVENT_TOPIC\n }\n };\n\n const additionalData: HashObject<any> = {\n prospect_id: props?.prospectId\n };\n \n props.logBrazeEvent({\n user: brazeUser,\n event: {\n eventType: ProductFormEvent.BdmTrialRequested,\n additionalData: additionalData,\n callback: postSubmission\n }\n });\n } catch {\n setErrors({\n ...errors,\n submission: 'Something went wrong! Please try again later.'\n });\n }\n\n if (!Object.keys(errors).length) {\n onComplete();\n }\n }\n\n function postSubmission(success: boolean): void {\n if (!success) {\n setErrors({\n ...errors,\n submission: 'Something went wrong! Please try again later.'\n });\n } else {\n setErrors({});\n }\n setLoading(false);\n }\n\n function onComplete(): void {\n props.complete({\n completionStep: 'added-to-braze',\n trialCreated: false,\n trialStatus: null\n });\n }\n\n return (\n <AddToBrazeForm\n loading={loading}\n errors={errors}\n setErrors={setErrors}\n country={props.country || props.geoLocation?.countryCode}\n logUserAction={props.logUserAction}\n handleSubmitForm={handleSubmitForm}\n isTertiary={BrazeHelper.isTertiarySchool(props.schoolType)}\n />\n );\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\n\nimport { SignUpProduct } from 'libs/shared/apps/sign-up/enums/SignUpProduct';\nimport { BrazeCheckEmailResponse } from 'libs/shared/apps/sign-up/helpers/BrazeHelper';\nimport { FetchHelper } from 'libs/shared/apps/sign-up/helpers/FetchHelper';\nimport { SignUpAjaxUrls } from 'libs/shared/apps/sign-up/interfaces/SignUpAjaxUrls';\n\nexport const BrazeRequests = {\n checkEmail(urls: SignUpAjaxUrls, email: string, instanceRegion: string) {\n if (urls.productName !== SignUpProduct.Lite)\n return Promise.reject();\n\n return FetchHelper.asyncFetch<BrazeCheckEmailResponse>({\n url: urls.brazeCheckEmail,\n method: HttpVerbs.POST,\n data: {\n email,\n instanceRegion\n }\n });\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"buttonContainer\":\"izZtA\",\"dataContainer\":\"OgBv5\"};","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport styles from './form-debugger.scss';\n\ninterface FormDebuggerProps {\n developmentEnv: boolean;\n objects: object;\n}\n\ninterface DebuggerItemProps {\n label: string;\n item: any;\n}\n\nfunction flattenObject(objects: any) {\n const flattened: HashObject = {};\n\n Object.keys(objects).forEach(key => {\n const value = objects[key];\n\n if (ObjectHelper.isObject(value) && value !== null && !Array.isArray(value)) {\n Object.assign(flattened, flattenObject(value));\n } else {\n flattened[key] = value;\n }\n });\n\n return flattened;\n}\n\nfunction DebuggerItem({ label, item }: DebuggerItemProps): JSX.Element {\n let content = item;\n \n if (Array.isArray(item)) {\n content = content.join(' -> ');\n }\n\n if (typeof content === 'boolean') {\n content = content ? 'true' : 'false';\n }\n\n return <div className='pb-1'>{label}: <b className='text-white'>{content}</b></div>;\n}\n\nexport function FormDebugger(props: FormDebuggerProps): JSX.Element {\n const {\n developmentEnv,\n objects\n } = props;\n\n const [ show, setShow ] = React.useState(true);\n\n const flatObject = React.useMemo<HashObject>(() => flattenObject(objects), [objects]);\n \n return (\n developmentEnv &&\n <>\n\n <div className={`position-fixed p-4 ${styles.buttonContainer}`}>\n <button onClick={() => { setShow(!show); }} className='btn btn-dark px-2 py-1'>{show ? 'Hide' : 'Show'} debugger</button>\n </div>\n\n {show &&\n <div className={`fixed-bottom mb-4 ms-4 bg-dark rounded ${styles.dataContainer}`}>\n <code className='d-block p-4'>\n <div className='fw-bold pb-2'>{`{ Debug: Form Data }`}</div>\n {Object.keys(flatObject).map(key => {\n return <DebuggerItem key={key} label={key} item={flatObject[key]} />;\n })}\n </code>\n </div>}\n\n </>\n );\n}","import React from 'react';\n\nimport { StepIds } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\n\nimport styles from './dot-crumbs.scss';\n\ninterface DotCrumbsProps {\n crumbs: StepIds[];\n currentStep: StepIds;\n}\n\nfunction getClass(currentStep: StepIds, item: StepIds): string {\n const baseClass = 'rounded-circle mx-2 d-inline-block ' + styles.crumb;\n const colorClass = currentStep === item ? 'bg-blue' : 'bg-light';\n\n return `${baseClass} ${colorClass}`;\n}\n\nexport function DotCrumbs(props: DotCrumbsProps): JSX.Element {\n return (\n <div className='text-center'>\n {\n props.crumbs.map(item => {\n return <div className={getClass(props.currentStep, item)} key={item} />;\n })\n }\n </div>\n );\n}","import React from 'react';\n\nimport { ExternalLinkHelper } from 'libs/shared/apps/sign-up/helpers/ExternalLinkHelper';\nimport { ExternalLink } from 'libs/shared/components/external-link/ExternalLink';\n\ninterface TermsAndConditionsProps {\n onClickTermsAndConditions: () => void;\n onClickPrivacyPolicy: () => void;\n}\n\nexport function TermsAndConditions(props: TermsAndConditionsProps): JSX.Element {\n const termsAndConditionsLink = ExternalLinkHelper.getTermsAndConditionsLink();\n const privacyPolicyLink = ExternalLinkHelper.getPrivacyPolicyLink();\n\n return (\n <span\n className='text-center text-md mt-2 text-normal small'\n >\n By signing up you agree to the\n <br />\n <ExternalLink href={termsAndConditionsLink} onClick={props.onClickTermsAndConditions} className='info-link' newTab>\n Terms and Conditions\n </ExternalLink>\n \n and\n \n <ExternalLink href={privacyPolicyLink} onClick={props.onClickPrivacyPolicy} className='info-link' newTab>\n Privacy Policy\n </ExternalLink>\n </span>\n );\n}","import React from 'react';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface MultiStepBackButtonProps {\n onClick: (event: React.MouseEvent) => void;\n}\n\nexport function MultiStepBackButton(props: React.PropsWithChildren<MultiStepBackButtonProps>): JSX.Element {\n return (\n <button onClick={props.onClick} className='btn p-0 cursor-pointer d-inline-flex align-items-center'>\n <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Medium} />\n {props.children}\n </button>\n );\n}","import React from 'react';\n\nimport { SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { DotCrumbs } from 'libs/shared/apps/sign-up/components/general/dot-crumbs/DotCrumbs';\nimport { ExistingAccountSignIn } from 'libs/shared/apps/sign-up/components/general/existing-account-sign-in/ExistingAccountSignIn';\nimport { TermsAndConditions } from 'libs/shared/apps/sign-up/components/general/terms-and-conditions/TermsAndConditions';\nimport { MultiStepBackButton } from 'libs/shared/apps/sign-up/components/multi-step-form/MultiStepBackButton';\nimport { LayoutProps } from 'libs/shared/apps/sign-up/interfaces/Layout';\nimport { StepIds } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\nimport { ClickViewLogo } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\n\nimport styles from './full-page-layout.scss';\n\n// Steps that show a back button\nconst BACK_BUTTON_STEPS: StepIds[] = [ 'enter-email', 'find-school', 'cant-find-school', 'add-to-braze', 'enter-age', 'request-access', 'request-bdm-trial', 'select-idp' ];\n\n// Steps that show the terms and conditions\nconst TNC_STEPS: StepIds[] = [ 'enter-email', 'find-school', 'add-to-braze' ];\n\n// Small steps with a width of 23rem (368px)\nconst NARROW_STEPS: StepIds[] = [ 'enter-email', 'find-school', 'cant-find-school', 'add-to-braze', 'enter-age', 'request-bdm-trial', 'select-idp' ];\n\n// Wide steps with a width of 42rem (627px) steps\nconst WIDE_STEPS: StepIds[] = ['select-type'];\n\n// Steps that show the \"Sign in\" button\nconst SHOW_SIGN_IN_STEPS: StepIds[] = ['select-type'];\n\nFullPageLayout.defaultProps = {\n showBackButton: true\n};\n\nconst crumbsSteps: StepIds[] = [ 'select-type', 'enter-email', 'find-school' ];\n\nexport function FullPageLayout(props: React.PropsWithChildren<LayoutProps>): JSX.Element {\n const {\n currentStep,\n previousStep,\n hasPreviousStep,\n showBackButton,\n children\n } = props;\n\n function showSignInText() {\n return SHOW_SIGN_IN_STEPS.includes(currentStep);\n }\n\n function showTermsAndConditions() {\n return TNC_STEPS.includes(currentStep);\n }\n\n function shouldShowBackButton() {\n return BACK_BUTTON_STEPS.includes(currentStep);\n }\n\n function getMaxWidthClass(): string {\n if (WIDE_STEPS.includes(currentStep))\n return styles.maxWidth42rem;\n\n if (NARROW_STEPS.includes(currentStep))\n return styles.maxWidth23rem;\n\n return styles.maxWidth30rem;\n }\n\n function onClickBackButtons(): void {\n previousStep();\n\n props.logUserAction({\n step: currentStep\n }, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.Back,\n workflowPhase: WorkflowPhase.Back\n });\n }\n\n function onClickTermsAndConditions(): void {\n props.logUserAction({}, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.TermsAndConditions\n });\n }\n\n function onClickPrivacyPolicy(): void {\n props.logUserAction({}, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.PrivacyPolicy\n });\n }\n\n function onClickSignIn(): void {\n props.logUserAction({}, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.SignIn\n });\n }\n \n return (\n <div className={`d-flex flex-column justify-content-between px-4 py-0 ${styles.fullPageLayout}`}>\n <div className='mt-3 mb-2'>\n {crumbsSteps.includes(currentStep) &&\n <DotCrumbs\n crumbs={crumbsSteps}\n currentStep={currentStep}\n />\n }\n </div>\n <div className={`position-relative mx-auto w-100 ${getMaxWidthClass()}`}>\n <div className='d-flex flex-row justify-content-center align-items-center mt-2 mb-3'>\n {hasPreviousStep && showBackButton && shouldShowBackButton() &&\n <MultiStepBackButton onClick={onClickBackButtons} />\n }\n <div className={`d-flex justify-content-center align-items-center px-2 ${styles.logo}`}>\n <ClickViewLogo />\n </div>\n </div>\n {children}\n </div>\n <div className='position-relative mb-4 mt-3 text-center'>\n {showSignInText() &&\n <ExistingAccountSignIn link={props.getSignInUrl()} onClick={onClickSignIn} />\n }\n {showTermsAndConditions() &&\n <TermsAndConditions\n onClickTermsAndConditions={onClickTermsAndConditions}\n onClickPrivacyPolicy={onClickPrivacyPolicy}\n />\n }\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"fullPageLayout\":\"jZ_Wp\",\"logo\":\"J97w_\",\"maxWidth42rem\":\"Ye154\",\"maxWidth23rem\":\"m2kAT\",\"maxWidth30rem\":\"ollkc\"};","import React from 'react';\n\nimport { SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { DotCrumbs } from 'libs/shared/apps/sign-up/components/general/dot-crumbs/DotCrumbs';\nimport { ExistingAccountSignIn } from 'libs/shared/apps/sign-up/components/general/existing-account-sign-in/ExistingAccountSignIn';\nimport { TermsAndConditions } from 'libs/shared/apps/sign-up/components/general/terms-and-conditions/TermsAndConditions';\nimport { MultiStepBackButton } from 'libs/shared/apps/sign-up/components/multi-step-form/MultiStepBackButton';\nimport { LayoutProps } from 'libs/shared/apps/sign-up/interfaces/Layout';\nimport { StepIds } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ClickViewLogo, ClickViewLogoInverted } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './popup-layout.scss';\n\nPopupLayout.defaultProps = {\n showBackButton: true\n};\n\nconst crumbsSteps: StepIds[] = [ 'enter-email', 'find-school' ];\n// steps that have the left half as image and content on the right\nconst halfLayoutSteps: StepIds[] = [\n 'enter-email',\n 'find-school',\n 'cant-find-school',\n 'add-to-braze',\n 'enter-age',\n 'request-access',\n 'request-bdm-trial',\n 'select-idp'\n];\n\nexport function PopupLayout(props: React.PropsWithChildren<LayoutProps>): JSX.Element {\n const {\n currentStep,\n previousStep,\n hasPreviousStep,\n showBackButton,\n closeApp,\n children\n } = props;\n\n const crumbStep = currentCrumbStep();\n\n function showSignInText() {\n return currentStep === 'select-type';\n }\n \n function showTermsAndConditions() {\n return [ 'enter-email', 'add-to-braze' ].includes(currentStep);\n }\n function shouldShowBackButton() {\n return [ 'enter-email', 'find-school', 'cant-find-school', 'add-to-braze', 'enter-age', 'request-bdm-trial', 'select-idp' ].includes(currentStep);\n }\n\n /**\n * Allows us to add extra pseudo steps to a step - Sha\n */\n function currentCrumbStep() {\n if (currentStep === 'select-idp') {\n return 'find-school';\n }\n\n return currentStep;\n }\n\n function onClickBackButtons(): void {\n previousStep();\n\n props.logUserAction({}, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.Back,\n workflowPhase: WorkflowPhase.Back\n });\n }\n\n function onClickTermsAndConditions(): void {\n props.logUserAction({}, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.TermsAndConditions\n });\n }\n\n function onClickPrivacyPolicy(): void {\n props.logUserAction({}, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.PrivacyPolicy\n });\n }\n\n function onClickSignIn(): void {\n props.logUserAction({}, {\n actionType: UserAction.Click,\n descriptor: SignUpDescriptors.SignIn\n });\n }\n\n const hasLeftHalfBg = halfLayoutSteps.includes(props.currentStep);\n const layoutClass = hasLeftHalfBg ? `${styles.leftHalfLayout} ${styles.withBg}` : styles.leftHalfLayout;\n \n return (\n <div className={layoutClass}>\n <div className='row mx-0 p-3'>\n <div className={`col px-0 d-lg-none ${styles.popupButton}`}>\n {hasPreviousStep && shouldShowBackButton() && showBackButton &&\n <MultiStepBackButton onClick={onClickBackButtons}></MultiStepBackButton>\n }\n </div>\n <div className='col col-lg-6 px-0'>\n <div className={styles.logo}>\n <div className='d-none d-lg-block'>\n {hasLeftHalfBg ?\n <ClickViewLogoInverted /> :\n <ClickViewLogo />\n }\n </div>\n <div className='d-block d-lg-none mt-1'>\n <ClickViewLogo />\n {crumbsSteps.includes(crumbStep) &&\n <div className='mt-3'>\n <DotCrumbs\n crumbs={crumbsSteps}\n currentStep={crumbStep}\n />\n </div>\n }\n </div>\n </div>\n </div>\n <div className='col col-lg-6 d-flex flex-row justify-content-between px-0'>\n <div className='px-3'>\n <div className={`d-none d-lg-block ${styles.popupButton}`}>\n {hasPreviousStep && shouldShowBackButton() && showBackButton &&\n <MultiStepBackButton onClick={onClickBackButtons}></MultiStepBackButton>\n }\n </div>\n </div>\n {crumbsSteps.includes(crumbStep) &&\n <div className='d-none d-lg-block align-self-center'>\n <DotCrumbs\n crumbs={crumbsSteps}\n currentStep={crumbStep}\n />\n </div>\n }\n <DivButton onClick={closeApp} className={styles.popupButton}>\n <SvgContainer svgName={cvSvgLibrary.Close} size={SvgContainerSize.Medium} />\n </DivButton>\n </div>\n </div>\n <div className='row mx-0 flex-grow-1'>\n {hasLeftHalfBg &&\n <div className='col-6 px-0 d-none d-lg-block'>\n <div className='h-100 d-flex align-items-center justify-content-center'>\n <img src={props.imageUrls.popupDashboard} className={`w-100 p-4 pb-5 ${styles.leftImage}`} />\n </div>\n </div>\n }\n <div className={`px-4 pt-0 pb-4 ${hasLeftHalfBg ? 'col-12 col-lg-6' : 'col-12'}`}>\n <div className='d-flex flex-column h-100'>\n <div className='flex-grow-1'>\n {children}\n </div>\n <div className='text-center mt-3'>\n {showSignInText() &&\n <ExistingAccountSignIn\n link={props.getSignInUrl()}\n onClick={onClickSignIn}\n />\n }\n {showTermsAndConditions() &&\n <TermsAndConditions\n onClickTermsAndConditions={onClickTermsAndConditions}\n onClickPrivacyPolicy={onClickPrivacyPolicy}\n />\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}","import { MultiStepFormTypes } from 'libs/shared/apps/sign-up/enums/MultiStepFormTypes';\nimport { LayoutMappingType } from 'libs/shared/apps/sign-up/interfaces/Layout';\nimport { FullPageLayout } from 'libs/shared/apps/sign-up/layouts/full-page-layout/FullPageLayout';\nimport { PopupLayout } from 'libs/shared/apps/sign-up/layouts/popup-layout/PopupLayout';\n\nconst LayoutMappings: {[key in MultiStepFormTypes]: LayoutMappingType} = {\n [MultiStepFormTypes.FullPage]: FullPageLayout,\n [MultiStepFormTypes.Popup]: PopupLayout\n};\n\nexport const LayoutHelper = {\n getLayouts(type: MultiStepFormTypes): LayoutMappingType {\n return LayoutMappings[type];\n }\n};","import { NextStepAction } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/actions/FormActions';\nimport { SignUpState } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/interfaces/SignUpState';\n\nfunction removeEmptyKeys(obj: any): any {\n return Object.entries(obj)\n .filter(([ , v ]) => v !== null)\n .reduce((acc, [ k, v ]) => ({ ...acc, [k]: v }), {});\n}\n\nexport function nextStepReducer(state: SignUpState, action: NextStepAction): SignUpState {\n const newState: SignUpState = {\n ...state,\n previousStepIds: [ ...state.previousStepIds, state.currentStepId ],\n currentStepId: action.step\n };\n\n if (action.step === 'select-type') {\n return {\n ...newState\n };\n }\n\n if (action.step === 'enter-email' || action.step === 'enter-age') {\n return {\n ...newState,\n userType: action.userType\n };\n }\n\n if (action.step === 'select-idp') {\n return {\n ...newState,\n email: action.email,\n userTrialStatus: action.userTrialStatus,\n idps: action.idps\n };\n }\n\n if (action.step === 'find-school') {\n return {\n ...newState,\n email: action.email,\n userTrialStatus: action.userTrialStatus\n };\n }\n\n if (action.step === 'cant-find-school') {\n return {\n ...newState,\n prospectId: action.prospectId,\n schoolName: action.schoolName,\n schoolLocality: action.schoolLocality,\n country: action.country,\n longitude: action.longitude,\n latitude: action.latitude,\n city: action.city,\n province: action.province\n };\n }\n\n if (action.step === 'add-to-braze' || action.step === 'completed' || action.step === 'request-access' || action.step === 'request-bdm-trial') {\n let stepData = { ...action };\n\n delete stepData.type;\n delete stepData.step;\n\n stepData = removeEmptyKeys(stepData);\n return {\n ...newState,\n ...stepData\n };\n }\n}","import { FormActions } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/actions/FormActions';\nimport { SignUpState } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/interfaces/SignUpState';\nimport { backReducer } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/reducers/BackReducer';\nimport { nextStepReducer } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/reducers/NextStepReducer';\n\nexport function signUpReducer(state: SignUpState, action: FormActions): SignUpState {\n switch (action.type) {\n case 'nextStep':\n return nextStepReducer(state, action);\n case 'back':\n return backReducer(state);\n }\n}","import { SignUpState } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/interfaces/SignUpState';\n\nexport function backReducer(state: SignUpState): SignUpState {\n const updatedPreviousSteps = [...state.previousStepIds];\n const lastStepId = updatedPreviousSteps.pop();\n return {\n ...state,\n previousStepIds: updatedPreviousSteps,\n currentStepId: lastStepId\n };\n}","import React from 'react';\n\nimport { AnalyticsOptions, EntityType, LocationContext } from 'libs/analytics/interfaces/AnalyticsTypes';\nimport { HashObject } from 'libs/analytics/interfaces/HashObject';\n\nimport { BrazeHelper } from 'libs/shared/apps/sign-up/helpers/BrazeHelper';\nimport { DataHelper } from 'libs/shared/apps/sign-up/helpers/DataHelper';\nimport { StepActions } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/actions/StepActions';\nimport { CompletionData, SignUpState, SignUpStepsDataState } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/interfaces/SignUpState';\nimport { signUpReducer } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/reducers/SignUpReducer';\n\ntype SignUpLocation = LocationContext.SignUpPopup\n| LocationContext.SignUpPage\n| LocationContext.AuthProspectSelect;\n\ninterface SignUpStepsParams {\n location: SignUpLocation;\n\n initialValues?: SignUpStepsDataState;\n onStepUpdate?: (data: SignUpState) => void;\n externalLogUserAction: (data: HashObject | HashObject[], analyticsOptions: AnalyticsOptions) => void;\n}\n\nexport const useSignUpSteps = ({\n location,\n initialValues,\n onStepUpdate,\n externalLogUserAction\n}: SignUpStepsParams) => {\n const init = BrazeHelper.removeEmptyKeys(initialValues);\n \n const initialState: SignUpState = {\n currentStepId: 'select-type',\n previousStepIds: [],\n ...init\n };\n\n const [ state, dispatch ] = React.useReducer(signUpReducer, initialState);\n\n React.useEffect(() => {\n onStepUpdate?.(state);\n }, [state.currentStepId]);\n\n function back(): void {\n dispatch({\n type: 'back'\n });\n }\n\n function nextStep(action: StepActions): void {\n dispatch({\n type: 'nextStep',\n ...action\n });\n }\n\n function complete(data: CompletionData): void {\n dispatch({\n type: 'nextStep',\n step: 'completed',\n ...data\n });\n }\n\n function logUserAction(data: HashObject | HashObject[], analyticsOptions: AnalyticsOptions): void {\n const combinedData = {\n ...state,\n ...data\n };\n const dataWithoutPII = DataHelper.filterBlacklistedKeys(combinedData);\n const enrichedData = {\n currentStepId: state.currentStepId,\n ...dataWithoutPII\n };\n const filteredEnrichedData = Object.entries(enrichedData)\n .filter(([ , value ]) => value !== undefined)\n .reduce((obj, [ key, value ]) => ({ ...obj, [key]: value }), {});\n\n externalLogUserAction(filteredEnrichedData, {\n entity: EntityType.SignUp,\n location,\n ...analyticsOptions\n });\n }\n\n return {\n state,\n back,\n nextStep,\n complete,\n hasPreviousStep: !!state.previousStepIds.length,\n logUserAction\n };\n};","\nimport React from 'react';\n\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { ProfileProperties } from 'libs/analytics/clients/ProfileApiClient';\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { ActiveStep } from 'libs/shared/apps/sign-up/components/multi-step-form/ActiveStep';\nimport { FormDebugger } from 'libs/shared/apps/sign-up/components/multi-step-form/form-debugger/FormDebugger';\nimport { YOUNG_STUDENT_STORAGE_KEY } from 'libs/shared/apps/sign-up/constants/YoungStudentStorageKey';\nimport { MultiStepFormTypes } from 'libs/shared/apps/sign-up/enums/MultiStepFormTypes';\nimport { SignUpProduct } from 'libs/shared/apps/sign-up/enums/SignUpProduct';\nimport { LayoutHelper } from 'libs/shared/apps/sign-up/helpers/LayoutHelper';\nimport { SignUpState, SignUpStepsDataState } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/interfaces/SignUpState';\nimport { useSignUpSteps } from 'libs/shared/apps/sign-up/hooks/useSignUpSteps/useSignUpSteps';\nimport { GetSignInUrl } from 'libs/shared/apps/sign-up/interfaces/GetSignInUrl';\nimport { IdentityProvider } from 'libs/shared/apps/sign-up/interfaces/IdentityProvider';\nimport { LogBrazeEventOptions } from 'libs/shared/apps/sign-up/interfaces/MultiStepForm';\nimport { SignUpAjaxUrls } from 'libs/shared/apps/sign-up/interfaces/SignUpAjaxUrls';\nimport { SignUpImageUrls } from 'libs/shared/apps/sign-up/interfaces/SignUpImageUrls';\nimport { GeoLocation } from 'libs/shared/interfaces/responses/GeoLocation';\n\ntype MultiStepFormInitialValues = Pick<SignUpStepsDataState, 'email'>;\n\ninterface MultiStepFormProps {\n type: MultiStepFormTypes;\n location: LocationContext.SignUpPopup | LocationContext.SignUpPage;\n googleMapsApiKey: string;\n geoLocation: GeoLocation;\n\n initialValues?: MultiStepFormInitialValues;\n pageAppLinkString?: string;\n onStepUpdate?: (data: SignUpState) => void;\n close?: () => void;\n imageUrls: SignUpImageUrls;\n ajaxUrls: SignUpAjaxUrls;\n logBrazeEvent: (options: LogBrazeEventOptions) => void;\n productName: SignUpProduct;\n getSignInUrl: GetSignInUrl;\n globalIdps: IdentityProvider[];\n createOrUpdateProfile: (properties: ProfileProperties) => void;\n}\n\nexport function MultiStepForm(props: React.PropsWithChildren<MultiStepFormProps>): JSX.Element {\n const layout = LayoutHelper.getLayouts(props.type);\n const {\n location,\n initialValues,\n geoLocation,\n googleMapsApiKey,\n pageAppLinkString,\n onStepUpdate,\n imageUrls,\n ajaxUrls,\n productName,\n close,\n getSignInUrl,\n globalIdps,\n logBrazeEvent,\n createOrUpdateProfile\n } = props;\n const { back, nextStep, complete, hasPreviousStep, state, logUserAction } = useSignUpSteps({\n location,\n initialValues,\n onStepUpdate,\n externalLogUserAction: AnalyticsHelper.logUserAction\n });\n\n const stepProps = {\n state,\n geoLocation,\n layout,\n hasPreviousStep,\n googleMapsApiKey,\n pageAppLinkString,\n back,\n close,\n nextStep,\n complete,\n logUserAction,\n imageUrls,\n ajaxUrls,\n productName,\n getSignInUrl,\n globalIdps,\n logBrazeEvent,\n createOrUpdateProfile\n };\n\n React.useEffect(() => {\n const youngStudent = LocalStorageHelper.get(YOUNG_STUDENT_STORAGE_KEY);\n\n if (!youngStudent) return;\n\n complete({\n completionStep: 'young-student',\n trialCreated: false,\n trialStatus: null\n });\n }, []);\n \n return (\n <>\n <ActiveStep {...stepProps} />\n <FormDebugger\n developmentEnv={process.env.NODE_ENV === 'development'}\n objects={{\n ...state,\n pageAppLinkString,\n ...geoLocation\n }}\n />\n </>\n );\n}","import React from 'react';\n\nimport { JobTitles } from 'libs/shared/apps/sign-up/interfaces/JobTitles';\nimport { getJobTitles } from 'libs/shared/apps/sign-up/utils/getJobTitles';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\nimport { CountryCode } from 'libs/shared/enums/CountryCode';\n\nconst OTHER_VALUE = 'OTHER';\n\nfunction getInitialSelection(initialValue: JobTitles | string, jobTitles: JobTitles[]): JobTitles | '' | typeof OTHER_VALUE {\n if (jobTitles.includes(initialValue as JobTitles))\n return initialValue as JobTitles;\n\n if (initialValue)\n return OTHER_VALUE;\n\n return '';\n}\n\ninterface JobTitleInputProps {\n id: string;\n error: string;\n onChange: (jobTitle: JobTitles | '') => void;\n countryCode: CountryCode;\n placeholder?: string;\n initialValue?: JobTitles | string;\n size?: 'lg'\n labelClassName?: string;\n required?: boolean;\n isTertiary: boolean;\n}\n\nexport function JobTitleInput(props: JobTitleInputProps): JSX.Element {\n const {\n error,\n onChange,\n countryCode,\n isTertiary\n } = props;\n\n const jobTitles = getJobTitles({ countryCode, isTertiary });\n\n const initialSelection = getInitialSelection(props.initialValue, jobTitles);\n\n const [ selection, setSelection ] = React.useState<JobTitles | '' | typeof OTHER_VALUE>(initialSelection);\n const [ other, setOther ] = React.useState(initialSelection === OTHER_VALUE ? props.initialValue : '');\n\n React.useEffect(() => {\n setSelection(getInitialSelection(props.initialValue, jobTitles));\n }, [props.initialValue]);\n\n function onChangeSelection(event: React.ChangeEvent<HTMLSelectElement>): void {\n setSelection(event.target.value as JobTitles);\n setOther('');\n onChange(event.target.value === OTHER_VALUE ? '' : event.target.value as JobTitles);\n }\n\n function onChangeOther(event: React.ChangeEvent<HTMLInputElement>): void {\n setOther(event.target.value);\n onChange(event.target.value as JobTitles);\n }\n\n const showOther = selection === OTHER_VALUE;\n\n return (\n <div className='form-group'>\n <label htmlFor={props.id} className={props.labelClassName}>\n Job title\n {props.required && <span className='text-danger'>*</span>}\n </label>\n <div className='mb-2'>\n <select\n id={props.id}\n name={props.id}\n className={`form-select ${props.size === 'lg' ? 'form-select-lg' : ''} ${selection.length ? 'text-dark' : 'text-secondary'} ${!!error && 'is-invalid'}`}\n value={selection}\n placeholder='Role'\n onChange={onChangeSelection}\n >\n <option value='' disabled className='text-secondary'>\n {props.placeholder ? props.placeholder : <>What do you do?</>}\n </option>\n {jobTitles.map((title, key) => <option value={title} className='text-dark' key={key}>{title}</option>)}\n <option value={OTHER_VALUE} className='text-dark'>Other</option>\n </select>\n {!!error && !showOther && <FormFeedback name={props.id}>{error}</FormFeedback>}\n </div>\n {showOther &&\n <div className='mb-3'>\n <input\n className={`form-control ${props.size === 'lg' ? 'form-select-lg' : ''} ${!!error && 'is-invalid'}`}\n type='text'\n value={other}\n placeholder='What do you do?'\n autoFocus\n onChange={onChangeOther}\n />\n {!!error && <FormFeedback name={props.id}>{error}</FormFeedback>}\n </div>\n }\n </div>\n );\n}","export enum MultiStepFormTypes {\n Popup = 'popup-form',\n FullPage = 'full-page-form'\n}","/**\n * There are more lookup types than this, but these are the only\n * ones the product should really care about - Sha\n */\nexport enum ProspectLookupType {\n MasterId = 'master_id',\n CrmId = 'crm_id',\n SalesforceId = 'salesforce_id'\n}\n\nexport interface ProspectLookup {\n prospectId: string;\n externalId: string;\n type: ProspectLookupType;\n}","export enum SignUpProduct {\n Lite = 'lite',\n Auth = 'auth'\n}","import SparkMD5 from 'spark-md5';\n\nimport type { HashObject } from 'libs/analytics/interfaces';\n\ninterface SchoolTypeInfo {\n label: string;\n isTertiary: boolean;\n}\n\nconst SCHOOL_TYPE_MAP: Record<string, SchoolTypeInfo> = {\n 'secondary': {\n label: 'Secondary',\n isTertiary: false\n },\n 'primary & secondary': {\n label: 'Primary & Secondary',\n isTertiary: false\n },\n 'k12': {\n label: 'Primary & Secondary',\n isTertiary: false\n },\n 'primary': {\n label: 'Primary',\n isTertiary: false\n },\n 'special': {\n label: 'Special',\n isTertiary: false\n },\n 'university': {\n label: 'University',\n isTertiary: true\n },\n 'middle': {\n label: 'Middle',\n isTertiary: false\n },\n 'fe college': {\n label: 'FE College',\n isTertiary: true\n },\n 'high school': {\n label: 'Secondary',\n isTertiary: false\n },\n 'elementary': {\n label: 'Primary',\n isTertiary: false\n },\n 'middle school': {\n label: 'Middle',\n isTertiary: false\n },\n 'tafe': {\n label: 'TAFE',\n isTertiary: true\n },\n 'college': {\n label: 'FE College',\n isTertiary: true\n },\n 'sixth form college': {\n label: 'Sixth Form College',\n isTertiary: true\n }\n};\n\nconst PROVINCE_ISO_MAP: HashObject<string> = {\n 'england': 'ENG',\n 'scotland': 'SCT',\n 'wales': 'WLS',\n 'northern ireland': 'NIR'\n};\n\nexport interface BrazeCheckEmailResponse {\n invalidUserIds: string[];\n message: string;\n users: HashObject[];\n}\n\nexport const BrazeHelper = {\n\n hashedEmail(email: string) {\n const normalizedEmail = email.trim().toLowerCase();\n return SparkMD5.hash(normalizedEmail);\n },\n\n removeEmptyKeys(object: HashObject<any>): HashObject<any> {\n if (Array.isArray(object))\n return object;\n\n const payload = { ...object };\n return Object.entries(payload)\n .filter(([ , v ]) => {\n if (v === undefined || v === null) {\n return false;\n }\n if (typeof v === 'string' && !v.length) {\n return false;\n }\n return true;\n })\n .reduce(\n (acc, [ k, v ]) => ({ ...acc, [k]: v === Object(v) ? BrazeHelper.removeEmptyKeys(v) : v }),\n {}\n );\n },\n\n EVENT_TOPIC: 'Free Trial Request',\n\n BDM_EVENT_TOPIC: 'Requested free trial (Streamable Customer)',\n\n SOURCE: 'cv_product_trial_requested',\n\n BDM_SOURCE: 'cv_product_bdm_trial_requested',\n\n getSchoolType(schoolType: string): string {\n if (!schoolType) return;\n\n const prospectType = schoolType.toLowerCase();\n\n if ([ 'unknown', 'other' ].includes(prospectType)) return;\n \n const mappedSchoolType = SCHOOL_TYPE_MAP[prospectType]?.label;\n if (mappedSchoolType)\n return mappedSchoolType;\n \n return schoolType;\n },\n\n isTertiarySchool(schoolType: string): boolean {\n return SCHOOL_TYPE_MAP[schoolType?.toLowerCase()]?.isTertiary || false;\n },\n\n parseProvince(province?: string): string {\n if (!province.length) return '';\n\n const mappedProvince = PROVINCE_ISO_MAP[province.toLowerCase()];\n return mappedProvince || province;\n }\n};","import { HashObject } from 'libs/analytics/interfaces';\n\nconst BLACKLISTED_KEYS: string[] = [\n 'email',\n 'longitude',\n 'latitude',\n 'trialCreated',\n 'idps'\n];\n\nexport const DataHelper = {\n filterBlacklistedKeys(data: HashObject) {\n const newObj = { ...data };\n\n BLACKLISTED_KEYS.forEach(prop => delete newObj[prop]);\n\n return newObj;\n }\n};","import { LocalityHelper } from 'libs/shared/apps/sign-up/helpers/LocalityHelper';\nimport { CountryCode } from 'libs/shared/enums/CountryCode';\nimport { GeoLocation } from 'libs/shared/interfaces/responses/GeoLocation';\n\ntype ExternalLinkType = {\n [key: string]: {\n [key in CountryCode]: string\n }\n}\n\nexport const ExternalLink: ExternalLinkType = {\n Marketing: {\n au: 'https://www.clickvieweducation.com/en-au',\n us: 'https://www.clickvieweducation.com',\n nz: 'https://www.clickview.co.nz',\n // @todo update after new UK website is released\n uk: 'https://www.clickview.co.uk'\n },\n Support: {\n au: 'https://www.clickviewsupport.com/hc/en-au',\n uk: 'https://www.clickviewsupport.com/hc/en-au#gb',\n nz: 'https://www.clickviewsupport.com/hc/en-au#nz',\n us: 'https://www.clickviewsupport.com/hc/en-au#us'\n }\n};\n\nconst marketingSalesPathname: {[key in CountryCode]: string} = {\n [CountryCode.AU]: '/contact-us/sales',\n [CountryCode.US]: '/contact-us/sales',\n [CountryCode.NZ]: '/contact-us/',\n // @todo update after new UK website is released\n [CountryCode.UK]: '/contact-us/trial'\n};\n\nconst marketingFreeResourcesPathname: {[key in CountryCode]: string} = {\n [CountryCode.AU]: '/resources/free-student-resources',\n [CountryCode.US]: '/resources/free-student-resources',\n [CountryCode.NZ]: '/free-student-resources/',\n // @todo update after new UK website is released\n [CountryCode.UK]: '/free-student-resources/'\n};\n\nexport const ExternalLinkHelper = {\n \n getMarketingUrlForGeoLocation(geoLocation: GeoLocation): string {\n const countryCode = LocalityHelper.getCountryCode(geoLocation?.countryCode);\n const url = ExternalLink.Marketing[countryCode];\n\n if (!url)\n return ExternalLink.Marketing.us;\n\n return url;\n },\n\n getMarketingSalesContactForGeoLocation(geoLocation: GeoLocation): string {\n const countryCode = LocalityHelper.getCountryCode(geoLocation?.countryCode);\n const baseUrl = ExternalLinkHelper.getMarketingUrlForGeoLocation(geoLocation);\n const pathname = marketingSalesPathname[countryCode];\n\n return `${baseUrl}${pathname}`;\n },\n\n getFreeResourcesForGeoLocation(geoLocation: GeoLocation): string {\n const countryCode = LocalityHelper.getCountryCode(geoLocation?.countryCode);\n\n const baseUrl = this.getMarketingUrlForGeoLocation({ countryCode });\n const pathname = marketingFreeResourcesPathname[countryCode];\n\n return `${baseUrl}${pathname}`;\n },\n\n getTermsAndConditionsLink(): string {\n const baseUrl = this.getMarketingUrlForGeoLocation(CountryCode.US);\n return baseUrl + '/terms-and-conditions/';\n },\n\n getPrivacyPolicyLink(): string {\n const baseUrl = this.getMarketingUrlForGeoLocation(CountryCode.US);\n return baseUrl + '/privacy-policy/';\n },\n\n getSupportUrlForGeoLocation(geoLocation: GeoLocation): string {\n const countryCode = LocalityHelper.getCountryCode(geoLocation?.countryCode);\n const url = ExternalLink.Support[countryCode];\n\n if (!url)\n return ExternalLink.Support.us;\n\n return url;\n }\n};","import { AuK12JobTitles, AuTertiaryJobTitles, JobTitles, UkK12JobTitles, UkTertiaryJobTitles, UsK12JobTitles } from 'libs/shared/apps/sign-up/interfaces/JobTitles';\nimport { CountryCode } from 'libs/shared/enums/CountryCode';\nimport { InstanceRegion } from 'libs/shared/enums/InstanceRegion';\n\nconst AU_K12_JOB_TITLES: AuK12JobTitles[] = [\n 'Teacher',\n 'Librarian / Teacher Librarian',\n 'Curriculum Coordinator',\n 'Digital Technology Coordinator',\n 'SSO / SLSO',\n 'IT',\n 'Head of Department',\n 'Head of Subject',\n 'Assistant Principal',\n 'Deputy Principal',\n 'Principal'\n];\n\nconst UK_K12_JOB_TITLES: UkK12JobTitles[] = [\n 'Teacher',\n 'Librarian / Teacher Librarian',\n 'IT/LRC',\n 'e-Learning/ICT Coordinator',\n 'Head of Key Stage',\n 'Head of Department',\n 'Subject Lead',\n 'Assistant Head Teacher',\n 'Deputy Head Teacher',\n 'Head Teacher'\n];\n\nconst US_K12_JOB_TITLES: UsK12JobTitles[] = [\n 'Teacher',\n 'Librarian / Teacher Librarian',\n 'Head of Department',\n 'Instructional Technology Specialist',\n 'Curriculum Coordinator',\n 'School Leadership',\n 'District Leadership',\n 'Academic Coach',\n 'Principal',\n 'IT / IT Specialist'\n];\n\nconst AU_TERTIARY_JOB_TITLES: AuTertiaryJobTitles[] = [\n 'Professor',\n 'Lecturer',\n 'Course Coordinator / Administrator',\n 'Digital Learning Manager',\n 'Tutor',\n 'Teaching Fellow',\n 'Librarian',\n 'Learning Technologist',\n 'Teaching Assistant',\n 'Researcher',\n 'IT'\n];\n\nconst UK_TERTIARY_JOB_TITLES: UkTertiaryJobTitles[] = [\n 'Professor',\n 'Lecturer',\n 'Course Coordinator / Administrator',\n 'Digital Learning Manager',\n 'Tutor',\n 'Teaching Fellow',\n 'Librarian',\n 'Learning Technologist',\n 'Teacher',\n 'Teaching Assistant',\n 'Researcher',\n 'IT'\n];\n\nconst K12_JOB_TITLES: Record<string, JobTitles[]> = {\n [InstanceRegion.AU]: AU_K12_JOB_TITLES,\n [InstanceRegion.NZ]: AU_K12_JOB_TITLES,\n [InstanceRegion.UK]: UK_K12_JOB_TITLES,\n [InstanceRegion.US]: US_K12_JOB_TITLES,\n\n [CountryCode.AU]: AU_K12_JOB_TITLES,\n [CountryCode.NZ]: AU_K12_JOB_TITLES,\n [CountryCode.UK]: UK_K12_JOB_TITLES,\n [CountryCode.US]: US_K12_JOB_TITLES\n};\n\nconst TERTIARY_JOB_TITLES: Record<string, JobTitles[]> = {\n [InstanceRegion.AU]: AU_TERTIARY_JOB_TITLES,\n [InstanceRegion.UK]: UK_TERTIARY_JOB_TITLES,\n\n [CountryCode.AU]: AU_TERTIARY_JOB_TITLES,\n [CountryCode.UK]: UK_TERTIARY_JOB_TITLES\n};\n\ntype Options = {\n instanceRegion: InstanceRegion;\n isTertiary: boolean;\n} | {\n countryCode: CountryCode;\n isTertiary: boolean;\n};\n\nexport function getJobTitles(options: Options): JobTitles[] {\n const key = 'instanceRegion' in options ? options.instanceRegion : options.countryCode;\n\n if (options.isTertiary) {\n const titles = TERTIARY_JOB_TITLES[key?.toLowerCase()];\n\n if (!titles)\n return AU_TERTIARY_JOB_TITLES;\n\n return titles;\n }\n\n const titles = K12_JOB_TITLES[key?.toLowerCase()];\n\n /**\n * If we don't have a match, we're just going to fall back to US job titles\n */\n if (!titles)\n return US_K12_JOB_TITLES;\n\n return titles;\n}\n\nexport function isLearnerJobTitle(jobTitle: string): boolean {\n return jobTitle?.toLowerCase().includes('student') ||\n jobTitle?.toLowerCase().includes('parent');\n}","import React from 'react';\n\ninterface FormFeedbackProps extends React.PropsWithChildren {\n name: string;\n className?: string;\n}\n\nexport function FormFeedback(props: FormFeedbackProps) {\n return (\n <span id={`${props.name}Error`} className={`${props.className} invalid-feedback d-block`} role='status'>{props.children}</span>\n );\n}","import { Flight } from 'libs/common/react/index';\n\nimport { ProductId } from 'libs/shared/enums/ProductId';\n\nexport const AuthRequests = {\n globalIdps(countryCode: string, product: ProductId): Flight.Request {\n return {\n url: `{gateway}/v1/auth/identity-providers?countryCode=${countryCode}&product=${product}`,\n key: 'global:idps'\n };\n }\n};","import { useInstance } from 'libs/common/react/hooks/UseInstance';\n\nimport { ProfileApiClient } from 'libs/analytics/clients/ProfileApiClient';\nimport { Services } from 'libs/analytics/constants/Services';\n\nexport function useProfileApiClient() {\n const profileApiClient = useInstance<ProfileApiClient>(Services.ProfileApiClient);\n\n return {\n createOrUpdateProfile: profileApiClient.createOrUpdate\n };\n}","import { LocationUtils } from 'libs/common/backbone/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { GeoLocation } from 'libs/shared/interfaces/responses/GeoLocation';\n\nconst FALLBACK_COUNTRY: GeoLocation = {\n countryCode: 'us',\n isFallback: true\n};\n\nexport function useGeoLocation(): GeoLocation {\n const geoLocation = Flight.useBasicFetch<GeoLocation>(ConfigRequests.geoLocation());\n\n const countryCode = LocationUtils.GetQuery()?.countryCode?.toLowerCase();\n \n if (countryCode)\n return { countryCode };\n\n if (geoLocation.hasCompleted && !geoLocation.data)\n return FALLBACK_COUNTRY;\n\n return geoLocation.data;\n}","import { SignUpImageUrls } from 'libs/shared/apps/sign-up/interfaces/SignUpImageUrls';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nexport const SignUpImages: SignUpImageUrls = {\n popupDashboard: ImageUrls.SignUp.POPUP_DASHBOARD,\n educator: ImageUrls.SignUp.EDUCATOR,\n student: ImageUrls.SignUp.STUDENT,\n\n statusImages: {\n available: ImageUrls.SignUp.VERIFY_ACCOUNT,\n active: ImageUrls.SignUp.EXISTING_CUSTOMER,\n expired: ImageUrls.SignUp.EXPIRED_TRIAL,\n notRequired: ImageUrls.SignUp.EXISTING_CUSTOMER,\n unavailable: ImageUrls.SignUp.NOT_AVAILABLE,\n unsupported: ImageUrls.SignUp.NOT_AVAILABLE,\n autoJoin: ImageUrls.SignUp.EXISTING_CUSTOMER,\n requestAccess: ImageUrls.SignUp.EXISTING_CUSTOMER\n }\n};","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { SignUpProduct } from 'libs/shared/apps/sign-up/enums/SignUpProduct';\nimport { SignUpAjaxUrls } from 'libs/shared/apps/sign-up/interfaces/SignUpAjaxUrls';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { Config } from 'libs/shared/interfaces';\n\nexport function useGetSignUpAjaxUrls(): SignUpAjaxUrls {\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n if (!config.hasCompleted)\n return null;\n\n const gateway = config.data.gatewayApiUrl;\n\n return {\n productName: SignUpProduct.Lite,\n userStatus: UrlHelper.safeUrlConcat(gateway, '/v1/users/trial-status'),\n idps: '/api/user/trials/idps',\n prospectStatus: prospectId => UrlHelper.safeUrlConcat(gateway, `/v1/prospects/${prospectId}/trial-status`),\n createTrial: '/api/user/trials',\n resendTrialEmail: userId => `/api/user/trials/users/${userId}/send-activation-email`,\n searchProspect: UrlHelper.safeUrlConcat(gateway, '/v1/search/prospects'),\n createProspect: '/api/prospects',\n prospectLookups: prospectId => UrlHelper.safeUrlConcat(gateway, `/v1/prospects/${prospectId}/lookups`),\n autoJoin: '/api/user/trials/auto-join',\n joinRequest: customerId => `/api/user/customers/${customerId}/join-requests`,\n brazeCheckEmail: '/api/braze/check-email'\n };\n}","// extracted by mini-css-extract-plugin\nexport default {\"logo\":\"Kh4Dd\",\"modalBody\":\"V9nIN\",\"popupButton\":\"hS60U\",\"leftImage\":\"kDU8y\",\"leftHalfLayout\":\"aQ1K8\",\"withBg\":\"zALxE\"};"],"names":["CloseIcon","viewBox","d","ClearableInput","props","ref","onClickClear","showClearButton","clearClassName","inputProps","className","value","role","onClick","onKeyDown","e","key","tabIndex","ExistingAccountSignIn","href","link","IdpButton","idp","backgroundColour","foregroundColour","last","isGlobalIdp","lastButtonClassName","defaultStyle","backgroundColor","color","buttonClass","buttonStyle","buttonLabel","name","style","logoUrl","src","alt","GlobalIdps","idps","length","currentPathAndQuery","window","location","pathname","search","id","encodeURIComponent","attribution","map","p","i","signUpSplitName","fullName","firstName","surname","split","filter","x","surnames","join","TrialStatus","UserType","INVALID_STRING_REGEX","PHONE_REGEX","MAX_STRING_LENGTH","AddToBrazeForm","fullname","jobTitle","phone","data","setData","onSubmitForm","event","preventDefault","errorObject","test","setErrors","Object","keys","validate","handleSubmitForm","setDataForKey","removeErrorForKey","errors","onSubmit","htmlFor","onChange","target","type","placeholder","autoFocus","FormFeedback","trim","JobTitleInput","countryCode","LocalityHelper","country","error","size","labelClassName","isTertiary","submission","SpinnerButton","variant","showSpinner","loading","disabled","fastDeepEqual","equal","a","b","constructor","Array","isArray","RegExp","source","flags","valueOf","prototype","toString","hasOwnProperty","call","DEFAULT_ID","LoaderStatus","Loader","apiKey","authReferrerPolicy","channel","client","language","libraries","mapIds","nonce","region","retries","url","version","this","CALLBACK","callbacks","done","instance","options","Error","JSON","stringify","status","FAILURE","SUCCESS","LOADING","INITIALIZED","failed","createUrl","deleteScript","script","document","getElementById","remove","load","loadPromise","Promise","resolve","reject","loadCallback","err","google","fn","push","execute","setScript","callback","createElement","onerror","loadErrorCallback","bind","defer","async","head","appendChild","reset","onerrorEvent","resetIfRetryingFailed","delay","Math","pow","console","log","setTimeout","setCallback","__googleMapsCallback","forEach","cb","maps","warn","setupLoader","config","useGoogleApi","loaded","setLoaded","loader","setLoader","loaderCallback","onLoad","onError","scriptLoaded","onGoogleApiReady","useAutoCompleteService","googleApiKey","autoCompleteService","setAutocompleteService","places","AutocompleteService","STORAGE_KEY","useCountryPlaceholder","geoLocation","makeRequest","template","templateKey","supportedPlaceholder","LocalStorageHelper","getCachedPlaceholder","setPlaceholder","setCachedPlaceholder","request","input","String","fromCharCode","RandomHelper","types","componentRestrictions","getPlacePredictions","result","results","PlacesServiceStatus","OK","randomCity","description","replace","getRandomLocality","useDropdownEvents","selectedIndex","setSelectedIndex","containerRef","hideInitially","hide","setHide","scrollIntoView","current","children","block","hideOnEnter","code","stopPropagation","newIndex","itemCount","onSelected","onFocus","hideOnBlur","onBlur","PlaceHelper","city","province","postalCode","locality","formatted_address","address_components","component","short_name","ErrorPhraseMap","CrosshairIcon","LocalityPredicitions","predictions","getPlaceInfo","predicition","index","DivButton","place_id","onMouseDown","SearchLocalityInput","inputRef","schoolLocality","setLocality","makePredicition","setMakePredicition","countryPlaceholderText","googleMapsApiKey","debouncedSearch","localityPredicitions","setLocalityPredicitions","getLocalityPredictions","predicitions","undefined","isFallback","PlacesService","getDetails","placeId","fields","place","longitude","geometry","lng","latitude","lat","useLocalitySearch","details","setDetails","onPositionSuccess","position","coords","LatLng","Geocoder","geocode","GeocoderStatus","find","item","includes","onPositionError","errorMessagePhrase","placeDetails","onClickGetCurrentLocation","navigator","geolocation","getCurrentPosition","useGeocoder","setGeocoderError","extraItem","selected","handleGetPlaceInfo","handleOnClickGetCurrentLocation","geocoderError","onSetLocality","localityValue","clearData","placeData","schoolPostCode","logUserAction","actionType","descriptor","baseClass","isInputFocused","geoLocationEnabled","required","currentTarget","autoComplete","focus","useGeoLocationApi","ApiError","body","message","prepareRequest","init","method","HttpVerbs","headers","baseUrl","requestData","finalUrl","FetchHelper","asyncFetch","fetch","response","ok","json","asyncFetchPlain","text","then","success","reason","always","ProspectStatus","ProspectRequests","query","create","urls","createProspect","getLookups","prospectId","prospectLookups","UserRequests","productName","SignUpProduct","email","userStatus","userType","appLink","createTrial","userId","resendTrialEmail","AU_SCHOOL_TYPES","US_SCHOOL_TYPES","SCHOOL_TYPES","au","nz","uk","us","getClassName","Completed","StatusImage","StatusImageMap","Available","imageUrls","statusImages","available","Active","active","Expired","expired","NotRequired","notRequired","Unavailable","unavailable","Unsupported","unsupported","UserAutoJoinAllowed","UserJoinApprovalRequired","InvalidEmail","BdmTrialAvailable","trialStatus","ExistingCustomer","isLastStepFindSchool","previousStepIds","schoolName","getSignInUrl","customerId","ExternalLinkHelper","StatusMessageMap","resendEmailCount","setResendEmailCount","hasResendError","setHasResendError","ajaxUrls","pageAppLinkString","nextStep","step","Staff","salesContactLink","StatusMessage","Message","YOUNG_STUDENT_STORAGE_KEY","CompletedStepMap","analyticsOptions","workflowPhase","trialCreated","getDateString","year","month","day","padStart","emailRegex","EMAIL_PLACEHOLDERS","CountryCode","C","marketingContactTechnicalPathname","getPlaceholderText","completionStatuses","getJoinRequestError","SchoolSuggestions","filteredSchoolsList","getSchoolName","onSchoolSuggestionClick","displayItems","toLowerCase","c","charAt","toUpperCase","slice","postCode","getDisplayLocation","CantFindSchool","handleNoSuggestion","SearchSchoolInput","setLoading","setName","schoolsList","setSchoolsList","debouncedName","onClickNoSuggestions","schoolSelected","isLoading","showCantFindSchool","showSuggestions","onSetSchoolName","schoolNameValue","fetchSchools","searchUrl","schoolType","prospectType","showSuggestionsContainer","inputClassName","Spinner","animation","Suggestions","items","getName","onItemClick","SearchableSelect","suggestionList","setSuggestionList","onSuggestionClick","onCantFind","cantFindText","itemSelected","searchItems","suggestions","onSelect","BACKGROUND_COLORS","UserTypeOption","imageSrc","buttonText","stepsMapping","selectAndNextStep","educator","Learner","student","baseLink","setEmail","setError","contactLink","userEmail","complete","completionStep","userTrialStatus","onFormSubmit","noValidate","autoCorrect","globalIdps","getLiteAttributionForAuth","prospectStatus","setProspectStatus","submissionError","setSubmissionError","disableLocality","setDisableLocality","disableSchoolSearch","setDisableSchoolSearch","requestTrial","canSubmitForm","logStepEvent","setLoadingState","setProperty","logBrazeEvent","createOrUpdateProfile","autoJoinLite","autoJoin","lookups","ProspectLookup","externalId","brazeFormSubmissionEvent","brazeUser","custom","accountName","accountAddress","BrazeHelper","orgSubType","syncToCrm","accountCountry","accountPostCode","accountState","additionalData","form_type","prospect_id","user","eventType","ProductFormEvent","AttributionHelper","utms","UtmHelper","masterId","getRequestTrial","fetchUrl","clearSchoolStepItemData","localityData","schoolData","searchProspect","schoolTypes","canCreateSchool","Draft","prospectResponse","trialRequest","trialResponse","completionData","flushSuccess","Step","postSubmission","onComplete","lastName","eventTopic","addToBraze","setDay","setMonth","setYear","currentYear","Date","getFullYear","containerClassName","dayOrder","monthOrder","isUs","date","isNaN","isDateValid","dateOfBith","cutOffYear","cutOff","setFullYear","min","max","joinRequest","getInstanceRegion","instanceRegion","brazeCheckEmail","checkEmail","users","provider","setProvider","redirect","selectedProvider","ActiveStep","state","layout","hasPreviousStep","back","CurrentStep","currentStepId","stepProps","Layout","currentStep","previousStep","closeApp","close","flattenObject","objects","flattened","ObjectHelper","assign","DebuggerItem","label","content","FormDebugger","developmentEnv","show","setShow","flatObject","getClass","colorClass","DotCrumbs","crumbs","TermsAndConditions","termsAndConditionsLink","privacyPolicyLink","ExternalLink","onClickTermsAndConditions","newTab","onClickPrivacyPolicy","MultiStepBackButton","SvgContainer","svgName","S","BACK_BUTTON_STEPS","TNC_STEPS","NARROW_STEPS","WIDE_STEPS","SHOW_SIGN_IN_STEPS","FullPageLayout","defaultProps","showBackButton","crumbsSteps","ClickViewLogo","PopupLayout","halfLayoutSteps","crumbStep","shouldShowBackButton","onClickBackButtons","hasLeftHalfBg","layoutClass","popupDashboard","LayoutMappings","MultiStepFormTypes","LayoutHelper","getLayouts","nextStepReducer","action","obj","newState","stepData","entries","reduce","acc","k","v","signUpReducer","updatedPreviousSteps","lastStepId","pop","backReducer","useSignUpSteps","initialValues","onStepUpdate","externalLogUserAction","initialState","dispatch","combinedData","dataWithoutPII","DataHelper","enrichedData","filteredEnrichedData","entity","MultiStepForm","AnalyticsHelper","OTHER_VALUE","getInitialSelection","initialValue","jobTitles","initialSelection","selection","setSelection","other","setOther","showOther","title","ProspectLookupType","SCHOOL_TYPE_MAP","PROVINCE_ISO_MAP","hashedEmail","normalizedEmail","removeEmptyKeys","object","payload","EVENT_TOPIC","BDM_EVENT_TOPIC","SOURCE","BDM_SOURCE","getSchoolType","isTertiarySchool","parseProvince","BLACKLISTED_KEYS","filterBlacklistedKeys","newObj","prop","Marketing","Support","marketingSalesPathname","marketingFreeResourcesPathname","getMarketingUrlForGeoLocation","getMarketingSalesContactForGeoLocation","getFreeResourcesForGeoLocation","getTermsAndConditionsLink","getPrivacyPolicyLink","getSupportUrlForGeoLocation","AU_K12_JOB_TITLES","UK_K12_JOB_TITLES","US_K12_JOB_TITLES","AU_TERTIARY_JOB_TITLES","UK_TERTIARY_JOB_TITLES","K12_JOB_TITLES","TERTIARY_JOB_TITLES","getJobTitles","isLearnerJobTitle","AuthRequests","product","useProfileApiClient","createOrUpdate","FALLBACK_COUNTRY","useGeoLocation","hasCompleted","SignUpImages","requestAccess","useGetSignUpAjaxUrls","gateway","gatewayApiUrl"],"sourceRoot":""}
|