{"version":3,"sources":["modules/App/components/AppBoundary.js","modules/App/components/Overlay.js","modules/App/components/Spinner.js","utils/arrayHelpers.js","utils/objectHelpers.js","utils/queryHelpers.js","utils/dateHelpers.js","utils/deviceHelper.js","utils/domHelpers.js","modules/App/components/Notification.js","utils/csvHelpers.js","modules/App/actions/types.js","modules/App/actions/index.js","modules/ClientPortal/constants/stepKeys.js","modules/ClientPortal/constants/themeColor.js","modules/ClientPortal/constants/formKeys.js","modules/ClientPortal/constants/pageKeys.js","modules/ClientPortal/constants/index.js","modules/App/index.js","modules/ClientPortal/hooks/useHover.js","modules/ClientPortal/hooks/useCheckMobile.js","modules/ClientPortal/Common/Icon/index.js","modules/ClientPortal/Common/PageHeader/PageLogo.js","modules/ClientPortal/context/DrawerContext.js","modules/ClientPortal/Common/PageHeader/PageHeaderMobile.js","modules/ClientPortal/Common/PageHeader/PageHeaderDesktop.js","modules/ClientPortal/Common/PageHeader/PageHeader.js","assets/images/28989_logo_main - horizontal.png","modules/ClientPortal/Common/PoweredBy/PoweredBy.js","assets/images/coreplus-logo-small.png","modules/ClientPortal/styles/index.js","modules/ClientPortal/Common/ProgressStep/ProgressStep.js","modules/ClientPortal/Common/Select/Select.js","modules/ClientPortal/Common/TextButton/TextButton.js","modules/ClientPortal/Common/SideDrawer/SideDrawer.js","modules/ClientPortal/Common/Button/FullWidthButton.js","modules/ClientPortal/Common/Button/TransparentButton.js","modules/ClientPortal/Common/Button/ThemeColorButton.js","api/config.js","modules/ClientPortal/Common/Button/BackTopButton.js","utils/matomoHelpers.js","assets/images/google-map-marker.png","modules/ClientPortal/Common/GoogleMap/GoogleMap.js","modules/ClientPortal/Common/GoogleMap/LocationNotFound.js","assets/images/sad_face.png","modules/ClientPortal/Common/StepText/StepText.js","modules/ClientPortal/Common/Calendar/CalendarDay.js","modules/ClientPortal/helpers/filterHelper.js","modules/ClientPortal/helpers/bookingPortalHelper.js","modules/ClientPortal/helpers/dateTimeHelper.js","modules/ClientPortal/helpers/FormValidationHelper.js","modules/ClientPortal/helpers/medicareHelpers.js","modules/ClientPortal/helpers/appointmentSummaryHelper.js","modules/ClientPortal/helpers/appointmentCancellationHelper.js","modules/ClientPortal/helpers/fileHelper.js","modules/ClientPortal/helpers/creditCardHelper.js","modules/ClientPortal/Common/Calendar/Calendar.js","modules/ClientPortal/Common/Calendar/DateOfBirthCalendar.js","modules/ClientPortal/Common/InputBox/InputBox.js","modules/ClientPortal/Common/AutocompleteBox/AutocompleteBox.js","modules/ClientPortal/Common/AutocompleteBox/ComboBox.js","modules/ClientPortal/Common/Modal/Modal.js","modules/ClientPortal/Common/MonthYearPicker/MonthYearPickerPanel.js","modules/ClientPortal/Common/MonthYearPicker/ExpiryMonth.js","modules/ClientPortal/BookingPortal/components/Steps/StepItem.js","modules/ClientPortal/BookingPortal/components/Steps/SpecialtyTypeSelect.js","modules/ClientPortal/helpers/dataMappingHelper.js","modules/ClientPortal/BookingPortal/components/Steps/AppointmentTypeSelect.js","modules/ClientPortal/BookingPortal/components/Steps/LocationSelect.js","modules/ClientPortal/BookingPortal/components/Steps/PractitionerSelect.js","modules/ClientPortal/BookingPortal/components/Steps/TimeZoneSelect.js","modules/ClientPortal/BookingPortal/components/Steps/ScheduleSelect.js","modules/ClientPortal/BookingPortal/components/Drawer/DrawerCardContainer.js","modules/ClientPortal/BookingPortal/components/Drawer/LocationListCard.js","modules/ClientPortal/BookingPortal/components/Drawer/LocationDrawer.js","modules/ClientPortal/BookingPortal/components/Drawer/PractitionerAvatar.js","modules/ClientPortal/BookingPortal/components/Drawer/EllipsisButton.js","modules/ClientPortal/BookingPortal/components/Drawer/PractitionerListCard.js","modules/ClientPortal/BookingPortal/components/Drawer/PractitionerDrawer.js","modules/ClientPortal/BookingPortal/components/Drawer/WaitingListButton.js","modules/ClientPortal/BookingPortal/components/Drawer/TimeSlotList.js","modules/ClientPortal/BookingPortal/components/Drawer/CalendarLoader.js","modules/ClientPortal/BookingPortal/components/Drawer/ScheduleDrawer.js","modules/ClientPortal/BookingPortal/components/Alert.js","modules/ClientPortal/BookingPortal/components/WelcomeMessage.js","modules/ClientPortal/BookingPortal/components/ContinueButton.js","modules/ClientPortal/AnimationWrapper/MountedAnimationWrapper.js","modules/ClientPortal/AnimationWrapper/useMountAndUnmount.js","modules/ClientPortal/actions/types.js","modules/ClientPortal/actions/appointmentAction.js","api/httpClient.js","requests/index.js","services/portalService.js","modules/ClientPortal/actions/configAction.js","modules/ClientPortal/actions/datasourceAction.js","modules/ClientPortal/helpers/PreviewLoadingTemplate.js","modules/ClientPortal/actions/formAction.js","modules/ClientPortal/actions/bookingAction.js","modules/ClientPortal/helpers/stepHelper.js","modules/ClientPortal/BookingPortal/hooks/useGetData.js","modules/ClientPortal/BookingPortal/index.js","modules/ClientPortal/actions/waitingListAction.js","modules/ClientPortal/BookingPortal/hooks/useSelectData.js","modules/ClientPortal/ContactForm/components/VerificationDrawer.js","modules/ClientPortal/ContactForm/components/Form/FormInput.js","modules/ClientPortal/ContactForm/components/Form/DateOfBirth.js","modules/ClientPortal/ContactForm/components/Form/Comments.js","modules/ClientPortal/ContactForm/components/Form/HealthFund.js","modules/ClientPortal/ContactForm/components/Form/MedibankCustomFields.js","modules/ClientPortal/ContactForm/components/Form/MedibankFields.js","modules/ClientPortal/helpers/index.js","modules/ClientPortal/ContactForm/components/Form/ClientAddress.js","modules/ClientPortal/ContactForm/components/Form/ClientSuburb.js","modules/ClientPortal/ContactForm/components/Form/ClientPostcode.js","modules/ClientPortal/ContactForm/components/Form/FileUploader.js","modules/ClientPortal/ContactForm/components/Form/UploadDocument.js","modules/ClientPortal/ContactForm/components/Form/IntakeForm.js","modules/ClientPortal/ContactForm/components/Form/ConfirmationPolicy.js","modules/ClientPortal/ContactForm/components/Form/MedicareInformation.js","modules/ClientPortal/ContactForm/components/Form/CreditCard.js","modules/ClientPortal/ContactForm/components/Form/PersonalDetailsForm.js","modules/ClientPortal/ContactForm/components/Summary/SummaryListItem.js","modules/ClientPortal/ContactForm/components/Summary/SummaryDesktop.js","modules/ClientPortal/ContactForm/components/Summary/SummaryMobile.js","modules/ClientPortal/ContactForm/components/Summary/AppointmentSummary.js","modules/ClientPortal/ContactForm/consts/index.js","modules/ClientPortal/ContactForm/index.js","modules/ClientPortal/Confirm/components/BookingDetailsItem.js","modules/ClientPortal/Confirm/helperFunctions.js","modules/ClientPortal/Confirm/components/AddToCalendar.js","modules/ClientPortal/Confirm/index.js","modules/ClientPortal/Cancellation/components/CancellationReasons.js","modules/ClientPortal/Cancellation/index.js","modules/ClientPortal/index.js","utils/googleAnalyticsHelper.js","routes.js","modules/App/reducers/index.js","modules/ClientPortal/reducers/appointmentReducer.js","modules/ClientPortal/reducers/configReducer.js","modules/ClientPortal/reducers/datasourceReducer.js","jsonData/HealthFunds.js","jsonData/CustomFields.js","modules/ClientPortal/reducers/bookingReducer.js","modules/ClientPortal/reducers/formReducer.js","modules/ClientPortal/reducers/waitingListReducer.js","store/rootReducer.js","store/configureStore.js","index.js"],"names":["AppBoundary","componentDidCatch","componentDidUpdate","props","redirect","error","success","history","push","this","children","Component","styles","overlayStyle","width","height","zIndex","position","left","top","background","Overlay","style","spinnerStyle","marginLeft","marginTop","Spinner","spinning","CircularProgress","size","thickness","deleteElementByIndex","arr","index","length","slice","deepGet","obj","defaultValue","undefined","foundSoFar","remainingProps","deepAssign","initial","value","keys","key","reduce","current","currentIndex","remainingKeys","currentKey","parentKey","parentProp","currentVal","firstKey","reverse","getByKeys","currentValue","getParameterByName","name","url","window","location","href","replace","results","RegExp","toLowerCase","exec","decodeURIComponent","isSameDay","day1","day2","getDate","getMonth","getFullYear","getYearMonthPart","day","Date","isIOSDevice","test","navigator","userAgent","MSStream","blurInputWhenTypeEnter","e","which","document","activeElement","target","blur","darken","color","amount","indexOf","substring","parseInt","subtractLight","colorHex","colorResult","toString","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","setTimeout","scrollTo","element","to","duration","scrollHeight","clientHeight","scrollTop","perTick","isLightColor","hexcolor","split","map","hex","join","substr","Notification","objectToCSVRow","dataObject","dataArray","o","result","search","memo","clear","isError","message","messageInUI","useMemo","text","canDismiss","Dialog","classes","root","paperScrollPaper","open","className","onClick","APP_ACTION","SHOW_ERROR","SHOW_SUCCESS","CLEAR","LOADING","REDIRECT","loading","type","payload","showError","STEP_KEYS","themeString","sessionStorage","getItem","themeColor","headerTheme","themeJson","JSON","parse","THEME_COLOR","THEME_COLOR_HOVER","hexCode","amt","col","darkenColor","THEME_COLOR_HEADER","IS_LIGHT_HEADER","FORM_KEYS","FIRST_NAME","MIDDLE_NAME","PREFERRED_NAME","LAST_NAME","DATE_OF_BIRTH","EMAIL","MOBILE","COMMENTS","CLIENT_ADDRESS","CLIENT_SUBURB","CLIENT_POSTCODE","HEALTH_FUND","CARD_NUMBER","CARD_POSITION","CUSTOM_FIELDS","FILES","MEDICARE_NUMBER","MEDICARE_EXPIRY","CREDIT_CARD_NUMBER","CREDIT_CARD_EXPIRY","CREDIT_CARD_NAME","CREDIT_CARD_SECURITY_CODE","PAGE_KEYS","ANY_SELECTION","CANCELLATION_OTHER_REASON_ID","VALID_FILE_EXTENSION","SUPPORTED_FILE_TEXT","extension","toUpperCase","ONLINE_PAYMENT_KEY_NAME","ONLINE_PAYMENT_IS_TEST","connect","state","app","outerTheme","createMuiTheme","palette","primary","main","ThemeProvider","theme","useHover","useState","setValue","ref","useRef","handleMouseEnter","useCallback","handleMouseLeave","useEffect","node","addEventListener","removeEventListener","useCheckMobile","innerWidth","isMobile","setIsMobile","onWindowSizeChange","ListIcon","MaterialUIIcon","iconKey","ArrowDownIcon","DoneIcon","CloseIcon","PhoneIcon","EditIcon","CalendarIcon","CreditCardIcon","HelpIcon","restProps","Icon","PageLogo","setError","tenant","src","alt","onError","DrawerContext","createContext","DrawerContextProvider","drawerOpen","setDrawerOpen","Provider","headerBgColor","contrastColor","fontColor","infoIconStyle","borderColor","infoIconStyleOpen","phoneIconStyle","PageHeaderMobile","menuRef","scrollRecordRef","scrollY","openSubMenu","setOpenSubMenu","useContext","displayPhoneNumber","customerTermsUrl","customerPrivacyPolicyUrl","businessName","isLogoOrBusinessName","handleClick","event","targetDom","contains","handleScroll","windowScrollY","Math","abs","businessNameFontStyle","fontSize","stopPropagation","prevOpen","rel","xmlns","viewBox","points","fill","bgColor","PageHeaderDesktop","PageHeader","PoweredBy","logo","coreplusLogo","colorStyle","backgroundStyle","borderColorStyle","backgroundStyleHover","borderColorStyleHover","ProgressStep","page","appointment","setHeight","timmer","heightValue","diffHeight","nodeList","querySelectorAll","dom","offsetTop","getLineHeight","clearTimeout","stepTwo","Select","anchorEl","setAnchorEl","placeholder","onToggle","onSelect","options","noOptionText","noOptionDataSource","preventDefault","handleSelect","valueText","foundItem","find","item","label","renderText","renderMenu","Menu","onClose","PaperProps","maxHeight","minWidth","MenuItem","span","TextButton","SideDrawer","closeCallback","showCloseBtn","maskClosable","handleClose","object","Drawer","paper","anchor","hoverStyle","FullWidthButton","disabled","hoverRef","isHovered","defaultColorTheme","defaultColor","TransparentButton","isTheme","forceDisabled","normalStyle","defaultProps","ThemeColorButton","RECAPTCHA_KEY","API_CONFIG","BUSINESS_NAME","GOOGLE_MAP_KEY","BackTopButton","iconDirection","pathname","process","antiForgeryTokenDom","querySelector","CSRF_TOKEN","origin","protocol","hostname","port","script","createElement","innerHTML","head","appendChild","createMatomoScriptTag","rootUrl","headers","CsrfAngular","preventTouchStyle","pointerEvents","GoogleMap","zoom","preventTouch","bootstrapURLKeys","defaultCenter","defaultZoom","GoogleMapMarker","lat","lng","LocationNotFound","StepText","step","total","hoverContainerStyle","hoverTextStyle","CalendarDay","dateKey","today","amEnabled","pmEnabled","selected","enabled","containerStyle","dateTextStyle","amEnabledStyle","pmEnabledStyle","filterPractitionersBySpecialty","practitioners","specialtyType","filter","p","specialties","s","specialtyTypeId","includes","filterSchedulesByPractitioner","schedules","practitioner","practitionerId","filterSchedulesByLocation","Sessions","locationId","filterLocationsBySchedules","locations","locationIdsInSchedule","next","sessions","l","filterPractitionersBySchedules","practitionerIdsInSchedule","checkIsPhoneConsult","siteConsultTypes","some","siteId","consultType","isCurrentStep","steps","mapDateTimeStringToText","dateTimeString","moment","parseZone","format","mapDateTimeToTimeText","datetime","getUniqueTimeSlots","timeslots","startDateTime","endDateTime","mapMomentjsToDateTimeString","momentJsDateTime","AUS_DATE_REGEX","mapAusDateStrToDate","ausDate","dateArr","momentJsDate","isValid","isBefore","toDate","isDateBirthWithInRange","date","isAfter","isFutureDate","mapDateToICalDatetimeFormat","isValidName","isPostcode","mandatoryObject","errorMessage","required","trim","isEmpty","validators","valid","isEmail","getCommentsFieldsValidator","isCommentMandatory","getAddressFieldsValidator","addressValue","isAddressMandatory","getMedicareValidator","numberValue","expiryValue","numberValid","val","num","irn","cardNumber","validated","enteredMedicareCardNumber","enteredMedicareCardNumberLength","totalValue","i","parseFloat","validateMedicareCard","expiryValid","getCreditCardValidator","mandatory","cardValid","validator","isCreditCard","nameValid","Boolean","codeValid","validate","rules","Object","getSpecialtyTypeAppointmentType","specialtyTypes","specialtyTypeValue","appointmentTypeValue","specialtyTypeText","appointmentTypeText","isTelehealthAppointment","foundSpecialtyType","foundAppointmentType","appointmentTypes","a","appointmentTypeId","description","isTeleHealthEnabled","getLocationTextAndPosition","positions","locationValue","locationText","locationDetail","suburb","getPractitionerText","practitionerValue","practitionerDetail","firstName","lastName","getPractitionerFirstName","getPractitionerLastName","getAppointmentDateTimeText","appointmentDateTime","waitingListRequired","waitingListPreferredTime","getFullAddress","streetAddress","postcode","country","timezoneTextAndTzIdMap","adelaide","brisbane","currie","darwin","eucla","hobart","lindeman","melbourne","perth","sydney","getAppointmentIdFromUrl","mappingContentTypeWithFileName","fileName","getFileNameWithExtension","base64ToArrayBuffer","base64","binaryString","atob","binaryLen","bytes","Uint8Array","ascii","charCodeAt","splitedFileNameArray","fetchForCardTokenPromise","publishKey","card","isTest","pinApi","mode","Pin","Api","getPinApiInstanceFactory","Promise","resolve","reject","createCardToken","then","done","canSaveCreditCard","isCreditCardEnabled","config","onlinePaymentToken","datasource","createPinPaymentsScript","getElementsByTagName","areNotAllCreditCardFieldsFilled","number","expiryDate","securityCode","hasValueFieldsNumber","Calendar","month","fromMonth","timeSlots","onDayClick","onMonthChange","selectedDay","renderDay","mapJsDateToYearMonthDayString","timeSlot","am","pm","firstYear","fromDate","DateOfBirthCalendar","monthDate","setMonthDate","dateString","jsDate","DayComponent","handleYearMonthChange","handleDayClick","dateStr","disabledDays","after","captionElement","localeUtils","YearMonthForm","onChange","toMonth","months","getMonths","years","handleChange","form","year","InputBox","errorText","onBlur","errorTextComponent","InputBoxError","TextField","helperText","AutocompleteBox","inputText","setInputText","onSearch","option","handleSearch","Autocomplete","disableClearable","getOptionLabel","renderInput","params","fullWidth","inputProps","autoComplete","ComboBox","freeSolo","filterSelectedOptions","noOptionsText","inputValue","autoHighlight","Modal","title","onConfirm","currentMoment","currentYear","currentMonth","monthArr","MonthYearPickerPanel","minYear","maxYear","previousNotAllow","yearValue","setYearValue","yearInNumber","monthValue","getStyle","isPrevious","monthVal","handleClickMonth","ExpiryMonth","showCalendar","setShowCalendar","floatingLabel","InputLabelProps","shrink","CalendarPanel","splitArr","StepItem","hint","SpecialtyTypeSelect","hideStep","mapSpecialtyTypesToOptions","handleToggle","AppointmentTypeSelect","appointmentType","mapAppointmentTypesToOptions","LocationSelect","getPositions","PractitionerSelect","preSelectPractitioner","TimeZoneSelect","timeZones","hintText","isTimezoneEnabled","locationTimeZones","timeZone","timezoneUID","ScheduleSelect","noSlotsPlaceholder","placeholderText","DrawerCardContainer","LocationListCard","addressText","LocationDrawer","setSearch","showAnyLocationButton","timezoneId","isTimeZoneUnique","locationList","mapLocationsToDataInLocationDrawer","handleSelectAny","firstLocation","newSearch","filterLocations","filterBy","renderLocations","filteredLocations","Alert","PractitionerAvatar","useInitial","handleError","Avatar","EllipsisButton","tooltipContent","Tooltip","maxHeightStyle","PractitionerListCard","descriptionRef","isHigher","setIsHigher","expanded","setExpanded","imageId","imageSrc","getFirstLetterUpperCase","str","charAt","initialNameText","property","getComputedStyle","getPropertyValue","showButton","descriptionDomStyle","PractitionerDrawer","expandedCard","setExpandedCard","isAnyPractitionerEnabled","showAnyPractitionerButton","photoImageRootUrl","practitionerList","mapPractitionersToDataInPractitionerDrawer","renderPractitionerList","WaitingListButton","TimeSlotList","isAM","TimeSlot","CalendarLoader","LinearProgress","drawerDomIdentifier","ScheduleDrawer","headingRef","drawerRef","headingFloat","setHeadingFloat","setSelectedDay","selectedMonth","setSelectedMonth","nextTimeSlotText","setNextTimeSlotText","loadingTimeSlots","getTimeSlots","availableLocations","earliestBookingTime","appointmentDateTimeValue","waitingListEnabled","waitingList","setRequireWaitingList","selectPreferredTime","timezone","preferredTime","headerTopHeight","startTimeMomentJs","add","endTimeMomentJs","endOf","headingDom","headingTop","drawerTop","timer","identifier","renderDateTitle","initialMonth","timeSlotList","res","timeslot","startTime","momentJsTime","recordInRes","timeslotWithCurrentKey","timeslotInDatasource","newTimeslot","hour","createTimeSlotObjectForScheduleDrawer","displayTimeSlots","selectedTimeSlot","destination","adjustment","elementScrollTop","handleMonthClick","ditinctMonths","accumulator","monthKey","startOf","startOfMonth","startTimemomentJs","endTimemomentJs","diff","handleClickTimeSlot","handleClickNextTimeSlot","firstSlot","id","FloatHeading","WelcomeMessage","ContinueButton","MountedAnimationWrapper","mounted","setMounted","useMountAndUnmount","animationClassName","CSSTransition","in","classNames","timeout","enter","exit","APPOINTMENT_ACTION","DATASOURCE_ACTION","CONFIG_ACTION","BOOKING_ACTION","WAITING_LIST_ACTION","FORM_ACTION","selectAppointmentType","setAppointmentValue","selectLocation","timeZoneId","selectPractitioner","selectAppointmentDateTime","source","axios","CancelToken","isCancel","requests","getSuburbList","httpClient","baseUrl","setUrl","get","requestUrl","getUrl","query","newTab","tokenQuery","post","cancelToken","stringify","postAll","all","postFormData","file","formData","FormData","append","forEach","onUploadProgress","remove","delete","uploadFileToS3","presignedUrl","put","portalService","locationGroupId","queryString","locationIds","specialtyId","start","end","phoneConsult","token","locationStr","smsModel","address","isNewClient","appointmentId","paramsObj","qs","clientId","fileSize","attributeNames","consumerId","geolocationService","setConfig","setLoadedData","loaded","setSpecialtyTypes","filtedSpecialtyTypes","f","setDatasourceValue","setPractitioners","setLocations","setTimeZones","setSchedules","toggleLoadingTimeSlots","setTimeSlots","concat","setPosition","dispatch","getState","data","getIntakeFormFileList","isDownloadDocumentAllowed","previewInIOS","windowOpener","write","fileByte","blob","Blob","fileUrl","URL","createObjectURL","getTimeslotsByPractitionersAndLocations","practitionerIds","ts","getOnlinePaymentToken","applicationAttributes","attributeName","attributeValue","onlinePaymentIsTest","setVerifyDrawerOpen","sendingVerificationCode","mobile","mobileNumber","getCreditCardToken","creditCardNumber","creditCardExpiry","creditCardName","creditCardSecurityCode","expiry_month","expiry_year","cvc","address_line1","address_city","address_country","response","console","submitBookingWithoutFiles","verificationCode","recaptchaToken","creditCardToken","createBookingModel","goToPage","updateAppointmentId","updateAppointmentCancelled","getResponseErrorMessage","submitBookingWithFiles","fileIdList","clientObj","clients","getClientResponse","isNewClientFlag","client","createClientResponse","newPassingClientObject","uploadFiles","files","appointmentResponse","createFileAssociations","createFileResponse","fileId","Item1","Item2","association","associatedEntity","associatedPrimaryDomainKey","associationType","timeZoneOfLocation","middleName","preferredName","email","dateOfBirth","comments","healthFund","cardPosition","customFields","clientAddress","clientSuburb","clientPostcode","medicareNumber","medicareExpiry","confirmationText","reCaptchaEnabled","isHidingLocationEnabled","isPhoneConsult","locationTextAndPosition","practitionerText","appointmentDateTimeText","enteredComments","timezoneText","timezoneList","getTimezoneText","timezoneIdentifier","appointmentParams","notes","smsVerifyCode","bookingDetails","createBookingDetailsText","coordinate","appointmentTypeName","serviceName","locationAddress","waitingListProps","addToWaitingList","clientParams","phoneNumberMobile","healthFundProviderId","healthFundMembershipNumber","healthFundCardPosition","homePostcode","cf","cardToken","medicareCardNumber","medicareCardIRN","getMedicareNumberAndIRNFromString","medicareCardExpireDate","expiry","getMedicareExpiryDateFromString","appointmentTimeText","modelState","goToNextStep","currentStep","practitionerFirst","showTimeZone","extraConfig","booking","foundIndex","nextStep","findNextStep","remainingStep","newSteps","stepsToBeClear","clearSteps","toggleVisibility","visiable","cancelled","getSuburbs","searchText","pageNumber","pageSize","useGetTimeSlotList","filterTimeSlotsByLocationAndPractitioner","selectSpecialtyType","selectTimeZone","initLoad","cancel","timezoneValue","filteredTimeSlots","time","welcomeMessage","preSelectSpecialtyType","specialtyHintText","appointmentTypeHintText","practitionerHintText","locationHintText","timezoneHintText","appointmentDateTimeHintText","visibilityKey","specialtyTypeList","useGetSpecialtyTypeList","appointmentTypeList","selectedSpecialtyType","specialty","sort","b","nameA","nameB","useGetAppointmentTypeList","schedulesCopy","locationCopy","useGetLocationList","practitionersCopy","schedulesFilteredByLocation","useGetPractitionerList","timeSlotsList","useGetAvailableLocations","availablePractitioners","practitionersFilteredBySpecialty","useGetAvailablePractitioners","handleGetPositions","useGetPositions","handleSelectSpecialtyType","useSelectSpecialtyType","handleSelectAppointmentType","useSelectAppointmentType","handleSelectLocation","foundedTimeZone","timeZoneIdOfLocation","useSelectLocation","handleSelectPractitioner","useSelectPractitioner","handleSelectTimeZone","useSelectTimeZone","handleSelectAppointmentDateTime","anyPractitioner","anyLocation","matchedTimeSlots","firstMatch","useSelectAppointmentDateTime","handleSelectWaitingListPreferredTime","useSelectWaitingListPreferredTime","handleContinueButtonClick","finished","renderSteps","stepKey","VerificationDrawer","recaptchaRef","verificationCount","setVerificationCount","verificationError","setVerificationError","recaptchaValid","setRecaptchaValid","setRecaptchaToken","submitBooking","verifyCode","useRecaptcha","handleInputChange","handleCancel","handleResend","handleConfirm","verified","count","handleVerifyRecaptcha","sitekey","render","FormInput","formKey","onValidate","maxLength","regexRule","handleBlur","DateOfBirth","dobRef","focused","setFocused","handleDocumentClick","handleFocus","handleCalendarIconClick","prevState","InputProps","inputComponent","DOBMaskedInput","onFocus","show","inputRef","inputElement","mask","Fade","Comments","HealthFund","healthFunds","MedibankCustomFields","handleCustomFieldChange","checked","Grid","container","md","xs","Checkbox","MedibankFields","MedibankFundId","healthFundValue","cardNumberValue","cardPositionValue","customFieldsValue","isMedibank","spacing","sm","ClientAddress","ClientSuburb","setData","setLoading","dataSource","geoLocationId","SuburbId","PostCode","suburbName","SuburbName","State","log","selectedLocation","ClientPostcode","FileUploader","setFiles","hideFileUploader","useDropzone","onDrop","acceptedFiles","getRootProps","getInputProps","UploadDocument","removeIndex","setRemoveIndex","setErrorText","removeFile","instruction","resetRemoveIndex","proptypes","Proptypes","array","isRequired","func","string","boolean","IntakeForm","downloadDocumentInstruction","downloadFile","DownloadFileItem","ConfirmationPolicy","customerConfirmationPolicy","MedicareInformation","numberError","expiryDateError","handleNumberChange","handleExpiryChange","handleCloseExpiry","MedicareMaskedInput","CreditCard","nameError","securityCodeError","placement","PersonalDetailsForm","firstNameValue","middleNameValue","preferredNameValue","lastNameValue","birthdayValue","mobileValue","emailValue","commentsValue","clientAddressValue","clientSuburbValue","clientPostcodeValue","errors","mobileHintDescription","isCommentsEnabled","isCommentsMandatory","isClientAddressMandatory","isClientAddressEnabled","isMedicareEnabled","isUploadDocumentEnabled","isUploadDocumentMandatory","uploadDocumentInstruction","isCreditCardMandatory","intakeFormFiles","showCreditCard","handleValidation","handleAddressFieldsValidation","addressKey","primaryKey","secondaryKey","primaryValue","secondaryValue","primaryError","secondError","currentError","SummaryListItem","notClickable","renderIcon","SummaryDesktop","links","onClickLink","onClickButton","hidingLocationEnabled","link","hidden","marginBottom","SummaryMobile","AppointmentSummary","onClickAppointmentLink","onClickAppointmentButton","hideSpecialty","getHideSpecialty","hidePractitioner","getHidePractitioner","MANDATORY_LIST","setFormValueByKey","setFormErrorTextByKey","code","onClickPlaceBooking","filesInStore","filesInStoreNames","d","fileIndex","msSaveOrOpenBlob","body","download","click","parentNode","removeChild","revokeObjectURL","medicareNumberValue","medicareExpiryValue","shouldFillingMedicareInfo","showFillingCreditCardInfo","customMandatoryList","mandatoryList","btnDisabled","errorList","mandatoryListCheck","customMandatoryListCheck","handleClickAppointmentLink","prevStep","handleClickBack","handleClickBooking","isVerifyDrawerOpen","BookingDetailsItem","getYahooCalendarUrl","yahooCalendarUrl","encodeURI","getGoogleCalendarUrl","googleCalendarUrl","printConfirmation","printContents","getElementById","popupWin","close","AddToCalendar","containerRef","setOpen","calendarAppointment","handleCalendarClick","fileDownload","prev","SpanTagItem","AtagItem","defaultStyle","makeNewBooking","waitingListConfirmationText","headerText","specialtyTypeAppointmentTypeText","appointmentStartTime","appointmentEndTime","handleClickCancel","cursor","textDecoration","CancellationReasons","reasonId","setReasonId","setReasonText","setNotes","cancelReasonList","RadioGroup","aria-label","x","focus","reason","FormControlLabel","control","Radio","multiline","rowsMax","rows","variant","HAS_APPOINTMENT_ID_IN_URL","showSuccess","reasonText","setCancelReasonList","getCancellationReasons","getConfig","getAppointmentDetails","getSpecialties","isCancelled","configResponse","specialtiesResponse","getErrorMessage","pracDictionary","locDictionary","status","reasonListInUI","reasons","DisplayOrder","Name","Id","displayOrder","handleCancelAppointment","cancellationReasonId","cancellationNotes","appointmentStartDateTime","appointmentEndDateTime","initialLoad","getPractitioners","getLocations","getTimezones","getSchedules","spread","configRes","specialtiesRes","practitionersRes","locationsRes","timezonesRes","timezones","locationTimezones","catch","hasLocationGroup","locationsFilteredBySchedules","loadedData","googleAnalyticsCode","trackingId","script1","async","script2","createGoogleAnalyticsScriptTag","renderPage","showLeftPanel","Routes","INITIAL_STATE","clearAppointmentByKeys","action","clearAppointmentObj","setLocationAndItsTimeZone","timeZoneOfLocationData","confirmationSmsText","hideSpecialties","logoFileName","isTimezoneMandatory","isMedicareMandatory","appointmentNotWithinHrs","appointmentNotAfterDays","appointmentMinCancelHrs","isNotifyPractitionerEmails","notifyPractitionerEmails","updateDataSource","updateTimeSlots","handlePositionLoad","handleSetError","newError","handleToggleVerificationDrawer","handleMakeNewBookingForForms","remainingObj","handleSetFiles","newFiles","handleRemoveFile","handleRequireWaitingList","preferredTimeObj","rootReducer","combineReducers","path","composeEnhancers","compose","store","createStore","applyMiddleware","thunk","ReactDOM"],"mappings":"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AM,2BAER,CACE3F,MAAO,uCACP2F,KAAM,0BAER,CACE3F,MAAO,uCACP2F,KAAM,cAER,CACE3F,MAAO,uCACP2F,KAAM,aAER,CACE3F,MAAO,uCACP2F,KAAM,kCAER,CACE3F,MAAO,uCACP2F,KAAM,aAER,CACE3F,MAAO,uCACP2F,KAAM,OAER,CACE3F,MAAO,uCACP2F,KAAM,wBAER,CAAE3F,MAAO,uCAAwC2F,KAAM,OACvD,CACE3F,MAAO,uCACP2F,KAAM,yBAER,CACE3F,MAAO,uCACP2F,KAAM,8CAER,CACE3F,MAAO,uCACP2F,KAAM,mBAER,CACE3F,MAAO,uCACP2F,KAAM,iBAER,CACE3F,MAAO,uCACP2F,KAAM,sDAER,CACE3F,MAAO,uCACP2F,KAAM,eAER,CACE3F,MAAO,uCACP2F,KAAM,+BAER,CACE3F,MAAO,uCACP2F,KAAM,8BAER,CACE3F,MAAO,uCACP2F,KAAM,qBAER,CACE3F,MAAO,uCACP2F,KAAM,sBAER,CACE3F,MAAO,uCACP2F,KAAM,wBAER,CACE3F,MAAO,uCACP2F,KAAM,sCAER,CACE3F,MAAO,uCACP2F,KAAM,oBAER,CACE3F,MAAO,uCACP2F,KAAM,eAER,CACE3F,MAAO,uCACP2F,KAAM,wBAER,CACE3F,MAAO,uCACP2F,KAAM,eAER,CACE3F,MAAO,uCACP2F,KAAM,+BAER,CACE3F,MAAO,uCACP2F,KAAM,2BAER,CACE3F,MAAO,uCACP2F,KAAM,iBAER,CACE3F,MAAO,uCACP2F,KAAM,iCAER,CACE3F,MAAO,uCACP2F,KAAM,4BAER,CACE3F,MAAO,uCACP2F,KAAM,sBAER,CACE3F,MAAO,uCACP2F,KAAM,kBAER,CACE3F,MAAO,uCACP2F,KAAM,oCAER,CACE3F,MAAO,uCACP2F,KAAM,yBAER,CACE3F,MAAO,uCACP2F,KAAM,+BAER,CACE3F,MAAO,uCACP2F,KAAM,8BAER,CACE3F,MAAO,uCACP2F,KAAM,wBAER,CACE3F,MAAO,uCACP2F,KAAM,YAER,CACE3F,MAAO,uCACP2F,KAAM,UD7JewhC,YACzBhL,aErCmB,CA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","file":"static/js/main.chunk.js","sourcesContent":["import { Component } from \"react\";\r\n//import { withRouter } from \"react-router-dom\";\r\n\r\nclass AppBoundary extends Component {\r\n  componentDidCatch = () => {\r\n    //error\r\n  };\r\n  static getDerivedStateFromError(error) {}\r\n\r\n  componentDidUpdate = () => {\r\n    const { error, success, redirect, history } = this.props;\r\n    if (error) {\r\n      //error\r\n    }\r\n    if (success) {\r\n      //success\r\n    }\r\n    if (redirect) {\r\n      history.push(redirect);\r\n    }\r\n    if (error || success || redirect) {\r\n      //clear();\r\n    }\r\n  };\r\n\r\n  render() {\r\n    return this.props.children;\r\n  }\r\n}\r\n\r\nexport default AppBoundary;\r\n","import React from \"react\";\r\n\r\nconst styles = {\r\n  overlayStyle: {\r\n    width: \"100%\",\r\n    height: \"100%\",\r\n    zIndex: \"9999\",\r\n    position: \"fixed\",\r\n    left: \"0\",\r\n    top: \"0\",\r\n    background: \"rgba(0,0,0,0.3)\"\r\n  }\r\n};\r\n\r\nconst Overlay = props => {\r\n  return <div style={styles.overlayStyle}>{props.children}</div>;\r\n};\r\n\r\nexport { Overlay };\r\n","import React from \"react\";\r\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\r\nimport { Overlay } from \"./Overlay\";\r\nconst styles = {\r\n  spinnerStyle: {\r\n    position: \"fixed\",\r\n    left: \"50%\",\r\n    top: \"50%\",\r\n    marginLeft: \"-25px\",\r\n    marginTop: \"-25px\"\r\n  }\r\n};\r\n\r\nconst Spinner = props => {\r\n  return props.spinning ? (\r\n    <Overlay>\r\n      <CircularProgress size={50} thickness={4} style={styles.spinnerStyle} />\r\n    </Overlay>\r\n  ) : null;\r\n};\r\n\r\nexport { Spinner };\r\n","export const replaceElementByIndex = (arr, index, newElement) => {\r\n  if (index >= arr.length || index < 0) return [...arr];\r\n  return [...arr.slice(0, index), newElement, ...arr.slice(index + 1)];\r\n};\r\n\r\nexport const deleteElementByIndex = (arr, index) => {\r\n  if (index >= arr.length || index < 0) return [...arr];\r\n  return [...arr.slice(0, index), ...arr.slice(index + 1)];\r\n};\r\n\r\nexport const removeElement = (array, element) => {\r\n  const index = array.indexOf(element);\r\n  return deleteElementByIndex(array, index);\r\n};\r\n\r\nexport const removeElements = (array, elements) => {\r\n  return elements.reduce((prev, curr) => {\r\n    return removeElement(prev, curr);\r\n  }, array);\r\n};\r\n\r\nexport const swapItems = (items, firstIndex, secondIndex) => {\r\n  // Constant reference - we can still modify the array itself\r\n  const results = items.slice();\r\n  const firstItem = items[firstIndex];\r\n  results[firstIndex] = items[secondIndex];\r\n  results[secondIndex] = firstItem;\r\n\r\n  return results;\r\n};\r\n","export const getKey = obj => {\r\n  return Object.keys(obj)[0];\r\n};\r\n\r\nexport const deepGet = (obj, props, defaultValue = \"\") => {\r\n  // If we have reached an undefined/null property\r\n  // then stop executing and return the default value.\r\n  // If no default was provided it will be undefined.\r\n  if (obj === undefined || obj === null) {\r\n    return defaultValue;\r\n  }\r\n\r\n  // If the path array has no more elements, we've reached\r\n  // the intended property and return its value\r\n  if (props.length === 0) {\r\n    return obj;\r\n  }\r\n\r\n  // Prepare our found property and path array for recursion\r\n  const foundSoFar = obj[props[0]];\r\n  const remainingProps = props.slice(1);\r\n\r\n  return deepGet(foundSoFar, remainingProps, defaultValue);\r\n};\r\nexport const isGuid = value => {\r\n  var regex = /[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}/i;\r\n  var match = regex.exec(value);\r\n  return match != null;\r\n};\r\n\r\nexport const getValueOrDefault = (obj, key, defaultVal = \"\") => {\r\n  if (obj === null || typeof obj === \"undefined\") return defaultVal;\r\n\r\n  let returnVal = obj[key];\r\n\r\n  if (\r\n    typeof returnVal === \"undefined\" ||\r\n    returnVal === null ||\r\n    returnVal === \"\"\r\n  ) {\r\n    return defaultVal;\r\n  }\r\n  return obj[key];\r\n};\r\n\r\nexport const deepAssign = (initial, value, keys) => {\r\n  if (keys.length === 1) {\r\n    const key = keys[0];\r\n    return { ...initial, [key]: value };\r\n  }\r\n\r\n  const getByKeys = (keys, initial) => {\r\n    const currentVal = keys.reduce((current, key) => {\r\n      return current[key];\r\n    }, initial);\r\n    const firstKey = keys.reverse()[0];\r\n    return { [firstKey]: currentVal };\r\n  };\r\n\r\n  let index = 0;\r\n  return keys.reduce((current, key) => {\r\n    const currentIndex = keys.length - index - 1;\r\n    const remainingKeys = keys.slice(0, currentIndex);\r\n    const currentKey = keys[currentIndex];\r\n\r\n    if (currentIndex - 1 >= 0) {\r\n      const parentKey = keys[currentIndex - 1];\r\n      let parentProp = getByKeys(remainingKeys, initial);\r\n      const currentValue = index === 0 ? value : current[currentKey];\r\n      const props = { ...parentProp[parentKey], [currentKey]: currentValue };\r\n      index++;\r\n      return { [parentKey]: props };\r\n    } else {\r\n      return { ...initial, ...current };\r\n    }\r\n  }, {});\r\n};\r\n","export const arrayToQueryString = (array, key) => {\r\n  return array.map(a => `${key}=${a}`).join(\"&\");\r\n};\r\n\r\nexport const toQueryString = paramsObject => {\r\n  return Object.keys(paramsObject)\r\n    .filter(key => paramsObject[key] != null)\r\n    .map(\r\n      key =>\r\n        `${encodeURIComponent(key)}=${encodeURIComponent(paramsObject[key])}`\r\n    )\r\n    .join(\"&\");\r\n};\r\n\r\nexport const getParameterByName = (name, url) => {\r\n  if (!url) url = window.location.href;\r\n  name = name.replace(/[[\\]]/g, \"\\\\$&\");\r\n  var regex = new RegExp(\"[?&]\" + name.toLowerCase() + \"(=([^&#]*)|&|#|$)\"),\r\n    results = regex.exec(url.toLowerCase());\r\n  if (!results) return null;\r\n  if (!results[2]) return \"\";\r\n  return decodeURIComponent(results[2].replace(/\\+/g, \" \"));\r\n};\r\n","const checkZero = data => {\r\n  if (data.toString().length === 1) {\r\n    data = \"0\" + data;\r\n  }\r\n  return data;\r\n};\r\n\r\nexport const isSameDay = (day1, day2) => {\r\n  if (!day1 || !day2) return false;\r\n  return (\r\n    day1.getDate() === day2.getDate() &&\r\n    day1.getMonth() === day2.getMonth() &&\r\n    day1.getFullYear() === day2.getFullYear()\r\n  );\r\n};\r\n\r\nexport const isSameMonth = (day1, day2) => {\r\n  return (\r\n    day1.getMonth() === day2.getMonth() &&\r\n    day1.getFullYear() === day2.getFullYear()\r\n  );\r\n};\r\n\r\nexport const isDayIncluded = (day, days) => {\r\n  return days.some(d => isSameDay(d, day));\r\n};\r\n\r\nexport const getDatePart = day => {\r\n  return new Date(day.getFullYear(), day.getMonth(), day.getDate());\r\n};\r\n\r\nexport const getYearMonthPart = day => {\r\n  return new Date(day.getFullYear(), day.getMonth());\r\n};\r\n\r\nexport const formatDate = day => {\r\n  return (\r\n    checkZero(day.getDate()) +\r\n    \"/\" +\r\n    checkZero(day.getMonth() + 1) +\r\n    \"/\" +\r\n    day.getFullYear()\r\n  );\r\n};\r\n\r\nexport const formatMoment = moment => {\r\n  return moment.format(\"YYYY-MM-DDTHH:mm:ss\");\r\n};\r\n\r\nexport const getDistinctDateFormats = (moments, format) => {\r\n  return moments\r\n    .map(moment => moment.format(format))\r\n    .reduce((current, next) => {\r\n      if (!current.includes(next)) {\r\n        current.push(next);\r\n      }\r\n      return current;\r\n    }, []);\r\n};\r\n","export const isMobileDevice = () => {\r\n  if (\r\n    /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\r\n      navigator.userAgent\r\n    )\r\n  ) {\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\nexport const isIOSDevice =\r\n  /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;\r\n\r\nexport const detectIE = () => {\r\n  var ua = window.navigator.userAgent;\r\n\r\n  // Test values; Uncomment to check result …\r\n\r\n  // IE 10\r\n  // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)';\r\n\r\n  // IE 11\r\n  // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko';\r\n\r\n  // Edge 12 (Spartan)\r\n  // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0';\r\n\r\n  // Edge 13\r\n  // ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586';\r\n\r\n  var msie = ua.indexOf(\"MSIE \");\r\n  if (msie > 0) {\r\n    // IE 10 or older => return version number\r\n    return true;\r\n  }\r\n\r\n  var trident = ua.indexOf(\"Trident/\");\r\n  if (trident > 0) {\r\n    // IE 11 => return version number\r\n    return true;\r\n  }\r\n\r\n  var edge = ua.indexOf(\"Edge/\");\r\n  if (edge > 0) {\r\n    // Edge (IE 12+) => return version number\r\n    return true;\r\n  }\r\n\r\n  // other browser\r\n  return false;\r\n};\r\n","export const blurInputWhenTypeEnter = e => {\r\n  if (e.which === 13 && document.activeElement === e.target) {\r\n    e.target.blur();\r\n  }\r\n};\r\n\r\n// copy text to Clipboard\r\nexport function copyTextToClipboard(text, cb = () => {}) {\r\n  if (!navigator.clipboard) {\r\n    fallbackCopyTextToClipboard(text, cb);\r\n    return;\r\n  }\r\n  navigator.clipboard.writeText(text).then(\r\n    function() {\r\n      //console.log(\"Async: Copying to clipboard was successful!\");\r\n      cb();\r\n    },\r\n    function(err) {\r\n      console.error(\"Async: Could not copy text: \", err);\r\n    }\r\n  );\r\n}\r\n\r\n// for browsers which does not support navigator.clipboard\r\nfunction fallbackCopyTextToClipboard(text, cb = () => {}) {\r\n  var textArea = document.createElement(\"textarea\");\r\n  textArea.value = text;\r\n  document.body.appendChild(textArea);\r\n  textArea.focus();\r\n  textArea.select();\r\n  try {\r\n    document.execCommand(\"copy\");\r\n    //var msg = successful ? \"successful\" : \"unsuccessful\";\r\n    //console.log(\"Fallback: Copying text command was \" + msg);\r\n    cb();\r\n  } catch (err) {\r\n    console.error(\"Fallback: Oops, unable to copy\", err);\r\n  }\r\n  document.body.removeChild(textArea);\r\n}\r\n\r\nexport function insertAtCursor(input, textToInsert, currentValue) {\r\n  let value = currentValue == null ? input.value : currentValue;\r\n\r\n  const start = input.selectionStart;\r\n  const end = input.selectionEnd;\r\n\r\n  value = value.slice(0, start) + textToInsert + value.slice(end);\r\n  if (currentValue == null) {\r\n    input.value = value;\r\n  }\r\n  input.selectionStart = input.selectionEnd = start + textToInsert.length;\r\n  return value;\r\n}\r\n\r\nexport function darkenColor(hexCode, amt = 10) {\r\n  if (hexCode[0] !== \"#\") {\r\n    return hexCode;\r\n  }\r\n  var col = hexCode.slice(1);\r\n  if (col.length === 3) {\r\n    col = col\r\n      .split(\"\")\r\n      .map(function(hex) {\r\n        return hex + hex;\r\n      })\r\n      .join(\"\");\r\n  }\r\n  return darken(col, amt);\r\n}\r\n\r\nfunction darken(color, amount) {\r\n  color = color.indexOf(\"#\") >= 0 ? color.substring(1, color.length) : color;\r\n  amount = parseInt((255 * amount) / 100);\r\n  return (color =\r\n    \"#\" +\r\n    subtractLight(color.substring(0, 2), amount) +\r\n    subtractLight(color.substring(2, 4), amount) +\r\n    subtractLight(color.substring(4, 6), amount));\r\n}\r\n\r\nfunction subtractLight(color, amount) {\r\n  var colorHex = parseInt(color, 16) - amount;\r\n  var colorResult = colorHex < 0 ? 0 : colorHex;\r\n  colorResult =\r\n    colorResult.toString(16).length > 1\r\n      ? colorResult.toString(16)\r\n      : \"0\" + colorResult.toString(16);\r\n  return colorResult;\r\n}\r\n\r\nexport function lightenColor(color, amount = 20) {\r\n  color = color.indexOf(\"#\") >= 0 ? color.substring(1, color.length) : color;\r\n  amount = parseInt((255 * amount) / 100);\r\n  return (color = `#${addLight(color.substring(0, 2), amount)}${addLight(\r\n    color.substring(2, 4),\r\n    amount\r\n  )}${addLight(color.substring(4, 6), amount)}`);\r\n}\r\n\r\nfunction addLight(color, amount) {\r\n  let cc = parseInt(color, 16) + amount;\r\n  let c = cc > 255 ? 255 : cc;\r\n  c = c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}`;\r\n  return c;\r\n}\r\n\r\nlet requestAnimationFrame =\r\n  window.requestAnimationFrame ||\r\n  window.mozRequestAnimationFrame ||\r\n  window.webkitRequestAnimationFrame ||\r\n  window.msRequestAnimationFrame;\r\nif (!requestAnimationFrame) {\r\n  requestAnimationFrame = window.setTimeout;\r\n}\r\nrequestAnimationFrame = window.setTimeout;\r\nwindow.requestAnimationFrame = requestAnimationFrame;\r\n\r\nexport const elementScrollTop = (identifier, destination, adjustment = 0) => {\r\n  scrollTo(\r\n    document.querySelector(identifier),\r\n    document.querySelector(destination).offsetTop + adjustment,\r\n    30\r\n  );\r\n};\r\n\r\nconst scrollTo = (element, to, duration) => {\r\n  if (\r\n    duration <= 0 ||\r\n    (element.scrollHeight - element.clientHeight > 0 &&\r\n      element.scrollTop === element.scrollHeight - element.clientHeight)\r\n  ) {\r\n    return;\r\n  }\r\n\r\n  var difference = to - element.scrollTop;\r\n  var perTick = (difference / duration) * 1;\r\n\r\n  requestAnimationFrame(() => {\r\n    element.scrollTop += perTick;\r\n    scrollTo(element, to, duration - 1);\r\n  });\r\n};\r\n\r\nexport const getDomStyleProperty = (dom, property) => {\r\n  return window.getComputedStyle(dom, null).getPropertyValue(property);\r\n};\r\n\r\nexport const getDocumentDom = identifier => {\r\n  return document.querySelector(identifier);\r\n};\r\n\r\nexport const isLightColor = hexcolor => {\r\n  // If a leading # is provided, remove it\r\n  if (hexcolor.slice(0, 1) === \"#\") {\r\n    hexcolor = hexcolor.slice(1);\r\n  }\r\n\r\n  // If a three-character hexcode, make six-character\r\n  if (hexcolor.length === 3) {\r\n    hexcolor = hexcolor\r\n      .split(\"\")\r\n      .map(function(hex) {\r\n        return hex + hex;\r\n      })\r\n      .join(\"\");\r\n  }\r\n\r\n  // Convert to RGB value\r\n  var r = parseInt(hexcolor.substr(0, 2), 16);\r\n  var g = parseInt(hexcolor.substr(2, 2), 16);\r\n  var b = parseInt(hexcolor.substr(4, 2), 16);\r\n\r\n  // Get YIQ ratio\r\n  var yiq = (r * 299 + g * 587 + b * 114) / 1000;\r\n\r\n  // Check contrast\r\n  return yiq >= 180;\r\n};\r\n","import React, { memo, useMemo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Dialog from \"@material-ui/core/Dialog\";\r\nimport { deepGet } from \"../../../utils\";\r\nimport \"./Notification.less\";\r\n\r\nexport const Notification = memo(props => {\r\n  const { error, success, clear } = props;\r\n  const isError = !!error && !success;\r\n  const message = isError ? error : success;\r\n\r\n  const messageInUI = useMemo(\r\n    () => (typeof message === \"string\" ? { text: message } : message),\r\n    [message]\r\n  );\r\n  const canDismiss = deepGet(messageInUI, [\"canDismiss\"], false);\r\n  return (\r\n    <Dialog\r\n      classes={{\r\n        root: \"zindex-message\",\r\n        paperScrollPaper: \"notification-container\"\r\n      }}\r\n      open={!!message}\r\n    >\r\n      <div className=\"notification-content\">\r\n        {!!message && (\r\n          <div className=\"notification-content-text\">\r\n            <i\r\n              className={`material-icons ${\r\n                isError ? \"red-color\" : \"green-color\"\r\n              }`}\r\n            >\r\n              {isError ? \"close\" : \"done\"}\r\n            </i>\r\n            {deepGet(messageInUI, [\"text\"])}\r\n          </div>\r\n        )}\r\n\r\n        {canDismiss && (\r\n          <div className=\"notification-content-button\">\r\n            <button\r\n              className={`${isError ? \"red-button\" : \"green-button\"}`}\r\n              onClick={clear}\r\n            >\r\n              Ok\r\n            </button>\r\n          </div>\r\n        )}\r\n      </div>\r\n    </Dialog>\r\n  );\r\n});\r\n\r\nNotification.propTypes = {\r\n  error: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),\r\n  success: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),\r\n  clear: PropTypes.func\r\n};\r\n","export const csvManager = (function() {\r\n  var objectToCSVRow = function(dataObject) {\r\n    var dataArray = [];\r\n    for (var o in dataObject) {\r\n      var innerValue = dataObject[o] === null ? \"\" : dataObject[o].toString();\r\n      var result = innerValue.replace(/\"/g, '\"\"').replace(/(<([^>]+)>)/gi, \" \");\r\n      if (result.search(/(\"|,|\\n)/g) >= 0) result = '\"' + result + '\"';\r\n      dataArray.push(result);\r\n    }\r\n\r\n    return dataArray.join(\",\") + \"\\r\\n\";\r\n  };\r\n\r\n  var exportToCSV = function(arrayOfObjects) {\r\n    if (!arrayOfObjects.length) {\r\n      return;\r\n    }\r\n\r\n    var csvContent = \"data:text/csv;charset=utf-8,\";\r\n\r\n    // headers\r\n    csvContent += objectToCSVRow(Object.keys(arrayOfObjects[0]));\r\n\r\n    arrayOfObjects.forEach(function(item) {\r\n      csvContent += objectToCSVRow(item);\r\n    });\r\n\r\n    var encodedUri = encodeURI(csvContent);\r\n\r\n    var link = document.createElement(\"a\");\r\n    link.setAttribute(\"href\", encodedUri);\r\n    link.setAttribute(\"download\", \"waitinglist.csv\");\r\n    document.body.appendChild(link); // Required for FF\r\n    link.click();\r\n    document.body.removeChild(link);\r\n  };\r\n\r\n  return {\r\n    exportToCSV\r\n  };\r\n})();\r\n","export const APP_ACTION = {\r\n  SHOW_ERROR: \"app_action_show_error\",\r\n  SHOW_SUCCESS: \"app_action_show_success\",\r\n  CLEAR: \"app_action_clear\",\r\n  LOADING: \"app_action_loading\",\r\n  REDIRECT: \"app_action_redirect\"\r\n};\r\n","import { APP_ACTION } from './types';\r\n\r\nexport const updatePageHeader = pageHeader => {\r\n  return {\r\n    type: APP_ACTION.UPDATE_PAGE_HEADER,\r\n    payload: { pageHeader }\r\n  };\r\n};\r\n\r\nexport const loading = (loading = true) => {\r\n  return { type: APP_ACTION.LOADING, payload: { loading } };\r\n};\r\n\r\nexport const showError = error => {\r\n  return { type: APP_ACTION.SHOW_ERROR, payload: { error } };\r\n};\r\n\r\nexport const showSuccess = success => {\r\n  return { type: APP_ACTION.SHOW_SUCCESS, payload: { success } };\r\n};\r\n\r\nexport const redirect = path => {\r\n  return {\r\n    type: APP_ACTION.REDIRECT,\r\n    payload: { path }\r\n  };\r\n};\r\n\r\nexport const clear = () => {\r\n  return { type: APP_ACTION.CLEAR };\r\n};\r\n\r\nexport * from './types';\r\n","export const STEP_KEYS = {\r\n  SPECIALTY_TYPE: \"specialtyType\",\r\n  APPOINTMENT_TYPE: \"appointmentType\",\r\n  PRACTITIONER: \"practitioner\",\r\n  LOCATION: \"location\",\r\n  TIMEZONE: \"timezone\",\r\n  APPOINTMENT_DATE_TIME: \"appointmentDateTime\"\r\n};\r\n","import {\r\n  darkenColor,\r\n  isLightColor\r\n  //lightenColor\r\n} from \"../../../utils\";\r\n\r\nconst themeString = sessionStorage.getItem(\"clientPortalTheme\");\r\nlet themeColor = \"#ed135d\";\r\nlet headerTheme = \"#ffffff\";\r\nif (themeString) {\r\n  try {\r\n    const themeJson = JSON.parse(themeString);\r\n    themeColor = themeJson[\"themeColor\"];\r\n    headerTheme = themeJson[\"headerTheme\"];\r\n  } catch (e) {}\r\n}\r\nconst THEME_COLOR = themeColor;\r\nconst THEME_COLOR_HOVER = darkenColor(THEME_COLOR);\r\nconst THEME_COLOR_HEADER = headerTheme;\r\n\r\nconst IS_LIGHT_THEME = isLightColor(THEME_COLOR);\r\nconst IS_LIGHT_HEADER = isLightColor(THEME_COLOR_HEADER);\r\n\r\nexport {\r\n  THEME_COLOR,\r\n  THEME_COLOR_HOVER,\r\n  THEME_COLOR_HEADER,\r\n  IS_LIGHT_THEME,\r\n  IS_LIGHT_HEADER\r\n};\r\n","export const FORM_KEYS = {\r\n  FIRST_NAME: 'firstName',\r\n  MIDDLE_NAME: 'middleName',\r\n  PREFERRED_NAME: 'preferredName',\r\n  LAST_NAME: 'lastName',\r\n  DATE_OF_BIRTH: 'dateOfBirth',\r\n  EMAIL: 'email',\r\n  MOBILE: 'mobile',\r\n  COMMENTS: 'comments',\r\n  CLIENT_ADDRESS: 'clientAddress',\r\n  CLIENT_SUBURB: 'clientSuburb',\r\n  CLIENT_POSTCODE: 'clientPostcode',\r\n  HEALTH_FUND: 'healthFund',\r\n  CARD_NUMBER: 'cardNumber',\r\n  CARD_POSITION: 'cardPosition',\r\n  CUSTOM_FIELDS: 'customFields',\r\n  FILES: 'files',\r\n  MEDICARE_NUMBER: 'medicareNumber',\r\n  MEDICARE_EXPIRY: 'medicareExpiry',\r\n  CREDIT_CARD_NUMBER: 'creditCardNumber',\r\n  CREDIT_CARD_EXPIRY: 'creditCardExpiry',\r\n  CREDIT_CARD_NAME: 'creditCardName',\r\n  CREDIT_CARD_SECURITY_CODE: 'creditCardSecurityCode'\r\n};\r\n","export const PAGE_KEYS = {\r\n  BOOKING: \"booking\",\r\n  CONTACT: \"contact\",\r\n  CONFIRM: \"confirm\",\r\n  CANCELLATION: \"cancellation\"\r\n};\r\n","export * from './stepKeys';\r\nexport * from './themeColor';\r\nexport * from './formKeys';\r\nexport * from './pageKeys';\r\n\r\nexport const ANY_SELECTION = 'ANY';\r\n\r\nexport const CANCELLATION_OTHER_REASON_ID =\r\n  '00000000-0000-0000-0000-000000000000';\r\n\r\nexport const MAX_FILE_SIZE = 10 * 1024 * 1024;\r\nexport const MAX_FILE_NUMBER = 5;\r\n\r\nexport const VALID_FILE_EXTENSION = [\r\n  'pdf',\r\n  'jpg',\r\n  'jpeg',\r\n  'png',\r\n  'gif',\r\n  'doc',\r\n  'docx',\r\n  'rtf',\r\n  'html',\r\n  'txt',\r\n  'msg',\r\n  'pages'\r\n];\r\nexport const SUPPORTED_FILE_TEXT = VALID_FILE_EXTENSION.map(extension =>\r\n  extension.toUpperCase()\r\n).join(', ');\r\n\r\nexport const DETECT_DUPLICATE_FILE_NAME_NUMBER = /.?\\(\\d+\\)$/g; // 123(10)\r\n\r\nexport const DEFAULT_FILE_ASSOCIATION_TYPE =\r\n  '2fc3c52d-752b-4ace-8418-9ecdd9f298d0';\r\nexport const DEFAULT_FILE_ASSOCIATION_ENTITY = 'Appointment';\r\n\r\nexport const ONLINE_PAYMENT_KEY_NAME = 'PublishableApiKey';\r\nexport const ONLINE_PAYMENT_IS_TEST = 'IsTest';\r\n","import React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { ThemeProvider, createMuiTheme } from \"@material-ui/core/styles\";\r\nimport AppBoundary from \"./components/AppBoundary\";\r\nimport { Spinner } from \"./components/Spinner\";\r\nimport { Notification } from \"./components/Notification\";\r\nimport { clear } from \"./actions\";\r\nimport { THEME_COLOR } from \"../ClientPortal/constants\";\r\n\r\nconst App = props => {\r\n  const { error, success, loading, redirect, clear, children } = props;\r\n\r\n  const outerTheme = createMuiTheme({\r\n    palette: {\r\n      primary: {\r\n        main: THEME_COLOR\r\n      }\r\n    }\r\n  });\r\n  return (\r\n    <ThemeProvider theme={outerTheme}>\r\n      <div>\r\n        <Notification error={error} success={success} clear={clear} />\r\n        <Spinner spinning={loading} />\r\n        <AppBoundary\r\n          error={error}\r\n          success={success}\r\n          redirect={redirect}\r\n          clear={clear}\r\n        >\r\n          {children}\r\n        </AppBoundary>\r\n      </div>\r\n    </ThemeProvider>\r\n  );\r\n};\r\n\r\nexport default connect(\r\n  state => {\r\n    return { ...state.app };\r\n  },\r\n  { clear }\r\n)(App);\r\n","import { useState, useCallback, useRef, useEffect } from \"react\";\r\n// Hook\r\n// Hook\r\nexport function useHover() {\r\n  const [value, setValue] = useState(false);\r\n\r\n  const ref = useRef(null);\r\n\r\n  const handleMouseEnter = useCallback(() => {\r\n    !value && setValue(true);\r\n  }, [value]);\r\n  const handleMouseLeave = useCallback(() => value && setValue(false), [value]);\r\n\r\n  useEffect(\r\n    () => {\r\n      const node = ref.current;\r\n      if (node) {\r\n        node.addEventListener(\"mouseenter\", handleMouseEnter);\r\n        node.addEventListener(\"mouseleave\", handleMouseLeave);\r\n\r\n        return () => {\r\n          node.removeEventListener(\"mouseenter\", handleMouseEnter);\r\n          node.removeEventListener(\"mouseleave\", handleMouseLeave);\r\n        };\r\n      }\r\n    },\r\n    [handleMouseEnter, handleMouseLeave] // Recall only if ref changes\r\n  );\r\n\r\n  return [ref, value];\r\n}\r\n","import { useEffect, useState } from \"react\";\r\n\r\nconst MobileMaxWidth = 767;\r\n\r\nexport function useCheckMobile() {\r\n  const [isMobile, setIsMobile] = useState(\r\n    () => window.innerWidth <= MobileMaxWidth\r\n  );\r\n\r\n  const onWindowSizeChange = () => {\r\n    const width = window.innerWidth;\r\n    setIsMobile(width <= MobileMaxWidth);\r\n  };\r\n\r\n  useEffect(() => {\r\n    window.addEventListener(\"resize\", onWindowSizeChange);\r\n    return () => window.removeEventListener(\"resize\", onWindowSizeChange);\r\n  }, []);\r\n\r\n  return isMobile;\r\n}\r\n","import React, { memo } from 'react';\r\nimport Icon from '@material-ui/core/Icon';\r\n\r\nexport const ListIcon = memo(props => {\r\n  return <MaterialUIIcon iconKey=\"list\" {...props} />;\r\n});\r\n\r\nexport const ArrowDownIcon = memo(props => {\r\n  return <MaterialUIIcon iconKey=\"keyboard_arrow_down\" {...props} />;\r\n});\r\n\r\nexport const ArrowTopIcon = memo(props => {\r\n  return <MaterialUIIcon iconKey=\"keyboard_arrow_up\" {...props} />;\r\n});\r\n\r\nexport const DoneIcon = memo(props => {\r\n  return <MaterialUIIcon iconKey=\"done\" {...props} />;\r\n});\r\n\r\nexport const CloseIcon = memo(props => {\r\n  return <MaterialUIIcon iconKey=\"close\" {...props} />;\r\n});\r\n\r\nexport const InfoIcon = memo(props => {\r\n  return <MaterialUIIcon iconKey=\"info\" {...props} />;\r\n});\r\n\r\nexport const PhoneIcon = memo(props => {\r\n  return <MaterialUIIcon iconKey=\"phone\" {...props} />;\r\n});\r\n\r\nexport const EditIcon = memo(props => {\r\n  return <MaterialUIIcon iconKey=\"mode_edit\" {...props} />;\r\n});\r\n\r\nexport const CalendarIcon = memo(props => {\r\n  return <MaterialUIIcon iconKey=\"date_range\" {...props} />;\r\n});\r\n\r\nexport const CreditCardIcon = memo(props => {\r\n  return <MaterialUIIcon iconKey=\"credit_card\" {...props} />;\r\n});\r\n\r\nexport const HelpIcon = memo(props => {\r\n  return <MaterialUIIcon iconKey=\"help\" {...props} />;\r\n});\r\n\r\nexport const MaterialUIIcon = memo(({ iconKey, ...restProps }) => {\r\n  return <Icon {...restProps}>{iconKey}</Icon>;\r\n});\r\n","import React, { memo, useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nexport const PageLogo = memo(props => {\r\n  const [error, setError] = useState(\"\");\r\n  const { tenant } = props;\r\n  if (!tenant || error) return null;\r\n  return (\r\n    <img\r\n      src={`/${tenant}/api/portalsettings/LogoImage`}\r\n      alt=\"logo\"\r\n      onError={() => setError(\"load logo failed\")}\r\n    />\r\n  );\r\n});\r\n\r\nPageLogo.propTypes = {\r\n  tenant: PropTypes.string\r\n};\r\n","import React, { createContext, memo, useState } from \"react\";\r\n\r\nexport const DrawerContext = createContext();\r\n\r\nexport const DrawerContextProvider = memo(({ children }) => {\r\n  const [drawerOpen, setDrawerOpen] = useState(false);\r\n  return (\r\n    <DrawerContext.Provider value={{ drawerOpen, setDrawerOpen }}>\r\n      {children}\r\n    </DrawerContext.Provider>\r\n  );\r\n});\r\n","import React, {\r\n  memo,\r\n  useState,\r\n  useCallback,\r\n  useEffect,\r\n  useRef,\r\n  useContext\r\n} from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Headroom from \"react-headroom\";\r\nimport { PhoneIcon } from \"../Icon\";\r\nimport { PageLogo } from \"./PageLogo\";\r\nimport { DrawerContext } from \"../../context/DrawerContext\";\r\nimport { THEME_COLOR_HEADER, IS_LIGHT_HEADER } from \"../../constants\";\r\n\r\nconst headerBgColor = { background: THEME_COLOR_HEADER };\r\nconst contrastColor = IS_LIGHT_HEADER ? \"#333\" : \"#fafafa\";\r\nconst fontColor = { color: contrastColor };\r\nconst infoIconStyle = { color: contrastColor, borderColor: contrastColor };\r\nconst infoIconStyleOpen = {\r\n  color: THEME_COLOR_HEADER,\r\n  borderColor: contrastColor,\r\n  background: contrastColor\r\n};\r\nconst phoneIconStyle = { color: contrastColor };\r\n\r\nexport const PageHeaderMobile = memo(props => {\r\n  const menuRef = useRef();\r\n  const scrollRecordRef = useRef(window.scrollY);\r\n  const [openSubMenu, setOpenSubMenu] = useState(false);\r\n  const { drawerOpen } = useContext(DrawerContext);\r\n  const {\r\n    tenant,\r\n    displayPhoneNumber,\r\n    customerTermsUrl,\r\n    customerPrivacyPolicyUrl,\r\n    businessName,\r\n    isLogoOrBusinessName\r\n  } = props;\r\n\r\n  const handleClick = useCallback(\r\n    event => {\r\n      if (!openSubMenu) return;\r\n      const targetDom = event.target;\r\n      if (menuRef.current.contains(targetDom)) {\r\n        return;\r\n      }\r\n\r\n      setOpenSubMenu(false);\r\n    },\r\n    [openSubMenu]\r\n  );\r\n\r\n  const handleScroll = useCallback(\r\n    e => {\r\n      if (!openSubMenu) return;\r\n      const windowScrollY = window.scrollY;\r\n      const diff = Math.abs(windowScrollY - scrollRecordRef.current);\r\n      if (diff > 20) {\r\n        setOpenSubMenu(false);\r\n      }\r\n    },\r\n    [openSubMenu]\r\n  );\r\n  useEffect(() => {\r\n    document.addEventListener(\"click\", handleClick, false);\r\n    document.addEventListener(\"scroll\", handleScroll, false);\r\n    return () => {\r\n      document.removeEventListener(\"click\", handleClick, false);\r\n      document.removeEventListener(\"scroll\", handleScroll, false);\r\n    };\r\n  }, [handleClick, handleScroll]);\r\n\r\n  const businessNameFontStyle =\r\n    businessName && businessName.length > 40\r\n      ? {\r\n          fontSize: \"1em\"\r\n        }\r\n      : {};\r\n\r\n  return (\r\n    <Headroom\r\n      className={`client-portal-headroom ${drawerOpen ? \"fixed-headroom\" : \"\"}`}\r\n    >\r\n      <div className=\"page-header-small\" style={headerBgColor}>\r\n        <div className=\"page-header-small-left\">\r\n          {!isLogoOrBusinessName ? (\r\n            <PageLogo tenant={tenant} />\r\n          ) : (\r\n            <span\r\n              className=\"page-header-small-left-title\"\r\n              style={{ ...fontColor, ...businessNameFontStyle }}\r\n            >\r\n              {businessName}\r\n            </span>\r\n          )}\r\n        </div>\r\n        <div className=\"page-header-small-right\">\r\n          <div className=\"page-header-small-right-icons\">\r\n            <span\r\n              className=\"page-header-small-right-icons-info\"\r\n              onClick={(e) => {\r\n                e.stopPropagation();\r\n                setOpenSubMenu(prevOpen => !prevOpen);\r\n              }}\r\n              style={openSubMenu ? infoIconStyleOpen : infoIconStyle}\r\n            >\r\n              i\r\n            </span>\r\n            {displayPhoneNumber && (\r\n              <a\r\n                className=\"page-header-small-right-icons-phone-tag\"\r\n                href={`tel:${displayPhoneNumber}`}\r\n                style={phoneIconStyle}\r\n              >\r\n                <PhoneIcon className=\"page-header-small-right-icons-phone\" />\r\n              </a>\r\n            )}\r\n          </div>\r\n        </div>\r\n        <div\r\n          className={`page-header-small-submenu ${openSubMenu ? \"open\" : \"\"}`}\r\n          ref={menuRef}\r\n        >\r\n          <h2 className=\"page-header-small-submenu-top\">\r\n            <span className=\"page-header-small-submenu-top-text\">\r\n              Can't find the time you want?\r\n            </span>\r\n            <span className=\"page-header-small-submenu-top-phone\">\r\n              {displayPhoneNumber}\r\n            </span>\r\n          </h2>\r\n          <ul className=\"page-header-small-submenu-bottom\">\r\n            {customerTermsUrl && (\r\n              <li>\r\n                <a\r\n                  href={customerTermsUrl}\r\n                  target=\"_blank\"\r\n                  rel=\"noopener noreferrer\"\r\n                >\r\n                  Terms & Conditions\r\n                </a>\r\n              </li>\r\n            )}\r\n            {customerPrivacyPolicyUrl && (\r\n              <li>\r\n                <span className=\"page-header-small-submenu-bottom-divider\"></span>\r\n                <a\r\n                  href={customerPrivacyPolicyUrl}\r\n                  target=\"_blank\"\r\n                  rel=\"noopener noreferrer\"\r\n                >\r\n                  Privacy Policy\r\n                </a>\r\n              </li>\r\n            )}\r\n          </ul>\r\n          <svg\r\n            className=\"page-header-small-submenu-icon\"\r\n            xmlns=\"http://www.w3.org/2000/svg\"\r\n            viewBox=\"0 0 10 10\"\r\n            width={15}\r\n            height={15}\r\n          >\r\n            <polygon points=\"0,0 5,10 10,0\" fill={THEME_COLOR_HEADER} />\r\n          </svg>\r\n        </div>\r\n      </div>\r\n    </Headroom>\r\n  );\r\n});\r\n\r\nPageHeaderMobile.propTypes = {\r\n  logo: PropTypes.string,\r\n  displayPhoneNumber: PropTypes.string,\r\n  customerTermsUrl: PropTypes.string,\r\n  customerPrivacyPolicyUrl: PropTypes.string,\r\n  businessName: PropTypes.string,\r\n  isLogoOrBusinessName: PropTypes.number\r\n};\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { PageLogo } from \"./PageLogo\";\r\nimport { THEME_COLOR_HEADER, IS_LIGHT_HEADER } from \"../../constants\";\r\n\r\nconst headerBgColor = { background: THEME_COLOR_HEADER };\r\nconst contrastColor = IS_LIGHT_HEADER ? \"#333\" : \"#fafafa\";\r\nconst fontColor = { color: contrastColor };\r\nconst bgColor = { background: contrastColor };\r\n\r\nexport const PageHeaderDesktop = memo(props => {\r\n  const {\r\n    tenant,\r\n    displayPhoneNumber,\r\n    customerTermsUrl,\r\n    customerPrivacyPolicyUrl,\r\n    businessName,\r\n    isLogoOrBusinessName\r\n  } = props;\r\n\r\n  const businessNameFontStyle =\r\n    businessName && businessName.length > 40\r\n      ? {\r\n          fontSize: \"1.2em\"\r\n        }\r\n      : {};\r\n\r\n  return (\r\n    <div className=\"head-wrapper\">\r\n      <div className=\"page-header postion-fixed\" style={headerBgColor}>\r\n        <div className=\"page-header-left\">\r\n          {!isLogoOrBusinessName ? (\r\n            <PageLogo tenant={tenant} />\r\n          ) : (\r\n            <span\r\n              className=\"page-header-left-title\"\r\n              style={{ ...fontColor, ...businessNameFontStyle }}\r\n            >\r\n              {businessName}\r\n            </span>\r\n          )}\r\n        </div>\r\n        <div className=\"page-header-right\">\r\n          <h2 className=\"page-header-right-top\" style={fontColor}>\r\n            <span className=\"page-header-right-top-text\">\r\n              Can't find the time you want?\r\n            </span>\r\n            <span className=\"page-header-right-top-phone\">\r\n              {displayPhoneNumber}\r\n            </span>\r\n          </h2>\r\n          <ul className=\"page-header-right-bottom\">\r\n            {customerTermsUrl && (\r\n              <li>\r\n                <a\r\n                  href={customerTermsUrl}\r\n                  target=\"_blank\"\r\n                  rel=\"noopener noreferrer\"\r\n                  style={fontColor}\r\n                >\r\n                  Terms & Conditions\r\n                </a>\r\n              </li>\r\n            )}\r\n            {customerPrivacyPolicyUrl && (\r\n              <li>\r\n                <span\r\n                  className=\"page-header-right-bottom-divider\"\r\n                  style={bgColor}\r\n                ></span>\r\n                <a\r\n                  href={customerPrivacyPolicyUrl}\r\n                  target=\"_blank\"\r\n                  rel=\"noopener noreferrer\"\r\n                  style={fontColor}\r\n                >\r\n                  Privacy Policy\r\n                </a>\r\n              </li>\r\n            )}\r\n          </ul>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n});\r\n\r\nPageHeaderDesktop.propTypes = {\r\n  logo: PropTypes.string,\r\n  displayPhoneNumber: PropTypes.string,\r\n  customerTermsUrl: PropTypes.string,\r\n  customerPrivacyPolicyUrl: PropTypes.string,\r\n  businessName: PropTypes.string,\r\n  isLogoOrBusinessName: PropTypes.number\r\n};\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { useCheckMobile } from \"../../hooks\";\r\nimport { PageHeaderMobile } from \"./PageHeaderMobile\";\r\nimport { PageHeaderDesktop } from \"./PageHeaderDesktop\";\r\nimport \"./pageHeader.less\";\r\n\r\nexport const PageHeader = memo(props => {\r\n  const isMobile = useCheckMobile();\r\n\r\n  return isMobile ? (\r\n    <PageHeaderMobile {...props} />\r\n  ) : (\r\n    <PageHeaderDesktop {...props} />\r\n  );\r\n});\r\n\r\nPageHeader.propTypes = {\r\n  tenant: PropTypes.string,\r\n  displayPhoneNumber: PropTypes.string,\r\n  customerTermsUrl: PropTypes.string,\r\n  customerPrivacyPolicyUrl: PropTypes.string,\r\n  businessName: PropTypes.string,\r\n  isLogoOrBusinessName: PropTypes.number\r\n};\r\n","export default __webpack_public_path__ + \"static/media/28989_logo_main - horizontal.png\";","import React, { memo, useMemo } from \"react\";\r\nimport { useCheckMobile } from \"../../hooks\";\r\nimport coreplusLogo from \"../../../../assets/images/28989_logo_main - horizontal.png\";\r\nimport coreplusLogoSmall from \"../../../../assets/images/coreplus-logo-small.png\";\r\nimport \"./poweredBy.less\";\r\n\r\nexport const PoweredBy = memo(() => {\r\n  const isMobile = useCheckMobile();\r\n  const logo = useMemo(() => {\r\n    return isMobile ? coreplusLogoSmall : coreplusLogo;\r\n  }, [isMobile]);\r\n  return (\r\n    <div className=\"coreplus-logo\">\r\n      Powered by{\" \"}\r\n      <a\r\n        href=\"https://coreplus.com.au/\"\r\n        alt=\"coreplus website\"\r\n        target=\"_blank\"\r\n        rel=\"noopener noreferrer\"\r\n      >\r\n        <img src={logo} alt=\"coreplus logo\" />\r\n      </a>\r\n    </div>\r\n  );\r\n});\r\n","export default \"data:image/png;base64,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\"","import { THEME_COLOR, THEME_COLOR_HOVER } from \"../constants\";\r\n\r\nexport const colorStyle = {\r\n  color: THEME_COLOR\r\n};\r\n\r\nexport const backgroundStyle = {\r\n  background: THEME_COLOR\r\n};\r\n\r\nexport const borderColorStyle = {\r\n  borderColor: THEME_COLOR\r\n};\r\n\r\nexport const colorStyleHover = {\r\n  color: THEME_COLOR_HOVER\r\n};\r\n\r\nexport const backgroundStyleHover = {\r\n  background: THEME_COLOR_HOVER\r\n};\r\n\r\nexport const borderColorStyleHover = {\r\n  borderColor: THEME_COLOR_HOVER\r\n};\r\n","import React, { memo, useEffect, useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { ListIcon } from \"../Icon\";\r\nimport { backgroundStyle } from \"../../styles\";\r\nimport { STEP_KEYS, PAGE_KEYS } from \"../../constants\";\r\nimport \"./progressStep.less\";\r\n\r\nconst getLineHeight = (diffHeight = 100 + 72) => {\r\n  const nodeList = document.querySelectorAll(\".booking-step-item\");\r\n  const dom = nodeList[nodeList.length - 1];\r\n  let height = 0;\r\n  if (dom) {\r\n    const offsetTop = dom.offsetTop;\r\n    //const offsetHeight = dom.offsetHeight;\r\n    height = offsetTop - diffHeight;\r\n  }\r\n  return height > 0 ? height : 0;\r\n};\r\n\r\nexport const ProgressStep = memo(props => {\r\n  const { page, appointment } = props;\r\n  const [height, setHeight] = useState(\"\");\r\n  useEffect(() => {\r\n    const timmer = setTimeout(() => {\r\n      const finished = !!appointment[STEP_KEYS.APPOINTMENT_DATE_TIME];\r\n      const heightValue = finished ? \"100%\" : getLineHeight() + \"px\";\r\n      setHeight(heightValue);\r\n    }, 0);\r\n    return () => {\r\n      clearTimeout(timmer);\r\n    };\r\n  }, [appointment]);\r\n  const stepTwo = page === PAGE_KEYS.CONTACT;\r\n\r\n  const style = {\r\n    ...backgroundStyle,\r\n    height\r\n  };\r\n\r\n  return (\r\n    <div className={`progress-container ${stepTwo ? \"step-two\" : \"\"}`}>\r\n      <span className=\"progress-line top-line\" style={backgroundStyle}></span>\r\n      <span className=\"progress-circle\" style={backgroundStyle}>\r\n        <ListIcon className=\"progress-circle-icon\" />\r\n      </span>\r\n      <span className=\"progress-line bottom-line\">\r\n        <span className=\"bottom-line-content\" style={style}></span>\r\n      </span>\r\n    </div>\r\n  );\r\n});\r\n\r\nProgressStep.propTypes = {\r\n  page: PropTypes.string.isRequired,\r\n  appointment: PropTypes.object.isRequired\r\n};\r\n\r\n//const lengthPercentage = [\"0\", \"15%\", \"35%\", \"55%\", \"75%\", \"90%\", \"100%\"];\r\n","import React, { memo, useMemo, useCallback, useState } from \"react\";\r\nimport Menu from \"@material-ui/core/Menu\";\r\nimport MenuItem from \"@material-ui/core/MenuItem\";\r\nimport { ArrowDownIcon, DoneIcon } from \"../Icon\";\r\nimport { colorStyle } from \"../../styles\";\r\nimport \"./select.less\";\r\n\r\nexport const Select = memo(props => {\r\n  // replaced useRef for the issue when click back from contact form to booking page\r\n  // => anchorEl = useRef() can be null and causing issues\r\n  const [anchorEl, setAnchorEl] = useState(null);\r\n  const {\r\n    open,\r\n    value,\r\n    placeholder,\r\n    onToggle,\r\n    onSelect,\r\n    options,\r\n    noOptionText = \"no data\",\r\n    ...restProps\r\n  } = props;\r\n\r\n  // options is null or no data inside\r\n  const noOptionDataSource = useMemo(() => {\r\n    return !options || options.length === 0;\r\n  }, [options]);\r\n\r\n  const handleClick = useCallback(\r\n    e => {\r\n      // This prevents ghost click.\r\n      e.preventDefault();\r\n      !noOptionDataSource && onToggle(true);\r\n    },\r\n    [onToggle, noOptionDataSource]\r\n  );\r\n\r\n  const handleSelect = useCallback(\r\n    value => {\r\n      onSelect(value);\r\n      onToggle(false);\r\n    },\r\n    [onSelect, onToggle]\r\n  );\r\n\r\n  const handleRef = span => {\r\n    if (span) {\r\n      setAnchorEl(span);\r\n    }\r\n  };\r\n\r\n  const valueText = useMemo(() => {\r\n    const foundItem = options.find(item => item.value === value);\r\n    return foundItem ? foundItem.label : \"\";\r\n  }, [value, options]);\r\n\r\n  const renderText = useMemo(() => {\r\n    return !value ? (\r\n      <span className=\"select-placeholder\">\r\n        {placeholder}\r\n        <ArrowDownIcon className=\"select-placeholder-icon\" />\r\n      </span>\r\n    ) : (\r\n      <span className=\"select-value-text\" style={colorStyle}>\r\n        {valueText}\r\n      </span>\r\n    );\r\n  }, [value, placeholder, valueText]);\r\n\r\n  const renderMenu = useMemo(() => {\r\n    if (!anchorEl) return null;\r\n    if (noOptionDataSource) return null;\r\n    return (\r\n      <Menu\r\n        open={open}\r\n        onClose={() => {\r\n          onToggle(false);\r\n        }}\r\n        anchorEl={anchorEl}\r\n        PaperProps={{\r\n          style: {\r\n            maxHeight: 300,\r\n            minWidth: 200\r\n          }\r\n        }}\r\n        className=\"select-menu-option\"\r\n        {...restProps}\r\n      >\r\n        {options.map(item => {\r\n          return (\r\n            <MenuItem\r\n              className=\"select-option-item\"\r\n              key={item.value}\r\n              onClick={() => handleSelect(item.value)}\r\n              style={colorStyle}\r\n            >\r\n              {item.label}\r\n              {item.value === value && (\r\n                <DoneIcon className=\"select-option-item-selected-icon\" />\r\n              )}\r\n            </MenuItem>\r\n          );\r\n        })}\r\n      </Menu>\r\n    );\r\n  }, [\r\n    anchorEl,\r\n    open,\r\n    value,\r\n    options,\r\n    restProps,\r\n    onToggle,\r\n    handleSelect,\r\n    noOptionDataSource\r\n  ]);\r\n\r\n  return (\r\n    <>\r\n      <span className=\"select-container\" onClick={handleClick} ref={handleRef}>\r\n        {noOptionDataSource ? (\r\n          <span className=\"select-value-text\">{noOptionText}</span>\r\n        ) : (\r\n          renderText\r\n        )}\r\n        <span className=\"select-bottom-line\" />\r\n      </span>\r\n      {renderMenu}\r\n    </>\r\n  );\r\n});\r\n","import React, { memo, useMemo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { colorStyle } from \"../../styles\";\r\nimport \"./textButton.less\";\r\n\r\nexport const TextButton = memo(props => {\r\n  const { text, placeholder, onClick } = props;\r\n\r\n  const renderText = useMemo(() => {\r\n    return !text ? (\r\n      <span className=\"text-button-hint-text\">{placeholder}</span>\r\n    ) : (\r\n      <span className=\"text-button-text\" style={colorStyle}>\r\n        {text}\r\n      </span>\r\n    );\r\n  }, [placeholder, text]);\r\n  return (\r\n    <span className=\"text-button-container\" onClick={onClick}>\r\n      {renderText}\r\n      <span className=\"text-button-bottom-line\" />\r\n    </span>\r\n  );\r\n});\r\n\r\nTextButton.propTypes = {\r\n  text: PropTypes.string,\r\n  placeholder: PropTypes.string,\r\n  onClick: PropTypes.func\r\n};\r\n","import React, { memo, useCallback, useEffect, useContext } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Drawer from \"@material-ui/core/Drawer\";\r\nimport { DrawerContext } from \"../../context/DrawerContext\";\r\nimport { CloseIcon } from \"../\";\r\nimport { colorStyle } from \"../../styles\";\r\n\r\nimport \"./sideDrawer.less\";\r\n\r\nconst BACKDROP_CLICK_KEY = \"backdropClick\";\r\n\r\nexport const SideDrawer = memo(props => {\r\n  const {\r\n    open,\r\n    onToggle,\r\n    closeCallback,\r\n    showCloseBtn = true,\r\n    maskClosable = true,\r\n    children,\r\n    ...restProps\r\n  } = props;\r\n  const { drawerOpen, setDrawerOpen } = useContext(DrawerContext);\r\n\r\n  useEffect(() => {\r\n    if (drawerOpen !== open) {\r\n      setDrawerOpen(open);\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [open]);\r\n  const handleClose = useCallback(\r\n    (e, object) => {\r\n      if (!maskClosable && object === BACKDROP_CLICK_KEY) {\r\n        return false;\r\n      }\r\n      onToggle(false);\r\n      closeCallback && closeCallback();\r\n    },\r\n    [onToggle, closeCallback, maskClosable]\r\n  );\r\n  return (\r\n    <Drawer\r\n      classes={{ paper: \"client-portal-drawer\" }}\r\n      anchor=\"right\"\r\n      open={open}\r\n      onClose={handleClose}\r\n      {...restProps}\r\n    >\r\n      {showCloseBtn && (\r\n        <div className=\"client-portal-drawer-close-btn-container\">\r\n          <span\r\n            onClick={handleClose}\r\n            className=\"client-portal-drawer-close-btn\"\r\n            style={colorStyle}\r\n          >\r\n            Close <CloseIcon className=\"client-portal-drawer-close-btn-icon\" />\r\n          </span>\r\n        </div>\r\n      )}\r\n      {children}\r\n    </Drawer>\r\n  );\r\n});\r\n\r\nSideDrawer.propTypes = {\r\n  open: PropTypes.bool.isRequired,\r\n  onToggle: PropTypes.func.isRequired,\r\n  closeCallback: PropTypes.func,\r\n  showCloseBtn: PropTypes.bool,\r\n  maskClosable: PropTypes.bool,\r\n  children: PropTypes.oneOfType([\r\n    PropTypes.arrayOf(PropTypes.node),\r\n    PropTypes.node\r\n  ])\r\n};\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { useHover } from \"../../hooks\";\r\nimport {\r\n  borderColorStyle,\r\n  colorStyle,\r\n  borderColorStyleHover\r\n} from \"../../styles\";\r\nimport \"./fullWidthButton.less\";\r\n\r\nconst style = { ...borderColorStyle, ...colorStyle };\r\nconst hoverStyle = { ...borderColorStyleHover, color: \"#333\" };\r\n\r\nexport const FullWidthButton = memo(\r\n  ({\r\n    label,\r\n    children,\r\n    disabled = false,\r\n    onClick,\r\n    className = \"\",\r\n    ...restProps\r\n  }) => {\r\n    const [hoverRef, isHovered] = useHover();\r\n    return (\r\n      <button\r\n        ref={hoverRef}\r\n        className={`full-width-btn ${className}`}\r\n        onClick={onClick}\r\n        disabled={disabled}\r\n        style={isHovered ? hoverStyle : style}\r\n        {...restProps}\r\n      >\r\n        {label || children}\r\n      </button>\r\n    );\r\n  }\r\n);\r\n\r\nFullWidthButton.propTypes = {\r\n  label: PropTypes.string,\r\n  children: PropTypes.oneOfType([\r\n    PropTypes.arrayOf(PropTypes.node),\r\n    PropTypes.node\r\n  ]),\r\n  disabled: PropTypes.bool,\r\n  onClick: PropTypes.func.isRequired,\r\n  className: PropTypes.string\r\n};\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { backgroundStyle, borderColorStyle, colorStyle } from \"../../styles\";\r\nimport { useHover } from \"../../hooks\";\r\nimport \"./transparentButton.less\";\r\n\r\nconst hoverStyle = {\r\n  color: \"#fff\",\r\n  ...backgroundStyle,\r\n  ...borderColorStyle\r\n};\r\n\r\nconst defaultColorTheme = {\r\n  ...colorStyle,\r\n  ...borderColorStyle\r\n};\r\nconst defaultColor = {\r\n  borderColor: \"#333\",\r\n  color: \"#333\"\r\n};\r\nexport const TransparentButton = memo(props => {\r\n  const [hoverRef, isHovered] = useHover();\r\n  const { isTheme, label, onClick, disabled, className, forceDisabled } = props;\r\n  const normalStyle = isTheme ? defaultColorTheme : defaultColor;\r\n  return (\r\n    <button\r\n      className={`transparent-btn ${disabled ? \"disabled\" : \"\"} ${className}`}\r\n      onClick={onClick}\r\n      ref={hoverRef}\r\n      style={isHovered ? hoverStyle : normalStyle}\r\n      disabled={forceDisabled}\r\n    >\r\n      {label}\r\n    </button>\r\n  );\r\n});\r\n\r\nTransparentButton.defaultProps = {\r\n  className: \"\",\r\n  forceDisabled: false,\r\n  isTheme: false\r\n};\r\n\r\nTransparentButton.propTypes = {\r\n  label: PropTypes.oneOfType([\r\n    PropTypes.string,\r\n    PropTypes.arrayOf(PropTypes.node),\r\n    PropTypes.node\r\n  ]).isRequired,\r\n  onClick: PropTypes.func.isRequired,\r\n  disabled: PropTypes.bool,\r\n  className: PropTypes.string,\r\n  forceDisabled: PropTypes.bool,\r\n  isTheme: PropTypes.bool\r\n};\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport {\r\n  backgroundStyle,\r\n  borderColorStyle,\r\n  backgroundStyleHover,\r\n  borderColorStyleHover\r\n} from \"../../styles\";\r\nimport { useHover } from \"../../hooks\";\r\nimport \"./transparentButton.less\";\r\n\r\nconst hoverStyle = {\r\n  color: \"#fff\",\r\n  ...backgroundStyleHover,\r\n  ...borderColorStyleHover\r\n};\r\n\r\nconst defaultColor = {\r\n  color: \"#fff\",\r\n  ...backgroundStyle,\r\n  ...borderColorStyle\r\n};\r\nexport const ThemeColorButton = memo(props => {\r\n  const [hoverRef, isHovered] = useHover();\r\n  const { label, onClick, disabled, className } = props;\r\n  return (\r\n    <button\r\n      className={`transparent-btn ${className}`}\r\n      onClick={onClick}\r\n      ref={hoverRef}\r\n      style={isHovered ? hoverStyle : defaultColor}\r\n      disabled={disabled}\r\n    >\r\n      {label}\r\n    </button>\r\n  );\r\n});\r\n\r\nThemeColorButton.defaultProps = {\r\n  className: \"\",\r\n  disabled: false\r\n};\r\n\r\nThemeColorButton.propTypes = {\r\n  label: PropTypes.oneOfType([\r\n    PropTypes.string,\r\n    PropTypes.arrayOf(PropTypes.node),\r\n    PropTypes.node\r\n  ]).isRequired,\r\n  onClick: PropTypes.func.isRequired,\r\n  disabled: PropTypes.bool,\r\n  className: PropTypes.string\r\n};\r\n","import { createMatomoScriptTag } from \"../utils\";\r\nlet RECAPTCHA_KEY,\r\n  CSRF_TOKEN,\r\n  API_CONFIG,\r\n  DOMAIN_NAME,\r\n  BUSINESS_NAME,\r\n  GOOGLE_MAP_KEY;\r\n\r\nBUSINESS_NAME = window.location.pathname.replace(/\\//g, \"\");\r\nif (process.env.NODE_ENV !== \"production\") {\r\n  API_CONFIG = {\r\n    rootUrl: `${process.env.ROOT_URL}`,\r\n    headers: {\r\n      CsrfAngular: \"TEST\",\r\n      \"content-type\": \"application/json\"\r\n    }\r\n  };\r\n  RECAPTCHA_KEY = \"\";\r\n  CSRF_TOKEN = \"\";\r\n  DOMAIN_NAME = \"https://portal-qa.coreplus.com.au\";\r\n  GOOGLE_MAP_KEY = \"\";\r\n} else {\r\n  //prod config\r\n  const prodDomainRegex = /^portal\\.coreplus\\.com\\.au/gi;\r\n  RECAPTCHA_KEY = process.env.RECAPTCHA_KEY;\r\n  const antiForgeryTokenDom = document.querySelector(\r\n    'input[name=\"__RequestVerificationToken\"]'\r\n  );\r\n  const CSRF_TOKEN = antiForgeryTokenDom ? antiForgeryTokenDom.value : \"\";\r\n  if (!window.location.origin) {\r\n    window.location.origin =\r\n      window.location.protocol +\r\n      \"//\" +\r\n      window.location.hostname +\r\n      (window.location.port ? \":\" + window.location.port : \"\");\r\n  }\r\n  DOMAIN_NAME = window.location.origin;\r\n  GOOGLE_MAP_KEY = \"AIzaSyAAjhDgObWd9E0g4dCJHKMOhqFWFFwt89U\";\r\n  if (prodDomainRegex.test(window.location.hostname)) {\r\n    createMatomoScriptTag();\r\n    GOOGLE_MAP_KEY = \"AIzaSyBO-zbHUAaPTTg5LzwrHIQlmh267AfeXQw\";\r\n  }\r\n\r\n  const rootUrl = `${window.location.origin}`;\r\n  API_CONFIG = {\r\n    rootUrl,\r\n    headers: {\r\n      CsrfAngular: CSRF_TOKEN || \"TEST\",\r\n      \"content-type\": \"application/json\"\r\n    }\r\n  };\r\n}\r\n\r\nexport {\r\n  CSRF_TOKEN,\r\n  RECAPTCHA_KEY,\r\n  API_CONFIG,\r\n  DOMAIN_NAME,\r\n  BUSINESS_NAME,\r\n  GOOGLE_MAP_KEY\r\n};\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { MaterialUIIcon } from \"..\";\r\nimport { colorStyle } from \"../../styles\";\r\nimport \"./backTopButton.less\";\r\n\r\nexport const BackTopButton = memo(props => {\r\n  //iconDirection = up down left righr\r\n  const { onClick, iconDirection = \"up\" } = props;\r\n  const iconKey = `keyboard_arrow_${iconDirection}\"`;\r\n  return (\r\n    <span className=\"back-top-button\" onClick={onClick} style={colorStyle}>\r\n      <MaterialUIIcon iconKey={iconKey} className=\"back-top-button-icon\" />\r\n      Back\r\n    </span>\r\n  );\r\n});\r\n\r\nBackTopButton.propTypes = {\r\n  onClick: PropTypes.func.isRequired,\r\n  iconDirection: PropTypes.string\r\n};\r\n","export const createMatomoScriptTag = () => {\r\n  const script = document.createElement('script');\r\n  script.innerHTML = `var _paq = window._paq || [];\r\n  /* tracker methods like \"setCustomDimension\" should be called before \"trackPageView\" */\r\n  _paq.push(['trackPageView']);\r\n  _paq.push(['enableLinkTracking']);\r\n  (function() {\r\n    var u=\"//analyticsadmin.coreplus.com.au/analytics/\";\r\n    _paq.push(['setTrackerUrl', u+'matomo.php']);\r\n    _paq.push(['setSiteId', '2']);\r\n    _paq.push(['setSecureCookie', true]);\r\n    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];\r\n    g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);\r\n  })();`;\r\n  document.head.appendChild(script);\r\n};\r\n","export default \"data:image/png;base64,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\"","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport GoogleMapReact from \"google-map-react\";\r\nimport { GOOGLE_MAP_KEY } from \"../../../../api/config\";\r\nimport googleMapMarker from \"../../../../assets/images/google-map-marker.png\";\r\nimport \"./googleMap.less\";\r\n\r\nconst preventTouchStyle = {\r\n  pointerEvents: \"none\"\r\n};\r\n\r\nexport const GoogleMap = memo(props => {\r\n  const { position, zoom = 15, preventTouch = false } = props;\r\n  return (\r\n    <div\r\n      className=\"google-map-container\"\r\n      style={preventTouch ? preventTouchStyle : null}\r\n    >\r\n      {position && (\r\n        <GoogleMapReact\r\n          bootstrapURLKeys={{ key: GOOGLE_MAP_KEY }}\r\n          defaultCenter={position}\r\n          defaultZoom={zoom}\r\n        >\r\n          <GoogleMapMarker lat={position.lat} lng={position.lng} />\r\n        </GoogleMapReact>\r\n      )}\r\n    </div>\r\n  );\r\n});\r\n\r\nGoogleMap.propTypes = {\r\n  position: PropTypes.shape({\r\n    lat: PropTypes.number.isRequired,\r\n    lng: PropTypes.number.isRequired\r\n  }),\r\n  zoom: PropTypes.number,\r\n  preventTouch: PropTypes.bool\r\n};\r\n\r\nconst GoogleMapMarker = memo(props => {\r\n  return (\r\n    <div className=\"google-map-marker-container\">\r\n      <img src={googleMapMarker} alt=\"marker\" />\r\n    </div>\r\n  );\r\n});\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport NoLocationFound from \"../../../../assets/images/sad_face.png\";\r\n\r\nexport const LocationNotFound = memo(props => {\r\n  const { name = \"no position\" } = props;\r\n  return <img src={NoLocationFound} alt={name} />;\r\n});\r\n\r\nLocationNotFound.propTypes = {\r\n  name: PropTypes.string\r\n};\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAAkFBMVEX///8AAADz8/P09PT+/v4EBAT9/f319fX8/Pz29vb4+Pj39/f7+/v6+vr5+fkDAwHj4+Pq6uqurq4yMjK+vr6Hh4fn5+fHx8dGRkaOjo63t7eYmJjNzc3V1dWenp5zc3NTU1MbGxt8fHxhYWEoKCg9PT2kpKQTExNMTExnZ2eIiIg2NjZ2dnZZWVkfHx9ISEjCIDf6AAAcB0lEQVR4nNVdeWOiPBMPiIAILuBVD9R61m213//bvYQkkMkBAWn3ffxj17YJmR+ZyZxJECIfx5G+IN2Xn2/b7+OKjx+SHx3fL7+Qv7hh+cXVtZWaqNoiTVvWpE3bNmSSTxSQXzuTCfm1O4louyAkX8LA79B20tiWPQ6xJmVbn7XtNjR7bvEJRuTXznhEfu2OxuQR4WhCxx9FUls6yihAYtuQtaUUscf5rG1UPY62lYZWtZWGlskMhbbFU4MB+bXjDcgo/sAjPSN7TDvY9BGjAe05GFBC7BF9OGs7tilFHm3rsrZh1TaAbcuhXTZ0qBi6A5kFz0YUd050c09bbGt7CLatANptAOraBqytPPRAHFoms2Ben3Ju9RrtXgE6jBBEJaT6MilnRfsyZIBeNbSeTDr0KHDYPGJCbAngSOjpVQAZi1LqFSxqM5H3wkk2S6+74+lxeLtMPy/fh9N+dU3Xy3jMKBKGDqWhq3dbtUUagNy7xY+jWoOflfYzqABY/CWJ0/n9Yuk/58dxs40T0oeTwWYWbSazZAihpwFzG7Co74yz9P42LKH8GdLvw+rLnwrnfLnAC2GvMsjakp+8ZhZtA3C7+b5RGI0A2S/O+9RuAqggUyuDEKCe6PYyaK/35cy1AFh8ppssQuMOzKOQQcCiJgrGQAYHCC3SR4GoPUD25XlcRnToGhY1JtPF/znjXvRg5NvpQUn9HwVSHcCCX48Zfm4ngAKLupGLjbxRHzLob/caotvMIGv7eaXrq1JNGAP0x4XGnzSuv80yOEo/LQ31XQDiz1eme7dNZJZqwvfwXxzqh7yiJpLV07I01NcCrG97WOYjvaAmfNKEavwXTLXFF6apzxks236mZCAzi1JkUUYm66l7NQ0smmDxM50V/mMAMH/YbYbammoimeynLmpighZHM7ar+TTN9ucst9C7WJQjHmA3GXT8jYBLpcXzz+1tP9+ksyyO4yxe5P/Gy3SzOp6mXJsadv7evkBm8UrcQRc1MULrp5oiHuDHKo2jEbMvJh51OCaFsnN8e7bbn2kvHcD85z225zrJYKHx3VEHNRFG2ZuICwIcXo7rBXnuoFTezOGlcuUUyznaXh9nSwuw+MUuNwfbyOCIkYkdxMm4vQw69koihKdoepwtfBZiavbo82/Z7sHPv8QQl62jA1jDaGM8kB91WH+XU90rzz/nTZw/wdOHLDQevT27s0eoOH7utCVz4uERHeaK18mgqCaOMiEM4HMVc0RzACUWlT16N/LWDzVA/OU9a6cmyqGR7tXoAGZTLcDTDEGi61hUHbJIdswAlDXJyh81m2pS8K8ZoDD3VwUrFV+em9hvAVAbdPKWJ8UMFp/v2JjMSABorCbCkwbgeT0JyzCEyCdcgIqxqD6qlvuZ8VEF8E/+/0wgUyeDIkBj5o7fLXnxzL9cljgCrIuLGsig+G5Hcw2vzo3URMmiDhnFmEXXahv7bdY28NsYVUNOPAcyWH55JEGjqVYCLFSWLL1agH8VAPM1bo0MAbYI/A5wTGSvWG1yec9Y20YWjbAqdNkbaQZ4kgHmn01YD9CIRSWApG1WBls5u9WytvUAyxkMCo0fsmxNk6lmX2SLw7LuiXpWjJIvjesbctN3ESAeOlWkRRQ5Ig8/jmn8xhmMpwqAzxkc5QeSL/aXpfA8Vv5A79WJ4VtDgDcFwL3H2japiVeSL8t32fOwvpAGoByfhgB1LBorjOIbNWBelcHG5EvAYsycGWztVWS2mkHQM1MAPJUJlV7VhCKqNsBaCgLMadjXy2A7FlUB3FGf5HcSoMmH7MjckdfMog6hqEkGZYDDbcTyjo0yaGSqNSZfjrKquiOBRWWARXa0TPO3kMFDEjSmsLvJoN6+TC0B4JAuNzUsWtRquEFUP4piFT1ORsY5+pqChXbJF5Q9IcBhYaTWARwXJSes1EYHcMDrQfJl57epsmhlqtUmX5JPyTm+1pYSeEXmya0HiN6kGZw5zQBfMdX0UTXnYIne/yxsLiWgP2k8+rsEMHNfq5PpIINlW59Fcqr4zdYMoHaUlQhwmPn/sE5mgI4AYO4T3xYvAZxJ9lIcil5nz6ZaU+B3DgBi5xQpZVAHUPDoJR2UhM0z2I+ppg08zEuiqD2+r6tXgnVt4gw6ZxFgbACwJ1NNG3hALJZZOhzXUAswInVtOk/yLgL8pzJYsvNkDwGWq40MENa1SQCZEVHKYAmwRgYVLPqCqaaMqhXBBj5+Y01DJUDXg3Vtoh8SVwCZHvwpGTSvk6FDvwk+8ZcS4GCkqWsj7cKLAHBjoOhfNdV0AMW29llYbWY1VZ8agDiuBgAefbF4tidTzaheSSzlysTVJvFaAnQzAeD3uCdTrUZN6NOYUuDXX4IVIvfHUQNA0dEaXCBAKzH3JvpWE+rky4oHmFO5rgcoSnq0EQAuJ/9eTQhknmCI8X2gAijUtVU5+lgAuAmNTbV+PHqD5MvgCdX1l4KdWV2bFK5CDwjwETAP4WdksE05ZVVGshSWimwiBYlpXZsEsBRjFheNuwSdejXVVMkXtIJkXiRJgnVt1WsM0BQCJEL8kx49G9o8R1+0vQAyKZ3c0HxdG+h5hQDvjQA7efSvyCD1B2MY1TgHSjLlnvYNABzaTQB/yqNvTr5sYEndphlgMcqGB/jHSlsA/BU1wXn0I6Gs1UYmAAdAlVoPNspPJl86yGAxdLCFy+nKF4cufnThq/kLM7yxmujf8uibki97uGbQXEo5tE/q2gBz21B6jw0Af9dUkwCixAITModD07o2ts+P9FzBoKvXGuAPy6AYk9lAem1+aFLXFkag5+gdLE9X1NFUy91PHUC9mpi0kUE6dHAG2zt2PJmgro3N/RUAxOGBljKIf73IsthmAA1mBRf6xdssoX1M6mSqLVasRossjs/ArdrSoUFP/xNUBKVtPXoPjcm2Get9v0WmCdBk8130KfaSGNXJcEOHZw5gTvJEJJO+RtpzBgCe25pqHkqf1XAfMTJIvnjUVSN9TnYbFi1mO+UBWtOSKZUA3QfQoOuWLDoii3cV56O7CRT7kcoZHCWs2Jh2WkaNdTJCTOYGwvxZHcBJDABaZjGZ0lQboTsAOLSKlapWBr1kCgHmEOnjDPZSk9lOQZh/D8h0CPWsZwRrm3eyDVSrB4k7A+N8WyXAUk0MJg8IEP+ftJrB/Bc3qwJoWQOOTFjXNradGw/Qsr1WphoJgAnFPWe31lRzUxFgPvTBXAaL57KJoUOnFZmwri0HyDxf0mEuGXkNptq3DDDnU7/GVAvCmwwQT3yLvdTuYJzwAK03l5EZjIssd1j1hEZeNm5nqsUqgNbNqTPV1iqA1t0xlkEir3d+aCtjkIrtHSzLjXsOnjzAj0lLU+2q3PlCTHedqXZXAbTeqQFtfJ7BFqxvG9aWIq16LjkWLVd68+TLSQVwSGILOlNNCdCiK77ReQZktp9crrrImVZk8j33PEAr0syg1l3iqzM5oneoZuEAjkxlX25JWzMWxZ8dyFXHGoAB8EP2GoD65MtFvXdppbRkKNGKGRzSenWjRYbZ+ZUip+b3WAEwZ2Z+lGU9QNmjRxdLBTAfrqZORqr0IL/YtpBBTObAB4bRm1TXRn5agWIVNcAajz48KQHmcqhPviAmFEIhUNZqBjGZVzC0PaBk0ro22vPJO1rHhhmUo2q+Snnnn8VY79GHeyXA58RtIYMFmQk/NIvwOgGpa6NrKpfztQrjsK1Hv1ACPKMaj95dqgDma0DLGcw/B15DkUWEnN5S1rVFKQ/Qsus9euUoD9XSf53UBX7dswJgbmsYq4mSTL62Cbt9eB5AXZvngxMDTvxabRpVU5VKf3qKoHoJkNQkiQDvTusZrLLC5HExRybtOUBTfpQr6hJV24BRig/bw6uNqu2lYrzbogzbmAOMkjM/9Kwik/V0FpBPRuZqopLX4EsESEW+Jqo2eLMgQGsbCW2Njp4ivikb+ohEgD7JxrFRzl0DvysIkFXz10S2vfABAN6yTgADFswgQ38EA8CiuOdf/jU+kABQVhOayPaW6X0szHS3YFPyJX1WfY7sL21YtCAzA++WDs3q2nDPExfsKGxJDcDGwO/sXkj025w5Mc2B3yA9FSAPm9jvIIOUTGB0Etvd5erawspu/kMt327Jl/E475cktuuPjetkcl98kCQ4XDpqoyYESfrg16zCMyK6np7eklhVlRH1K15KviCOnQWi2yZfQNua4N+Gt8lwAgPWtWV8GdUN9PzXyRdDgCEwWR5iXVvuYFUAiwKj/6Pki9kJhV7MAbSGbskZZJRwzgHEC82/q5NpY6rxkhT6QOsEHg/QHYSgKnX2e+WUJskXgxksyHzjFV4WAIBe8dcyzhL7/ZRTdquT6cKichSGOVDsNbpDDmDuQP7gzhfStj2LNueI5rxCJPkEUteGj4+JeIDDipCf2PlitEm5NYuiIvdZLaer4rnV6S0LPqJ6mcBR+q+T6VVNlFG1mVUBLOqcQq6uLeMjqncJ4G/XyXRgUeSMMw6g9S3Utc14D/koAPz9OpkWaqIicwQU4rmsayPtUj7W+ZcQ8k/rZEBbszwtSoBCLH148tlZFcAi7v/T5ZQ9ySBYKuwnrxCZl0J6TjYcQGyX/1dMNUDm5JNXiKywg/T0NxzAXFn+ws6Xfkw1QKbzxrm4OBWMqBRiPllxAK1Z+B8y1XgyP3gPsMjQVXVtcw6gNRu/Yqq1Oue1JxmkjvSHxQDmSPDOS66u7cjHxGcOezX/AVONI9M/cABxpGbC1bXt+Zj4lvVsYaoZ7gBVAuyHRV3beXAAc4QBf3rLkdf4W9KzxlT79x69yqIkmyhKBykEdW1HfnfGEv13TDVA5oEDaMUeDxCxk7UK92PW0VT7PTUxlli0aPvB+w8xnwSeTEAx1Po/ZKoBMrmNl2VBNO3p7DiAuU3ziztf+mHRYmgu5pv/R8Z2CEUB3ESy0W9o/v8z1SqA3M5SlqYnp7cUF7qkHEBrHpmriR8y1TptDkgYgw4Zwgmpa8Md+EQl9Q9/aJNyf6aauL7BkpMnfi5X18ZXmtAs+H9JTRRtvYwDiAujRnxdW8xnNT5MAf68R29Sec3aRlsOoHWqUijFx+azGje3tZrQWzK/oiYUNTVzFwAMbKsCiFNP/x1TjWsLNj/vJrAykZ4vQIUxlsuf+5FB1xsLbXtRE7TtF+8gsSL6sue9msHcbAv69ejZudAIp0EL35vuXH3Fo5cDDx+8g0SSwDTLjXvyB9tYu9BYBg3UBBon8Xr3dakKO63zY3Xdem6ui0PY9pVNcj5fzmMVvditZLjnjg/i0JBwL6aavf3LNnGUMQb64+fXNTYGWMeiZOiEB2gVioKe3iIrxKcxwIZNykl6emfw5Otm8Ofyd4s7dfDopbVwxnuAWOOxujZC66IcUyq97CaDOfTZg584ZQEx/tBDzl9j0fxPG4t77hHPQ9GEZbmTKQcQi+lrploQJfxupoZLu6zH1hSgvpzHf/DPvXIHoZCe1d/xv+mLLIqyI/84g+tm3tZoIhLdrpQAgedmSABow4PQ7uglUy2pDt7XyaBcwH4xOLHeVil6MnQYg8eVdbtVzxlP0dTTK+9mj54lQVoBHBa7+TrKIB56zT/uYkOAeO5ji9cXmW4Gm9VEVp783wpg8ZdVVFv1Kc0gP/Sef9ye3q5BND49PejMl32tmwDqZNCd669dawSYM88S6QHqIyt46Cm/eFGbjdS1sVvJ7vy6flcDbFQT8bQdQHG2LZJ/b8miuC1/RgbjQRfcSlbe6lAQcvM6qYnUkip++f2WwkdCWrT9tjuV1O14kX4nZJIsNzVB3VEGKMq65CaONQDx76ZvH4fD2+ezDiCuoUXmplpJ5okf+kTmoXgH7FayXK4ARSuTTcoQIE6M6AB+z69ZYuNESWR7g2Qx2+zZxk/Fy2Cej4GpxhjNBtKRIm6pqOb+yI9yk69YaJBBe6qalfyf979Lx6Xhu8pdCkcLdl+izM5XOrR5GjMF4m9z2ox7NTMwylY3gxoZXDwVAPGdlBlSOrzF47yUpfwEq0coJWgs5/GrTehWscveFwAWNtAA+FdzDUCNmkjeFUukdUmL1nXXBVP7TjTrNmamGjODEx5gLmIlmQ7oeeJLTm4AYFPyZaCYQeu8Fl6GwqP3qI0n2a0bX9RQeoCjSQqGzpcqFkMldW30J+5McNxw1sJUGylk0ErpNDUHnRLuep5y/q8CwLrgH/rkh55GbAZ9cCtZ6C2G/CinFqbaQwb4lRgDRI4/O0OA+P/i6sM6NVECdDIw9N+QtSW3knEbmk9glNgzNdWOEsDbMmoXVRsfIUD8uEWzqYYIox0B82zZbnx6egvXcw34hG6JbjbVUgngx2DSOrK95oWxeNx5MjZLYw7eeYBT7uS56kN6RvxrtJ4RnEGdqZZJin7F3StnHheNqysC6ePu4s4+TeAh5QD+YTNTbVTlex7Ba1wjE1Nt8ikCXKNBl9D92P6AABUnqQmmGgHoTIEKTmoA4jJT7jWejTz6uQhwiSR5NYxsF+UigOMTZFC3O+O9FLpnSwNwMrkAPlnWbFIuHV4R4LbDFtfSmzgJIv1hkiO6cACHZL9cSaZDpqfs6aQ8QOstbI7JPC1xBl9KvlTRY/K4FDVWXi+BaXsDZIq3kgX4qC/ek6TBoZqo2kagaC3fF9oG4MT+BI+z3pNRA0B8PwVHw44fOgLntRHpXYHg0DehSD+DCwHgygBgbZ2Maw95gBa1j2uim8syS8DciurMJHBeGyU6gUs/OL5BBuh/QYCn11i0cJcyCywcRY1hzQyWRzmQTnP+3Qq3ktFR9kCuzk6dDAYZBHi2R68ApG13xK1kz90jrZrAH2ZMl/V6HJl8VVTZcyIQvZOX/uo1Rl+grbWM+qiTKctE6XOTuhm0b6DtXRWAF14NOWio4pNEf13wwIcAv9xecvRBDIjObRR9CsWdw7YLVweQ67mAkr4XZoVLgKItAGiVAv5inQwN+7HnvvlagGPhZexR4wzinkcYZ9mqAeK2IBNgpeELAIFH737yz52q5oG0DQ68DGJ3SCSzrGvjey4soGCmrjYBCpa9CyW6jzoZzg77Yx10AAchdO2tr6gcmraFt5KV0lte48qiHtocPc/OM0Z0H3Uy31zVfaoDOEogQCtma3y5qb+qa+N7jpIbnPtsrKuTSS3xTfdTJ1Oet46vO3I0AAfEY6/CrNRtqtrSujZf7pnCnmdP6Fm2ZXcv/mGHGPRVJ+OyCBxNQSgBCmQ+pQVJfStZwSdTC6w2RxFgFSmjucJbE8CWdTKlqHzGZGg5AI/gWSXs/geZTKknHiXjAVLjTVOr5qX3j3vKiO6xVi3eHA7zrUh0BZCYa9KCNBbJVAIs3FoOIDYO9ZkoEpTsClCffEGMQnWOaM6z6B9qvyqsHjXRTvIEAK1pOPitnS+GO3HXACDb2dzIoiWfhDO4nLIyqV/Y+WIGMAYsyk4SlJcKUtemvJUMHCeZ/7+jRP9mOaUeoH2GM2jFoG25VNC6NmXgd/wuZEtm4ijly+gDYGPyBQztHITs+U7dFt5KJiZfthafqLHwa/qdnS/NAJF46fqH0JYOPYK3konJF+5OK2bXBgLR/0gGwYlPGOAwQUptpruVjPqDg4lwDLV1TkSAPyWD9cXGO7HAQ1DXwlIhAOQ9+gQAzP+/2Kgdi756qYISYCoCnCOlwSWVfRWjwJjMUkwHfTp9bSvozqJrgUULRdEEUEv0Dt7jguvFgl5Y9CWAcAbxZV36DTp0FG3yhbudllUQLhB8Gb2rCV1UTcOi2Peo2RxQeBdjLcBgEFwgwKE1TQDA3zXV5EUGexRjLYuyW8nqki8euBqpeGb879SEdFUu9nprNuiIt5Ipw4axCPDl5EtnUw3LjDCDxzoZ9OGtZNrA71aqNqR2/G+riSKBCgGe6usLC+pYXZs+dO+yo3s4X2zeALCVqWZw5EbhTbxLAA9+jZqAVVG1O1/o6URQB9m/K4MI3kRCAL4pPHrZ4GIAtaF7qRKAfLlt0aBnFq0x1ZAPygrJl8tYbit7deSnxuv5UkvaGGKtwn4B1s1g/CnPYG5CGrCoA0apOX5zbQkA8/++k7YAu7HoWMhjUBYNTAAWGt+VzgxVrL+uENWQDiN6bZNyDUDPXxwUAA+1aoI9LgR1bQ0bJJcyQMt6ZOwCkL5MNclLH13huyVf7m6tmmApFFLXFjWxqCaGSqURAuy4SVmbAHWyb0FVMUWvN9UqgwvcSmawSZnb/FW5jNb7Ev2YDKJEqBOoTh+tMdUkFawFKK6/Y/skAiyMnUPmtrrw2dhUi8CxsdWXWS2ZkkWpAaiOqq0UAPPPPm4B0JhF14xn4Ayea90l4xnUMTeXuuT3ZFn7pHXypcFUq/BBgB+BAZnNM6i3geJKGKH3v8/Y/oUeZDBIbzARXQLEK5tkqtWwqENGMWDRqkTySwkQy+PSUQNssfMFjXITNFndFOs2/lIsawammuZWMoO5L2Z7rQSI6fjc5Mw6eEVNTCK0BEcDgKKJk21GZjmD8FYy857Jh2VJACkhj/VAANiGRf1s825pAaY6MnXxaXgrWav1tzoqU9pEkkvkbICp15pquhl0481UwlX5pIeFQGajDNJbyXwwimHyBS1OSoCUouHpmvmsbXPyBQ9kb4+X8h0pbKehtiJDqyZKk1nsaZh8waZ43Va8z/06xjJA0yL6TcrIsbebj3c6U0oWze3QxJRM2S+HPVucJ+MLZTeqLemHVRoXgSBWylMeAuIURrE7WF734PoUJcDPbXcypRk0T4CO3PgOCJEBks/0dNyky3iRJLadJN4g/3cRb9fXv/vvW9VKx/G55XuNBDLb5GnVAI1zE9uPOoD8qQn4c3t/nqfT85PDpd8bXP5llTgSmXoWFWXQIb9+oQhhOZVp1RHNff40tqVfVklUVml3kEFY19blhFgnQDNwJL8B0SZtSZPhfICkasM2p6PBW8m6H/23xaqjf4Dnnc2iumYWpcSi4wDWtb1QJ5NVnmofAPHncx2AoTuwqCfUtb1QJ+OP/CgFAb9XAX5l4N12UhPCrWQ91MlkR7b57EWAHykZsp8TCtkM9lEng5Ll8fYqwENp8LU7oVCUQRFgP3UyOSGT7eq95LU2AIvP6ZogafNpJzWhBdhHnQyK0wdB2Qrg59/iXBPFzr5XtJmuru21BChukq33pa+gB0jhnR+rZcLebVN82kgGqSPjcLeS9V4nkz8vidO/p3L1UX/evjbbhe3SPs05olYy6MK6th86Ida34226W+0P08ocHT7fTsfddZ15pM3olcOkaxgN3Er2YyfEsrANKpUTK3TxA7niDGkAdjvIVlfX9gLAzuWUxdCtDrLVSoemaKhvgG3rZJBaOl5hUQiQHY3hl+eLesxn8ZgV67E61JHUlkXr2CEMIypfLmsbsrYT1nasaItoW7ZRUBp6JA8tkykMTXoGVCLcMQtbsxsuojHbrsUCLnVtmUdF27qsrV+1ZY+r2gqP8+Whx8ZDo0Akk/wUsrOiIvpMN6IdfPYlpGcEOZHY1q/a0iYhzUjWtC0fx4Z2DIbuRKZb/ct9cVxH+iI0adNW1cRp8bg2bSUynf8Bnmp7UknYcoEAAAAASUVORK5CYII=\"","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { colorStyle } from \"../../styles\";\r\nimport \"./stepText.less\";\r\n\r\nexport const StepText = memo(props => {\r\n  const { step, total = 2 } = props;\r\n\r\n  return (\r\n    <div className=\"step-text\" style={colorStyle}>\r\n      Step {step} of {total}\r\n    </div>\r\n  );\r\n});\r\n\r\nStepText.propTypes = {\r\n  step: PropTypes.number.isRequired,\r\n  total: PropTypes.number\r\n};\r\n","import React, { memo, useMemo, useCallback } from \"react\";\r\nimport { useHover } from \"../../hooks\";\r\nimport { colorStyle, borderColorStyle, backgroundStyle } from \"../../styles\";\r\n\r\nconst hoverContainerStyle = {\r\n  ...borderColorStyle,\r\n  ...backgroundStyle,\r\n  color: \"#fff\"\r\n};\r\n\r\nconst hoverTextStyle = {\r\n  color: \"#fff\"\r\n};\r\n\r\nexport const CalendarDay = memo(props => {\r\n  const [hoverRef, isHovered] = useHover();\r\n  const {\r\n    dateKey,\r\n    day,\r\n    onClick,\r\n    today,\r\n    amEnabled = false,\r\n    pmEnabled = false,\r\n    selected\r\n  } = props;\r\n  const enabled = useMemo(() => {\r\n    return amEnabled || pmEnabled;\r\n  }, [amEnabled, pmEnabled]);\r\n\r\n  const containerStyle = useMemo(() => {\r\n    if (enabled) {\r\n      return isHovered || selected ? hoverContainerStyle : borderColorStyle;\r\n    } else {\r\n      return null;\r\n    }\r\n  }, [enabled, isHovered, selected]);\r\n\r\n  const dateTextStyle = useMemo(() => {\r\n    let style;\r\n    if (today) {\r\n      style = colorStyle;\r\n    }\r\n    if (enabled) {\r\n      if (isHovered || selected) {\r\n        style = hoverTextStyle;\r\n      }\r\n    }\r\n    return style;\r\n  }, [isHovered, selected, enabled, today]);\r\n\r\n  const amEnabledStyle = useMemo(() => {\r\n    if (amEnabled) {\r\n      return isHovered || selected ? hoverTextStyle : colorStyle;\r\n    } else {\r\n      return isHovered || selected ? colorStyle : null;\r\n    }\r\n  }, [amEnabled, isHovered, selected]);\r\n\r\n  const pmEnabledStyle = useMemo(() => {\r\n    if (pmEnabled) {\r\n      return isHovered || selected ? hoverTextStyle : colorStyle;\r\n    } else {\r\n      return isHovered || selected ? colorStyle : null;\r\n    }\r\n  }, [pmEnabled, isHovered, selected]);\r\n  const handleClick = useCallback(() => {\r\n    if (enabled) {\r\n      onClick(dateKey);\r\n    }\r\n  }, [enabled, onClick, dateKey]);\r\n  return (\r\n    <div\r\n      ref={hoverRef}\r\n      className={`calendar-day-container calendar-day-date ${\r\n        enabled ? \"enabled\" : \"\"\r\n      }`}\r\n      style={containerStyle}\r\n      onClick={handleClick}\r\n    >\r\n      <div className=\"calendar-day-text\" style={dateTextStyle}>\r\n        {day}\r\n      </div>\r\n      <div className=\"calendar-day-bottom\">\r\n        <span style={amEnabledStyle}>am</span>\r\n        <span style={pmEnabledStyle}>pm</span>\r\n      </div>\r\n    </div>\r\n  );\r\n});\r\n","import moment from \"moment\";\r\nimport { ANY_SELECTION } from \"../constants\";\r\n\r\nexport const filterSpecialtiesHavingAppointmentTypes = specialties => {\r\n  return specialties.filter(f => f.appointmentTypes.length > 0);\r\n};\r\n\r\nexport const filterPractitionersBySpecialty = (\r\n  practitioners,\r\n  specialtyType\r\n) => {\r\n  if (!practitioners) return [];\r\n  return practitioners.filter(p =>\r\n    p.specialties.map(s => s.specialtyTypeId).includes(specialtyType)\r\n  );\r\n};\r\n\r\nexport const filterSchedulesByPractitioner = (schedules, practitioner) => {\r\n  if (practitioner && practitioner !== ANY_SELECTION) {\r\n    return schedules.filter(s => s.practitionerId === practitioner);\r\n  }\r\n  return schedules;\r\n};\r\n\r\nexport const filterSchedulesByLocation = (schedules, location = \"\") => {\r\n  if (!location || location === ANY_SELECTION) return schedules;\r\n  return schedules.filter(\r\n    s =>\r\n      s.Sessions[0].locationId === location ||\r\n      s.Sessions[1].locationId === location\r\n  );\r\n};\r\n\r\nexport const filterLocationsBySchedules = (locations, schedules) => {\r\n  const locationIdsInSchedule = schedules.reduce((current, next) => {\r\n    const sessions = next.Sessions;\r\n    if (!current.includes(sessions[0].locationId)) {\r\n      current.push(sessions[0].locationId);\r\n    }\r\n    if (!current.includes(sessions[1].locationId)) {\r\n      current.push(sessions[1].locationId);\r\n    }\r\n    return current;\r\n  }, []);\r\n  return locations.filter(l => {\r\n    return locationIdsInSchedule.includes(l.locationId);\r\n  });\r\n};\r\n\r\nexport const filterPractitionersBySchedules = (practitioners, schedules) => {\r\n  if (!practitioners || !schedules) return [];\r\n  const practitionerIdsInSchedule = schedules.map(s => s.practitionerId);\r\n\r\n  return practitioners.filter(p =>\r\n    practitionerIdsInSchedule.includes(p.practitionerId)\r\n  );\r\n};\r\n\r\nexport const filterTimeSlotsByLocationAndPractitioner = (\r\n  timeslots,\r\n  location,\r\n  practitioner\r\n) => {\r\n  return timeslots.filter(\r\n    ts =>\r\n      moment(ts.startDateTime).isAfter(moment().add(30, \"minutes\")) &&\r\n      (ts.locationId === location || location === \"ANY\" || !location) &&\r\n      (ts.practitioner.practitionerId === practitioner ||\r\n        practitioner === \"ANY\" ||\r\n        !practitioner)\r\n  );\r\n};\r\n\r\nexport const isTimeZoneUnique = locations => {\r\n  const timeZones = locations\r\n    .filter(l => l.timeZone !== null)\r\n    .reduce((current, next) => {\r\n      if (!current.includes(next.timeZone.timezoneId))\r\n        current.push(next.timeZone.timezoneId);\r\n\r\n      return current;\r\n    }, []);\r\n\r\n  return timeZones.length <= 1;\r\n};\r\n","export function checkIsPhoneConsult(siteConsultTypes, location) {\r\n  return siteConsultTypes.some(\r\n    type => type.siteId === location && type.consultType === 1\r\n  );\r\n}\r\n\r\nexport const isCurrentStep = (steps, key) => {\r\n  return steps[steps.length - 1] === key;\r\n};\r\n","import moment from \"moment\";\r\n\r\n// 2019-12-03T07:00:00+11:00 => 07:00am, 3rd Dec 2019\r\nexport const mapDateTimeStringToText = dateTimeString => {\r\n  return moment(dateTimeString)\r\n    .parseZone(dateTimeString)\r\n    .format(\"hh:mma, Do MMM YYYY\");\r\n};\r\n\r\n// 2019-11-24 => Sunday, Nov 24th 2019\r\nexport const mapDateToTitle = date => {\r\n  return moment(date).format(\"dddd, MMM Do YYYY\");\r\n};\r\n\r\n//2019-12-03T07:00:00+11:00 => 7:00 AM\r\nexport const mapDateTimeToTimeText = datetime => {\r\n  return moment(datetime)\r\n    .parseZone(datetime)\r\n    .format(\"hh:mm a\");\r\n};\r\n\r\nexport const mapJsDateToYearMonthDayString = date => {\r\n  return moment(date).format(\"YYYY-MM-DD\");\r\n};\r\n\r\nexport const createTimeSlotObjectForScheduleDrawer = (\r\n  timeslotWithCurrentKey,\r\n  momentJsTime,\r\n  timeslotInDatasource\r\n) => {\r\n  let newTimeslot = timeslotWithCurrentKey\r\n    ? { ...timeslotWithCurrentKey }\r\n    : { am: [], pm: [] };\r\n  const amPmKey = ~~(momentJsTime.hour() / 12) ? \"pm\" : \"am\";\r\n  newTimeslot[amPmKey].push(timeslotInDatasource);\r\n  return newTimeslot;\r\n};\r\n\r\nexport const getUniqueTimeSlots = timeslots => {\r\n  return timeslots\r\n    .reduce((current, next) => {\r\n      if (\r\n        !current.some(\r\n          s =>\r\n            s.startDateTime === next.startDateTime &&\r\n            s.endDateTime === next.endDateTime\r\n        )\r\n      ) {\r\n        current.push(next);\r\n      }\r\n      return current;\r\n    }, [])\r\n    .map(({ startDateTime, endDateTime }) => {\r\n      return { startDateTime, endDateTime };\r\n    });\r\n};\r\n\r\nexport const mapMomentjsToDateTimeString = momentJsDateTime => {\r\n  if (momentJsDateTime instanceof Date) {\r\n    momentJsDateTime = moment(momentJsDateTime);\r\n  }\r\n  return momentJsDateTime.format(\"YYYY-MM-DDTHH:mm:ss\");\r\n};\r\n\r\nexport const isFutureDate = date => {\r\n  return moment(date).isAfter(moment());\r\n};\r\n\r\n//dd/mm/yyyy\r\nconst AUS_DATE_REGEX = new RegExp(/^([0-3][0-9])\\/([0-1][0-9])\\/[1-2]\\d{3}$/);\r\n// map dd/mm/yyyy => JS Date\r\nexport const mapAusDateStrToDate = ausDate => {\r\n  if (!AUS_DATE_REGEX.test(ausDate)) return null;\r\n  // dd/mm/yyyy => [dd,mm,yyyy]\r\n\r\n  const dateArr = ausDate.split(\"/\");\r\n  const momentJsDate = moment(`${dateArr[2]}-${dateArr[1]}-${dateArr[0]}`);\r\n\r\n  if (!momentJsDate.isValid()) return null;\r\n  if (momentJsDate.isBefore(moment(\"1900-01-01\"))) return null;\r\n\r\n  return momentJsDate.toDate();\r\n};\r\n\r\nexport const isDateBirthWithInRange = date => {\r\n  if (!(date instanceof Date)) return false;\r\n  return !isFutureDate(date);\r\n};\r\n\r\n// map js date => dd/mm/yyyy\r\nexport const mapDateToAusDateStr = date => {\r\n  return moment(date).format(\"DD/MM/YYYY\");\r\n};\r\n\r\nexport const mapDateToICalDatetimeFormat = date => {\r\n  return moment(date)\r\n    .parseZone(date)\r\n    .format(\"YYYYMMDDTHHmmss\");\r\n};\r\n","import validator from 'validator';\r\nimport { FORM_KEYS } from '../constants';\r\nimport { mapAusDateStrToDate, isDateBirthWithInRange } from './dateTimeHelper';\r\nimport { validateMedicareCard } from './medicareHelpers';\r\n\r\nconst isEmpty = value => {\r\n  if (value && value.trim()) {\r\n    return false;\r\n  } else {\r\n    return true;\r\n  }\r\n};\r\n\r\nconst isValidName = value => {\r\n  if (value) return /^[- a-zA-Z0-9'_]+$/.test(value);\r\n  return true;\r\n};\r\n\r\nconst isMobile = value => {\r\n  if (value.indexOf('04') === 0 && value.length === 10) {\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\nconst isEmail = value => {\r\n  if (/^\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,25}\\b$/i.test(value)) {\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\nexport const isPostcode = value => {\r\n  if (/^[0-9]{4}$/i.test(value)) {\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\nconst mandatoryObject = errorMessage => {\r\n  return {\r\n    required: value => {\r\n      if (isEmpty(value)) {\r\n        return errorMessage;\r\n      } else {\r\n        return '';\r\n      }\r\n    }\r\n  };\r\n};\r\n\r\nexport const validators = {\r\n  [FORM_KEYS.FIRST_NAME]: {\r\n    ...mandatoryObject('Firstname is required'),\r\n    valid: value => {\r\n      return !isValidName(value) ? 'Invalid firstname' : '';\r\n    }\r\n  },\r\n  [FORM_KEYS.MIDDLE_NAME]: {\r\n    valid: value => {\r\n      return !isValidName(value) ? 'Invalid middle name' : '';\r\n    }\r\n  },\r\n  [FORM_KEYS.LAST_NAME]: {\r\n    ...mandatoryObject('Last name is required'),\r\n    valid: value => {\r\n      return !isValidName(value) ? 'Invalid last name' : '';\r\n    }\r\n  },\r\n  [FORM_KEYS.PREFERRED_NAME]: {\r\n    valid: value => {\r\n      return value && !isValidName(value) ? 'Invalid preferred name' : '';\r\n    }\r\n  },\r\n  [FORM_KEYS.DATE_OF_BIRTH]: {\r\n    ...mandatoryObject('Date of birth is required'),\r\n    valid: value => {\r\n      const date = mapAusDateStrToDate(value);\r\n      if (!date) {\r\n        return 'Valid date format is dd/mm/yyyy';\r\n      }\r\n      if (!isDateBirthWithInRange(date)) {\r\n        return 'Date of birth cannot be in future';\r\n      }\r\n      return '';\r\n    }\r\n  },\r\n  [FORM_KEYS.MOBILE]: {\r\n    ...mandatoryObject('Mobile number is required'),\r\n    valid: value => {\r\n      if (!isMobile(value)) {\r\n        return 'Mobile number needs to be 10 digit numbers starting with 04';\r\n      } else {\r\n        return '';\r\n      }\r\n    }\r\n  },\r\n  [FORM_KEYS.EMAIL]: {\r\n    ...mandatoryObject('Email is required'),\r\n    valid: value => {\r\n      if (!isEmail(value)) {\r\n        return 'Invalid email. Please use letters, numbers, underscores and periods.';\r\n      } else {\r\n        return '';\r\n      }\r\n    }\r\n  }\r\n};\r\n\r\nexport const getCommentsFieldsValidator = (isCommentMandatory = false) => {\r\n  return isCommentMandatory\r\n    ? {\r\n        ...mandatoryObject('Comment is required')\r\n      }\r\n    : null;\r\n};\r\n\r\nexport const getAddressFieldsValidator = (\r\n  key,\r\n  addressValue,\r\n  isAddressMandatory = false\r\n) => {\r\n  switch (key) {\r\n    case FORM_KEYS.CLIENT_ADDRESS:\r\n      return isAddressMandatory\r\n        ? {\r\n            ...mandatoryObject('Your address is required')\r\n          }\r\n        : null;\r\n    case FORM_KEYS.CLIENT_SUBURB:\r\n      return isAddressMandatory || addressValue\r\n        ? {\r\n            ...mandatoryObject(\r\n              !isAddressMandatory && addressValue\r\n                ? 'Please fill in your suburb for your address'\r\n                : 'Suburb is required'\r\n            )\r\n          }\r\n        : null;\r\n    case FORM_KEYS.CLIENT_POSTCODE:\r\n      return isAddressMandatory || addressValue\r\n        ? {\r\n            ...mandatoryObject(\r\n              !isAddressMandatory && addressValue\r\n                ? 'Please fill in your postcode for your address'\r\n                : 'Postcode is required'\r\n            ),\r\n            valid: value => {\r\n              return !isPostcode(value) ? 'Please enter a valid Australian Postcode' : '';\r\n            }\r\n          }\r\n        : {\r\n            valid: value => {\r\n              return value && !isPostcode(value) ? 'Please enter a valid Australian Postcode' : '';\r\n            }\r\n          };\r\n    default:\r\n      return null;\r\n  }\r\n};\r\n\r\nexport const getMedicareValidator = (\r\n  key,\r\n  {\r\n    [FORM_KEYS.MEDICARE_NUMBER]: numberValue,\r\n    [FORM_KEYS.MEDICARE_EXPIRY]: expiryValue\r\n  }\r\n) => {\r\n  switch (key) {\r\n    case FORM_KEYS.MEDICARE_NUMBER:\r\n      const numberValid = val => {\r\n        if (!val) {\r\n          return !expiryValue ? null : 'Please fill in medicare card number';\r\n        }\r\n        const [num, irn] = val.split('/').map(item => item.replace(/_/g, ''));\r\n        if (!validateMedicareCard(num)) return 'Invalid medicare card number';\r\n        if (!irn) return 'The medicare IRN is required';\r\n        return null;\r\n      };\r\n      return { numberValid };\r\n    case FORM_KEYS.MEDICARE_EXPIRY:\r\n      const expiryValid = val => {\r\n        if (!val) {\r\n          return !numberValue ? null : 'Please select medicare expiry';\r\n        }\r\n        return null;\r\n      };\r\n      return { expiryValid };\r\n    default:\r\n      return null;\r\n  }\r\n};\r\n\r\nexport const getCreditCardValidator = (key, mandatory) => {\r\n  switch (key) {\r\n    case FORM_KEYS.CREDIT_CARD_NUMBER:\r\n      const cardValid = val => {\r\n        if (!val) return null;\r\n        const isValid = validator.isCreditCard(val);\r\n        return isValid ? null : 'Invalid card number';\r\n      };\r\n      return mandatory\r\n        ? { ...mandatoryObject('Please fill in card number'), cardValid }\r\n        : { cardValid };\r\n    case FORM_KEYS.CREDIT_CARD_EXPIRY:\r\n      return mandatory\r\n        ? mandatoryObject('Please select the card expiry')\r\n        : null;\r\n    case FORM_KEYS.CREDIT_CARD_NAME:\r\n      const nameValid = val => {\r\n        if (!val) return null;\r\n        const isValid = val.split(' ').filter(Boolean).length >= 2;\r\n        return isValid ? null : 'Invalid cardholder name';\r\n      };\r\n      return mandatory\r\n        ? { ...mandatoryObject('Please fill in cardholder name'), nameValid }\r\n        : { nameValid };\r\n    case FORM_KEYS.CREDIT_CARD_SECURITY_CODE:\r\n      const codeValid = val => {\r\n        if (!val) return null;\r\n        const isValid = /^\\d{3,4}$/.test(val);\r\n        return isValid ? null : 'Invalid security code';\r\n      };\r\n      return mandatory\r\n        ? { ...mandatoryObject('Please fill in security code'), codeValid }\r\n        : { codeValid };\r\n    default:\r\n      return null;\r\n  }\r\n};\r\n\r\nexport const validate = (rules, value, ...args) => {\r\n  if (!rules) return '';\r\n  let errorMessage = '';\r\n  const keys = Object.keys(rules);\r\n  for (let key of keys) {\r\n    errorMessage = rules[key](value, args[0]);\r\n    if (errorMessage) {\r\n      break;\r\n    }\r\n  }\r\n  return errorMessage;\r\n};\r\n\r\n// medicare number and expiry should be:\r\n// 1. both have values\r\n// 2. both leave empty\r\nexport const areMedicareInfoValid = (number, expiry) => {\r\n  // true ^ true or false ^ false = 0 ||||| false ^ true or true ^ false = 1\r\n  return !(!!number ^ !!expiry);\r\n};\r\n","import moment from 'moment';\r\n\r\n// copy this validation from our ASP project => includes/validateMedicareCard.js\r\nexport const validateMedicareCard = cardNumber => {\r\n  let validated = false;\r\n  const enteredMedicareCardNumber = cardNumber;\r\n  const enteredMedicareCardNumberLength = enteredMedicareCardNumber.length;\r\n  let totalValue = 0;\r\n  if (enteredMedicareCardNumberLength === 10) {\r\n    for (let i = 0; i <= enteredMedicareCardNumberLength; i++) {\r\n      if (enteredMedicareCardNumber.substring(i, i + 1) !== '') {\r\n        switch (i) {\r\n          case 1:\r\n            totalValue += parseFloat(enteredMedicareCardNumber.substring(0, i));\r\n            break;\r\n          case 2:\r\n            totalValue += parseFloat(\r\n              enteredMedicareCardNumber.substring(1, i) * 3\r\n            );\r\n            break;\r\n          case 3:\r\n            totalValue += parseFloat(\r\n              enteredMedicareCardNumber.substring(2, i) * 7\r\n            );\r\n            break;\r\n          case 4:\r\n            totalValue += parseFloat(\r\n              enteredMedicareCardNumber.substring(3, i) * 9\r\n            );\r\n            break;\r\n          case 5:\r\n            totalValue += parseFloat(enteredMedicareCardNumber.substring(4, i));\r\n            break;\r\n          case 6:\r\n            totalValue += parseFloat(\r\n              enteredMedicareCardNumber.substring(5, i) * 3\r\n            );\r\n            break;\r\n          case 7:\r\n            totalValue += parseFloat(\r\n              enteredMedicareCardNumber.substring(6, i) * 7\r\n            );\r\n            break;\r\n          case 8:\r\n            totalValue += parseFloat(\r\n              enteredMedicareCardNumber.substring(7, i) * 9\r\n            );\r\n            break;\r\n          default:\r\n            break;\r\n        }\r\n      }\r\n    }\r\n    const verifiedInteger = totalValue % 10;\r\n    if (\r\n      verifiedInteger === parseInt(enteredMedicareCardNumber.substring(8, 9))\r\n    ) {\r\n      validated = true;\r\n    } else {\r\n      validated = false;\r\n    }\r\n  } else {\r\n    validated = false;\r\n  }\r\n  return validated;\r\n};\r\n\r\nexport const getMedicareNumberAndIRNFromString = number => {\r\n  if (!number) {\r\n    return { medicareCardNumber: null, medicareCardIRN: null };\r\n  }\r\n  const [medicareCardNumber, medicareCardIRN] = number.split('/');\r\n  return { medicareCardNumber, medicareCardIRN };\r\n};\r\n\r\nexport const getMedicareExpiryDateFromString = expiry => {\r\n  // expiry = \"\" or \"01/2021\"\r\n  const momentJsDate = moment(expiry, 'MM/YYYY');\r\n  if (momentJsDate.isValid()) {\r\n    return momentJsDate.format();\r\n  }\r\n  return null;\r\n};\r\n","import { ANY_SELECTION } from '../constants';\r\nimport { mapDateTimeStringToText } from './';\r\n\r\n// {specialtyTypeText,appointmentTypeText, isTelehealthAppointment}\r\nexport const getSpecialtyTypeAppointmentType = (\r\n  specialtyTypes,\r\n  specialtyTypeValue,\r\n  appointmentTypeValue\r\n) => {\r\n  let result = {\r\n    specialtyTypeText: '',\r\n    appointmentTypeText: '',\r\n    isTelehealthAppointment: false\r\n  };\r\n  if (!!specialtyTypeValue && !!appointmentTypeValue) {\r\n    const foundSpecialtyType = specialtyTypes.find(\r\n      s => s.specialtyTypeId === specialtyTypeValue\r\n    );\r\n    if (foundSpecialtyType) {\r\n      result.specialtyTypeText = foundSpecialtyType.name;\r\n      const foundAppointmentType = foundSpecialtyType.appointmentTypes.find(\r\n        a => a.appointmentTypeId === appointmentTypeValue\r\n      );\r\n      if (!!foundAppointmentType) {\r\n        result.appointmentTypeText = foundAppointmentType.description;\r\n        result.isTelehealthAppointment =\r\n          !!foundAppointmentType.isTeleHealthEnabled;\r\n      }\r\n    }\r\n  } else if (!!appointmentTypeValue) {\r\n    for (var i = 0; i < specialtyTypes.length; i++) {\r\n      const foundAppointmentType = specialtyTypes[i].appointmentTypes.find(\r\n        a => a.appointmentTypeId === appointmentTypeValue\r\n      );\r\n      if (!!foundAppointmentType) {\r\n        result.appointmentTypeText = foundAppointmentType.description;\r\n        result.isTelehealthAppointment =\r\n          !!foundAppointmentType.isTeleHealthEnabled;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n};\r\n\r\n// {locationText, position}\r\nexport const getLocationTextAndPosition = (\r\n  locations,\r\n  positions,\r\n  locationValue\r\n) => {\r\n  if (locationValue === ANY_SELECTION || !locationValue)\r\n    return { locationText: 'ANY Location', position: null };\r\n\r\n  const locationDetail = locations.find(l => l.locationId === locationValue);\r\n  let result = {\r\n    locationText: '',\r\n    position: null\r\n  };\r\n  if (locationDetail) {\r\n    result = {\r\n      locationText: `${locationDetail.name}, ${locationDetail.suburb}`,\r\n      position: positions[locationDetail.locationId]\r\n    };\r\n  }\r\n  return result;\r\n};\r\n\r\nexport const getPractitionerText = (practitioners, practitionerValue) => {\r\n  if (practitionerValue === ANY_SELECTION || !practitionerValue)\r\n    return 'ANY Practitioner';\r\n\r\n  const practitionerDetail = practitioners.find(\r\n    p => p.practitionerId === practitionerValue\r\n  );\r\n  return practitionerDetail\r\n    ? `${practitionerDetail.firstName} ${practitionerDetail.lastName}`\r\n    : '';\r\n};\r\n\r\nexport const getPractitionerFirstName = (practitioners, practitionerValue) => {\r\n  if (practitionerValue === ANY_SELECTION || !practitionerValue)\r\n    return 'Unknown';\r\n\r\n  const practitionerDetail = practitioners.find(\r\n    p => p.practitionerId === practitionerValue\r\n  );\r\n  return practitionerDetail ? `${practitionerDetail.firstName}` : '';\r\n};\r\n\r\nexport const getPractitionerLastName = (practitioners, practitionerValue) => {\r\n  if (practitionerValue === ANY_SELECTION || !practitionerValue)\r\n    return 'Unknown';\r\n\r\n  const practitionerDetail = practitioners.find(\r\n    p => p.practitionerId === practitionerValue\r\n  );\r\n  return practitionerDetail ? `${practitionerDetail.lastName}` : '';\r\n};\r\n\r\nexport const getAppointmentDateTimeText = (\r\n  appointmentDateTime,\r\n  waitingListRequired = false,\r\n  waitingListPreferredTime = ''\r\n) => {\r\n  return waitingListRequired\r\n    ? `${waitingListPreferredTime} preferred`\r\n    : appointmentDateTime\r\n    ? mapDateTimeStringToText(appointmentDateTime.startDateTime)\r\n    : '';\r\n};\r\n\r\nexport const getHideSpecialty = config => {\r\n  return config.preSelectSpecialtyType && config.preSelectSpecialtyType !== '';\r\n};\r\n\r\nexport const getHidePractitioner = config => {\r\n  return config.preSelectPractitioner && config.preSelectPractitioner !== '';\r\n};\r\n\r\nexport const getFullAddress = location => {\r\n  if (!location) return '';\r\n  const { streetAddress, suburb, postcode, country } = location;\r\n  return `${streetAddress}, ${suburb} ${postcode}, ${country}`;\r\n};\r\n\r\nexport const getTimezoneText = (timezoneId, timezoneList) => {\r\n  return (\r\n    timezoneList.find(timezone => timezone.timezoneUID === timezoneId)\r\n      ?.description || ''\r\n  );\r\n};\r\n\r\nexport const timezoneTextAndTzIdMap = {\r\n  adelaide: 'Australia/Adelaide',\r\n  brisbane: 'Australia/Brisbane',\r\n  'broken hill': 'Australia/Broken_Hill',\r\n  'cocos islands': 'Indian/Cocos',\r\n  currie: 'Australia/Currie',\r\n  darwin: 'Australia/Darwin',\r\n  eucla: 'Australia/Eucla',\r\n  hobart: 'Australia/Hobart',\r\n  lindeman: 'Australia/Lindeman',\r\n  'lord howe': 'Australia/Lord_Howe',\r\n  melbourne: 'Australia/Melbourne',\r\n  perth: 'Australia/Perth',\r\n  sydney: 'Australia/Sydney'\r\n};\r\n","import { getParameterByName } from \"../../../utils\";\r\n\r\nexport const getAppointmentIdFromUrl = () => {\r\n  const appointmentId = getParameterByName(\"appointmentId\");\r\n  return appointmentId;\r\n};\r\n","export const mappingContentTypeWithFileName = fileName => {\r\n  const { extension } = getFileNameWithExtension(fileName);\r\n  switch (extension) {\r\n    case \"pdf\":\r\n      return \"application/pdf\";\r\n    case \"jpg\":\r\n    case \"jpeg\":\r\n      return \"image/jpeg\";\r\n    case \"png\":\r\n      return \"image/png\";\r\n    case \"gif\":\r\n      return \"image/gif\";\r\n    case \"doc\":\r\n      return \"application/msword\";\r\n    case \"docx\":\r\n      return \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\r\n    case \"rtf\":\r\n      return \"application/rtf\";\r\n    case \"html\":\r\n      return \"text/html\";\r\n    case \"txt\":\r\n      return \"text/plain\";\r\n    case \"msg\":\r\n      return \"text/plain\";\r\n    case \"pages\":\r\n      return \"text/plain\";\r\n    default:\r\n      return \"application/octet-stream\";\r\n  }\r\n};\r\n\r\nexport const base64ToArrayBuffer = base64 => {\r\n  var binaryString = window.atob(base64);\r\n  var binaryLen = binaryString.length;\r\n  var bytes = new Uint8Array(binaryLen);\r\n  for (var i = 0; i < binaryLen; i++) {\r\n    var ascii = binaryString.charCodeAt(i);\r\n    bytes[i] = ascii;\r\n  }\r\n  return bytes;\r\n};\r\n\r\nexport const getFileNameWithExtension = (fileName = \"\") => {\r\n  //return {name, extension};\r\n  let name = fileName,\r\n    extension = \"\";\r\n  const splitedFileNameArray = fileName.split(\".\");\r\n  if (splitedFileNameArray.length > 1) {\r\n    extension = splitedFileNameArray[\r\n      splitedFileNameArray.length - 1\r\n    ].toLowerCase();\r\n    name = splitedFileNameArray\r\n      .slice(0, splitedFileNameArray.length - 1)\r\n      .join(\".\");\r\n  }\r\n  return {\r\n    name,\r\n    extension\r\n  };\r\n};\r\n","const getPinApiInstanceFactory = (publishKey, isTest = true) => {\r\n  const mode = isTest ? 'test' : 'live';\r\n  if (!window.Pin) return null;\r\n  return new window.Pin.Api(publishKey, mode);\r\n};\r\n\r\n// const card = {\r\n//   number,\r\n//   name,\r\n//   expiry_month,\r\n//   expiry_year,\r\n//   cvc,\r\n// };\r\n\r\n// error: \"invalid_resource\"\r\n// error_description: \"One or more parameters were missing or invalid\"\r\n// messages: [{param: \"number\", code: \"number_invalid\", message: \"Number can't be blank\"},…]\r\n// 0: {param: \"number\", code: \"number_invalid\", message: \"Number can't be blank\"}\r\n// 1: {param: \"expiry_month\", code: \"expiry_month_invalid\", message: \"Expiry month can't be blank\"}\r\n// 2: {param: \"expiry_year\", code: \"expiry_year_invalid\", message: \"Expiry year can't be blank\"}\r\n// 3: {param: \"name\", code: \"name_invalid\", message: \"Name can't be blank\"}\r\n// 4: {param: \"cvc\", code: \"cvc_invalid\", message: \"Cvc can't be blank\"}\r\n\r\n// card.token\r\n\r\nexport const fetchForCardTokenPromise = (publishKey, card, isTest) => {\r\n  const pinApi = getPinApiInstanceFactory(publishKey, isTest);\r\n  if (!pinApi) return null;\r\n  return new Promise((resolve, reject) => {\r\n    pinApi.createCardToken(card).then(resolve, reject).done();\r\n  });\r\n};\r\n\r\nexport const canSaveCreditCard = state => {\r\n  const { isCreditCardEnabled } = state.config;\r\n  const { onlinePaymentToken } = state.datasource;\r\n  return isCreditCardEnabled && onlinePaymentToken;\r\n};\r\n\r\nexport const createPinPaymentsScript = () => {\r\n  const script = document.createElement('script');\r\n  script.src = 'https://cdn.pinpayments.com/pin.v2.js';\r\n  document.getElementsByTagName('head')[0].appendChild(script);\r\n};\r\n\r\nexport const areNotAllCreditCardFieldsFilled = (\r\n  name,\r\n  number,\r\n  expiryDate,\r\n  securityCode\r\n) => {\r\n  const hasValueFieldsNumber = [name, number, expiryDate, securityCode].filter(\r\n    Boolean\r\n  ).length;\r\n  return hasValueFieldsNumber > 0 && hasValueFieldsNumber < 4;\r\n};\r\n","import React, { memo } from \"react\";\r\nimport DayPicker from \"react-day-picker\";\r\nimport { CalendarDay } from \"./CalendarDay\";\r\nimport { mapJsDateToYearMonthDayString } from \"../../helpers\";\r\nimport \"react-day-picker/lib/style.css\";\r\nimport \"./calendar.less\";\r\n\r\nexport const Calendar = memo(props => {\r\n  const {\r\n    month,\r\n    fromMonth,\r\n    timeSlots,\r\n    onDayClick,\r\n    onMonthChange,\r\n    selectedDay\r\n  } = props;\r\n  const renderDay = (day, { today }) => {\r\n    const dateKey = mapJsDateToYearMonthDayString(day);\r\n    const timeSlot = timeSlots[dateKey];\r\n    let amEnabled = false;\r\n    let pmEnabled = false;\r\n    if (timeSlot) {\r\n      amEnabled = timeSlot.am && timeSlot.am.length > 0;\r\n      pmEnabled = timeSlot.pm && timeSlot.pm.length > 0;\r\n    }\r\n    const selected = !!selectedDay && dateKey === selectedDay;\r\n    const date = day.getDate();\r\n    return (\r\n      <CalendarDay\r\n        dateKey={dateKey}\r\n        day={date}\r\n        today={today}\r\n        amEnabled={amEnabled}\r\n        pmEnabled={pmEnabled}\r\n        selected={selected}\r\n        onClick={onDayClick}\r\n      />\r\n    );\r\n  };\r\n  return (\r\n    <DayPicker\r\n      month={month}\r\n      fromMonth={fromMonth}\r\n      className=\"client-portal-calendar\"\r\n      renderDay={renderDay}\r\n      onMonthChange={onMonthChange}\r\n    />\r\n  );\r\n});\r\n","import React, { memo, useEffect, useState, useCallback, useMemo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport DayPicker from \"react-day-picker\";\r\nimport { backgroundStyle } from \"../../styles\";\r\nimport { useHover } from \"../../hooks\";\r\nimport {\r\n  mapAusDateStrToDate,\r\n  mapDateToAusDateStr,\r\n  isDateBirthWithInRange\r\n} from \"../../helpers\";\r\nimport { isSameDay } from \"../../../../utils\";\r\nimport \"react-day-picker/lib/style.css\";\r\nimport \"./dateOfBirthCalendar.less\";\r\n\r\nconst firstYear = new Date(1900);\r\nconst fromDate = new Date(firstYear, 0);\r\nconst toDate = new Date();\r\n\r\nexport const DateOfBirthCalendar = memo(props => {\r\n  const [monthDate, setMonthDate] = useState(null);\r\n  const { dateString, onSelect } = props;\r\n\r\n  const jsDate = useMemo(() => {\r\n    const date = mapAusDateStrToDate(dateString);\r\n    return isDateBirthWithInRange(date) ? date : null;\r\n  }, [dateString]);\r\n\r\n  useEffect(() => {\r\n    if (jsDate) {\r\n      setMonthDate(jsDate);\r\n    }\r\n  }, [jsDate]);\r\n\r\n  const renderDay = useCallback(\r\n    day => {\r\n      const date = day.getDate();\r\n      const selected = jsDate && isSameDay(day, jsDate);\r\n      return <DayComponent date={date} selected={selected} />;\r\n    },\r\n    [jsDate]\r\n  );\r\n\r\n  const handleYearMonthChange = useCallback(month => {\r\n    setMonthDate(month);\r\n  }, []);\r\n\r\n  const handleDayClick = useCallback(\r\n    (day, { selected }) => {\r\n      const dateStr = mapDateToAusDateStr(day);\r\n      onSelect(dateStr);\r\n    },\r\n    [onSelect]\r\n  );\r\n\r\n  const disabledDays = useMemo(() => [{ after: toDate }], []);\r\n\r\n  const captionElement = useCallback(\r\n    ({ date, localeUtils }) => {\r\n      return (\r\n        <YearMonthForm\r\n          date={date}\r\n          localeUtils={localeUtils}\r\n          onChange={handleYearMonthChange}\r\n        />\r\n      );\r\n    },\r\n    [handleYearMonthChange]\r\n  );\r\n  return (\r\n    <DayPicker\r\n      className=\"birthday-calendar\"\r\n      onDayClick={handleDayClick}\r\n      month={monthDate}\r\n      fromMonth={fromDate}\r\n      toMonth={toDate}\r\n      renderDay={renderDay}\r\n      disabledDays={disabledDays}\r\n      captionElement={captionElement}\r\n    />\r\n  );\r\n});\r\n\r\nDateOfBirthCalendar.propTypes = {\r\n  dateString: PropTypes.string,\r\n  valid: PropTypes.bool,\r\n  onSelect: PropTypes.func.isRequired\r\n};\r\n\r\n// year month selection in the calendar header\r\nconst YearMonthForm = memo(({ date, localeUtils, onChange }) => {\r\n  const months = localeUtils.getMonths();\r\n\r\n  const years = [];\r\n  for (let i = fromDate.getFullYear(); i <= toDate.getFullYear(); i++) {\r\n    years.push(i);\r\n  }\r\n\r\n  const handleChange = function handleChange(e) {\r\n    const { year, month } = e.target.form;\r\n    onChange(new Date(year.value, month.value));\r\n  };\r\n\r\n  return (\r\n    <form className=\"DayPicker-Caption\" style={backgroundStyle}>\r\n      <select name=\"month\" onChange={handleChange} value={date.getMonth()}>\r\n        {months.map((month, i) => (\r\n          <option key={month} value={i}>\r\n            {month}\r\n          </option>\r\n        ))}\r\n      </select>\r\n      <select name=\"year\" onChange={handleChange} value={date.getFullYear()}>\r\n        {years.map(year => (\r\n          <option key={year} value={year}>\r\n            {year}\r\n          </option>\r\n        ))}\r\n      </select>\r\n    </form>\r\n  );\r\n});\r\n\r\nconst hoverStyle = {\r\n  color: \"#fff\",\r\n  ...backgroundStyle\r\n};\r\nconst DayComponent = memo(props => {\r\n  const [hoverRef, isHovered] = useHover();\r\n  const { date, selected } = props;\r\n  return (\r\n    <div\r\n      ref={hoverRef}\r\n      className=\"birthday-calendar-day\"\r\n      style={isHovered || selected ? hoverStyle : null}\r\n    >\r\n      {date}\r\n    </div>\r\n  );\r\n});\r\n","import React, { memo, useMemo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport TextField from \"@material-ui/core/TextField\";\r\nimport { CloseIcon } from \"../Icon\";\r\nimport \"./inputBox.less\";\r\n\r\nexport const InputBox = memo(props => {\r\n  const {\r\n    label,\r\n    value,\r\n    errorText,\r\n    onBlur,\r\n    onChange,\r\n    className = \"\",\r\n    ...restProps\r\n  } = props;\r\n  const errorTextComponent = useMemo(() => {\r\n    return <InputBoxError errorText={errorText} />;\r\n  }, [errorText]);\r\n  return (\r\n    <TextField\r\n      {...restProps}\r\n      error={!!errorText}\r\n      label={label}\r\n      value={value}\r\n      helperText={errorTextComponent}\r\n      onChange={e => onChange(e.target.value)}\r\n      onBlur={onBlur}\r\n      className={`client-portal-input-box ${className}`}\r\n    />\r\n  );\r\n});\r\n\r\nInputBox.propTypes = {\r\n  label: PropTypes.string.isRequired,\r\n  value: PropTypes.string,\r\n  errorText: PropTypes.string,\r\n  onBlur: PropTypes.func,\r\n  onChange: PropTypes.func.isRequired,\r\n  className: PropTypes.string\r\n};\r\n\r\nconst InputBoxError = memo(props => {\r\n  const { errorText } = props;\r\n  if (!errorText) return null;\r\n  return (\r\n    <span className=\"input-error-text\">\r\n      <CloseIcon />\r\n      {errorText}\r\n    </span>\r\n  );\r\n});\r\n\r\nInputBoxError.propTypes = {\r\n  errorText: PropTypes.string\r\n};\r\n","import React, { memo, useState, useCallback } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Autocomplete from \"@material-ui/lab/Autocomplete\";\r\nimport { InputBox } from \"../InputBox/InputBox\";\r\nimport \"./autocompleteBox.less\";\r\n\r\nexport const AutocompleteBox = memo(props => {\r\n  const [inputText, setInputText] = useState(\"\");\r\n  const { label, options, onChange, onSearch, ...restProps } = props;\r\n  const handleChange = useCallback(\r\n    (e, option) => {\r\n      if (!option) setInputText(\"\");\r\n\r\n      onChange(option.value);\r\n      setInputText(option.text);\r\n    },\r\n    [onChange]\r\n  );\r\n\r\n  const handleSearch = value => {\r\n    setInputText(value);\r\n    onSearch && onSearch(value);\r\n  };\r\n  return (\r\n    <Autocomplete\r\n      {...restProps}\r\n      className=\"client-portal-autocomplete\"\r\n      disableClearable\r\n      options={options}\r\n      onChange={handleChange}\r\n      getOptionLabel={option => option.text}\r\n      renderInput={params => {\r\n        return (\r\n          <InputBox\r\n            {...params}\r\n            label={label}\r\n            fullWidth\r\n            value={inputText}\r\n            onChange={handleSearch}\r\n            inputProps={{\r\n              ...params.inputProps,\r\n              autoComplete: \"none\"\r\n            }}\r\n          />\r\n        );\r\n      }}\r\n    />\r\n  );\r\n});\r\n\r\nAutocompleteBox.propTypes = {\r\n  label: PropTypes.string.isRequired,\r\n  options: PropTypes.array,\r\n  onChange: PropTypes.func.isRequired\r\n};\r\n","import React, { memo, useCallback, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Autocomplete from \"@material-ui/lab/Autocomplete\";\r\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\r\nimport { InputBox } from \"../InputBox/InputBox\";\r\nimport { blurInputWhenTypeEnter } from \"../../../../utils\";\r\nimport \"./autocompleteBox.less\";\r\n\r\nexport const ComboBox = memo(props => {\r\n  const {\r\n    label,\r\n    value,\r\n    errorText,\r\n    options,\r\n    onChange,\r\n    onSearch,\r\n    onBlur,\r\n    loading,\r\n    ...restProps\r\n  } = props;\r\n\r\n  useEffect(() => {\r\n    document.addEventListener(\"keyup\", blurInputWhenTypeEnter, false);\r\n    return () => {\r\n      document.removeEventListener(\"keyup\", blurInputWhenTypeEnter, false);\r\n    };\r\n  }, []);\r\n  const handleChange = useCallback(\r\n    (e, option) => {\r\n      onChange(option.value, option);\r\n\r\n      setTimeout(() => {\r\n        // blur the input box\r\n        document.activeElement && document.activeElement.blur();\r\n      }, 0);\r\n    },\r\n    [onChange]\r\n  );\r\n\r\n  const handleSearch = value => {\r\n    onSearch(value);\r\n  };\r\n  return (\r\n    <div className=\"client-portal-autocomplete-container\">\r\n      <Autocomplete\r\n        {...restProps}\r\n        freeSolo\r\n        className=\"client-portal-autocomplete\"\r\n        disableClearable\r\n        options={options}\r\n        onChange={handleChange}\r\n        getOptionLabel={option => {\r\n          return option.text || option;\r\n        }}\r\n        filterSelectedOptions={true}\r\n        noOptionsText={\"\"}\r\n        inputValue={value || \"\"}\r\n        autoHighlight={true}\r\n        renderInput={params => {\r\n          return (\r\n            <InputBox\r\n              {...params}\r\n              label={label}\r\n              fullWidth\r\n              value={value}\r\n              onChange={handleSearch}\r\n              onBlur={onBlur}\r\n              errorText={errorText}\r\n              inputProps={{\r\n                ...params.inputProps,\r\n                autoComplete: \"none\"\r\n              }}\r\n            />\r\n          );\r\n        }}\r\n      />\r\n      {loading && (\r\n        <CircularProgress\r\n          size={16}\r\n          className=\"client-portal-autocomplete-spinner\"\r\n        />\r\n      )}\r\n    </div>\r\n  );\r\n});\r\n\r\nComboBox.propTypes = {\r\n  label: PropTypes.string.isRequired,\r\n  value: PropTypes.string,\r\n  errorText: PropTypes.string,\r\n  options: PropTypes.array,\r\n  onChange: PropTypes.func.isRequired,\r\n  onSearch: PropTypes.func.isRequired,\r\n  onBlur: PropTypes.func,\r\n  loading: PropTypes.bool\r\n};\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Dialog from \"@material-ui/core/Dialog\";\r\nimport { CloseIcon, ThemeColorButton } from \"../\";\r\nimport \"./modal.less\";\r\n\r\nexport const Modal = memo(props => {\r\n  const { open, title, message, onClose, onConfirm } = props;\r\n\r\n  return (\r\n    <Dialog\r\n      classes={{\r\n        root: \"zindex-message\",\r\n        paperScrollPaper: \"modal-container\"\r\n      }}\r\n      open={open}\r\n    >\r\n      {open && (\r\n        <div className=\"modal-content\">\r\n          <div className=\"modal-content-header\">\r\n            <h2 className=\"modal-content-title\">{title}</h2>\r\n            <CloseIcon className=\"modal-close-btn\" onClick={onClose} />\r\n          </div>\r\n          <div className=\"modal-content-body\">{message}</div>\r\n          <div className=\"modal-content-button\">\r\n            <ThemeColorButton label=\"Confirm\" onClick={onConfirm} />\r\n          </div>\r\n        </div>\r\n      )}\r\n    </Dialog>\r\n  );\r\n});\r\n\r\nModal.propTypes = {\r\n  open: PropTypes.bool.isRequired,\r\n  title: PropTypes.string,\r\n  message: PropTypes.oneOfType([\r\n    PropTypes.arrayOf(PropTypes.node),\r\n    PropTypes.node,\r\n    PropTypes.string\r\n  ]).isRequired,\r\n  onClose: PropTypes.func.isRequired,\r\n  onConfirm: PropTypes.func.isRequired\r\n};\r\n","import React, { memo, useMemo, useState, useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport moment from 'moment';\r\nimport { MaterialUIIcon } from '../Icon';\r\nimport { backgroundStyle } from '../../styles';\r\n\r\nconst currentMoment = moment();\r\nconst currentYear = currentMoment.format('YYYY');\r\nconst currentMonth = currentMoment.format('M');\r\n\r\nconst monthArr = [\r\n  { label: 'Jan', value: 1 },\r\n  { label: 'Feb', value: 2 },\r\n  { label: 'Mar', value: 3 },\r\n  { label: 'Apr', value: 4 },\r\n  { label: 'May', value: 5 },\r\n  { label: 'Jun', value: 6 },\r\n  { label: 'Jul', value: 7 },\r\n  { label: 'Aug', value: 8 },\r\n  { label: 'Sep', value: 9 },\r\n  { label: 'Oct', value: 10 },\r\n  { label: 'Nov', value: 11 },\r\n  { label: 'Dec', value: 12 }\r\n];\r\n\r\nconst MonthYearPickerPanel = memo(\r\n  ({ year, month, minYear, maxYear, onSelect, previousNotAllow }) => {\r\n    const [yearValue, setYearValue] = useState(() => {\r\n      return year ? parseInt(year, 10) : parseInt(currentYear, 10);\r\n    });\r\n\r\n    const yearInNumber = useMemo(() => {\r\n      return year ? parseInt(year, 10) : parseInt(currentYear, 10);\r\n    }, [year]);\r\n\r\n    const monthValue = useMemo(() => {\r\n      return month ? parseInt(month, 10) : null;\r\n    }, [month]);\r\n\r\n    const renderTitle = () => {\r\n      return (\r\n        <>\r\n          {yearValue > minYear ? (\r\n            <MaterialUIIcon\r\n              iconKey=\"arrow_back_ios\"\r\n              onClick={() => {\r\n                setYearValue(yearValue - 1);\r\n              }}\r\n            />\r\n          ) : (\r\n            <span style={{ width: '1.5rem', height: '1.5rem' }} />\r\n          )}\r\n          <span>{yearValue}</span>\r\n          {yearValue < maxYear ? (\r\n            <MaterialUIIcon\r\n              iconKey=\"arrow_forward_ios\"\r\n              onClick={() => {\r\n                setYearValue(yearValue + 1);\r\n              }}\r\n            />\r\n          ) : (\r\n            <span style={{ width: '1.5rem', height: '1.5rem' }} />\r\n          )}\r\n        </>\r\n      );\r\n    };\r\n\r\n    const handleClickMonth = (val, disabled) => {\r\n      if (disabled) return false;\r\n      onSelect({ year: yearValue, month: val });\r\n    };\r\n\r\n    const getStyle = value => {\r\n      return monthValue === value && yearValue === yearInNumber\r\n        ? { ...backgroundStyle, color: '#fff' }\r\n        : null;\r\n    };\r\n\r\n    const isPrevious = useCallback(\r\n      monthVal => {\r\n        if (!previousNotAllow) return false;\r\n        return (\r\n          yearValue <= parseInt(currentYear, 10) &&\r\n          monthVal < parseInt(currentMonth, 10)\r\n        );\r\n      },\r\n      [yearValue, previousNotAllow]\r\n    );\r\n\r\n    return (\r\n      <div className=\"month-year-picker\">\r\n        <div\r\n          className=\"month-year-picker__title\"\r\n          style={{ ...backgroundStyle }}\r\n        >\r\n          {renderTitle()}\r\n        </div>\r\n        <div className=\"month-year-picker__body\">\r\n          {monthArr.map(({ label, value }) => {\r\n            const disabled = isPrevious(value);\r\n            return (\r\n              <div\r\n                key={value}\r\n                onClick={() => {\r\n                  handleClickMonth(value, disabled);\r\n                }}\r\n                style={getStyle(value)}\r\n                className={disabled ? 'disabled' : ''}\r\n              >\r\n                {label}\r\n              </div>\r\n            );\r\n          })}\r\n        </div>\r\n      </div>\r\n    );\r\n  }\r\n);\r\n\r\nMonthYearPickerPanel.defaultProps = {\r\n  minYear: parseInt(currentYear, 10),\r\n  maxYear: parseInt(currentYear, 10) + 10,\r\n  previousNotAllow: true\r\n};\r\n\r\nMonthYearPickerPanel.propTypes = {\r\n  year: PropTypes.string,\r\n  month: PropTypes.string,\r\n  minYear: PropTypes.number,\r\n  maxYear: PropTypes.number,\r\n  onSelect: PropTypes.func.isRequired,\r\n  previousNotAllow: PropTypes.bool\r\n};\r\n\r\nexport default MonthYearPickerPanel;\r\n","import React, { memo, useMemo, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport { InputBox } from '../InputBox/InputBox';\r\nimport { MaterialUIIcon } from '../Icon';\r\nimport MonthYearPickerPanel from './MonthYearPickerPanel';\r\nimport './monthYearPicker.less';\r\n\r\nconst pad = val => {\r\n  return val < 10 ? `0${val}` : val.toString();\r\n};\r\n\r\nexport const ExpiryMonth = memo(props => {\r\n  const { label, value, errorText, onChange, onClose } = props;\r\n  const [showCalendar, setShowCalendar] = useState(false);\r\n\r\n  const handleSelectMonth = val => {\r\n    onChange(val);\r\n    setShowCalendar(false);\r\n  };\r\n\r\n  const floatingLabel = useMemo(() => {\r\n    return showCalendar || !!value;\r\n  }, [showCalendar, value]);\r\n\r\n  const handleClear = () => {\r\n    onChange('');\r\n  };\r\n\r\n  const handleClose = () => {\r\n    setShowCalendar(false);\r\n    onClose();\r\n  };\r\n\r\n  return (\r\n    <div>\r\n      <InputBox\r\n        label={label}\r\n        errorText={errorText}\r\n        InputLabelProps={{\r\n          shrink: floatingLabel\r\n        }}\r\n        placeholder={value}\r\n        className=\"expiry-input\"\r\n        disabled={true}\r\n        onChange={() => {}}\r\n        onClick={() => {\r\n          setShowCalendar(true);\r\n        }}\r\n      />\r\n      <CalendarPanel\r\n        value={value}\r\n        open={showCalendar}\r\n        onClose={handleClose}\r\n        onSelect={handleSelectMonth}\r\n      />\r\n      {value ? (\r\n        <MaterialUIIcon\r\n          onClick={handleClear}\r\n          iconKey=\"cancel\"\r\n          className=\"expiry-icon expiry-clear-icon\"\r\n        />\r\n      ) : (\r\n        <MaterialUIIcon\r\n          onClick={() => {\r\n            setShowCalendar(true);\r\n          }}\r\n          iconKey=\"date_range\"\r\n          className=\"expiry-icon expiry-calendar-icon\"\r\n        />\r\n      )}\r\n    </div>\r\n  );\r\n});\r\n\r\nExpiryMonth.propTypes = {\r\n  label: PropTypes.string.isRequired,\r\n  value: PropTypes.string,\r\n  errorText: PropTypes.string,\r\n  onChange: PropTypes.func.isRequired,\r\n  onClose: PropTypes.func.isRequired\r\n};\r\n\r\nconst CalendarPanel = memo(props => {\r\n  const { open, onClose, value, onSelect } = props;\r\n\r\n  const { month, year } = useMemo(() => {\r\n    if (!value) return { month: null, year: null };\r\n    const splitArr = value.split('/');\r\n    if (splitArr.length < 2) return { month: null, year: null };\r\n    return { month: splitArr[0], year: splitArr[1] };\r\n  }, [value]);\r\n\r\n  const handleSelect = ({ year, month }) => {\r\n    const value = `${pad(month)}/${year}`;\r\n    onSelect(value);\r\n  };\r\n\r\n  return (\r\n    <Dialog open={open} onClose={onClose} className=\"expiry-popup\">\r\n      <MonthYearPickerPanel month={month} year={year} onSelect={handleSelect} />\r\n    </Dialog>\r\n  );\r\n});\r\n\r\nCalendarPanel.propTypes = {\r\n  open: PropTypes.bool.isRequired,\r\n  onClose: PropTypes.func.isRequired,\r\n  value: PropTypes.string,\r\n  onSelect: PropTypes.func.isRequired\r\n};\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nexport const StepItem = memo(props => {\r\n  const { hint, children } = props;\r\n  return (\r\n    <div className=\"booking-step-item\">\r\n      {hint}\r\n      {children}\r\n    </div>\r\n  );\r\n});\r\n\r\nStepItem.propTypes = {\r\n  hint: PropTypes.string,\r\n  children: PropTypes.oneOfType([\r\n    PropTypes.arrayOf(PropTypes.node),\r\n    PropTypes.node\r\n  ])\r\n};\r\n","import React, { memo, Fragment, useMemo, useCallback, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { StepItem } from \"./StepItem\";\r\nimport { Select } from \"../../../Common\";\r\nimport { mapSpecialtyTypesToOptions } from \"../../../helpers\";\r\nimport { STEP_KEYS } from \"../../../constants\";\r\n\r\nexport const SpecialtyTypeSelect = memo(props => {\r\n  const {\r\n    hint,\r\n    open,\r\n    value,\r\n    onToggle,\r\n    onSelect,\r\n    specialtyTypes,\r\n    hideStep\r\n  } = props;\r\n\r\n  const options = useMemo(() => mapSpecialtyTypesToOptions(specialtyTypes), [\r\n    specialtyTypes\r\n  ]);\r\n  useEffect(() => {\r\n    if (options.length === 1) {\r\n      onSelect(options[0].value);\r\n    }\r\n  }, [onSelect, options]);\r\n\r\n  const handleToggle = useCallback(\r\n    open => {\r\n      onToggle(STEP_KEYS.SPECIALTY_TYPE, open);\r\n    },\r\n    [onToggle]\r\n  );\r\n\r\n  return (\r\n    <Fragment>\r\n      {!hideStep && (\r\n        <StepItem hint={hint}>\r\n          <Select\r\n            open={open}\r\n            onToggle={handleToggle}\r\n            value={value}\r\n            placeholder=\"[select service]\"\r\n            onSelect={onSelect}\r\n            options={options}\r\n            noOptionText=\"No service available\"\r\n          />\r\n        </StepItem>\r\n      )}\r\n    </Fragment>\r\n  );\r\n});\r\n\r\nSpecialtyTypeSelect.propTypes = {\r\n  hint: PropTypes.string.isRequired,\r\n  open: PropTypes.bool.isRequired,\r\n  value: PropTypes.string,\r\n  onToggle: PropTypes.func.isRequired,\r\n  onSelect: PropTypes.func.isRequired,\r\n  specialtyTypes: PropTypes.array,\r\n  hideStep: PropTypes.bool\r\n};\r\n","import { CSRF_TOKEN } from \"../../../api/config\";\r\n// specialty list in datasourece => options using in specialty types select\r\nexport const mapSpecialtyTypesToOptions = specialtyTypes => {\r\n  if (!specialtyTypes) return [];\r\n  return specialtyTypes.map(specialtyType => {\r\n    return {\r\n      label: specialtyType.name,\r\n      value: specialtyType.specialtyTypeId\r\n    };\r\n  });\r\n};\r\n\r\n// appointment types in datasourece => options using in appointment types select\r\nexport const mapAppointmentTypesToOptions = appointmentTypes => {\r\n  if (!appointmentTypes) return [];\r\n  return appointmentTypes.map(appointmentType => {\r\n    return {\r\n      label: appointmentType.description,\r\n      value: appointmentType.appointmentTypeId\r\n    };\r\n  });\r\n};\r\n\r\n// locations in datasourece => options using in location drawer\r\nexport const mapLocationsToDataInLocationDrawer = (locations, positions) => {\r\n  if (!locations) return [];\r\n  return locations.map(location => {\r\n    const position = positions[location.locationId];\r\n    return {\r\n      locationId: location.locationId,\r\n      name: location.name,\r\n      position: position,\r\n      streetAddress: location.streetAddress,\r\n      suburb: location.suburb,\r\n      state: location.state,\r\n      country: location.country,\r\n      postcode: location.postcode,\r\n      timeZone: location.timeZone\r\n    };\r\n  });\r\n};\r\n\r\n// practitioner in datasourece => options using in practitioner drawer\r\nexport const mapPractitionersToDataInPractitionerDrawer = (\r\n  practitioners,\r\n  rootUrl\r\n) => {\r\n  if (!practitioners) return [];\r\n  return practitioners.map(practitioner => {\r\n    return {\r\n      practitionerId: practitioner.practitionerId,\r\n      imageId: practitioner.imageId,\r\n      firstName: practitioner.firstName,\r\n      lastName: practitioner.lastName,\r\n      description: practitioner.description,\r\n      imageSrc: `${rootUrl}?imageId=${practitioner.imageId}&token=${CSRF_TOKEN}`\r\n    };\r\n  });\r\n};\r\n\r\n// time zone in datasourece => options using in time zone select\r\nexport const mapTimeZonesToOptions = locationTimeZones => {\r\n  if (!locationTimeZones) return [];\r\n  return locationTimeZones.map(timeZone => {\r\n    return {\r\n      label: timeZone.description,\r\n      value: timeZone.timezoneUID\r\n    };\r\n  });\r\n};\r\n","import React, { memo, Fragment, useMemo, useCallback, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { StepItem } from \"./StepItem\";\r\nimport { Select } from \"../../../Common\";\r\nimport { mapAppointmentTypesToOptions } from \"../../../helpers\";\r\nimport { STEP_KEYS } from \"../../../constants\";\r\n\r\nexport const AppointmentTypeSelect = memo(props => {\r\n  const { hint, open, value, onToggle, onSelect, appointmentTypes } = props;\r\n  const options = useMemo(\r\n    () => mapAppointmentTypesToOptions(appointmentTypes),\r\n    [appointmentTypes]\r\n  );\r\n\r\n  useEffect(() => {\r\n    if (options.length === 1) {\r\n      onSelect(options[0].value);\r\n    }\r\n  }, [onSelect, options]);\r\n\r\n  const handleToggle = useCallback(\r\n    open => {\r\n      onToggle(STEP_KEYS.APPOINTMENT_TYPE, open);\r\n    },\r\n    [onToggle]\r\n  );\r\n  return (\r\n    <Fragment>\r\n      <StepItem hint={hint}>\r\n        <Select\r\n          open={open}\r\n          onToggle={handleToggle}\r\n          value={value}\r\n          placeholder=\"[select type]\"\r\n          onSelect={onSelect}\r\n          options={options}\r\n          noOptionText=\"No appointment type available\"\r\n        />\r\n      </StepItem>\r\n    </Fragment>\r\n  );\r\n});\r\n\r\nAppointmentTypeSelect.propTypes = {\r\n  hint: PropTypes.string.isRequired,\r\n  open: PropTypes.bool.isRequired,\r\n  value: PropTypes.string,\r\n  onToggle: PropTypes.func.isRequired,\r\n  onSelect: PropTypes.func.isRequired,\r\n  appointmentTypes: PropTypes.array\r\n};\r\n","import React, { memo, Fragment, useMemo, useCallback, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { StepItem } from \"./StepItem\";\r\nimport { TextButton } from \"../../../Common\";\r\nimport { STEP_KEYS, ANY_SELECTION } from \"../../../constants\";\r\n\r\nexport const LocationSelect = memo(props => {\r\n  const {\r\n    hint,\r\n    value,\r\n    onToggle,\r\n    onSelect,\r\n    locations,\r\n    getPositions,\r\n    isCurrentStep\r\n  } = props;\r\n\r\n  useEffect(() => {\r\n    if (isCurrentStep) {\r\n      if (locations.length === 1) {\r\n        onSelect(locations[0]);\r\n      }\r\n      getPositions();\r\n    }\r\n\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [isCurrentStep]);\r\n\r\n  const text = useMemo(() => {\r\n    if (value === ANY_SELECTION) {\r\n      return \"Any location\";\r\n    }\r\n    const location = locations.find(location => location.locationId === value);\r\n    if (location) {\r\n      return `${location.name}, ${location.suburb}`;\r\n    } else {\r\n      return \"\";\r\n    }\r\n  }, [value, locations]);\r\n\r\n  const handleClick = useCallback(() => {\r\n    onToggle(STEP_KEYS.LOCATION, true);\r\n  }, [onToggle]);\r\n\r\n  return (\r\n    <Fragment>\r\n      <StepItem hint={hint}>\r\n        <TextButton\r\n          text={text}\r\n          placeholder=\"[select location]\"\r\n          onClick={handleClick}\r\n        />\r\n      </StepItem>\r\n    </Fragment>\r\n  );\r\n});\r\n\r\nLocationSelect.propTypes = {\r\n  hint: PropTypes.string.isRequired,\r\n  value: PropTypes.string,\r\n  onToggle: PropTypes.func.isRequired,\r\n  onSelect: PropTypes.func.isRequired,\r\n  locations: PropTypes.array,\r\n  getPositions: PropTypes.func.isRequired,\r\n  isCurrentStep: PropTypes.bool.isRequired\r\n};\r\n","import React, { memo, useMemo, useCallback, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { StepItem } from \"./StepItem\";\r\nimport { TextButton } from \"../../../Common\";\r\nimport { STEP_KEYS, ANY_SELECTION } from \"../../../constants\";\r\n\r\nexport const PractitionerSelect = memo(props => {\r\n  const {\r\n    hint,\r\n    value,\r\n    onToggle,\r\n    onSelect,\r\n    practitioners,\r\n    preSelectPractitioner,\r\n    isCurrentStep\r\n  } = props;\r\n\r\n  useEffect(() => {\r\n    if (isCurrentStep) {\r\n      if (preSelectPractitioner === ANY_SELECTION) {\r\n        const anyPractitioner = {\r\n          practitionerId: ANY_SELECTION\r\n        };\r\n        onSelect(anyPractitioner);\r\n      } else if (practitioners.length === 1) {\r\n        onSelect(practitioners[0]);\r\n      }\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [isCurrentStep]);\r\n\r\n  const text = useMemo(() => {\r\n    if (value === ANY_SELECTION) {\r\n      return \"Any practitioner\";\r\n    }\r\n    const practitioner = practitioners.find(\r\n      practitioner => practitioner.practitionerId === value\r\n    );\r\n    if (practitioner) {\r\n      return `${practitioner.firstName} ${practitioner.lastName}`;\r\n    } else {\r\n      return \"\";\r\n    }\r\n  }, [value, practitioners]);\r\n\r\n  const handleClick = useCallback(() => {\r\n    onToggle(STEP_KEYS.PRACTITIONER, true);\r\n  }, [onToggle]);\r\n\r\n  if (preSelectPractitioner === ANY_SELECTION) return null;\r\n\r\n  return (\r\n    <StepItem hint={hint}>\r\n      <TextButton\r\n        text={text}\r\n        placeholder=\"[select practitioner]\"\r\n        onClick={handleClick}\r\n      />\r\n    </StepItem>\r\n  );\r\n});\r\n\r\nPractitionerSelect.propTypes = {\r\n  hint: PropTypes.string.isRequired,\r\n  value: PropTypes.string,\r\n  onToggle: PropTypes.func.isRequired,\r\n  onSelect: PropTypes.func.isRequired,\r\n  practitioners: PropTypes.array,\r\n  preSelectPractitioner: PropTypes.string,\r\n  isCurrentStep: PropTypes.bool.isRequired\r\n};\r\n","import React, { memo, Fragment, useMemo, useCallback, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { StepItem } from \"./StepItem\";\r\nimport { Select } from \"../../../Common\";\r\nimport { mapTimeZonesToOptions } from \"../../../helpers\";\r\nimport { STEP_KEYS } from \"../../../constants\";\r\n\r\nexport const TimeZoneSelect = memo(props => {\r\n  const {\r\n    hint,\r\n    open,\r\n    value,\r\n    onToggle,\r\n    onSelect,\r\n    timeZones,\r\n    hideStep,\r\n    isTimezoneEnabled\r\n  } = props;\r\n\r\n  const hintText = isTimezoneEnabled ? \"in the same time zone as\" : hint;\r\n\r\n  const options = useMemo(() => mapTimeZonesToOptions(timeZones), [timeZones]);\r\n\r\n  useEffect(() => {\r\n    if (options.length === 1) {\r\n      onSelect(options[0].value);\r\n    }\r\n  }, [onSelect, options]);\r\n\r\n  const handleToggle = useCallback(\r\n    open => {\r\n      onToggle(STEP_KEYS.TIMEZONE, open);\r\n    },\r\n    [onToggle]\r\n  );\r\n\r\n  return (\r\n    <Fragment>\r\n      {!hideStep && (\r\n        <StepItem hint={hintText}>\r\n          <Select\r\n            open={open}\r\n            onToggle={handleToggle}\r\n            value={value}\r\n            placeholder=\"[select timezone]\"\r\n            onSelect={onSelect}\r\n            options={options}\r\n          />\r\n        </StepItem>\r\n      )}\r\n    </Fragment>\r\n  );\r\n});\r\n\r\nTimeZoneSelect.propTypes = {\r\n  hint: PropTypes.string.isRequired,\r\n  open: PropTypes.bool.isRequired,\r\n  value: PropTypes.string,\r\n  onToggle: PropTypes.func.isRequired,\r\n  onSelect: PropTypes.func.isRequired,\r\n  timeZones: PropTypes.array,\r\n  hideStep: PropTypes.bool,\r\n  isTimezoneEnabled: PropTypes.bool\r\n};\r\n","import React, { memo, Fragment, useMemo, useCallback } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { StepItem } from \"./StepItem\";\r\nimport { TextButton } from \"../../../Common\";\r\nimport { STEP_KEYS } from \"../../../constants\";\r\nimport { mapDateTimeStringToText } from \"../../../helpers\";\r\n\r\nexport const ScheduleSelect = memo(props => {\r\n  const {\r\n    hint,\r\n    appointmentDateTime,\r\n    noSlotsPlaceholder,\r\n    loading,\r\n    onToggle,\r\n    timeSlots\r\n  } = props;\r\n\r\n  const text = useMemo(() => {\r\n    let text = \"\";\r\n    const startDateTime = appointmentDateTime\r\n      ? appointmentDateTime.startDateTime\r\n      : null;\r\n    if (startDateTime) {\r\n      text = mapDateTimeStringToText(startDateTime);\r\n    }\r\n    return text;\r\n  }, [appointmentDateTime]);\r\n\r\n  const placeholderText = useMemo(() => {\r\n    return (timeSlots && timeSlots.length > 0) || loading\r\n      ? \"[select date & time]\"\r\n      : noSlotsPlaceholder || \"[No Slots Available]\";\r\n  }, [timeSlots, loading, noSlotsPlaceholder]);\r\n\r\n  const handleClick = useCallback(() => {\r\n    onToggle(STEP_KEYS.APPOINTMENT_DATE_TIME, true);\r\n  }, [onToggle]);\r\n\r\n  return (\r\n    <Fragment>\r\n      <StepItem hint={hint}>\r\n        <TextButton\r\n          text={text}\r\n          placeholder={placeholderText}\r\n          onClick={handleClick}\r\n        />\r\n      </StepItem>\r\n    </Fragment>\r\n  );\r\n});\r\n\r\nScheduleSelect.propTypes = {\r\n  hint: PropTypes.string.isRequired,\r\n  appointmentDateTime: PropTypes.object,\r\n  noSlotsPlaceholder: PropTypes.string,\r\n  loading: PropTypes.bool.isRequired,\r\n  onToggle: PropTypes.func.isRequired,\r\n  timeSlots: PropTypes.array\r\n};\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { DoneIcon } from \"../../../Common\";\r\nimport { useHover } from \"../../../hooks\";\r\nimport { borderColorStyle, backgroundStyle } from \"../../../styles\";\r\n\r\nexport const DrawerCardContainer = memo(props => {\r\n  const [hoverRef, isHovered] = useHover();\r\n  const { onClick, selected, children } = props;\r\n\r\n  return (\r\n    <div\r\n      ref={hoverRef}\r\n      onClick={onClick}\r\n      className=\"drawer-card\"\r\n      style={selected || isHovered ? borderColorStyle : null}\r\n    >\r\n      {children}\r\n      {selected && (\r\n        <DoneIcon className=\"selected-icon\" style={backgroundStyle} />\r\n      )}\r\n    </div>\r\n  );\r\n});\r\n\r\nDrawerCardContainer.propTypes = {\r\n  onClick: PropTypes.func.isRequired,\r\n  selected: PropTypes.bool,\r\n  children: PropTypes.oneOfType([\r\n    PropTypes.arrayOf(PropTypes.node),\r\n    PropTypes.node\r\n  ])\r\n};\r\n","import React, { memo, useMemo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { GoogleMap, LocationNotFound } from \"../../../Common\";\r\nimport { DrawerCardContainer } from \"./DrawerCardContainer\";\r\nimport { getFullAddress } from \"../../../helpers\";\r\n\r\nexport const LocationListCard = memo(props => {\r\n  const { location, onClick, selected } = props;\r\n\r\n  const { position, name } = location;\r\n\r\n  const addressText = useMemo(() => {\r\n    return getFullAddress(location);\r\n  }, [location]);\r\n  return (\r\n    <DrawerCardContainer onClick={() => onClick(location)} selected={selected}>\r\n      <div className=\"location-card\">\r\n        <div className=\"media\">\r\n          <div className=\"google-map-overlay\" />\r\n          {position ? (\r\n            <GoogleMap zoom={15} position={position} />\r\n          ) : (\r\n            <LocationNotFound name={name} />\r\n          )}\r\n        </div>\r\n        <div className=\"information-panel\">\r\n          <span className=\"info-title\">{name}</span>\r\n          <span className=\"info-desc\">{addressText}</span>\r\n        </div>\r\n      </div>\r\n    </DrawerCardContainer>\r\n  );\r\n});\r\n\r\nLocationListCard.propTypes = {\r\n  selected: PropTypes.bool.isRequired,\r\n  location: PropTypes.shape({\r\n    locationId: PropTypes.string.isRequired,\r\n    position: PropTypes.shape({\r\n      lat: PropTypes.number,\r\n      lng: PropTypes.number\r\n    }),\r\n    name: PropTypes.string,\r\n    streetAddress: PropTypes.string,\r\n    suburb: PropTypes.string,\r\n    state: PropTypes.string,\r\n    postcode: PropTypes.string\r\n  }),\r\n  onClick: PropTypes.func.isRequired\r\n};\r\n","import React, { memo, useCallback, useMemo, useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { SideDrawer, FullWidthButton } from \"../../../Common\";\r\nimport TextField from \"@material-ui/core/TextField\";\r\nimport { LocationListCard } from \"./LocationListCard\";\r\nimport { STEP_KEYS, ANY_SELECTION } from \"../../../constants\";\r\nimport {\r\n  mapLocationsToDataInLocationDrawer,\r\n  isTimeZoneUnique\r\n} from \"../../../helpers\";\r\nimport { Alert } from \"../\";\r\n\r\nexport const LocationDrawer = memo(props => {\r\n  const [search, setSearch] = useState(\"\");\r\n  const { open, onToggle, onSelect, value, locations, positions } = props;\r\n\r\n  const showAnyLocationButton = useMemo(() => {\r\n    return locations.length > 1 && isTimeZoneUnique(locations);\r\n  }, [locations]);\r\n\r\n  const locationList = useMemo(\r\n    () => mapLocationsToDataInLocationDrawer(locations, positions),\r\n    [locations, positions]\r\n  );\r\n\r\n  const handleToggle = useCallback(\r\n    open => {\r\n      onToggle(STEP_KEYS.LOCATION, open);\r\n    },\r\n    [onToggle]\r\n  );\r\n\r\n  const handleSelect = useCallback(\r\n    location => {\r\n      handleToggle(false);\r\n      onSelect(location);\r\n    },\r\n    [handleToggle, onSelect]\r\n  );\r\n\r\n  const handleSelectAny = useCallback(() => {\r\n    const firstLocation = locationList[0];\r\n    const location = {\r\n      ...firstLocation,\r\n      locationId: ANY_SELECTION\r\n    };\r\n    handleSelect(location);\r\n  }, [handleSelect, locationList]);\r\n\r\n  const handleSearch = useCallback(e => {\r\n    const newSearch = e.target.value;\r\n    setSearch(newSearch);\r\n  }, []);\r\n\r\n  const filterLocations = useCallback(\r\n    locations => {\r\n      const filterBy = search.toLowerCase();\r\n      if (!filterBy) return locations;\r\n\r\n      return locations.filter(location => {\r\n        const { name, streetAddress, postcode, suburb, country } = location;\r\n        return (\r\n          name.toLowerCase().includes(filterBy) ||\r\n          streetAddress.toLowerCase().includes(filterBy) ||\r\n          postcode.toLowerCase().includes(filterBy) ||\r\n          suburb.toLowerCase().includes(filterBy) ||\r\n          country.toLowerCase().includes(filterBy)\r\n        );\r\n      });\r\n    },\r\n    [search]\r\n  );\r\n\r\n  const renderLocations = useMemo(() => {\r\n    if (!open) return null;\r\n    const filteredLocations = filterLocations(locationList);\r\n    if (filteredLocations.length === 0)\r\n      return <Alert message=\"No location available\" />;\r\n\r\n    return filteredLocations.map(location => (\r\n      <LocationListCard\r\n        key={location.locationId}\r\n        onClick={handleSelect}\r\n        location={location}\r\n        selected={value === location.locationId}\r\n      />\r\n    ));\r\n  }, [locationList, handleSelect, value, open, filterLocations]);\r\n\r\n  return (\r\n    <SideDrawer open={open} onToggle={handleToggle}>\r\n      <span className=\"drawer-title\">Select preferred location</span>\r\n      {showAnyLocationButton && (\r\n        <FullWidthButton\r\n          label=\"Any available location\"\r\n          className=\"drawer-top-full-button\"\r\n          onClick={handleSelectAny}\r\n        />\r\n      )}\r\n      <TextField\r\n        className=\"drawer-search-input\"\r\n        value={search}\r\n        onChange={handleSearch}\r\n      />\r\n      <div className=\"drawer-list\">{renderLocations}</div>\r\n    </SideDrawer>\r\n  );\r\n});\r\n\r\nLocationDrawer.propTypes = {\r\n  open: PropTypes.bool.isRequired,\r\n  onToggle: PropTypes.func.isRequired,\r\n  onSelect: PropTypes.func.isRequired,\r\n  value: PropTypes.string,\r\n  locations: PropTypes.array,\r\n  positions: PropTypes.object\r\n};\r\n","import React, { memo, useState, useCallback } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Avatar } from \"@material-ui/core\";\r\n\r\nexport const PractitionerAvatar = memo(props => {\r\n  const [error, setError] = useState(false);\r\n\r\n  const { useInitial, src, initial } = props;\r\n\r\n  const handleError = useCallback(() => {\r\n    setError(true);\r\n  }, []);\r\n\r\n  return !error && !useInitial ? (\r\n    <img\r\n      src={src}\r\n      alt={initial}\r\n      onError={handleError}\r\n      className=\"practitioner-avatar-image\"\r\n    />\r\n  ) : (\r\n    <Avatar className=\"practitioner-avatar-icon\">{initial}</Avatar>\r\n  );\r\n});\r\n\r\nPractitionerAvatar.propTypes = {\r\n  useInitial: PropTypes.bool.isRequired,\r\n  src: PropTypes.string,\r\n  initial: PropTypes.string.isRequired\r\n};\r\n","import React, { memo, useCallback } from \"react\";\r\nimport Tooltip from \"@material-ui/core/Tooltip\";\r\nimport { colorStyle } from \"../../../styles\";\r\nimport { useHover } from \"../../../hooks\";\r\n\r\nexport const EllipsisButton = memo(props => {\r\n  const { onClick, tooltipContent = \"expand\" } = props;\r\n  const [hoverRef, isHovered] = useHover();\r\n\r\n  const handleClick = useCallback(\r\n    e => {\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n      onClick();\r\n    },\r\n    [onClick]\r\n  );\r\n  return (\r\n    <Tooltip title={tooltipContent}>\r\n      <button ref={hoverRef} onClick={handleClick} className=\"ellipsis-btn\">\r\n        <span className=\"ellipsis-btn-left\"></span>\r\n        <span\r\n          className=\"ellipsis-btn-right\"\r\n          style={isHovered ? colorStyle : null}\r\n        >\r\n          (...)\r\n        </span>\r\n      </button>\r\n    </Tooltip>\r\n  );\r\n});\r\n","import React, {\r\n  memo,\r\n  useRef,\r\n  useCallback,\r\n  useMemo,\r\n  useEffect,\r\n  useState\r\n} from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { PractitionerAvatar } from \"./PractitionerAvatar\";\r\nimport { DrawerCardContainer } from \"./DrawerCardContainer\";\r\nimport { EllipsisButton } from \"./EllipsisButton\";\r\nimport { getDomStyleProperty } from \"../../../../../utils\";\r\n\r\nconst maxHeight = 44;\r\nconst maxHeightStyle = { maxHeight: \"44px\" };\r\n\r\nexport const PractitionerListCard = memo(props => {\r\n  const descriptionRef = useRef();\r\n  const [isHigher, setIsHigher] = useState(false);\r\n  const { selected, practitioner, onClick, expanded, setExpanded } = props;\r\n  const {\r\n    practitionerId,\r\n    imageId,\r\n    imageSrc,\r\n    firstName,\r\n    lastName,\r\n    description\r\n  } = practitioner;\r\n\r\n  const getFirstLetterUpperCase = useCallback(str => {\r\n    if (!str) return \"\";\r\n    return str.charAt(0).toUpperCase();\r\n  }, []);\r\n  const initialNameText = useMemo(() => {\r\n    return `${getFirstLetterUpperCase(firstName)}${getFirstLetterUpperCase(\r\n      lastName\r\n    )}`;\r\n  }, [firstName, lastName, getFirstLetterUpperCase]);\r\n\r\n  useEffect(() => {\r\n    let currentHeight = 0;\r\n    if (descriptionRef.current) {\r\n      currentHeight = getDomStyleProperty(\r\n        descriptionRef.current,\r\n        \"height\"\r\n      ).replace(\"px\", \"\");\r\n      if (currentHeight > maxHeight) {\r\n        !isHigher && setIsHigher(true);\r\n      } else {\r\n        isHigher && setIsHigher(false);\r\n      }\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  const showButton = useMemo(() => isHigher && !expanded, [isHigher, expanded]);\r\n  const descriptionDomStyle = useMemo(\r\n    () => (showButton ? maxHeightStyle : null),\r\n    [showButton]\r\n  );\r\n  return (\r\n    <DrawerCardContainer\r\n      onClick={() => onClick(practitioner)}\r\n      selected={selected}\r\n    >\r\n      <div className=\"practitioner-card\">\r\n        <div className=\"media\">\r\n          <PractitionerAvatar\r\n            useInitial={!imageId}\r\n            src={imageSrc}\r\n            initial={initialNameText}\r\n          />\r\n        </div>\r\n        <div className=\"information-panel\">\r\n          <span className=\"info-title\">{`${firstName} ${lastName}`}</span>\r\n          <span\r\n            className={\"info-desc\"}\r\n            ref={descriptionRef}\r\n            style={descriptionDomStyle}\r\n          >\r\n            {/* <Collapse\r\n              isOpened={expanded}\r\n              initialStyle={{ height: \"44px\", overflow: \"hidden\" }}\r\n            > */}\r\n            {description}\r\n            {/* </Collapse> */}\r\n          </span>\r\n          {showButton && (\r\n            <EllipsisButton onClick={() => setExpanded(practitionerId)} />\r\n          )}\r\n        </div>\r\n      </div>\r\n    </DrawerCardContainer>\r\n  );\r\n});\r\n\r\nPractitionerListCard.propTypes = {\r\n  selected: PropTypes.bool.isRequired,\r\n  practitioner: PropTypes.shape({\r\n    practitionerId: PropTypes.string.isRequired,\r\n    imageId: PropTypes.string,\r\n    firstName: PropTypes.string.isRequired,\r\n    lastName: PropTypes.string.isRequired,\r\n    description: PropTypes.string,\r\n    imageSrc: PropTypes.string\r\n  }),\r\n  onClick: PropTypes.func.isRequired\r\n};\r\n","import React, { memo, useCallback, useMemo, useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { SideDrawer, FullWidthButton } from \"../../../Common\";\r\nimport { PractitionerListCard } from \"./PractitionerListCard\";\r\nimport { Alert } from \"../\";\r\nimport { STEP_KEYS, ANY_SELECTION } from \"../../../constants\";\r\nimport { mapPractitionersToDataInPractitionerDrawer } from \"../../../helpers\";\r\n\r\nexport const PractitionerDrawer = memo(props => {\r\n  const [expandedCard, setExpandedCard] = useState(null);\r\n  const { open, onToggle, onSelect, value, practitioners, tenant, isAnyPractitionerEnabled } = props;\r\n\r\n  const showAnyPractitionerButton = useMemo(() => {\r\n    return practitioners.length > 1 && isAnyPractitionerEnabled;\r\n  }, [practitioners]);\r\n\r\n  const handleToggle = useCallback(\r\n    open => {\r\n      onToggle(STEP_KEYS.PRACTITIONER, open);\r\n      setExpandedCard(null);\r\n    },\r\n    [onToggle]\r\n  );\r\n\r\n  const photoImageRootUrl = useMemo(\r\n    () => `/${tenant}/api/appointmentbooking/Image`,\r\n    [tenant]\r\n  );\r\n\r\n  const practitionerList = useMemo(\r\n    () =>\r\n      mapPractitionersToDataInPractitionerDrawer(\r\n        practitioners,\r\n        photoImageRootUrl\r\n      ),\r\n    [practitioners, photoImageRootUrl]\r\n  );\r\n\r\n  const handleSelect = useCallback(\r\n    practitionerId => {\r\n      handleToggle(false);\r\n      onSelect(practitionerId);\r\n    },\r\n    [handleToggle, onSelect]\r\n  );\r\n\r\n  const handleSelectAny = useCallback(() => {\r\n    const anyPractitioner = {\r\n      practitionerId: ANY_SELECTION\r\n    };\r\n    handleSelect(anyPractitioner);\r\n  }, [handleSelect]);\r\n\r\n  const renderPractitionerList = useMemo(() => {\r\n    if (practitionerList.length === 0)\r\n      return <Alert message=\"No practitioner available\" />;\r\n    return practitionerList.map(practitioner => (\r\n      <PractitionerListCard\r\n        key={practitioner.practitionerId}\r\n        selected={value === practitioner.practitionerId}\r\n        practitioner={practitioner}\r\n        onClick={handleSelect}\r\n        expanded={expandedCard === practitioner.practitionerId}\r\n        setExpanded={setExpandedCard}\r\n      />\r\n    ));\r\n  }, [practitionerList, value, handleSelect, expandedCard]);\r\n\r\n  return ( \r\n    <SideDrawer open={open} onToggle={handleToggle}>\r\n      <span className=\"drawer-title\">Select preferred practitioner</span>\r\n      {showAnyPractitionerButton && (\r\n        <FullWidthButton\r\n          label=\"Any available practitioner\"\r\n          className=\"drawer-top-full-button\"\r\n          onClick={handleSelectAny}\r\n        />\r\n      )}\r\n      <div className=\"drawer-list\">{renderPractitionerList}</div>\r\n    </SideDrawer>\r\n  );\r\n});\r\n\r\nPractitionerDrawer.propTypes = {\r\n  open: PropTypes.bool.isRequired,\r\n  onToggle: PropTypes.func.isRequired,\r\n  onSelect: PropTypes.func.isRequired,\r\n  value: PropTypes.string,\r\n  practitioners: PropTypes.array,\r\n  tenant: PropTypes.string\r\n};\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { ThemeColorButton } from \"../../../Common\";\r\nimport { DoneIcon } from \"../../../Common\";\r\n\r\nexport const WaitingListButton = memo(props => {\r\n  const { onClick, selected, label, className = \"\" } = props;\r\n  return (\r\n    <ThemeColorButton\r\n      label={\r\n        <>\r\n          {selected && <DoneIcon />}\r\n          {label}\r\n        </>\r\n      }\r\n      onClick={onClick}\r\n      className={className}\r\n    />\r\n  );\r\n});\r\n\r\nWaitingListButton.propTypes = {\r\n  onClick: PropTypes.func.isRequired,\r\n  selected: PropTypes.bool.isRequired,\r\n  label: PropTypes.string.isRequired,\r\n  className: PropTypes.string\r\n};\r\n","import React, { memo, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { mapDateTimeToTimeText } from '../../../helpers';\r\nimport { backgroundStyle } from '../../../styles';\r\n\r\nconst TimeSlotList = memo(props => {\r\n  const { isAM, timeSlots, onClick } = props;\r\n\r\n  const title = useMemo(() => {\r\n    const text = isAM ? 'AM' : 'PM';\r\n    return `${text} Appointments`;\r\n  }, [isAM]);\r\n\r\n  if (!timeSlots || timeSlots.length === 0) return null;\r\n\r\n  return (\r\n    <div className=\"schedule-drawer-timeslot-container\">\r\n      <h2 className=\"schedule-drawer-timeslot-title\">{title}</h2>\r\n      <div className=\"schedule-drawer-timeslot-list\">\r\n        {timeSlots.map((timeSlot, index) => (\r\n          <TimeSlot key={index} timeSlot={timeSlot} onClick={onClick} />\r\n        ))}\r\n      </div>\r\n    </div>\r\n  );\r\n});\r\n\r\nTimeSlotList.propTypes = {\r\n  isAM: PropTypes.bool,\r\n  timeSlots: PropTypes.array,\r\n  onClick: PropTypes.func\r\n};\r\n\r\nconst TimeSlot = memo(props => {\r\n  const { timeSlot, onClick } = props;\r\n  const { startDateTime, endDateTime } = timeSlot;\r\n  const text = useMemo(() => {\r\n    return `${mapDateTimeToTimeText(startDateTime)} - ${mapDateTimeToTimeText(\r\n      endDateTime\r\n    )}`;\r\n  }, [startDateTime, endDateTime]);\r\n  return (\r\n    <div\r\n      className=\"schedule-drawer-timeslot-item\"\r\n      onClick={() => onClick(timeSlot)}\r\n      style={backgroundStyle}\r\n    >\r\n      {text}\r\n    </div>\r\n  );\r\n});\r\n\r\nTimeSlot.propTypes = {\r\n  timeSlot: PropTypes.object,\r\n  onClick: PropTypes.func\r\n};\r\n\r\nexport default TimeSlotList;\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport LinearProgress from \"@material-ui/core/LinearProgress\";\r\n\r\nconst CalendarLoader = memo(props => {\r\n  const { loading } = props;\r\n  if (!loading) return null;\r\n  return <LinearProgress mode=\"indeterminate\" color=\"primary\" />;\r\n});\r\n\r\nCalendarLoader.propTypes = {\r\n  loading: PropTypes.bool\r\n};\r\n\r\nexport default CalendarLoader;\r\n","import React, {\r\n  memo,\r\n  useCallback,\r\n  useMemo,\r\n  useState,\r\n  useEffect,\r\n  useRef,\r\n  Fragment\r\n} from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport moment from \"moment\";\r\nimport { SideDrawer, FullWidthButton, Calendar } from \"../../../Common\";\r\nimport { WaitingListButton } from \"./WaitingListButton\";\r\nimport TimeSlotList from \"./TimeSlotList\";\r\nimport CalendarLoader from \"./CalendarLoader\";\r\nimport { STEP_KEYS } from \"../../../constants\";\r\nimport {\r\n  mapDateToTitle,\r\n  createTimeSlotObjectForScheduleDrawer,\r\n  getUniqueTimeSlots\r\n} from \"../../../helpers\";\r\nimport {\r\n  getYearMonthPart,\r\n  elementScrollTop,\r\n  getDocumentDom\r\n} from \"../../../../../utils\";\r\nimport { useCheckMobile } from \"../../../hooks\";\r\n\r\nconst drawerDomIdentifier = \"#schedule-drawer .client-portal-drawer\";\r\n\r\nexport const ScheduleDrawer = memo(props => {\r\n  const headingRef = useRef();\r\n  const drawerRef = useRef();\r\n  const [headingFloat, setHeadingFloat] = useState(false);\r\n  const [selectedDay, setSelectedDay] = useState(null);\r\n  const [selectedMonth, setSelectedMonth] = useState(null);\r\n  const [nextTimeSlotText, setNextTimeSlotText] = useState(\"Next Available timeslot within 6 months\");\r\n  const isMobile = useCheckMobile();\r\n  const {\r\n    open,\r\n    onToggle,\r\n    timeSlots,\r\n    onSelect,\r\n    loadingTimeSlots,\r\n    getTimeSlots,\r\n    isCurrentStep,\r\n    availableLocations,\r\n    earliestBookingTime,\r\n    practitionerValue,\r\n    appointmentDateTimeValue,\r\n    waitingListEnabled,\r\n    waitingList,\r\n    setRequireWaitingList,\r\n    selectPreferredTime,\r\n    timezone\r\n  } = props;\r\n\r\n  const { required, preferredTime } = waitingList;\r\n\r\n  const headerTopHeight = useMemo(() => (isMobile ? 70 : 85) + 40, [isMobile]);\r\n\r\n  useEffect(() => {\r\n    if (isCurrentStep && !appointmentDateTimeValue) {\r\n      setSelectedDay(null);\r\n      setSelectedMonth(null);\r\n      const startTimeMomentJs = moment().add(earliestBookingTime, \"days\");\r\n      const endTimeMomentJs = moment()\r\n        .add(earliestBookingTime, \"days\")\r\n        .endOf(\"month\");\r\n      getTimeSlots(\r\n        startTimeMomentJs,\r\n        endTimeMomentJs,\r\n        availableLocations,\r\n        true\r\n      );\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [isCurrentStep, practitionerValue, availableLocations, timezone]);\r\n\r\n  const handleScroll = useCallback(() => {\r\n    const headingDom = headingRef.current;\r\n    if (headingDom) {\r\n      const headingTop = headingDom.offsetTop;\r\n      const drawerTop = drawerRef.current.scrollTop;\r\n      setHeadingFloat(headingTop - headerTopHeight < drawerTop);\r\n    }\r\n  }, [headerTopHeight]);\r\n  useEffect(() => {\r\n    if (open) {\r\n      const timer = setTimeout(() => {\r\n        drawerRef.current = getDocumentDom(drawerDomIdentifier);\r\n        drawerRef.current.addEventListener(\"scroll\", handleScroll);\r\n      }, 0);\r\n      return () => {\r\n        clearTimeout(timer);\r\n        drawerRef.current.removeEventListener(\"scroll\", handleScroll);\r\n      };\r\n    }\r\n  }, [open, handleScroll]);\r\n\r\n  const handleToggle = useCallback(\r\n    open => {\r\n      onToggle(STEP_KEYS.APPOINTMENT_DATE_TIME, open);\r\n      setHeadingFloat(false);\r\n    },\r\n    [onToggle]\r\n  );\r\n\r\n  const renderDateTitle = useMemo(() => {\r\n    return mapDateToTitle(selectedDay);\r\n  }, [selectedDay]);\r\n\r\n  const renderWaitingListContent = () => {\r\n    return (\r\n      <div>\r\n        <span className=\"drawer-title\">\r\n          I would prefer to be contacted during\r\n        </span>\r\n\r\n        <WaitingListButton\r\n          label=\"AM\"\r\n          selected={preferredTime === \"AM\"}\r\n          onClick={() => selectPreferredTime(\"AM\")}\r\n          className=\"waiting-list-time-btn\"\r\n        />\r\n\r\n        <WaitingListButton\r\n          label=\"PM\"\r\n          selected={preferredTime === \"PM\"}\r\n          onClick={() => selectPreferredTime(\"PM\")}\r\n          className=\"waiting-list-time-btn waiting-list-pm-btn\"\r\n        />\r\n\r\n        <FullWidthButton\r\n          label=\"Go back to select a timeslot\"\r\n          onClick={() => {\r\n            setRequireWaitingList(false);\r\n          }}\r\n        />\r\n      </div>\r\n    );\r\n  };\r\n\r\n  const renderScheduleContent = () => {\r\n    return (\r\n      <Fragment>\r\n        <span className=\"drawer-title\">SELECT A PREFERRED DATE AND TIME</span>\r\n        <FullWidthButton\r\n          label= {nextTimeSlotText}\r\n          className=\"drawer-top-full-button\"\r\n          onClick={handleClickNextTimeSlot}\r\n          disabled={timeSlots.length === 0}\r\n        />\r\n        {waitingListEnabled && (\r\n          <FullWidthButton\r\n            label=\"No suitable timeslot available\"\r\n            className=\"drawer-top-full-button waiting-list-full-button\"\r\n            onClick={() => setRequireWaitingList()}\r\n          />\r\n        )}\r\n        {open && (\r\n          <div className=\"schedule-drawer-list\">\r\n            <div className=\"schedule-drawer-calendar\">\r\n              <Calendar\r\n                month={month}\r\n                fromMonth={initialMonth}\r\n                timeSlots={timeSlotList}\r\n                onDayClick={handleDayClick}\r\n                selectedDay={selectedDay}\r\n                onMonthChange={handleMonthClick}\r\n              />\r\n            </div>\r\n            <CalendarLoader loading={loadingTimeSlots} />\r\n            <div>\r\n              {selectedDay && (\r\n                <div className=\"schedule-drawer-timeslot\">\r\n                  <h1\r\n                    id=\"fixed-heading\"\r\n                    className=\"schedule-drawer-timeslot-heading\"\r\n                    ref={headingRef}\r\n                  >\r\n                    {renderDateTitle}\r\n                  </h1>\r\n                  <FloatHeading\r\n                    headingFloat={headingFloat}\r\n                    renderDateTitle={renderDateTitle}\r\n                    headerTopHeight={headerTopHeight}\r\n                  />\r\n                  <TimeSlotList\r\n                    isAM={true}\r\n                    timeSlots={displayTimeSlots.am}\r\n                    onClick={handleClickTimeSlot}\r\n                  />\r\n                  <TimeSlotList\r\n                    isAM={false}\r\n                    timeSlots={displayTimeSlots.pm}\r\n                    onClick={handleClickTimeSlot}\r\n                  />\r\n                </div>\r\n              )}\r\n            </div>\r\n          </div>\r\n        )}\r\n      </Fragment>\r\n    );\r\n  };\r\n\r\n  const initialMonth = useMemo(() => {\r\n    return timeSlots.length > 0\r\n      ? getYearMonthPart(new Date(timeSlots[0].startDateTime))\r\n      : getYearMonthPart(new Date());\r\n  }, [timeSlots]);\r\n\r\n  const month = useMemo(() => {\r\n    return selectedMonth && selectedMonth > initialMonth\r\n      ? selectedMonth\r\n      : initialMonth;\r\n  }, [selectedMonth, initialMonth]);\r\n\r\n  const timeSlotList = useMemo(() => {\r\n    return timeSlots.reduce((res, timeslot) => {\r\n      const startTime = timeslot.startDateTime;\r\n      const momentJsTime = moment(startTime).parseZone(startTime);\r\n      const date = momentJsTime.format(\"YYYY-MM-DD\");\r\n      const recordInRes = createTimeSlotObjectForScheduleDrawer(\r\n        res[date],\r\n        momentJsTime,\r\n        timeslot\r\n      );\r\n      return { ...res, [date]: recordInRes };\r\n    }, {});\r\n  }, [timeSlots]);\r\n\r\n  const displayTimeSlots = useMemo(() => {\r\n    const selectedTimeSlot = timeSlotList[selectedDay];\r\n\r\n    return {\r\n      am: selectedTimeSlot ? getUniqueTimeSlots(selectedTimeSlot.am) : [],\r\n      pm: selectedTimeSlot ? getUniqueTimeSlots(selectedTimeSlot.pm) : []\r\n    };\r\n  }, [timeSlotList, selectedDay]);\r\n\r\n  const handleDayClick = useCallback(day => {\r\n    setSelectedDay(day);\r\n    elementScrollTop(drawerDomIdentifier, \".schedule-drawer-calendar\", 40);\r\n  }, []);\r\n\r\n  const handleMonthClick = useCallback(\r\n    month => {\r\n      setSelectedDay(null);\r\n      setSelectedMonth(month);\r\n      const ditinctMonths = Object.keys(timeSlotList).reduce(\r\n        (accumulator, current) => {\r\n          const monthKey = moment(current).format(\"YYYY-MM\");\r\n          if (!accumulator.includes(monthKey)) {\r\n            accumulator = [...accumulator, monthKey];\r\n          }\r\n          return accumulator;\r\n        },\r\n        []\r\n      );\r\n\r\n      const today = moment();\r\n      const currentMonth = moment().startOf(\"month\");\r\n      const startOfMonth = moment(month).startOf(\"month\");\r\n      const startTimemomentJs = today > startOfMonth ? today : startOfMonth;\r\n      const endTimemomentJs = moment(month).endOf(\"month\");\r\n\r\n      if(currentMonth.diff(startOfMonth) === 0)\r\n        setNextTimeSlotText(\"Next Available timeslot within 6 months\");\r\n      else\r\n        setNextTimeSlotText(\"Next Available timeslot\");\r\n\r\n      if (ditinctMonths.includes(moment(month).format(\"YYYY-MM\"))) {\r\n        return;\r\n      }  \r\n      \r\n      getTimeSlots(startTimemomentJs, endTimemomentJs, availableLocations);\r\n    },\r\n    [availableLocations, timeSlotList, getTimeSlots]\r\n  );\r\n\r\n  const handleClickTimeSlot = useCallback(\r\n    timeSlot => {\r\n      const { startDateTime, endDateTime } = timeSlot;\r\n      handleToggle(false);\r\n      onSelect({\r\n        startDateTime,\r\n        endDateTime\r\n      });\r\n    },\r\n    [handleToggle, onSelect]\r\n  );\r\n\r\n  const handleClickNextTimeSlot = useCallback(() => {\r\n    const firstSlot = timeSlots[0];\r\n    handleClickTimeSlot(firstSlot);\r\n  }, [timeSlots, handleClickTimeSlot]);\r\n\r\n  return (\r\n    <SideDrawer id=\"schedule-drawer\" open={open} onToggle={handleToggle}>\r\n      {required ? renderWaitingListContent() : renderScheduleContent()}\r\n    </SideDrawer>\r\n  );\r\n});\r\n\r\nScheduleDrawer.propTypes = {\r\n  open: PropTypes.bool.isRequired,\r\n  onToggle: PropTypes.func.isRequired,\r\n  timeSlots: PropTypes.array,\r\n  onSelect: PropTypes.func.isRequired,\r\n  loadingTimeSlots: PropTypes.bool.isRequired,\r\n  getTimeSlots: PropTypes.func.isRequired,\r\n  isCurrentStep: PropTypes.bool.isRequired,\r\n  availableLocations: PropTypes.array,\r\n  earliestBookingTime: PropTypes.number.isRequired,\r\n  waitingListEnabled: PropTypes.bool.isRequired,\r\n  waitingList: PropTypes.object,\r\n  setRequireWaitingList: PropTypes.func.isRequired,\r\n  selectPreferredTime: PropTypes.func.isRequired,\r\n  timezone: PropTypes.string\r\n};\r\n\r\nconst FloatHeading = memo(props => {\r\n  const { headingFloat, renderDateTitle, headerTopHeight } = props;\r\n  if (!headingFloat) return null;\r\n  return (\r\n    <h1\r\n      className=\"schedule-drawer-timeslot-heading-float\"\r\n      style={{ top: `${headerTopHeight - 2}px` }}\r\n    >\r\n      {renderDateTitle}\r\n    </h1>\r\n  );\r\n});\r\nFloatHeading.propTypes = {\r\n  headingFloat: PropTypes.bool.isRequired,\r\n  renderDateTitle: PropTypes.string,\r\n  headerTopHeight: PropTypes.number.isRequired\r\n};\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { backgroundStyle } from \"../../styles\";\r\n\r\nexport const Alert = memo(props => {\r\n  const { message } = props;\r\n  return (\r\n    <div className=\"alert-block\" style={backgroundStyle}>\r\n      {message}\r\n    </div>\r\n  );\r\n});\r\n\r\nAlert.propTypes = {\r\n  message: PropTypes.string.isRequired\r\n};\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nexport const WelcomeMessage = memo(props => {\r\n  const { title } = props;\r\n  return <div className=\"booking-page-title\">{title}</div>;\r\n});\r\n\r\nWelcomeMessage.propTypes = {\r\n  title: PropTypes.string\r\n};\r\n","import React, { memo } from \"react\";\r\nimport { ThemeColorButton } from \"../../Common\";\r\nimport { DoneIcon } from \"../../Common\";\r\n\r\nexport const ContinueButton = memo(props => {\r\n  const { onClick } = props;\r\n  return (\r\n    <ThemeColorButton\r\n      label={\r\n        <>\r\n          <DoneIcon />\r\n          Continue\r\n        </>\r\n      }\r\n      onClick={onClick}\r\n      className=\"continue-btn animated zoomIn\"\r\n    />\r\n  );\r\n});\r\n","import React, { memo } from \"react\";\r\nimport { CSSTransition } from \"react-transition-group\";\r\nimport { useMountAndUnmount } from \"./useMountAndUnmount\";\r\n\r\nexport const MountedAnimationWrapper = memo(props => {\r\n  const mounted = useMountAndUnmount();\r\n  const { children, animationClassName, duration = 500 } = props;\r\n  return (\r\n    <CSSTransition\r\n      in={mounted}\r\n      classNames={animationClassName}\r\n      timeout={{ enter: duration, exit: duration }}\r\n    >\r\n      {children}\r\n    </CSSTransition>\r\n  );\r\n});\r\n","import { useState, useEffect } from \"react\";\r\n\r\nexport function useMountAndUnmount() {\r\n  const [mounted, setMounted] = useState(false);\r\n  useEffect(() => {\r\n    setMounted(true);\r\n    return () => {\r\n      setMounted(false);\r\n    };\r\n  }, []);\r\n\r\n  return mounted;\r\n}\r\n","export const APPOINTMENT_ACTION = {\r\n  SET_VALUE: \"appointment_action_set_value\",\r\n  SET_LOCATION: \"appointment_action_set_location\"\r\n};\r\n\r\nexport const DATASOURCE_ACTION = {\r\n  SET_VALUE: \"datasource_action_set_value\",\r\n  SET_TIME_SLOTS: \"datasource_action_set_time_slots\",\r\n  SET_POSITION: \"datasource_action_set_position\"\r\n};\r\n\r\nexport const CONFIG_ACTION = {\r\n  SET_CONFIG: \"config_action_set_config\",\r\n  SET_LOADED_DATA: \"config_action_set_loaded_data\"\r\n};\r\n\r\nexport const BOOKING_ACTION = {\r\n  SET_VALUE: \"booking_action_set_value\",\r\n  SET_STEP: \"booking_action_set_step\",\r\n  GO_BACK_STEP: \"booking_action_go_back_step\",\r\n  TOGGLE_VISIBILITY: \"booking_action_toggle_visibility\",\r\n  GO_TO_PAGE: \"booking_action_go_to_page\",\r\n  MAKE_NEW_BOOKING: \"booking_action_make_new_booking\"\r\n};\r\n\r\nexport const WAITING_LIST_ACTION = {\r\n  REQUIRE_WAITING_LIST: \"waiting_list_action_require_waiting_list\",\r\n  UPDATE_PREFERRED_TIME: \"waiting_list_action_update_preferred_time\"\r\n};\r\n\r\nexport const FORM_ACTION = {\r\n  SET_VALUE: \"form_action_set_value\",\r\n  SET_ERROR: \"form_action_set_error\",\r\n  TOGGLE_VERIFICATION_DRAWER: \"form_action_toggle_verification_drawer\",\r\n  SET_FILES: \"form_action_set_files\",\r\n  REMOVE_FILE: \"form_action_remove_file\"\r\n};\r\n","import { APPOINTMENT_ACTION } from \"./\";\r\nimport { STEP_KEYS } from \"../constants\";\r\n\r\nexport const selectSpecialtyType = value => {\r\n  return setAppointmentValue(STEP_KEYS.SPECIALTY_TYPE, value);\r\n};\r\n\r\nexport const selectAppointmentType = value => {\r\n  return setAppointmentValue(STEP_KEYS.APPOINTMENT_TYPE, value);\r\n};\r\n\r\nexport const selectLocation = (locationId, timeZoneId) => {\r\n  return {\r\n    type: APPOINTMENT_ACTION.SET_LOCATION,\r\n    payload: {\r\n      locationId,\r\n      timeZoneId\r\n    }\r\n  };\r\n};\r\n\r\nexport const selectPractitioner = value => {\r\n  return setAppointmentValue(STEP_KEYS.PRACTITIONER, value);\r\n};\r\n\r\nexport const selectTimeZone = value => {\r\n  return setAppointmentValue(STEP_KEYS.TIMEZONE, value);\r\n};\r\n\r\nexport const selectAppointmentDateTime = appointmentDateTime => {\r\n  return setAppointmentValue(\r\n    STEP_KEYS.APPOINTMENT_DATE_TIME,\r\n    appointmentDateTime\r\n  );\r\n};\r\n\r\nexport const setAppointmentValue = (key, value) => {\r\n  return {\r\n    type: APPOINTMENT_ACTION.SET_VALUE,\r\n    payload: {\r\n      key,\r\n      value\r\n    }\r\n  };\r\n};\r\n\r\n// [STEP_KEYS.SPECIALTY_TYPE]: null,\r\n// [STEP_KEYS.APPOINTMENT_TYPE]: null,\r\n// [STEP_KEYS.PRACTITIONER]: null,\r\n// [STEP_KEYS.LOCATION]: null,\r\n// [STEP_KEYS.TIMEZONE]: null,\r\n// [STEP_KEYS.APPOINTMENT_DATE_TIME]: null\r\n","import axios from \"axios\";\r\nimport { API_CONFIG } from \"./config\";\r\n// import store from \"../store/configureStore\";\r\n// import { showError } from \"../modules/App/actions\";\r\n// import { deepGet } from \"../utils\";\r\n\r\nconst { headers } = API_CONFIG;\r\n\r\nexport const source = () => {\r\n  return axios.CancelToken.source();\r\n};\r\n\r\nexport const isCancel = e => {\r\n  return axios.isCancel(e);\r\n};\r\n\r\nclass HttpClient {\r\n  constructor(baseUrl) {\r\n    this.baseUrl = baseUrl;\r\n  }\r\n\r\n  setUrl = baseUrl => {\r\n    this.baseUrl = baseUrl;\r\n  };\r\n\r\n  get = (url, config) => {\r\n    const requestUrl = `${this.baseUrl}api/${url}`;\r\n    return axios.get(requestUrl, { headers, ...config });\r\n  };\r\n\r\n  getUrl = (url, query, newTab) => {\r\n    let tokenQuery;\r\n\r\n    if (process.env.NODE_ENV !== \"production\") {\r\n      tokenQuery = `sessionId=${API_CONFIG.headers[\"X-SessionId\"]}`;\r\n    } else {\r\n      tokenQuery = `token=${API_CONFIG.headers[\"X-Token\"]}`;\r\n    }\r\n\r\n    const requestUrl = `${this.baseUrl}/${url}?${tokenQuery}&${query}`;\r\n    if (newTab) {\r\n      window.open(requestUrl, \"_blank\");\r\n    } else {\r\n      window.location.href = requestUrl;\r\n    }\r\n  };\r\n\r\n  post = (url, payload = null, cancelToken = null) => {\r\n    const requestUrl = `${this.baseUrl}api/${url}`;\r\n    return axios.post(\r\n      requestUrl,\r\n      payload === null ? null : JSON.stringify(payload),\r\n      { headers, cancelToken }\r\n    );\r\n  };\r\n\r\n  postAll = requests => {\r\n    return axios.all(requests);\r\n  };\r\n\r\n  postFormData = (url, payload = null, file = null) => {\r\n    const requestUrl = `${this.baseUrl}api/${url}`;\r\n\r\n    const formData = new FormData();\r\n    if (file !== null) {\r\n      formData.append(\"file-0\", file);\r\n    }\r\n    if (payload !== null) {\r\n      Object.keys(payload).forEach(key => {\r\n        formData.append(key, JSON.stringify(payload[key]));\r\n      });\r\n    }\r\n\r\n    return axios.post(requestUrl, formData, {\r\n      headers: {\r\n        ...headers,\r\n        \"content-type\": \"multipart/form-data\"\r\n      },\r\n      onUploadProgress: e => {}\r\n    });\r\n  };\r\n\r\n  remove = url => {\r\n    const requestUrl = `${this.baseUrl}api/${url}`;\r\n    return axios.delete(requestUrl, { headers });\r\n  };\r\n\r\n  uploadFileToS3 = (presignedUrl, file) => {\r\n    const options = {\r\n      headers: {\r\n        \"Content-Type\": file.type\r\n      }\r\n    };\r\n    return axios.put(presignedUrl, file, options);\r\n  };\r\n}\r\n\r\n// axios.interceptors.response.use(\r\n//   response => {\r\n//     return response;\r\n//   },\r\n//   error => {\r\n//     if (!isCancel(error)) {\r\n//       const errorMessage = deepGet(\r\n//         error,\r\n//         [\"response\", \"data\", \"Message\"],\r\n//         \"Error occurred during processing your request.\"\r\n//       );\r\n//       store.dispatch(showError(errorMessage));\r\n//     }\r\n//     return Promise.reject(error);\r\n//   }\r\n// );\r\n\r\nexport { HttpClient };\r\n","export const requests = { getTimeSlots: null, getSuburbList: null };\r\n","import qs from 'qs';\r\nimport { HttpClient, API_CONFIG, BUSINESS_NAME } from '../api';\r\nimport { requests } from '../requests';\r\nimport { getParameterByName } from '../utils';\r\nimport { getFullAddress } from '../modules/ClientPortal/helpers';\r\nimport {\r\n  ONLINE_PAYMENT_KEY_NAME,\r\n  ONLINE_PAYMENT_IS_TEST\r\n} from '../modules/ClientPortal/constants';\r\n\r\nconst httpClient = new HttpClient(`${API_CONFIG.rootUrl}/${BUSINESS_NAME}/`);\r\n\r\nconst get = httpClient.get;\r\nconst post = httpClient.post;\r\n\r\nexport const portalService = {\r\n  getConfig: () => {\r\n    const locationGroupId = getParameterByName('lg');\r\n    let queryString = '';\r\n    if (locationGroupId != null) {\r\n      queryString = '?locationGroupId=' + locationGroupId;\r\n    }\r\n    const url = `portalsettings/ExtendedConfigDetails${queryString}`;\r\n    return get(url);\r\n  },\r\n  getSpecialties: () => {\r\n    const url = 'appointmentbooking/specialties?getAppointmentTypes=true';\r\n    return get(url);\r\n  },\r\n  getPractitioners: () => {\r\n    const url = 'appointmentbooking/practitioners?getSpecialties=true';\r\n    return get(url);\r\n  },\r\n  getLocations: () => {\r\n    const locationGroupId = getParameterByName('lg');\r\n    let queryString = '';\r\n    if (locationGroupId != null) {\r\n      queryString = '?locationGroupId=' + locationGroupId;\r\n    }\r\n    const url = `appointmentbooking/locations${queryString}`;\r\n    return get(url);\r\n  },\r\n  getTimezones: () => {\r\n    const url = 'appointmentbooking/locationTimezones';\r\n    return get(url);\r\n  },\r\n  getSchedules: (locationIds = null) => {\r\n    const queryString = locationIds\r\n      ? locationIds.map(locationId => `locationId=${locationId}`).join('&')\r\n      : '';\r\n    const url = `appointmentbooking/practitionerschedules?${queryString}`;\r\n    return get(url);\r\n  },\r\n  getTimeSlots: (\r\n    specialtyId,\r\n    appointmentTypeId,\r\n    locationIds,\r\n    practitionerId,\r\n    timeZoneId,\r\n    start,\r\n    end,\r\n    phoneConsult = false\r\n  ) => {\r\n    const { token } = requests.getTimeSlots;\r\n\r\n    let url = `appointmentbooking/timeslots?appointmentTypeId=${appointmentTypeId}&specialtyId=${specialtyId}&timezoneId=${timeZoneId}&phoneConsult=${phoneConsult}&start=${start}&end=${end}`;\r\n\r\n    if (practitionerId !== '') {\r\n      url += `&practitionerId=${practitionerId}`;\r\n    }\r\n\r\n    const locationStr = locationIds\r\n      .map(locationId => `locationId=${locationId}`)\r\n      .join('&');\r\n\r\n    url += `&${locationStr}`;\r\n    return get(url, { cancelToken: token });\r\n  },\r\n  requestVerificationCode: smsModel => {\r\n    const url = 'appointmentbooking/requestverificationcode';\r\n    return post(url, smsModel);\r\n  },\r\n  verifyCode: smsModel => {\r\n    const url = 'appointmentbooking/verifycode';\r\n    return post(url, smsModel);\r\n  },\r\n  getLocationPosition: location => {\r\n    if (location.position) return;\r\n\r\n    const address = getFullAddress(location);\r\n\r\n    const url = `appointmentbooking/getlocationposition?address=${address}`;\r\n    return get(url);\r\n  },\r\n  submitBooking: (params, isNewClient) => {\r\n    const queryString =\r\n      isNewClient != null ? `?isNewClient=${isNewClient}` : '';\r\n    const url = `appointmentbooking/submitbooking${queryString}`;\r\n    return post(url, params);\r\n  },\r\n  getCancelReasons: () => {\r\n    const url = 'appointmentbooking/cancellationreason';\r\n    return get(url);\r\n  },\r\n  getAppointmentById: appointmentId => {\r\n    const url = `appointmentbooking/getappointmentbyid/?appointmentId=${appointmentId}`;\r\n    return get(url);\r\n  },\r\n  cancelAppointment: params => {\r\n    const url = 'appointmentbooking/cancelappointmentbyid';\r\n    return post(url, params);\r\n  },\r\n  getClient: paramsObj => {\r\n    const query = qs.stringify({ ...paramsObj });\r\n    const url = `client/client?${query}`;\r\n    return get(url);\r\n  },\r\n  createClient: params => {\r\n    const url = 'client/client';\r\n    return post(url, params);\r\n  },\r\n  createFileNode: (clientId, fileName, fileSize) => {\r\n    const url = `file/GetPresignedUrl?clientId=${clientId}&fileName=${fileName}&fileSize=${fileSize}`;\r\n    return post(url);\r\n  },\r\n  createFileAssociation: params => {\r\n    const url = 'file/association';\r\n    return post(url, params);\r\n  },\r\n  uploadFileToS3: (presignedUrl, file) => {\r\n    return httpClient.uploadFileToS3(presignedUrl, file);\r\n  },\r\n  getDownloadFileList: () => {\r\n    const url = 'file/files';\r\n    return get(url);\r\n  },\r\n  getFileDetails: fileName => {\r\n    const queryString = qs.stringify({ fileName });\r\n    const url = `file/file?${queryString}`;\r\n    return get(url);\r\n  },\r\n  // getOnlinePaymentToken: () => {\r\n  //   const attributeName = ONLINE_PAYMENT_KEY_NAME;\r\n  //   const consumerId = '8b2fef4c-f4b6-4eab-9f9b-fb529d62e4b6';\r\n  //   return get(\r\n  //     `Application/applicationAttribute?attributeName=${attributeName}&consumerId=${consumerId}`\r\n  //   );\r\n  // },\r\n  getOnlinePaymentTokenAndIsTestFlag: () => {\r\n    const attributeNames = [ONLINE_PAYMENT_KEY_NAME, ONLINE_PAYMENT_IS_TEST];\r\n    const consumerId = '8b2fef4c-f4b6-4eab-9f9b-fb529d62e4b6';\r\n    const query = qs.stringify({ attributeNames, consumerId });\r\n    return get(`Application/applicationAttributes?${query}`);\r\n  }\r\n};\r\n\r\nexport const geolocationService = {\r\n  getSuburbs: paramsObj => {\r\n    const query = qs.stringify({ ...paramsObj });\r\n    const url = `appointmentbooking/GetSuburbs?${query}`;\r\n    return get(url)\r\n  }\r\n};\r\n","import axios from 'axios';\r\nimport { portalService } from '../../../services';\r\nimport {\r\n  setSpecialtyTypes,\r\n  setPractitioners,\r\n  setLocations,\r\n  setTimeZones,\r\n  setSchedules,\r\n  CONFIG_ACTION,\r\n  getIntakeFormFileList,\r\n  getOnlinePaymentToken\r\n} from './';\r\nimport { BUSINESS_NAME } from '../../../api';\r\nimport { loading, showError } from '../../App/actions';\r\nimport { getParameterByName, deepGet } from '../../../utils';\r\nimport { filterLocationsBySchedules } from '../helpers';\r\n\r\nexport const setConfig = config => {\r\n  return {\r\n    type: CONFIG_ACTION.SET_CONFIG,\r\n    payload: config\r\n  };\r\n};\r\n\r\nconst setLoadedData = loaded => {\r\n  return {\r\n    type: CONFIG_ACTION.SET_LOADED_DATA,\r\n    payload: loaded\r\n  };\r\n};\r\n\r\nexport const initialLoad = () => async dispatch => {\r\n  dispatch(loading(true));\r\n  dispatch(setLoadedData(false));\r\n  if (!BUSINESS_NAME) {\r\n    dispatch(\r\n      showError({\r\n        text: 'Missing Tenant Id in URL',\r\n        canDismiss: false\r\n      })\r\n    );\r\n    return false;\r\n  }\r\n  const {\r\n    getConfig,\r\n    getSpecialties,\r\n    getPractitioners,\r\n    getLocations,\r\n    getTimezones,\r\n    getSchedules\r\n  } = portalService;\r\n\r\n  let locations;\r\n  await axios\r\n    .all([\r\n      getConfig(),\r\n      getSpecialties(),\r\n      getPractitioners(),\r\n      getLocations(),\r\n      getTimezones()\r\n    ])\r\n    .then(\r\n      axios.spread(\r\n        (\r\n          configRes,\r\n          specialtiesRes,\r\n          practitionersRes,\r\n          locationsRes,\r\n          timezonesRes\r\n        ) => {\r\n          const config = configRes.data;\r\n          dispatch(setConfig(config));\r\n          if (config.isCreditCardEnabled) {\r\n            dispatch(getOnlinePaymentToken());\r\n          }\r\n\r\n          const specialtyTypes = specialtiesRes.data.specialtyTypes;\r\n          dispatch(setSpecialtyTypes(specialtyTypes));\r\n\r\n          const practitioners = practitionersRes.data.practitioners;\r\n          dispatch(setPractitioners(practitioners));\r\n\r\n          locations = locationsRes.data.locations;\r\n          const timezones = timezonesRes.data.locationTimezones;\r\n\r\n          dispatch(setTimeZones(timezones));\r\n        }\r\n      )\r\n    )\r\n    .catch(error => {\r\n      const errorText = deepGet(\r\n        error,\r\n        ['response', 'data', 'Message'],\r\n        'Error occurred during processing your request.'\r\n      );\r\n      dispatch(\r\n        showError({\r\n          text: errorText,\r\n          canDismiss: false\r\n        })\r\n      );\r\n      dispatch(loading(false));\r\n    });\r\n  const hasLocationGroup = getParameterByName('lg');\r\n\r\n  try {\r\n    const { data } = await getSchedules(\r\n      hasLocationGroup ? locations.map(l => l.locationId) : null\r\n    );\r\n    const { schedules } = data;\r\n    dispatch(setSchedules(schedules));\r\n    const locationsFilteredBySchedules = filterLocationsBySchedules(\r\n      locations,\r\n      schedules\r\n    );\r\n\r\n    dispatch(setLocations(locationsFilteredBySchedules));\r\n    // this one has been removed because we will to get geolocations during location step\r\n    // locationsFilteredBySchedules.forEach(location => {\r\n    //   portalService.getLocationPosition(location).then(({ data }) => {\r\n    //     if (data != null) {\r\n    //       const { lat, lng } = data;\r\n    //       dispatch(\r\n    //         updateLocationPosition(location.locationId, {\r\n    //           lat,\r\n    //           lng\r\n    //         })\r\n    //       );\r\n    //     }\r\n    //   });\r\n    // });\r\n  } catch (error) {\r\n    const errorText = deepGet(\r\n      error,\r\n      ['response', 'data', 'Message'],\r\n      'Error occurred during processing your request.'\r\n    );\r\n    dispatch(\r\n      showError({\r\n        text: errorText,\r\n        canDismiss: false\r\n      })\r\n    );\r\n  } finally {\r\n    dispatch(loading(false));\r\n    dispatch(setLoadedData(true));\r\n  }\r\n  dispatch(getIntakeFormFileList());\r\n};\r\n","import { DATASOURCE_ACTION } from './';\r\nimport { portalService } from '../../../services';\r\nimport { requests } from '../../../requests';\r\nimport { source, isCancel } from '../../../api';\r\nimport {\r\n  filterSpecialtiesHavingAppointmentTypes,\r\n  mapMomentjsToDateTimeString,\r\n  filterPractitionersBySpecialty,\r\n  checkIsPhoneConsult,\r\n  base64ToArrayBuffer,\r\n  mappingContentTypeWithFileName\r\n} from '../helpers';\r\nimport { loading } from '../../App/actions';\r\nimport { isIOSDevice } from '../../../utils';\r\nimport { createPinPaymentsScript } from '../helpers';\r\nimport PreviewLoadingTemplateHtml from '../helpers/PreviewLoadingTemplate';\r\nimport { ONLINE_PAYMENT_KEY_NAME, ONLINE_PAYMENT_IS_TEST } from '../constants';\r\n\r\nexport const setSpecialtyTypes = specialtyTypes => {\r\n  const filtedSpecialtyTypes = filterSpecialtiesHavingAppointmentTypes(\r\n    specialtyTypes\r\n  );\r\n  return setDatasourceValue('specialtyTypes', filtedSpecialtyTypes);\r\n};\r\n\r\nexport const setPractitioners = practitioners => {\r\n  return setDatasourceValue('practitioners', practitioners);\r\n};\r\nexport const setLocations = locations => {\r\n  return setDatasourceValue('locations', locations);\r\n};\r\n\r\nexport const setTimeZones = timeZones => {\r\n  return setDatasourceValue('timeZones', timeZones);\r\n};\r\n\r\nexport const setSchedules = schedules => {\r\n  return setDatasourceValue('schedules', schedules);\r\n};\r\n\r\nexport const toggleLoadingTimeSlots = (loading = true) => {\r\n  return setDatasourceValue('loadingTimeSlots', loading);\r\n};\r\n\r\nexport const setTimeSlots = (timeSlots, concat = false) => {\r\n  return {\r\n    type: DATASOURCE_ACTION.SET_TIME_SLOTS,\r\n    payload: {\r\n      timeSlots,\r\n      concat\r\n    }\r\n  };\r\n};\r\n\r\nexport const setPosition = (locationId, position) => {\r\n  return {\r\n    type: DATASOURCE_ACTION.SET_POSITION,\r\n    payload: {\r\n      locationId,\r\n      position\r\n    }\r\n  };\r\n};\r\n\r\nexport const getPositions = locationList => async (dispatch, getState) => {\r\n  const { positions } = getState().datasource;\r\n  locationList.forEach(location => {\r\n    const locationId = location.locationId;\r\n    if (positions[locationId]) return;\r\n    portalService.getLocationPosition(location).then(({ data }) => {\r\n      if (data) {\r\n        const { lat, lng } = data;\r\n        dispatch(\r\n          setPosition(locationId, {\r\n            lat,\r\n            lng\r\n          })\r\n        );\r\n      }\r\n    });\r\n  });\r\n};\r\n\r\nexport const getIntakeFormFileList = () => async (dispatch, getState) => {\r\n  const { isDownloadDocumentAllowed } = getState().config;\r\n  if (!isDownloadDocumentAllowed) return;\r\n  const { data } = await portalService.getDownloadFileList();\r\n  dispatch(setDatasourceValue('intakeFormFiles', data));\r\n};\r\n\r\nexport const previewInIOS = async fileName => {\r\n  const windowOpener = window.open('', '_blank');\r\n  windowOpener.document.write(PreviewLoadingTemplateHtml);\r\n\r\n  const { data } = await portalService.getFileDetails(fileName);\r\n  const file = base64ToArrayBuffer(data.fileByte);\r\n  const blob = new Blob([file], {\r\n    type: mappingContentTypeWithFileName(fileName)\r\n  });\r\n  const fileUrl = URL.createObjectURL(blob);\r\n  windowOpener.location.href = fileUrl;\r\n};\r\n\r\nexport const downloadFile = fileName => async (dispatch, getState) => {\r\n  if (isIOSDevice) {\r\n    await previewInIOS(fileName);\r\n    return;\r\n  }\r\n\r\n  dispatch(loading(true));\r\n  try {\r\n    const { data } = await portalService.getFileDetails(fileName);\r\n\r\n    const file = base64ToArrayBuffer(data.fileByte);\r\n\r\n    const blob = new Blob([file], {\r\n      type: mappingContentTypeWithFileName(fileName)\r\n    });\r\n\r\n    if (window.navigator && window.navigator.msSaveOrOpenBlob) {\r\n      window.navigator.msSaveOrOpenBlob(blob, fileName);\r\n      return;\r\n    }\r\n\r\n    const fileUrl = URL.createObjectURL(blob);\r\n    const a = document.createElement('a');\r\n    document.body.appendChild(a);\r\n    a.style = 'display:none';\r\n    a.href = fileUrl;\r\n    a.download = fileName;\r\n    a.click();\r\n    a.parentNode.removeChild(a);\r\n    window.URL.revokeObjectURL(fileUrl);\r\n  } catch (error) {\r\n  } finally {\r\n    dispatch(loading(false));\r\n  }\r\n};\r\n\r\nexport const getTimeSlots = (\r\n  startTimeMomentJs,\r\n  endTimeMomentJs,\r\n  locations,\r\n  initLoad = false\r\n) => async (dispatch, getState) => {\r\n  if (requests.getTimeSlots !== null) {\r\n    requests.getTimeSlots.cancel();\r\n  }\r\n\r\n  requests.getTimeSlots = source();\r\n\r\n  const { config, appointment, datasource } = getState();\r\n  const {\r\n    specialtyType,\r\n    appointmentType,\r\n    practitioner,\r\n    location,\r\n    timezone,\r\n    timeZoneOfLocation\r\n  } = appointment;\r\n\r\n  const phoneConsult = checkIsPhoneConsult(config.siteConsultTypes, location);\r\n  const timezoneValue = timezone || timeZoneOfLocation;\r\n  let response;\r\n  try {\r\n    dispatch(toggleLoadingTimeSlots());\r\n\r\n    response = await portalService.getTimeSlots(\r\n      specialtyType,\r\n      appointmentType,\r\n      locations,\r\n      practitioner === 'ANY' ? '' : practitioner,\r\n      timezoneValue,\r\n      mapMomentjsToDateTimeString(startTimeMomentJs),\r\n      mapMomentjsToDateTimeString(endTimeMomentJs),\r\n      phoneConsult\r\n    );\r\n\r\n    // for initial load, check for the further 2 months if no time slots in current month\r\n    if (initLoad && response.data.timeslots.length === 0) {\r\n      response = await portalService.getTimeSlots(\r\n        specialtyType,\r\n        appointmentType,\r\n        locations,\r\n        practitioner === 'ANY' ? '' : practitioner,\r\n        timezoneValue,\r\n        mapMomentjsToDateTimeString(\r\n          startTimeMomentJs.add(1, 'month').startOf('month')\r\n        ),\r\n        mapMomentjsToDateTimeString(\r\n          endTimeMomentJs.add(1, 'month').endOf('month')\r\n        ),\r\n        phoneConsult\r\n      );\r\n\r\n      // Fetching next available appointment for next six months.\r\n      for(let i=0;i<5;i++){\r\n        if (response.data.timeslots.length === 0) {\r\n          response = await portalService.getTimeSlots(\r\n            specialtyType,\r\n            appointmentType,\r\n            locations,\r\n            practitioner === 'ANY' ? '' : practitioner,\r\n            timezoneValue,\r\n            mapMomentjsToDateTimeString(\r\n              startTimeMomentJs.add(1, 'month').startOf('month')\r\n            ),\r\n            mapMomentjsToDateTimeString(\r\n              endTimeMomentJs.add(1, 'month').endOf('month')\r\n            ),\r\n            phoneConsult\r\n          );\r\n        }\r\n        else{\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    const { data } = response;\r\n    const timeslots = data === null ? [] : data.timeslots || [];\r\n\r\n    const filteredTimeSlots = getTimeslotsByPractitionersAndLocations(\r\n      timeslots,\r\n      datasource.practitioners,\r\n      datasource.locations,\r\n      specialtyType\r\n    );\r\n    dispatch(setTimeSlots(filteredTimeSlots, !initLoad));\r\n  } catch (e) {\r\n    if (!isCancel(e)) {\r\n      //error handling\r\n    }\r\n  }\r\n  dispatch(toggleLoadingTimeSlots(false));\r\n  requests.getTimeSlots = null;\r\n};\r\n\r\nconst setDatasourceValue = (key, value) => {\r\n  return {\r\n    type: DATASOURCE_ACTION.SET_VALUE,\r\n    payload: {\r\n      key,\r\n      value\r\n    }\r\n  };\r\n};\r\n\r\nconst getTimeslotsByPractitionersAndLocations = (\r\n  timeslots,\r\n  practitioners,\r\n  locations,\r\n  specialtyType\r\n) => {\r\n  if (!timeslots || timeslots.length === 0) return [];\r\n  const practitionerIds = filterPractitionersBySpecialty(\r\n    practitioners,\r\n    specialtyType\r\n  ).map(p => p.practitionerId);\r\n  const locationIds = locations.map(l => l.locationId);\r\n\r\n  return timeslots.filter(ts => {\r\n    const practitionerId = ts.practitioner.practitionerId;\r\n    const locationId = ts.locationId;\r\n\r\n    return (\r\n      practitionerIds.includes(practitionerId) &&\r\n      locationIds.includes(locationId)\r\n    );\r\n  });\r\n};\r\n\r\nexport const getOnlinePaymentToken = () => async dispatch => {\r\n  try {\r\n    const { data } = await portalService.getOnlinePaymentTokenAndIsTestFlag();\r\n    const onlinePaymentToken =\r\n      data?.applicationAttributes?.find(\r\n        item => item.attributeName === ONLINE_PAYMENT_KEY_NAME\r\n      )?.attributeValue ?? null;\r\n    let onlinePaymentIsTest =\r\n      data?.applicationAttributes?.find(\r\n        item => item.attributeName === ONLINE_PAYMENT_IS_TEST\r\n      )?.attributeValue ?? false;\r\n    if (onlinePaymentIsTest) {\r\n      onlinePaymentIsTest = onlinePaymentIsTest === 'true' ? true : false;\r\n    }\r\n    dispatch(setDatasourceValue('onlinePaymentToken', onlinePaymentToken));\r\n    dispatch(setDatasourceValue('onlinePaymentIsTest', onlinePaymentIsTest));\r\n    if (onlinePaymentToken) {\r\n      createPinPaymentsScript();\r\n    }\r\n  } catch (error) {}\r\n};\r\n","const PreviewLoadingTemplateHtml = `\r\n<style>\r\n.preview-loading .loading-animation-container {\r\n  position: fixed;\r\n  height: 100%;\r\n  width: 100%;\r\n  z-index: 1019;\r\n  -webkit-backdrop-filter: blur(5px);\r\n  backdrop-filter: blur(5px);\r\n  font-family: Helvetica, sans-serif;\r\n}\r\n\r\n.preview-loading .loader {\r\n  height: 20px;\r\n  width: 250px;\r\n  position: absolute;\r\n  top: 50%;\r\n  left: 50%;\r\n  transform: translate(-50%, -50%);\r\n}\r\n\r\n.preview-loading .loader--dot {\r\n  animation: loader ease-in-out 3s infinite;\r\n  height: 20px;\r\n  width: 20px;\r\n  border-radius: 100%;\r\n  background-color: black;\r\n  position: absolute;\r\n  border: 2px solid white;\r\n}\r\n\r\n.preview-loading .loader--dot:first-child {\r\n  background-color: #60c5ba;\r\n  animation-delay: 0.5s;\r\n}\r\n.preview-loading .loader--dot:nth-child(2) {\r\n  background-color: #e4018b;\r\n  animation-delay: 0.4s;\r\n}\r\n.preview-loading .loader--dot:nth-child(3) {\r\n  background-color: #ffcb3b;\r\n  animation-delay: 0.3s;\r\n}\r\n.preview-loading .loader--dot:nth-child(4) {\r\n  background-color: #f68a33;\r\n  animation-delay: 0.2s;\r\n}\r\n\r\n.preview-loading .loader--text {\r\n  position: absolute;\r\n  top: 200%;\r\n  left: 0;\r\n  right: 0;\r\n  width: 16rem;\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  margin: auto;\r\n}\r\n\r\n.preview-loading .loader--text--top {\r\n  display: flex;\r\n}\r\n\r\n.preview-loading .loader--text--top--ellipsis:after {\r\n  content: \"\";\r\n  font-weight: bold;\r\n  animation: loading-text 3s infinite;\r\n}\r\n\r\n@keyframes loader {\r\n  15% {\r\n    transform: translateX(0);\r\n  }\r\n  45% {\r\n    transform: translateX(230px);\r\n  }\r\n  65% {\r\n    transform: translateX(230px);\r\n  }\r\n  95% {\r\n    transform: translateX(0);\r\n  }\r\n}\r\n\r\n@keyframes loading-text {\r\n  0% {\r\n    content: \"\";\r\n  }\r\n  25% {\r\n    content: \".\";\r\n  }\r\n  50% {\r\n    content: \"..\";\r\n  }\r\n  75% {\r\n    content: \"...\";\r\n  }\r\n}\r\n</style>\r\n<div class=\"preview-loading loading-animation-container\">\r\n<div class=\"loader\">\r\n  <div class=\"loader--dot\"></div>\r\n  <div class=\"loader--dot\"></div>\r\n  <div class=\"loader--dot\"></div>\r\n  <div class=\"loader--dot\"></div>\r\n  <div class=\"loader--text\">\r\n    <div class=\"loader--text--top\">\r\n      <div class=\"loader--text--top--heading\">Preview Loading</div>\r\n      <div class=\"loader--text--top--ellipsis\"></div>\r\n    </div>\r\n  </div>\r\n</div>\r\n</div>\r\n`;\r\n\r\nexport default PreviewLoadingTemplateHtml;\r\n","import { FORM_ACTION } from './';\r\nimport { deepGet } from '../../../utils';\r\nimport { loading, showError } from '../../App/actions';\r\nimport { goToPage, updateAppointmentId, updateAppointmentCancelled } from './';\r\nimport { portalService } from '../../../services';\r\nimport {\r\n  getSpecialtyTypeAppointmentType,\r\n  getPractitionerText,\r\n  getPractitionerFirstName,\r\n  getPractitionerLastName,\r\n  getLocationTextAndPosition,\r\n  getAppointmentDateTimeText,\r\n  mapAusDateStrToDate,\r\n  mapMomentjsToDateTimeString,\r\n  checkIsPhoneConsult,\r\n  getFileNameWithExtension,\r\n  getMedicareNumberAndIRNFromString,\r\n  getMedicareExpiryDateFromString,\r\n  fetchForCardTokenPromise,\r\n  canSaveCreditCard,\r\n  getTimezoneText,\r\n  timezoneTextAndTzIdMap\r\n} from '../helpers';\r\nimport {\r\n  PAGE_KEYS,\r\n  FORM_KEYS,\r\n  MAX_FILE_SIZE,\r\n  MAX_FILE_NUMBER,\r\n  VALID_FILE_EXTENSION,\r\n  SUPPORTED_FILE_TEXT,\r\n  DEFAULT_FILE_ASSOCIATION_ENTITY,\r\n  DEFAULT_FILE_ASSOCIATION_TYPE\r\n} from '../constants';\r\n\r\nexport const setFormValueByKey = (key, value) => {\r\n  return {\r\n    type: FORM_ACTION.SET_VALUE,\r\n    payload: {\r\n      key,\r\n      value\r\n    }\r\n  };\r\n};\r\nexport const setFormErrorTextByKey = (key, errorText) => {\r\n  return {\r\n    type: FORM_ACTION.SET_ERROR,\r\n    payload: {\r\n      key,\r\n      errorText\r\n    }\r\n  };\r\n};\r\n\r\nexport const setVerifyDrawerOpen = open => {\r\n  return {\r\n    type: FORM_ACTION.TOGGLE_VERIFICATION_DRAWER,\r\n    payload: open\r\n  };\r\n};\r\n\r\nexport const onClickPlaceBooking = () => async (dispatch, getState) => {\r\n  const { reCaptchaEnabled } = getState().config;\r\n  if (reCaptchaEnabled) {\r\n    dispatch(setVerifyDrawerOpen(true));\r\n  } else {\r\n    try {\r\n      await dispatch(sendingVerificationCode());\r\n      dispatch(setVerifyDrawerOpen(true));\r\n    } catch (error) {\r\n      dispatch(\r\n        showError({\r\n          text: 'Sending sms verification failed',\r\n          canDismiss: true\r\n        })\r\n      );\r\n    }\r\n  }\r\n};\r\n\r\nexport const sendingVerificationCode = () => async (dispatch, getState) => {\r\n  const { mobile } = getState().form;\r\n  dispatch(loading(true));\r\n  try {\r\n    await portalService.requestVerificationCode({\r\n      mobileNumber: mobile\r\n    });\r\n  } catch (error) {\r\n    throw error;\r\n  } finally {\r\n    dispatch(loading(false));\r\n  }\r\n};\r\n\r\nexport const verifyCode = code => async (dispatch, getState) => {\r\n  dispatch(loading(true));\r\n  try {\r\n    await portalService.verifyCode({ verificationCode: code });\r\n  } catch (error) {\r\n    throw error;\r\n  } finally {\r\n    dispatch(loading(false));\r\n  }\r\n};\r\n\r\nexport const setFiles = files => (dispatch, getState) => {\r\n  const { [FORM_KEYS.FILES]: filesInStore } = getState().form;\r\n  // check file extensions\r\n  const invalidExtensionFiles = files.filter(\r\n    file =>\r\n      !VALID_FILE_EXTENSION.includes(\r\n        getFileNameWithExtension(file.name).extension\r\n      )\r\n  );\r\n  if (invalidExtensionFiles.length > 0) {\r\n    dispatch(\r\n      showError({\r\n        text: `Only ${SUPPORTED_FILE_TEXT} are supported, Please try again.`,\r\n        canDismiss: true\r\n      })\r\n    );\r\n    return false;\r\n  }\r\n\r\n  // check file size.\r\n  const overSizeFiles = files.filter(f => f.size > MAX_FILE_SIZE);\r\n  if (overSizeFiles.length > 0) {\r\n    dispatch(\r\n      showError({\r\n        text: 'The maximum size of each file is 10mb, please reduce the size and try again',\r\n        canDismiss: true\r\n      })\r\n    );\r\n    return false;\r\n  }\r\n\r\n  // check file name\r\n  const filesInStoreNames = filesInStore.map(d => d.name);\r\n  const duplicateNameFiles = files.filter(f =>\r\n    filesInStoreNames.includes(f.name)\r\n  );\r\n  if (duplicateNameFiles.length) {\r\n    dispatch(\r\n      showError({\r\n        text: 'Files with same name exist, please rename the file and try again',\r\n        canDismiss: true\r\n      })\r\n    );\r\n    return false;\r\n  }\r\n\r\n  // total file number\r\n  const total = filesInStore.length + files.length;\r\n  if (total > MAX_FILE_NUMBER) {\r\n    dispatch(\r\n      showError({\r\n        text: `Only ${MAX_FILE_NUMBER} files can be uploaded for each appointment and please try again`,\r\n        canDismiss: true\r\n      })\r\n    );\r\n    return false;\r\n  }\r\n\r\n  dispatch({\r\n    type: FORM_ACTION.SET_FILES,\r\n    payload: { files: files }\r\n  });\r\n};\r\n\r\nexport const removeFile = fileIndex => {\r\n  return {\r\n    type: FORM_ACTION.REMOVE_FILE,\r\n    payload: fileIndex\r\n  };\r\n};\r\n\r\nexport const submitBooking =\r\n  (verificationCode = '', recaptchaToken = '') =>\r\n  async (dispatch, getState) => {\r\n    let creditCardToken = '';\r\n    if (canSaveCreditCard(getState())) {\r\n      creditCardToken = await dispatch(getCreditCardToken());\r\n      const { isCreditCardMandatory } = getState().config;\r\n      if (isCreditCardMandatory && !creditCardToken) {\r\n        return false;\r\n      }\r\n    }\r\n    const { files } = getState().form;\r\n    try {\r\n      if (files && files.length > 0) {\r\n        await dispatch(\r\n          submitBookingWithFiles(\r\n            verificationCode,\r\n            recaptchaToken,\r\n            creditCardToken\r\n          )\r\n        );\r\n      } else {\r\n        await dispatch(\r\n          submitBookingWithoutFiles(\r\n            verificationCode,\r\n            recaptchaToken,\r\n            creditCardToken\r\n          )\r\n        );\r\n      }\r\n    } catch (error) {\r\n      throw error;\r\n    }\r\n  };\r\n\r\nconst getCreditCardToken = () => async (dispatch, getState) => {\r\n  const { onlinePaymentToken, onlinePaymentIsTest } = getState().datasource;\r\n  const {\r\n    creditCardNumber,\r\n    creditCardExpiry,\r\n    creditCardName,\r\n    creditCardSecurityCode\r\n  } = getState().form;\r\n  if (\r\n    !creditCardNumber ||\r\n    !creditCardExpiry ||\r\n    !creditCardName ||\r\n    !creditCardSecurityCode\r\n  ) {\r\n    return '';\r\n  }\r\n  const [month, year] = creditCardExpiry.split('/');\r\n\r\n  // need to provide address_line1, address_city and address_country\r\n  // set them as not provided which is the same as Coreplus payment project\r\n  const card = {\r\n    number: creditCardNumber,\r\n    name: creditCardName,\r\n    expiry_month: month,\r\n    expiry_year: year,\r\n    cvc: creditCardSecurityCode,\r\n    address_line1: 'address',\r\n    address_city: 'not',\r\n    address_country: 'provided'\r\n  };\r\n  try {\r\n    dispatch(loading(true));\r\n    const response = await fetchForCardTokenPromise(\r\n      onlinePaymentToken,\r\n      card,\r\n      onlinePaymentIsTest\r\n    );\r\n    dispatch(loading(false));\r\n    return response?.token;\r\n  } catch (error) {\r\n    console.error('Saving credit card failed with error', error);\r\n    dispatch(\r\n      showError({\r\n        text: 'Saving credit card details failed.',\r\n        canDismiss: true\r\n      })\r\n    );\r\n    dispatch(loading(false));\r\n    return '';\r\n  }\r\n};\r\n\r\n/**\r\n * call submitbooking api endpoint directly.\r\n */\r\nconst submitBookingWithoutFiles =\r\n  (verificationCode, recaptchaToken, creditCardToken) =>\r\n  async (dispatch, getState) => {\r\n    const { appointment, form, config, datasource, waitingList } = getState();\r\n    const params = createBookingModel(\r\n      appointment,\r\n      form,\r\n      config,\r\n      datasource,\r\n      waitingList,\r\n      verificationCode,\r\n      recaptchaToken,\r\n      creditCardToken\r\n    );\r\n\r\n    dispatch(loading(true));\r\n    try {\r\n      const { data } = await portalService.submitBooking(params);\r\n      dispatch(loading(false));\r\n      dispatch(goToPage(PAGE_KEYS.CONFIRM));\r\n      const appointmentId = data.appointmentId;\r\n      dispatch(updateAppointmentId(appointmentId));\r\n      dispatch(updateAppointmentCancelled(false));\r\n    } catch (error) {\r\n      dispatch(\r\n        showError({\r\n          text: getResponseErrorMessage(error),\r\n          canDismiss: true\r\n        })\r\n      );\r\n      dispatch(loading(false));\r\n      throw error;\r\n    }\r\n  };\r\n\r\n/**\r\n *  new process with file uploading\r\n * 1. detect client existing(used for checking new or existing client)\r\n * 2. call create client\r\n * 3  upload files\r\n * 4. create appointment\r\n * 5. link association\r\n */\r\nconst submitBookingWithFiles =\r\n  (verificationCode, recaptchaToken, creditCardToken) =>\r\n  async (dispatch, getState) => {\r\n    const { appointment, form, config, datasource, waitingList } = getState();\r\n    let params = createBookingModel(\r\n      appointment,\r\n      form,\r\n      config,\r\n      datasource,\r\n      waitingList,\r\n      verificationCode,\r\n      recaptchaToken,\r\n      creditCardToken\r\n    );\r\n    dispatch(loading(true));\r\n    let appointmentId;\r\n    let fileIdList = [];\r\n    let isNewClientFlag;\r\n    try {\r\n      const clientObj = params.clients[0];\r\n      const { data: getClientResponse } = await portalService.getClient(\r\n        clientObj\r\n      );\r\n      isNewClientFlag = !getClientResponse.client;\r\n      const { data: createClientResponse } = await portalService.createClient(\r\n        params\r\n      );\r\n      const clientId = createClientResponse.client.clientId;\r\n\r\n      const newPassingClientObject = { ...params.clients[0], clientId };\r\n      params = {\r\n        ...params,\r\n        clients: [{ ...newPassingClientObject }]\r\n      };\r\n      fileIdList = await uploadFiles(clientId, form.files);\r\n    } catch (ex) {\r\n      dispatch(\r\n        showError({\r\n          text: 'Uploading files failed, please try again.',\r\n          canDismiss: true\r\n        })\r\n      );\r\n      dispatch(loading(false));\r\n      throw ex;\r\n    }\r\n    try {\r\n      const { data: appointmentResponse } = await portalService.submitBooking(\r\n        params,\r\n        isNewClientFlag\r\n      );\r\n      appointmentId = appointmentResponse.appointmentId;\r\n    } catch (ex) {\r\n      dispatch(\r\n        showError({\r\n          text: getResponseErrorMessage(ex),\r\n          canDismiss: true\r\n        })\r\n      );\r\n      dispatch(loading(false));\r\n      throw ex;\r\n    }\r\n    try {\r\n      await createFileAssociations(appointmentId, fileIdList);\r\n      dispatch(loading(false));\r\n    } catch (ex) {\r\n      dispatch(\r\n        showError({\r\n          text: 'Sorry error occurred during processing your request. Failed to attach files to the appointment.',\r\n          canDismiss: true\r\n        })\r\n      );\r\n      dispatch(loading(false));\r\n      throw ex;\r\n    }\r\n    dispatch(goToPage(PAGE_KEYS.CONFIRM));\r\n    dispatch(updateAppointmentId(appointmentId));\r\n    dispatch(updateAppointmentCancelled(false));\r\n  };\r\n\r\nconst uploadFiles = async (clientId, files) => {\r\n  let fileIdList = [];\r\n  try {\r\n    for (const file of files) {\r\n      const { data: createFileResponse } = await portalService.createFileNode(\r\n        clientId,\r\n        file.name,\r\n        file.size\r\n      );\r\n      const { Item1: fileId, Item2: presignedUrl } = createFileResponse;\r\n      fileIdList.push(fileId);\r\n\r\n      await portalService.uploadFileToS3(presignedUrl, file);\r\n    }\r\n    return fileIdList;\r\n  } catch (error) {\r\n    throw error;\r\n  }\r\n};\r\n\r\nconst createFileAssociations = async (appointmentId, fileIdList) => {\r\n  try {\r\n    for (const fileId of fileIdList) {\r\n      const association = {\r\n        associatedEntity: DEFAULT_FILE_ASSOCIATION_ENTITY,\r\n        associatedPrimaryDomainKey: appointmentId,\r\n        associationType: DEFAULT_FILE_ASSOCIATION_TYPE,\r\n        fileId: fileId\r\n      };\r\n      await portalService.createFileAssociation(association);\r\n    }\r\n  } catch (error) {\r\n    throw error;\r\n  }\r\n};\r\n\r\nconst createBookingModel = (\r\n  appointment,\r\n  form,\r\n  config,\r\n  datasource,\r\n  waitingList,\r\n  verificationCode,\r\n  recaptchaToken,\r\n  creditCardToken\r\n) => {\r\n  const {\r\n    specialtyType,\r\n    appointmentType,\r\n    practitioner,\r\n    location,\r\n    timezone,\r\n    appointmentDateTime,\r\n    timeZoneOfLocation\r\n  } = appointment;\r\n\r\n  const {\r\n    firstName,\r\n    middleName,\r\n    lastName,\r\n    preferredName,\r\n    email,\r\n    mobile,\r\n    dateOfBirth,\r\n    comments,\r\n    healthFund,\r\n    cardNumber,\r\n    cardPosition,\r\n    customFields,\r\n    clientAddress,\r\n    clientSuburb,\r\n    clientPostcode,\r\n    medicareNumber,\r\n    medicareExpiry\r\n  } = form;\r\n  const { specialtyTypes, practitioners, locations, positions } = datasource;\r\n  const {\r\n    siteConsultTypes,\r\n    confirmationText,\r\n    businessName,\r\n    reCaptchaEnabled,\r\n    isHidingLocationEnabled\r\n  } = config;\r\n\r\n  const isPhoneConsult = checkIsPhoneConsult(siteConsultTypes, location);\r\n\r\n  const locationTextAndPosition = getLocationTextAndPosition(\r\n    locations,\r\n    positions,\r\n    location\r\n  );\r\n\r\n  const { specialtyTypeText, appointmentTypeText, isTelehealthAppointment } =\r\n    getSpecialtyTypeAppointmentType(\r\n      specialtyTypes,\r\n      specialtyType,\r\n      appointmentType\r\n    );\r\n  const practitionerText = getPractitionerText(practitioners, practitioner);\r\n  const appointmentDateTimeText = getAppointmentDateTimeText(\r\n    appointmentDateTime,\r\n    waitingList.required,\r\n    waitingList.preferredTime\r\n  );\r\n\r\n  const enteredComments = comments ? `Client comment: ${comments}` : '';\r\n\r\n  const timezoneId = timezone || timeZoneOfLocation;\r\n  const timezoneText = getTimezoneText(timezoneId, datasource.timeZones);\r\n  const timezoneIdentifier =\r\n    timezoneTextAndTzIdMap[timezoneText.toLowerCase()] || '';\r\n\r\n  const appointmentParams = {\r\n    startDateTime: deepGet(appointmentDateTime, ['startDateTime']),\r\n    endDateTime: deepGet(appointmentDateTime, ['endDateTime']),\r\n    practitioner: {\r\n      practitionerId: practitioner === 'ANY' ? '' : practitioner,\r\n      firstName: getPractitionerFirstName(practitioners, practitioner),\r\n      lastName: getPractitionerLastName(practitioners, practitioner)\r\n    },\r\n    locationId: location === 'ANY' ? '' : location,\r\n    timezoneId: timezoneId,\r\n    timezoneText,\r\n    timezoneIdentifier,\r\n    appointmentTypeId: appointmentType,\r\n    notes: `${enteredComments} ${\r\n      isPhoneConsult ? '*This appointment is a phone consultation*' : ''\r\n    }`,\r\n    smsVerifyCode: verificationCode,\r\n    bookingDetails: createBookingDetailsText(\r\n      confirmationText,\r\n      specialtyTypeText,\r\n      practitionerText,\r\n      locationTextAndPosition.locationText,\r\n      appointmentDateTimeText,\r\n      timezoneText,\r\n      isHidingLocationEnabled\r\n    ),\r\n    coordinate: locationTextAndPosition.position,\r\n    appointmentTypeName: appointmentTypeText,\r\n    serviceName: specialtyTypeText,\r\n    locationAddress: locationTextAndPosition.locationText,\r\n    businessName: businessName\r\n      ? businessName\r\n      : locationTextAndPosition.locationText,\r\n    reCaptchaEnabled,\r\n    recaptchaToken,\r\n    isTelehealthAppointment\r\n  };\r\n\r\n  const waitingListProps = {\r\n    addToWaitingList: waitingList.required,\r\n    preferredTime: waitingList.preferredTime\r\n  };\r\n\r\n  const clientParams = {\r\n    firstName,\r\n    middleName,\r\n    lastName,\r\n    preferredName,\r\n    dateOfBirth: mapMomentjsToDateTimeString(mapAusDateStrToDate(dateOfBirth)),\r\n    phoneNumberMobile: mobile,\r\n    email,\r\n    healthFundProviderId: healthFund,\r\n    healthFundMembershipNumber: cardNumber,\r\n    healthFundCardPosition: cardPosition,\r\n    homePostcode: clientPostcode ? clientPostcode : null,\r\n    clientAddress: clientAddress ? clientAddress : null,\r\n    clientSuburb: clientSuburb ? clientSuburb : null,\r\n    customFields:\r\n      Object.keys(customFields).length === 0\r\n        ? null\r\n        : datasource.customFields.map(cf => {\r\n            return {\r\n              id: cf.id,\r\n              value: customFields[cf.id] || false,\r\n              name: cf.name\r\n            };\r\n          }),\r\n    cardToken: creditCardToken ? creditCardToken : null\r\n  };\r\n\r\n  const { medicareCardNumber, medicareCardIRN } =\r\n    getMedicareNumberAndIRNFromString(medicareNumber);\r\n  if (medicareCardNumber && medicareCardIRN) {\r\n    clientParams.medicareCardNumber = medicareCardNumber;\r\n    clientParams.medicareCardIRN = medicareCardIRN;\r\n  }\r\n\r\n  clientParams.medicareCardExpireDate =\r\n    getMedicareExpiryDateFromString(medicareExpiry);\r\n\r\n  return {\r\n    ...appointmentParams,\r\n    ...waitingListProps,\r\n    clients: [{ ...clientParams }]\r\n  };\r\n};\r\n\r\nconst createBookingDetailsText = (\r\n  confirmationText,\r\n  specialtyTypeText,\r\n  practitionerText,\r\n  locationText,\r\n  appointmentDateTimeText,\r\n  timezoneText,\r\n  isHidingLocationEnabled\r\n) => {\r\n  const appointmentTimeText = timezoneText\r\n    ? `${appointmentDateTimeText} (${timezoneText} Time)`\r\n    : appointmentDateTimeText;\r\n  return confirmationText\r\n    .replace(/#SpecialtyName#/g, specialtyTypeText)\r\n    .replace(/#Specialist#/g, practitionerText)\r\n    .replace(/#location#/g, isHidingLocationEnabled ? '' : locationText)\r\n    .replace(/#Appointment_Start_Time#/g, appointmentTimeText);\r\n};\r\n\r\nconst getResponseErrorMessage = error => {\r\n  const modelState = deepGet(error, ['response', 'data', 'ModelState']);\r\n  if (modelState) {\r\n    return Object.keys(modelState)\r\n      .map(key => modelState[key])\r\n      .join(', ');\r\n  }\r\n\r\n  return deepGet(\r\n    error,\r\n    ['response', 'data', 'Message'],\r\n    'Error occurred during processing your request.'\r\n  );\r\n};\r\n","import { BOOKING_ACTION } from '.';\r\nimport { findNextStep, checkIsPhoneConsult } from '../helpers';\r\nimport { STEP_KEYS } from '../constants';\r\nimport { geolocationService } from '../../../services/portalService';\r\n\r\nexport const goToNextStep = currentStep => (dispatch, getState) => {\r\n  const {\r\n    preSelectPractitioner,\r\n    practitionerFirst,\r\n    siteConsultTypes,\r\n    isTimezoneEnabled\r\n  } = getState().config;\r\n  const { [STEP_KEYS.LOCATION]: locationValue } = getState().appointment;\r\n  let showTimeZone = false;\r\n  if (\r\n    currentStep === STEP_KEYS.PRACTITIONER ||\r\n    currentStep === STEP_KEYS.LOCATION\r\n  ) {\r\n    showTimeZone =\r\n      checkIsPhoneConsult(siteConsultTypes, locationValue) || isTimezoneEnabled;\r\n  }\r\n  const extraConfig = {\r\n    preSelectPractitioner,\r\n    practitionerFirst,\r\n    showTimeZone\r\n  };\r\n  const { steps } = getState().booking;\r\n  const foundIndex = steps.indexOf(currentStep);\r\n  const nextStep = findNextStep(currentStep, extraConfig);\r\n  const remainingStep = [...steps].slice(0, foundIndex + 1);\r\n\r\n  const newSteps = nextStep ? [...remainingStep, nextStep] : remainingStep;\r\n\r\n  if (foundIndex + 1 === steps.length) {\r\n    dispatch({\r\n      type: BOOKING_ACTION.SET_STEP,\r\n      payload: { steps: newSteps }\r\n    });\r\n  } else {\r\n    const stepsToBeClear = [...steps].slice(foundIndex + 1);\r\n    dispatch({\r\n      type: BOOKING_ACTION.GO_BACK_STEP,\r\n      payload: { steps: newSteps, clearSteps: stepsToBeClear }\r\n    });\r\n  }\r\n};\r\n\r\nexport const toggleVisibility = (key, visiable) => {\r\n  const visiableKey = visiable ? key : null;\r\n  return {\r\n    type: BOOKING_ACTION.TOGGLE_VISIBILITY,\r\n    payload: visiableKey\r\n  };\r\n};\r\n\r\nexport const goToPage = page => {\r\n  return {\r\n    type: BOOKING_ACTION.GO_TO_PAGE,\r\n    payload: page\r\n  };\r\n};\r\n\r\nexport const makeNewBooking = () => {\r\n  return { type: BOOKING_ACTION.MAKE_NEW_BOOKING };\r\n};\r\n\r\nexport const updateAppointmentId = appointmentId => {\r\n  return {\r\n    type: BOOKING_ACTION.SET_VALUE,\r\n    payload: {\r\n      key: 'appointmentId',\r\n      value: appointmentId\r\n    }\r\n  };\r\n};\r\n\r\nexport const updateAppointmentCancelled = cancelled => {\r\n  return {\r\n    type: BOOKING_ACTION.SET_VALUE,\r\n    payload: {\r\n      key: 'isCancelled',\r\n      value: cancelled\r\n    }\r\n  };\r\n};\r\n\r\nexport const getSuburbs = async (searchText) => {\r\n  const paramsObj = {\r\n    search: searchText == null || searchText === \"\" ? null : searchText,\r\n    pageNumber: 1,\r\n    pageSize: 30,\r\n  };\r\n  return await geolocationService.getSuburbs(paramsObj);\r\n};\r\n","import { STEP_KEYS } from \"../constants\";\r\nexport const findNextStep = (step, config) => {\r\n  const { practitionerFirst, showTimeZone } = config;\r\n  let nextStep = \"\";\r\n  switch (step) {\r\n    case STEP_KEYS.SPECIALTY_TYPE:\r\n      return STEP_KEYS.APPOINTMENT_TYPE;\r\n\r\n    case STEP_KEYS.APPOINTMENT_TYPE:\r\n      nextStep = !practitionerFirst\r\n        ? STEP_KEYS.LOCATION\r\n        : STEP_KEYS.PRACTITIONER;\r\n      return nextStep;\r\n\r\n    case STEP_KEYS.LOCATION:\r\n      nextStep = STEP_KEYS.APPOINTMENT_DATE_TIME;\r\n\r\n      if (!practitionerFirst) nextStep = STEP_KEYS.PRACTITIONER;\r\n      else if (showTimeZone) nextStep = STEP_KEYS.TIMEZONE;\r\n\r\n      return nextStep;\r\n\r\n    case STEP_KEYS.PRACTITIONER:\r\n      nextStep = STEP_KEYS.LOCATION;\r\n\r\n      if (!practitionerFirst) {\r\n        nextStep = showTimeZone\r\n          ? STEP_KEYS.TIMEZONE\r\n          : STEP_KEYS.APPOINTMENT_DATE_TIME;\r\n      }\r\n      return nextStep;\r\n\r\n    case STEP_KEYS.TIMEZONE:\r\n      return STEP_KEYS.APPOINTMENT_DATE_TIME;\r\n\r\n    case STEP_KEYS.APPOINTMENT_DATE_TIME:\r\n      return null;\r\n\r\n    default:\r\n      return STEP_KEYS.SPECIALTY_TYPE;\r\n  }\r\n};\r\n","import { useMemo, useCallback } from \"react\";\r\nimport { ANY_SELECTION } from \"../../constants\";\r\nimport {\r\n  filterSchedulesByPractitioner,\r\n  filterLocationsBySchedules,\r\n  filterPractitionersBySpecialty,\r\n  filterSchedulesByLocation,\r\n  filterPractitionersBySchedules,\r\n  filterTimeSlotsByLocationAndPractitioner\r\n} from \"../../helpers\";\r\n\r\nexport const useGetSpecialtyTypeList = (\r\n  specialtyTypes,\r\n  preSelectSpecialtyType\r\n) => {\r\n  return useMemo(() => {\r\n    if (!specialtyTypes) return [];\r\n    return specialtyTypes.filter(\r\n      specialtyType =>\r\n        !preSelectSpecialtyType ||\r\n        specialtyType.specialtyTypeId === preSelectSpecialtyType\r\n    );\r\n  }, [specialtyTypes, preSelectSpecialtyType]);\r\n};\r\n\r\nexport const useGetAppointmentTypeList = (\r\n  specialtyTypeList,\r\n  specialtyTypeValue\r\n) => {\r\n  return useMemo(() => {\r\n    if (!specialtyTypeList) return [];\r\n    const selectedSpecialtyType = specialtyTypeList.find(\r\n      specialty => specialty.specialtyTypeId === specialtyTypeValue\r\n    );\r\n    return selectedSpecialtyType\r\n      ? selectedSpecialtyType.appointmentTypes.sort((a, b) => {\r\n          var nameA = a.description.toUpperCase(); // ignore upper and lowercase\r\n          var nameB = b.description.toUpperCase(); // ignore upper and lowercase\r\n          if (nameA < nameB) {\r\n            return -1;\r\n          }\r\n          if (nameA > nameB) {\r\n            return 1;\r\n          }\r\n          return 0;\r\n        })\r\n      : null;\r\n  }, [specialtyTypeList, specialtyTypeValue]);\r\n};\r\n\r\nexport const useGetLocationList = (\r\n  locations,\r\n  schedules,\r\n  practitionerValue,\r\n  practitionerFirst,\r\n  preSelectPractitioner\r\n) => {\r\n  return useMemo(() => {\r\n    if (!schedules || !locations) return [];\r\n    let schedulesCopy = schedules;\r\n    let locationCopy = locations;\r\n    if (practitionerFirst && preSelectPractitioner !== ANY_SELECTION) {\r\n      schedulesCopy = filterSchedulesByPractitioner(\r\n        schedulesCopy,\r\n        practitionerValue\r\n      );\r\n    }\r\n    locationCopy = filterLocationsBySchedules(locationCopy, schedulesCopy);\r\n    return locationCopy;\r\n  }, [\r\n    locations,\r\n    schedules,\r\n    practitionerValue,\r\n    practitionerFirst,\r\n    preSelectPractitioner\r\n  ]);\r\n};\r\n\r\nexport const useGetPractitionerList = (\r\n  practitioners,\r\n  schedules,\r\n  specialtyTypeValue,\r\n  locationValue\r\n) => {\r\n  return useMemo(() => {\r\n    let practitionersCopy = practitioners;\r\n    practitionersCopy = filterPractitionersBySpecialty(\r\n      practitionersCopy,\r\n      specialtyTypeValue\r\n    );\r\n\r\n    const schedulesFilteredByLocation = filterSchedulesByLocation(\r\n      schedules,\r\n      locationValue\r\n    );\r\n    practitionersCopy = filterPractitionersBySchedules(\r\n      practitionersCopy,\r\n      schedulesFilteredByLocation\r\n    );\r\n    return practitionersCopy;\r\n  }, [practitioners, schedules, specialtyTypeValue, locationValue]);\r\n};\r\n\r\nexport const useGetAvailableLocations = (\r\n  locations,\r\n  schedules,\r\n  locationValue,\r\n  practitionerValue\r\n) => {\r\n  return useMemo(() => {\r\n    let availableLocations = [locationValue];\r\n\r\n    if (locationValue === ANY_SELECTION) {\r\n      availableLocations = filterLocationsBySchedules(\r\n        locations,\r\n        filterSchedulesByPractitioner(schedules, practitionerValue)\r\n      ).map(l => l.locationId);\r\n    }\r\n    return availableLocations;\r\n  }, [locations, schedules, locationValue, practitionerValue]);\r\n};\r\n\r\nexport const useGetAvailablePractitioners = (\r\n  practitioners,\r\n  schedules,\r\n  specialtyTypeValue,\r\n  locationValue,\r\n  practitionerValue\r\n) => {\r\n  return useMemo(() => {\r\n    let availablePractitioners = [practitionerValue];\r\n\r\n    if (practitionerValue === ANY_SELECTION) {\r\n      const practitionersFilteredBySpecialty = filterPractitionersBySpecialty(\r\n        practitioners,\r\n        specialtyTypeValue\r\n      );\r\n\r\n      availablePractitioners = filterPractitionersBySchedules(\r\n        practitionersFilteredBySpecialty,\r\n        filterSchedulesByLocation(schedules, locationValue)\r\n      ).map(p => p.practitionerId);\r\n    }\r\n    return availablePractitioners;\r\n  }, [\r\n    practitioners,\r\n    schedules,\r\n    specialtyTypeValue,\r\n    locationValue,\r\n    practitionerValue\r\n  ]);\r\n};\r\n\r\nexport const useGetTimeSlotList = (\r\n  timeslots,\r\n  practitionerValue,\r\n  locationValue\r\n) => {\r\n  return useMemo(() => {\r\n    return filterTimeSlotsByLocationAndPractitioner(\r\n      timeslots,\r\n      locationValue,\r\n      practitionerValue\r\n    );\r\n  }, [timeslots, practitionerValue, locationValue]);\r\n};\r\n\r\nexport const useGetPositions = (locationList, getPositions) => {\r\n  return useCallback(() => {\r\n    getPositions(locationList);\r\n  }, [locationList, getPositions]);\r\n};\r\n","import React, { useCallback, useMemo, Fragment } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport {\r\n  WelcomeMessage,\r\n  SpecialtyTypeSelect,\r\n  AppointmentTypeSelect,\r\n  LocationSelect,\r\n  PractitionerSelect,\r\n  TimeZoneSelect,\r\n  ScheduleSelect,\r\n  LocationDrawer,\r\n  PractitionerDrawer,\r\n  ScheduleDrawer,\r\n  ContinueButton\r\n} from \"./components\";\r\nimport { MountedAnimationWrapper } from \"../AnimationWrapper\";\r\nimport { StepText } from \"../Common\";\r\nimport { STEP_KEYS, PAGE_KEYS } from \"../constants\";\r\nimport {\r\n  toggleVisibility,\r\n  selectSpecialtyType,\r\n  selectAppointmentType,\r\n  selectLocation,\r\n  selectPractitioner,\r\n  selectTimeZone,\r\n  selectAppointmentDateTime,\r\n  getPositions,\r\n  getTimeSlots,\r\n  goToNextStep,\r\n  goToPage,\r\n  setRequireWaitingList,\r\n  selectPreferredTime\r\n} from \"../actions\";\r\nimport { isCurrentStep } from \"../helpers\";\r\nimport {\r\n  useGetSpecialtyTypeList,\r\n  useGetAppointmentTypeList,\r\n  useGetLocationList,\r\n  useGetPractitionerList,\r\n  useGetAvailableLocations,\r\n  useGetAvailablePractitioners,\r\n  useGetTimeSlotList,\r\n  useGetPositions,\r\n  useSelectSpecialtyType,\r\n  useSelectAppointmentType,\r\n  useSelectLocation,\r\n  useSelectPractitioner,\r\n  useSelectTimeZone,\r\n  useSelectAppointmentDateTime,\r\n  useSelectWaitingListPreferredTime\r\n} from \"./hooks\";\r\nimport \"./bookingPortal.less\";\r\n\r\nexport const BookingPortal = props => {\r\n  const {\r\n    config,\r\n    datasource,\r\n    appointment,\r\n    booking,\r\n    waitingList,\r\n    toggleVisibility,\r\n    goToNextStep,\r\n    selectSpecialtyType,\r\n    selectAppointmentType,\r\n    selectLocation,\r\n    selectPractitioner,\r\n    selectTimeZone,\r\n    getPositions,\r\n    selectAppointmentDateTime,\r\n    getTimeSlots,\r\n    goToPage,\r\n    setRequireWaitingList,\r\n    selectPreferredTime\r\n  } = props;\r\n\r\n  const {\r\n    welcomeMessage,\r\n    preSelectSpecialtyType,\r\n    practitionerFirst,\r\n    preSelectPractitioner,\r\n    tenant,\r\n    specialtyHintText,\r\n    appointmentTypeHintText,\r\n    practitionerHintText,\r\n    locationHintText,\r\n    timezoneHintText,\r\n    appointmentDateTimeHintText,\r\n    noSlotsPlaceholder,\r\n    earliestBookingTime,\r\n    waitingListEnabled,\r\n    isTimezoneEnabled,\r\n    isAnyPractitionerEnabled\r\n  } = config;\r\n  const {\r\n    specialtyTypes,\r\n    locations,\r\n    practitioners,\r\n    schedules,\r\n    timeZones,\r\n    positions,\r\n    timeSlots,\r\n    loadingTimeSlots\r\n  } = datasource;\r\n  const { steps, visibilityKey } = booking;\r\n\r\n  const {\r\n    [STEP_KEYS.SPECIALTY_TYPE]: specialtyTypeValue,\r\n    [STEP_KEYS.APPOINTMENT_TYPE]: appointmentTypeValue,\r\n    [STEP_KEYS.PRACTITIONER]: practitionerValue,\r\n    [STEP_KEYS.LOCATION]: locationValue,\r\n    [STEP_KEYS.TIMEZONE]: timezoneValue,\r\n    [STEP_KEYS.APPOINTMENT_DATE_TIME]: appointmentDateTimeValue,\r\n    timeZoneOfLocation\r\n  } = appointment;\r\n\r\n  const specialtyTypeList = useGetSpecialtyTypeList(\r\n    specialtyTypes,\r\n    preSelectSpecialtyType\r\n  );\r\n\r\n  const appointmentTypeList = useGetAppointmentTypeList(\r\n    specialtyTypeList,\r\n    specialtyTypeValue\r\n  );\r\n\r\n  const locationList = useGetLocationList(\r\n    locations,\r\n    schedules,\r\n    practitionerValue,\r\n    practitionerFirst,\r\n    preSelectPractitioner\r\n  );\r\n\r\n  const practitionerList = useGetPractitionerList(\r\n    practitioners,\r\n    schedules,\r\n    specialtyTypeValue,\r\n    locationValue\r\n  );\r\n\r\n  const timeSlotsList = useGetTimeSlotList(\r\n    timeSlots,\r\n    practitionerValue,\r\n    locationValue\r\n  );\r\n\r\n  const availableLocations = useGetAvailableLocations(\r\n    locations,\r\n    schedules,\r\n    locationValue,\r\n    practitionerValue\r\n  );\r\n\r\n  const availablePractitioners = useGetAvailablePractitioners(\r\n    practitioners,\r\n    schedules,\r\n    specialtyTypeValue,\r\n    locationValue,\r\n    practitionerValue\r\n  );\r\n\r\n  const handleGetPositions = useGetPositions(locationList, getPositions);\r\n\r\n  const handleSelectSpecialtyType = useSelectSpecialtyType(\r\n    selectSpecialtyType,\r\n    goToNextStep,\r\n    specialtyTypeValue\r\n  );\r\n\r\n  const handleSelectAppointmentType = useSelectAppointmentType(\r\n    selectAppointmentType,\r\n    goToNextStep,\r\n    appointmentTypeValue\r\n  );\r\n\r\n  const handleSelectLocation = useSelectLocation(\r\n    selectLocation,\r\n    goToNextStep,\r\n    locationValue,\r\n    timeZones\r\n  );\r\n\r\n  const handleSelectPractitioner = useSelectPractitioner(\r\n    practitionerValue,\r\n    selectPractitioner,\r\n    goToNextStep\r\n  );\r\n\r\n  const handleSelectTimeZone = useSelectTimeZone(\r\n    timezoneValue,\r\n    selectTimeZone,\r\n    goToNextStep\r\n  );\r\n\r\n  const handleSelectAppointmentDateTime = useSelectAppointmentDateTime(\r\n    selectAppointmentDateTime,\r\n    practitionerValue,\r\n    locationValue,\r\n    timeSlots,\r\n    selectPractitioner,\r\n    selectLocation,\r\n    timeZones\r\n  );\r\n\r\n  const handleSelectWaitingListPreferredTime = useSelectWaitingListPreferredTime(\r\n    selectPreferredTime,\r\n    selectLocation,\r\n    selectPractitioner,\r\n    practitionerValue,\r\n    locationValue,\r\n    availableLocations,\r\n    availablePractitioners,\r\n    selectAppointmentDateTime,\r\n    toggleVisibility,\r\n    goToPage\r\n  );\r\n\r\n  const handleContinueButtonClick = useCallback(() => {\r\n    goToPage(PAGE_KEYS.CONTACT);\r\n  }, [goToPage]);\r\n\r\n  const finished = useMemo(() => {\r\n    return (\r\n      steps.includes(STEP_KEYS.APPOINTMENT_DATE_TIME) &&\r\n      appointmentDateTimeValue\r\n    );\r\n  }, [steps, appointmentDateTimeValue]);\r\n\r\n  const renderSteps = stepKey => {\r\n    switch (stepKey) {\r\n      case STEP_KEYS.SPECIALTY_TYPE:\r\n        return (\r\n          <SpecialtyTypeSelect\r\n            hint={specialtyHintText}\r\n            open={visibilityKey === STEP_KEYS.SPECIALTY_TYPE}\r\n            onToggle={toggleVisibility}\r\n            value={specialtyTypeValue}\r\n            onSelect={handleSelectSpecialtyType}\r\n            specialtyTypes={specialtyTypeList}\r\n            hideStep={!!preSelectSpecialtyType}\r\n          />\r\n        );\r\n      case STEP_KEYS.APPOINTMENT_TYPE:\r\n        return (\r\n          <AppointmentTypeSelect\r\n            hint={appointmentTypeHintText}\r\n            open={visibilityKey === STEP_KEYS.APPOINTMENT_TYPE}\r\n            onToggle={toggleVisibility}\r\n            value={appointmentTypeValue}\r\n            onSelect={handleSelectAppointmentType}\r\n            appointmentTypes={appointmentTypeList}\r\n          />\r\n        );\r\n      case STEP_KEYS.LOCATION:\r\n        return (\r\n          <LocationSelect\r\n            hint={locationHintText}\r\n            value={locationValue}\r\n            onToggle={toggleVisibility}\r\n            onSelect={handleSelectLocation}\r\n            locations={locationList}\r\n            getPositions={handleGetPositions}\r\n            isCurrentStep={isCurrentStep(steps, STEP_KEYS.LOCATION)}\r\n          />\r\n        );\r\n      case STEP_KEYS.PRACTITIONER:\r\n        return (\r\n          <PractitionerSelect\r\n            hint={practitionerHintText}\r\n            value={practitionerValue}\r\n            onToggle={toggleVisibility}\r\n            onSelect={handleSelectPractitioner}\r\n            practitioners={practitionerList}\r\n            preSelectPractitioner={preSelectPractitioner}\r\n            isCurrentStep={isCurrentStep(steps, STEP_KEYS.PRACTITIONER)}\r\n          />\r\n        );\r\n      case STEP_KEYS.TIMEZONE:\r\n        return (\r\n          <TimeZoneSelect\r\n            hint={timezoneHintText}\r\n            open={visibilityKey === STEP_KEYS.TIMEZONE}\r\n            onToggle={toggleVisibility}\r\n            value={timezoneValue}\r\n            onSelect={handleSelectTimeZone}\r\n            timeZones={timeZones}\r\n            isTimezoneEnabled={isTimezoneEnabled}\r\n          />\r\n        );\r\n      case STEP_KEYS.APPOINTMENT_DATE_TIME:\r\n        return (\r\n          <ScheduleSelect\r\n            hint={appointmentDateTimeHintText}\r\n            onToggle={toggleVisibility}\r\n            appointmentDateTime={appointmentDateTimeValue}\r\n            noSlotsPlaceholder={noSlotsPlaceholder}\r\n            loading={loadingTimeSlots}\r\n            timeSlots={timeSlotsList}\r\n          />\r\n        );\r\n      default:\r\n        return null;\r\n    }\r\n  };\r\n\r\n  return (\r\n    <MountedAnimationWrapper animationClassName=\"booking-portal-animation\">\r\n      <div className=\"booking-portal-container\">\r\n        {welcomeMessage && <WelcomeMessage title={welcomeMessage} />}\r\n        <div className=\"booking-portal-step-text-container\">\r\n          <StepText step={1} />\r\n        </div>\r\n        {steps.map(stepKey => (\r\n          <Fragment key={stepKey}>{renderSteps(stepKey)}</Fragment>\r\n        ))}\r\n        {finished && <ContinueButton onClick={handleContinueButtonClick} />}\r\n        <LocationDrawer\r\n          open={visibilityKey === STEP_KEYS.LOCATION}\r\n          onToggle={toggleVisibility}\r\n          onSelect={handleSelectLocation}\r\n          value={locationValue}\r\n          locations={locationList}\r\n          positions={positions}\r\n        />\r\n        <PractitionerDrawer\r\n          open={visibilityKey === STEP_KEYS.PRACTITIONER}\r\n          onToggle={toggleVisibility}\r\n          onSelect={handleSelectPractitioner}\r\n          value={practitionerValue}\r\n          practitioners={practitionerList}\r\n          tenant={tenant}\r\n          isAnyPractitionerEnabled={isAnyPractitionerEnabled}\r\n        />\r\n        <ScheduleDrawer\r\n          open={visibilityKey === STEP_KEYS.APPOINTMENT_DATE_TIME}\r\n          onToggle={toggleVisibility}\r\n          timeSlots={timeSlotsList}\r\n          onSelect={handleSelectAppointmentDateTime}\r\n          loadingTimeSlots={loadingTimeSlots}\r\n          getTimeSlots={getTimeSlots}\r\n          isCurrentStep={isCurrentStep(steps, STEP_KEYS.APPOINTMENT_DATE_TIME)}\r\n          availableLocations={availableLocations}\r\n          practitionerValue={practitionerValue}\r\n          appointmentDateTimeValue={appointmentDateTimeValue}\r\n          earliestBookingTime={earliestBookingTime}\r\n          waitingListEnabled={waitingListEnabled}\r\n          waitingList={waitingList}\r\n          setRequireWaitingList={setRequireWaitingList}\r\n          selectPreferredTime={handleSelectWaitingListPreferredTime}\r\n          timezone={timezoneValue || timeZoneOfLocation}\r\n        />\r\n      </div>\r\n    </MountedAnimationWrapper>\r\n  );\r\n};\r\n\r\nexport default connect(\r\n  state => {\r\n    return {\r\n      config: state.config,\r\n      datasource: state.datasource,\r\n      booking: state.booking,\r\n      appointment: state.appointment,\r\n      waitingList: state.waitingList\r\n    };\r\n  },\r\n  {\r\n    toggleVisibility,\r\n    selectSpecialtyType,\r\n    selectAppointmentType,\r\n    selectLocation,\r\n    selectPractitioner,\r\n    selectTimeZone,\r\n    selectAppointmentDateTime,\r\n    getTimeSlots,\r\n    getPositions,\r\n    goToNextStep,\r\n    goToPage,\r\n    setRequireWaitingList,\r\n    selectPreferredTime\r\n  }\r\n)(BookingPortal);\r\n","import { WAITING_LIST_ACTION } from \"./types\";\r\n\r\nexport const setRequireWaitingList = (required = true) => {\r\n  return {\r\n    type: WAITING_LIST_ACTION.REQUIRE_WAITING_LIST,\r\n    payload: required\r\n  };\r\n};\r\n\r\nexport const selectPreferredTime = (time = \"\") => {\r\n  return {\r\n    type: WAITING_LIST_ACTION.UPDATE_PREFERRED_TIME,\r\n    payload: time\r\n  };\r\n};\r\n","import { useCallback } from \"react\";\r\nimport { STEP_KEYS, ANY_SELECTION, PAGE_KEYS } from \"../../constants\";\r\n\r\nexport const useSelectSpecialtyType = (\r\n  selectSpecialtyType,\r\n  goToNextStep,\r\n  specialtyTypeValue\r\n) => {\r\n  return useCallback(\r\n    specialtyTypeId => {\r\n      if (specialtyTypeId === specialtyTypeValue) return;\r\n      selectSpecialtyType(specialtyTypeId);\r\n      goToNextStep(STEP_KEYS.SPECIALTY_TYPE);\r\n    },\r\n    [selectSpecialtyType, goToNextStep, specialtyTypeValue]\r\n  );\r\n};\r\n\r\nexport const useSelectAppointmentType = (\r\n  selectAppointmentType,\r\n  goToNextStep,\r\n  appointmentTypeValue\r\n) => {\r\n  return useCallback(\r\n    appointmentTypeId => {\r\n      if (appointmentTypeId === appointmentTypeValue) return;\r\n      selectAppointmentType(appointmentTypeId);\r\n      goToNextStep(STEP_KEYS.APPOINTMENT_TYPE);\r\n    },\r\n    [selectAppointmentType, goToNextStep, appointmentTypeValue]\r\n  );\r\n};\r\n\r\nexport const useSelectLocation = (\r\n  selectLocation,\r\n  goToNextStep,\r\n  locationValue,\r\n  timeZones\r\n) => {\r\n  return useCallback(\r\n    location => {\r\n      const { locationId, timeZone } = location;\r\n      if (locationId === locationValue) return;\r\n      const timeZoneId = timeZone ? timeZone.timezoneId || \"\" : \"\";\r\n      const foundedTimeZone = timeZones.find(\r\n        timezone =>\r\n          timezone.timezoneUID.toLowerCase() === timeZoneId.toLowerCase()\r\n      );\r\n\r\n      const timeZoneIdOfLocation = foundedTimeZone\r\n        ? foundedTimeZone.timezoneUID\r\n        : timeZoneId;\r\n\r\n      selectLocation(locationId, timeZoneIdOfLocation);\r\n\r\n      goToNextStep(STEP_KEYS.LOCATION);\r\n    },\r\n    [selectLocation, goToNextStep, locationValue, timeZones]\r\n  );\r\n};\r\n\r\nexport const useSelectPractitioner = (\r\n  practitionerValue,\r\n  selectPractitioner,\r\n  goToNextStep\r\n) => {\r\n  return useCallback(\r\n    practitioner => {\r\n      const { practitionerId } = practitioner;\r\n      if (practitionerId === practitionerValue) return;\r\n      selectPractitioner(practitionerId);\r\n      goToNextStep(STEP_KEYS.PRACTITIONER);\r\n    },\r\n    [practitionerValue, selectPractitioner, goToNextStep]\r\n  );\r\n};\r\n\r\nexport const useSelectTimeZone = (\r\n  timezoneValue,\r\n  selectTimeZone,\r\n  goToNextStep\r\n) => {\r\n  return useCallback(\r\n    timezoneId => {\r\n      if (timezoneId === timezoneValue) return;\r\n      selectTimeZone(timezoneId);\r\n      goToNextStep(STEP_KEYS.TIMEZONE);\r\n    },\r\n    [timezoneValue, selectTimeZone, goToNextStep]\r\n  );\r\n};\r\n\r\nexport const useSelectAppointmentDateTime = (\r\n  selectAppointmentDateTime,\r\n  practitionerValue,\r\n  locationValue,\r\n  timeSlots,\r\n  selectPractitioner,\r\n  selectLocation\r\n) => {\r\n  return useCallback(\r\n    timeslot => {\r\n      const { startDateTime, endDateTime } = timeslot;\r\n      selectAppointmentDateTime(timeslot);\r\n      const anyPractitioner = practitionerValue === ANY_SELECTION;\r\n      const anyLocation = locationValue === ANY_SELECTION;\r\n      if (anyPractitioner || anyLocation) {\r\n        let matchedTimeSlots = timeSlots.filter(\r\n          ts =>\r\n            ts.startDateTime === startDateTime && ts.endDateTime === endDateTime\r\n        );\r\n        if (!anyPractitioner) {\r\n          matchedTimeSlots = matchedTimeSlots.filter(\r\n            ts => ts.practitioner.practitionerId === practitionerValue\r\n          );\r\n        }\r\n        if (!anyLocation) {\r\n          matchedTimeSlots = matchedTimeSlots.filter(\r\n            ts => ts.locationId === locationValue\r\n          );\r\n        }\r\n        const firstMatch = matchedTimeSlots[0];\r\n        if (anyPractitioner) {\r\n          selectPractitioner(firstMatch.practitioner.practitionerId);\r\n        }\r\n        if (anyLocation) {\r\n          selectLocation(firstMatch.locationId);\r\n        }\r\n      }\r\n    },\r\n    [\r\n      selectAppointmentDateTime,\r\n      practitionerValue,\r\n      locationValue,\r\n      timeSlots,\r\n      selectPractitioner,\r\n      selectLocation\r\n    ]\r\n  );\r\n};\r\n\r\nexport const useSelectWaitingListPreferredTime = (\r\n  selectPreferredTime,\r\n  selectLocation,\r\n  selectPractitioner,\r\n  practitionerValue,\r\n  locationValue,\r\n  availableLocations,\r\n  availablePractitioners,\r\n  selectAppointmentDateTime,\r\n  toggleVisibility,\r\n  goToPage\r\n) => {\r\n  return useCallback(\r\n    time => {\r\n      selectPreferredTime(time);\r\n      selectAppointmentDateTime(null);\r\n\r\n      if (\r\n        practitionerValue === ANY_SELECTION &&\r\n        availablePractitioners.length > 0\r\n      ) {\r\n        selectPractitioner(availablePractitioners[0]);\r\n      }\r\n      if (locationValue === ANY_SELECTION && availableLocations.length > 0) {\r\n        selectLocation(availableLocations[0]);\r\n      }\r\n      toggleVisibility(STEP_KEYS.APPOINTMENT_DATE_TIME, false);\r\n      goToPage(PAGE_KEYS.CONTACT);\r\n    },\r\n    [\r\n      selectPreferredTime,\r\n      selectLocation,\r\n      selectPractitioner,\r\n      practitionerValue,\r\n      locationValue,\r\n      availableLocations,\r\n      availablePractitioners,\r\n      selectAppointmentDateTime,\r\n      toggleVisibility,\r\n      goToPage\r\n    ]\r\n  );\r\n};\r\n","import React, { memo, useState, useCallback, useRef } from \"react\";\r\nimport ReCAPTCHA from \"react-google-recaptcha\";\r\nimport { SideDrawer, InputBox, TransparentButton } from \"../../Common\";\r\nimport { RECAPTCHA_KEY } from \"../../../../api/config\";\r\n\r\nconst MAX_COUNT_NUMBER = 5;\r\n\r\nexport const VerificationDrawer = memo(props => {\r\n  const recaptchaRef = useRef();\r\n  const [value, setValue] = useState(\"\");\r\n  const [verificationCount, setVerificationCount] = useState(0);\r\n  const [verificationError, setVerificationError] = useState(\"\");\r\n  const [recaptchaValid, setRecaptchaValid] = useState(false);\r\n  const [recaptchaToken, setRecaptchaToken] = useState(\"\");\r\n\r\n  const {\r\n    open,\r\n    onToggle,\r\n    submitBooking,\r\n    sendingVerificationCode,\r\n    verifyCode,\r\n    useRecaptcha\r\n  } = props;\r\n  const handleInputChange = useCallback(\r\n    value => {\r\n      setValue(value);\r\n      verificationError && setVerificationError(\"\");\r\n    },\r\n    [verificationError]\r\n  );\r\n\r\n  const handleCancel = useCallback(() => {\r\n    onToggle(false);\r\n    setValue(\"\");\r\n    setVerificationCount(0);\r\n    setVerificationError(\"\");\r\n  }, [onToggle]);\r\n\r\n  const handleResend = useCallback(async () => {\r\n    try {\r\n      await sendingVerificationCode();\r\n      setValue(\"\");\r\n      setVerificationCount(0);\r\n      setVerificationError(\"\");\r\n    } catch (e) {\r\n      setVerificationError(\r\n        \"Resend sms verification failed, could you please try it again.\"\r\n      );\r\n    }\r\n  }, [sendingVerificationCode]);\r\n\r\n  const handleConfirm = useCallback(async () => {\r\n    if (!useRecaptcha) {\r\n      let verified = false;\r\n      const count = verificationCount + 1;\r\n      setVerificationCount(count);\r\n      try {\r\n        await verifyCode(value);\r\n        verified = true;\r\n      } catch (e) {\r\n        const errorMessage = `Incorrect confirmation code${\r\n          count === MAX_COUNT_NUMBER\r\n            ? \", please press Resend and enter again\"\r\n            : \"\"\r\n        }`;\r\n        setVerificationError(errorMessage);\r\n      }\r\n      if (verified) {\r\n        setVerificationCount(0);\r\n        try {\r\n          await submitBooking(value);\r\n        } catch (e) {\r\n          handleCancel();\r\n        }\r\n      }\r\n    } else {\r\n      try {\r\n        await submitBooking(value, recaptchaToken);\r\n      } catch (e) {\r\n        handleCancel();\r\n      }\r\n    }\r\n  }, [\r\n    value,\r\n    verificationCount,\r\n    verifyCode,\r\n    submitBooking,\r\n    useRecaptcha,\r\n    recaptchaToken,\r\n    handleCancel\r\n  ]);\r\n\r\n  const handleVerifyRecaptcha = useCallback(value => {\r\n    setRecaptchaValid(true);\r\n    setRecaptchaToken(value);\r\n  }, []);\r\n\r\n  const renderVerificationMethod = () => {\r\n    if (useRecaptcha) {\r\n      return (\r\n        <ReCAPTCHA\r\n          ref={recaptchaRef}\r\n          sitekey={RECAPTCHA_KEY}\r\n          render=\"explicit\"\r\n          onChange={handleVerifyRecaptcha}\r\n        />\r\n      );\r\n    }\r\n    return (\r\n      <InputBox\r\n        label=\"Verification Code\"\r\n        value={value}\r\n        errorText={verificationError}\r\n        onChange={handleInputChange}\r\n      />\r\n    );\r\n  };\r\n\r\n  const buttonDisabled = () => {\r\n    if (useRecaptcha) {\r\n      return !recaptchaValid;\r\n    } else {\r\n      return (\r\n        !value || verificationCount === MAX_COUNT_NUMBER || !!verificationError\r\n      );\r\n    }\r\n  };\r\n\r\n  return (\r\n    <SideDrawer open={open} onToggle={onToggle} maskClosable={false}>\r\n      <span className=\"drawer-title drawer-title-small\">\r\n        A confirmation code was sent to your mobile device\r\n      </span>\r\n      <div>\r\n        {renderVerificationMethod()}\r\n        <div className=\"verification-sms-btn-container\">\r\n          <div className=\"verification-sms-btn-container-save\">\r\n            {!useRecaptcha && (\r\n              <TransparentButton\r\n                isTheme={true}\r\n                label=\"Resend\"\r\n                className=\"verification-sms-btn-resend\"\r\n                onClick={handleResend}\r\n              />\r\n            )}\r\n            <TransparentButton\r\n              isTheme={true}\r\n              label=\"Confirm\"\r\n              className=\"verification-sms-btn-confirm\"\r\n              forceDisabled={buttonDisabled()}\r\n              onClick={handleConfirm}\r\n            />\r\n          </div>\r\n          <div className=\"verification-sms-btn-container-back\">\r\n            <TransparentButton\r\n              label=\"Cancel\"\r\n              className=\"verification-sms-btn-cancel\"\r\n              onClick={handleCancel}\r\n            />\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </SideDrawer>\r\n  );\r\n});\r\n","import React, { memo, useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { InputBox } from '../../../Common';\r\nconst FormInput = memo(props => {\r\n  const {\r\n    formKey,\r\n    label,\r\n    value,\r\n    errorText,\r\n    onChange,\r\n    onValidate,\r\n    maxLength,\r\n    disabled,\r\n    regexRule\r\n  } = props;\r\n\r\n  const handleChange = useCallback(\r\n    value => {\r\n      if (value && regexRule && !regexRule.test(value)) return;\r\n      if (maxLength && value.length > maxLength) return;\r\n      onChange(formKey, value);\r\n      onValidate && onValidate(formKey, value);\r\n    },\r\n    [formKey, onChange, onValidate, maxLength, regexRule]\r\n  );\r\n\r\n  const handleBlur = useCallback(() => {\r\n    onValidate && onValidate(formKey, value);\r\n  }, [formKey, onValidate, value]);\r\n  return (\r\n    <InputBox\r\n      label={label}\r\n      value={value || ''}\r\n      errorText={errorText}\r\n      onChange={handleChange}\r\n      onBlur={handleBlur}\r\n      inputProps={{\r\n        autoComplete: 'none'\r\n      }}\r\n      disabled={disabled}\r\n    />\r\n  );\r\n});\r\n\r\nFormInput.propTypes = {\r\n  formKey: PropTypes.string.isRequired,\r\n  label: PropTypes.string.isRequired,\r\n  value: PropTypes.string,\r\n  errorText: PropTypes.string,\r\n  onValidate: PropTypes.func,\r\n  onChange: PropTypes.func.isRequired,\r\n  maxLength: PropTypes.number,\r\n  disabled: PropTypes.bool,\r\n  regexRule: PropTypes.instanceOf(RegExp)\r\n};\r\n\r\nexport default FormInput;\r\n","import React, {\r\n  memo,\r\n  useEffect,\r\n  useCallback,\r\n  useMemo,\r\n  useState,\r\n  useRef\r\n} from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport MaskedInput from \"react-text-mask\";\r\nimport Fade from \"@material-ui/core/Fade\";\r\nimport { DateOfBirthCalendar, InputBox, CalendarIcon } from \"../../../Common\";\r\nimport { useCheckMobile } from \"../../../hooks\";\r\n\r\nconst DateOfBirth = memo(props => {\r\n  const isMobile = useCheckMobile();\r\n  const dobRef = useRef();\r\n  const [focused, setFocused] = useState(false);\r\n  const [showCalendar, setShowCalendar] = useState(false);\r\n  const { formKey, value, errorText, onChange, onValidate } = props;\r\n\r\n  useEffect(() => {\r\n    document.addEventListener(\"click\", handleDocumentClick);\r\n    return () => {\r\n      document.removeEventListener(\"click\", handleDocumentClick);\r\n    };\r\n  }, []);\r\n\r\n  const handleDocumentClick = e => {\r\n    const targetDom = e.target;\r\n    if (dobRef.current && dobRef.current.contains(targetDom)) {\r\n      return;\r\n    }\r\n    setShowCalendar(false);\r\n  };\r\n\r\n  const handleChange = useCallback(\r\n    value => {\r\n      onChange(formKey, value);\r\n      onValidate(formKey, value);\r\n    },\r\n    [formKey, onChange, onValidate]\r\n  );\r\n\r\n  const handleSelect = useCallback(\r\n    value => {\r\n      handleChange(value);\r\n      setShowCalendar(false);\r\n    },\r\n    [handleChange]\r\n  );\r\n\r\n  const handleBlur = useCallback(() => {\r\n    setFocused(false);\r\n  }, []);\r\n\r\n  const handleFocus = useCallback(() => {\r\n    setShowCalendar(!isMobile);\r\n    setFocused(true);\r\n  }, [isMobile]);\r\n\r\n  const handleCalendarIconClick = useCallback(() => {\r\n    setShowCalendar(prevState => !prevState);\r\n  }, []);\r\n\r\n  const floatingLabel = useMemo(() => {\r\n    if (isMobile) {\r\n      return focused || !!value;\r\n    } else {\r\n      return showCalendar || focused || !!value;\r\n    }\r\n  }, [showCalendar, focused, value, isMobile]);\r\n\r\n  return (\r\n    <div ref={dobRef}>\r\n      <InputBox\r\n        label=\"Date of birth(dd/mm/yyyy) *\"\r\n        placeholder=\"__/__/____\"\r\n        errorText={errorText}\r\n        value={value || \"\"}\r\n        onBlur={handleBlur}\r\n        onChange={handleChange}\r\n        InputLabelProps={{\r\n          shrink: floatingLabel\r\n        }}\r\n        InputProps={{\r\n          inputComponent: DOBMaskedInput\r\n        }}\r\n        onFocus={handleFocus}\r\n        type=\"tel\"\r\n        className=\"date-of-birth-input\"\r\n      />\r\n      <CalendarPanel\r\n        show={showCalendar}\r\n        date={value}\r\n        error={!!errorText}\r\n        onSelect={handleSelect}\r\n      />\r\n      <div className=\"dob-mobile-icon\" onClick={handleCalendarIconClick}>\r\n        <CalendarIcon />\r\n      </div>\r\n    </div>\r\n  );\r\n});\r\n\r\nDateOfBirth.propTypes = {\r\n  formKey: PropTypes.string.isRequired,\r\n  value: PropTypes.string,\r\n  errorText: PropTypes.string,\r\n  onValidate: PropTypes.func,\r\n  onChange: PropTypes.func.isRequired\r\n};\r\n\r\nconst DOBMaskedInput = memo(props => {\r\n  const { inputRef, ...restProps } = props;\r\n  return (\r\n    <MaskedInput\r\n      {...restProps}\r\n      ref={ref => {\r\n        inputRef(ref ? ref.inputElement : null);\r\n      }}\r\n      mask={[/\\d/, /\\d/, \"/\", /\\d/, /\\d/, \"/\", /\\d/, /\\d/, /\\d/, /\\d/]}\r\n    />\r\n  );\r\n});\r\n\r\nDOBMaskedInput.propTypes = {\r\n  inputRef: PropTypes.func.isRequired\r\n};\r\n\r\nconst CalendarPanel = memo(props => {\r\n  const { show, date, error, onSelect } = props;\r\n\r\n  const dateString = useMemo(() => {\r\n    return !error ? date : null;\r\n  }, [error, date]);\r\n  return (\r\n    <Fade in={show}>\r\n      <div className={`dob-calendar-container ${error ? \"hasError\" : \"\"}`}>\r\n        <DateOfBirthCalendar dateString={dateString} onSelect={onSelect} />\r\n      </div>\r\n    </Fade>\r\n  );\r\n});\r\n\r\nCalendarPanel.propTypes = {\r\n  show: PropTypes.bool.isRequired,\r\n  date: PropTypes.string,\r\n  error: PropTypes.bool.isRequired,\r\n  onSelect: PropTypes.func.isRequired\r\n};\r\n\r\nexport default DateOfBirth;\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport FormInput from \"./FormInput\";\r\nimport { colorStyle } from \"../../../styles\";\r\nimport { FORM_KEYS } from \"../../../constants\";\r\n\r\nconst Comments = memo(props => {\r\n  const { value, errorText, onChange, onValidate, mandatory } = props;\r\n\r\n  return (\r\n    <div className=\"details-form-item\">\r\n      <FormInput\r\n        formKey={FORM_KEYS.COMMENTS}\r\n        label={`Comments${mandatory ? \" *\" : \"(optional)\"}`}\r\n        value={value}\r\n        errorText={errorText}\r\n        onChange={onChange}\r\n        onValidate={onValidate}\r\n        maxLength={200}\r\n      />\r\n      {value && (\r\n        <span className=\"comments-letter-counter\" style={colorStyle}>\r\n          {value.length} / 200\r\n        </span>\r\n      )}\r\n    </div>\r\n  );\r\n});\r\n\r\nComments.propTypes = {\r\n  value: PropTypes.string,\r\n  errorText: PropTypes.string,\r\n  onChange: PropTypes.func.isRequired,\r\n  onValidate: PropTypes.func\r\n};\r\n\r\nexport default Comments;\r\n","import React, { memo, useCallback } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { AutocompleteBox } from \"../../../Common\";\r\nimport { FORM_KEYS } from \"../../../constants\";\r\n\r\nconst HealthFund = memo(props => {\r\n  const { healthFunds, onChange } = props;\r\n\r\n  const handleChange = useCallback(\r\n    value => {\r\n      onChange(FORM_KEYS.HEALTH_FUND, value);\r\n    },\r\n    [onChange]\r\n  );\r\n\r\n  return (\r\n    <AutocompleteBox\r\n      label=\"Select your current health fund\"\r\n      options={healthFunds}\r\n      onChange={handleChange}\r\n    />\r\n  );\r\n});\r\n\r\nHealthFund.propTypes = {\r\n  healthFunds: PropTypes.array.isRequired,\r\n  onChange: PropTypes.func.isRequired\r\n};\r\n\r\nexport default HealthFund;\r\n","import React, { memo, useCallback } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Checkbox from \"@material-ui/core/Checkbox\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\n\r\nconst MedibankCustomFields = memo(props => {\r\n  const { value, formKey, customFields, onChange } = props;\r\n  const handleCustomFieldChange = useCallback(\r\n    (id, checked) => {\r\n      onChange(formKey, {\r\n        ...value,\r\n        [id]: checked\r\n      });\r\n    },\r\n    [onChange, value, formKey]\r\n  );\r\n\r\n  const renderCustomField = () => {\r\n    return customFields.map(cf => {\r\n      return (\r\n        <Grid item md={6} xs={12} className=\"custom-fields-item\" key={cf.id}>\r\n          <Checkbox\r\n            color=\"primary\"\r\n            checked={value[cf.id] || false}\r\n            onChange={e => handleCustomFieldChange(cf.id, e.target.checked)}\r\n          />\r\n          <span className=\"custom-fields-item-desc\">{cf.name}</span>\r\n        </Grid>\r\n      );\r\n    });\r\n  };\r\n  return (\r\n    <div className=\"custom-fields-container\">\r\n      <p className=\"custom-fields-description\">\r\n        I am interested in learning about Medibank's other insurance products as\r\n        indicated below :\r\n      </p>\r\n      <Grid container>{renderCustomField()}</Grid>\r\n    </div>\r\n  );\r\n});\r\n\r\nMedibankCustomFields.propTypes = {\r\n  value: PropTypes.object.isRequired,\r\n  formKey: PropTypes.string.isRequired,\r\n  customFields: PropTypes.array.isRequired,\r\n  onChange: PropTypes.func.isRequired\r\n};\r\n\r\nexport default MedibankCustomFields;\r\n","import React, { memo } from 'react';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport PropTypes from 'prop-types';\r\nimport FormInput from './FormInput';\r\nimport { isMedibank } from '../../../helpers';\r\nimport { FORM_KEYS } from '../../../constants';\r\nimport HealthFund from './HealthFund';\r\nimport MedibankCustomFields from './MedibankCustomFields';\r\n\r\nconst MedibankFields = memo(\r\n  ({\r\n    tenant,\r\n    MedibankFundId,\r\n    healthFundValue,\r\n    healthFunds,\r\n    cardNumberValue,\r\n    cardPositionValue,\r\n    customFieldsValue,\r\n    customFields,\r\n    setValue,\r\n    onValidate\r\n  }) => {\r\n    const isMedibankPortal = isMedibank(tenant);\r\n\r\n    if (!isMedibankPortal) return null;\r\n    const renderHealthFund = () => {\r\n      return (\r\n        <div className=\"details-form-item\">\r\n          <HealthFund healthFunds={healthFunds} onChange={setValue} />\r\n        </div>\r\n      );\r\n    };\r\n\r\n    const renderMembershipCard = () => {\r\n      if (healthFundValue !== MedibankFundId) return null;\r\n      return (\r\n        <Grid container spacing={1}>\r\n          <Grid item sm={6} xs={12} className=\"details-form-item\">\r\n            <FormInput\r\n              formKey={FORM_KEYS.CARD_NUMBER}\r\n              label=\"Membership number\"\r\n              value={cardNumberValue}\r\n              onChange={setValue}\r\n              onValidate={onValidate}\r\n            />\r\n          </Grid>\r\n          <Grid item sm={6} xs={12} className=\"details-form-item\">\r\n            <FormInput\r\n              formKey={FORM_KEYS.CARD_POSITION}\r\n              label=\"Card position number\"\r\n              value={cardPositionValue}\r\n              onChange={setValue}\r\n              onValidate={onValidate}\r\n            />\r\n          </Grid>\r\n        </Grid>\r\n      );\r\n    };\r\n\r\n    const renderCustomFields = () => {\r\n      return (\r\n        <MedibankCustomFields\r\n          value={customFieldsValue}\r\n          formKey={FORM_KEYS.CUSTOM_FIELDS}\r\n          customFields={customFields}\r\n          onChange={setValue}\r\n        />\r\n      );\r\n    };\r\n\r\n    return (\r\n      <>\r\n        {renderHealthFund()}\r\n        {renderMembershipCard()}\r\n        {renderCustomFields()}\r\n      </>\r\n    );\r\n  }\r\n);\r\n\r\nMedibankFields.propTypes = {\r\n  tenant: PropTypes.string,\r\n  MedibankFundId: PropTypes.string,\r\n  healthFundValue: PropTypes.string,\r\n  healthFunds: PropTypes.instanceOf(Array),\r\n  cardNumberValue: PropTypes.string,\r\n  cardPositionValue: PropTypes.string,\r\n  customFieldsValue: PropTypes.instanceOf(Object),\r\n  customFields: PropTypes.instanceOf(Array),\r\n  setValue: PropTypes.func.isRequired,\r\n  onValidate: PropTypes.func.isRequired\r\n};\r\n\r\nMedibankFields.defaultProps = {\r\n  healthFunds: [],\r\n  customFields: []\r\n};\r\n\r\nexport default MedibankFields;\r\n","export * from './dataMappingHelper';\r\nexport * from './stepHelper';\r\nexport * from './filterHelper';\r\nexport * from './bookingPortalHelper';\r\nexport * from './dateTimeHelper';\r\nexport * from './medicareHelpers';\r\nexport * from './FormValidationHelper';\r\nexport * from './appointmentSummaryHelper';\r\nexport * from './appointmentCancellationHelper';\r\nexport * from './fileHelper';\r\nexport * from './creditCardHelper';\r\n\r\nexport const isMedibank = (tenant = '') => tenant.toLowerCase() === 'medibank';\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport FormInput from \"./FormInput\";\r\nimport { FORM_KEYS } from \"../../../constants\";\r\n\r\nconst ClientAddress = memo(props => {\r\n  const { value, mandatory, errorText, onChange, onValidate } = props;\r\n\r\n  return (\r\n    <FormInput\r\n      formKey={FORM_KEYS.CLIENT_ADDRESS}\r\n      label={`Your address${mandatory ? \" *\" : \"(optional)\"}`}\r\n      value={value}\r\n      errorText={errorText}\r\n      onChange={onChange}\r\n      onValidate={onValidate}\r\n      maxLength={150}\r\n    />\r\n  );\r\n});\r\n\r\nClientAddress.propTypes = {\r\n  value: PropTypes.string,\r\n  errorText: PropTypes.string,\r\n  onChange: PropTypes.func.isRequired,\r\n  onValidate: PropTypes.func,\r\n  mandatory: PropTypes.bool\r\n};\r\n\r\nexport default ClientAddress;\r\n","import React, { memo, useState, useMemo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { ComboBox } from \"../../../Common\";\r\nimport { FORM_KEYS } from \"../../../constants\";\r\nimport { getSuburbs } from \"../../../actions\";\r\n\r\nconst ClientSuburb = memo((props) => {\r\n  const { value, errorText, onChange, onValidate, disabled, mandatory } = props;\r\n  const [data, setData] = useState([]);\r\n  const [loading, setLoading] = useState(false);\r\n  const search = async (value) => {\r\n    if (value.length === 0) {\r\n      if (data.length > 0) {\r\n        setData([]);\r\n      }\r\n    } else {\r\n      setLoading(true);\r\n\r\n      let response, dataSource;\r\n      try {\r\n        response = await getSuburbs(value);\r\n\r\n        dataSource = response.data.map((suburb) => {\r\n          return {\r\n            geoLocationId: suburb.SuburbId,\r\n            postcode: suburb.PostCode,\r\n            suburbName: suburb.SuburbName,\r\n            state: suburb.State,\r\n          };\r\n        });\r\n      } catch (err) {\r\n        // not doing anything here\r\n        console.log(\"Failed to load suburb list\");\r\n      } finally {\r\n        if (dataSource === undefined) dataSource = [];\r\n      }\r\n      setData(dataSource);\r\n      setLoading(false);\r\n    }\r\n  };\r\n\r\n  const handleSearch = (value) => {\r\n    onChange(FORM_KEYS.CLIENT_SUBURB, value);\r\n    onValidate(FORM_KEYS.CLIENT_SUBURB, value);\r\n    search(value);\r\n  };\r\n\r\n  const handleSelect = (locationId, option) => {\r\n    const selectedLocation = data.find((location) => {\r\n      return location.geoLocationId + \"\" === locationId + \"\";\r\n    });\r\n\r\n    if (selectedLocation != null) {\r\n      const postcode = selectedLocation.postcode;\r\n      onChange(FORM_KEYS.CLIENT_SUBURB, option.text);\r\n      onValidate(FORM_KEYS.CLIENT_SUBURB, value);\r\n      onChange(FORM_KEYS.CLIENT_POSTCODE, postcode);\r\n      onValidate(FORM_KEYS.CLIENT_POSTCODE, postcode);\r\n    }\r\n  };\r\n\r\n  const handleBlur = () => {\r\n    onValidate(FORM_KEYS.CLIENT_SUBURB, value);\r\n  };\r\n\r\n  const options = useMemo(\r\n    () =>\r\n      data.map((suburb) => {\r\n        return {\r\n          value: suburb.geoLocationId,\r\n          text: `${suburb.suburbName} ${suburb.state}`.trim(),\r\n        };\r\n      }),\r\n    [data]\r\n  );\r\n\r\n  return (\r\n    <ComboBox\r\n      label={`Suburb${mandatory ? \" *\" : \"\"}`}\r\n      options={options}\r\n      onChange={handleSelect}\r\n      onSearch={handleSearch}\r\n      onBlur={handleBlur}\r\n      value={value}\r\n      disabled={disabled}\r\n      loading={loading}\r\n      errorText={errorText}\r\n    />\r\n  );\r\n});\r\n\r\nClientSuburb.propTypes = {\r\n  value: PropTypes.string,\r\n  errorText: PropTypes.string,\r\n  onChange: PropTypes.func.isRequired,\r\n  onValidate: PropTypes.func,\r\n  mandatory: PropTypes.bool,\r\n  disabled: PropTypes.bool,\r\n};\r\n\r\nexport default ClientSuburb;\r\n","import React, { memo, useState, useMemo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { ComboBox } from \"../../../Common\";\r\nimport { FORM_KEYS } from \"../../../constants\";\r\nimport { getSuburbs } from \"../../../actions\";\r\n\r\nconst ClientPostcode = memo((props) => {\r\n  const { value, errorText, onChange, onValidate, disabled, mandatory } = props;\r\n  const [data, setData] = useState([]);\r\n  const [loading, setLoading] = useState(false);\r\n\r\n  const search = async (value) => {\r\n    if (value.length === 0) {\r\n      if (data.length > 0) {\r\n        setData([]);\r\n      }\r\n    } else {\r\n      setLoading(true);\r\n\r\n      let response, dataSource;\r\n      try {\r\n        response = await getSuburbs(value);\r\n\r\n        dataSource = response.data.map((suburb) => {\r\n          return {\r\n            geoLocationId: suburb.SuburbId,\r\n            postcode: suburb.PostCode,\r\n            suburbName: suburb.SuburbName,\r\n            state: suburb.State,\r\n          };\r\n        });\r\n      } catch (err) {\r\n        // not doing anything here\r\n        console.log(\"Failed to load suburb list\");\r\n      } finally {\r\n        if (dataSource === undefined) dataSource = [];\r\n      }\r\n\r\n      setData(dataSource);\r\n      setLoading(false);\r\n    }\r\n  };\r\n\r\n  const options = useMemo(\r\n    () =>\r\n      data.map((suburb) => {\r\n        return {\r\n          value: suburb.geoLocationId,\r\n          text: `${suburb.postcode}`.trim(),\r\n        };\r\n      }),\r\n    [data]\r\n  );\r\n\r\n  const handleSearch = (value) => {\r\n    onChange(FORM_KEYS.CLIENT_POSTCODE, value);\r\n    onValidate(FORM_KEYS.CLIENT_POSTCODE, value);\r\n    search(value);\r\n  };\r\n\r\n  const handleSelect = (locationId, option) => {\r\n    const selectedLocation = data.find((location) => {\r\n      return location.geoLocationId + \"\" === locationId + \"\";\r\n    });\r\n    if (selectedLocation != null) {\r\n      const suburb =\r\n        `${selectedLocation.suburbName} ${selectedLocation.state}`.trim();\r\n      onChange(FORM_KEYS.CLIENT_POSTCODE, option.text);\r\n      onValidate(FORM_KEYS.CLIENT_POSTCODE, value);\r\n      onChange(FORM_KEYS.CLIENT_SUBURB, suburb);\r\n      onValidate(FORM_KEYS.CLIENT_SUBURB, suburb);\r\n    }\r\n  };\r\n\r\n  const handleBlur = () => {\r\n    onValidate(FORM_KEYS.CLIENT_POSTCODE, value);\r\n  };\r\n\r\n  return (\r\n    <ComboBox\r\n      label={`Postcode${mandatory ? \" *\" : \"\"}`}\r\n      options={options}\r\n      onChange={handleSelect}\r\n      onSearch={handleSearch}\r\n      onBlur={handleBlur}\r\n      value={value}\r\n      disabled={disabled}\r\n      loading={loading}\r\n      errorText={errorText}\r\n    />\r\n  );\r\n});\r\n\r\nClientPostcode.propTypes = {\r\n  value: PropTypes.string,\r\n  errorText: PropTypes.string,\r\n  onChange: PropTypes.func.isRequired,\r\n  onValidate: PropTypes.func,\r\n  mandatory: PropTypes.bool,\r\n  disabled: PropTypes.bool,\r\n};\r\n\r\nexport default ClientPostcode;\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { useDropzone } from \"react-dropzone\";\r\nimport \"./fileUploader.less\";\r\n\r\nconst FileUploader = memo(props => {\r\n  const { setFiles, hideFileUploader = false } = props;\r\n  const onDrop = acceptedFiles => {\r\n    setFiles(acceptedFiles);\r\n  };\r\n  const { getRootProps, getInputProps } = useDropzone({ onDrop });\r\n\r\n  if (hideFileUploader) return null;\r\n\r\n  return (\r\n    <div className=\"file-upload\" {...getRootProps()}>\r\n      <input {...getInputProps()} />\r\n      <div className=\"file-upload-content\">\r\n        Click or drag files here to upload\r\n        <span>(limit of 10MB per file)</span>\r\n      </div>\r\n    </div>\r\n  );\r\n});\r\n\r\nFileUploader.propTypes = {\r\n  setFiles: PropTypes.func.isRequired,\r\n  hideFileUploader: PropTypes.bool\r\n};\r\n\r\nexport default FileUploader;\r\n","import React, { memo, useState, useEffect } from 'react';\r\nimport Proptypes from 'prop-types';\r\nimport FileUploader from './FileUploader';\r\nimport { CloseIcon, Modal } from '../../../Common';\r\nimport { FORM_KEYS, MAX_FILE_NUMBER } from '../../../constants';\r\n\r\nconst NON_REMOVE_FILE_INDEX = -1;\r\n\r\nconst UploadDocument = memo(props => {\r\n  const [removeIndex, setRemoveIndex] = useState(NON_REMOVE_FILE_INDEX);\r\n  const [errorText, setErrorText] = useState(undefined);\r\n  const { files, setFiles, removeFile, instruction, mandatory, onValidate } =\r\n    props;\r\n  const hideFileUploader = files.length >= MAX_FILE_NUMBER;\r\n\r\n  const resetRemoveIndex = () => {\r\n    setRemoveIndex(NON_REMOVE_FILE_INDEX);\r\n    if (mandatory && files.length === 1) {\r\n      setErrorText(`Please upload a file!`);\r\n    }\r\n  };\r\n\r\n  // eslint-disable-next-line\r\n  useEffect(() => {\r\n    if (mandatory && files.length < 1) {\r\n      onValidate(FORM_KEYS.FILES, `Please upload a file!`);\r\n    } else if (!mandatory || files.length > 0) {\r\n      onValidate(FORM_KEYS.FILES, ``);\r\n      setErrorText(undefined);\r\n    }\r\n  });\r\n\r\n  return (\r\n    <div className=\"upload-document-container\">\r\n      <h2 className=\"upload-document-title\">\r\n        {instruction}\r\n        {mandatory ? ' *' : ''}\r\n      </h2>\r\n      <FileUploader setFiles={setFiles} hideFileUploader={hideFileUploader} />\r\n      <ul className=\"upload-file-list\">\r\n        {files.map((file, index) => (\r\n          <li key={index}>\r\n            {file.name}\r\n            <CloseIcon\r\n              className=\"remove-file-icon\"\r\n              onClick={() => setRemoveIndex(index)}\r\n            />\r\n          </li>\r\n        ))}\r\n      </ul>\r\n      <Modal\r\n        open={removeIndex > -1}\r\n        message={\r\n          <>\r\n            <span className=\"remove-file-message-bold-text\">\r\n              Are you sure you want to remove{' '}\r\n            </span>\r\n            {files[removeIndex] ? files[removeIndex].name : ''}\r\n          </>\r\n        }\r\n        onConfirm={() => {\r\n          removeFile(removeIndex);\r\n          resetRemoveIndex();\r\n        }}\r\n        onClose={() => {\r\n          resetRemoveIndex();\r\n        }}\r\n      />\r\n      {errorText ? (\r\n        <div className=\"file-upload-error\">\r\n          <CloseIcon /> {errorText}\r\n        </div>\r\n      ) : (\r\n        ``\r\n      )}\r\n      {mandatory ? (\r\n        <div className=\"details-form-item-hint-text\">\r\n          * File upload is mandatory\r\n        </div>\r\n      ) : (\r\n        ``\r\n      )}\r\n    </div>\r\n  );\r\n});\r\n\r\nUploadDocument.proptypes = {\r\n  files: Proptypes.array.isRequired,\r\n  setFiles: Proptypes.func.isRequired,\r\n  removeFile: Proptypes.func.isRequired,\r\n  instruction: Proptypes.string,\r\n  mandatory: Proptypes.boolean,\r\n  onValidate: Proptypes.func.isRequired\r\n};\r\n\r\nexport default UploadDocument;\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { useHover } from \"../../../hooks\";\r\nimport { colorStyle } from \"../../../styles\";\r\n\r\nconst IntakeForm = memo(props => {\r\n  const { downloadDocumentInstruction, files, downloadFile } = props;\r\n  return (\r\n    <div className=\"details-form-item\">\r\n      <h2 className=\"details-form-item-title\">Download Forms</h2>\r\n      <span className=\"details-form-item-text\">\r\n        {downloadDocumentInstruction}\r\n      </span>\r\n      <div className=\"intake-form-list\">\r\n        {files.map((file, index) => (\r\n          <DownloadFileItem\r\n            key={index}\r\n            onClick={() => {\r\n              downloadFile(file.fileName);\r\n            }}\r\n            fileName={file.fileName}\r\n          />\r\n        ))}\r\n      </div>\r\n    </div>\r\n  );\r\n});\r\n\r\nconst DownloadFileItem = memo(props => {\r\n  const [hoverRef, isHovered] = useHover();\r\n  const { onClick, fileName } = props;\r\n  return (\r\n    <div\r\n      ref={hoverRef}\r\n      className=\"intake-form-list-item\"\r\n      onClick={onClick}\r\n      style={isHovered ? colorStyle : null}\r\n    >\r\n      {fileName}\r\n    </div>\r\n  );\r\n});\r\n\r\nDownloadFileItem.propTypes = {\r\n  fileName: PropTypes.string.isRequired,\r\n  onClick: PropTypes.func\r\n};\r\n\r\nIntakeForm.propTypes = {\r\n  downloadDocumentInstruction: PropTypes.string,\r\n  files: PropTypes.array\r\n};\r\n\r\nexport default IntakeForm;\r\n","import React, { memo } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst ConfirmationPolicy = memo(({ customerConfirmationPolicy }) => {\r\n  return (\r\n    <div className=\"details-form-item\">\r\n      <h2 className=\"details-form-item-title\">Confirmation Policy</h2>\r\n      <span className=\"details-form-item-text\">\r\n        {customerConfirmationPolicy}\r\n      </span>\r\n    </div>\r\n  );\r\n});\r\n\r\nConfirmationPolicy.propTypes = {\r\n  customerConfirmationPolicy: PropTypes.string\r\n};\r\n\r\nConfirmationPolicy.defaultProps = {\r\n  customerConfirmationPolicy: ''\r\n};\r\n\r\nexport default ConfirmationPolicy;\r\n","import React, { memo, useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport MaskedInput from 'react-text-mask';\r\nimport { InputBox, ExpiryMonth } from '../../../Common';\r\nimport { FORM_KEYS } from '../../../constants';\r\n\r\nconst MedicareInformation = memo(props => {\r\n  const {\r\n    number,\r\n    numberError,\r\n    expiryDate,\r\n    expiryDateError,\r\n    onChange,\r\n    onValidate\r\n  } = props;\r\n\r\n  const handleNumberChange = useCallback(\r\n    val => {\r\n      onChange(FORM_KEYS.MEDICARE_NUMBER, val);\r\n      onValidate(FORM_KEYS.MEDICARE_NUMBER, val);\r\n    },\r\n    [onChange, onValidate]\r\n  );\r\n\r\n  const handleExpiryChange = useCallback(\r\n    val => {\r\n      onChange(FORM_KEYS.MEDICARE_EXPIRY, val);\r\n      onValidate(FORM_KEYS.MEDICARE_EXPIRY, val);\r\n    },\r\n    [onChange, onValidate]\r\n  );\r\n\r\n  const handleBlur = useCallback(() => {\r\n    onValidate(FORM_KEYS.MEDICARE_NUMBER, number);\r\n  }, [onValidate, number]);\r\n\r\n  const handleCloseExpiry = useCallback(() => {\r\n    onValidate(FORM_KEYS.MEDICARE_EXPIRY, expiryDate);\r\n  }, [onValidate, expiryDate]);\r\n\r\n  return (\r\n    <div className=\"contact-form-additional narrow-row\">\r\n      <h1 className=\"contact-form-additional__title\">Medicare Information</h1>\r\n      <Grid container spacing={2} className=\"details-form-item\">\r\n        <Grid item xs={8}>\r\n          <InputBox\r\n            label=\"Medicare Card No\"\r\n            errorText={numberError}\r\n            value={number || ''}\r\n            onChange={handleNumberChange}\r\n            onBlur={handleBlur}\r\n            InputProps={{\r\n              inputComponent: MedicareMaskedInput,\r\n              autoComplete: 'new-password'\r\n            }}\r\n            className=\"medicare-number-input\"\r\n          />\r\n        </Grid>\r\n        <Grid item xs={4}>\r\n          <ExpiryMonth\r\n            label=\"Expiry\"\r\n            value={expiryDate}\r\n            errorText={expiryDateError}\r\n            onChange={handleExpiryChange}\r\n            onClose={handleCloseExpiry}\r\n          />\r\n        </Grid>\r\n      </Grid>\r\n    </div>\r\n  );\r\n});\r\n\r\nMedicareInformation.propTypes = {\r\n  number: PropTypes.string,\r\n  numberError: PropTypes.string,\r\n  expiryDate: PropTypes.string,\r\n  expiryDateError: PropTypes.string,\r\n  onChange: PropTypes.func.isRequired,\r\n  onValidate: PropTypes.func.isRequired\r\n};\r\n\r\nconst MedicareMaskedInput = memo(props => {\r\n  const { inputRef, ...restProps } = props;\r\n  return (\r\n    <MaskedInput\r\n      {...restProps}\r\n      ref={ref => {\r\n        inputRef(ref ? ref.inputElement : null);\r\n      }}\r\n      mask={[\r\n        /\\d/,\r\n        /\\d/,\r\n        /\\d/,\r\n        /\\d/,\r\n        /\\d/,\r\n        /\\d/,\r\n        /\\d/,\r\n        /\\d/,\r\n        /\\d/,\r\n        /\\d/,\r\n        '/',\r\n        /\\d/\r\n      ]}\r\n    />\r\n  );\r\n});\r\n\r\nMedicareMaskedInput.propTypes = {\r\n  inputRef: PropTypes.func.isRequired\r\n};\r\n\r\nexport default MedicareInformation;\r\n","import React, { memo, useCallback, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport { ExpiryMonth, CreditCardIcon, HelpIcon } from '../../../Common';\r\nimport FormInput from './FormInput';\r\nimport { FORM_KEYS } from '../../../constants';\r\nimport { areNotAllCreditCardFieldsFilled } from '../../../helpers';\r\n\r\nconst CreditCard = memo(\r\n  ({\r\n    name,\r\n    number,\r\n    expiryDate,\r\n    securityCode,\r\n    nameError,\r\n    numberError,\r\n    expiryDateError,\r\n    securityCodeError,\r\n    onChange,\r\n    onValidate,\r\n    mandatory\r\n  }) => {\r\n    const handleExpiryChange = useCallback(\r\n      val => {\r\n        onChange(FORM_KEYS.CREDIT_CARD_EXPIRY, val);\r\n        onValidate(FORM_KEYS.CREDIT_CARD_EXPIRY, val);\r\n      },\r\n      [onChange, onValidate]\r\n    );\r\n\r\n    const handleCloseExpiry = useCallback(() => {\r\n      onValidate(FORM_KEYS.CREDIT_CARD_EXPIRY, expiryDate);\r\n    }, [onValidate, expiryDate]);\r\n\r\n    const showError = useMemo(() => {\r\n      return areNotAllCreditCardFieldsFilled(\r\n        name,\r\n        number,\r\n        expiryDate,\r\n        securityCode\r\n      );\r\n    }, [name, number, expiryDate, securityCode]);\r\n\r\n    return (\r\n      <div className=\"contact-form-additional narrow-row\">\r\n        <h1 className=\"contact-form-additional__title\">\r\n          Credit/Debit Card Details\r\n        </h1>\r\n        <Grid container spacing={2} className=\"details-form-item\">\r\n          <Grid item xs={8}>\r\n            <FormInput\r\n              formKey={FORM_KEYS.CREDIT_CARD_NUMBER}\r\n              label={`Credit/Debit Card No${mandatory ? ' *' : ''}`}\r\n              errorText={numberError}\r\n              value={number}\r\n              onChange={onChange}\r\n              onValidate={onValidate}\r\n              maxLength={16}\r\n              regexRule={/^\\d*$/}\r\n            />\r\n            <CreditCardIcon className=\"form-input-icon\" />\r\n          </Grid>\r\n          <Grid item xs={4}>\r\n            <ExpiryMonth\r\n              label={`Expiry${mandatory ? ' *' : ''}`}\r\n              value={expiryDate}\r\n              errorText={expiryDateError}\r\n              onChange={handleExpiryChange}\r\n              onClose={handleCloseExpiry}\r\n            />\r\n          </Grid>\r\n        </Grid>\r\n        <Grid container spacing={2} className=\"details-form-item\">\r\n          <Grid item xs={8}>\r\n            <FormInput\r\n              formKey={FORM_KEYS.CREDIT_CARD_NAME}\r\n              label={`Cardholder Name${mandatory ? ' *' : ''}`}\r\n              errorText={nameError}\r\n              value={name}\r\n              onChange={onChange}\r\n              onValidate={onValidate}\r\n              maxLength={100}\r\n            />\r\n          </Grid>\r\n          <Grid item xs={4} className=\"credit-card-security-code\">\r\n            <FormInput\r\n              formKey={FORM_KEYS.CREDIT_CARD_SECURITY_CODE}\r\n              label={`Security Code${mandatory ? ' *' : ''}`}\r\n              errorText={securityCodeError}\r\n              value={securityCode}\r\n              onChange={onChange}\r\n              onValidate={onValidate}\r\n              regexRule={/^\\d*$/}\r\n              maxLength={4}\r\n            />\r\n            <Tooltip\r\n              title=\"Mastercard or Visa: 3 digits on back of your card.\"\r\n              placement=\"right-end\"\r\n            >\r\n              <span>\r\n                <HelpIcon className=\"form-input-icon\" />\r\n              </span>\r\n            </Tooltip>\r\n          </Grid>\r\n        </Grid>\r\n        {showError && !mandatory && (\r\n          <div className=\"credit-card-error\">\r\n            * Please fill in all fields of the card details\r\n          </div>\r\n        )}\r\n      </div>\r\n    );\r\n  }\r\n);\r\n\r\nCreditCard.propTypes = {\r\n  name: PropTypes.string,\r\n  number: PropTypes.string,\r\n  expiryDate: PropTypes.string,\r\n  securityCode: PropTypes.string,\r\n  nameError: PropTypes.string,\r\n  numberError: PropTypes.string,\r\n  expiryDateError: PropTypes.string,\r\n  securityCodeError: PropTypes.string,\r\n  onChange: PropTypes.func.isRequired,\r\n  onValidate: PropTypes.func.isRequired,\r\n  mandatory: PropTypes.bool.isRequired\r\n};\r\n\r\nexport default CreditCard;\r\n","import React, { memo, useCallback } from \"react\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport PropTypes from \"prop-types\";\r\nimport FormInput from \"./FormInput\";\r\nimport DateOfBirth from \"./DateOfBirth\";\r\nimport Comments from \"./Comments\";\r\nimport MedibankFields from \"./MedibankFields\";\r\nimport ClientAddress from \"./ClientAddress\";\r\nimport ClientSuburb from \"./ClientSuburb\";\r\nimport ClientPostcode from \"./ClientPostcode\";\r\nimport UploadDocument from \"./UploadDocument\";\r\nimport IntakeForm from \"./IntakeForm\";\r\nimport ConfirmationPolicy from \"./ConfirmationPolicy\";\r\nimport MedicareInformation from \"./MedicareInformation\";\r\nimport CreditCard from \"./CreditCard\";\r\nimport { FORM_KEYS } from \"../../../constants\";\r\nimport {\r\n  validate,\r\n  validators,\r\n  getCommentsFieldsValidator,\r\n  getAddressFieldsValidator,\r\n  getMedicareValidator,\r\n  getCreditCardValidator,\r\n  canSaveCreditCard,\r\n} from \"../../../helpers\";\r\n\r\nexport const PersonalDetailsForm = memo((props) => {\r\n  const {\r\n    setValue,\r\n    setError,\r\n    form,\r\n    datasource,\r\n    config,\r\n    setFiles,\r\n    removeFile,\r\n    downloadFile,\r\n  } = props;\r\n\r\n  const {\r\n    [FORM_KEYS.FIRST_NAME]: firstNameValue,\r\n    [FORM_KEYS.MIDDLE_NAME]: middleNameValue,\r\n    [FORM_KEYS.PREFERRED_NAME]: preferredNameValue,\r\n    [FORM_KEYS.LAST_NAME]: lastNameValue,\r\n    [FORM_KEYS.DATE_OF_BIRTH]: birthdayValue,\r\n    [FORM_KEYS.MOBILE]: mobileValue,\r\n    [FORM_KEYS.EMAIL]: emailValue,\r\n    [FORM_KEYS.COMMENTS]: commentsValue,\r\n    [FORM_KEYS.CLIENT_ADDRESS]: clientAddressValue,\r\n    [FORM_KEYS.CLIENT_SUBURB]: clientSuburbValue,\r\n    [FORM_KEYS.CLIENT_POSTCODE]: clientPostcodeValue,\r\n    [FORM_KEYS.MEDICARE_NUMBER]: medicareNumber,\r\n    [FORM_KEYS.MEDICARE_EXPIRY]: medicareExpiry,\r\n    [FORM_KEYS.CREDIT_CARD_NUMBER]: creditCardNumber,\r\n    [FORM_KEYS.CREDIT_CARD_EXPIRY]: creditCardExpiry,\r\n    [FORM_KEYS.CREDIT_CARD_NAME]: creditCardName,\r\n    [FORM_KEYS.CREDIT_CARD_SECURITY_CODE]: creditCardSecurityCode,\r\n    [FORM_KEYS.HEALTH_FUND]: healthFundValue,\r\n    [FORM_KEYS.CARD_NUMBER]: cardNumberValue,\r\n    [FORM_KEYS.CARD_POSITION]: cardPositionValue,\r\n    [FORM_KEYS.CUSTOM_FIELDS]: customFieldsValue,\r\n    [FORM_KEYS.FILES]: files,\r\n    errors,\r\n  } = form;\r\n  const {\r\n    mobileHintDescription,\r\n    customerConfirmationPolicy,\r\n    tenant,\r\n    MedibankFundId,\r\n    isCommentsEnabled,\r\n    isCommentsMandatory,\r\n    isClientAddressMandatory,\r\n    isClientAddressEnabled,\r\n    isMedicareEnabled,\r\n    isUploadDocumentEnabled,\r\n    isUploadDocumentMandatory,\r\n    uploadDocumentInstruction,\r\n    isDownloadDocumentAllowed,\r\n    downloadDocumentInstruction,\r\n    isCreditCardMandatory,\r\n  } = config;\r\n  const { healthFunds, customFields, intakeFormFiles } = datasource;\r\n\r\n  const showCreditCard = canSaveCreditCard({ config, datasource });\r\n\r\n  const handleValidation = useCallback(\r\n    (key, value) => {\r\n      const errorText = validate(validators[key], value);\r\n      const currentError = errors[key];\r\n      if (errorText !== currentError) {\r\n        setError(key, errorText);\r\n      }\r\n    },\r\n    [setError, errors]\r\n  );\r\n\r\n  const handleSetAddressValue = (addressKey, value) => {\r\n    // clientAddress\r\n    setValue(addressKey, value);\r\n    if (!value) {\r\n      setValue(FORM_KEYS.CLIENT_SUBURB, \"\");\r\n      setValue(FORM_KEYS.CLIENT_POSTCODE, \"\");\r\n      errors[FORM_KEYS.CLIENT_SUBURB] && setError(FORM_KEYS.CLIENT_SUBURB, \"\");\r\n      errors[FORM_KEYS.CLIENT_POSTCODE] &&\r\n        setError(FORM_KEYS.CLIENT_POSTCODE, \"\");\r\n    }\r\n  };\r\n\r\n  const handleCommentsFieldsValidation = (key, value) => {\r\n    const errorText = validate(\r\n      getCommentsFieldsValidator(isCommentsMandatory),\r\n      value\r\n    );\r\n    const currentError = errors[key];\r\n    if (errorText !== currentError) {\r\n      setError(key, errorText);\r\n    }\r\n  };\r\n\r\n  const handleAddressFieldsValidation = (key, value) => {\r\n    const errorText = validate(\r\n      getAddressFieldsValidator(\r\n        key,\r\n        clientAddressValue,\r\n        isClientAddressMandatory\r\n      ),\r\n      value\r\n    );\r\n    const currentError = errors[key];\r\n    if (errorText !== currentError) {\r\n      setError(key, errorText);\r\n    }\r\n  };\r\n\r\n  const handleMedicareValidation = (key, value) => {\r\n    const primaryKey = key;\r\n    const secondaryKey =\r\n      key === FORM_KEYS.MEDICARE_NUMBER\r\n        ? FORM_KEYS.MEDICARE_EXPIRY\r\n        : FORM_KEYS.MEDICARE_NUMBER;\r\n    const primaryValue = value;\r\n    const secondaryValue = form[secondaryKey];\r\n\r\n    const primaryError = validate(\r\n      getMedicareValidator(primaryKey, {\r\n        [primaryKey]: primaryValue,\r\n        [secondaryKey]: secondaryValue,\r\n      }),\r\n      primaryValue\r\n    );\r\n    const currentPrimaryError = errors[primaryKey];\r\n    if (primaryError !== currentPrimaryError) {\r\n      setError(primaryKey, primaryError);\r\n    }\r\n\r\n    if (!primaryError) {\r\n      const secondError = validate(\r\n        getMedicareValidator(secondaryKey, {\r\n          [primaryKey]: primaryValue,\r\n          [secondaryKey]: secondaryValue,\r\n        }),\r\n        secondaryValue\r\n      );\r\n\r\n      const currentSecondaryError = errors[secondaryKey];\r\n      if (secondError !== currentSecondaryError) {\r\n        setError(secondaryKey, secondError);\r\n      }\r\n    }\r\n  };\r\n\r\n  const handleCreditCardValidation = (key, value) => {\r\n    const errorText = validate(\r\n      getCreditCardValidator(key, isCreditCardMandatory),\r\n      value\r\n    );\r\n    const currentError = errors[key];\r\n    if (errorText !== currentError) {\r\n      setError(key, errorText);\r\n    }\r\n  };\r\n\r\n  const handleMandatoryDocumentValidation = (key, value) => {\r\n    const currentError = errors[key];\r\n    const errorText =\r\n      isUploadDocumentEnabled && isUploadDocumentMandatory ? value : \"\";\r\n\r\n    if (errorText !== currentError) {\r\n      setError(key, errorText);\r\n    }\r\n  };\r\n\r\n  return (\r\n    <div className=\"details-form-container\">\r\n      <div className=\"details-form-item\">\r\n        <FormInput\r\n          formKey={FORM_KEYS.FIRST_NAME}\r\n          label=\"First Name *\"\r\n          value={firstNameValue}\r\n          errorText={errors[FORM_KEYS.FIRST_NAME]}\r\n          onChange={setValue}\r\n          onValidate={handleValidation}\r\n          maxLength={50}\r\n        />\r\n      </div>\r\n      <div className=\"details-form-item\">\r\n        <FormInput\r\n          formKey={FORM_KEYS.MIDDLE_NAME}\r\n          label=\"Middle Name\"\r\n          value={middleNameValue}\r\n          errorText={errors[FORM_KEYS.MIDDLE_NAME]}\r\n          onChange={setValue}\r\n          onValidate={handleValidation}\r\n          maxLength={50}\r\n        />\r\n      </div>\r\n      <div className=\"details-form-item\">\r\n        <FormInput\r\n          formKey={FORM_KEYS.LAST_NAME}\r\n          label=\"Last Name *\"\r\n          value={lastNameValue}\r\n          errorText={errors[FORM_KEYS.LAST_NAME]}\r\n          onChange={setValue}\r\n          onValidate={handleValidation}\r\n          maxLength={50}\r\n        />\r\n      </div>\r\n      <div className=\"details-form-item\">\r\n        <FormInput\r\n          formKey={FORM_KEYS.PREFERRED_NAME}\r\n          label=\"Preferred Name\"\r\n          value={preferredNameValue}\r\n          errorText={errors[FORM_KEYS.PREFERRED_NAME]}\r\n          onChange={setValue}\r\n          onValidate={handleValidation}\r\n          maxLength={50}\r\n        />\r\n      </div>\r\n      <div className=\"details-form-item date-of-birth\">\r\n        <DateOfBirth\r\n          formKey={FORM_KEYS.DATE_OF_BIRTH}\r\n          value={birthdayValue}\r\n          errorText={errors[FORM_KEYS.DATE_OF_BIRTH]}\r\n          onChange={setValue}\r\n          onValidate={handleValidation}\r\n        />\r\n      </div>\r\n      <div className=\"details-form-item\">\r\n        <FormInput\r\n          formKey={FORM_KEYS.EMAIL}\r\n          label=\"Your email *\"\r\n          value={emailValue}\r\n          errorText={errors[FORM_KEYS.EMAIL]}\r\n          onChange={setValue}\r\n          onValidate={handleValidation}\r\n        />\r\n        <span\r\n          className={`details-form-item-hint-text ${\r\n            errors[FORM_KEYS.EMAIL] ? \"hasError\" : \"\"\r\n          }`}\r\n        >\r\n          * we will send you a booking confirmation to your email address\r\n          provided\r\n        </span>\r\n      </div>\r\n      <div className=\"details-form-item\">\r\n        <FormInput\r\n          formKey={FORM_KEYS.MOBILE}\r\n          label=\"Your mobile number *\"\r\n          value={mobileValue}\r\n          errorText={errors[FORM_KEYS.MOBILE]}\r\n          onChange={setValue}\r\n          onValidate={handleValidation}\r\n        />\r\n        <span\r\n          className={`details-form-item-hint-text ${\r\n            errors[FORM_KEYS.MOBILE] ? \"hasError\" : \"\"\r\n          }`}\r\n        >\r\n          {mobileHintDescription}\r\n        </span>\r\n      </div>\r\n\r\n      <MedibankFields\r\n        tenant={tenant}\r\n        MedibankFundId={MedibankFundId}\r\n        healthFundValue={healthFundValue}\r\n        healthFunds={healthFunds}\r\n        cardNumberValue={cardNumberValue}\r\n        cardPositionValue={cardPositionValue}\r\n        customFieldsValue={customFieldsValue}\r\n        customFields={customFields}\r\n        setValue={setValue}\r\n        onValidate={handleValidation}\r\n      />\r\n\r\n      {isClientAddressEnabled && (\r\n        <Grid container spacing={2} className=\"details-form-item\">\r\n          <Grid item xs={12}>\r\n            <ClientAddress\r\n              value={clientAddressValue}\r\n              errorText={errors[FORM_KEYS.CLIENT_ADDRESS]}\r\n              onChange={handleSetAddressValue}\r\n              onValidate={handleAddressFieldsValidation}\r\n              mandatory={isClientAddressMandatory}\r\n            />\r\n          </Grid>\r\n          <Grid item xs={8}>\r\n            <ClientSuburb\r\n              value={clientSuburbValue}\r\n              onChange={setValue}\r\n              onValidate={handleAddressFieldsValidation}\r\n              mandatory={isClientAddressMandatory || !!clientAddressValue}\r\n              disabled={!clientAddressValue}\r\n              errorText={errors[FORM_KEYS.CLIENT_SUBURB]}\r\n            />\r\n          </Grid>\r\n          <Grid item xs={4}>\r\n            <ClientPostcode\r\n              value={clientPostcodeValue}\r\n              onChange={setValue}\r\n              onValidate={handleAddressFieldsValidation}\r\n              mandatory={isClientAddressMandatory || !!clientAddressValue}\r\n              disabled={!clientAddressValue}\r\n              errorText={errors[FORM_KEYS.CLIENT_POSTCODE]}\r\n            />\r\n          </Grid>\r\n        </Grid>\r\n      )}\r\n\r\n      {isCommentsEnabled && (\r\n        <Comments\r\n          value={commentsValue}\r\n          errorText={errors[FORM_KEYS.COMMENTS]}\r\n          onChange={setValue}\r\n          onValidate={handleCommentsFieldsValidation}\r\n          mandatory={isCommentsMandatory}\r\n        />\r\n      )}\r\n\r\n      {isMedicareEnabled && (\r\n        <MedicareInformation\r\n          number={medicareNumber}\r\n          numberError={errors[FORM_KEYS.MEDICARE_NUMBER]}\r\n          expiryDate={medicareExpiry}\r\n          expiryDateError={errors[FORM_KEYS.MEDICARE_EXPIRY]}\r\n          onChange={setValue}\r\n          onValidate={handleMedicareValidation}\r\n        />\r\n      )}\r\n\r\n      {showCreditCard && (\r\n        <CreditCard\r\n          name={creditCardName}\r\n          number={creditCardNumber}\r\n          expiryDate={creditCardExpiry}\r\n          securityCode={creditCardSecurityCode}\r\n          nameError={errors[FORM_KEYS.CREDIT_CARD_NAME]}\r\n          numberError={errors[FORM_KEYS.CREDIT_CARD_NUMBER]}\r\n          expiryDateError={errors[FORM_KEYS.CREDIT_CARD_EXPIRY]}\r\n          securityCodeError={errors[FORM_KEYS.CREDIT_CARD_SECURITY_CODE]}\r\n          onChange={setValue}\r\n          onValidate={handleCreditCardValidation}\r\n          mandatory={isCreditCardMandatory}\r\n        />\r\n      )}\r\n\r\n      {isUploadDocumentEnabled && (\r\n        <UploadDocument\r\n          files={files}\r\n          instruction={uploadDocumentInstruction}\r\n          setFiles={setFiles}\r\n          removeFile={removeFile}\r\n          mandatory={isUploadDocumentMandatory}\r\n          onValidate={handleMandatoryDocumentValidation}\r\n        />\r\n      )}\r\n\r\n      {isDownloadDocumentAllowed && (\r\n        <IntakeForm\r\n          downloadDocumentInstruction={downloadDocumentInstruction}\r\n          files={intakeFormFiles}\r\n          downloadFile={downloadFile}\r\n        />\r\n      )}\r\n\r\n      <ConfirmationPolicy\r\n        customerConfirmationPolicy={customerConfirmationPolicy}\r\n      />\r\n    </div>\r\n  );\r\n});\r\n\r\nPersonalDetailsForm.propTypes = {\r\n  setValue: PropTypes.func.isRequired,\r\n  setError: PropTypes.func.isRequired,\r\n  form: PropTypes.object.isRequired,\r\n  config: PropTypes.object.isRequired,\r\n  datasource: PropTypes.object.isRequired,\r\n};\r\n","import React, { memo, useMemo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { MaterialUIIcon, EditIcon } from \"../../../Common/Icon\";\r\nimport { colorStyle } from \"../../../styles\";\r\nimport { useHover } from \"../../../hooks\";\r\n\r\nexport const SummaryListItem = memo(props => {\r\n  const [hoverRef, isHovered] = useHover();\r\n  const { text, iconKey, stepKey, onClick, notClickable } = props;\r\n  const renderIcon = useMemo(() => {\r\n    return !notClickable && isHovered ? (\r\n      <EditIcon style={colorStyle} />\r\n    ) : (\r\n      <MaterialUIIcon iconKey={iconKey} style={colorStyle} />\r\n    );\r\n  }, [isHovered, iconKey, notClickable]);\r\n\r\n  const color = useMemo(() => {\r\n    return !notClickable && isHovered ? colorStyle : null;\r\n  }, [isHovered, notClickable]);\r\n  return (\r\n    <span\r\n      className=\"summary-list-item\"\r\n      ref={hoverRef}\r\n      style={color}\r\n      onClick={() => onClick(stepKey)}\r\n    >\r\n      {renderIcon}\r\n      {text}\r\n    </span>\r\n  );\r\n});\r\n\r\nSummaryListItem.propTypes = {\r\n  text: PropTypes.string,\r\n  iconKey: PropTypes.string,\r\n  stepKey: PropTypes.string.isRequired,\r\n  onClick: PropTypes.func.isRequired,\r\n  notClickable: PropTypes.bool\r\n};\r\n","import React, { memo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { FullWidthButton, GoogleMap } from '../../../Common';\r\nimport { SummaryListItem } from './SummaryListItem';\r\n\r\nexport const SummaryDesktop = memo(props => {\r\n  const {\r\n    links,\r\n    position,\r\n    onClickLink,\r\n    onClickButton,\r\n    notClickable,\r\n    hidingLocationEnabled\r\n  } = props;\r\n  return (\r\n    <div className=\"appointment-summary-desktop\">\r\n      <h1 className=\"appointment-summary-desktop-title\">My appointment</h1>\r\n      <ul className=\"appointment-summary-desktop-list\">\r\n        {links.map(link => {\r\n          const { hidden, stepKey, text, iconKey } = link;\r\n          if (hidden) return null;\r\n          return (\r\n            <li key={stepKey}>\r\n              <SummaryListItem\r\n                stepKey={stepKey}\r\n                text={text}\r\n                iconKey={iconKey}\r\n                onClick={onClickLink}\r\n                notClickable={notClickable}\r\n              />\r\n            </li>\r\n          );\r\n        })}\r\n      </ul>\r\n      {hidingLocationEnabled ? (\r\n        <div style={{ marginBottom: '30px' }} />\r\n      ) : (\r\n        <div\r\n          className=\"appointment-summary-desktop-map\"\r\n          style={notClickable ? { marginBottom: 0 } : null}\r\n        >\r\n          <GoogleMap zoom={15} position={position} preventTouch={true} />\r\n        </div>\r\n      )}\r\n      {!notClickable && (\r\n        <FullWidthButton\r\n          className=\"appointment-summary-desktop-button\"\r\n          label=\"Edit my appointment\"\r\n          onClick={onClickButton}\r\n        />\r\n      )}\r\n    </div>\r\n  );\r\n});\r\n\r\nSummaryDesktop.propTypes = {\r\n  links: PropTypes.array.isRequired,\r\n  position: PropTypes.shape({\r\n    lat: PropTypes.number.isRequired,\r\n    lng: PropTypes.number.isRequired\r\n  }),\r\n  onClickLink: PropTypes.func.isRequired,\r\n  onClickButton: PropTypes.func.isRequired,\r\n  notClickable: PropTypes.bool,\r\n  hidingLocationEnabled: PropTypes.bool\r\n};\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { SummaryListItem } from \"./SummaryListItem\";\r\n\r\nexport const SummaryMobile = memo(props => {\r\n  const { links, onClickLink, notClickable } = props;\r\n  return (\r\n    <div className=\"appointment-summary-mobile\">\r\n      <h1 className=\"appointment-summary-mobile-title\">My appointment</h1>\r\n      <ul className=\"appointment-summary-mobile-list\">\r\n        {links.map(link => {\r\n          const { hidden, stepKey, text, iconKey } = link;\r\n          if (hidden) return null;\r\n          return (\r\n            <li key={stepKey}>\r\n              <SummaryListItem\r\n                stepKey={stepKey}\r\n                text={text}\r\n                iconKey={iconKey}\r\n                onClick={onClickLink}\r\n                notClickable={notClickable}\r\n              />\r\n            </li>\r\n          );\r\n        })}\r\n      </ul>\r\n    </div>\r\n  );\r\n});\r\n\r\nSummaryMobile.propTypes = {\r\n  links: PropTypes.array.isRequired,\r\n  onClickLink: PropTypes.func.isRequired,\r\n  notClickable: PropTypes.bool\r\n};\r\n","import React, { memo, useMemo, useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { SummaryDesktop } from './SummaryDesktop';\r\nimport { SummaryMobile } from './SummaryMobile';\r\nimport {\r\n  getSpecialtyTypeAppointmentType,\r\n  getLocationTextAndPosition,\r\n  getPractitionerText,\r\n  getAppointmentDateTimeText,\r\n  getHidePractitioner,\r\n  getHideSpecialty\r\n} from '../../../helpers';\r\nimport { STEP_KEYS } from '../../../constants';\r\nimport { useCheckMobile } from '../../../hooks';\r\n\r\nexport const AppointmentSummary = memo(props => {\r\n  const isMobile = useCheckMobile();\r\n  const {\r\n    appointment,\r\n    config,\r\n    datasource,\r\n    waitingList,\r\n    onClickAppointmentLink,\r\n    onClickAppointmentButton,\r\n    notClickable = false\r\n  } = props;\r\n\r\n  const {\r\n    [STEP_KEYS.SPECIALTY_TYPE]: specialtyTypeValue,\r\n    [STEP_KEYS.APPOINTMENT_TYPE]: appointmentTypeValue,\r\n    [STEP_KEYS.PRACTITIONER]: practitionerValue,\r\n    [STEP_KEYS.LOCATION]: locationValue,\r\n    [STEP_KEYS.APPOINTMENT_DATE_TIME]: appointmentDateTimeValue\r\n  } = appointment;\r\n  const { locations, practitioners, specialtyTypes, positions } = datasource;\r\n  const { specialtyTypeText, appointmentTypeText } = useMemo(\r\n    () =>\r\n      getSpecialtyTypeAppointmentType(\r\n        specialtyTypes,\r\n        specialtyTypeValue,\r\n        appointmentTypeValue\r\n      ),\r\n    [specialtyTypes, specialtyTypeValue, appointmentTypeValue]\r\n  );\r\n  const practitionerText = useMemo(\r\n    () => getPractitionerText(practitioners, practitionerValue),\r\n    [practitioners, practitionerValue]\r\n  );\r\n  const { locationText, position } = useMemo(\r\n    () => getLocationTextAndPosition(locations, positions, locationValue),\r\n    [locations, positions, locationValue]\r\n  );\r\n  const appointmentDateTimeText = useMemo(\r\n    () =>\r\n      getAppointmentDateTimeText(\r\n        appointmentDateTimeValue,\r\n        waitingList.required,\r\n        waitingList.preferredTime\r\n      ),\r\n    [appointmentDateTimeValue, waitingList]\r\n  );\r\n  const hideSpecialty = useMemo(() => getHideSpecialty(config), [config]);\r\n  const hidePractitioner = useMemo(() => getHidePractitioner(config), [config]);\r\n  const links = [\r\n    {\r\n      stepKey: STEP_KEYS.SPECIALTY_TYPE,\r\n      text: specialtyTypeText\r\n        ? `${specialtyTypeText} ${appointmentTypeText}`\r\n        : appointmentTypeText,\r\n      iconKey: 'local_hospital',\r\n      hidden: hideSpecialty\r\n    },\r\n    {\r\n      stepKey: STEP_KEYS.PRACTITIONER,\r\n      text: practitionerText,\r\n      iconKey: 'account_box',\r\n      hidden: hidePractitioner\r\n    },\r\n    {\r\n      stepKey: STEP_KEYS.LOCATION,\r\n      text: locationText,\r\n      iconKey: 'room',\r\n      hidden: config.isHidingLocationEnabled\r\n    },\r\n    {\r\n      stepKey: STEP_KEYS.APPOINTMENT_DATE_TIME,\r\n      text: appointmentDateTimeText,\r\n      iconKey: 'date_range',\r\n      hidden: false\r\n    }\r\n  ];\r\n\r\n  const onClickLink = useCallback(\r\n    stepKey => {\r\n      !notClickable && onClickAppointmentLink(stepKey);\r\n    },\r\n    [onClickAppointmentLink, notClickable]\r\n  );\r\n\r\n  if (isMobile) {\r\n    return (\r\n      <SummaryMobile\r\n        links={links}\r\n        onClickLink={onClickLink}\r\n        notClickable={notClickable}\r\n      />\r\n    );\r\n  }\r\n  return (\r\n    <SummaryDesktop\r\n      links={links}\r\n      position={position}\r\n      onClickLink={onClickLink}\r\n      onClickButton={onClickAppointmentButton}\r\n      notClickable={notClickable}\r\n      hidingLocationEnabled={config.isHidingLocationEnabled}\r\n    />\r\n  );\r\n});\r\n\r\nAppointmentSummary.propTypes = {\r\n  appointment: PropTypes.object.isRequired,\r\n  config: PropTypes.object.isRequired,\r\n  datasource: PropTypes.object.isRequired,\r\n  onClickAppointmentLink: PropTypes.func.isRequired,\r\n  onClickAppointmentButton: PropTypes.func.isRequired,\r\n  notClickable: PropTypes.bool\r\n};\r\n","import { FORM_KEYS } from \"../../constants\";\r\nexport const MANDATORY_LIST = [\r\n  FORM_KEYS.FIRST_NAME,\r\n  FORM_KEYS.LAST_NAME,\r\n  FORM_KEYS.DATE_OF_BIRTH,\r\n  FORM_KEYS.MOBILE,\r\n  FORM_KEYS.EMAIL\r\n];\r\n","import React, { useMemo, useCallback } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport {\r\n  PersonalDetailsForm,\r\n  AppointmentSummary,\r\n  VerificationDrawer\r\n} from './components';\r\nimport { MountedAnimationWrapper } from '../AnimationWrapper';\r\nimport { StepText, TransparentButton, BackTopButton } from '../Common';\r\nimport {\r\n  setFormValueByKey,\r\n  setFormErrorTextByKey,\r\n  setVerifyDrawerOpen,\r\n  submitBooking,\r\n  sendingVerificationCode,\r\n  verifyCode,\r\n  onClickPlaceBooking,\r\n  goToPage,\r\n  goToNextStep,\r\n  toggleVisibility,\r\n  setFiles,\r\n  removeFile,\r\n  downloadFile\r\n} from '../actions';\r\nimport { PAGE_KEYS, FORM_KEYS } from '../constants';\r\nimport { MANDATORY_LIST } from './consts';\r\nimport {\r\n  validate,\r\n  validators,\r\n  getCommentsFieldsValidator,\r\n  getAddressFieldsValidator,\r\n  getCreditCardValidator,\r\n  canSaveCreditCard,\r\n  getMedicareValidator,\r\n  areMedicareInfoValid,\r\n  areNotAllCreditCardFieldsFilled\r\n} from '../helpers';\r\nimport './contactForm.less';\r\n\r\nexport const ContactForm = props => {\r\n  const {\r\n    form,\r\n    config,\r\n    appointment,\r\n    datasource,\r\n    waitingList,\r\n    steps,\r\n    setFormValueByKey,\r\n    setFormErrorTextByKey,\r\n    setVerifyDrawerOpen,\r\n    submitBooking,\r\n    sendingVerificationCode,\r\n    verifyCode,\r\n    onClickPlaceBooking,\r\n    goToPage,\r\n    goToNextStep,\r\n    toggleVisibility,\r\n    setFiles,\r\n    removeFile,\r\n    downloadFile\r\n  } = props;\r\n\r\n  const {\r\n    isCommentsEnabled,\r\n    isCommentsMandatory,\r\n    isClientAddressEnabled,\r\n    isClientAddressMandatory,\r\n    isMedicareEnabled,\r\n    isCreditCardMandatory\r\n  } = config;\r\n\r\n  const {\r\n    [FORM_KEYS.CLIENT_ADDRESS]: clientAddressValue,\r\n    [FORM_KEYS.MEDICARE_NUMBER]: medicareNumberValue,\r\n    [FORM_KEYS.MEDICARE_EXPIRY]: medicareExpiryValue,\r\n    [FORM_KEYS.CREDIT_CARD_NUMBER]: creditCardNumber,\r\n    [FORM_KEYS.CREDIT_CARD_EXPIRY]: creditCardExpiry,\r\n    [FORM_KEYS.CREDIT_CARD_NAME]: creditCardName,\r\n    [FORM_KEYS.CREDIT_CARD_SECURITY_CODE]: creditCardSecurityCode\r\n  } = form;\r\n\r\n  const shouldFillingMedicareInfo = useMemo(() => {\r\n    return (\r\n      isMedicareEnabled &&\r\n      !areMedicareInfoValid(medicareNumberValue, medicareExpiryValue)\r\n    );\r\n  }, [medicareNumberValue, medicareExpiryValue, isMedicareEnabled]);\r\n\r\n  const showCreditCard = canSaveCreditCard({ config, datasource });\r\n\r\n  const showFillingCreditCardInfo = useMemo(() => {\r\n    return (\r\n      showCreditCard &&\r\n      areNotAllCreditCardFieldsFilled(\r\n        creditCardNumber,\r\n        creditCardExpiry,\r\n        creditCardName,\r\n        creditCardSecurityCode\r\n      )\r\n    );\r\n  }, [\r\n    creditCardNumber,\r\n    creditCardExpiry,\r\n    creditCardName,\r\n    creditCardSecurityCode,\r\n    showCreditCard\r\n  ]);\r\n\r\n  const customMandatoryList = useMemo(() => {\r\n    let mandatoryList = [];\r\n    if (isCommentsEnabled && isCommentsMandatory) {\r\n      mandatoryList = [...mandatoryList, FORM_KEYS.COMMENTS];\r\n    }\r\n    if (isClientAddressEnabled) {\r\n      if (isClientAddressMandatory) {\r\n        mandatoryList = [\r\n          ...mandatoryList,\r\n          FORM_KEYS.CLIENT_ADDRESS,\r\n          FORM_KEYS.CLIENT_SUBURB,\r\n          FORM_KEYS.CLIENT_POSTCODE\r\n        ];\r\n      } else {\r\n        mandatoryList = clientAddressValue\r\n          ? [\r\n              ...mandatoryList,\r\n              FORM_KEYS.CLIENT_SUBURB,\r\n              FORM_KEYS.CLIENT_POSTCODE\r\n            ]\r\n          : [...mandatoryList];\r\n      }\r\n    }\r\n    if (shouldFillingMedicareInfo) {\r\n      mandatoryList = [\r\n        ...mandatoryList,\r\n        FORM_KEYS.MEDICARE_NUMBER,\r\n        FORM_KEYS.MEDICARE_EXPIRY\r\n      ];\r\n    }\r\n    if (\r\n      showCreditCard &&\r\n      (isCreditCardMandatory || showFillingCreditCardInfo)\r\n    ) {\r\n      mandatoryList = [\r\n        ...mandatoryList,\r\n        FORM_KEYS.CREDIT_CARD_NUMBER,\r\n        FORM_KEYS.CREDIT_CARD_EXPIRY,\r\n        FORM_KEYS.CREDIT_CARD_NAME,\r\n        FORM_KEYS.CREDIT_CARD_SECURITY_CODE\r\n      ];\r\n    }\r\n    return mandatoryList;\r\n  }, [\r\n    isCommentsEnabled,\r\n    isCommentsMandatory,\r\n    isClientAddressMandatory,\r\n    isClientAddressEnabled,\r\n    clientAddressValue,\r\n    shouldFillingMedicareInfo,\r\n    showCreditCard,\r\n    isCreditCardMandatory,\r\n    showFillingCreditCardInfo\r\n  ]);\r\n\r\n  const btnDisabled = useMemo(() => {\r\n    const errors = form.errors;\r\n    const errorList = Object.keys(errors).filter(key => {\r\n      return errors[key];\r\n    });\r\n    const mandatoryListCheck = MANDATORY_LIST.filter(formKey => !form[formKey]);\r\n    const customMandatoryListCheck = customMandatoryList.filter(\r\n      formKey => !form[formKey]\r\n    );\r\n    return (\r\n      errorList.length > 0 ||\r\n      mandatoryListCheck.length > 0 ||\r\n      customMandatoryListCheck.length > 0\r\n    );\r\n  }, [form, customMandatoryList]);\r\n\r\n  const handleClickAppointmentLink = useCallback(\r\n    stepKey => {\r\n      const index = steps.indexOf(stepKey);\r\n      const prevStep = index > 0 ? steps[index - 1] : null;\r\n      goToNextStep(prevStep);\r\n      setTimeout(() => toggleVisibility(stepKey, true), 500);\r\n      goToPage(PAGE_KEYS.BOOKING);\r\n    },\r\n    [goToPage, goToNextStep, toggleVisibility, steps]\r\n  );\r\n\r\n  const handleClickBack = useCallback(() => {\r\n    goToPage(PAGE_KEYS.BOOKING);\r\n  }, [goToPage]);\r\n\r\n  const handleClickBooking = useCallback(() => {\r\n    if (btnDisabled) {\r\n      const { errors } = form;\r\n      MANDATORY_LIST.forEach(formKey => {\r\n        const errorText = validate(validators[formKey], form[formKey]);\r\n        const currentError = errors[formKey];\r\n        if (errorText !== currentError) {\r\n          setFormErrorTextByKey(formKey, errorText);\r\n        }\r\n      });\r\n      customMandatoryList.forEach(formKey => {\r\n        let errorText = '';\r\n        if (formKey === FORM_KEYS.COMMENTS) {\r\n          errorText = validate(\r\n            getCommentsFieldsValidator(isCommentsMandatory),\r\n            form[formKey]\r\n          );\r\n        } else if (\r\n          [\r\n            FORM_KEYS.CLIENT_ADDRESS,\r\n            FORM_KEYS.CLIENT_SUBURB,\r\n            FORM_KEYS.CLIENT_POSTCODE\r\n          ].includes(formKey)\r\n        ) {\r\n          errorText = validate(\r\n            getAddressFieldsValidator(\r\n              formKey,\r\n              form[FORM_KEYS.CLIENT_ADDRESS],\r\n              isClientAddressMandatory\r\n            ),\r\n            form[formKey]\r\n          );\r\n        } else if (\r\n          [\r\n            FORM_KEYS.CREDIT_CARD_NUMBER,\r\n            FORM_KEYS.CREDIT_CARD_EXPIRY,\r\n            FORM_KEYS.CREDIT_CARD_NAME,\r\n            FORM_KEYS.CREDIT_CARD_SECURITY_CODE\r\n          ].includes(formKey)\r\n        ) {\r\n          errorText = validate(\r\n            getCreditCardValidator(formKey, isCreditCardMandatory),\r\n            form[formKey]\r\n          );\r\n        } else if (\r\n          [FORM_KEYS.MEDICARE_NUMBER, FORM_KEYS.MEDICARE_EXPIRY].includes(\r\n            formKey\r\n          )\r\n        ) {\r\n          errorText = validate(\r\n            getMedicareValidator(formKey, {\r\n              [FORM_KEYS.MEDICARE_NUMBER]: form[FORM_KEYS.MEDICARE_NUMBER],\r\n              [FORM_KEYS.MEDICARE_EXPIRY]: form[FORM_KEYS.MEDICARE_EXPIRY]\r\n            }),\r\n            form[formKey]\r\n          );\r\n        }\r\n\r\n        const currentError = errors[formKey];\r\n        if (errorText !== currentError) {\r\n          setFormErrorTextByKey(formKey, errorText);\r\n        }\r\n      });\r\n    } else {\r\n      onClickPlaceBooking();\r\n    }\r\n  }, [\r\n    btnDisabled,\r\n    form,\r\n    setFormErrorTextByKey,\r\n    onClickPlaceBooking,\r\n    isCommentsMandatory,\r\n    isClientAddressMandatory,\r\n    customMandatoryList,\r\n    isCreditCardMandatory\r\n  ]);\r\n\r\n  return (\r\n    <MountedAnimationWrapper animationClassName=\"contact-form-animation\">\r\n      <div className=\"contact-form-container\">\r\n        <div className=\"contact-form-summary\">\r\n          <AppointmentSummary\r\n            config={config}\r\n            appointment={appointment}\r\n            datasource={datasource}\r\n            waitingList={waitingList}\r\n            onClickAppointmentLink={handleClickAppointmentLink}\r\n            onClickAppointmentButton={handleClickBack}\r\n          />\r\n        </div>\r\n\r\n        <div className=\"contact-form-details\">\r\n          <BackTopButton onClick={handleClickBack} />\r\n          <h1 className=\"contact-form-title\">Personal Details</h1>\r\n          <div className=\"contact-form-step-text\">\r\n            <StepText step={2} />\r\n          </div>\r\n          <PersonalDetailsForm\r\n            form={form}\r\n            config={config}\r\n            datasource={datasource}\r\n            setValue={setFormValueByKey}\r\n            setError={setFormErrorTextByKey}\r\n            setFiles={setFiles}\r\n            removeFile={removeFile}\r\n            downloadFile={downloadFile}\r\n          />\r\n          <div className=\"contact-form-btn-container\">\r\n            <TransparentButton\r\n              isTheme={true}\r\n              label={waitingList.required ? 'Confirm' : 'Place booking'} // waiting list\r\n              disabled={btnDisabled}\r\n              className=\"booking-btn\"\r\n              onClick={handleClickBooking}\r\n            />\r\n            <TransparentButton\r\n              className=\"back-btn\"\r\n              onClick={handleClickBack}\r\n              label=\"Back\"\r\n            />\r\n          </div>\r\n        </div>\r\n        <VerificationDrawer\r\n          open={form.isVerifyDrawerOpen}\r\n          onToggle={setVerifyDrawerOpen}\r\n          submitBooking={submitBooking}\r\n          sendingVerificationCode={sendingVerificationCode}\r\n          verifyCode={verifyCode}\r\n          useRecaptcha={config.reCaptchaEnabled}\r\n        />\r\n      </div>\r\n    </MountedAnimationWrapper>\r\n  );\r\n};\r\n\r\nexport default connect(\r\n  state => {\r\n    return {\r\n      config: state.config,\r\n      appointment: state.appointment,\r\n      datasource: state.datasource,\r\n      form: state.form,\r\n      waitingList: state.waitingList,\r\n      steps: state.booking.steps\r\n    };\r\n  },\r\n  {\r\n    setFormValueByKey,\r\n    setFormErrorTextByKey,\r\n    setVerifyDrawerOpen,\r\n    submitBooking,\r\n    sendingVerificationCode,\r\n    verifyCode,\r\n    onClickPlaceBooking,\r\n    goToPage,\r\n    goToNextStep,\r\n    toggleVisibility,\r\n    setFiles,\r\n    removeFile,\r\n    downloadFile\r\n  }\r\n)(ContactForm);\r\n","import React, { memo } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nexport const BookingDetailsItem = memo(props => {\r\n  const { name, text } = props;\r\n  return (\r\n    <div className=\"booking-confirmation-detail\">\r\n      <p className=\"booking-confirmation-detail-name\">{name}</p>\r\n      <p className=\"booking-confirmation-detail-text\">{text}</p>\r\n    </div>\r\n  );\r\n});\r\n\r\nBookingDetailsItem.propTypes = {\r\n  name: PropTypes.string.isRequired,\r\n  text: PropTypes.string\r\n};\r\n","export const getIcsCalendar = appointment => {\r\n  const elements = [\r\n    ...[\r\n      'BEGIN:VCALENDAR',\r\n      'VERSION:2.0',\r\n      'BEGIN:VEVENT',\r\n      'CLASS:PUBLIC',\r\n      'DESCRIPTION:' + appointment.description,\r\n      'DTSTART;VALUE=DATE:' + appointment.startDateTime,\r\n      'DTEND;VALUE=DATE:' + appointment.endDateTime\r\n    ],\r\n    appointment.location ? 'LOCATION:' + appointment.location : '',\r\n    ...[\r\n      'SUMMARY;LANGUAGE=en-us:' + appointment.title,\r\n      'TRANSP:TRANSPARENT',\r\n      'END:VEVENT',\r\n      'END:VCALENDAR'\r\n    ]\r\n  ];\r\n\r\n  return elements.join('\\n');\r\n};\r\n\r\nexport const getYahooCalendarUrl = appointment => {\r\n  let yahooCalendarUrl = 'http://calendar.yahoo.com/?v=60&view=d&type=20';\r\n  yahooCalendarUrl += '&title=' + encodeURI(appointment.title);\r\n  yahooCalendarUrl +=\r\n    '&st=' +\r\n    encodeURI(appointment.startDateTime) +\r\n    '&et=' +\r\n    encodeURI(appointment.endDateTime);\r\n  yahooCalendarUrl += '&desc=' + encodeURI(appointment.description);\r\n  if (appointment.location) {\r\n    yahooCalendarUrl += '&in_loc=' + encodeURI(appointment.location);\r\n  }\r\n\r\n  return yahooCalendarUrl;\r\n};\r\n\r\nexport const getGoogleCalendarUrl = appointment => {\r\n  let googleCalendarUrl =\r\n    'https://www.google.com/calendar/render?action=TEMPLATE';\r\n  googleCalendarUrl += '&text=' + encodeURI(appointment.title);\r\n  googleCalendarUrl +=\r\n    '&dates=' +\r\n    encodeURI(appointment.startDateTime) +\r\n    '/' +\r\n    encodeURI(appointment.endDateTime);\r\n  googleCalendarUrl += '&details=' + encodeURI(appointment.description);\r\n  if (appointment.location) {\r\n    googleCalendarUrl += '&location=' + encodeURI(appointment.location);\r\n  }\r\n\r\n  return googleCalendarUrl;\r\n};\r\n\r\n// this link is not working.\r\n// export const getMicrosoftCalendarUrl = appointment => {\r\n//   var microsoftCalendarUrl =\r\n//     \"http://calendar.live.com/calendar/calendar.aspx?rru=addevent\";\r\n//   microsoftCalendarUrl += \"&summary=\" + encodeURI(appointment.title);\r\n//   microsoftCalendarUrl +=\r\n//     \"&dtstart=\" +\r\n//     encodeURI(appointment.startDateTime) +\r\n//     \"&dtend=\" +\r\n//     encodeURI(appointment.endDateTime);\r\n//   microsoftCalendarUrl += \"&description=\" + encodeURI(appointment.description);\r\n//   microsoftCalendarUrl += \"&location=\" + encodeURI(appointment.location);\r\n\r\n//   return microsoftCalendarUrl;\r\n// };\r\n\r\nexport const printConfirmation = () => {\r\n  var printContents = document.getElementById('printable').innerHTML;\r\n  var popupWin = window.open('', '_blank', 'width=790,height=770');\r\n  popupWin.document.open();\r\n  popupWin.document.write(\r\n    `<head>\r\n    <link href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500,700\" rel=\"stylesheet\" type=\"text/css\">\r\n    <style type=\"text/css\">\r\n      .booking-confirmation-container {\r\n        padding: 100px 15px;\r\n        font-size: 14px;\r\n      }\r\n      .booking-confirmation-title {\r\n        font-weight: 400;\r\n        font-size: 1.8em;\r\n        margin: 0 0 4em;\r\n        text-transform: uppercase;\r\n        line-height: 1.5em;\r\n        text-align: center;\r\n      }\r\n      .booking-confirmation-content {\r\n        display: flex;\r\n        justify-content: space-between;\r\n        width: 100%;\r\n      }\r\n      .booking-confirmation-content-item {\r\n        width: 50%;\r\n        padding: 0 15px;\r\n      }\r\n      .booking-confirmation-detail {\r\n        margin-bottom: 10px;\r\n      }\r\n      .booking-confirmation-detail-name {\r\n        font-size: 1em;\r\n        font-weight: 300;\r\n        color: #555;\r\n        line-height: 1.2em;\r\n      }\r\n      .booking-confirmation-detail-text {\r\n        font-weight: 400;\r\n        font-size: 1em;\r\n        color: #333;\r\n        line-height: 1.5em;\r\n        min-height: 1.5em;\r\n      }\r\n      .gm-bundled-control,\r\n      .gm-fullscreen-control {\r\n        display: none !important;\r\n      }\r\n      .google-map-marker-container {\r\n        width: 27px;\r\n        height: 43px;\r\n        overflow: hidden;\r\n        position: absolute;\r\n        left: -14px;\r\n        top: -43px;\r\n        z-index: 0;\r\n      }\r\n      .google-map-marker-container img {\r\n        position: absolute;\r\n        left: 0px;\r\n        top: 0px;\r\n        width: 27px;\r\n        height: 43px;\r\n        user-select: none;\r\n        border: 0px;\r\n        padding: 0px;\r\n        margin: 0px;\r\n        max-width: none;\r\n      }\r\n      .booking-confirmation-map-container {\r\n        padding: 15px;\r\n        background: #fff;\r\n\r\n      }\r\n      .google-map-container {\r\n        width: 100%;\r\n        height: 320px;\r\n        background: #aeaeae;\r\n      }\r\n    </style>\r\n    </head>\r\n    <body style=\"overflow-x:hidden;\" onload=\"setTimeout(function() {window.print();}, 500);\">\r\n    <div class=\"booking-confirmation-container\">\r\n    ${printContents}\r\n    </div>\r\n    </body>\r\n    `\r\n  );\r\n  popupWin.document.close();\r\n};\r\n","import React, { memo, useState, useEffect, useRef } from 'react';\r\nimport fileDownload from 'js-file-download';\r\nimport PropTypes from 'prop-types';\r\nimport Fade from '@material-ui/core/Fade';\r\nimport { useHover } from '../../hooks';\r\nimport { backgroundStyle } from '../../styles';\r\nimport { ThemeColorButton, ArrowDownIcon } from '../../Common';\r\nimport {\r\n  getIcsCalendar,\r\n  getGoogleCalendarUrl,\r\n  getYahooCalendarUrl\r\n} from '../helperFunctions';\r\n\r\nexport const AddToCalendar = memo(props => {\r\n  const containerRef = useRef();\r\n  const [open, setOpen] = useState(false);\r\n\r\n  useEffect(() => {\r\n    document.addEventListener('click', handleDocumentClick);\r\n    return () => {\r\n      document.removeEventListener('click', handleDocumentClick);\r\n    };\r\n  }, []);\r\n\r\n  const handleDocumentClick = e => {\r\n    const targetDom = e.target;\r\n    if (containerRef.current.contains(targetDom)) {\r\n      return;\r\n    }\r\n    setOpen(false);\r\n  };\r\n\r\n  const {\r\n    title,\r\n    description,\r\n    location,\r\n    startDateTime,\r\n    endDateTime,\r\n    isHidingLocationEnabled\r\n  } = props;\r\n\r\n  const calendarAppointment = {\r\n    title,\r\n    description,\r\n    location: isHidingLocationEnabled ? '' : location,\r\n    startDateTime,\r\n    endDateTime\r\n  };\r\n\r\n  const handleClick = () => {\r\n    setOpen(prev => !prev);\r\n  };\r\n\r\n  const handleCalendarClick = () => {\r\n    const fileName = title.replace(/[^\\w ]+/g, '') + '.ics';\r\n    fileDownload(\r\n      getIcsCalendar(calendarAppointment),\r\n      fileName,\r\n      'application/octet-stream'\r\n    );\r\n  };\r\n\r\n  const renderList = () => {\r\n    return (\r\n      <ul className=\"add-to-calendar-list\">\r\n        <li>\r\n          <SpanTagItem onClick={handleCalendarClick} label=\"iCalendar\" />\r\n        </li>\r\n        <li>\r\n          <AtagItem\r\n            href={getGoogleCalendarUrl(calendarAppointment)}\r\n            label=\"Google Calendar\"\r\n          />\r\n        </li>\r\n        <li>\r\n          <SpanTagItem onClick={handleCalendarClick} label=\"Outlook\" />\r\n        </li>\r\n        <li>\r\n          <AtagItem\r\n            href={getYahooCalendarUrl(calendarAppointment)}\r\n            label=\"Yahoo! Calendar\"\r\n          />\r\n        </li>\r\n      </ul>\r\n    );\r\n  };\r\n\r\n  return (\r\n    <div className=\"add-to-calendar\" ref={containerRef}>\r\n      <ThemeColorButton\r\n        label={\r\n          <>\r\n            Add to calendar\r\n            <ArrowDownIcon\r\n              className={`add-to-calendar-btn-icon ${open ? 'open' : ''}`}\r\n            />\r\n          </>\r\n        }\r\n        onClick={handleClick}\r\n        className=\"add-to-calendar-btn\"\r\n      />\r\n      <Fade in={open}>{renderList()}</Fade>\r\n    </div>\r\n  );\r\n});\r\n\r\nAddToCalendar.propTypes = {\r\n  title: PropTypes.string.isRequired,\r\n  description: PropTypes.string.isRequired,\r\n  location: PropTypes.string.isRequired,\r\n  startDateTime: PropTypes.string.isRequired,\r\n  endDateTime: PropTypes.string.isRequired,\r\n  isHidingLocationEnabled: PropTypes.bool.isRequired\r\n};\r\n\r\nconst defaultStyle = {\r\n  color: '#333'\r\n};\r\nconst hoverStyle = {\r\n  color: '#fff',\r\n  ...backgroundStyle\r\n};\r\n\r\nconst AtagItem = memo(props => {\r\n  const [hoverRef, isHovered] = useHover();\r\n  const { label, href } = props;\r\n  return (\r\n    <a\r\n      ref={hoverRef}\r\n      href={href}\r\n      target=\"_blank\"\r\n      rel=\"noopener noreferrer\"\r\n      style={isHovered ? hoverStyle : defaultStyle}\r\n    >\r\n      {label}\r\n    </a>\r\n  );\r\n});\r\n\r\nAtagItem.propTypes = {\r\n  label: PropTypes.string.isRequired,\r\n  href: PropTypes.string.isRequired\r\n};\r\n\r\nconst SpanTagItem = memo(props => {\r\n  const [hoverRef, isHovered] = useHover();\r\n  const { label, onClick } = props;\r\n  return (\r\n    <span\r\n      ref={hoverRef}\r\n      onClick={onClick}\r\n      style={isHovered ? hoverStyle : defaultStyle}\r\n    >\r\n      {label}\r\n    </span>\r\n  );\r\n});\r\nSpanTagItem.propTypes = {\r\n  label: PropTypes.string.isRequired,\r\n  onClick: PropTypes.func.isRequired\r\n};\r\n","import React, { useCallback } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { GoogleMap, TransparentButton } from '../Common';\r\nimport { MountedAnimationWrapper } from '../AnimationWrapper';\r\nimport { BookingDetailsItem, AddToCalendar } from './components';\r\nimport {\r\n  getSpecialtyTypeAppointmentType,\r\n  getPractitionerText,\r\n  getLocationTextAndPosition,\r\n  getAppointmentDateTimeText\r\n} from '../helpers';\r\nimport { makeNewBooking, goToPage } from '../actions';\r\nimport { PAGE_KEYS } from '../constants';\r\nimport { printConfirmation } from './helperFunctions';\r\nimport { mapDateToICalDatetimeFormat } from '../helpers';\r\nimport './confirm.less';\r\n\r\nexport const Confirm = props => {\r\n  const {\r\n    config,\r\n    appointment,\r\n    datasource,\r\n    waitingList,\r\n    makeNewBooking,\r\n    goToPage\r\n  } = props;\r\n  const { required, preferredTime } = waitingList;\r\n  const { waitingListConfirmationText, isHidingLocationEnabled } = config;\r\n  const {\r\n    specialtyType,\r\n    appointmentType,\r\n    practitioner,\r\n    location,\r\n    appointmentDateTime\r\n  } = appointment;\r\n  const { specialtyTypes, practitioners, locations, positions } = datasource;\r\n\r\n  const headerText = required\r\n    ? waitingListConfirmationText\r\n    : 'Your appointment has been booked';\r\n\r\n  const specialtyTypeAppointmentTypeText = getSpecialtyTypeAppointmentType(\r\n    specialtyTypes,\r\n    specialtyType,\r\n    appointmentType\r\n  );\r\n\r\n  const { specialtyTypeText, appointmentTypeText } =\r\n    specialtyTypeAppointmentTypeText;\r\n\r\n  const practitionerText = getPractitionerText(practitioners, practitioner);\r\n\r\n  const locationTextAndPosition = getLocationTextAndPosition(\r\n    locations,\r\n    positions,\r\n    location\r\n  );\r\n\r\n  const { locationText, position } = locationTextAndPosition;\r\n\r\n  const appointmentDateTimeText = getAppointmentDateTimeText(\r\n    appointmentDateTime,\r\n    required,\r\n    preferredTime\r\n  );\r\n\r\n  const appointmentStartTime = appointmentDateTime\r\n    ? mapDateToICalDatetimeFormat(appointmentDateTime.startDateTime)\r\n    : '';\r\n  const appointmentEndTime = appointmentDateTime\r\n    ? mapDateToICalDatetimeFormat(appointmentDateTime.endDateTime)\r\n    : '';\r\n\r\n  const handleClickCancel = useCallback(() => {\r\n    goToPage(PAGE_KEYS.CANCELLATION);\r\n  }, [goToPage]);\r\n\r\n  return (\r\n    <MountedAnimationWrapper animationClassName=\"confirm-animation\">\r\n      <div className=\"booking-confirmation-container\">\r\n        <div id=\"printable\">\r\n          <h2 className=\"booking-confirmation-title\">{headerText}</h2>\r\n\r\n          <div className=\"booking-confirmation-content\">\r\n            {!isHidingLocationEnabled && (\r\n              <div className=\"booking-confirmation-content-item\">\r\n                <div className=\"booking-confirmation-map-container\">\r\n                  <GoogleMap position={position} preventTouch={true} />\r\n                </div>\r\n              </div>\r\n            )}\r\n            <div className=\"booking-confirmation-content-item\">\r\n              <BookingDetailsItem name=\"Service\" text={specialtyTypeText} />\r\n              <BookingDetailsItem\r\n                name=\"Appointment Type\"\r\n                text={appointmentTypeText}\r\n              />\r\n              <BookingDetailsItem name=\"with\" text={practitionerText} />\r\n              {!isHidingLocationEnabled && (\r\n                <BookingDetailsItem name=\"Location\" text={locationText} />\r\n              )}\r\n              <BookingDetailsItem\r\n                name=\"Appointment Time\"\r\n                text={appointmentDateTimeText}\r\n              />\r\n              <div style={{ marginTop: 80 }}>\r\n                <span\r\n                  style={{ cursor: 'pointer', textDecoration: 'underline' }}\r\n                  onClick={handleClickCancel}\r\n                >\r\n                  Cancel my appointment\r\n                </span>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <div className=\"booking-confirmation-content\">\r\n          <div className=\"booking-confirmation-content-item booking-confirmation-calendar\">\r\n            <AddToCalendar\r\n              title=\"appointment confirmation\"\r\n              description=\"appointment confirmation\"\r\n              location={locationText}\r\n              startDateTime={appointmentStartTime}\r\n              endDateTime={appointmentEndTime}\r\n              isHidingLocationEnabled={isHidingLocationEnabled}\r\n            />\r\n          </div>\r\n          <div className=\"booking-confirmation-content-item booking-confirmation-buttons\">\r\n            <TransparentButton\r\n              label=\"Make another booking\"\r\n              onClick={makeNewBooking}\r\n            />\r\n            <TransparentButton label=\"Print\" onClick={printConfirmation} />\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </MountedAnimationWrapper>\r\n  );\r\n};\r\n\r\nexport default connect(\r\n  state => {\r\n    return {\r\n      config: state.config,\r\n      appointment: state.appointment,\r\n      waitingList: state.waitingList,\r\n      datasource: state.datasource\r\n    };\r\n  },\r\n  { makeNewBooking, goToPage }\r\n)(Confirm);\r\n","import React, { memo, useRef } from \"react\";\r\nimport Radio from \"@material-ui/core/Radio\";\r\nimport RadioGroup from \"@material-ui/core/RadioGroup\";\r\nimport FormControlLabel from \"@material-ui/core/FormControlLabel\";\r\nimport TextField from \"@material-ui/core/TextField\";\r\nimport { CANCELLATION_OTHER_REASON_ID } from \"../../constants\";\r\n\r\nexport const CancellationReasons = memo(props => {\r\n  const inputRef = useRef();\r\n  const {\r\n    reasonId,\r\n    setReasonId,\r\n    setReasonText,\r\n    notes,\r\n    setNotes,\r\n    cancelReasonList\r\n  } = props;\r\n\r\n  const handleSelect = e => {\r\n    const value = e.target.value;\r\n    setReasonId(value);\r\n    setReasonText(cancelReasonList.find(x => x.id === value).name);\r\n\r\n    if (value === CANCELLATION_OTHER_REASON_ID) {\r\n      inputRef.current.focus();\r\n    }\r\n  };\r\n\r\n  const handleCommentsChange = e => {\r\n    const value = e.target.value;\r\n    setNotes(value);\r\n  };\r\n\r\n  return (\r\n    <div className=\"cancellation-reasons\">\r\n      <RadioGroup\r\n        aria-label=\"gender\"\r\n        name=\"cancellationReason\"\r\n        value={reasonId}\r\n        onChange={handleSelect}\r\n        className=\"cancellation-reasons-radio-group\"\r\n      >\r\n        {cancelReasonList.map(reason => (\r\n          <FormControlLabel\r\n            key={reason.id}\r\n            value={reason.id}\r\n            control={\r\n              <Radio color=\"primary\" className=\"cancellation-reasons-radio\" />\r\n            }\r\n            label={reason.name}\r\n            className=\"cancellation-reasons-radio-label\"\r\n          />\r\n        ))}\r\n      </RadioGroup>\r\n      <div className=\"cancellation-other-reason\">\r\n        <p className=\"cancellation-other-reason-text\">Additional comments</p>\r\n        <TextField\r\n          inputRef={inputRef}\r\n          multiline={true}\r\n          rowsMax={4}\r\n          rows={4}\r\n          inputProps={{ maxLength: 150 }}\r\n          value={notes}\r\n          onChange={handleCommentsChange}\r\n          variant=\"outlined\"\r\n          className=\"cancellation-other-reason-input\"\r\n        />\r\n      </div>\r\n    </div>\r\n  );\r\n});\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport moment from \"moment\";\r\nimport { MountedAnimationWrapper } from \"../AnimationWrapper\";\r\nimport { BackTopButton, ThemeColorButton } from \"../Common\";\r\nimport { AppointmentSummary } from \"../ContactForm/components/Summary/AppointmentSummary\";\r\nimport { CancellationReasons } from \"./components\";\r\nimport { PAGE_KEYS, CANCELLATION_OTHER_REASON_ID } from \"../constants\";\r\nimport {\r\n  setConfig,\r\n  selectAppointmentDateTime,\r\n  setPractitioners,\r\n  selectPractitioner,\r\n  setLocations,\r\n  selectLocation,\r\n  getPositions,\r\n  setSpecialtyTypes,\r\n  selectAppointmentType,\r\n  updateAppointmentCancelled,\r\n  goToPage\r\n} from \"../actions\";\r\nimport { loading, showError, showSuccess } from \"../../App/actions\";\r\nimport { portalService } from \"../../../services\";\r\nimport { getAppointmentIdFromUrl } from \"../helpers\";\r\nimport { deepGet } from \"../../../utils\";\r\nimport \"./cancellation.less\";\r\n\r\nconst HAS_APPOINTMENT_ID_IN_URL = getAppointmentIdFromUrl();\r\n\r\nexport const Cancellation = props => {\r\n  const [reasonId, setReasonId] = useState(\"\");\r\n  const [reasonText, setReasonText] = useState(\"\");\r\n  const [notes, setNotes] = useState(\"\");\r\n  const [cancelReasonList, setCancelReasonList] = useState([]);\r\n\r\n  useEffect(() => {\r\n    getCancellationReasons();\r\n    if (!!HAS_APPOINTMENT_ID_IN_URL) {\r\n      getConfig();\r\n      getAppointmentDetails(HAS_APPOINTMENT_ID_IN_URL);\r\n      getSpecialties();\r\n    }\r\n    if (booking.isCancelled) {\r\n      showError({\r\n        text: \"This appointment has been already cancelled.\",\r\n        canDismiss: true\r\n      });\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  const {\r\n    config,\r\n    appointment,\r\n    datasource,\r\n    waitingList,\r\n    booking,\r\n    goToPage,\r\n    loading,\r\n    showError,\r\n    showSuccess,\r\n    setConfig,\r\n    selectAppointmentDateTime,\r\n    setPractitioners,\r\n    selectPractitioner,\r\n    setLocations,\r\n    selectLocation,\r\n    getPositions,\r\n    setSpecialtyTypes,\r\n    selectAppointmentType,\r\n    updateAppointmentCancelled\r\n  } = props;\r\n\r\n  const getConfig = async () => {\r\n    const configResponse = await portalService.getConfig();\r\n    const config = configResponse.data;\r\n    setConfig(config);\r\n  };\r\n\r\n  const getSpecialties = async () => {\r\n    try {\r\n      //loading(true);\r\n      const specialtiesResponse = await portalService.getSpecialties();\r\n      const { specialtyTypes } = specialtiesResponse.data;\r\n      setSpecialtyTypes(specialtyTypes);\r\n    } catch (error) {\r\n      showError({\r\n        text:\r\n          \"Failed while getting appointment details. \" + getErrorMessage(error),\r\n        canDismiss: true\r\n      });\r\n    } finally {\r\n      //loading(false);\r\n    }\r\n  };\r\n\r\n  const getAppointmentDetails = async () => {\r\n    try {\r\n      loading(true);\r\n      const appointmentResponse = await portalService.getAppointmentById(\r\n        HAS_APPOINTMENT_ID_IN_URL\r\n      );\r\n      const {\r\n        appointment,\r\n        appointmentType,\r\n        location\r\n      } = appointmentResponse.data;\r\n      const { practitioner } = appointment;\r\n\r\n      const startDateTime = moment(\r\n        appointment.startDateTime,\r\n        \"YYYY-MM-DDTHH:mm:ssZ\"\r\n      );\r\n      const endDateTime = moment(\r\n        appointment.endDateTime,\r\n        \"YYYY-MM-DDTHH:mm:ssZ\"\r\n      );\r\n\r\n      const timeslot = { startDateTime, endDateTime };\r\n      selectAppointmentDateTime(timeslot);\r\n\r\n      const pracDictionary = [\r\n        {\r\n          practitionerId: practitioner.practitionerId,\r\n          firstName: practitioner.firstName,\r\n          lastName: practitioner.lastName\r\n        }\r\n      ];\r\n      setPractitioners(pracDictionary);\r\n      selectPractitioner(practitioner.practitionerId);\r\n\r\n      getPositions([location]);\r\n\r\n      const locDictionary = [\r\n        {\r\n          locationId: location.locationId,\r\n          name: location.name,\r\n          streetAddress: location.streetAddress,\r\n          suburb: location.suburb\r\n        }\r\n      ];\r\n      setLocations(locDictionary);\r\n      selectLocation(location.locationId);\r\n\r\n      if (appointmentType) {\r\n        selectAppointmentType(appointmentType.appointmentTypeId);\r\n        updateAppointmentCancelled(false);\r\n      }\r\n\r\n      if (appointment.status === \"Cancelled\") {\r\n        updateAppointmentCancelled(true);\r\n        showError({\r\n          text: \"This appointment is already cancelled.\",\r\n          canDismiss: true\r\n        });\r\n      }\r\n    } catch (error) {\r\n      updateAppointmentCancelled(true);\r\n      showError({\r\n        text:\r\n          \"Failed while getting appointment details. \" + getErrorMessage(error),\r\n        canDismiss: true\r\n      });\r\n    } finally {\r\n      loading(false);\r\n    }\r\n  };\r\n\r\n  const getCancellationReasons = async () => {\r\n    try {\r\n      //loading(true);\r\n      const { data } = await portalService.getCancelReasons();\r\n\r\n      const reasonListInUI = data.reasons\r\n        .sort((a, b) => (a.DisplayOrder > b.DisplayOrder ? 1 : -1))\r\n        .filter(reason => reason.Name !== \"Practitioner cancelled\")\r\n        .map(reason => {\r\n          return reason.Id === CANCELLATION_OTHER_REASON_ID\r\n            ? {\r\n                id: reason.Id,\r\n                name: \"Other (please specify)\",\r\n                displayOrder: reason.DisplayOrder\r\n              }\r\n            : {\r\n                id: reason.Id,\r\n                name: reason.Name,\r\n                displayOrder: reason.DisplayOrder\r\n              };\r\n        });\r\n\r\n      setCancelReasonList(reasonListInUI);\r\n    } catch (error) {\r\n      showError({\r\n        text: \"Failed to load cancellation reasons\",\r\n        canDismiss: true\r\n      });\r\n    } finally {\r\n      //loading(false);\r\n    }\r\n  };\r\n\r\n  const getErrorMessage = error => {\r\n    return deepGet(\r\n      error,\r\n      [\"response\", \"data\", \"Message\"],\r\n      \"Error occurred during processing your request.\"\r\n    );\r\n  };\r\n\r\n  const handleCancelAppointment = async () => {\r\n    if (!booking.appointmentId) return false;\r\n    try {\r\n      loading(true);\r\n      const cancellationReasonId =\r\n        !reasonId || reasonId === CANCELLATION_OTHER_REASON_ID\r\n          ? CANCELLATION_OTHER_REASON_ID\r\n          : reasonId;\r\n      const cancellationNotes =\r\n        \"Client portal Cancellation | reason: \" +\r\n        reasonText +\r\n        \" | Additional comments: \" +\r\n        notes;\r\n      const { data } = await portalService.cancelAppointment({\r\n        appointmentId: booking.appointmentId,\r\n        cancellationReasonId,\r\n        appointmentStartDateTime: appointment.appointmentDateTime.startDateTime,\r\n        appointmentEndDateTime: appointment.appointmentDateTime.endDateTime,\r\n        notes: cancellationNotes\r\n      });\r\n\r\n      if (data.status === \"Cancelled\") {\r\n        updateAppointmentCancelled(true);\r\n        showSuccess({\r\n          text: \"Your appointment has been cancelled successfully.\",\r\n          canDismiss: true\r\n        });\r\n      }\r\n    } catch (error) {\r\n      showError({\r\n        text: \"Failed to cancel appointment. \" + getErrorMessage(error),\r\n        canDismiss: true\r\n      });\r\n    } finally {\r\n      loading(false);\r\n    }\r\n  };\r\n\r\n  const handleBack = () => {\r\n    goToPage(PAGE_KEYS.CONFIRM);\r\n  };\r\n\r\n  const btnDisabled =\r\n    !reasonId ||\r\n    (!appointment && !appointment.appointmentDateTime) ||\r\n    booking.isCancelled;\r\n\r\n  return (\r\n    <MountedAnimationWrapper animationClassName=\"cancellation-animation\">\r\n      <div className=\"cancellation-container\">\r\n        <div className=\"cancellation-content\">\r\n          <div className=\"cancellation-content-item summary-item\">\r\n            <AppointmentSummary\r\n              config={config}\r\n              appointment={appointment}\r\n              datasource={datasource}\r\n              waitingList={waitingList}\r\n              onClickAppointmentLink={() => {}}\r\n              onClickAppointmentButton={() => {}}\r\n              notClickable={true}\r\n            />\r\n          </div>\r\n          <div className=\"cancellation-content-item reason-item\">\r\n            <div className=\"cancellation-top-button\">\r\n              {!HAS_APPOINTMENT_ID_IN_URL && (\r\n                <BackTopButton onClick={handleBack} iconDirection=\"left\" />\r\n              )}\r\n            </div>\r\n            <h2 className=\"cancellation-title\">Cancel my appointment</h2>\r\n            <div className=\"cancellation-reasons-container\">\r\n              <p className=\"cancellation-reasons-title\">\r\n                Why do you want to cancel your appointment?\r\n              </p>\r\n              <CancellationReasons\r\n                reasonId={reasonId}\r\n                setReasonId={setReasonId}\r\n                setReasonText={setReasonText}\r\n                notes={notes}\r\n                setNotes={setNotes}\r\n                cancelReasonList={cancelReasonList}\r\n              />\r\n            </div>\r\n            <ThemeColorButton\r\n              label=\"Cancel appointment\"\r\n              onClick={handleCancelAppointment}\r\n              disabled={btnDisabled}\r\n              className=\"cancel-appointment-btn\"\r\n            />\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </MountedAnimationWrapper>\r\n  );\r\n};\r\n\r\nexport default connect(\r\n  state => {\r\n    return {\r\n      config: state.config,\r\n      appointment: state.appointment,\r\n      datasource: state.datasource,\r\n      booking: state.booking,\r\n      waitingList: state.waitingList\r\n    };\r\n  },\r\n  {\r\n    loading,\r\n    setConfig,\r\n    selectAppointmentDateTime,\r\n    setPractitioners,\r\n    selectPractitioner,\r\n    setLocations,\r\n    selectLocation,\r\n    getPositions,\r\n    setSpecialtyTypes,\r\n    selectAppointmentType,\r\n    updateAppointmentCancelled,\r\n    goToPage,\r\n    showError,\r\n    showSuccess\r\n  }\r\n)(Cancellation);\r\n","import React, { useEffect, useMemo } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { PageHeader, PoweredBy, ProgressStep } from './Common';\r\nimport BookingPortal from './BookingPortal';\r\nimport ContactForm from './ContactForm';\r\nimport Confirm from './Confirm';\r\nimport Cancellation from './Cancellation';\r\nimport { initialLoad, goToPage, updateAppointmentId } from './actions';\r\nimport { DrawerContextProvider } from './context/DrawerContext';\r\nimport { PAGE_KEYS } from './constants';\r\nimport { createGoogleAnalyticsScriptTag } from '../../utils/googleAnalyticsHelper';\r\nimport { getAppointmentIdFromUrl } from './helpers';\r\n\r\nconst ClientPortal = props => {\r\n  const {\r\n    config,\r\n    booking,\r\n    appointment,\r\n    initialLoad,\r\n    goToPage,\r\n    updateAppointmentId\r\n  } = props;\r\n  const { loadedData } = config;\r\n  const { page } = booking;\r\n\r\n  useEffect(() => {\r\n    const appointmentId = getAppointmentIdFromUrl();\r\n    if (appointmentId) {\r\n      goToPage(PAGE_KEYS.CANCELLATION);\r\n      updateAppointmentId(appointmentId);\r\n    } else {\r\n      initialLoad();\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    if (config.googleAnalyticsCode) {\r\n      createGoogleAnalyticsScriptTag(config.googleAnalyticsCode);\r\n    }\r\n  }, [config.googleAnalyticsCode]);\r\n\r\n  const renderPage = useMemo(() => {\r\n    switch (page) {\r\n      case PAGE_KEYS.BOOKING:\r\n        return <BookingPortal />;\r\n\r\n      case PAGE_KEYS.CONTACT:\r\n        return <ContactForm />;\r\n\r\n      case PAGE_KEYS.CONFIRM:\r\n        return <Confirm />;\r\n\r\n      case PAGE_KEYS.CANCELLATION:\r\n        return <Cancellation />;\r\n\r\n      default:\r\n        return <BookingPortal />;\r\n    }\r\n  }, [page]);\r\n\r\n  const showLeftPanel =\r\n    page === PAGE_KEYS.BOOKING || page === PAGE_KEYS.CONTACT;\r\n\r\n  return (\r\n    <DrawerContextProvider>\r\n      <div className=\"client-portal-main\">\r\n        <PageHeader\r\n          tenant={config.tenant}\r\n          displayPhoneNumber={config.displayPhoneNumber}\r\n          customerTermsUrl={config.customerTermsUrl}\r\n          customerPrivacyPolicyUrl={config.customerPrivacyPolicyUrl}\r\n          isLogoOrBusinessName={config.isLogoOrBusinessName}\r\n          businessName={config.businessName}\r\n        />\r\n        <div className=\"container client-portal-content\">\r\n          {loadedData && showLeftPanel && (\r\n            <div className=\"left-panel\">\r\n              <ProgressStep page={page} appointment={appointment} />\r\n            </div>\r\n          )}\r\n          <div\r\n            className={`right-panel ${\r\n              !showLeftPanel ? 'content-full-width' : ''\r\n            }`}\r\n          >\r\n            {loadedData && renderPage}\r\n          </div>\r\n        </div>\r\n        <PoweredBy />\r\n      </div>\r\n    </DrawerContextProvider>\r\n  );\r\n};\r\n\r\nexport default connect(\r\n  state => {\r\n    return {\r\n      config: state.config,\r\n      booking: state.booking,\r\n      appointment: state.appointment\r\n    };\r\n  },\r\n  { initialLoad, goToPage, updateAppointmentId }\r\n)(ClientPortal);\r\n","\r\nexport const createGoogleAnalyticsScriptTag = (trackingId) => {\r\n    const script1 = document.createElement(\"script\");\r\n    \r\n    script1.src = \"https://www.googletagmanager.com/gtag/js?id=\" + trackingId;\r\n    script1.async = true;\r\n    document.head.appendChild(script1);\r\n\r\n    const script2 = document.createElement(\"script\");    \r\n    script2.innerHTML = `window.dataLayer = window.dataLayer || [];\r\n      function gtag(){dataLayer.push(arguments);}\r\n      gtag('js', new Date());\r\n    \r\n      gtag('config', '` + trackingId + `');    \r\n    `;\r\n    document.head.appendChild(script2);\r\n  };\r\n  ","import React from \"react\";\r\n//import { HashRouter as Router, Route, Switch } from \"react-router-dom\";\r\nimport App from \"./modules/App\";\r\nimport ClientPortal from \"./modules/ClientPortal\";\r\n\r\nconst Routes = props => {\r\n  return (\r\n    <App>\r\n      <ClientPortal />\r\n    </App>\r\n  );\r\n};\r\n\r\nexport default Routes;\r\n","import { APP_ACTION } from \"../actions/types\";\r\nconst INITIAL_STATE = {\r\n  loading: false,\r\n  error: null, //{text: \"error message\", canDismiss: true/false}\r\n  success: null,\r\n  redirect: \"\"\r\n};\r\n\r\nexport const appReducer = (state = INITIAL_STATE, action) => {\r\n  switch (action.type) {\r\n    case APP_ACTION.LOADING:\r\n      return { ...state, loading: action.payload.loading };\r\n\r\n    case APP_ACTION.SHOW_ERROR:\r\n      return { ...state, error: action.payload.error, loading: false };\r\n\r\n    case APP_ACTION.SHOW_SUCCESS:\r\n      return { ...state, success: action.payload.success, loading: false };\r\n\r\n    case APP_ACTION.REDIRECT:\r\n      return { ...state, redirect: action.payload.path };\r\n\r\n    case APP_ACTION.CLEAR:\r\n      return { ...state, success: \"\", error: \"\", redirect: \"\" };\r\n\r\n    default:\r\n      return state;\r\n  }\r\n};\r\n","import { APPOINTMENT_ACTION, BOOKING_ACTION } from \"../actions\";\r\nimport { STEP_KEYS } from \"../constants\";\r\n//  specialtyTypeId,appointmentTypeId,locationId, timezone, appointmenttime etc...\r\nconst INITIAL_STATE = {\r\n  [STEP_KEYS.SPECIALTY_TYPE]: null,\r\n  [STEP_KEYS.APPOINTMENT_TYPE]: null,\r\n  [STEP_KEYS.PRACTITIONER]: null,\r\n  [STEP_KEYS.LOCATION]: null,\r\n  [STEP_KEYS.TIMEZONE]: null,\r\n  [STEP_KEYS.APPOINTMENT_DATE_TIME]: null,\r\n  timeZoneOfLocation: null\r\n};\r\n/**  \r\n timeZoneOfLocation is the selected location's time zone Id, we put it as sperate to simplify the logic with selected time zone(phone consult)\r\n*/\r\n\r\nconst clearAppointmentByKeys = (state, action) => {\r\n  const { clearSteps } = action.payload;\r\n  const clearAppointmentObj = clearSteps.reduce((total, current) => {\r\n    return {\r\n      ...total,\r\n      [current]: null\r\n    };\r\n  }, {});\r\n\r\n  return { ...state, ...clearAppointmentObj };\r\n};\r\n\r\nconst setLocationAndItsTimeZone = (state, action) => {\r\n  const { locationId, timeZoneId } = action.payload;\r\n  const timeZoneOfLocationData = timeZoneId\r\n    ? { timeZoneOfLocation: timeZoneId }\r\n    : {};\r\n  return {\r\n    ...state,\r\n    [STEP_KEYS.LOCATION]: locationId,\r\n    ...timeZoneOfLocationData\r\n  };\r\n};\r\n\r\nexport const appointmentReducer = (state = INITIAL_STATE, action) => {\r\n  switch (action.type) {\r\n    case APPOINTMENT_ACTION.SET_VALUE:\r\n      return { ...state, [action.payload.key]: action.payload.value };\r\n    case BOOKING_ACTION.GO_BACK_STEP:\r\n      return clearAppointmentByKeys(state, action);\r\n    case APPOINTMENT_ACTION.SET_LOCATION:\r\n      return setLocationAndItsTimeZone(state, action);\r\n    case BOOKING_ACTION.MAKE_NEW_BOOKING:\r\n      return INITIAL_STATE;\r\n    default:\r\n      return state;\r\n  }\r\n};\r\n","import { CONFIG_ACTION } from \"../actions\";\r\nconst INITIAL_STATE = {\r\n  loadedData: true,\r\n  welcomeMessage: \"\",\r\n  siteConsultTypes: [],\r\n  specialtyHintText: \"I would like to make an appointment for\",\r\n  appointmentTypeHintText: \"and this will be\",\r\n  practitionerHintText: \"with\",\r\n  locationHintText: \"at\",\r\n  timezoneHintText: \"during the call I will be in the same time zone as\",\r\n  appointmentDateTimeHintText: \"on\",\r\n  practitionerFirst: false,\r\n  preSelectPractitioner: \"\",\r\n  confirmationSmsText: null,\r\n  confirmationText: \"\",\r\n  customerConfirmationPolicy: \"\",\r\n  customerPrivacyPolicyUrl: \"\",\r\n  customerTermsUrl: \"\",\r\n  displayPhoneNumber: \"\",\r\n  earliestBookingTime: 0,\r\n  hideSpecialties: false,\r\n  logo: null,\r\n  logoFileName: null,\r\n  mobileHintDescription:\r\n    \"* Mobile number required to confirm appointment and inform of any changes to appointment\",\r\n  noSlotsPlaceholder: \"[No Slots Available]\",\r\n  preSelectSpecialtyType: \"\",\r\n  reCaptchaEnabled: false,\r\n  tenant: \"\",\r\n  waitingListConfirmationText:\r\n    \"A member of our team will be in touch with you to follow up your request\",\r\n  waitingListEnabled: false,\r\n  isLogoOrBusinessName: 0,\r\n  businessName: null,\r\n  isTimezoneEnabled: false,\r\n  isTimezoneMandatory: false,\r\n  isClientAddressEnabled: false,\r\n  isClientAddressMandatory: false,\r\n  isMedicareEnabled: false,\r\n  isMedicareMandatory: false,\r\n  isCreditCardEnabled: false,\r\n  isCreditCardMandatory: false,\r\n  isCommentsEnabled: false,\r\n  isCommentsMandatory: false,\r\n  isHidingLocationEnabled: false,\r\n  isUploadDocumentEnabled: false,\r\n  isUploadDocumentMandatory: false,\r\n  uploadDocumentInstruction: null,\r\n  appointmentNotWithinHrs: null,\r\n  appointmentNotAfterDays: null,\r\n  appointmentMinCancelHrs: null,\r\n  isNotifyPractitionerEmails: null,\r\n  notifyPractitionerEmails: null,\r\n  googleAnalyticsCode: null,\r\n  isDownloadDocumentAllowed: false,\r\n  downloadDocumentInstruction: null,\r\n};\r\n\r\nexport const configReducer = (state = INITIAL_STATE, action) => {\r\n  switch (action.type) {\r\n    case CONFIG_ACTION.SET_CONFIG:\r\n      return { ...state, ...action.payload };\r\n    case CONFIG_ACTION.SET_LOADED_DATA:\r\n      return { ...state, loadedData: action.payload };\r\n    default:\r\n      return state;\r\n  }\r\n};\r\n","import { DATASOURCE_ACTION, BOOKING_ACTION } from '../actions';\r\nimport { deepAssign } from '../../../utils';\r\nimport HealthFunds from '../../../jsonData/HealthFunds';\r\nimport CustomFields from '../../../jsonData/CustomFields';\r\n\r\n// import { filterSpecialtiesHavingAppointmentTypes } from \"../helpers\";\r\n// import Specialties from \"../../../jsonData/Specialties\";\r\n// import Practitioners from \"../../../jsonData/Practitioners\";\r\n// import Locations from \"../../../jsonData/Locations\";\r\n// import TimeZones from \"../../../jsonData/LocationTimeZones\";\r\n// import Schedules from \"../../../jsonData/Schedules\";\r\n// import TimeSlots from \"../../../jsonData/TimeSlots\";\r\n\r\n// const INITIAL_STATE = {\r\n//   specialtyTypes: filterSpecialtiesHavingAppointmentTypes(\r\n//     Specialties.specialtyTypes\r\n//   ),\r\n//   practitioners: Practitioners.practitioners,\r\n//   locations: Locations.locations,\r\n//   timeSlots: TimeSlots.timeslots,\r\n//   timeZones: TimeZones.locationTimezones,\r\n//   schedules: Schedules.schedules,\r\n//   positions: {},\r\n//   healthFunds: HealthFunds.healthFunds,\r\n//   customFields: CustomFields.customFields,\r\n//   loadingTimeSlots: false\r\n// };\r\n\r\nconst INITIAL_STATE = {\r\n  specialtyTypes: [],\r\n  practitioners: [],\r\n  locations: [],\r\n  timeSlots: [],\r\n  timeZones: [],\r\n  schedules: [],\r\n  positions: {},\r\n  healthFunds: HealthFunds.healthFunds,\r\n  customFields: CustomFields.customFields,\r\n  loadingTimeSlots: false,\r\n  intakeFormFiles: [], // intake form files\r\n  onlinePaymentToken: null, // pin payment publishable key\r\n  onlinePaymentIsTest: true // pin payment test account or not\r\n};\r\n\r\nconst updateDataSource = (state, action) => {\r\n  const { key, value } = action.payload;\r\n  return { ...state, [key]: value };\r\n};\r\n\r\nconst updateTimeSlots = (state, action) => {\r\n  const { timeSlots, concat } = action.payload;\r\n\r\n  return {\r\n    ...state,\r\n    timeSlots: concat ? [...state.timeSlots, ...timeSlots] : timeSlots\r\n  };\r\n};\r\n\r\nconst handlePositionLoad = (state, action) => {\r\n  const { locationId, position } = action.payload;\r\n  return deepAssign(state, position, ['positions', locationId]);\r\n};\r\n\r\nexport const datasourceReducer = (state = INITIAL_STATE, action) => {\r\n  switch (action.type) {\r\n    case DATASOURCE_ACTION.SET_VALUE:\r\n      return updateDataSource(state, action);\r\n    case DATASOURCE_ACTION.SET_TIME_SLOTS:\r\n      return updateTimeSlots(state, action);\r\n    case DATASOURCE_ACTION.SET_POSITION:\r\n      return handlePositionLoad(state, action);\r\n    case BOOKING_ACTION.MAKE_NEW_BOOKING:\r\n      return { ...state, timeSlots: [] };\r\n    default:\r\n      return state;\r\n  }\r\n};\r\n","const healthFunds = {\r\n  healthFunds: [\r\n    {\r\n      value: 'AC4B49B0-FA1E-4B46-BCF8-71459CF7DD9F',\r\n      text: 'ACA Health Benefits Fund'\r\n    },\r\n    {\r\n      value: '285B3AD2-28A9-4366-AF89-5ECF2BE6F7F6',\r\n      text: 'Australian Health Management Group'\r\n    },\r\n    {\r\n      value: 'F6EE2CEA-F6CE-4834-9DA6-9CE028815943',\r\n      text: 'Australian Unity Health Ltd'\r\n    },\r\n    {\r\n      value: 'FC59E503-9599-4677-B0FB-73AAFAAED046',\r\n      text: 'BUPA Australia Health'\r\n    },\r\n    {\r\n      value: '27C38FE3-7C32-436F-B735-ADA8C5D9E6B0',\r\n      text: 'CBHS Friendly Society'\r\n    },\r\n    {\r\n      value: 'B063881B-6D7F-454D-872F-465CCE644558',\r\n      text: 'Central West Health Cover'\r\n    },\r\n    {\r\n      value: 'C93F9080-417A-4859-9288-88AE3FC8E13D',\r\n      text: 'Cessnock District Health Benefits Fund Ltd'\r\n    },\r\n    {\r\n      value: '04C105CE-7A0D-4143-B74C-1DADAC83605D',\r\n      text: 'CUA Health Limited'\r\n    },\r\n    {\r\n      value: 'A830ABD6-18F2-4AE9-B468-601E2C073CC0',\r\n      text: 'Defence Health'\r\n    },\r\n    {\r\n      value: '7EC06B56-F13B-406B-B2BC-61D2A6582045',\r\n      text: 'Doctors Health Fund'\r\n    },\r\n    {\r\n      value: 'EB535EA4-CFEF-47A7-B4EC-E8515937F182',\r\n      text: 'Druids Friendly Society'\r\n    },\r\n    {\r\n      value: '269E0719-DB74-4166-BA37-DF140B996D31',\r\n      text: 'Frank Health Insurance'\r\n    },\r\n    {\r\n      value: '225CCFF8-9099-48FA-A621-DE7C87B95E48',\r\n      text: 'GMF Health'\r\n    },\r\n    {\r\n      value: 'F067E86E-9EE9-41D2-878D-68393D04CBDB',\r\n      text: 'GMHBA Ltd'\r\n    },\r\n    {\r\n      value: 'E4A5B1A8-9FF2-434E-A1B8-DD89890365B3',\r\n      text: 'Grand United Corporate Society'\r\n    },\r\n    {\r\n      value: '8BECBCB0-73AF-423D-86F7-7E8BB222370E',\r\n      text: 'GU Health'\r\n    },\r\n    {\r\n      value: 'DFDBFBF1-0EA9-4A3C-A0DA-7031A83D94B6',\r\n      text: 'HBA'\r\n    },\r\n    {\r\n      value: 'B287860D-4ECC-4B69-BD4E-BBA0D5B5B155',\r\n      text: 'HBF Health Funds Inc'\r\n    },\r\n    { value: '420DC008-4D88-4E06-A6CB-42F874B04B71', text: 'HCF' },\r\n    {\r\n      value: '6393CC89-9FB2-4299-AB18-14D89B24BE58',\r\n      text: 'Health Care Insurance'\r\n    },\r\n    {\r\n      value: 'CB8E7D47-7A2E-4F30-97DC-E6DBEACCC04E',\r\n      text: 'Health Insurance Fund of Australia Limited'\r\n    },\r\n    {\r\n      value: '68E0CC1E-11C1-4950-AC33-6D97F794C545',\r\n      text: 'Health Partners'\r\n    },\r\n    {\r\n      value: 'CABB0014-D3BD-4057-97ED-7B7E232177A9',\r\n      text: 'health.com.au'\r\n    },\r\n    {\r\n      value: 'FB6388A8-FE43-400A-B5F5-98C02FC8A42C',\r\n      text: 'Healthguard Health Benefits (including GMF Health)'\r\n    },\r\n    {\r\n      value: '0BDA8E16-F856-41E9-9A2B-4E23AAF39E45',\r\n      text: 'IOOF Health'\r\n    },\r\n    {\r\n      value: '33FC5271-DEF7-44A2-B6B3-57B719F2316A',\r\n      text: 'Latrobe Health Services Inc'\r\n    },\r\n    {\r\n      value: '00CB85DA-5223-4CE3-BFEC-BDC9EE2FC482',\r\n      text: 'Manchester Unity Australia'\r\n    },\r\n    {\r\n      value: '9C2EC124-8BC0-454E-AF6E-41E3B2ECB47D',\r\n      text: 'MBF Australia Ltd'\r\n    },\r\n    {\r\n      value: 'EC9603BF-3AD8-4053-BC62-BF15E78EDE6E',\r\n      text: 'MBF Health Pty Ltd'\r\n    },\r\n    {\r\n      value: 'BA5313A2-531B-48D0-A300-8129CAAEB9DE',\r\n      text: 'Medibank Private Ltd'\r\n    },\r\n    {\r\n      value: '11E76E9F-0DBD-47A9-B868-7B73DF68E865',\r\n      text: 'Mildura District Hospital Fund Ltd'\r\n    },\r\n    {\r\n      value: 'AB464F53-96F1-4FB9-9714-0CC150BAF0E6',\r\n      text: 'Mutual Community'\r\n    },\r\n    {\r\n      value: 'F4DDC043-2D97-4210-8A8A-87CFF644B040',\r\n      text: 'Navy Health'\r\n    },\r\n    {\r\n      value: 'D1E64F26-8C7E-4240-A43C-65A519C7E956',\r\n      text: 'NIB Health Funds Ltd'\r\n    },\r\n    {\r\n      value: 'ED43D492-E46C-4228-9CD3-716FC6075201',\r\n      text: 'Onemedifund'\r\n    },\r\n    {\r\n      value: '18564887-E4F0-4FEA-A98E-9805E61B4B6F',\r\n      text: 'Peoplecare Health Insurance'\r\n    },\r\n    {\r\n      value: '1FD1F222-0B83-495B-A426-3ADDAF976641',\r\n      text: 'Phoenix Health Fund Ltd'\r\n    },\r\n    {\r\n      value: 'D38C0D48-6389-45EC-8A20-8833F5B411F7',\r\n      text: 'Police Health'\r\n    },\r\n    {\r\n      value: '51B8008C-36D9-4D24-B2DD-3F93216D0D6F',\r\n      text: 'Queensland Country Health Ltd'\r\n    },\r\n    {\r\n      value: 'FF2EC1B6-9590-4EBD-A383-8717DA8C1D1C',\r\n      text: 'Reserve Bank Health Fund'\r\n    },\r\n    {\r\n      value: '4BEB4B68-E4B8-4299-9AF4-F318467A9514',\r\n      text: 'RT Health Fund Ltd'\r\n    },\r\n    {\r\n      value: '9C161B81-4C6D-4FA9-9EFD-3CE5315A1C60',\r\n      text: 'St.LukesHealth'\r\n    },\r\n    {\r\n      value: 'FCF80D55-A3E5-4EFB-9BD5-50FF3DB5FDC1',\r\n      text: 'Teachers Federation Health (NSW)'\r\n    },\r\n    {\r\n      value: '2ED3F9B2-845B-42F4-BBBB-93BC8DC47826',\r\n      text: 'Teachers Union Health'\r\n    },\r\n    {\r\n      value: '047F4DE7-33D0-4354-9BBB-421E943B4016',\r\n      text: 'The Doctors Health Fund Ltd'\r\n    },\r\n    {\r\n      value: '3BAC80E8-D2A4-4A72-A092-1141F8B252D2',\r\n      text: 'Transport Friendly Society'\r\n    },\r\n    {\r\n      value: 'A6D398BC-C294-43A3-8929-CA318AB65292',\r\n      text: 'Union Shopper Health'\r\n    },\r\n    {\r\n      value: '9E36ECC6-8ABB-4615-B081-8EC34A3FE45D',\r\n      text: 'Westfund'\r\n    },\r\n    {\r\n      value: '00000000-0000-0000-0000-000000000000',\r\n      text: 'None'\r\n    }\r\n  ]\r\n};\r\n\r\nexport default healthFunds;\r\n","const customFields = {\r\n  customFields: [\r\n    {\r\n      id: '8CD008AB-0145-45D8-967C-8C0B3627463F',\r\n      name: '01. Income Insurance'\r\n    },\r\n    {\r\n      id: 'F28860AC-F58A-4AE8-9F22-66745130D19B',\r\n      name: '02. Life Insurance'\r\n    },\r\n    {\r\n      id: '21BFF459-35A0-4E40-86FA-6BD398FDF2D2',\r\n      name: '03. Pet Insurance'\r\n    },\r\n    {\r\n      id: '32C7B947-D061-43BC-9122-FC01CA192F47',\r\n      name: '04. Travel Insurance'\r\n    }\r\n  ]\r\n};\r\n\r\nexport default customFields;\r\n","import { BOOKING_ACTION } from '../actions';\r\nimport { STEP_KEYS, PAGE_KEYS } from '../constants';\r\nconst INITIAL_STATE = {\r\n  steps: [STEP_KEYS.SPECIALTY_TYPE],\r\n  visibilityKey: null,\r\n  page: PAGE_KEYS.BOOKING,\r\n  appointmentId: null,\r\n  isCancelled: false\r\n};\r\n\r\nexport const bookingReducer = (state = INITIAL_STATE, action) => {\r\n  switch (action.type) {\r\n    case BOOKING_ACTION.SET_VALUE:\r\n      return { ...state, [action.payload.key]: action.payload.value };\r\n    case BOOKING_ACTION.TOGGLE_VISIBILITY:\r\n      return { ...state, visibilityKey: action.payload };\r\n    case BOOKING_ACTION.SET_STEP:\r\n    case BOOKING_ACTION.GO_BACK_STEP:\r\n      return {\r\n        ...state,\r\n        steps: action.payload.steps\r\n      };\r\n    case BOOKING_ACTION.GO_TO_PAGE:\r\n      return { ...state, page: action.payload };\r\n    case BOOKING_ACTION.MAKE_NEW_BOOKING:\r\n      return INITIAL_STATE;\r\n    default:\r\n      return state;\r\n  }\r\n};\r\n","import { FORM_ACTION, BOOKING_ACTION } from '../actions';\r\nimport { FORM_KEYS } from '../constants';\r\nimport { deleteElementByIndex } from '../../../utils';\r\n\r\nconst INITIAL_STATE = {\r\n  [FORM_KEYS.FIRST_NAME]: '',\r\n  [FORM_KEYS.MIDDLE_NAME]: '',\r\n  [FORM_KEYS.PREFERRED_NAME]: '',\r\n  [FORM_KEYS.LAST_NAME]: '',\r\n  [FORM_KEYS.MOBILE]: '',\r\n  [FORM_KEYS.EMAIL]: '',\r\n  [FORM_KEYS.DATE_OF_BIRTH]: '',\r\n  [FORM_KEYS.COMMENTS]: '',\r\n  [FORM_KEYS.CLIENT_ADDRESS]: '',\r\n  [FORM_KEYS.CLIENT_SUBURB]: '',\r\n  [FORM_KEYS.CLIENT_POSTCODE]: '',\r\n  [FORM_KEYS.MEDICARE_NUMBER]: '',\r\n  [FORM_KEYS.MEDICARE_EXPIRY]: '',\r\n  [FORM_KEYS.CREDIT_CARD_NUMBER]: '',\r\n  [FORM_KEYS.CREDIT_CARD_EXPIRY]: '',\r\n  [FORM_KEYS.CREDIT_CARD_NAME]: '',\r\n  [FORM_KEYS.CREDIT_CARD_SECURITY_CODE]: '',\r\n  errors: {\r\n    [FORM_KEYS.FIRST_NAME]: '',\r\n    [FORM_KEYS.MIDDLE_NAME]: '',\r\n    [FORM_KEYS.PREFERRED_NAME]: '',\r\n    [FORM_KEYS.LAST_NAME]: '',\r\n    [FORM_KEYS.MOBILE]: '',\r\n    [FORM_KEYS.EMAIL]: '',\r\n    [FORM_KEYS.DATE_OF_BIRTH]: '',\r\n    [FORM_KEYS.COMMENTS]: '',\r\n    [FORM_KEYS.CLIENT_ADDRESS]: '',\r\n    [FORM_KEYS.CLIENT_SUBURB]: '',\r\n    [FORM_KEYS.CLIENT_POSTCODE]: '',\r\n    [FORM_KEYS.MEDICARE_NUMBER]: '',\r\n    [FORM_KEYS.MEDICARE_EXPIRY]: '',\r\n    [FORM_KEYS.CREDIT_CARD_NUMBER]: '',\r\n    [FORM_KEYS.CREDIT_CARD_EXPIRY]: '',\r\n    [FORM_KEYS.CREDIT_CARD_NAME]: '',\r\n    [FORM_KEYS.CREDIT_CARD_SECURITY_CODE]: ''\r\n  },\r\n  isVerifyDrawerOpen: false,\r\n  [FORM_KEYS.HEALTH_FUND]: null,\r\n  [FORM_KEYS.CARD_NUMBER]: null,\r\n  [FORM_KEYS.CARD_POSITION]: null,\r\n  [FORM_KEYS.CUSTOM_FIELDS]: {},\r\n  [FORM_KEYS.FILES]: []\r\n};\r\n\r\n// for testing:\r\nexport const formReducerInitState = INITIAL_STATE;\r\n\r\nconst handleSetError = (state, action) => {\r\n  const { key, errorText } = action.payload;\r\n  const newError = { ...state.errors, [key]: errorText };\r\n  return { ...state, errors: newError };\r\n};\r\n\r\nconst handleToggleVerificationDrawer = (state, action) => {\r\n  const open = action.payload;\r\n  return {\r\n    ...state,\r\n    isVerifyDrawerOpen: open\r\n  };\r\n};\r\n\r\nconst handleMakeNewBookingForForms = (state, action) => {\r\n  const remainingKeys = [\r\n    FORM_KEYS.FIRST_NAME,\r\n    FORM_KEYS.PREFERRED_NAME,\r\n    FORM_KEYS.LAST_NAME,\r\n    FORM_KEYS.DATE_OF_BIRTH\r\n  ];\r\n  const remainingObj = remainingKeys.reduce((total, current) => {\r\n    return { ...total, [current]: state[current] };\r\n  }, {});\r\n  return { ...INITIAL_STATE, ...remainingObj };\r\n};\r\n\r\nconst handleSetFiles = (state, action) => {\r\n  const { files } = action.payload;\r\n  const newFiles = [...state.files, ...files];\r\n  return { ...state, files: newFiles };\r\n};\r\n\r\nconst handleRemoveFile = (state, action) => {\r\n  const fileIndex = action.payload;\r\n  const filesInStore = [...state.files];\r\n  const newFiles = deleteElementByIndex(filesInStore, fileIndex);\r\n  return { ...state, files: newFiles };\r\n};\r\n\r\nexport const formReducer = (state = INITIAL_STATE, action) => {\r\n  switch (action.type) {\r\n    case FORM_ACTION.SET_VALUE:\r\n      return { ...state, [action.payload.key]: action.payload.value };\r\n    case FORM_ACTION.SET_ERROR:\r\n      return handleSetError(state, action);\r\n    case FORM_ACTION.TOGGLE_VERIFICATION_DRAWER:\r\n      return handleToggleVerificationDrawer(state, action);\r\n    case FORM_ACTION.SET_FILES:\r\n      return handleSetFiles(state, action);\r\n    case FORM_ACTION.REMOVE_FILE:\r\n      return handleRemoveFile(state, action);\r\n    case BOOKING_ACTION.MAKE_NEW_BOOKING:\r\n      return handleMakeNewBookingForForms(state, action);\r\n    default:\r\n      return state;\r\n  }\r\n};\r\n","import { WAITING_LIST_ACTION, BOOKING_ACTION } from \"../actions\";\r\n\r\nconst INITIAL_STATE = {\r\n  required: false,\r\n  preferredTime: \"\"\r\n};\r\n\r\nconst handleRequireWaitingList = (state, action) => {\r\n  const isRequired = action.payload;\r\n  let preferredTimeObj = {};\r\n  if (isRequired) {\r\n    preferredTimeObj = { preferredTime: \"\" };\r\n  }\r\n  return { ...state, required: isRequired, ...preferredTimeObj };\r\n};\r\n\r\nexport const waitingListReducer = (state = INITIAL_STATE, action) => {\r\n  switch (action.type) {\r\n    case WAITING_LIST_ACTION.REQUIRE_WAITING_LIST:\r\n      return handleRequireWaitingList(state, action);\r\n\r\n    case WAITING_LIST_ACTION.UPDATE_PREFERRED_TIME:\r\n      return { ...state, preferredTime: action.payload };\r\n\r\n    case BOOKING_ACTION.GO_BACK_STEP:\r\n      return INITIAL_STATE;\r\n\r\n    case BOOKING_ACTION.MAKE_NEW_BOOKING:\r\n      return INITIAL_STATE;\r\n\r\n    default:\r\n      return state;\r\n  }\r\n};\r\n","import { combineReducers } from \"redux\";\r\nimport { appReducer } from \"../modules/App/reducers\";\r\nimport {\r\n  appointmentReducer,\r\n  configReducer,\r\n  datasourceReducer,\r\n  formReducer,\r\n  bookingReducer,\r\n  waitingListReducer\r\n} from \"../modules/ClientPortal/reducers\";\r\n\r\nconst rootReducer = combineReducers({\r\n  app: appReducer,\r\n  appointment: appointmentReducer,\r\n  config: configReducer,\r\n  datasource: datasourceReducer,\r\n  booking: bookingReducer,\r\n  waitingList: waitingListReducer,\r\n  form: formReducer\r\n});\r\n\r\nexport default rootReducer;\r\n","import { createStore, compose, applyMiddleware } from \"redux\";\r\nimport thunk from \"redux-thunk\";\r\nimport rootReducer from \"./rootReducer\";\r\n\r\nconst composeEnhancers =\r\n  process.env.NODE_ENV !== \"production\"\r\n    ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose\r\n    : compose;\r\nconst store = createStore(\r\n  rootReducer,\r\n  composeEnhancers(applyMiddleware(thunk))\r\n);\r\n\r\nexport default store;\r\n","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport \"core-js/stable\";\r\nimport \"regenerator-runtime/runtime\";\r\nimport { Provider } from \"react-redux\";\r\nimport Routes from \"./routes\";\r\nimport store from \"./store/configureStore\";\r\n\r\nimport \"./assets/app.less\";\r\n\r\nReactDOM.render(\r\n  <Provider store={store}>\r\n    <Routes></Routes>\r\n  </Provider>,\r\n  document.getElementById(\"root\")\r\n);\r\n\r\nexport default store;\r\n"],"sourceRoot":""}