{"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":""}