{"version":3,"file":"js/1283.2b1da3ec5b97efedf876.chunk.js","mappings":"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","sources":["webpack://ti_west/./app/components/purchase-form/index.tsx","webpack://ti_west/./app/components/purchase-form/purchase-tab-exam.tsx","webpack://ti_west/./app/components/purchase-form/purchase-tab-exam.util.ts","webpack://ti_west/./app/components/purchase-form/purchase-tab-material.tsx","webpack://ti_west/./app/components/purchase-form/testing-location-form.tsx","webpack://ti_west/./app/utility/initialize-purchase-form.ts","webpack://ti_west/./app/utility/sort.ts"],"sourcesContent":["import classNames from 'classnames';\nimport * as React from 'react';\nimport { connect } from 'react-redux';\n\nimport { Course } from '@app/interfaces/store/content/program-rule';\nimport { Store } from '@app/interfaces/store/store';\nimport { mapDispatchToProps } from '@app/store/map-dispatch-to-props';\n\nimport { PURCHASE_TAB_STRINGS, TabIdType } from './purchase-form.constants';\nimport { PurchaseOptions } from './purchase-form.types';\nimport {\n\tformUtil,\n\tgetMinMaxPriceFromOptions,\n\tgetPriceRange,\n\tgetPurchaseOptions,\n\tlocalStorageUtil,\n\ttabUtil,\n} from './purchase-form.util';\nimport { PurchaseTabExam } from './purchase-tab-exam';\nimport { PurchaseTabMaterial } from './purchase-tab-material';\nimport { PropsBaseButton } from '../button';\n\ntype PropPurchaseForm = {\n\tactions: any;\n\tclassName?: string;\n\tcourse: Course;\n\tgroupName?: string;\n\tsingleTab?: TabIdType;\n\tstore: Store;\n\ttoggleButtonElement?: React.FC;\n\ttoggleClassNames?: string;\n\ttoggleText?: string;\n};\n\nconst { MATERIAL_TAB, EXAM_TAB } = PURCHASE_TAB_STRINGS;\n\n/**\n * Purchase form is the main purchasing experience for TI products. The form is\n * split into two tabs: Materials & Exams. If singleTab is defined, then the\n * form will only render the specified singleTab.\n *\n * Both tabs present users exam windows options, before selecting the respective\n * products.\n *\n * If a toggleButtonElement is defined, then the form is visible only after the\n * user clicks the toggle button element.\n *\n * @param {Course} props.course Required. Course object.\n * @param {string} props.className Optional. Purchase form class name.\n * @param {TabIdType=} props.singleTab Optional. Will only render specific tab.\n * @param {string=} props.groupName Optional. Will add string to component key.\n * @param {React.FC} props.toggleButtonElement Optional. Form will be visible once a button is pressed.\n * @param {string} props.toggleText Optional. Overrides any default toggle button label.\n * @param {string} props.toggleClassName Optional. Classname for toggle button.\n * @return {React.ReactElement} Purchase Form component.\n */\nconst PurchaseFormRaw: React.FC = ({\n\tactions,\n\tclassName = '',\n\tcourse,\n\tgroupName = '',\n\tsingleTab,\n\tstore,\n\ttoggleButtonElement,\n\ttoggleClassNames = '',\n\ttoggleText,\n}: PropPurchaseForm): React.ReactElement => {\n\tconst {\n\t\tabbreviation,\n\t\tcode,\n\t\texamWindows,\n\t\tid,\n\t\tnote,\n\t\tmaterialsNote,\n\t} = course;\n\n\tconst { programRule, marketing } = store.content;\n\n\t// State for form is visible or behind a button toggle.\n\tconst [isVisible, setIsVisible] = React.useState(\n\t\ttoggleButtonElement === undefined,\n\t);\n\n\t// State for current active tab.\n\tconst [activeTab, setActiveTab] = React.useState(\n\t\tsingleTab || MATERIAL_TAB.id,\n\t);\n\n\t// State for select options for both tabs.\n\tconst [purchaseOptions, setPurchaseOptions] = React.useState(\n\t\t{ examOptions: [], materialOptions: [] },\n\t);\n\n\tconst { materialOptions, examOptions } = purchaseOptions;\n\n\t// State for form dimensions.\n\t// Form dimensions change to support any card overlay.\n\tconst [{ materialHeight, examHeight, height }, setFormDimensions] =\n\t\tReact.useState<{\n\t\t\tmaterialHeight?: string;\n\t\t\texamHeight?: string;\n\t\t\theight?: string;\n\t\t}>({\n\t\t\tmaterialHeight: 'auto',\n\t\t\texamHeight: 'auto',\n\t\t\theight: 'auto',\n\t\t});\n\n\t// Refs for tab buttons.\n\tconst materialRef = React.useRef(null);\n\tconst examRef = React.useRef(null);\n\n\t// Hide exam windows for WCCA.\n\tconst hasNoExamWindows =\n\t\tabbreviation !== undefined && /^WCCA/.test(abbreviation);\n\n\t/**\n\t * Print price range based on tab id.\n\t *\n\t * @param {TabIdType} tabId Tab ID.\n\t * @return {JSX.Element} Price Range element.\n\t */\n\tconst printPriceRange = React.useCallback(\n\t\t(tabId: TabIdType): JSX.Element | null => {\n\t\t\tlet maxPrice;\n\t\t\tlet minPrice;\n\n\t\t\tif (tabId === MATERIAL_TAB.id) {\n\t\t\t\tconst matOptions = materialOptions?.flatMap((mat) => mat.options) || [];\n\t\t\t\t[minPrice, maxPrice] = getMinMaxPriceFromOptions(matOptions);\n\t\t\t}\n\n\t\t\tif (tabId === EXAM_TAB.id) {\n\t\t\t\tconst exOptions = examOptions?.flatMap(({ options }) => [\n\t\t\t\t\t...options.INTERNET,\n\t\t\t\t\t...options.VIRTUAL,\n\t\t\t\t]) || [];\n\t\t\t\t[minPrice, maxPrice] = getMinMaxPriceFromOptions(exOptions);\n\t\t\t}\n\n\t\t\tconst priceRange = getPriceRange(minPrice, maxPrice);\n\n\t\t\treturn priceRange ? (\n\t\t\t\t<>\n\t\t\t\t\t
\n\t\t\t\t\t{priceRange}\n\t\t\t\t\n\t\t\t) : null;\n\t\t},\n\t\t[materialOptions, examOptions],\n\t);\n\n\t/**\n\t * Callback to set active tab and set active tab height.\n\t *\n\t * @param {TabIdType} tab Tab ID.\n\t */\n\tconst changeTab = React.useCallback(\n\t\t(tab: TabIdType) => {\n\t\t\tsetActiveTab(tab);\n\t\t\tsetFormDimensions({\n\t\t\t\theight: tab === MATERIAL_TAB.id ? materialHeight : examHeight,\n\t\t\t});\n\n\t\t\tif (tab === MATERIAL_TAB.id && materialRef?.current) {\n\t\t\t\tmaterialRef.current.focus();\n\t\t\t}\n\t\t\tif (tab === EXAM_TAB.id && examRef?.current) {\n\t\t\t\texamRef.current.focus();\n\t\t\t}\n\t\t},\n\t\t[examHeight, materialHeight, setActiveTab, setFormDimensions],\n\t);\n\n\t/**\n\t * Callback to set container height for tab type.\n\t *\n\t * @param {string} value Value for CSS height attribute.\n\t * @param {TabIdType} TabId Tab ID.\n\t */\n\tconst setContainerHeight = React.useCallback(\n\t\t(value: string, tabId: TabIdType) => {\n\t\t\tif (value && tabId && [MATERIAL_TAB.id, EXAM_TAB.id].includes(tabId)) {\n\t\t\t\tif (tabId === MATERIAL_TAB.id) {\n\t\t\t\t\tsetFormDimensions({\n\t\t\t\t\t\tmaterialHeight: value,\n\t\t\t\t\t\theight: value,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tsetFormDimensions({ examHeight: value, height: value });\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[setFormDimensions],\n\t);\n\n\t/**\n\t * Handles arrow key navigation for tabs.\n\t *\n\t * @param {React.KeyboardEvent} event Keyboard event.\n\t * @listens document#keydown\n\t */\n\tconst handleKeyDown = (event: React.KeyboardEvent) => {\n\t\tif (activeTab === MATERIAL_TAB.id && event.key === 'ArrowRight') {\n\t\t\tchangeTab(EXAM_TAB.id);\n\t\t} else if (activeTab === EXAM_TAB.id && event.key === 'ArrowLeft') {\n\t\t\tchangeTab(MATERIAL_TAB.id);\n\t\t}\n\t};\n\n\t/**\n\t * Checks if option is defined and not empty.\n\t *\n\t * @param options Options to validate.\n\t * @returns {boolean}\n\t */\n\tfunction isOptionValid(options?: T[]): boolean {\n\t\treturn options !== undefined && options.length > 0;\n\t}\n\n\t// Use effect to set up local storage state.\n\tReact.useEffect(() => {\n\t\tlocalStorageUtil.loadTab(changeTab, code);\n\t}, [changeTab, code]);\n\n\t// Use effect to determine which purchase options to render.\n\tReact.useEffect(() => {\n\t\tconst options = getPurchaseOptions(examWindows, programRule, marketing);\n\t\tconst { examOptions: examOpts, materialOptions: matOptions } = options;\n\n\t\t// Capture if options are exclusively valid for a single tab.\n\t\tconst onlyExamOptions =\n\t\t\tisOptionValid(examOpts) && !isOptionValid(matOptions);\n\t\tconst onlyMaterialOptions =\n\t\t\tisOptionValid(matOptions) && !isOptionValid(examOpts);\n\n\t\tif (singleTab === EXAM_TAB.id || (!singleTab && onlyExamOptions)) {\n\t\t\tsetActiveTab(EXAM_TAB.id);\n\t\t\treturn setPurchaseOptions({ examOptions: examOpts });\n\t\t}\n\n\t\tif (singleTab === MATERIAL_TAB.id || (!singleTab && onlyMaterialOptions)) {\n\t\t\tsetActiveTab(MATERIAL_TAB.id);\n\t\t\treturn setPurchaseOptions({ materialOptions: matOptions });\n\t\t}\n\n\t\treturn setPurchaseOptions(options);\n\t}, [\n\t\texamWindows,\n\t\tmarketing,\n\t\tprogramRule,\n\t\tsetPurchaseOptions,\n\t\tsetActiveTab,\n\t\tsingleTab,\n\t]);\n\n\t// Show material tab is material options exist.\n\tconst showMaterialTab = isOptionValid(materialOptions);\n\n\t// Show exam tab if exam options exist.\n\tconst showExamTab = isOptionValid(examOptions);\n\n\t// Show tab buttons if both purchase options exist.\n\tconst showTabButtons = showMaterialTab && showExamTab;\n\n\t// Show as single tab if purchase options are limited to one.\n\tconst isSingleTab =\n\t\t(showMaterialTab && !showExamTab) || (!showMaterialTab && showExamTab);\n\n\t// Has no valid options.\n\tconst hasNoOptions = !showExamTab && !showMaterialTab;\n\n\t// If no materials or exam options exist for a singleTab purchase option, then\n\t// do not display purchase form.\n\tif (hasNoOptions) {\n\t\treturn <>;\n\t}\n\n\t// If purchase form is not visible due to a toggle button element, then\n\t// render toggle button element first.\n\tif (!isVisible && toggleButtonElement !== undefined) {\n\t\tconst ButtonElement = toggleButtonElement;\n\t\tconst label = (() => {\n\t\t\tif (toggleText) {\n\t\t\t\treturn toggleText;\n\t\t\t}\n\n\t\t\t// Default texts based on singleTab.\n\t\t\tswitch (singleTab) {\n\t\t\t\tcase EXAM_TAB.id:\n\t\t\t\t\treturn 'Purchase Exam';\n\t\t\t\tcase MATERIAL_TAB.id:\n\t\t\t\t\treturn 'Purchase Materials';\n\t\t\t\tdefault:\n\t\t\t\tcase undefined:\n\t\t\t\t\treturn 'Purchase Materials & Exam';\n\t\t\t}\n\t\t})();\n\n\t\treturn (\n\t\t\t setIsVisible(true)}\n\t\t\t\tclassName={toggleClassNames}\n\t\t\t>\n\t\t\t\t{label}\n\t\t\t\n\t\t);\n\t}\n\n\treturn (\n\t\t\n\t\t\t{showTabButtons && (\n\t\t\t\t\n\t\t\t\t\t{[MATERIAL_TAB.id, EXAM_TAB.id].map((tabId) => (\n\t\t\t\t\t\t changeTab(tabId)}\n\t\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\t\tref={tabId === MATERIAL_TAB.id ? materialRef : examRef}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{PURCHASE_TAB_STRINGS[tabId].title}\n\t\t\t\t\t\t\t{printPriceRange(tabId)}\n\t\t\t\t\t\t\n\t\t\t\t\t))}\n\t\t\t\t\n\t\t\t)}\n\t\t\t{showMaterialTab && (\n\t\t\t\t changeTab(EXAM_TAB.id)}\n\t\t\t\t\tsetContainerHeight={setContainerHeight}\n\t\t\t\t\tstore={store}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{showExamTab && (\n\t\t\t\t changeTab(MATERIAL_TAB.id)}\n\t\t\t\t\tsetContainerHeight={setContainerHeight}\n\t\t\t\t\tstore={store}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\n\t);\n};\n\nexport const PurchaseForm = connect(\n\t(store: Store) => ({ store }),\n\tmapDispatchToProps,\n)(PurchaseFormRaw);\n","import classNames from 'classnames';\nimport { DateTime } from 'luxon';\nimport * as React from 'react';\nimport {\n\tgetFormValues,\n\tInjectedFormProps,\n\treduxForm,\n\tSubmissionError,\n} from 'redux-form';\n\nimport { TestingLocation } from '@aicpcu/web-api-spec-model';\n\nimport { AddCartButton } from '@app/components/add-cart-button';\nimport { PrimaryButton } from '@app/components/button';\nimport { PurchaseExamOverlay } from '@app/components/card-tab-overlay';\nimport { FormContainer, Select } from '@app/components/forms';\nimport {\n\texamTestingLocationRequired,\n\texamWindowRequired,\n} from '@app/components/forms/validations.constants';\nimport { Loader } from '@app/components/loader';\nimport { Notification } from '@app/components/notification';\nimport { DOMESTIC_COUNTRY_VALUE } from '@app/constants/address';\nimport { FormValues } from '@app/interfaces/form';\nimport { Store } from '@app/interfaces/store/store';\nimport { webApi } from '@app/services/web-api';\nimport { gtmAddToCart } from '@app/utility/gtm';\n\nimport {\n\tPURCHASE_TAB_STRINGS,\n\tTabIdType,\n\tTestingLocations,\n} from './purchase-form.constants';\nimport {\n\tExamData,\n\tExamDataOption,\n\tExamDataStateKey,\n\tExamExamWindowOptions,\n\tGroupedExamOptions,\n\tPropExamRadioGroup,\n} from './purchase-form.types';\nimport {\n\tformUtil,\n\tlocalStorageUtil,\n\tredirectToLogin,\n\ttabUtil,\n} from './purchase-form.util';\nimport {\n\tgetCountryOptions,\n\tgetLabel,\n\tgetProgramOptions,\n\tgetStateOptions,\n\tgetTestingCenterOptions,\n\tgetTestingLocationNote,\n} from './purchase-tab-exam.util';\nimport {\n\tTestingLocationForm,\n\tTestingLocationFormComponent,\n} from './testing-location-form';\n\ntype PropPurchaseTabExam = {\n\tactions: any;\n\tcourseCode: string;\n\tdescription: string;\n\texamWindowOptions?: ExamExamWindowOptions[];\n\thasNoExamWindows?: boolean;\n\thidden: boolean;\n\tid: number;\n\tisSingleTab: boolean;\n\tnote?: string;\n\tonSelect: () => void;\n\tsetContainerHeight: (value: string, tabId: TabIdType) => void;\n\tstore: Store;\n};\n\nconst { EXAM_TAB } = PURCHASE_TAB_STRINGS;\n\n/**\n * Login button. Sets local storage for a scroll journey after login redirect.\n *\n * @returns {React.ReactElement} Login button component.\n */\nconst LoginButton = ({\n\tcourseCode,\n\tloginUrl,\n}: {\n\tcourseCode: string;\n\tloginUrl: string;\n}): React.ReactElement => {\n\tconst onLogin = () => {\n\t\tlocalStorageUtil.saveTab(EXAM_TAB.id, courseCode);\n\t\tredirectToLogin(loginUrl, `course-code-${courseCode}`);\n\t};\n\treturn onLogin()}>Login;\n};\n\n/**\n * Get exam type options by active exam window.\n *\n * @param {GroupedExamOptions} options Exam window options.\n *\n * @returns {Object} Selected exam options grouped by type.\n */\nconst splitExamOptions = (\n\toptions?: GroupedExamOptions,\n): PropExamRadioGroup => ({\n\tPROMETRIC: {\n\t\tlabel: 'Prometric',\n\t\tvalue: 'PROMETRIC',\n\t\toptions: options?.PROMETRIC || [],\n\t},\n\tONSITE: {\n\t\tlabel: 'On-site',\n\t\tvalue: 'ONSITE',\n\t\toptions: options?.INTERNET || [],\n\t},\n\tVIRTUAL: {\n\t\tlabel: 'Virtual',\n\t\tvalue: 'VIRTUAL',\n\t\toptions: options?.VIRTUAL || [],\n\t},\n});\n\n/**\n * Purchase Exam Form is Redux Form.\n *\n * Depending on an exam window selection, a radio group of exam location types\n * will be available. Upon successful form submission, an overlay is presented.\n *\n * Any parameter with \"Redux or Redux Form\" descriptor is connected and\n * composed.\n *\n * @param {object} actions Redux Actions.\n * @param {number} courseCode Parent course's code.\n * @param {object} examWindowOptions Exam window options for select option.\n * @param {boolean} hasNoExamWindows Has no exam windows. Defaults to first window.\n * @callback handleSubmit Redux form handleSubmit callback.\n * @callback onSelect Handle overlay tab selection.\n * @callback reset Redux form reset function.\n *\n * @returns {React.Element} Purchase exam form component.\n */\nconst PurchaseTabExamRaw: React.FC<\n\tInjectedFormProps<{}, PropPurchaseTabExam> & PropPurchaseTabExam\n> = ({\n\tactions: { setApiError, addToCart, addExamToCart, getCart },\n\tcourseCode,\n\tdescription,\n\texamWindowOptions,\n\thasNoExamWindows = false,\n\thidden,\n\tid,\n\tisSingleTab,\n\tonSelect,\n\tsetContainerHeight,\n\tstore,\n\tnote = '',\n\t...reduxFormProps\n}: InjectedFormProps<{}, PropPurchaseTabExam> & PropPurchaseTabExam) => {\n\tconst {\n\t\tchange,\n\t\tform,\n\t\thandleSubmit,\n\t\treset,\n\t\tsubmitFailed,\n\t\tsubmitSucceeded,\n\t\tsubmitting,\n\t\tvalid,\n\t} = reduxFormProps;\n\n\tconst panelId = tabUtil.setPanelId(EXAM_TAB.id, id);\n\n\t// Fetch form values.\n\tconst formValues: FormValues = getFormValues(form)(store);\n\n\tconst fieldNames = Object.freeze(formUtil.createExamFields(id));\n\tconst {\n\t\tEXAMWINDOW_FIELDNAME,\n\t\tTESTING_LOCATION_FIELDNAME,\n\t\tTESTING_LOCATION_FIELDS,\n\t} = fieldNames;\n\n\t// Form value for: Exam Window.\n\tconst selectedExamWindow = formUtil.selectValue(\n\t\tformValues,\n\t\tEXAMWINDOW_FIELDNAME,\n\t);\n\n\t// Form value for: Testing Location.\n\tconst selectedTestingLocation = formUtil.selectValue(\n\t\tformValues,\n\t\tTESTING_LOCATION_FIELDNAME,\n\t);\n\n\t// Form value for: Exam.\n\tconst selectedExam = TestingLocations.guard(selectedTestingLocation)\n\t\t? formUtil.selectValue(\n\t\t\t\tformValues,\n\t\t\t\tTESTING_LOCATION_FIELDS[selectedTestingLocation].EXAM_FIELDNAME,\n\t\t )\n\t\t: '';\n\n\t// Determine exam options if a window is selected.\n\tconst { options } =\n\t\texamWindowOptions?.find(({ value }) => value === selectedExamWindow) || {};\n\tconst examOptions = splitExamOptions(options);\n\n\t// Find and deconstruct the selected exam option, if an exam option is selected.\n\tconst selectedExamOption = TestingLocations.guard(selectedTestingLocation)\n\t\t? examOptions[selectedTestingLocation].options.find(\n\t\t\t\t({ value }) => value === selectedExam,\n\t\t )\n\t\t: undefined;\n\n\tconst {\n\t\tsalePrice,\n\t\tlabel: selectedTitle = '',\n\t\texamDate = '',\n\t\tcurrentPrice,\n\t\texamWindowStartDate,\n\t} = selectedExamOption || { salePrice: 0, currentPrice: 0 };\n\n\tconst examStartDate = examWindowStartDate\n\t\t? DateTime.fromFormat(examWindowStartDate, 'yyyy-MM-dd')\n\t\t: undefined;\n\n\tconst shouldApplySalePrice = examStartDate\n\t\t? DateTime.now().toMillis() < examStartDate.toMillis()\n\t\t: false;\n\n\tconst priceToDisplay = shouldApplySalePrice ? salePrice : currentPrice;\n\n\t// Determine if there are matching items and exam windows in cart.\n\tconst hasMatchingCartItem = store.cart.cartItems.some(\n\t\t({ courseCode: cartCourseCode = '', inventoryClass = '' }) =>\n\t\t\t(inventoryClass === 'PK' && cartCourseCode === courseCode) ||\n\t\t\t(inventoryClass === 'SV' && !cartCourseCode),\n\t);\n\n\tconst hasMatchingExamWindow = (() => {\n\t\tconst matchingMaterial = store.cart.cartItems.find(\n\t\t\t({ courseCode: cartCourseCode = '', inventoryClass = '' }) =>\n\t\t\t\tinventoryClass === 'PK' && cartCourseCode === courseCode,\n\t\t);\n\n\t\tconst { targetSeries = '' } = matchingMaterial || {};\n\t\treturn (\n\t\t\tmatchingMaterial &&\n\t\t\tselectedExamWindow &&\n\t\t\ttargetSeries !== selectedExamWindow\n\t\t);\n\t})();\n\n\t// State for submit error.\n\tconst [submitError, setSubmitError] = React.useState();\n\n\tconst [storedTitle, setStoredTitle] = React.useState('');\n\n\tconst [labels, setLabels] = React.useState({\n\t\texamWindow: '',\n\t\tlocationType: '',\n\t\texam: '',\n\t\tprogram: '',\n\t\tcountry: '',\n\t\tstate: '',\n\t\tcenter: '',\n\t});\n\n\tconst [locationOptions, setLocationOptions] = React.useState<\n\t\treadonly TestingLocation[]\n\t>([]);\n\n\tconst initialExamDatum = { options: [], loading: false };\n\tconst initialExamData = {\n\t\tcenters: initialExamDatum,\n\t\tcountries: initialExamDatum,\n\t\tprograms: initialExamDatum,\n\t\tstates: initialExamDatum,\n\t};\n\n\tconst [examData, setExamData] = React.useState(initialExamData);\n\tconst { centers, countries, programs, states } = examData;\n\n\tconst showTestingLocationForm = Object.values(examOptions).some(\n\t\t({ options: opt }) => opt.length,\n\t);\n\n\t/**\n\t * Resets Redux form fields defined by an array of fieldnames.\n\t *\n\t * @param {string[]} fields Redux form field names to reset.\n\t */\n\tconst resetFields = (...fields: (string | undefined)[]) =>\n\t\tfields.forEach((name) => name !== undefined && change(name, ''));\n\n\t/**\n\t * Reset exam data to initial state for keys provided.\n\t *\n\t * If examDataKeys is empty, then reset the whole ExamData state.\n\t *\n\t * @param {ExamDataStateKey[]} examDataKeys Names of exam data keys to clear.\n\t */\n\tconst resetExamData = (...examDataKeys: ExamDataStateKey[]) =>\n\t\texamDataKeys.length > 0\n\t\t\t? setExamData({\n\t\t\t\t\t...examData,\n\t\t\t\t\t...examDataKeys.reduce(\n\t\t\t\t\t\t(clearedExamData: Partial, name) => ({\n\t\t\t\t\t\t\t...clearedExamData,\n\t\t\t\t\t\t\t[name]: initialExamDatum,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t{},\n\t\t\t\t\t),\n\t\t\t })\n\t\t\t: setExamData(initialExamData);\n\n\tconst setInitialExamWindow = React.useCallback(() => {\n\t\tif (examWindowOptions?.length) {\n\t\t\tchange(EXAMWINDOW_FIELDNAME, examWindowOptions[0].value);\n\t\t}\n\t}, [change, EXAMWINDOW_FIELDNAME, examWindowOptions]);\n\n\t/**\n\t * Completely reset the Redux Form and its calculated options.\n\t */\n\tconst resetForm = () => {\n\t\tresetExamData();\n\t\treset();\n\n\t\tif (hasNoExamWindows) {\n\t\t\tsetInitialExamWindow();\n\t\t}\n\t};\n\n\tconst changeExamData = React.useCallback(\n\t\t(\n\t\t\tkey: ExamDataStateKey,\n\t\t\tloading?: boolean,\n\t\t\texamDataOptions?: ExamDataOption[],\n\t\t\tshow?: boolean,\n\t\t\texamDataNote?: string,\n\t\t) => {\n\t\t\tsetExamData({\n\t\t\t\t...examData,\n\t\t\t\t[key]: {\n\t\t\t\t\toptions:\n\t\t\t\t\t\texamDataOptions === undefined\n\t\t\t\t\t\t\t? examData[key].options\n\t\t\t\t\t\t\t: examDataOptions,\n\t\t\t\t\tloading: loading === undefined ? examData[key].loading : loading,\n\t\t\t\t\tshow: show === undefined ? examData[key].show : show,\n\t\t\t\t\tnote: examDataNote === undefined ? examData[key].note : examDataNote,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\t[examData],\n\t);\n\n\t/**\n\t * Sets program state based on Course Code.\n\t */\n\tconst setProgramOptions = React.useCallback(async () => {\n\t\tchangeExamData('programs', true);\n\t\tconst programOptions = await getProgramOptions(courseCode, setApiError);\n\t\tchangeExamData('programs', false, programOptions);\n\t}, [changeExamData, courseCode, setApiError]);\n\n\t/**\n\t * Sets testing location and country options based on exam's ID.\n\t *\n\t * @param {string} examId Selected exam's ID.\n\t */\n\tconst setCountryOptions = async (examId: string) => {\n\t\tchangeExamData('countries', true);\n\t\ttry {\n\t\t\tconst testingLocationData =\n\t\t\t\tawait webApi.getTestingLocationsByContactAndLicense(Number(examId));\n\t\t\tsetLocationOptions(testingLocationData);\n\t\t\tchangeExamData(\n\t\t\t\t'countries',\n\t\t\t\tfalse,\n\t\t\t\tgetCountryOptions(testingLocationData),\n\t\t\t);\n\t\t} catch (e) {\n\t\t\tsetApiError(e);\n\t\t}\n\t};\n\n\t/**\n\t * Sets state options based on location options.\n\t */\n\tconst setStateOptions = async () => {\n\t\tchangeExamData('states', true, [], true);\n\t\tconst statesOptions = await getStateOptions(locationOptions, setApiError);\n\t\tchangeExamData('states', false, statesOptions, true);\n\t};\n\n\t/**\n\t * Sets center options based on country and optional US state.\n\t *\n\t * @param {string} country Country code value.\n\t * @param {string=} usSate US State code value.\n\t */\n\tconst setCenterOptions = (country: string, usSate?: string) =>\n\t\tchangeExamData(\n\t\t\t'centers',\n\t\t\tfalse,\n\t\t\tgetTestingCenterOptions(locationOptions, country, usSate),\n\t\t);\n\n\t/**\n\t * Set center note based on siteId selection.\n\t *\n\t * @param {string} siteId Site ID of testing center location.\n\t */\n\tconst setCenterNote = (siteId: string) =>\n\t\tchangeExamData(\n\t\t\t'centers',\n\t\t\tfalse,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tgetTestingLocationNote(centers.options, siteId),\n\t\t);\n\n\t/**\n\t * Event handler to automate exam selection if exam has only one option.\n\t *\n\t * @event\n\t */\n\tconst setExamSelection: React.ChangeEventHandler = (\n\t\tevent,\n\t) => {\n\t\tconst { value } = event.target;\n\t\tif (!TestingLocations.guard(value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst examOption = examOptions[value];\n\t\tconst testingLocation = TESTING_LOCATION_FIELDS[value];\n\n\t\tif (examOption.options?.length === 1) {\n\t\t\tconst examId = examOption.options[0].value;\n\t\t\tchange(testingLocation.EXAM_FIELDNAME, examId);\n\n\t\t\tif (value === 'ONSITE' && !countries.options.length) {\n\t\t\t\tsetCountryOptions(examId);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Event handler for Redux form item onChange.\n\t *\n\t * @event\n\t */\n\tconst handleOnChange: React.ChangeEventHandler = (\n\t\tevent,\n\t) => {\n\t\tconst { id: fieldName, value, name: group } = event.target;\n\t\tconst { ONSITE } = TESTING_LOCATION_FIELDS;\n\n\t\tif (group === TESTING_LOCATION_FIELDNAME) {\n\t\t\treturn setExamSelection(event);\n\t\t}\n\n\t\tswitch (fieldName) {\n\t\t\tcase EXAMWINDOW_FIELDNAME:\n\t\t\t\tresetForm();\n\t\t\t\treturn setProgramOptions();\n\n\t\t\tcase ONSITE.EXAM_FIELDNAME:\n\t\t\t\tresetExamData('countries', 'states', 'centers');\n\t\t\t\tresetFields(\n\t\t\t\t\tONSITE.COUNTRY_FIELDNAME,\n\t\t\t\t\tONSITE.STATE_FIELDNAME,\n\t\t\t\t\tONSITE.CENTER_FIELDNAME,\n\t\t\t\t\tONSITE.PROGRAM_FIELDNAME,\n\t\t\t\t);\n\n\t\t\t\treturn setCountryOptions(value);\n\n\t\t\tcase ONSITE.COUNTRY_FIELDNAME:\n\t\t\t\tresetExamData('states', 'centers');\n\t\t\t\tresetFields(\n\t\t\t\t\tONSITE.STATE_FIELDNAME,\n\t\t\t\t\tONSITE.CENTER_FIELDNAME,\n\t\t\t\t\tONSITE.PROGRAM_FIELDNAME,\n\t\t\t\t);\n\n\t\t\t\treturn value === DOMESTIC_COUNTRY_VALUE\n\t\t\t\t\t? setStateOptions()\n\t\t\t\t\t: setCenterOptions(value);\n\n\t\t\tcase ONSITE.STATE_FIELDNAME:\n\t\t\t\tresetExamData('centers');\n\t\t\t\tresetFields(ONSITE.CENTER_FIELDNAME, ONSITE.PROGRAM_FIELDNAME);\n\n\t\t\t\treturn setCenterOptions(DOMESTIC_COUNTRY_VALUE, value);\n\n\t\t\tcase ONSITE.CENTER_FIELDNAME:\n\t\t\t\tresetFields(ONSITE.PROGRAM_FIELDNAME);\n\t\t\t\treturn setCenterNote(value);\n\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t};\n\n\t/**\n\t * Handles redux form submission. Will only trigger if redux form is valid.\n\t *\n\t * @param {FormValues} values List of submitted form values.\n\t */\n\tconst handleSubmission = async (values: FormValues) => {\n\t\tconst locationType = values[TESTING_LOCATION_FIELDNAME];\n\n\t\tif (!TestingLocations.guard(locationType)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst locationFields = TESTING_LOCATION_FIELDS[locationType];\n\t\tconst {\n\t\t\tEXAM_FIELDNAME,\n\t\t\tPROGRAM_FIELDNAME,\n\t\t\tCOUNTRY_FIELDNAME,\n\t\t\tSTATE_FIELDNAME,\n\t\t\tCENTER_FIELDNAME,\n\t\t} = locationFields;\n\n\t\tconst itemId = parseInt(values[EXAM_FIELDNAME], 10);\n\t\tconst series = values[EXAMWINDOW_FIELDNAME];\n\t\tconst centerCode = CENTER_FIELDNAME ? values[CENTER_FIELDNAME] : null;\n\t\tconst programCode = values[PROGRAM_FIELDNAME];\n\n\t\tconst registration = { centerCode, examDate, programCode };\n\n\t\tconst { type, payload } =\n\t\t\tlocationType === 'VIRTUAL'\n\t\t\t\t? await addToCart({\n\t\t\t\t\t\titemId,\n\t\t\t\t\t\tseries,\n\t\t\t\t\t\t...(programCode && { program: programCode }),\n\t\t\t\t })\n\t\t\t\t: await addExamToCart({ itemId, series, registration });\n\n\t\tif (type === 'API_ERROR') {\n\t\t\tsetSubmitError(payload);\n\t\t\tthrow new SubmissionError({});\n\t\t}\n\n\t\tawait gtmAddToCart(parseInt(values[EXAM_FIELDNAME], 10), programCode);\n\n\t\tawait getCart('inline');\n\n\t\tsetStoredTitle(selectedTitle);\n\t\tsetLabels({\n\t\t\texamWindow: getLabel(\n\t\t\t\tvalues,\n\t\t\t\tEXAMWINDOW_FIELDNAME,\n\t\t\t\texamWindowOptions || [],\n\t\t\t),\n\t\t\tlocationType: getLabel(\n\t\t\t\tvalues,\n\t\t\t\tTESTING_LOCATION_FIELDNAME,\n\t\t\t\tObject.values(examOptions),\n\t\t\t),\n\t\t\texam: getLabel(values, EXAM_FIELDNAME, examOptions[locationType].options),\n\t\t\tprogram: getLabel(values, PROGRAM_FIELDNAME, programs.options),\n\t\t\tcountry: getLabel(values, COUNTRY_FIELDNAME, countries.options),\n\t\t\tstate: getLabel(values, STATE_FIELDNAME, states.options),\n\t\t\tcenter: getLabel(values, CENTER_FIELDNAME, centers.options),\n\t\t});\n\n\t\treset();\n\t};\n\n\t// Dispatch immediate exam window selection if No Window is set.\n\tReact.useEffect(() => {\n\t\tif (hasNoExamWindows) {\n\t\t\tsetInitialExamWindow();\n\t\t\tsetProgramOptions();\n\t\t}\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, []);\n\n\tconst COURSE_NOTE = note ? (\n\t\t\n\t\t\t{/* eslint-disable-next-line react/no-danger */}\n\t\t\t
\n\t\t\n\t) : null;\n\n\t/*\n\t * Form container with an exam window Select, and a TestingLocationForm form component.\n\t *\n\t * Upon successful form submission, an PurchaseExamOverlay appears.\n\t */\n\treturn (\n\t\t\n\t\t\t{store.auth.isAuthenticated ? (\n\t\t\t\t<>\n\t\t\t\t\t

{description}

\n\t\t\t\t\t\n\t\t\t\t\t\tDesignation exams now require virtual proctoring to further ensure exam integrity. Learn more about how proctoring benefits you and what you will need.\n\t\t\t\t\t\n\t\t\t\t\t{COURSE_NOTE}\n\t\t\t\t\t\n\t\t\t\t\t\t{submitting && }\n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\t\t{showTestingLocationForm && (\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t
  • \n\t\t\t\t\t\t
\n\n\t\t\t\t\t\t{hasMatchingExamWindow && (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tThe window you selected to take your exam does not match the\n\t\t\t\t\t\t\t\tanticipated exam window of your materials.\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t{COURSE_NOTE}\n\t\t\t\t\t

\n\t\t\t\t\t\tSign in or create an account to purchase your exam.{' '}\n\t\t\t\t\t\t{description}\n\t\t\t\t\t

\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t
\n\t);\n};\n\nexport const PurchaseTabExam = reduxForm<{}, PropPurchaseTabExam>({})(\n\tPurchaseTabExamRaw,\n);\n","import { State, TestingLocation } from '@aicpcu/web-api-spec-model';\n\nimport { DOMESTIC_COUNTRY_VALUE } from '@app/constants/address';\nimport { FormValues } from '@app/interfaces/form';\nimport { LabelValue } from '@app/interfaces/labelValue';\nimport { apiService } from '@app/services/api.service';\nimport { webApi } from '@app/services/web-api';\nimport { byLabel, getAlphaOrder } from '@app/utility/sort';\n\nimport { ExamDataOption } from './purchase-form.types';\nimport { formUtil } from './purchase-form.util';\n\n/**\n * Get country options from testing location data.\n *\n * @param {TestingLocation[]} testingLocationData List of testing location data.\n *\n * @returns {LabelValue[]} Country options mapped to select options.\n */\nexport const getCountryOptions = (\n\ttestingLocationData: readonly TestingLocation[],\n): LabelValue[] => {\n\tif (!testingLocationData) {\n\t\treturn [];\n\t}\n\n\tconst uniqueCountries = testingLocationData\n\t\t.map(({ country = DOMESTIC_COUNTRY_VALUE }) => country)\n\t\t.filter((value, index, array) => array.indexOf(value) === index)\n\t\t.sort(getAlphaOrder);\n\n\tconst countryOptions = uniqueCountries.map((country) => ({\n\t\tlabel: country,\n\t\tvalue: country,\n\t}));\n\n\treturn countryOptions;\n};\n\n/**\n * Get state options from testing location data by making a web api request.\n *\n * @param {TestingLocation[]} testingLocationData List of testing location data.\n * @callback setApiError Sets an api error if necessary.\n *\n * @returns {Promise} State options mapped to select options.\n */\nexport const getStateOptions = async (\n\tlocations: readonly TestingLocation[],\n\tsetApiError: any,\n): Promise => {\n\tlet data: readonly State[];\n\ttry {\n\t\tdata = await webApi.getStates();\n\t} catch (e) {\n\t\treturn setApiError(e);\n\t}\n\n\tconst uniqueStates = locations\n\t\t.map((location) => location.state || '')\n\t\t.filter((value, index, array) => value && array.indexOf(value) === index)\n\t\t.sort(getAlphaOrder);\n\n\tconst stateOptions = uniqueStates.map((location) => {\n\t\tconst stateItem = data.find(\n\t\t\t({ abbreviation = '' }) => abbreviation === location,\n\t\t);\n\t\treturn {\n\t\t\tlabel: stateItem?.name!,\n\t\t\tvalue: location,\n\t\t};\n\t});\n\n\treturn stateOptions;\n};\n\n/**\n * Get testing center options by location selections.\n *\n * @param {TestingLocation[]} locations List of testing location data.\n * @param {string} Country Country code.\n * @param {string=} usState US state code.\n *\n * @returns {ExamDataOption[]} Center options.\n */\nexport const getTestingCenterOptions = (\n\tlocations: readonly TestingLocation[],\n\tcountry: string,\n\tusState: string = '',\n): ExamDataOption[] => {\n\tif (!locations) {\n\t\treturn [];\n\t}\n\n\treturn country === DOMESTIC_COUNTRY_VALUE\n\t\t? locations\n\t\t\t\t.filter(({ state }) => state && state === usState)\n\t\t\t\t.map(\n\t\t\t\t\t({ description: label = '', note = '', siteId: value = '' }) => ({\n\t\t\t\t\t\tlabel,\n\t\t\t\t\t\tnote,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.sort(byLabel)\n\t\t: locations\n\t\t\t\t.filter(\n\t\t\t\t\t({ country: locCountry = DOMESTIC_COUNTRY_VALUE }) =>\n\t\t\t\t\t\tlocCountry === country,\n\t\t\t\t)\n\t\t\t\t.map(\n\t\t\t\t\t({ description: label = '', note = '', siteId: value = '' }) => ({\n\t\t\t\t\t\tlabel,\n\t\t\t\t\t\tnote,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.sort(byLabel);\n};\n\n/**\n * Get testing center location note from location options and siteId.\n *\n * @param {ExamDataOption[]} centerOptions Testing center location options.\n * @param {string} siteId Site ID of selected center.\n *\n * @returns {string} Testing location note.\n */\nexport const getTestingLocationNote = (\n\tcenterOptions: ExamDataOption[],\n\tsiteId: string,\n): string => {\n\tconst selectedLocation = centerOptions.find(({ value }) => siteId === value);\n\treturn selectedLocation?.note || '';\n};\n\n/**\n * Get program options from course code by making a web api request.\n *\n * @param {string} courseCode Course code.\n * @callback setApiError Sets an api error if necessary.\n */\nexport const getProgramOptions = async (\n\tcourseCode: string,\n\tsetApiError: any,\n): Promise => {\n\tconst response = await apiService.product.programCourse.findByCourse(\n\t\tcourseCode,\n\t);\n\tconst { status, data = {} } = response;\n\n\tif (status !== 200) {\n\t\treturn setApiError({\n\t\t\t...data,\n\t\t\tapi: 'program',\n\t\t\terrorType: 'inline',\n\t\t});\n\t}\n\n\tconst {\n\t\tvalues: programOptions,\n\t}: {\n\t\tvalues: {\n\t\t\tprogramCode: string;\n\t\t\tabbreviation: string;\n\t\t}[];\n\t} = data;\n\n\treturn programOptions\n\t\t.map(\n\t\t\t({ programCode: value = '', abbreviation: label = '' }) => ({\n\t\t\t\tlabel,\n\t\t\t\tvalue,\n\t\t\t}),\n\t\t)\n\t\t.filter(({ label }) => label)\n\t\t.sort(byLabel);\n};\n\n/**\n * Get label from form value.\n *\n * @param {string} formValue Form input values.\n * @param {LabelValue[]} options\n */\nexport const getLabel = (\n\tformValues: FormValues,\n\tfieldName: string | undefined,\n\toptions: LabelValue[],\n) => {\n\tconst option = options.find(\n\t\t({ value }) =>\n\t\t\tfieldName && formUtil.selectValue(formValues, fieldName) === value,\n\t);\n\treturn option?.label || '';\n};\n","import classNames from 'classnames';\nimport * as React from 'react';\nimport {\n\treduxForm,\n\tSubmissionError,\n\tformValueSelector,\n\tInjectedFormProps,\n} from 'redux-form';\n\nimport { CartItem } from '@aicpcu/web-api-spec-model';\n\nimport { AddCartButton } from '@app/components/add-cart-button';\nimport { PurchaseMaterialsOverlay } from '@app/components/card-tab-overlay';\nimport { Select, FormContainer, RadioGroupField } from '@app/components/forms';\nimport {\n\texamWindowRequired,\n\tmaterialRequired,\n} from '@app/components/forms/validations.constants';\nimport { Loader } from '@app/components/loader';\nimport { Notification } from '@app/components/notification';\nimport { FormValues } from '@app/interfaces/form';\nimport { Store } from '@app/interfaces/store/store';\nimport { gtmAddToCart } from '@app/utility/gtm';\nimport { getAlphaOrder, isRecommended } from '@app/utility/sort';\n\nimport { PURCHASE_TAB_STRINGS, TabIdType } from './purchase-form.constants';\nimport {\n\tMaterialExamWindowOptions,\n\tMaterialOption,\n\tPropMaterialRadio,\n} from './purchase-form.types';\nimport {\n\tformUtil,\n\tisVirtualExam,\n\tlocalStorageUtil,\n\tsetUpdateCookie,\n\ttabUtil,\n} from './purchase-form.util';\nimport EnrollCardButton from '../new-add-cart-button';\n\ntype PropPurchaseTabMaterial = {\n\tactions: any;\n\tcourseCode: string;\n\tdescription: string;\n\texamWindowOptions?: MaterialExamWindowOptions[];\n\tform: string;\n\thasNoExamWindows?: boolean;\n\thidden: boolean;\n\tid: number;\n\tisSingleTab: boolean;\n\tonSelect: (tabId: TabIdType) => void;\n\tsetContainerHeight: (value: string, tabId: TabIdType) => void;\n\tmaterialsNote?: string;\n\tstore: Store;\n};\n\n/**\n * Sort material options by recommended first, then alpabetical.\n *\n * @param {MaterialOption} optionA Material option A.\n * @param {MaterialOption} optionB Material option B.\n * @returns {number} Sort order value.\n */\nconst sortMaterials = (\n\t{ label: a }: MaterialOption,\n\t{ label: b }: MaterialOption,\n): number => {\n\tif (isRecommended(a)) {\n\t\treturn isRecommended(b) ? getAlphaOrder(a, b) : -1;\n\t}\n\treturn isRecommended(b) ? 1 : getAlphaOrder(a, b);\n};\n\n/**\n * Map material option fields provided to radio options.\n *\n * @param {MaterialOption} materialOption Material options.\n * @returns {PropMaterialRadio} Radio options.\n */\nconst mapRadioProperties = ({\n\tlabel: title,\n\tvalue,\n\tdescription,\n\tcurrentPrice,\n\tsaleEndDate,\n\tsalePrice,\n}: MaterialOption): PropMaterialRadio => ({\n\tclassName: 'purchase-tabs__material-item custom__rb--gray',\n\tlabel: `${title.trim()}, $${salePrice.toString()}`,\n\tlabelChildren: {\n\t\tclassName: 'purchase-tabs__product-info',\n\t\tdescription,\n\t},\n\tname: 'materials-radio-option',\n\tcurrentPrice,\n\tsaleEndDate,\n\tsalePrice,\n\trequired: true,\n\ttitle,\n\tvalue,\n});\n\nconst { MATERIAL_TAB } = PURCHASE_TAB_STRINGS;\n\n/**\n * Purchase Material Form is Redux Form.\n *\n * Depending on an exam window selection, a radio group of course materials\n * will be available. Upon successful form submission, an overlay is presented.\n *\n * Any parameter with \"Redux or Redux Form\" descriptor is connected and\n * composed.\n *\n * @param {Object} store Auth store.\n * @param {Object} actions Redux Actions.\n * @param {Array} examWindowOptions Exam window options for select option.\n * @param {boolean} isSingleTab Is a single form, with no matching form.\n * @param {boolean} hasNoExamWindows Has no exam windows. Defaults to first window.\n * @callback onSelect - Handle overlay tab selection.\n *\n * @returns {React.Element} Purchase material form component.\n */\nconst PurchaseTabMaterialRaw: React.FC<\n\tInjectedFormProps<{}, PropPurchaseTabMaterial> & PropPurchaseTabMaterial\n> = ({\n\tactions: { addToCart, getCart },\n\tcourseCode,\n\tdescription,\n\texamWindowOptions,\n\thasNoExamWindows = false,\n\thidden,\n\tid,\n\tisSingleTab,\n\tonSelect,\n\tsetContainerHeight,\n\tstore,\n\tmaterialsNote,\n\t...reduxFormProps\n}: InjectedFormProps<{}, PropPurchaseTabMaterial> &\n\tPropPurchaseTabMaterial) => {\n\tconst { cart, content } = store;\n\tconst { cartItems }: { cartItems: CartItem[] } = cart;\n\tconst {\n\t\tchange,\n\t\tform,\n\t\thandleSubmit,\n\t\treset,\n\t\tsubmitFailed,\n\t\tsubmitSucceeded,\n\t\tsubmitting,\n\t\tvalid,\n\t} = reduxFormProps;\n\n\t// Field names based on course's ID.\n\tconst { EXAMWINDOW_FIELDNAME, MATERIAL_FIELDNAME } = Object.freeze(\n\t\tformUtil.createMaterialFields(id),\n\t);\n\n\tconst panelId = tabUtil.setPanelId(MATERIAL_TAB.id, id);\n\n\t// Create form value selector that's connected to redux.\n\tconst selector = formValueSelector(form);\n\tconst selectedExamWindowApiId = selector(store, EXAMWINDOW_FIELDNAME);\n\tconst selectedMaterialId = selector(store, MATERIAL_FIELDNAME);\n\n\tconst [overlayVisible, setOverlayVisible] = React.useState(false);\n\tconst [storedTitle, setStoredTitle] = React.useState('');\n\tconst [submitError, setSubmitError] = React.useState();\n\tconst [isShowEnroll, setIsShowEnroll] = React.useState();\n\n\t// Memoized radio options based on current exam window selection.\n\tconst radioOptions = (() => {\n\t\tif (!selectedExamWindowApiId) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst selectedExamWindow = examWindowOptions?.find(\n\t\t\t({ value }) => value === selectedExamWindowApiId.toString(),\n\t\t);\n\t\tconst { options = [] } = selectedExamWindow || {};\n\t\treturn options.sort(sortMaterials).map(mapRadioProperties);\n\t})();\n\n\t// Selected material.\n\tconst selectedMaterial = (() =>\n\t\tradioOptions.find(({ value }) => value === selectedMaterialId))();\n\n\t// Memoized matching VE cart item.\n\tconst [hasMatchingVirtualExam, hasMatchingExamWindow] = React.useMemo(() => {\n\t\tconst matchingExam = cartItems.find((item) => {\n\t\t\tconst { courseCode: code = '', itemId = '' } = item;\n\t\t\tif (code === courseCode && content.programRule?.products?.[itemId]) {\n\t\t\t\tconst { gradeForExam, published = false } =\n\t\t\t\t\tcontent.programRule.products[itemId];\n\t\t\t\treturn isVirtualExam(published, gradeForExam);\n\t\t\t}\n\n\t\t\treturn false;\n\t\t});\n\n\t\tconst { targetSeries: matchingSeries = '' } = matchingExam || {};\n\t\treturn [\n\t\t\tmatchingExam !== undefined,\n\t\t\tmatchingExam !== undefined &&\n\t\t\t\tselectedExamWindowApiId !== undefined &&\n\t\t\t\tmatchingSeries !== selectedExamWindowApiId,\n\t\t];\n\t}, [cartItems, content, courseCode, selectedExamWindowApiId]);\n\n\t// Logic to handle purchase form with hidden exam window options.\n\tconst setInitialExamWindow = React.useCallback(() => {\n\t\tif (examWindowOptions?.length) {\n\t\t\tchange(EXAMWINDOW_FIELDNAME, examWindowOptions[0].value);\n\t\t}\n\t}, [change, EXAMWINDOW_FIELDNAME, examWindowOptions]);\n\n\t// Reset form will reset form, and set initial window if No Window is set.\n\tconst resetForm = () => {\n\t\treset();\n\t\tsetOverlayVisible(false);\n\n\t\tif (hasNoExamWindows) {\n\t\t\tsetInitialExamWindow();\n\t\t}\n\t};\n\n\t// Use effect to load title and overlay state from local storage.\n\tReact.useEffect(() => {\n\t\tconst handleLoadForm = (isOpen: boolean, title: string) => {\n\t\t\tsetOverlayVisible(isOpen);\n\t\t\tsetStoredTitle(title);\n\t\t};\n\n\t\tlocalStorageUtil.loadForm(handleLoadForm, courseCode);\n\t}, [\n\t\tcourseCode,\n\t\thasNoExamWindows,\n\t\tsetInitialExamWindow,\n\t\tsetOverlayVisible,\n\t\tsetStoredTitle,\n\t]);\n\n\t// Dispatch immediate exam window selection if No Window is set.\n\tReact.useEffect(() => {\n\t\tif (hasNoExamWindows) {\n\t\t\tsetInitialExamWindow();\n\t\t}\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, []);\n\n\t/**\n\t * Redux form submission handler.\n\t *\n\t * - Sets an UPDATE_CART cookie for unauthenticated user with no cart.\n\t * - Adds selected material to Cart.\n\t * - Adds selected material to Google Tag Manager.\n\t *\n\t * @params {Array} values Redux Form submission values\n\t */\n\tconst handleSubmission = async (values: FormValues) => {\n\t\tsetUpdateCookie(store.auth.isAuthenticated);\n\n\t\tconst { type, payload } = await addToCart({\n\t\t\titemId: parseInt(values[MATERIAL_FIELDNAME], 10),\n\t\t\tseries: values[EXAMWINDOW_FIELDNAME],\n\t\t});\n\n\t\tif (type === 'API_ERROR') {\n\t\t\tsetSubmitError(payload);\n\t\t\tthrow new SubmissionError({});\n\t\t}\n\n\t\tawait gtmAddToCart(parseInt(values[MATERIAL_FIELDNAME], 10));\n\n\t\tawait getCart('inline');\n\n\t\tsetStoredTitle(selectedMaterial?.title || '');\n\t\treset();\n\t};\n\n\treturn (\n\t\t\n\t\t\t

{description}

\n\t\t\t{materialsNote && (\n\t\t\t\t\n\t\t\t\t\t{/* eslint-disable-next-line react/no-danger */}\n\t\t\t\t\t
\n\t\t\t\t\n\t\t\t)}\n\t\t\t\n\t\t\t\t{submitting && }\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t reset()}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\n\n\t\t\t\t\t
  • \n\t\t\t\t\t\t{!!radioOptions.length && (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t)}\n\t\t\t\t\t
  • \n\t\t\t\t
\n\n\t\t\t\t{hasMatchingExamWindow && (\n\t\t\t\t\t\n\t\t\t\t\t\tThe window you selected to take your exam does not match the\n\t\t\t\t\t\tanticipated exam window of your materials.\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\t{!isShowEnroll && (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t
\n\t);\n};\n\nexport const PurchaseTabMaterial = reduxForm<{}, PropPurchaseTabMaterial>({})(\n\tPurchaseTabMaterialRaw,\n);\n","import classNames from 'classnames';\nimport { DateTime } from 'luxon';\nimport * as React from 'react';\nimport {\n\tField,\n\tGenericField,\n\tWrappedFieldInputProps,\n\tWrappedFieldProps,\n} from 'redux-form';\n\nimport { FormGroup, Select } from '@app/components/forms';\nimport {\n\texamRequired,\n\tprogramRequired,\n\tcountryRequired,\n\tstateRequired,\n\ttestingCenterRequired,\n} from '@app/components/forms/validations.constants';\nimport { Notification } from '@app/components/notification';\nimport { FormValues } from '@app/interfaces/form';\nimport { LabelValue } from '@app/interfaces/labelValue';\n\nimport {\n\tExamData,\n\tExamDataOption,\n\tExamOption,\n\tPropExamRadio,\n\tPropExamRadioGroup,\n\tTestingLocationFields,\n} from './purchase-form.types';\nimport { formUtil } from './purchase-form.util';\n\ntype PropTestingLocationRadio = {\n\tdescription: string;\n\tdata: PropExamRadio;\n\tinput: WrappedFieldInputProps;\n\tonChange: React.ChangeEventHandler;\n};\n\n/**\n * Exam selection component. Can be hidden if only one option available.\n *\n * @param {object} options Exam options for select.\n * @param {string} name Exam field name.\n * @callback onChange Triggers on select option change.\n * @callback validate Validates selected option.\n *\n * @return {object} ExamSelection component.\n */\nconst ExamSelection = ({\n\texamOption,\n\tname,\n\tonChange,\n\tvalidate,\n}: {\n\texamOption: ExamOption[];\n\tname: string;\n\tonChange?: React.ChangeEventHandler;\n\tvalidate: any;\n}) => (\n\t\n);\n\n/**\n * Generic selection component.\n *\n * @param {boolean} disabled Disables component.\n * @param {boolean} isLoading Sets component to loading status.\n * @param {string} label Component user-facing descriptor.\n * @param {string} name Field name.\n * @callback onChange Triggers on select option change\n * @param {object} options Options for select.\n * @callback validate Validates selected option.\n *\n * @return {object} OptionSelection component.\n */\nconst OptionSelection = ({\n\tdisabled,\n\tisLoading,\n\tlabel,\n\tname,\n\tonChange,\n\toptions,\n\tvalidate,\n}: {\n\tdisabled: boolean;\n\tisLoading: boolean;\n\tlabel: string;\n\tname?: string;\n\tonChange: React.ChangeEventHandler;\n\toptions: ExamDataOption[];\n\tvalidate: any;\n}) => (\n\t\n);\n\n/**\n * Program selection component.\n *\n * @param {boolean} disabled Disables component.\n * @param {boolean} isLoading Sets component to loading status.\n * @param {string} name Program field name.\n * @param {object} options Options for select.\n * @callback validate Validates selected option.\n *\n * @return {object} ProgramSelection component.\n */\nconst ProgramSelection = ({\n\tdisabled,\n\tisLoading,\n\tname,\n\tprogramOptions,\n\tvalidate,\n}: {\n\tdisabled: boolean;\n\tisLoading: boolean;\n\tname: string;\n\tprogramOptions: ExamDataOption[];\n\tvalidate: any;\n}) => (\n\t\n);\n\n/**\n * Radio component for each of the Testing Location Types.\n *\n * Child nodes are contained within a fieldset for additional form structure.\n *\n * @param {object} children React.node\n * @param {string} description Description for selection.\n * @param {object} examOption Options for underlying exams.\n * @param {object} input Current select input properties.\n * @callback onChange Triggers when radio option is changed within group\n *\n * @return {object} TestingLocationType component.\n */\nconst TestingLocationRadio: React.FC = ({\n\tchildren,\n\tdescription,\n\tdata: { label, value: radioValue, options = [] },\n\tinput,\n\tonChange,\n}: React.PropsWithChildren) => {\n\tconst id = `${input.name}-${label.toLowerCase()}`;\n\tconst checked = radioValue === input.value;\n\n\tfunction combineRange(\n\t\tvalues: T[],\n\t\tformatValue: (n: T | undefined) => string,\n\t): string {\n\t\tconst { min, max } = values.reduce(\n\t\t\t(acc: { min?: T; max?: T }, value) => {\n\t\t\t\tif (value !== undefined) {\n\t\t\t\t\tif (acc.min === undefined || value < acc.min) acc.min = value;\n\t\t\t\t\tif (acc.max === undefined || value > acc.max) acc.max = value;\n\t\t\t\t}\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{ min: undefined, max: undefined },\n\t\t);\n\t\treturn min === max\n\t\t\t? formatValue(min)\n\t\t\t: `${formatValue(min)} - ${formatValue(max)}`;\n\t}\n\n\tconst currentPrice = combineRange(\n\t\toptions\n\t\t\t.filter((option) => option.currentPrice)\n\t\t\t.map((option) => option.currentPrice),\n\t\t(value) => (value ? `$${value}` : ''),\n\t);\n\tconst salePrice = combineRange(\n\t\toptions\n\t\t\t.filter((option) => option.salePrice)\n\t\t\t.map((option) => option.salePrice),\n\t\t(value) => (value ? `$${value}` : ''),\n\t);\n\n\t/**\n\t * TODO: put this back when prices issue is fixed.\n\t * Ticket: https://theinstitutes.atlassian.net/browse/OPEX-1211\n\t */\n\t// const saleEndDate = combineRange(\n\t// options\n\t// .filter((option) => option.saleEndDate)\n\t// .map((option) => option.saleEndDate || ''),\n\t// (value) => (value ? formatDateString(value, 'MMMM d') : ''),\n\t// );\n\n\tconst handleOnChange: React.ChangeEventHandler = (\n\t\tevent,\n\t) => {\n\t\tinput.onChange(event);\n\t\tonChange(event);\n\t};\n\n\tconst examWindowStartDates = options.map((option) => option.examWindowStartDate);\n\tconst shouldShowSalePrice = examWindowStartDates.some((examWindowStartDate) => {\n\t\tif (examWindowStartDate) {\n\t\t\tconst examDateTime = DateTime.fromFormat(examWindowStartDate, 'yyyy-MM-dd');\n\t\t\treturn DateTime.now().toMillis() < examDateTime.toMillis();\n\t\t}\n\t\treturn false;\n\t});\n\n\t/* eslint-disable react/jsx-props-no-spreading */\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{children}\n\t\t\t\n\t\t
\n\t);\n\t/* eslint-enable react/jsx-props-no-spreading */\n};\n\ntype PropTestingLocationForm = {\n\tclassName: string;\n\texamOptions: PropExamRadioGroup;\n\texamData: ExamData;\n\tformValues: FormValues;\n\thandleOnChange: React.ChangeEventHandler;\n\tid: string;\n\tisSrOnly: boolean;\n\tlabel: string;\n\trequired: boolean;\n\ttestingLocationFields: TestingLocationFields;\n\tname: string;\n};\n\n/**\n * Component to be passed into Redux 'Field' component.\n *\n * Contains radio options for Testing Location Types.\n *\n * @param {object} centers Testing centers (keys: options, loading).\n * @param {string} className Class names.\n * @param {object} countries Countries (keys: options, loading).\n * @param {object} examOptions Exam options split out into location types.\n * @param {object} formValues Current form values.\n * @callback handleOnChange Triggers on field change.\n * @param {object} input Current select input properties.\n * @param {boolean} isSrOnly Is screen ready only.\n * @param {string} label Label for radio group.\n * @param {object} meta Meta data from Redux 'Field' component and form.\n * @param {object} programs Programs (keys: options, loading)\n * @param {boolean} required Required form element\n * @param {object} states States (key: options, loading, show)\n * @param {object} testingLocationFields Testing location fields.\n *\n * @return TestingLocationFormComponent component.\n */\nexport const TestingLocationFormComponent: React.ComponentType<\n\tWrappedFieldProps & PropTestingLocationForm\n> = ({\n\tclassName,\n\texamOptions,\n\texamData,\n\tformValues,\n\thandleOnChange,\n\tisSrOnly,\n\tlabel,\n\trequired,\n\ttestingLocationFields,\n\t...wrappedFieldProps\n}: WrappedFieldProps & PropTestingLocationForm) => {\n\tconst { centers, countries, states, programs } = examData;\n\tconst { meta, input } = wrappedFieldProps;\n\n\tconst {\n\t\tPROMETRIC: prometricRadioProps,\n\t\tONSITE: onsiteRadioProps,\n\t\tVIRTUAL: virtualRadioProps,\n\t} = examOptions;\n\n\tconst {\n\t\tPROMETRIC: PROMETRIC_FIELDS,\n\t\tONSITE: ONSITE_FIELDS,\n\t\tVIRTUAL: VIRTUAL_FIELDS,\n\t} = testingLocationFields;\n\n\tconst hasError = meta.touched && meta.error;\n\n\tconst isActive = (option: LabelValue) => option.value === input.value;\n\n\treturn (\n\t\t\n\t\t\t{virtualRadioProps.options.length > 0 && (\n\t\t\t\t\n\t\t\t\t\t{isActive(virtualRadioProps) && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t)}\n\n\t\t\t{onsiteRadioProps.options.length > 0 && (\n\t\t\t\t\n\t\t\t\t\t{isActive(onsiteRadioProps) && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{states.show && (\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{centers.note && (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{centers.note}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t)}\n\n\t\t\t{prometricRadioProps.options.length > 0 && (\n\t\t\t\t\n\t\t\t\t\t{isActive(prometricRadioProps) && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t)}\n\t\t\t{hasError && (\n\t\t\t\t

{meta.error}

\n\t\t\t)}\n\t\t\n\t);\n};\n\n/**\n * Field component that displays radio options with subsequent select options to choose from.\n *\n * @param {object} props Field properties\n *\n */\nexport const TestingLocationForm = Field as new () => GenericField;\n","import { CancelToken } from 'axios';\n\nimport { CPCU_PROGRAM_ID } from '@app/constants/program-steps';\n\nexport async function initializePurchaseForm(\n\tactions: any,\n\tcourseCodes: string[],\n\ttopicCourseIds: string[],\n\tprogramId?: string,\n\tprogramIds?: string[],\n\tcancelToken?: CancelToken,\n) {\n\treturn Promise.all([\n\t\tactions.getMarketingCourses(courseCodes, cancelToken && cancelToken),\n\t\tactions.getMarketingTopicCourses(topicCourseIds, cancelToken),\n\t\tactions.getMarketingExamWindows(cancelToken),\n\t\t...(programIds && programIds.length > 0\n\t\t\t? [actions.getMarketingPrograms(programIds, cancelToken)]\n\t\t\t: []),\n\t\t...(String(programId) === CPCU_PROGRAM_ID\n\t\t\t? [actions.getMatriculation()]\n\t\t\t: []),\n\t]);\n}\n","export const isRecommended = (str: string) =>\n\tstr.toLowerCase().includes('recommended');\n\nexport const getAlphaOrder = (prev: string, next: string) =>\n\tprev.localeCompare(next);\n\nexport const byLabel = (a: { label: string }, b: { label: string }) =>\n\ta.label.localeCompare(b.label);\n"],"names":["classnames_1","__importDefault","require","React","__importStar","react_redux_1","map_dispatch_to_props_1","purchase_form_constants_1","purchase_form_util_1","purchase_tab_exam_1","purchase_tab_material_1","MATERIAL_TAB","PURCHASE_TAB_STRINGS","EXAM_TAB","exports","connect","store","mapDispatchToProps","_a","actions","_b","className","course","_c","groupName","singleTab","toggleButtonElement","_d","toggleClassNames","toggleText","abbreviation","code","examWindows","id","note","materialsNote","_e","content","programRule","marketing","_f","useState","undefined","isVisible","setIsVisible","_g","activeTab","setActiveTab","_h","examOptions","materialOptions","purchaseOptions","setPurchaseOptions","_j","materialHeight","examHeight","height","_k","setFormDimensions","materialRef","useRef","examRef","hasNoExamWindows","test","printPriceRange","useCallback","tabId","maxPrice","minPrice","matOptions","flatMap","mat","options","getMinMaxPriceFromOptions","exOptions","__spreadArray","INTERNET","VIRTUAL","priceRange","getPriceRange","createElement","Fragment","changeTab","tab","current","focus","setContainerHeight","value","includes","handleKeyDown","event","key","isOptionValid","length","useEffect","localStorageUtil","loadTab","getPurchaseOptions","examOpts","onlyExamOptions","onlyMaterialOptions","showMaterialTab","showExamTab","showTabButtons","isSingleTab","ButtonElement","label","ariaLabel","fullWidthMobile","onClick","style","role","concat","map","type","tabUtil","setId","setClassName","setPanelId","tabIndex","setTabIndex","onKeyDown","ref","title","PurchaseTabMaterial","courseCode","description","examWindowOptions","form","formUtil","createFormName","formName","toString","hidden","onSelect","PurchaseTabExam","luxon_1","redux_form_1","add_cart_button_1","button_1","card_tab_overlay_1","forms_1","validations_constants_1","loader_1","notification_1","address_1","web_api_1","gtm_1","purchase_tab_exam_util_1","testing_location_form_1","LoginButton","loginUrl","PrimaryButton","saveTab","redirectToLogin","reduxForm","setApiError","addToCart","addExamToCart","getCart","reduxFormProps","__rest","change","handleSubmit","reset","submitFailed","submitSucceeded","submitting","valid","panelId","formValues","getFormValues","fieldNames","Object","freeze","createExamFields","EXAMWINDOW_FIELDNAME","TESTING_LOCATION_FIELDNAME","TESTING_LOCATION_FIELDS","selectedExamWindow","selectValue","selectedTestingLocation","selectedExam","TestingLocations","guard","EXAM_FIELDNAME","find","PROMETRIC","ONSITE","splitExamOptions","selectedExamOption","salePrice","currentPrice","selectedTitle","examDate","examWindowStartDate","examStartDate","DateTime","fromFormat","priceToDisplay","now","toMillis","hasMatchingCartItem","cart","cartItems","some","cartCourseCode","inventoryClass","hasMatchingExamWindow","matchingMaterial","targetSeries","submitError","setSubmitError","storedTitle","setStoredTitle","examWindow","locationType","exam","program","country","state","center","labels","setLabels","_l","locationOptions","setLocationOptions","initialExamDatum","loading","initialExamData","centers","countries","programs","states","_m","examData","setExamData","showTestingLocationForm","values","resetFields","fields","_i","arguments","forEach","name","resetExamData","examDataKeys","__assign","reduce","clearedExamData","setInitialExamWindow","resetForm","changeExamData","examDataOptions","show","examDataNote","setProgramOptions","__awaiter","getProgramOptions","programOptions","sent","setCountryOptions","examId","webApi","getTestingLocationsByContactAndLicense","Number","testingLocationData","getCountryOptions","e_1","setCenterOptions","usSate","getTestingCenterOptions","handleOnChange","siteId","target","fieldName","group","examOption","testingLocation","setExamSelection","COUNTRY_FIELDNAME","STATE_FIELDNAME","CENTER_FIELDNAME","PROGRAM_FIELDNAME","DOMESTIC_COUNTRY_VALUE","getStateOptions","statesOptions","getTestingLocationNote","COURSE_NOTE","Notification","dangerouslySetInnerHTML","__html","auth","isAuthenticated","href","FormContainer","isRedux","onSubmit","locationFields","itemId","parseInt","series","centerCode","programCode","registration","payload","SubmissionError","gtmAddToCart","getLabel","Loader","isVeiled","Select","validate","examWindowRequired","tooltipMessage","onChange","TestingLocationForm","isSrOnly","required","testingLocationFields","examTestingLocationRequired","component","TestingLocationFormComponent","AddCartButton","product","price","error","isInForm","PurchaseExamOverlay","onClose","isSingleForm","api_service_1","sort_1","filter","index","array","indexOf","sort","getAlphaOrder","locations","getStates","data","uniqueStates","location","stateOptions","stateItem","usState","byLabel","centerOptions","selectedLocation","apiService","programCourse","findByCourse","response","status","api","errorType","option","new_add_cart_button_1","sortMaterials","a","b","isRecommended","mapRadioProperties","saleEndDate","trim","labelChildren","createMaterialFields","MATERIAL_FIELDNAME","selector","formValueSelector","selectedExamWindowApiId","selectedMaterialId","overlayVisible","setOverlayVisible","isShowEnroll","setIsShowEnroll","radioOptions","selectedMaterial","useMemo","matchingExam","item","products","gradeForExam","published","isVirtualExam","hasMatchingVirtualExam","loadForm","isOpen","setUpdateCookie","RadioGroupField","materialRequired","default","learnMoreUrl","showCartButton","learnMoreText","learnMoreExternal","hideOnCart","PurchaseMaterialsOverlay","ExamSelection","sortByLabel","OptionSelection","disabled","isLoading","ProgramSelection","TestingLocationRadio","children","radioValue","input","toLowerCase","checked","combineRange","formatValue","acc","min","max","shouldShowSalePrice","examDateTime","_extends","htmlFor","wrappedFieldProps","meta","prometricRadioProps","onsiteRadioProps","virtualRadioProps","PROMETRIC_FIELDS","ONSITE_FIELDS","VIRTUAL_FIELDS","hasError","touched","isActive","FormGroup","col","readOnly","examRequired","fieldExists","programRequired","countryRequired","stateRequired","testingCenterRequired","Field","program_steps_1","courseCodes","topicCourseIds","programId","programIds","cancelToken","Promise","all","getMarketingCourses","getMarketingTopicCourses","getMarketingExamWindows","getMarketingPrograms","String","CPCU_PROGRAM_ID","getMatriculation","str","prev","next","localeCompare"],"sourceRoot":""}