{"version":3,"sources":["webpack:///./ClientApp/services/Localizer.tsx","webpack:///./ClientApp/features/search/RocHawkConfig.ts","webpack:///./ClientApp/shared/components/hawksearch/util/SearchTracking.ts","webpack:///./ClientApp/shared/components/hawksearch/store/HawkState.ts","webpack:///./ClientApp/shared/components/hawksearch/util/MergableState.ts","webpack:///./ClientApp/features/tracking/trackers/commerce/hawksearch/tracking-commerce.ts","webpack:///./ClientApp/features/commerce/shopping-cart/OrderMessages.tsx","webpack:///./ClientApp/shared/components/hawksearch/models/Autocomplete/Request.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Autocomplete/Category.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Autocomplete/Product.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Autocomplete/Content.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Autocomplete/Popular.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Autocomplete/Response.ts","webpack:///./ClientApp/shared/polyfills/customEvent.js","webpack:///./ClientApp/shared/components/svg/DownChevronSVG.tsx","webpack:///./ClientApp/shared/components/svg/UpChevronSVG.tsx","webpack:///./ClientApp/shared/components/hawksearch/models/Search/Pagination.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Search/Result.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Search/Sorting.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Search/Selections.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Facets/Value.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Facets/Swatch.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Facets/Range.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Facets/Facet.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Search/Rule.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Search/Trigger.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Search/Merchandising.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Search/PageContent.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Search/Response.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Search/ClientData.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Search/ContentType.ts","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/ResultImage.tsx","webpack:///./ClientApp/features/commerce/shopping-cart/useShoppingCart.ts","webpack:///./ClientApp/shared/hooks/useInViewOnce.ts","webpack:///./ClientApp/shared/assets/LazyImage.tsx","webpack:///./ClientApp/shared/components/svg/MagnifyingGlassSVG.tsx","webpack:///./ClientApp/util/StringUtil.ts","webpack:///./ClientApp/shared/components/hawksearch/net/HawkClient.ts","webpack:///./ClientApp/shared/components/svg/ShoppingCartSVG.tsx","webpack:///./ClientApp/shared/components/hawksearch/util/QueryString.ts","webpack:///./ClientApp/styles/node-modules/@reach/dialog/styles.css?d0c1","webpack:///./ClientApp/shared/components/hawksearch/components/hcl/util.ts","webpack:///./ClientApp/services/ServerData.ts","webpack:///./ClientApp/shared/components/svg/QuestionMarkCircleSVG.tsx","webpack:///./ClientApp/features/commerce/store/AddedToCartAlert.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/svg/CheckmarkSVG.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/svg/PlusCircleSVG.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/FacetTypes/Checkbox.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/FacetTypes/Search.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/FacetTypes/Link.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/SliderNumericInputs.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/FacetTypes/Slider.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/FacetTypes/SwatchItem.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/FacetTypes/Swatch.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/FacetTypes/NestedItem.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/FacetTypes/Nested.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/FacetTypes/OpenRange.tsx","webpack:///./ClientApp/shared/components/hawksearch/models/Facets/FacetType.ts","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/Overrides.ts","webpack:///./ClientApp/styles/node-modules/@reach/dialog/styles.css","webpack:///./ClientApp/shared/components/VisuallyHiddenAnnouncementContext.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/PlaceholderImage.tsx","webpack:///./ClientApp/shared/components/svg/LockSVG.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/SearchBox/SearchSuggestionsList.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/SearchBox/SearchSuggestions.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/SearchBox/SearchBoxBase.tsx","webpack:///./ClientApp/shared/components/Spinner.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/SearchBox/GlobalSearchBox.tsx","webpack:///./ClientApp/services/AxiosHelper.ts","webpack:///./ClientApp/shared/components/hawksearch/components/svg/XCircleSVG.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/HawkSearch.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/PlaceholderFacetValue.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/PlaceholderFacet.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/svg/XSVG.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/Selections.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/svg/PlusSVG.tsx","webpack:///./ClientApp/shared/hooks/useWindowSize.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/FacetList.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/svg/LeftChevronSVG.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/svg/RightChevronSVG.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/Tools/Pager.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/Tools/ItemsPerPage.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/Tools/Pagination.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/ToolRow.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/ResultItem.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/SearchResultsLabel.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/svg/PlugSVG.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/NoResults.tsx","webpack:///./ClientApp/features/search/components/commerce/CompareProductAddToCart.HCL.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/data.HCL.ts","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Spinner.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/compare-items/CompareItemsTable.HCL.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/compare-items/CompareItemsModal.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Compare/CompareItems.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/compare-items/CompareItemsBar.tsx","webpack:///./ClientApp/shared/components/svg/ListSVG.tsx","webpack:///./ClientApp/shared/components/svg/GridSVG.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/PlaceholderItem.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/ResultListing.HCL.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/Results.HCL.tsx","webpack:///./ClientApp/features/search/components/DefaultResultItem.tsx","webpack:///./ClientApp/features/search/components/commerce/ProductAddToCart.tsx","webpack:///./ClientApp/features/search/components/commerce/ProductResultItem.tsx","webpack:///./ClientApp/features/search/components/RocResultItem.HCL.tsx","webpack:///./ClientApp/features/search/FacetsAndResults.tsx","webpack:///./ClientApp/shared/components/hawksearch/util/History.ts","webpack:///./ClientApp/shared/components/hawksearch/components/QueryStringListener.tsx","webpack:///./ClientApp/shared/components/hawksearch/styles/app.scss?a7f7","webpack:///./ClientApp/styles/node-modules/@reach/tooltip/styles.css?c65c","webpack:///./ClientApp/styles/node-modules/@reach/tooltip/styles.css","webpack:///./ClientApp/shared/components/VisuallyHiddenAnnouncement.tsx","webpack:///./ClientApp/shared/edit/InlineAlert.tsx","webpack:///./ClientApp/shared/hooks/useRocEventHandler.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/StoreProvider.tsx","webpack:///./ClientApp/shared/components/svg/XSVG.tsx","webpack:///./ClientApp/services/UserData.ts","webpack:///./ClientApp/shared/util/ErrorBoundary.tsx","webpack:///./ClientApp/shared/util/AccountUrls.ts","webpack:///./ClientApp/features/tracking/trackers/hawksearch/tracking.ts","webpack:///./ClientApp/features/commerce/shopping-cart/types.ts","webpack:///./ClientApp/shared/components/hawksearch/store/Store.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Autocomplete/Suggestion.ts","webpack:///./ClientApp/shared/polyfills/getAttributeNames.js","webpack:///./ClientApp/shared/util/ApplicationInit.tsx","webpack:///./ClientApp/shared/components/hawksearch/util/Constants.ts","webpack:///./ClientApp/shared/components/hawksearch/helpers/Cookies.ts","webpack:///./ClientApp/shared/components/commerce/ProductPricing.tsx","webpack:///./ClientApp/shared/hooks/useDelayedDisplay.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/svg/PlusThinSVG.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/svg/MinusThinSVG.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Facets/Facet.tsx","webpack:///./ClientApp/shared/util/events/rocEventUtils.ts","webpack:///./ClientApp/shared/components/hawksearch/components/ConfigProvider.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/svg/DashCircleSVG.tsx","webpack:///../Roc.SharedClientApp/types/commerce/display-price.ts","webpack:///./ClientApp/shared/components/Modal.tsx","webpack:///./ClientApp/features/commerce/product-details/types.ts","webpack:///./ClientApp/shared/components/hawksearch/components/ui/SearchBox/SearchBox.tsx","webpack:///./ClientApp/features/search/SearchResultListener.tsx","webpack:///./ClientApp/features/search/SearchResults.tsx"],"names":["LocalizerResources","isAlreadyLogged","initializeLocalizerResources","windowWithResources","window","__ROC_LOCALIZER_RESOURCES__","Array","isArray","forEach","obj","Object","keys","key","Localizer","replaceStrings","length","console","warn","resource","replace","match","index","LocalizedSpan","props","resourceKey","args","localizedString","data-testid","toKebabCase","dangerouslySetInnerHTML","__html","searchState","__ROC_SEARCH_STATE__","RocHawkConfig","apiUrl","searchEndpoint","clientGuid","trackingKey","searchPageUrl","dashboardUrl","Constants","searchBoxPlaceholder","trackingUrl","recommendationUrl","recommendationEndpoint","enableRemovingDashesFromSearchKeyword","setSearchTracking","request","response","isLandingPage","CustomUrl","searchType","FacetSelections","MaxPerPage","PageNo","SearchType","Refinement","Initial","dispatchRocEvent","trackingId","TrackingId","CompareValueType","useHawkState","initialSearch","initialValue","typeConstructor","state","setState","config","useHawkConfig","client","HawkClient","pendingSearch","Keyword","SearchStore","isLoading","itemsToCompare","comparedResults","itemsToCompareIds","useState","value","prevState","newState","store","setStore","cancellationToken","getComparedItems","search","searchResults","searchParams","IsInPreview","isInPreview","ClientGuid","indexName","IndexName","validateQueryAndRemoveDash","axios","isCancel","error","requestError","Success","Response","setSearch","doHistory","undefined","setSearchSelections","selections","searchWithin","SearchWithin","useEffect","cts","CancelToken","source","token","cancel","actor","toggleFacetValue","facet","facetValue","negate","facetName","Name","facetField","selectionField","valueValue","Value","valueLabel","Label","facetSelections","isFacetSelected","selState","selectionIndex","FacetSelectionState","Selected","Negated","splice","push","setFacetValues","facetValues","clearFacet","clearFacetValue","NotSelected","clearAllFacets","setItemsToCompare","resultItem","isCheck","itemsArray","filter","item","DocId","map","setComparedResults","data","clearItemsToCompare","getCompareFieldValue","compareItem","fieldName","compareType","field","Document","find","Field","MultipleValueDecimal","parsedValues","rawValue","parseFloat","toFixed","toString","join","SingleValueString","MultipleValueString","CommerceEventTrackingType","CommercePageType","CommerceSuggestType","trackCommerce","eventName","toLocaleLowerCase","orderNo","itemList","total","subTotal","tax","currency","payload","EventType","sale","EventData","preparePayload","OrderNo","ItemList","Total","Tax","SubTotal","Currency","makeRequest","uniqueId","price","quantity","addToCart","UniqueId","Quantity","Price","trackAddToCart","itemsList","add2CartMultiple","ItemsList","TrackAddToCartMultiple","rate","trackRate","OrderMessageAction","OrderMessages","orderMessages","actions","messages","orderMessage","includes","messageAction","className","message","Category","init","SuggestionType","assign","Suggestion","CategoryStrategy","downshift","location","Url","Product","Results","Result","ProductStrategy","ProductName","Content","ContentStrategy","Popular","PopularStrategy","this","Categories","r","Products","CustomEvent","event","params","bubbles","cancelable","detail","evt","document","createEvent","initCustomEvent","prototype","Event","DownChevronSVG","rest","viewBox","classnames","focusable","aria-hidden","d","UpChevronSVG","Pagination","Items","i","PaginationItem","values","Sorting","SortingItem","Selections","selFacet","SelectionFacet","SelectionFacetValue","Swatch","Range","Facet","SwatchData","s","Ranges","Values","v","DisplayType","TruncateThreshold","IsSearch","SearchThreshold","ParamName","RuleType","RuleOperatorType","Rule","Parent","Rules","BannerTrigger","FeaturedItems","FeaturedItem","Merchandising","MerchandisingItem","PageContentItem","Trigger","PageContent","Facets","f","p","ContentType","OptionalAnchor","href","children","name","onClick","ResultImage","imageUrl","getDocumentValue","itemName","url","roctype","hasImage","setHasImage","imageLoaded","setImageLoaded","style","overflow","width","height","src","alt","onLoad","onError","showSpinner","useShoppingCart","useShoppingCartParams","order","setOrder","savedProducts","setSavedProducts","setCartSummary","setOrderMessages","updatingOrderItemId","setUpdatingOrderItemId","orderItemBeingRemovedId","setOrderItemBeingRemovedId","cartTotalItemCount","setCartTotalItemCount","updatingSavedProductId","setUpdatingSavedProductId","updatingSavedProductPricingLineId","setUpdatingSavedProductPricingLineId","savedProductBeingRemovedId","setSavedProductBeingRemovedId","savedProductBeingRemovedPricingLineId","setSavedProductBeingRemovedPricingLineId","storedForUndoItem","setStoredForUndoItem","storedForUndoItemIndex","setStoredForUndoItemIndex","lastMoveStatus","setLastMoveStatus","isUndoClicked","isUndoClickedState","setIsUndoClickedState","setError","errorMessage","setErrorMessage","errorType","setErrorType","orderIsUpdating","clearUndoState","dispatchAddToCartEvent","result","items","id","productId","adjustedQuantity","snapshotSalePrice","snapshotBasePrice","sku","snapshotCurrencyISO","productGroupId","updateCartState","cart","cartSummary","updateOrderMessages","itemsCount","recipients","reduce","itemsQty","orderRecipient","recipientQty","orderItem","itemId","AxiosHelper","post","productPricingLineId","savedProductsPageNumber","pagination","pageNumber","savedProductsPageSize","pageSize","addOns","validateAddOns","axiosError","exceptionCode","bulkAddToCart","element","productInfo","processedItems","addAllFromListToCurrentCart","shoppingListId","displayedItemsCount","shoppingListProductIds","selectedShoppingListProductIds","addAllFromListToNewCart","moveItemToSaved","itemToMove","product","pricingLine","recipient","recipientId","itemIndex","indexOf","MoveStatus","MovedToSaved","changeOrderItemQuantity","itemToUpdate","newQuantity","updateOrderItemAddOns","updatedAddOns","requestToken","Axios","cancelToken","removeOrderItem","itemToRemove","RemovedFromCart","addToSavedProducts","itemToAdd","moveSavedProductToCart","productToMoveId","productName","results","savedProductIndex","findIndex","addToOrderResult","lastMovedItem","MovedToCart","removeSavedProduct","productToRemoveId","productToRemoveName","savedProduct","delete","orderItemFromSaved","totalPrice","unitPrice","RemovedFromSaved","handleUndo","updateOrder","newCart","useInViewOnce","makeIterator","options","inViewHookResponse","useInView","viewed","setViewed","inView","newResponse","Symbol","iterator","LazyImage","placeholderImg","backgroundImg","delay","inactiveClassName","loadedClassName","threshold","ref","loadedClassDisplayed","setLoadedClassDisplayed","setTimeout","imageSrc","classes","backgroundImage","MagnifyingGlassSVG","trim","toCamelCase","word","toLowerCase","toUpperCase","stripHtml","html","tmp","createElement","innerHTML","textContent","innerText","addEllipsis","text","cutoff","substring","trimString","baseUrl","searchUrl","autocompleteUrl","recommendationWidgetUrl","compareItemsURL","ShoppingCartSVG","defaultProps","parseQueryStringToObject","URLSearchParams","parsed","multipleValues","split","x","parseLocation","searchRequest","parseSearchQueryString","queryObj","keyword","sort","pg","mpp","lp","PageId","lpurl","is100Coverage","pageId","SortBy","Number","Is100CoverageTurnedOn","Boolean","isPathLandingPage","pathname","path","endsWith","getSearchQueryString","queryStringValues","hasOwnProperty","Error","encodeURIComponent","escapedValues","unescapedValue","convertObjectToQueryString","String","api","content","__esModule","default","module","exports","locals","inputString","test","ServerData","windowWithServerData","__ROC_SERVER_DATA__","initializeServerData","QuestionMarkCircleSVG","stroke","strokeWidth","fill","fillRule","transform","AddedToCartAlert","displayAlert","setDisplayAlert","inline","displayPrice","selection","label","subtotal","type","CheckmarkSVG","class","PlusCircleSVG","Checkbox","useHawkSearch","useFacet","renderer","renderCheckMark","isSelected","renderFacetActions","isNegated","negateFacet","DashCircleSVG","FieldType","correspondingRange","c","rangeValueAssetUrl","AssetFullUrl","selectionState","selectFacet","aria-pressed","title","textDecoration","Count","renderTruncation","Search","hawkActor","input","setInput","searchInputRef","useRef","t","useTranslation","labelFor","FacetId","htmlFor","onChange","e","currentTarget","onKeyDown","current","aria-label","Link","LazyNumberFormat","React","lazy","SliderNumericInputs","sliderProps","minValue","setMinValue","maxValue","setMaxValue","reloadFacets","onValueChange","Suspense","fallback","Spinner","thousandSeparator","isCurrency","prefix","currencySymbol","min","max","newMinValue","isNaN","onBlur","decimalScale","decimalPrecision","newMaxValue","Rheostat","Slider","range","Math","floor","RangeMin","rangeMin","setMinRange","ceil","RangeMax","rangeMax","setMaxRange","RangeStart","rangeStart","setStartRange","RangeEnd","rangeEnd","setEndRange","IsCurrency","setIsCurrency","CurrencySymbol","setCurrencySymbol","paramName","selectedValues","newRange","minVal","maxVal","setFacets","currentMinValue","currentMaxValue","SwatchItem","swatchValue","swatchUrl","suffix","facetSwatch","AssetUrl","AssetName","getSwatchUrl","colorSwatchStyle","backgroundColor","Color","listItemClassNames","onSwatchSelected","isColor","NestedItem","isExpanded","setIsExpanded","shouldTruncate","isTruncated","setIsTruncated","hierarchyValue","hierarchyChildren","Children","remainingValues","shouldTruncateChildren","valuesBeforeTrunc","slice","onValueSelected","aria-expanded","Path","Nested","OpenRange","FacetType","setStartValue","setEndValue","startVal","endVal","data-type","defaultFacetComponents","facetType","component","DefaultCheckbox","NestedCheckbox","DefaultNestedCheckbox","DefaultSearch","DefaultLink","DefaultSlider","DefaultSwatch","DefaultOpenRange","defaultAutocompleteStrategies","strategy","getFacetComponents","overridedComponents","facetComponents","fType","fComponent","getAutocompleteStrategies","overridedStrategies","suggestionStrategies","sType","autocompleteStrategy","strategyMatch","___CSS_LOADER_API_IMPORT___","createContext","PlaceholderImage","LockSVG","SearchSuggestionsList","query","onViewMatches","popular","categories","products","PopularHeading","CategoryHeading","ProductHeading","ContentHeading","getItemProps","getMenuProps","highlightedIndex","isRecordEmpty","hasPopular","hasCategories","hasProducts","hasContent","hasAllEmpty","isAtleastOneExist","getAtleastOneExist","dynamicIndex","suggestType","TopProductMatches","Thumb","ViewAll","SearchSuggestions","setResults","setIsLoading","autocomplete","DisplayFullResponse","then","o","debounceMs","autocompleteDebounce","timeout","doAutocomplete","clearTimeout","Downshift","SearchBoxBase","onSubmit","strategies","autocompleteStrategies","isOpenOverride","setIsOpenOverride","stateReducer","changes","inputValue","itemToString","matchedStrategy","handleToString","handleItemChange","initialInputValue","isOpen","getInputProps","openMenu","showSuggestions","getLabelProps","relTarget","relatedTarget","onFocus","placeholder","light","waitMs","align","block","parentCentered","useDelayedDisplay","spinner","GlobalSearchBox","redirectToSearchPage","keywords","redirect","create","defaults","headers","common","interceptors","use","method","getCsrfToken","csrfToken","RequestVerificationToken","addUnauthorizedAccessInterceptor","history","status","AccountUrls","Login","Promise","reject","XCircleSVG","HawkSearch","PlaceholderFacetValue","round","random","PlaceholderFacet","numValues","_","XSVG","onFacetChange","clearSelection","negation","startsWith","displayValue","selectedRange","displayValueRange","renderRange","PlusSVG","useWindowSize","windowSize","setWindowSize","executeResizeDebounced","debounce","innerWidth","innerHeight","handleResize","addEventListener","removeEventListener","FacetList","scrollToResults","isFacetsOpen","setIsFacetsOpen","size","numPlaceholders","closeFacets","body","classList","remove","onFacetChanged","components","facetOverrides","isNoSelections","isNoHawkFacets","isMobile","add","IsVisible","registeredComponent","Component","LeftChevronSVG","RightChevronSVG","Pager","page","totalPages","onPageChange","setInputValue","hasError","setHasError","createGuid","goToPage","pageNo","doInputError","prevSearchParams","set","nextSearchParams","preventDefault","parseInt","ItemsPerPage","onChangeAndBlur","paginationItem","PageSize","NofPages","ToolRow","ResultItem","SearchResultsLabel","PlugSVG","svgProps","NoResults","CompareProductAddToCart","compareResultItem","modalOpen","setModalOpen","addToCartResponse","setAddToCartResponse","UseShoppingCartResult","errorTitle","AddToCartExceptionCode","cartFull","productOutOfStock","productUnavailable","handleAddToCart","Modal","renderTitle","closeModal","InlineAlert","theme","isTitleOnOwnRow","GetProductsPriceDetails","itemSkus","SendRequest","GetProductComparisonPriceDetails","isVisible","CompareItemsTableHCL","isLoadingPricing","setIsLoadingPricing","compareItems","productsPrices","ci","skus","matchingCustomPrice","Compare","CompareTableHeaders","CompareTableBody","itemHeaders","setItemHeaders","imageAltTag","docId","COMPARE_KEYS","compareFields","setCompareFields","compareValues","setCompareValues","distinctFields","valuesResult","valuesItem","fieldItem","CompareItemFieldValue","ProductPricing","JSON","parse","CompareItemsModal","resultItems","onModalToggle","popup","hideCloseButton","renderActions","Tooltip","CompareTiles","imageURL","onSelectTiles","as","CompareItems","onSelectCompareItems","clearItems","compareHidden","setCompareHidden","isCollapsed","disabled","CompareItemsBar","setPopup","Ids","resp","ErrorBoundary","ListSVG","GridSVG","PlaceholderItem","ResultListingHCL","pricingAndAvailability","ResultComponent","productPricingAndAvailability","testId","ResultsHCL","listView","ShowListView","setPricingAndAvailability","ToggleResultView","elem","querySelectorAll","role","DefaultResultItem","ProductAddToCart","outOfStock","ProductPriceRenderer","displayPriceStringified","roundValue","ProductResultItem","compareCheck","setCompareCheck","dispatchProductClickEvent","getSimpleDiscount","discount","salePrice","basePrice","getAmbiguousDiscount","displayRule","PriceDisplayRule","Normal","AmbiguousRange","GetSalePercentageSummary","getDocumentValues","hasChildSkus","checked","alert","RocHawkResultItemHCL","FacetsAndResults","RocResultItemHCL","setAlert","useContext","VisuallyHiddenAnnouncementContext","controlChanged","scroller","scrollTo","duration","smooth","focusEl","getElementById","focus","createBrowserHistory","doSearch","QueryStringListener","unlisten","listen","VisuallyHiddenAnnouncement","mainRef","setMainRef","Provider","aria-live","aria-atomic","onCollapse","isAxiosError","eventType","dispatchEvent","useRocEventHandler","eventHandler","deps","removeHandlerCallback","addRocEventHandler","HawkContext","StoreProvider","userDataPromise","getUserData","get","getUserDataNoCache","userData","lastRefreshedTimestamp","Date","localStorage","getItem","getTime","setItem","reload","renderError","renderProps","BaseUrl","ACCOUNT_URL_BASE","ACCOUNT_LOGIN_URL","Login2fa","ACCOUNT_LOGIN_WITH_2FA_URL","Register","ACCOUNT_REGISTER_URL","ForgotPassword","ACCOUNT_FORGOT_PASSWORD_URL","LoginWithRecoveryCode","ACCOUNT_LOGIN_WITH_RECOVERY_CODE_URL","Logout","ACCOUNT_LOGOUT_URL","OrganizationReview","ACCOUNT_ORGANIZATION_REVIEW_URL","OrganizationSelector","ACCOUNT_ORGANIZATION_SELECTOR_URL","ExternalLogout","EventTrackingType","PageType","SuggestType","substr","stringify","utf8Bytes","TextEncoder","encode","btoa","fromCharCode","TrackingUrl","visitId","getCookie","visitorId","isNewVisitor","setCookie","setTime","toUTCString","getVisitorExpiry","VisitId","VisitorId","TrackingProperties","Context","CustomDictionary","CustomContext","catch","initCustomEvents","readyState","ContextDictionary","existingValue","Tracking","track","pageType","documentElement","clientHeight","clientWidth","pageLoad","PageTypeId","RequestPath","Qs","ViewportHeight","ViewportWidth","typeId","queryId","QueryId","TypeId","trackSearchTracking","click","trackClick","bannerId","campaignId","bannerClick","CampaignId","BannerId","bannerImpression","trackBannerImpression","autoCompleteClick","widgetGuid","requestId","recommendationClick","ItemIndex","RequestId","WidgetGuid","trackRecommendationClick","OrderStatus","PaymentTypeEnum","CreditCardType","ExportStatus","initial","selectionIdx","negationIdx","selectedValue","selectionValue","matchingValue","findMatchingValue","clientSelections","facets","selectionValues","matchingVal","suggestionType","Element","getAttributeNames","attributes","getDataPropsFromAttributes","attributeName","getAttribute","initReactApp","getReactElement","elementId","ReactDOM","render","initReactAppByAttribute","attribute","elements","defaultApiUrl","defaultDashboardUrl","defaultSearchUrl","defaultAutocompleteUrl","defaultSearchPageUrl","defaultCompareItemsURL","defaultRecommendationUrl","getVisitExpiry","nameEQ","ca","cookie","charAt","expiry","expires","renderResult","css","priceClass","base","normalPrice","crossedOutPrice","highlightedPrice","GetCssClasses","Missing","basePriceClass","VariantPriceComponent","renderNormalPrice","roundedPrice","FormatAmbiguousPriceSpan","unitName","unit","renderAmbiguousPrice","FormatPrice","FormatPriceSpan","priceRange","from","to","display","setDisplay","PlusThinSVG","MinusThinSVG","LazyTooltip","FacetContext","searchActor","wrapperRef","setFilter","setTruncated","IsCollapsible","IsCollapsedDefault","setCollapsed","hasTooltip","shouldSearch","val","remainingFacets","contains","target","toggleCollapsible","aria-describedby","ScrollHeight","overflowY","facetStyle","handler","ConfigContext","context","ConfigProvider","assetPath","__webpack_public_path__","LazyDialog","Dialog","LazyDialogContent","DialogContent","LazyDialogOverlay","DialogOverlay","renderSubtitle","titleIcon","headerDivider","bypassFocusLock","subTitle","innerModal","ariaLabel","onDismiss","dangerouslyBypassFocusLock","getInitialProductDetailsState","__ROC_COMMERCE_PRODUCT_DETAILS__","InputAttributeType","ProductType","SearchBox","closeMenu","SearchResultListener","sessionStorage","HawkSearchTrackingId","SearchBoxPortal","searchBoxDom","searchBoxComponent","createPortal","App","hawkConfig"],"mappings":"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","file":"search-results.10cbf8ff.js","sourcesContent":["import { AddressResourceKeys } from 'features/address-book/resources';\r\nimport { ContactFormResourceKeys } from 'features/contact-form/resources';\r\nimport { CreatePasswordResourceKeys } from 'features/create-password/resources';\r\nimport { LoginWith2faResourceKeys } from 'features/login-with-2fa/resources';\r\nimport { LoginWithRecoveryCodeResourceKeys } from 'features/login-with-recovery-code/resources';\r\nimport { LoginResourceKeys } from 'features/login/resources';\r\nimport { MyAccountResourceKeys } from 'features/my-account/resources';\r\nimport { ResetPasswordResourceKeys } from 'features/reset-password/resources';\r\nimport { SubmitQuestionResourceKeys } from 'features/submit-question/resources';\r\nimport * as React from 'react';\r\nimport { toKebabCase } from 'util/StringUtil';\r\n\r\n// #region Commerce\r\nimport { CommerceResourceKeys } from 'features/commerce/CommerceResourceKeys';\r\n// #endregion\r\n\r\n// #region HCL\r\nimport { QuickBagsResourceKeys } from 'features/hcl/quick-bags/resources';\r\nimport { QuickLabelsResourceKeys } from 'features/hcl/quick-labels/resources';\r\nimport { ProductCatalogsResourceKeys } from 'features/hcl/product-catalogs/resources';\r\nimport { FileUploadResourceKeys } from 'features/hcl/file-upload/resources';\r\nimport { NewsletterKeys } from 'features/hcl/newsletter-signup/resources';\r\n// #endregion\r\n\r\n/**\r\n * Type that will hold all the global localization keys\r\n */\r\ntype LocalizerGlobalResourceKeys =\r\n\t| 'Success'\r\n\t| 'OfTotalPages'\r\n\t| 'Cancel'\r\n\t| 'Confirm'\r\n\t| 'FirstName'\r\n\t| 'LastName'\r\n\t| 'Email'\r\n\t| 'Username'\r\n\t| 'Amount'\r\n\t| 'NameOnCard'\r\n\t| 'CardNumber'\r\n\t| 'ExpDate'\r\n\t| 'ExpMonth'\r\n\t| 'ExpYear'\r\n\t| 'Expires'\r\n\t| 'Expired'\r\n\t| 'SecurityCode'\r\n\t| 'Submit'\r\n\t| 'Save'\r\n\t| 'ZipCode'\r\n\t| 'Remove'\r\n\t| 'Removed'\r\n\t| 'Update'\r\n\t| 'Undo'\r\n\t| 'Cancel'\r\n\t| 'Enter'\r\n\t| 'Close'\r\n\t| 'SortBy'\r\n\t| 'PleaseWait'\r\n\t| 'Unknown'\r\n\t| 'Yes'\r\n\t| 'No'\r\n\t| 'Delete'\r\n\t| 'Update'\r\n\t| 'SaveAndContinueButtonText'\r\n\t| 'SaveAndContinue'\r\n\t| 'Continue'\r\n\t| 'SaveErrorMessage'\r\n\t| 'Edit'\r\n\t| 'ErrorMessageGenericTitle'\r\n\t| 'CheckEnteredValues'\r\n\t| 'ErrorMessageForbidden'\r\n\t| 'ErrorMessageNetwork'\r\n\t| 'ErrorOccurredSubmittingTheForm'\r\n\t| 'UnexpectedErrorOccurred'\r\n\t| 'Login'\r\n\t| 'ReturnToShipping'\r\n\t| 'BreadcrumbsLabel'\r\n\t| 'Other'\r\n\t| 'RememberMe'\r\n\t| 'ForgotYourPassword'\r\n\t| 'RegisterNewUserLinkText'\r\n\t| 'LoginPageTitleText'\r\n\t| 'ForgotPasswordPageTitle'\r\n\t| 'ForgotPasswordConfirmationPageTitle'\r\n\t| 'ForgotPasswordConfirmation'\r\n\t| 'Optional'\r\n\t| 'SearchBoxPlaceholder'\r\n\t| 'XOutOfYStars'\r\n\t| 'XToYOfZ'\r\n\t| 'ModalLabel'\r\n\t| 'RequiredFields'\r\n\t| 'Status'\r\n\t| 'Version'\r\n\t| 'CreatedOn'\r\n\t| 'CreatedBy'\r\n\t| 'ModifiedOn'\r\n\t| 'ModifiedBy'\r\n\t| 'OpenStatusInformation'\r\n\t| 'CloseStatusInformation'\r\n\t| 'SearchFilter'\r\n\t| 'Pagination'\r\n\t| 'Previous'\r\n\t| 'Next'\r\n\t| 'ClearFilter';\r\n\r\n/**\r\n * Type that will hold all the localization keys\r\n */\r\nexport type LocalizerResourceKey =\r\n\t| LocalizerGlobalResourceKeys\r\n\t| LoginResourceKeys\r\n\t| ContactFormResourceKeys\r\n\t// #region Commerce\r\n\t| CommerceResourceKeys\r\n\t// #endregion\r\n\t| ResetPasswordResourceKeys\r\n\t| CreatePasswordResourceKeys\r\n\t| SubmitQuestionResourceKeys\r\n\t| ResetPasswordResourceKeys\r\n\t| CreatePasswordResourceKeys\r\n\t| MyAccountResourceKeys\r\n\t| LoginWith2faResourceKeys\r\n\t| LoginWithRecoveryCodeResourceKeys\r\n\t| AddressResourceKeys\r\n\t// #region HCL\r\n\t| QuickBagsResourceKeys\r\n\t| QuickLabelsResourceKeys\r\n\t| ProductCatalogsResourceKeys\r\n\t| NewsletterKeys\r\n\t| FileUploadResourceKeys;\r\n// #endregion\r\n\r\n/**\r\n * Interface for the resources\r\n *\r\n * @export\r\n * @interface LocalizerResource\r\n */\r\ninterface LocalizerResource {\r\n\t[id: string]: string;\r\n}\r\n\r\n/**\r\n * Extends Window with a property that will hold the localizer resources\r\n *\r\n * @interface WindowWithResources\r\n * @extends {Window}\r\n */\r\nexport interface WindowWithResources extends Window {\r\n\t__ROC_LOCALIZER_RESOURCES__?: LocalizerResource[];\r\n}\r\n\r\n/**\r\n * Main object that will hold all the localized resources\r\n */\r\nconst LocalizerResources: LocalizerResource = {};\r\n\r\n/**\r\n * To prevent redundant logging\r\n */\r\nconst isAlreadyLogged: Record = {};\r\n\r\n/**\r\n * Initializer function that will populate the main localized resources object\r\n */\r\nfunction initializeLocalizerResources() {\r\n\tconst windowWithResources = window as WindowWithResources;\r\n\r\n\tif (\r\n\t\twindowWithResources &&\r\n\t\twindowWithResources.__ROC_LOCALIZER_RESOURCES__ &&\r\n\t\tArray.isArray(windowWithResources.__ROC_LOCALIZER_RESOURCES__)\r\n\t) {\r\n\t\twindowWithResources.__ROC_LOCALIZER_RESOURCES__.forEach((obj) => {\r\n\t\t\tfor (const key of Object.keys(obj)) {\r\n\t\t\t\tLocalizerResources[key] = obj[key];\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n\r\n/**\r\n * Function that can be used to load the localized strings with support to parameter replacements\r\n *\r\n * @export\r\n * @param {string} key\r\n * @param {...string[]} replaceStrings\r\n * @returns\r\n */\r\nexport function Localizer(\r\n\tkey: TResourceKey,\r\n\t...replaceStrings: string[]\r\n) {\r\n\tif (Object.keys(LocalizerResources).length === 0) {\r\n\t\tinitializeLocalizerResources();\r\n\t}\r\n\r\n\tif (!LocalizerResources || !LocalizerResources[key]) {\r\n\t\t// if running in a test environment, just skip any warnings.\r\n\t\tif (process.env.NODE_ENV !== 'test') {\r\n\t\t\tif (!isAlreadyLogged[key]) {\r\n\t\t\t\tconsole.warn(key, 'Localizer Resource not found. Key will be used instead.');\r\n\t\t\t\tisAlreadyLogged[key] = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn key;\r\n\t}\r\n\r\n\tconst resource = LocalizerResources[key];\r\n\r\n\tif (!replaceStrings) {\r\n\t\treturn resource;\r\n\t}\r\n\r\n\treturn resource.replace(/{(\\d+)}/g, (match: string, index: number) => {\r\n\t\treturn replaceStrings[index] ? replaceStrings[index] : '';\r\n\t});\r\n}\r\n\r\n/**\r\n * Interface for the LocalizedSpan component\r\n *\r\n * @interface LocalizedSpanProps\r\n */\r\ninterface LocalizedSpanProps {\r\n\tresourceKey: LocalizerResourceKey;\r\n\targs?: string[];\r\n}\r\n\r\n/**\r\n * Component responsible for the initialization of the react app\r\n */\r\nexport function LocalizedSpan(props: LocalizedSpanProps) {\r\n\tconst { resourceKey, args = [] } = props;\r\n\tconst localizedString = Localizer(resourceKey, ...args);\r\n\r\n\treturn (\r\n\t\t\r\n\t);\r\n}\r\n","import { HawkSearchConfig } from 'shared/components/hawksearch/types/HawkSearchConfig';\r\nimport * as Constants from 'util/Constants';\r\nimport { Localizer } from 'services/Localizer';\r\n\r\nconst searchState = (window as any).__ROC_SEARCH_STATE__;\r\n\r\nconst RocHawkConfig: HawkSearchConfig = {\r\n\tapiUrl: searchState.searchEndpoint as string,\r\n\tclientGuid: searchState.trackingKey as string,\r\n\tsearchPageUrl: (searchState.searchPageUrl as string) || '/search',\r\n\tdashboardUrl: (searchState.dashboardUrl as string) || Constants.defaultDashboardUrl,\r\n\tsearchBoxPlaceholder: Localizer('SearchBoxPlaceholder'),\r\n\ttrackingUrl: searchState.trackingUrl as string,\r\n\t/* #region Commerce */\r\n\trecommendationUrl: searchState.recommendationEndpoint as string,\r\n\tenableRemovingDashesFromSearchKeyword: searchState.enableRemovingDashesFromSearchKeyword as boolean,\r\n\t/* #endregion */\r\n};\r\n\r\nexport default RocHawkConfig;\r\n","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable no-unused-vars */\r\nimport { SearchType } from 'features/tracking/trackers/hawksearch/tracking';\r\nimport { Response, Request } from 'models/Search';\r\nimport { dispatchRocEvent } from 'shared/hooks/useRocEventHandler';\r\n\r\n/**\r\n * Dispatches hawk search page tracking events based on search request\r\n */\r\nexport function setSearchTracking(request: Partial, response: Response) {\r\n\tconst isLandingPage: boolean = !!request.CustomUrl;\r\n\tconst hasFacetSelections: boolean =\r\n\t\trequest.FacetSelections && Object.keys(request.FacetSelections).length > 0 ? true : false;\r\n\r\n\tconst searchType: SearchType =\r\n\t\t!hasFacetSelections && !request.MaxPerPage && !request.PageNo ? SearchType.Initial : SearchType.Refinement;\r\n\r\n\tif (isLandingPage) {\r\n\t\tdispatchRocEvent('hawk-landing-page-viewed', {});\r\n\t} else {\r\n\t\tdispatchRocEvent('hawk-search-tracking', { trackingId: response.TrackingId, searchType: searchType });\r\n\t}\r\n}\r\n","import { useEffect } from 'react';\r\nimport axios, { CancelToken } from 'axios';\r\nimport { SearchStore, FacetSelectionState } from './Store';\r\nimport HawkClient from 'net/HawkClient';\r\nimport { Response, Request, FacetSelections, Result } from 'models/Search';\r\nimport { useMergableState } from 'util/MergableState';\r\nimport { useHawkConfig } from 'components/ConfigProvider';\r\nimport { Facet, Value } from 'models/Facets';\r\nimport { Response as CompareDataResponse, Request as CompareItemRequest } from 'models/CompareItems';\r\nimport { CompareResultObject } from '../models/CompareResultObject';\r\nimport { setSearchTracking } from '../util/SearchTracking';\r\n// #region HCL\r\nimport { validateQueryAndRemoveDash } from '../components/hcl/util';\r\n// #endregion\r\n\r\nexport interface SearchActor {\r\n\t/**\r\n\t * Performs a search with the currently configured pending search request. The search request can be\r\n\t * configured via the `setSearch` method. This method usually doesn't need to be called directly, as\r\n\t * the `StoreProvider` component will usually trigger searches directly in response to calls to\r\n\t * `setSearch`.\r\n\t * @returns A promise that resolves when the search request has been completed.\r\n\t */\r\n\tsearch(cancellationToken?: CancelToken): Promise;\r\n\r\n\t/**\r\n\t * Configures the next search request that will be executed. This will also execute a search in response to\r\n\t * the next search request changing.\r\n\t * @param search The partial search request object. This will be merged with previous calls to `setSearch`.\r\n\t * @param doHistory Whether or not this search request will push a history entry into the browser. If\r\n\t * \t\t\t\t\tnot specified, the default is `true`.\r\n\t */\r\n\tsetSearch(search: Partial, doHistory?: boolean): void;\r\n\r\n\t/**\r\n\t * Toggles a facet value for the next search request that will be executed. If the given facet had previously\r\n\t * been selected, it will be unselected. If the negation state of a selected facet is changed, the selection\r\n\t * will have its negation state changed. Internally, this will call `setSearch` to configure the next search\r\n\t * with this selected facet.\r\n\t * @param facet The facet for which the value is being selected.\r\n\t * @param facetValue The facet value being selected.\r\n\t * @param negate Whether or not this selection is considered a negation.\r\n\t */\r\n\ttoggleFacetValue(facet: Facet | string, facetValue: Value | string, negate?: boolean): void;\r\n\r\n\tsetFacetValues(facet: Facet | string, facetValues: Value[] | string[]): void;\r\n\r\n\t/**\r\n\t * Entirely clears all the values of the given facet from the current selection.\r\n\t * @param facet The facet to clear.\r\n\t */\r\n\tclearFacet(facet: Facet | string): void;\r\n\r\n\t/**\r\n\t * Clears a given facet value of the given facet from the current selection.\r\n\t * @param facet The facet to clear.\r\n\t * @param facetValue The facet value to clear.\r\n\t */\r\n\tclearFacetValue(facet: Facet | string, facetValue?: Value | string): void;\r\n\r\n\t/**\r\n\t * Clears all selected facets from the current selection.\r\n\t */\r\n\tclearAllFacets(): void;\r\n\r\n\t// Store items to make comparision via request\r\n\tsetItemsToCompare(resultItem: Result, isCheck: boolean): void;\r\n\r\n\t// To store items after getting the results from compare request\r\n\tsetComparedResults(comparedResults: CompareResultObject[]): void;\r\n\r\n\t// Clear stored compared items\r\n\tclearItemsToCompare(): void;\r\n\r\n\t// Get comparision of items from request\r\n\tgetComparedItems(request: CompareItemRequest, cancellationToken?: CancelToken): Promise;\r\n\r\n\t/** Gets the value for a given field of a compared item */\r\n\tgetCompareFieldValue(\r\n\t\tcompareItem: CompareResultObject,\r\n\t\tfieldName: string,\r\n\t\tcompareType: CompareValueType,\r\n\t): string | undefined;\r\n}\r\n\r\n/** The format expected for a compare value */\r\nexport enum CompareValueType {\r\n\tSingleValueString = 0,\r\n\tMultipleValueString = 1,\r\n\tMultipleValueDecimal = 2,\r\n}\r\n\r\nexport function useHawkState(initialSearch?: Partial): [SearchStore, SearchActor] {\r\n\tconst { config } = useHawkConfig();\r\n\r\n\tconst client = new HawkClient(config);\r\n\r\n\tconst pendingSearch: Partial = initialSearch || { Keyword: '', FacetSelections: {} };\r\n\r\n\tconst [store, setStore] = useMergableState(\r\n\t\tnew SearchStore({\r\n\t\t\tpendingSearch,\r\n\t\t\tisLoading: true,\r\n\t\t\titemsToCompare: [],\r\n\t\t\tcomparedResults: [],\r\n\t\t\titemsToCompareIds: [],\r\n\t\t}),\r\n\t\tSearchStore,\r\n\t);\r\n\r\n\tuseEffect(() => {\r\n\t\t// when the pending search changes, trigger a search\r\n\r\n\t\tconst cts = axios.CancelToken.source();\r\n\t\tsearch(cts.token);\r\n\r\n\t\treturn () => {\r\n\t\t\tcts.cancel();\r\n\t\t};\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [store.pendingSearch]);\r\n\r\n\t/**\r\n\t * Performs a comparision between two or more than two products based on ID\r\n\t * user can use this method from view application.\r\n\t * @returns A promise that resolves when the compare request has been completed.\r\n\t */\r\n\tasync function getComparedItems(\r\n\t\trequest: CompareItemRequest,\r\n\t\tcancellationToken?: CancelToken,\r\n\t): Promise {\r\n\t\treturn await client.getComparedItems(request, cancellationToken);\r\n\t}\r\n\r\n\t/**\r\n\t * Performs a search with the currently configured pending search request. The search request can be\r\n\t * configured via the `setSearch` method. This method usually doesn't need to be called directly, as\r\n\t * the `StoreProvider` component will usually trigger searches directly in response to calls to\r\n\t * `setSearch`.\r\n\t * @returns A promise that resolves when the search request has been completed.\r\n\t */\r\n\tasync function search(cancellationToken?: CancelToken): Promise {\r\n\t\tsetStore({ isLoading: true });\r\n\r\n\t\tlet searchResults: Response | null = null;\r\n\r\n\t\tconst searchParams = {\r\n\t\t\t// the search request being executed is spread from the pendingSearch\r\n\t\t\t...store.pendingSearch,\r\n\t\t\t// pass parameter for extended response\r\n\t\t\tIsInPreview: config.isInPreview,\r\n\t\t\t// and override some of the request fields with config values\r\n\t\t\tClientGuid: config.clientGuid,\r\n\t\t};\r\n\r\n\t\t// The index name in the configuration takes priority over the one supplied from the URL\r\n\t\tif (config.indexName) {\r\n\t\t\tsearchParams.IndexName = config.indexName;\r\n\t\t}\r\n\r\n\t\t// #region HCL\r\n\t\tif (config?.enableRemovingDashesFromSearchKeyword) {\r\n\t\t\tsearchParams.Keyword = validateQueryAndRemoveDash(searchParams.Keyword);\r\n\t\t}\r\n\t\t// #endregion\r\n\r\n\t\ttry {\r\n\t\t\tsearchResults = await client.search(searchParams, cancellationToken);\r\n\t\t} catch (error) {\r\n\t\t\tif (axios.isCancel(error)) {\r\n\t\t\t\t// if the request was cancelled, it's because this component was updated\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconsole.error('Search request error:', error);\r\n\t\t\tsetStore({ requestError: true });\r\n\t\t}\r\n\r\n\t\tsetStore({ isLoading: false });\r\n\r\n\t\tif (searchResults) {\r\n\t\t\tif (!searchResults.Success) {\r\n\t\t\t\tconsole.error('Search result error:', searchResults);\r\n\t\t\t\tsetStore({ requestError: true });\r\n\t\t\t} else {\r\n\t\t\t\tsetStore({\r\n\t\t\t\t\tsearchResults: new Response(searchResults),\r\n\t\t\t\t\trequestError: false,\r\n\t\t\t\t});\r\n\t\t\t\t// tracking search event changes\r\n\t\t\t\tsetSearchTracking(pendingSearch, searchResults);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Configures the next search request that will be executed. This will also execute a search in response to\r\n\t * the next search request changing.\r\n\t * @param search The partial search request object. This will be merged with previous calls to `setSearch`.\r\n\t * @param doHistory Whether or not this search request will push a history entry into the browser. If\r\n\t * \t\t\t\t\tnot specified, the default is `true`.\r\n\t */\r\n\tfunction setSearch(pendingSearch: Partial, doHistory?: boolean): void {\r\n\t\tif (doHistory === undefined) {\r\n\t\t\tdoHistory = true;\r\n\t\t}\r\n\r\n\t\tsetStore((prevState) => {\r\n\t\t\tconst newState = {\r\n\t\t\t\tpendingSearch: { ...prevState.pendingSearch, ...pendingSearch },\r\n\t\t\t\tdoHistory,\r\n\t\t\t};\r\n\t\t\tif (newState.pendingSearch.Keyword === '') {\r\n\t\t\t\tnewState.pendingSearch.Keyword = undefined;\r\n\t\t\t}\r\n\r\n\t\t\treturn newState;\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the facet selections and search within configuration for the next search request. This will also\r\n\t * clear the page number of the next request to display the first page of results.\r\n\t * @param selections The facet selections to set.\r\n\t * @param searchWithin The search within value to set.\r\n\t */\r\n\tfunction setSearchSelections(selections?: FacetSelections, searchWithin?: string) {\r\n\t\tsetSearch({\r\n\t\t\tFacetSelections: selections,\r\n\t\t\tSearchWithin: searchWithin,\r\n\r\n\t\t\t// when we change facet selections, also clear the current page so that we navigate\r\n\t\t\t// back to the first page of results\r\n\t\t\tPageNo: undefined,\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Toggles a facet value for the next search request that will be executed. Internally, this will call\r\n\t * `setSearch` to configure the next search with this selected facet.\r\n\t * @param facet The facet for which the value is being selected.\r\n\t * @param facetValue The facet value being selected.\r\n\t * @param negate Whether or not this selection is considered a negation.\r\n\t */\r\n\tfunction toggleFacetValue(facet: Facet | string, facetValue: Value | string, negate?: boolean): void {\r\n\t\tif (negate === undefined) {\r\n\t\t\tnegate = false;\r\n\t\t}\r\n\r\n\t\tconst facetName: string = typeof facet === 'string' ? facet : facet.Name;\r\n\t\tconst facetField = typeof facet === 'string' ? facet : facet.selectionField;\r\n\r\n\t\t/* #region HCL */\r\n\t\tconst valueValue = (typeof facetValue === 'string' ? facetValue : facetValue.Value)?.replace(/%c%/g, ',');\r\n\t\t/* #endregion */\r\n\t\tconst valueLabel = typeof facetValue === 'string' ? facetValue : facetValue.Label;\r\n\r\n\t\tif (!valueValue) {\r\n\t\t\tconsole.error(`Facet ${facetName} (${facetField}) has no facet value for ${valueLabel}`);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet facetSelections = store.pendingSearch.FacetSelections;\r\n\r\n\t\t// handle `searchWithin` facet, which isn't a facet selection but is instead a field on the\r\n\t\t// search request.\r\n\t\tif (facetField === 'searchWithin') {\r\n\t\t\t// set the search within to the facet value provided\r\n\t\t\tsetSearchSelections(facetSelections, /* searchWithin */ valueValue);\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!facetSelections) {\r\n\t\t\tfacetSelections = {};\r\n\t\t}\r\n\r\n\t\tif (!facetSelections[facetField]) {\r\n\t\t\tfacetSelections[facetField] = [];\r\n\t\t}\r\n\r\n\t\tconst { state: selState, selectionIndex } = store.isFacetSelected(facet, facetValue);\r\n\r\n\t\tif (selState === FacetSelectionState.Selected || selState === FacetSelectionState.Negated) {\r\n\t\t\t// we're selecting this facet, and it's already selected\r\n\r\n\t\t\t// first, remove it from our selections\r\n\t\t\tfacetSelections[facetField]!.splice(selectionIndex!, 1);\r\n\r\n\t\t\tif (\r\n\t\t\t\t(selState === FacetSelectionState.Selected && negate) ||\r\n\t\t\t\t(selState === FacetSelectionState.Negated && !negate)\r\n\t\t\t) {\r\n\t\t\t\t// if we're toggling from negation to non-negation or vice versa, then push the new selection\r\n\t\t\t\tfacetSelections[facetField]!.push(negate ? `-${valueValue}` : valueValue);\r\n\t\t\t} else {\r\n\t\t\t\t// if we're not toggling the negation, nothing to do because we already removed the selection above\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// not selected, so we want to select it\r\n\t\t\tfacetSelections[facetField]!.push(negate ? `-${valueValue}` : valueValue);\r\n\t\t}\r\n\r\n\t\tif (facetSelections[facetField]!.length === 0) {\r\n\t\t\t// clean up any facets that no longer have any selected facet values\r\n\t\t\tdelete facetSelections[facetField];\r\n\t\t}\r\n\r\n\t\tsetSearchSelections(facetSelections, store.pendingSearch.SearchWithin);\r\n\t}\r\n\r\n\tfunction setFacetValues(facet: Facet | string, facetValues: Value[] | string[]): void {\r\n\t\tconst facetName = typeof facet === 'string' ? facet : facet.Name;\r\n\t\tconst facetField = typeof facet === 'string' ? facet : facet.selectionField;\r\n\r\n\t\tlet facetSelections = store.pendingSearch.FacetSelections;\r\n\r\n\t\tif (!facetSelections) {\r\n\t\t\tfacetSelections = {};\r\n\t\t}\r\n\r\n\t\tfacetSelections[facetField] = [];\r\n\r\n\t\tfor (const facetValue of facetValues) {\r\n\t\t\tconst valueValue = typeof facetValue === 'string' ? facetValue : facetValue.Value;\r\n\t\t\tconst valueLabel = typeof facetValue === 'string' ? facetValue : facetValue.Label;\r\n\r\n\t\t\tif (!valueValue) {\r\n\t\t\t\tconsole.error(`Facet ${facetName} (${facetField}) has no facet value for ${valueLabel}`);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tfacetSelections[facetField]!.push(valueValue);\r\n\t\t}\r\n\r\n\t\tsetSearchSelections(facetSelections, store.pendingSearch.SearchWithin);\r\n\t}\r\n\r\n\t/**\r\n\t * Entirely clears all the values of the given facet from the current selection.\r\n\t * @param facet The facet to clear.\r\n\t */\r\n\tfunction clearFacet(facet: Facet | string) {\r\n\t\tconst facetField = typeof facet === 'string' ? facet : facet.selectionField;\r\n\r\n\t\tconst facetSelections = store.pendingSearch.FacetSelections;\r\n\r\n\t\t// handle `searchWithin` facet, which isn't a facet selection but is instead a field on the\r\n\t\t// search request.\r\n\t\tif (facetField === 'searchWithin') {\r\n\t\t\t// set searchWithin to undefined to clear it\r\n\t\t\tsetSearchSelections(facetSelections, /* searchWithin */ undefined);\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!facetSelections || !facetSelections[facetField]) {\r\n\t\t\t// if there are no facet selections or the facet isn't selected at all, there's nothing to clear\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdelete facetSelections[facetField];\r\n\r\n\t\tsetSearchSelections(facetSelections, store.pendingSearch.SearchWithin);\r\n\t}\r\n\r\n\t/**\r\n\t * Clears a given facet value of the given facet from the current selection.\r\n\t * @param facet The facet to clear.\r\n\t * @param facetValue The facet value to clear.\r\n\t */\r\n\tfunction clearFacetValue(facet: Facet | string, facetValue: Value | string) {\r\n\t\tconst facetName = typeof facet === 'string' ? facet : facet.Name;\r\n\t\tconst facetField = typeof facet === 'string' ? facet : facet.selectionField;\r\n\r\n\t\tconst valueValue = typeof facetValue === 'string' ? facetValue : facetValue.Value;\r\n\t\tconst valueLabel = typeof facetValue === 'string' ? facetValue : facetValue.Label;\r\n\r\n\t\tif (!valueValue) {\r\n\t\t\tconsole.error(`Facet ${facetName} (${facetField}) has no facet value for ${valueLabel}`);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// handle `searchWithin` facet, which isn't a facet selection but is instead a field on the\r\n\t\t// search request.\r\n\t\tif (facetField === 'searchWithin') {\r\n\t\t\t// set searchWithin to undefined to clear it\r\n\t\t\tsetSearchSelections(store.pendingSearch.FacetSelections, /* searchWithin */ undefined);\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst { state: selState, selectionIndex } = store.isFacetSelected(facet, facetValue);\r\n\r\n\t\tif (selState === FacetSelectionState.NotSelected) {\r\n\t\t\t// if there are no facet selections or the facet isn't selected at all, there's nothing to clear\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst facetSelections = store.pendingSearch.FacetSelections!;\r\n\r\n\t\t// remove it from the selections\r\n\t\tfacetSelections[facetField]!.splice(selectionIndex!, 1);\r\n\r\n\t\tif (facetSelections[facetField]!.length === 0) {\r\n\t\t\t// clean up any facets that no longer have any selected facet values\r\n\t\t\tdelete facetSelections[facetField];\r\n\t\t}\r\n\r\n\t\tsetSearchSelections(facetSelections, store.pendingSearch.SearchWithin);\r\n\t}\r\n\r\n\t/**\r\n\t * Clears all selected facets from the current selection.\r\n\t */\r\n\tfunction clearAllFacets(): void {\r\n\t\tsetSearchSelections();\r\n\t}\r\n\r\n\tfunction setItemsToCompare(resultItem: Result, isCheck: boolean): void {\r\n\t\tlet itemsArray = [...store.itemsToCompare];\r\n\t\tif (isCheck) {\r\n\t\t\t// append\r\n\t\t\titemsArray = [...itemsArray, ...[resultItem]];\r\n\t\t} else {\r\n\t\t\t// filter out\r\n\t\t\titemsArray = itemsArray.filter((item) => item.DocId !== resultItem.DocId);\r\n\t\t}\r\n\t\t// setStore({ itemsToCompare: itemsArray });\r\n\t\tsetStore({\r\n\t\t\titemsToCompare: itemsArray,\r\n\t\t\titemsToCompareIds: itemsArray.map((item) => item.DocId),\r\n\t\t});\r\n\t}\r\n\r\n\tfunction setComparedResults(data: CompareResultObject[]): void {\r\n\t\tsetStore({\r\n\t\t\tcomparedResults: data,\r\n\t\t});\r\n\t}\r\n\r\n\tfunction clearItemsToCompare() {\r\n\t\tsetStore({\r\n\t\t\titemsToCompare: [],\r\n\t\t\titemsToCompareIds: [],\r\n\t\t});\r\n\t}\r\n\r\n\t/** Gets the value for a given field of a compared item */\r\n\tfunction getCompareFieldValue(compareItem: CompareResultObject, fieldName: string, compareType: CompareValueType) {\r\n\t\tconst field = compareItem.Document.find((item) => item.Field === fieldName);\r\n\r\n\t\tif (field == null || field.Value.length === 0) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\tswitch (compareType) {\r\n\t\t\tcase CompareValueType.MultipleValueDecimal:\r\n\t\t\t\t// Parse decimal values and then join them together into a comma-separated list\r\n\t\t\t\tconst parsedValues: string[] = [];\r\n\t\t\t\tfor (const rawValue of field.Value) {\r\n\t\t\t\t\tparsedValues.push(parseFloat(rawValue).toFixed(1).toString());\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn parsedValues.join(', ');\r\n\t\t\tcase CompareValueType.SingleValueString:\r\n\t\t\t\treturn field.Value[0];\r\n\t\t\tcase CompareValueType.MultipleValueString:\r\n\t\t\tdefault:\r\n\t\t\t\treturn field.Value.join(', ');\r\n\t\t}\r\n\t}\r\n\r\n\tconst actor: SearchActor = {\r\n\t\tsearch,\r\n\t\tsetSearch,\r\n\t\ttoggleFacetValue,\r\n\t\tsetFacetValues,\r\n\t\tclearFacet,\r\n\t\tclearFacetValue,\r\n\t\tclearAllFacets,\r\n\t\tsetItemsToCompare,\r\n\t\tsetComparedResults,\r\n\t\tclearItemsToCompare,\r\n\t\tgetComparedItems,\r\n\t\tgetCompareFieldValue,\r\n\t};\r\n\r\n\treturn [store, actor];\r\n}\r\n","import { useState, Dispatch } from 'react';\r\n\r\ntype SetStateAction = Partial | ((prevState: T) => Partial);\r\n\r\nexport function useMergableState(\r\n\tinitialValue: T,\r\n\ttypeConstructor: new (init: Partial) => T,\r\n): [T, Dispatch>] {\r\n\tconst [state, setState] = useState(new typeConstructor(initialValue));\r\n\r\n\tfunction setStateAndMerge(value: SetStateAction) {\r\n\t\tif (typeof value === 'function') {\r\n\t\t\t// if we're being passed a function, we're setting state in the form of setState(prevState => ...).\r\n\r\n\t\t\tsetState((prevState) => {\r\n\t\t\t\t// so we derive the new state from the previous state\r\n\t\t\t\tconst newState = value(prevState);\r\n\r\n\t\t\t\t// and then set the new merged state\r\n\t\t\t\treturn new typeConstructor({ ...prevState, ...newState });\r\n\t\t\t});\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// otherwise, the new state was simply passed in\r\n\t\tsetState((prevState) => {\r\n\t\t\t// merge state together and set it\r\n\t\t\treturn new typeConstructor({ ...prevState, ...value });\r\n\t\t});\r\n\t}\r\n\r\n\treturn [state, setStateAndMerge];\r\n}\r\n","import { ExtractEventParameters } from 'shared/events';\r\nimport { makeRequest, preparePayload } from '../../hawksearch/tracking';\r\n\r\nexport enum CommerceEventTrackingType {\r\n\taddToCart = 4,\r\n\trate = 5,\r\n\tsale = 6,\r\n\tadd2CartMultiple = 14,\r\n}\r\n\r\n/**\r\n * The page type\r\n */\r\nexport enum CommercePageType {\r\n\t/**\r\n\t * Item detail page (i.e. PDP)\r\n\t */\r\n\titem = 1,\r\n\t/**\r\n\t * Shopping Cart Page\r\n\t */\r\n\tcart = 3,\r\n\t/**\r\n\t * Order Confirmation Page\r\n\t */\r\n\torder = 4,\r\n}\r\n\r\nexport enum CommerceSuggestType {\r\n\tTopCategories = 2,\r\n\tTopProductMatches = 3,\r\n}\r\n\r\ntype CommerceHawkEvents =\r\n\t| ({ name: 'sale' } & TrackSaleArgs)\r\n\t| ({ name: 'add2cart' } & TrackAddToCartArgs)\r\n\t| ({ name: 'add2cartmultiple' } & TrackAddToCartMultipleArgs)\r\n\t| ({ name: 'rate' } & TrackRateArgs);\r\n\r\nexport type CommerceHawkEventType = CommerceHawkEvents['name'];\r\n\r\nexport function trackCommerce(\r\n\teventName: T,\r\n\targs: ExtractEventParameters,\r\n) {\r\n\tswitch (eventName.toLocaleLowerCase()) {\r\n\t\tcase 'sale':\r\n\t\t\t//HawkSearch.Tracking.track('sale', {orderNo: 'order_123',itemList: [{uniqueid: '123456789', itemPrice: 12.99, quantity: 2}], total: 25.98, subTotal: 22, tax: 3.98, currency: 'USD'});\r\n\t\t\treturn trackSale((args as unknown) as TrackSaleArgs);\r\n\t\tcase 'add2cart':\r\n\t\t\t//HawkSearch.Tracking.track('add2cart',{uniqueId: '123456789', price: 19.99, quantity: 3, currency: 'USD'});\r\n\t\t\treturn trackAddToCart((args as unknown) as TrackAddToCartArgs);\r\n\t\tcase 'add2cartmultiple':\r\n\t\t\t//HawkSearch.Tracking.track('add2cartmultiple', [{uniqueId: '123456789',price: 15.97,quantity: 1,currency: 'USD'},{uniqueId: '987465321', price: 18.00, quantity: 1, currency: 'USD'}]);\r\n\t\t\treturn TrackAddToCartMultiple((args as unknown) as TrackAddToCartMultipleArgs);\r\n\t\tcase 'rate':\r\n\t\t\t//HawkSearch.Tracking.track('rate', {uniqueId: '123456789',value: 3.00});\r\n\t\t\treturn trackRate((args as unknown) as TrackRateArgs);\r\n\t}\r\n}\r\n\r\nexport type TrackSaleItemArgs = {\r\n\t/**\r\n\t * Represents the unique identifier of a product. This should correspond to the value of the field set up as the primary key in the fields section of Hawksearch dashboard\r\n\t */\r\n\tuniqueId: string;\r\n\t/**\r\n\t * Represents a single item price\r\n\t */\r\n\titemPrice: number;\r\n\t/**\r\n\t * The number of items being added to the cart\r\n\t */\r\n\tquantity: number;\r\n};\r\n\r\ntype TrackSaleArgs = {\r\n\t/**\r\n\t * The alphanumeric value representing the order number\r\n\t */\r\n\torderNo: string;\r\n\t/**\r\n\t * Is an array of objects that stores information about items. To see object properties check Sale Item Info Model below.\r\n\t */\r\n\titemList: TrackSaleItemArgs[];\r\n\t/**\r\n\t * The actual order total amount\r\n\t */\r\n\ttotal?: number;\r\n\t/**\r\n\t * The order the sub total amoun\r\n\t */\r\n\tsubTotal?: number;\r\n\t/**\r\n\t * The tax value\r\n\t */\r\n\ttax?: number;\r\n\t/**\r\n\t * The actual currency in ISO format\r\n\t */\r\n\tcurrency?: string;\r\n};\r\n\r\nfunction trackSale({ orderNo, itemList, total, subTotal, tax, currency }: TrackSaleArgs) {\r\n\tconst payload = {\r\n\t\tEventType: CommerceEventTrackingType.sale,\r\n\t\tEventData: preparePayload({\r\n\t\t\tOrderNo: orderNo,\r\n\t\t\tItemList: itemList,\r\n\t\t\tTotal: total,\r\n\t\t\tTax: tax,\r\n\t\t\tSubTotal: subTotal,\r\n\t\t\tCurrency: currency,\r\n\t\t}),\r\n\t};\r\n\r\n\tmakeRequest(payload);\r\n}\r\n\r\nexport type TrackAddToCartArgs = {\r\n\t/**\r\n\t * Represents the unique identifier of a product. This should correspond to the value of the field set up as the primary key in the fields section of Hawksearch dashboard\r\n\t */\r\n\tuniqueId: string;\r\n\t/**\r\n\t * Represents a single item price\r\n\t */\r\n\tprice: number;\r\n\t/**\r\n\t * The number of items being added to the cart\r\n\t */\r\n\tquantity: number;\r\n\t/**\r\n\t * Actual currency in ISO format\r\n\t */\r\n\tcurrency: string;\r\n};\r\n\r\nfunction trackAddToCart({ uniqueId, price, quantity, currency }: TrackAddToCartArgs) {\r\n\tconst payload = {\r\n\t\tEventType: CommerceEventTrackingType.addToCart,\r\n\t\tEventData: preparePayload({\r\n\t\t\tUniqueId: uniqueId,\r\n\t\t\tQuantity: quantity,\r\n\t\t\tPrice: price,\r\n\t\t\tCurrency: currency,\r\n\t\t}),\r\n\t};\r\n\r\n\tmakeRequest(payload);\r\n}\r\n\r\ntype TrackAddToCartMultipleArgs = {\r\n\t/**\r\n\t * Is an array of objects that stores information about items\r\n\t */\r\n\titemsList: TrackAddToCartArgs[];\r\n};\r\n\r\nfunction TrackAddToCartMultiple({ itemsList }: TrackAddToCartMultipleArgs) {\r\n\tconst payload = {\r\n\t\tEventType: CommerceEventTrackingType.add2CartMultiple,\r\n\t\tEventData: preparePayload({\r\n\t\t\tItemsList: itemsList,\r\n\t\t}),\r\n\t};\r\n\r\n\tmakeRequest(payload);\r\n}\r\n\r\ntype TrackRateArgs = {\r\n\t/**\r\n\t * The unique identifier of an item. In many cases the uniqueId is different than SKU.\r\n\t */\r\n\tuniqueId: string;\r\n\t/**\r\n\t * Represents a user’s rating for an item. The decimal value must be between 1 and 5.\r\n\t */\r\n\tvalue: number;\r\n};\r\n\r\nfunction trackRate({ uniqueId, value }: TrackRateArgs) {\r\n\tconst payload = {\r\n\t\tEventType: CommerceEventTrackingType.rate,\r\n\t\tEventData: preparePayload({\r\n\t\t\tUniqueId: uniqueId,\r\n\t\t\tValue: value,\r\n\t\t}),\r\n\t};\r\n\tmakeRequest(payload);\r\n}\r\n","import React from 'react';\r\nimport { Localizer } from 'services/Localizer';\r\n\r\n/**\r\n * An alert sent to users regarding products or promotions\r\n */\r\nexport interface OrderMessage {\r\n\tmessage: string;\r\n\tmessageAction: OrderMessageAction;\r\n}\r\n\r\n/**\r\n * The level of action to be taken with an order message\r\n */\r\nexport enum OrderMessageAction {\r\n\tInfo = 'Info',\r\n\tWarning = 'Warning',\r\n\tError = 'Error',\r\n\tRedirectToCart = 'RedirectToCart',\r\n}\r\n\r\ninterface OrderMessagesProps {\r\n\torderMessages?: OrderMessage[];\r\n\tactions?: OrderMessageAction[];\r\n}\r\n\r\n/**\r\n * Custom component to notify the customer if cart has been updated which includes :\r\n * 1- Cart items pricing has been updated\r\n * 2- Cart Items availability has been updated\r\n * 3- Cart applied promotion expired\r\n */\r\nfunction OrderMessages(props: OrderMessagesProps) {\r\n\tconst { orderMessages, actions } = props;\r\n\r\n\tconst messages =\r\n\t\tactions == null\r\n\t\t\t? orderMessages\r\n\t\t\t: orderMessages?.filter((orderMessage) => actions?.includes(orderMessage.messageAction));\r\n\r\n\t// Component is omitted if actions filtered out all the messages or there were none to begin with\r\n\tif (messages == null || messages.length === 0) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\treturn (\r\n\t\t
\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t{Localizer('OrderMessagesText')}\r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t{messages.map((orderMessage, index) => (\r\n\t\t\t\t\t\t\t
  • \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
  • \r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t
\r\n\t);\r\n}\r\n\r\nexport default OrderMessages;\r\n","import { ClientData } from 'models/Search';\r\n\r\nexport class Request {\r\n\t/**\r\n\t * API Client Guid. Usually comes from the \"Tracking Key\" in the \"Account Info\" section of the hawk dashboard.\r\n\t */\r\n\tpublic ClientGuid: string;\r\n\r\n\t/**\r\n\t * Search term entered by a user. If keyword is not included, all items configured to be returned will be\r\n\t * returned. When this parameter is populated, the results will be matched against this term by the search\r\n\t * engine.\r\n\t */\r\n\tpublic Keyword?: string;\r\n\r\n\t/**\r\n\t * This is used by the Hawksearch Preview to set to true will display elements in a preview mode.\r\n\t *\r\n\t * You can use this if you desire additional score information returned.\r\n\t */\r\n\tpublic IsInPreview?: boolean;\r\n\r\n\tpublic Type?: 'Category' | 'Product' | 'Content' | 'Popular';\r\n\r\n\t/** The maximum number of results to return for selected @see Type */\r\n\tpublic ProductCount?: number;\r\n\r\n\t/** Flag set to true will display also full Document object from Elastic for Products and Content suggestions. */\r\n\tpublic DisplayFullResponse?: boolean;\r\n\r\n\t/**\r\n\t * An array of field names that will be returned in the response. If provided, only the fields listed will\r\n\t * be returned. If no FieldOverride value is sent, the Workbench configuration will be used.\r\n\t *\r\n\t * If the Skip from Custom flag is turned “on” for a field, it will not be returned in the response, even if\r\n\t * set in the FieldOverride parameter.\r\n\t */\r\n\tpublic FieldOverride?: string[];\r\n\r\n\t/** Client data. */\r\n\tpublic ClientData?: ClientData;\r\n\tpublic IndexName?: string;\r\n}\r\n","import { Suggestion, SuggestionType, SuggestionStrategy } from './Suggestion';\r\nimport { ControllerStateAndHelpers } from 'downshift';\r\n\r\nexport class Category extends Suggestion {\r\n\t/** Display name of category (example: Men » Jackets). */\r\n\tpublic Value: string;\r\n\t/**\r\n\t * URL for displaying contents of the category, ex:\r\n\t * http://dev.hawksearch.net/sites/elasticdemo?department_nest=Jackets_4\r\n\t */\r\n\tpublic Url: string;\r\n\r\n\tpublic constructor(init: Category) {\r\n\t\tsuper(SuggestionType.Category);\r\n\t\tObject.assign(this, init);\r\n\t}\r\n}\r\n\r\nexport class CategoryStrategy implements SuggestionStrategy {\r\n\t// eslint-disable-next-line no-unused-vars\r\n\tpublic handleItemChange(item: Category, downshift: ControllerStateAndHelpers): void {\r\n\t\tlocation.assign(item.Url);\r\n\t}\r\n\r\n\tpublic toString(item: Category): string {\r\n\t\treturn item.Value;\r\n\t}\r\n}\r\n","import { Result } from 'models/Search';\r\nimport { Suggestion, SuggestionStrategy, SuggestionType } from './Suggestion';\r\nimport { ControllerStateAndHelpers } from 'downshift';\r\n\r\nexport class Product extends Suggestion {\r\n\t/** Name of the item (if applicable). */\r\n\tpublic ProductName: string;\r\n\r\n\t/* Sku of the item (if applicable). */\r\n\tpublic Sku: string;\r\n\r\n\t/** URL of image of the item (if applicable). */\r\n\tpublic Thumb: string;\r\n\r\n\t/** URL of product page (if applicable). */\r\n\tpublic Url: string;\r\n\r\n\t/** HTML to display the item in autocomplete. */\r\n\tpublic Html: string;\r\n\r\n\t/**\r\n\t * This will only be populated if the request parameter @see Request.DisplayFullResponse is sent\r\n\t * as `true`.\r\n\t */\r\n\tpublic Results: Result;\r\n\r\n\tpublic constructor(init: Product) {\r\n\t\tsuper(SuggestionType.Product);\r\n\t\tObject.assign(this, init);\r\n\t\tthis.Results = new Result(init.Results);\r\n\t}\r\n}\r\n\r\nexport class ProductStrategy implements SuggestionStrategy {\r\n\t// eslint-disable-next-line no-unused-vars\r\n\tpublic handleItemChange(item: Product, downshift: ControllerStateAndHelpers): void {\r\n\t\tlocation.assign(item.Url);\r\n\t}\r\n\r\n\tpublic toString(item: Product): string {\r\n\t\treturn item.ProductName;\r\n\t}\r\n}\r\n","import { Result } from 'models/Search';\r\nimport { SuggestionType, Suggestion, SuggestionStrategy } from './Suggestion';\r\nimport { ControllerStateAndHelpers } from 'downshift';\r\n\r\nexport class Content extends Suggestion {\r\n\t/** Display label for the content item in Autocomplete. */\r\n\tpublic Value: string;\r\n\r\n\t/** The URL for the link created. */\r\n\tpublic Url: string;\r\n\r\n\t/** URL of image of the item (if applicable). */\r\n\tpublic Thumb: string;\r\n\r\n\t/** The display label in HTML format, if applicable. */\r\n\tpublic Html: string;\r\n\r\n\tpublic Results: Result;\r\n\r\n\tpublic constructor(init: Content) {\r\n\t\tsuper(SuggestionType.Content);\r\n\t\tObject.assign(this, init);\r\n\t\tthis.Results = new Result(init.Results);\r\n\t}\r\n}\r\n\r\nexport class ContentStrategy implements SuggestionStrategy {\r\n\t// eslint-disable-next-line no-unused-vars\r\n\tpublic handleItemChange(item: Content, downshift: ControllerStateAndHelpers): void {\r\n\t\tlocation.assign(item.Url);\r\n\t}\r\n\r\n\tpublic toString(item: Content): string {\r\n\t\treturn item.Value;\r\n\t}\r\n}\r\n","import { SuggestionType, Suggestion, SuggestionStrategy } from './Suggestion';\r\nimport { ControllerStateAndHelpers } from 'downshift';\r\n\r\nexport class Popular extends Suggestion {\r\n\t/** Display label for the popular search term. */\r\n\tpublic Value: string;\r\n\r\n\t/** The URL for the link created. */\r\n\tpublic Url: string;\r\n\r\n\tpublic constructor(init: Popular) {\r\n\t\tsuper(SuggestionType.Popular);\r\n\t\tObject.assign(this, init);\r\n\t}\r\n}\r\n\r\nexport class PopularStrategy implements SuggestionStrategy {\r\n\t// eslint-disable-next-line no-unused-vars\r\n\tpublic handleItemChange(item: Popular, downshift: ControllerStateAndHelpers): void {\r\n\t\tlocation.assign(item.Url);\r\n\t}\r\n\r\n\tpublic toString(item: Popular): string {\r\n\t\treturn item.Value;\r\n\t}\r\n}\r\n","import { Category } from './Category';\r\nimport { Product } from './Product';\r\nimport { Content } from './Content';\r\nimport { Popular } from './Popular';\r\n\r\nexport class Response {\r\n\t/** Number of products that would be in search results if search was executed. */\r\n\tpublic Count: number;\r\n\t/** Number of content items that would be in search results if search was executed. */\r\n\tpublic ContentCount: number;\r\n\r\n\t/**\r\n\t * Pairs of display values and URLs for matching category names. The number of categories returned\r\n\t * is configured in the Hawksearch Workbench unless overridden by the request parameters.\r\n\t */\r\n\tpublic Categories: Category[];\r\n\r\n\tpublic Products: Product[];\r\n\r\n\t/**\r\n\t * A set of objects for each content item returned. The number returned is configured in the\r\n\t * Hawksearch Workbench > Keyword Search > Auto-complete > Update Top Content.\r\n\t */\r\n\tpublic Content: Content[];\r\n\r\n\t/**\r\n\t * A set of Value and Url for each popular search term. The definition of Popular can be defined in\r\n\t * the Hawksearch Workbench > Keyword Search > Auto-complete > Update Popular Searches.\r\n\t */\r\n\tpublic Popular: Popular[];\r\n\r\n\t/** Search website URL to be used to complete links. */\r\n\tpublic SearchWebsiteUrl: string;\r\n\r\n\t/** The name of the parameter used to pass the keyword entered by user. */\r\n\tpublic KeywordField: string;\r\n\r\n\t/**\r\n\t * Will be included in the response if there are results to display. The `CategoryHeading` contains\r\n\t * the text to display above the list of categories to display in Autocomplete.\r\n\t */\r\n\tpublic CategoryHeading?: string;\r\n\r\n\t/**\r\n\t * Will be included in the response if there are results to display. The `ContentHeading` contains\r\n\t * the text to display above the list of content items to display in Autocomplete.\r\n\t */\r\n\tpublic ContentHeading?: string;\r\n\r\n\t/**\r\n\t * Will be included in the response if there are results to display. The `ProductHeading` contains\r\n\t * the text to display above the list of products to display in Autocomplete.\r\n\t */\r\n\tpublic ProductHeading?: string;\r\n\r\n\t/**\r\n\t * Will be included in the response if there are results to display. The `PopularHeading` contains\r\n\t * the text to display above the list of popular search terms to display in Autocomplete.\r\n\t */\r\n\tpublic PopularHeading?: string;\r\n\r\n\t/**\r\n\t * Will be included in the response if there are results to display. The `ViewAllButtonLabel` contains\r\n\t * the text to display for the link to return all results from searching with the term entered.\r\n\t */\r\n\tpublic ViewAllButtonLabel?: string;\r\n\r\n\tpublic constructor(init: Response) {\r\n\t\tObject.assign(this, init);\r\n\r\n\t\tthis.Categories = init.Categories.map((r) => new Category(r));\r\n\t\tthis.Products = init.Products.map((r) => new Product(r));\r\n\t\tthis.Popular = init.Popular.map((r) => new Popular(r));\r\n\t\tthis.Content = init.Content.map((r) => new Content(r));\r\n\t}\r\n}\r\n","// source: https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\r\n(function () {\r\n\tif (typeof window.CustomEvent === 'function') {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tfunction CustomEvent(event, params) {\r\n\t\tparams = params || { bubbles: false, cancelable: false, detail: undefined };\r\n\t\t// eslint-disable-next-line\r\n\t\tvar evt = document.createEvent('CustomEvent');\r\n\t\tevt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\r\n\t\treturn evt;\r\n\t}\r\n\r\n\tCustomEvent.prototype = window.Event.prototype;\r\n\r\n\twindow.CustomEvent = CustomEvent;\r\n})();\r\n","import React from 'react';\r\nimport { SVGProps } from './SVGProps';\r\nimport classnames from 'classnames';\r\n\r\n/**\r\n * Up chevron SVG\r\n *\r\n * @returns\r\n */\r\nfunction DownChevronSVG({ className, ...rest }: SVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default DownChevronSVG;\r\n","import React from 'react';\r\nimport { SVGProps } from './SVGProps';\r\nimport classnames from 'classnames';\r\n\r\n/**\r\n * Up chevron SVG\r\n *\r\n * @returns\r\n */\r\nfunction UpChevronSVG({ className, ...rest }: SVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default UpChevronSVG;\r\n","export class Pagination {\r\n\t/** Number of total items in the result set. */\r\n\tpublic NofResults: number;\r\n\r\n\t/** The page number returned. */\r\n\tpublic CurrentPage: number;\r\n\r\n\t/** The number of items returned for the page. */\r\n\tpublic MaxPerPage: number;\r\n\r\n\t/** The total number of pages for the result set - with the current @see MaxPerPage. */\r\n\tpublic NofPages: number;\r\n\r\n\t/** Set of pagination options */\r\n\tpublic Items: PaginationItem[];\r\n\r\n\tpublic constructor(init: Pagination) {\r\n\t\tObject.assign(this, init);\r\n\r\n\t\tthis.Items = init.Items.map((i) => new PaginationItem(i));\r\n\t}\r\n}\r\n\r\nexport class PaginationItem {\r\n\t/** Display label for user's pagination option (i.e. 24 per page). */\r\n\tpublic Label: string;\r\n\r\n\t/** The maximum number of items that will be returned per page when this option is selected. */\r\n\tpublic PageSize: number;\r\n\r\n\t/** Indicates if this is the option selected. Only one pagination item will have this set to `true`. */\r\n\tpublic Selected: boolean;\r\n\r\n\t/** Indicates if this is the default option. Only one pagination item will have this set to `true`. */\r\n\tpublic Default: boolean;\r\n\r\n\tpublic constructor(init: PaginationItem) {\r\n\t\tObject.assign(this, init);\r\n\t}\r\n}\r\n","import { Explain } from './Explain';\r\n\r\nexport class Result {\r\n\t/** Unique identifier for this search result item. */\r\n\tpublic DocId: string;\r\n\r\n\t/** Calculated relevancy score. */\r\n\tpublic Score: number;\r\n\r\n\t/**\r\n\t * Contains the fields for the search result item, as an object of string keys to an array\r\n\t * of string values. The keys correspond to the name of the field within the hawk dashboard,\r\n\t * and the value of the map is an array of strings for each of the values for that field.\r\n\t */\r\n\tpublic Document?: { [field: string]: string[] };\r\n\r\n\tpublic Explain?: Explain;\r\n\r\n\tpublic IsPin: boolean;\r\n\r\n\tpublic BestFragment: string;\r\n\r\n\t/**\r\n\t * Returns a single document value, by the given field name. If the field does not exist in\r\n\t * the document, or has no values, then `undefined` is returned instead.\r\n\t * @param field The field within the result document to retrieve the value of.\r\n\t */\r\n\tpublic getDocumentValue(field: string): string | undefined {\r\n\t\tif (this.Document) {\r\n\t\t\tconst values = this.Document[field];\r\n\r\n\t\t\tif (values && values.length > 0) {\r\n\t\t\t\treturn values[0];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\t// #region HCL\r\n\tpublic setDocumentValue(field: string, value: string) {\r\n\t\tif (this.Document) {\r\n\t\t\tconst values = this.Document[field];\r\n\r\n\t\t\tif (values && values.length > 0) {\r\n\t\t\t\tvalues[0] = value;\r\n\t\t\t} else {\r\n\t\t\t\tthis.Document[field] = [];\r\n\t\t\t\tthis.Document[field].push(value);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getDocumentValues(field: string): string[] | undefined {\r\n\t\tif (this.Document) {\r\n\t\t\tconst values = this.Document[field];\r\n\r\n\t\t\tif (values && values.length > 0) {\r\n\t\t\t\treturn values;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\t}\r\n\t// #endregion\r\n\r\n\tpublic constructor(init: Result) {\r\n\t\tObject.assign(this, init);\r\n\t}\r\n}\r\n","export class Sorting {\r\n\t/** The sorting items. */\r\n\tpublic Items: SortingItem[];\r\n\r\n\tpublic constructor(init: Sorting) {\r\n\t\tObject.assign(this, init);\r\n\r\n\t\tthis.Items = init.Items.map((i) => new SortingItem(i));\r\n\t}\r\n}\r\n\r\nexport class SortingItem {\r\n\t/** Name of the sorting option. This is the label to display to users. */\r\n\tpublic Label: string;\r\n\r\n\t/**\r\n\t * The value to be used to specify the sort order once user selects it. This value is passed in the @see Request.SortBy\r\n\t * field in the @see Request object.\r\n\t */\r\n\tpublic Value: string;\r\n\r\n\t/** Indicates if this sorting option was configured to be the default. */\r\n\tpublic IsDefault: boolean;\r\n\r\n\t/** Indicates if this sorting option is currently being used for the current result set. */\r\n\tpublic Selected: boolean;\r\n\r\n\tpublic constructor(init: SortingItem) {\r\n\t\tObject.assign(this, init);\r\n\t}\r\n}\r\n","export class Selections {\r\n\t// You may get build errors if you are using react hot loader because of this indexer. If this file is listed as a culprit and you don't know why, this is likely the reason.\r\n\t[field: string]: SelectionFacet;\r\n\r\n\tpublic constructor(init: Selections) {\r\n\t\tObject.assign(this, init);\r\n\r\n\t\tObject.keys(init).forEach((key) => {\r\n\t\t\tconst selFacet = init[key];\r\n\r\n\t\t\tthis[key] = new SelectionFacet(selFacet);\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport class SelectionFacet {\r\n\t/** Display name for facet. */\r\n\tpublic Label: string;\r\n\r\n\t/** Will contain an entry for each selection made within the facet. */\r\n\tpublic Items: SelectionFacetValue[];\r\n\r\n\tpublic constructor(init: SelectionFacet) {\r\n\t\tObject.assign(this, init);\r\n\r\n\t\tthis.Items = init.Items.map((i) => new SelectionFacetValue(i));\r\n\t}\r\n}\r\n\r\nexport class SelectionFacetValue {\r\n\t/** Display label for facet value. */\r\n\tpublic Label: string;\r\n\r\n\t/** Value for facet value. */\r\n\tpublic Value: string;\r\n\r\n\tpublic constructor(init: SelectionFacetValue) {\r\n\t\tObject.assign(this, init);\r\n\t}\r\n}\r\n","export class Value {\r\n\t/** Label of the value to display. */\r\n\tpublic Label?: string;\r\n\t/** Value to use when setting the facet value selection. */\r\n\tpublic Value?: string;\r\n\r\n\t/** Number of results in current set that have this facet value. */\r\n\tpublic Count: number;\r\n\t/** Indicates if this facet value has been selected. */\r\n\tpublic Selected: boolean;\r\n\r\n\t/**\r\n\t * Used for displaying the slider facet. @see RangeStart indicates what the starting point of the range\r\n\t * to display, either on basis of what the user selected by sliding the slider, or if they have no\r\n\t * selection it reflects the lowest price product.\r\n\t */\r\n\tpublic RangeStart?: string;\r\n\t/**\r\n\t * Used for displaying the slider facet. @see RangeEnd indicates what the end point of the range to\r\n\t * display is, either on basis of what the user selected by sliding the slider, or if they have no\r\n\t * selection, it reflects the highest price product.\r\n\t */\r\n\tpublic RangeEnd?: string;\r\n\r\n\t/**\r\n\t * Used for displaying the slider facet. @see RangeMin indicates lowest value for the range in the list\r\n\t * of products displayed.\r\n\t */\r\n\tpublic RangeMin?: string;\r\n\t/**\r\n\t * Used for displaying the slider facet. @see RangeMax indicates highest value for the range in the list\r\n\t * of products displayed.\r\n\t */\r\n\tpublic RangeMax?: string;\r\n\r\n\t/** Used for nested facets. */\r\n\tpublic Path?: string;\r\n\r\n\t/** Set of pagination options */\r\n\tpublic Children: Value[];\r\n\r\n\tpublic Level: number;\r\n\r\n\tpublic constructor(init: Value) {\r\n\t\tObject.assign(this, init);\r\n\t}\r\n}\r\n","export class Swatch {\r\n\t/** Match this value to the @see Value object in the @see Values array of @see Facet. */\r\n\tpublic Value: string;\r\n\r\n\t/** Name of the asset. */\r\n\tpublic AssetName: string;\r\n\t/** URL of the asset. */\r\n\tpublic AssetUrl: string;\r\n\r\n\t/** Indicates if value is the default. */\r\n\tpublic IsDefault: boolean;\r\n\r\n\t/** Color of the asset. */\r\n\tpublic Color: string;\r\n\r\n\tpublic constructor(init: Swatch) {\r\n\t\tObject.assign(this, init);\r\n\t}\r\n}\r\n","export class Range {\r\n\t/** Label of the value to display. */\r\n\tpublic Label: string;\r\n\t/** Value to use when setting the facet value selection. */\r\n\tpublic Value: string;\r\n\r\n\t/** Indicates if the values are numeric. */\r\n\tpublic IsNumeric: boolean;\r\n\r\n\t/** Lower value of the range. */\r\n\tpublic LBound: string;\r\n\t/** Upper value of the range. */\r\n\tpublic UBound: string;\r\n\t/** Asset Url */\r\n\tpublic AssetFullUrl: string;\r\n\r\n\tpublic constructor(init: Range) {\r\n\t\tObject.assign(this, init);\r\n\t}\r\n}\r\n","import { Value } from './Value';\r\nimport { Swatch } from './Swatch';\r\nimport { Range } from './Range';\r\nimport { FacetType } from 'models/Facets/FacetType';\r\n\r\nexport class Facet {\r\n\t/** Unique identifier of the facet. */\r\n\tpublic FacetId: number;\r\n\r\n\t/** Display name of the facet. */\r\n\tpublic Name: string;\r\n\r\n\t/** The name of the field that is linked to this facet. */\r\n\tpublic Field: string;\r\n\r\n\t/** The name of the field that is linked to this facet. */\r\n\tpublic FieldType: 'string' | 'range' | 'numeric' | 'search' | 'tab';\r\n\r\n\t/** The type of facet. This dictates the appearance and behavior of this instance and is partially restricted by @see FieldType */\r\n\tpublic FacetType: FacetType;\r\n\r\n\t/** The Display Type controls how many options your users can see when they search and how they are able to access them. */\r\n\tpublic DisplayType: 'default' | 'scrolling' | 'truncating';\r\n\r\n\t/** Indicates the maximum number of facet values that are returned. */\r\n\tpublic MaxCount: number;\r\n\r\n\t/** Indicates the minimum number of results each facet value needs to have in order to be returned. */\r\n\tpublic MinHitCount: number;\r\n\r\n\t/**\r\n\t * If this is set, it is to be used as the facet name if passed in the `FacetSelections`. If not set,\r\n\t * the value of the Field object would be used. (This is only applicable when a slider and range\r\n\t * facets are both configured for the same field.)\r\n\t */\r\n\tpublic ParamName?: string;\r\n\r\n\t/**\r\n\t * Indicates the sorting logic that is used for this facet’s values. The possible values for this\r\n\t * are the parameters for sorting set options that are configured in \"Workbench > Data Configuration\r\n\t * > Sorting/Pagination\".\r\n\t */\r\n\tpublic SortBy: string;\r\n\r\n\t/** Indicates if the user should be able to apply more than one filter value from this facet. */\r\n\tpublic ExpandSelection: boolean;\r\n\r\n\t/** Indicates if facet values are numeric. */\r\n\tpublic IsNumeric: boolean;\r\n\r\n\t/** Indicates if facet values are currency (and should be displayed appropriately). */\r\n\tpublic IsCurrency: boolean;\r\n\r\n\t/** Indicates currency symbol in case of currency type facets */\r\n\tpublic CurrencySymbol: string;\r\n\r\n\t/** Indicates if the facet can be collapsed and expanded by the user. */\r\n\tpublic IsCollapsible: boolean;\r\n\r\n\t/** If @see IsCollapsible is `true`, this indicates if the facet should initially be collapsed or expanded. */\r\n\tpublic IsCollapsedDefault: boolean;\r\n\r\n\t/** Indicates if the facet is set to be visible. */\r\n\tpublic IsVisible: boolean;\r\n\r\n\t/**\r\n\t * Indicates if search is enabled for this facet. If it is enabled, a search box should be available for\r\n\t * users to filter the facet values by typing in the search box.\r\n\t */\r\n\tpublic IsSearch: boolean;\r\n\r\n\t/**\r\n\t * If facet display type is Scrolling, this value is the height in pixels for the window inside scroll box.\r\n\t * Only to be used if @see DisplayType is `\"scrolling\"`.\r\n\t */\r\n\tpublic ScrollHeight: number;\r\n\r\n\t/**\r\n\t * If the number of facet values exceeds this number and @see DisplayType is `\"scrolling\"`, then the facet\r\n\t * should be displayed as scrolling list; if not, display as `\"default\"`.\r\n\t */\r\n\tpublic ScrollThreshold: number;\r\n\r\n\t/**\r\n\t * If the number of facet values exceeds this number and @see DisplayType is `\"truncate\"`, then the facet\r\n\t * should be displayed as truncated list; if not, display as `\"default\"`.\r\n\t */\r\n\tpublic TruncateThreshold: number;\r\n\r\n\t/**\r\n\t * To be used if @see IsSearch is `true`. The number of facet values must be this number or higher for the\r\n\t * facet search box to display.\r\n\t */\r\n\tpublic SearchThreshold: number;\r\n\r\n\t/** Text to display when user hovers over a help icon. */\r\n\tpublic Tooltip?: string;\r\n\r\n\t/**\r\n\t * If `false`, indicates that sometimes this facet will not be returned. The conditions that trigger its\r\n\t * display are maintained in the Workbench.\r\n\t */\r\n\tpublic AlwaysVisible: boolean;\r\n\r\n\t/**\r\n\t * The display order of the facet in the facet list.\r\n\t */\r\n\tpublic SortOrder: number;\r\n\r\n\t/** This is maximum number of values that could be returned for the facet. */\r\n\tpublic NofVisible: number;\r\n\r\n\t/** Will be included if @see FacetType is `\"swatch\"`. */\r\n\tpublic SwatchData?: Swatch[];\r\n\r\n\t/** Indicates type of facet range display. */\r\n\tpublic FacetRangeDisplayType: number;\r\n\r\n\t/** Indicates if setting in Workbench is set to On or Off. */\r\n\tpublic PreloadChildren: boolean;\r\n\r\n\t/**\r\n\t * To be used if @see FacetType is `\"slider\"`. If @see ShowSliderInputs is `true`, input boxes should be\r\n\t * available for user to enter values.\r\n\t */\r\n\tpublic ShowSliderInputs: boolean;\r\n\r\n\t/** Always present, but will only be populated if the facet is numeric and not a slider. */\r\n\tpublic Ranges: Range[];\r\n\r\n\t/** The values for this facet. */\r\n\tpublic Values: Value[];\r\n\r\n\t/** Whether or not the facet should be rendered as truncated. */\r\n\tpublic get shouldTruncate() {\r\n\t\t// the facet does truncated listing of values if configured for truncating and we have too many facets\r\n\t\treturn this.DisplayType === 'truncating' && this.Values.length > this.TruncateThreshold;\r\n\t}\r\n\r\n\t/** Whether or not the facet should have a quick lookup search input. */\r\n\tpublic get shouldSearch() {\r\n\t\t// the facet should have a search box if configured to do so, and the number of facet values is greater\r\n\t\t// than the threshold\r\n\t\treturn this.IsSearch && this.Values.length > this.SearchThreshold;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the name of the key when using this facet for a selection. This will take into consideration\r\n\t * @see ParamName and @see Field in determining which value should be returned.\r\n\t */\r\n\tpublic get selectionField() {\r\n\t\treturn this.ParamName ? this.ParamName : this.Field;\r\n\t}\r\n\r\n\tpublic constructor(init: Facet) {\r\n\t\tObject.assign(this, init);\r\n\r\n\t\tthis.SwatchData = init.SwatchData ? init.SwatchData.map((s) => new Swatch(s)) : [];\r\n\t\tthis.Ranges = init.Ranges.map((r) => new Range(r));\r\n\t\tthis.Values = init.Values.map((v) => new Value(v));\r\n\t}\r\n}\r\n","export class Rule {\r\n\tpublic RuleType: RuleType;\r\n\tpublic Field: string;\r\n\tpublic Condition: string;\r\n\tpublic Value: string;\r\n\tpublic Operator: RuleOperatorType;\r\n\r\n\tpublic Rules: Rule[];\r\n\tpublic Parent: Rule;\r\n\tpublic constructor(init: Rule) {\r\n\t\tObject.assign(this, init);\r\n\t\tif (init.Parent) {\r\n\t\t\tthis.Parent = new Rule(init.Parent);\r\n\t\t}\r\n\t\tthis.Rules = init.Rules ? init.Rules.map((i) => new Rule(i)) : [];\r\n\t}\r\n}\r\n\r\nexport enum RuleType {\r\n\tGroup = 0,\r\n\tEval = 1,\r\n}\r\n\r\nexport enum RuleOperatorType {\r\n\tAll = 0,\r\n\tAny = 1,\r\n\tNone = 2,\r\n}\r\n","import { Rule } from './Rule';\r\n\r\nexport class BannerTrigger {\r\n\tpublic BannerGroupId: number;\r\n\tpublic Name: string;\r\n\tpublic SortOrder: number;\r\n\tpublic Rule: Rule;\r\n\r\n\tpublic constructor(init: BannerTrigger) {\r\n\t\tObject.assign(this, init);\r\n\r\n\t\tthis.Rule = new Rule(this.Rule);\r\n\t}\r\n}\r\n","import { ContentType } from './ContentType';\r\nimport { Result } from './Result';\r\nimport { BannerTrigger } from './Trigger';\r\n\r\nexport class FeaturedItems {\r\n\tpublic Items: FeaturedItem[];\r\n\r\n\tpublic constructor(init: FeaturedItems) {\r\n\t\tObject.assign(this, init);\r\n\t\tif (init && init.Items) {\r\n\t\t\tthis.Items = init.Items.map((i) => new FeaturedItem(i));\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport class Merchandising {\r\n\tpublic Items: MerchandisingItem[];\r\n\r\n\tpublic constructor(init: Merchandising) {\r\n\t\tObject.assign(this, init);\r\n\t\tif (init && init.Items) {\r\n\t\t\tthis.Items = init.Items.map((i) => new MerchandisingItem(i));\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport class PageContentItem {\r\n\tpublic Zone: string;\r\n\tpublic ContentType: ContentType;\r\n\tpublic ImageUrl: string;\r\n\tpublic AltTag: string;\r\n\tpublic ForwardUrl: string;\r\n\tpublic Output: any;\r\n\tpublic WidgetArgs: string;\r\n\tpublic Title: string;\r\n\tpublic Name: string;\r\n\tpublic DateFrom: string;\r\n\tpublic DateTo: string;\r\n\tpublic IsMobile: boolean;\r\n\tpublic MobileContentType: string;\r\n\tpublic MobileImageUrl: string;\r\n\tpublic MobileOutput: string;\r\n\tpublic MobileWidgetArgs: string;\r\n\tpublic IsTrackingEnabled: boolean;\r\n\tpublic MobileIsTrackingEnabled?: boolean;\r\n\tpublic FeaturedItems: Result[];\r\n\tpublic Items: Result[];\r\n\tpublic Target: string;\r\n\tpublic MobileTarget: string;\r\n\tpublic MobileAltTag: string;\r\n\tpublic MobileForwardUrl: string;\r\n\tpublic MobileWidth: string;\r\n\tpublic MobileHeight: string;\r\n\tpublic Trigger: BannerTrigger;\r\n\r\n\tpublic constructor(init: PageContentItem) {\r\n\t\tObject.assign(this, init);\r\n\t\tif (init.FeaturedItems) {\r\n\t\t\tthis.FeaturedItems = init.FeaturedItems.map((i) => new Result(i));\r\n\t\t}\r\n\t\tif (init.Trigger) {\r\n\t\t\tthis.Trigger = new BannerTrigger(init.Trigger);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport class FeaturedItem extends PageContentItem {\r\n\tpublic Items: Result[];\r\n\r\n\tpublic constructor(init: FeaturedItem) {\r\n\t\tsuper(init);\r\n\t\tObject.assign(this, init);\r\n\t\tthis.Items = init.Items.map((i) => new Result(i));\r\n\t}\r\n}\r\n\r\nexport class MerchandisingItem extends PageContentItem {\r\n\tpublic constructor(init: MerchandisingItem) {\r\n\t\tsuper(init);\r\n\t\tObject.assign(this, init);\r\n\t}\r\n}\r\n","import { PageContentItem } from './Merchandising';\r\n\r\nexport class PageContent {\r\n\tpublic ZoneName: string;\r\n\r\n\tpublic Items: PageContentItem[];\r\n\r\n\tpublic constructor(init: PageContent) {\r\n\t\tObject.assign(this, init);\r\n\t\tthis.Items = init.Items.map((i) => new PageContentItem(i));\r\n\t}\r\n}\r\n","import { Pagination } from './Pagination';\r\nimport { Result } from './Result';\r\nimport { Sorting } from './Sorting';\r\nimport { Selections } from './Selections';\r\nimport { Facet } from 'models/Facets';\r\nimport { Merchandising, FeaturedItems } from './Merchandising';\r\nimport { PageContent } from './PageContent';\r\n\r\nexport class Response {\r\n\t/** Indicates if request was successful. */\r\n\tpublic Success: boolean;\r\n\r\n\t/** Summary of pagination details and a set of pagination options. */\r\n\tpublic Pagination: Pagination;\r\n\r\n\t/**\r\n\t * The Keyword value that was sent to Hawksearch in the request. If no Keyword was set in the\r\n\t * request, the value will be empty.\r\n\t */\r\n\tpublic Keyword: string;\r\n\r\n\t/**\r\n\t * If this is populated, it indicates that the Keyword value returned 0 results, but the results\r\n\t * in this response are from this AdjustedKeyword. A message should be displayed to the user\r\n\t * informing them that their search was corrected to this string.\r\n\t *\r\n\t * This is the result of Auto Correct, which is configured in the Workbench > Keyword Search >\r\n\t * Did You Mean.\r\n\t */\r\n\tpublic AdjustedKeyword?: string;\r\n\r\n\t/** An entry in the array for each item returned in search results. */\r\n\tpublic Results: Result[];\r\n\r\n\tpublic Facets: Facet[];\r\n\r\n\t/**\r\n\t * Will contain an entry for each facet that has one or more selections. Will be empty if no facet\r\n\t * selections have been made.\r\n\t */\r\n\tpublic Selections: Selections;\r\n\r\n\tpublic Sorting: Sorting;\r\n\r\n\t/**\r\n\t * If any strings are returned in the array, they should be displayed to the user as suggested\r\n\t * search terms.\r\n\t *\r\n\t * This is the result of Did You Mean, which is configured in the Workbench > Keyword Search >\r\n\t * Did You Mean.\r\n\t */\r\n\tpublic DidYouMean: string[];\r\n\r\n\t/**\r\n\t * Merchandising can be placed by using Campaigns in the Hawksearch Workbench. The Campaign will\r\n\t * determine if the content should appear and in what zone.\r\n\t */\r\n\tpublic Merchandising: Merchandising;\r\n\tpublic FeaturedItems: FeaturedItems;\r\n\r\n\tpublic SearchDuration: number;\r\n\r\n\tpublic DocExplain?: string;\r\n\r\n\t/**\r\n\t * Properties that gets populated when user requests landing page related results\r\n\t *\r\n\t */\r\n\r\n\tpublic Breadcrumb: string;\r\n\r\n\tpublic CustomHtml: string;\r\n\r\n\tpublic HeaderTitle: string;\r\n\r\n\tpublic MetaDescription: string;\r\n\r\n\tpublic MetaKeywords: string;\r\n\tpublic MetaRobots: string;\r\n\tpublic Name: string;\r\n\tpublic Next: string;\r\n\tpublic Prev: string;\r\n\tpublic PageHeading: string;\r\n\tpublic PageContent: PageContent[];\r\n\tpublic RelCanonical: string;\r\n\tpublic PageLayoutId: number;\r\n\tpublic TrackingId: string;\r\n\t// end of landing page related fields\r\n\r\n\tpublic constructor(init: Response) {\r\n\t\tObject.assign(this, init);\r\n\r\n\t\tthis.Pagination = new Pagination(init.Pagination);\r\n\t\tthis.Merchandising = new Merchandising(init.Merchandising);\r\n\t\tthis.FeaturedItems = new FeaturedItems(init.FeaturedItems);\r\n\t\tthis.Results = init.Results.map((r) => new Result(r));\r\n\t\tthis.Facets = init.Facets.map((f) => new Facet(f));\r\n\t\tthis.PageContent = init.PageContent ? init.PageContent.map((p) => new PageContent(p)) : [];\r\n\t\tthis.Selections = new Selections(init.Selections);\r\n\t\tthis.Sorting = new Sorting(init.Sorting);\r\n\t}\r\n}\r\n","/** An object that contains the data related to the client making search or autosuggest requests. */\r\nexport class ClientData {\r\n\t/** Unique identifier used for tracking visitors. */\r\n\tpublic VisitorId: string;\r\n\r\n\t/** Custom information used for evaluating Visitor Targets. */\r\n\tpublic Custom?: string;\r\n\r\n\t/** Client IP used for evaluating Visitor Targets. */\r\n\tpublic HttpTrueClientIp?: string;\r\n\r\n\t/** Browser user agent used for evaluating Visitor Targets. */\r\n\tpublic UserAgent?: string;\r\n\r\n\tpublic PreviewBuckets?: number[];\r\n\r\n\t/**\r\n\t * The source used for evaluating Visitor Targets. This was previously called 'hawksource' and can\r\n\t * be used to track the source the user came from (i.e. email, instagram, etc).\r\n\t */\r\n\tpublic Source?: string;\r\n}\r\n","export enum ContentType {\r\n\tImage = 'image',\r\n\tWidget = 'widget',\r\n\tFeatured = 'featured',\r\n\tCustom = 'custom',\r\n\tLandingPage = 'landingPage',\r\n}\r\n","import React, { useState } from 'react';\r\nimport { Result } from 'models/Search';\r\nimport PlaceholderImage from './PlaceholderImage';\r\nimport LazyImage from 'shared/assets/LazyImage';\r\n\r\nexport interface ResultImageProps {\r\n\titem: Result;\r\n\tonClick?: () => void;\r\n\t//#region HCL\r\n\tsearch?: string;\r\n\t//#endregion\r\n}\r\n\r\ninterface OptionalAnchorProps {\r\n\thref?: string;\r\n\tchildren?: JSX.Element;\r\n\tname?: string;\r\n\tonClick?: () => void;\r\n}\r\n\r\nconst OptionalAnchor = ({ href, children, name, onClick }: OptionalAnchorProps) => {\r\n\treturn href ? (\r\n\t\t onClick && onClick()}>\r\n\t\t\t{name}\r\n\t\t\t{children}\r\n\t\t\r\n\t) : (\r\n\t\t<>{children}\r\n\t);\r\n};\r\n\r\nfunction ResultImage({ item, onClick /*#region HCL */, search /*endregion*/ }: ResultImageProps) {\r\n\tconst imageUrl = item.getDocumentValue('image') ?? '';\r\n\tconst itemName = item.getDocumentValue('name');\r\n\tconst url = item.getDocumentValue('url_detail');\r\n\t// #region HCL\r\n\tconst roctype = item.getDocumentValue('roctype');\r\n\t// #endregion\r\n\tconst [hasImage, setHasImage] = useState(imageUrl !== '' && !!imageUrl);\r\n\tconst [imageLoaded, setImageLoaded] = useState(false);\r\n\r\n\treturn (\r\n\t\t
\r\n\t\t\t
\r\n\t\t\t\t{hasImage ? (\r\n\t\t\t\t\t onClick && onClick()}\r\n\t\t\t\t\t\tname={itemName}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t setImageLoaded(true)}\r\n\t\t\t\t\t\t\tonError={() => {\r\n\t\t\t\t\t\t\t\tsetHasImage(false);\r\n\t\t\t\t\t\t\t\tsetImageLoaded(false);\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\t\t\t\t) : null}\r\n\t\t\t
\r\n\r\n\t\t\t{!imageLoaded ? (\r\n\t\t\t\t// if the main image hasn't loaded yet, show a placeholder\r\n\t\t\t\t\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t{/* #region HCL */}\r\n\t\t\t\t\t\t{roctype === 'Page' || roctype === 'ContentPage' ? (\r\n\t\t\t\t\t\t\t{`${itemName}`}\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{/* #endregion */}\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t) : null}\r\n\t\t
\r\n\t);\r\n}\r\n\r\nexport default ResultImage;\r\n","import Axios, { AxiosError, CancelTokenSource } from 'axios';\r\nimport { useEffect, useState } from 'react';\r\nimport AxiosHelper from 'services/AxiosHelper';\r\nimport { Localizer } from 'services/Localizer';\r\nimport {\r\n\tAddAllToCartResponse,\r\n\tAddToCartResponse,\r\n\tBulkAddToCartResponse,\r\n\tCartSummary,\r\n\tGetCartResult,\r\n\tMoveSavedProductToCartResult,\r\n} from 'services/UserData.Commerce';\r\nimport { dispatchRocEvent } from 'shared/hooks/useRocEventHandler';\r\nimport { AddToCartExceptionCode, ProductAddOnDto } from '../product-details/types';\r\nimport { OrderMessage } from './OrderMessages';\r\nimport {\r\n\tAddAllToCartProps as AddAllToCartParams,\r\n\tAddToCartProps as AddToCartParams,\r\n\tBulkAddToCartProps,\r\n\tGetSavedProductsResult,\r\n\tMoveStatus,\r\n\tOrder,\r\n\tOrderItem,\r\n\tOrderRecipient,\r\n} from './types';\r\n\r\nexport interface UseShoppingCart {\r\n\tstate: UseShoppingCartState;\r\n\tactor: UseShoppingCartActor;\r\n}\r\n\r\nexport interface UseShoppingCartState {\r\n\torder?: Order | null;\r\n\tsavedProducts?: GetSavedProductsResult | null;\r\n\tcartTotalItemCount: number;\r\n\r\n\torderIsUpdating: boolean;\r\n\tupdatingOrderItemId: string | null;\r\n\torderItemBeingRemovedId: string | null;\r\n\tupdatingSavedProductId: string | null;\r\n\tupdatingSavedProductPricingLineId: string | null;\r\n\tsavedProductBeingRemovedId: string | null;\r\n\tsavedProductBeingRemovedPricingLineId: string | null;\r\n\r\n\tstoredForUndoItem: OrderItem | null;\r\n\tstoredForUndoItemIndex: {\r\n\t\trecipientId: string;\r\n\t\titemIndex: number;\r\n\t} | null;\r\n\tlastMoveStatus: MoveStatus | null;\r\n\tisUndoClickedState: boolean;\r\n\r\n\terrorMessage: string | null;\r\n\terror: Error | AxiosError | null;\r\n\terrorType: AddToCartExceptionCode | null;\r\n}\r\n\r\nexport interface UseShoppingCartActor {\r\n\taddToCart: (props: AddToCartParams) => Promise;\r\n\tbulkAddToCart: (props: BulkAddToCartProps) => Promise;\r\n\taddAllFromListToCurrentCart: (props: AddAllToCartParams) => Promise;\r\n\taddAllFromListToNewCart: (props: AddAllToCartParams) => Promise;\r\n\tchangeOrderItemQuantity: (itemToUpdate: OrderItem, newQuantity: number) => Promise;\r\n\tupdateOrderItemAddOns: (itemToUpdate: OrderItem, updatedAddOns: ProductAddOnDto[]) => Promise;\r\n\tmoveItemToSaved: (itemToMove: OrderItem) => Promise;\r\n\tremoveOrderItem: (itemToRemove: OrderItem) => Promise;\r\n\r\n\taddToSavedProducts: (itemToAdd: OrderItem) => Promise;\r\n\tmoveSavedProductToCart: (\r\n\t\tproductToMoveId: string,\r\n\t\tproductName: string,\r\n\t\tpricingLineId: string,\r\n\t\tquantity: number,\r\n\t\taddOns?: ProductAddOnDto[],\r\n\t) => Promise;\r\n\tremoveSavedProduct: (\r\n\t\tproductToRemoveId: string,\r\n\t\tproductToRemoveName: string,\r\n\t\tpricingLineId: string,\r\n\t\taddOns?: ProductAddOnDto[],\r\n\t) => Promise;\r\n\r\n\tsetErrorMessage: (errorMessage: string | null) => void;\r\n\tsetError: (error: Error | AxiosError | null) => void;\r\n\thandleUndo: () => Promise;\r\n\r\n\tupdateOrder: (newCart: Order) => void;\r\n\t/**\r\n\t * Sets order messages to displayed whenever the server returns order related ajax requests\r\n\t * within any component tgat is using this hook.\r\n\t */\r\n\tupdateOrderMessages: (orderMessages: OrderMessage[]) => void;\r\n\tsetUpdatingOrderItemId: (orderItemId: string | null) => void;\r\n}\r\n\r\nexport interface UseShoppingCartParams {\r\n\torder?: Order | null;\r\n\tsetOrder?: (order: Order) => void;\r\n\tsavedProducts?: GetSavedProductsResult | null;\r\n\tsetSavedProducts?: (savedProducts: GetSavedProductsResult) => void;\r\n\tcartSummary?: CartSummary | null;\r\n\tsetCartSummary?: (cartSummary: CartSummary) => void;\r\n\torderMessages?: OrderMessage[];\r\n\tsetOrderMessages?: (orderMessages: OrderMessage[]) => void;\r\n}\r\n\r\n/**\r\n * Reusable hook to access ShoppingCart-related endpoints on the server, as well as helping manage\r\n * the items inside the shopping cart.\r\n */\r\nexport default function useShoppingCart(useShoppingCartParams?: UseShoppingCartParams): UseShoppingCart {\r\n\tconst params = useShoppingCartParams || {};\r\n\tconst { order, setOrder, savedProducts, setSavedProducts, setCartSummary, setOrderMessages } = params;\r\n\r\n\t// to indicate that a cart is being updated after its item has been removed/updated\r\n\tconst [updatingOrderItemId, setUpdatingOrderItemId] = useState(null);\r\n\r\n\t// to store the id of the order item being removed\r\n\tconst [orderItemBeingRemovedId, setOrderItemBeingRemovedId] = useState(null);\r\n\r\n\t// total items count in the cart\r\n\tconst [cartTotalItemCount, setCartTotalItemCount] = useState(0);\r\n\r\n\t// to store the id and the unit of measure id of the item being moved\r\n\tconst [updatingSavedProductId, setUpdatingSavedProductId] = useState(null);\r\n\tconst [updatingSavedProductPricingLineId, setUpdatingSavedProductPricingLineId] = useState(null);\r\n\r\n\t// to store the id and the unit of measure id of the item being removed\r\n\tconst [savedProductBeingRemovedId, setSavedProductBeingRemovedId] = useState(null);\r\n\tconst [savedProductBeingRemovedPricingLineId, setSavedProductBeingRemovedPricingLineId] = useState(\r\n\t\tnull,\r\n\t);\r\n\r\n\t// stores the last removed item and item index to be able to undo the last move or removal\r\n\tconst [storedForUndoItem, setStoredForUndoItem] = useState(null);\r\n\tconst [storedForUndoItemIndex, setStoredForUndoItemIndex] = useState<{\r\n\t\trecipientId: string;\r\n\t\titemIndex: number;\r\n\t} | null>(null);\r\n\r\n\t// stores what the last action was, such as removing an item from the cart or moving an item to the saved products list\r\n\tconst [lastMoveStatus, setLastMoveStatus] = useState(null);\r\n\r\n\t// stores whether the undo button was clicked, to decide whether to clear the undo state when running a function or not\r\n\tlet isUndoClicked: boolean = false;\r\n\tconst [isUndoClickedState, setIsUndoClickedState] = useState(false);\r\n\r\n\t// stores the error message and error type to display\r\n\tconst [error, setError] = useState(null);\r\n\tconst [errorMessage, setErrorMessage] = useState(null);\r\n\tconst [errorType, setErrorType] = useState(null);\r\n\r\n\t// whether the order is updating\r\n\tconst orderIsUpdating =\r\n\t\t(orderItemBeingRemovedId ||\r\n\t\t\tupdatingOrderItemId ||\r\n\t\t\tupdatingSavedProductId ||\r\n\t\t\tupdatingSavedProductPricingLineId ||\r\n\t\t\tsavedProductBeingRemovedId ||\r\n\t\t\tsavedProductBeingRemovedPricingLineId) != null || isUndoClickedState;\r\n\r\n\tconst clearUndoState = () => {\r\n\t\tsetStoredForUndoItem(null);\r\n\t\tsetStoredForUndoItemIndex(null);\r\n\t\tsetLastMoveStatus(null);\r\n\t};\r\n\r\n\tconst dispatchAddToCartEvent = (result: AddToCartResponse) => {\r\n\t\tdispatchRocEvent('added-to-cart', {\r\n\t\t\titems: [\r\n\t\t\t\t{\r\n\t\t\t\t\tid: result.productId,\r\n\t\t\t\t\tadjustedQuantity: result.adjustedQuantity,\r\n\t\t\t\t\tname: result.name,\r\n\t\t\t\t\tprice: result.snapshotSalePrice ? result.snapshotSalePrice : result.snapshotBasePrice,\r\n\t\t\t\t\tsku: result.sku,\r\n\t\t\t\t\tcurrency: result.snapshotCurrencyISO,\r\n\t\t\t\t\tproductGroupId: result.productGroupId,\r\n\t\t\t\t\tselections: result.selections,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t * Updates the cart, saved products, and cart summary\r\n\t * @param response\r\n\t * @param cartSummary\r\n\t */\r\n\tconst updateCartState = (response?: GetCartResult | null) => {\r\n\t\tif (!response) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (response.cart) {\r\n\t\t\tif (!setOrder) {\r\n\t\t\t\tconsole.warn('setOrder called but not defined.');\r\n\t\t\t} else {\r\n\t\t\t\tsetOrder(response.cart);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (response.savedProducts) {\r\n\t\t\tif (!setSavedProducts) {\r\n\t\t\t\tconsole.warn('setSavedProducts called but not defined.');\r\n\t\t\t} else {\r\n\t\t\t\tsetSavedProducts(response.savedProducts);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (response.cartSummary) {\r\n\t\t\tif (!setCartSummary) {\r\n\t\t\t\tconsole.warn('setCartSummary called but not defined.');\r\n\t\t\t} else {\r\n\t\t\t\tsetCartSummary(response.cartSummary);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tupdateOrderMessages(response.orderMessages);\r\n\t};\r\n\r\n\t// this runs when the component is mounted and every time the order changes because we want\r\n\t// to recalculate cart total item count\r\n\tuseEffect(() => {\r\n\t\tif (!order) {\r\n\t\t\tsetCartTotalItemCount(0);\r\n\t\t} else {\r\n\t\t\tconst itemsCount = order.recipients.reduce((itemsQty: number, orderRecipient: OrderRecipient) => {\r\n\t\t\t\titemsQty += orderRecipient.items.reduce((recipientQty: number, orderItem: OrderItem) => {\r\n\t\t\t\t\trecipientQty += orderItem.quantity;\r\n\t\t\t\t\treturn recipientQty;\r\n\t\t\t\t}, 0);\r\n\t\t\t\treturn itemsQty;\r\n\t\t\t}, 0);\r\n\r\n\t\t\tsetCartTotalItemCount(itemsCount);\r\n\t\t}\r\n\t\tclearUndoState();\r\n\t}, [order]);\r\n\r\n\t//#region Shopping Cart\r\n\r\n\t/**\r\n\t * Adds the last removed item to the cart\r\n\t */\r\n\tconst addToCart = async (props: AddToCartParams) => {\r\n\t\tsetErrorMessage(null);\r\n\t\tsetError(null);\r\n\r\n\t\tif (!isUndoClicked) {\r\n\t\t\tclearUndoState();\r\n\t\t}\r\n\r\n\t\tsetUpdatingOrderItemId(props.itemId);\r\n\r\n\t\ttry {\r\n\t\t\tconst response = await AxiosHelper.post('/ajax/cart', {\r\n\t\t\t\tproductId: props.itemId,\r\n\t\t\t\tquantity: props.quantity,\r\n\t\t\t\tproductPricingLineId: props.productPricingLineId,\r\n\t\t\t\tsavedProductsPageNumber: savedProducts?.pagination?.pageNumber || 1,\r\n\t\t\t\tsavedProductsPageSize: savedProducts?.pagination?.pageSize || 1000000,\r\n\t\t\t\taddOns: props.addOns,\r\n\t\t\t\tvalidateAddOns: props.validateAddOns ?? false,\r\n\t\t\t});\r\n\r\n\t\t\tupdateCartState(response.data);\r\n\r\n\t\t\tif (response.data) {\r\n\t\t\t\tdispatchAddToCartEvent(response.data);\r\n\t\t\t}\r\n\r\n\t\t\treturn response.data;\r\n\t\t} catch (error) {\r\n\t\t\tclearUndoState();\r\n\t\t\tsetError(error);\r\n\r\n\t\t\tconsole.warn('Error when undoing a remove from cart action', error);\r\n\r\n\t\t\tconst axiosError = error as AxiosError;\r\n\r\n\t\t\tif (axiosError && axiosError.response && axiosError.response.data) {\r\n\t\t\t\tif (axiosError.response.data.message) {\r\n\t\t\t\t\tsetErrorMessage(axiosError.response.data.message);\r\n\t\t\t\t}\r\n\t\t\t\tif (axiosError.response.data.exceptionCode) {\r\n\t\t\t\t\tsetErrorType(axiosError.response.data.exceptionCode);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthrow error;\r\n\t\t} finally {\r\n\t\t\tsetUpdatingOrderItemId(null);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Adds multiple items to cart\r\n\t */\r\n\tconst bulkAddToCart = async (props: BulkAddToCartProps) => {\r\n\t\tsetErrorMessage(null);\r\n\t\tsetError(null);\r\n\r\n\t\tif (!isUndoClicked) {\r\n\t\t\tclearUndoState();\r\n\t\t}\r\n\r\n\t\tprops.items.forEach((element) => {\r\n\t\t\tsetUpdatingOrderItemId(element.itemId);\r\n\t\t});\r\n\r\n\t\ttry {\r\n\t\t\tconst request = {\r\n\t\t\t\tproductInfo: props.items.map((item, index) => {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tproductId: item.itemId,\r\n\t\t\t\t\t\tproductPricingLineId: item.productPricingLineId,\r\n\t\t\t\t\t\tquantity: item.quantity,\r\n\t\t\t\t\t\tindex: index,\r\n\t\t\t\t\t};\r\n\t\t\t\t}),\r\n\t\t\t};\r\n\t\t\tconst response = await AxiosHelper.post('/ajax/cart/bulk', request);\r\n\r\n\t\t\tupdateCartState(response.data);\r\n\r\n\t\t\tif (response.data.processedItems && response.data.processedItems.length > 0) {\r\n\t\t\t\tdispatchRocEvent('added-to-cart', {\r\n\t\t\t\t\titems: response.data.processedItems.map((item) => {\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\tadjustedQuantity: item.adjustedQuantity,\r\n\t\t\t\t\t\t\tid: item.productId,\r\n\t\t\t\t\t\t\tname: item.name,\r\n\t\t\t\t\t\t\tsku: item.sku,\r\n\t\t\t\t\t\t\tprice: item.snapshotSalePrice ? item.snapshotSalePrice : item.snapshotBasePrice,\r\n\t\t\t\t\t\t\tcurrency: item.snapshotCurrencyISO,\r\n\t\t\t\t\t\t\tproductGroupId: item.productGroupId,\r\n\t\t\t\t\t\t\tselections: item.selections,\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t}),\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\treturn response.data;\r\n\t\t} catch (error) {\r\n\t\t\tclearUndoState();\r\n\t\t\tsetError(error);\r\n\r\n\t\t\tconsole.warn('Error when undoing a remove from cart action', error);\r\n\r\n\t\t\tconst axiosError = error as AxiosError;\r\n\r\n\t\t\tif (axiosError && axiosError.response && axiosError.response.data) {\r\n\t\t\t\tif (axiosError.response.data.message) {\r\n\t\t\t\t\tsetErrorMessage(axiosError.response.data.message);\r\n\t\t\t\t}\r\n\t\t\t\tif (axiosError.response.data.exceptionCode) {\r\n\t\t\t\t\tsetErrorType(axiosError.response.data.exceptionCode);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tthrow error;\r\n\t\t\t}\r\n\r\n\t\t\treturn null;\r\n\t\t} finally {\r\n\t\t\tsetUpdatingOrderItemId(null);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Add all items from the specified shopping list to the cart\r\n\t */\r\n\tconst addAllFromListToCurrentCart = async (props: AddAllToCartParams) => {\r\n\t\tsetErrorMessage(null);\r\n\t\tsetError(null);\r\n\r\n\t\ttry {\r\n\t\t\tconst response = await AxiosHelper.post(\r\n\t\t\t\t`/ajax/shopping-lists/${props.shoppingListId}/to-cart`,\r\n\t\t\t\t{\r\n\t\t\t\t\tdisplayedItemsCount: 3,\r\n\t\t\t\t\tshoppingListProductIds: props.selectedShoppingListProductIds,\r\n\t\t\t\t},\r\n\t\t\t);\r\n\r\n\t\t\treturn response.data;\r\n\t\t} catch (error) {\r\n\t\t\tclearUndoState();\r\n\t\t\tsetError(error);\r\n\r\n\t\t\tconsole.warn('Error when adding all products to cart', error);\r\n\r\n\t\t\tconst axiosError = error as AxiosError;\r\n\r\n\t\t\tif (axiosError && axiosError.response && axiosError.response.data) {\r\n\t\t\t\tif (axiosError.response.data.message) {\r\n\t\t\t\t\tsetErrorMessage(axiosError.response.data.message);\r\n\t\t\t\t}\r\n\t\t\t\tif (axiosError.response.data.exceptionCode) {\r\n\t\t\t\t\tsetErrorType(axiosError.response.data.exceptionCode);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tthrow error;\r\n\t\t\t}\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Add all items from the specified shopping list to the new cart\r\n\t */\r\n\tconst addAllFromListToNewCart = async (props: AddAllToCartParams) => {\r\n\t\tsetErrorMessage(null);\r\n\t\tsetError(null);\r\n\r\n\t\ttry {\r\n\t\t\tconst response = await AxiosHelper.post(\r\n\t\t\t\t`/ajax/shopping-lists/${props.shoppingListId}/to-new-cart`,\r\n\t\t\t\t{\r\n\t\t\t\t\tdisplayedItemsCount: 3,\r\n\t\t\t\t\tshoppingListProductIds: props.selectedShoppingListProductIds,\r\n\t\t\t\t},\r\n\t\t\t);\r\n\r\n\t\t\treturn response.data;\r\n\t\t} catch (error) {\r\n\t\t\tclearUndoState();\r\n\t\t\tsetError(error);\r\n\r\n\t\t\tconsole.warn('Error when adding all products to cart', error);\r\n\r\n\t\t\tconst axiosError = error as AxiosError;\r\n\r\n\t\t\tif (axiosError && axiosError.response && axiosError.response.data) {\r\n\t\t\t\tif (axiosError.response.data.message) {\r\n\t\t\t\t\tsetErrorMessage(axiosError.response.data.message);\r\n\t\t\t\t}\r\n\t\t\t\tif (axiosError.response.data.exceptionCode) {\r\n\t\t\t\t\tsetErrorType(axiosError.response.data.exceptionCode);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tthrow error;\r\n\t\t\t}\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Moves a product from the shopping cart to the user's saved products list\r\n\t * @param itemToMove\r\n\t */\r\n\tconst moveItemToSaved = async (itemToMove: OrderItem) => {\r\n\t\tif (!setSavedProducts || !setOrder || !order) {\r\n\t\t\tconsole.warn(\r\n\t\t\t\t'Saved product move to cart requested with one or more of the following undefined:\\n' +\r\n\t\t\t\t\t'setSavedProducts, setOrder, order',\r\n\t\t\t);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tsetErrorMessage(null);\r\n\t\tsetError(null);\r\n\r\n\t\tif (!isUndoClicked) {\r\n\t\t\tclearUndoState();\r\n\t\t}\r\n\r\n\t\tsetUpdatingOrderItemId(itemToMove.id);\r\n\r\n\t\ttry {\r\n\t\t\tif (!order || !order.recipients) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst response = await AxiosHelper.post('/ajax/saved-products/from-cart', {\r\n\t\t\t\tproductId: itemToMove.product.id,\r\n\t\t\t\titemId: itemToMove.id,\r\n\t\t\t\tproductPricingLineId: itemToMove.pricingLine.id,\r\n\t\t\t\tquantity: itemToMove.quantity,\r\n\t\t\t\tsavedProductsPageNumber:\r\n\t\t\t\t\t(savedProducts && savedProducts.pagination && savedProducts.pagination.pageNumber) || 1,\r\n\t\t\t\tsavedProductsPageSize:\r\n\t\t\t\t\t(savedProducts && savedProducts.pagination && savedProducts.pagination.pageSize) || 1000000,\r\n\t\t\t\taddOns: itemToMove.addOns,\r\n\t\t\t});\r\n\r\n\t\t\t// Find and save the moved item index\r\n\t\t\torder.recipients.map((recipient) => {\r\n\t\t\t\tsetStoredForUndoItemIndex({\r\n\t\t\t\t\trecipientId: recipient.id,\r\n\t\t\t\t\titemIndex: recipient.items.indexOf(itemToMove),\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\tupdateCartState(response.data);\r\n\t\t\tsetStoredForUndoItem(itemToMove);\r\n\t\t\tsetLastMoveStatus(MoveStatus.MovedToSaved);\r\n\t\t} catch (error) {\r\n\t\t\tclearUndoState();\r\n\r\n\t\t\tsetError(error);\r\n\r\n\t\t\tconsole.warn('Error when saving order item for later', error);\r\n\r\n\t\t\tconst axiosError = error as AxiosError;\r\n\t\t\tif (axiosError && axiosError.response && axiosError.response.data && axiosError.response.data.message) {\r\n\t\t\t\tsetErrorMessage(axiosError.response.data.message);\r\n\t\t\t} else {\r\n\t\t\t\tsetErrorMessage(Localizer('ProblemWhenSavingItem', itemToMove.name));\r\n\t\t\t}\r\n\t\t} finally {\r\n\t\t\tsetUpdatingOrderItemId(null);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Updates the quantity of the requested item with the new one\r\n\t * @param itemToUpdate\r\n\t * @param newQuantity\r\n\t */\r\n\tconst changeOrderItemQuantity = async (itemToUpdate: OrderItem, newQuantity: number) => {\r\n\t\tif (!setOrder) {\r\n\t\t\tconsole.warn('Item order quantity change requested with no setOrder function defined.');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tsetErrorMessage(null);\r\n\t\tsetError(null);\r\n\r\n\t\tif (!isUndoClicked) {\r\n\t\t\tclearUndoState();\r\n\t\t}\r\n\r\n\t\tsetUpdatingOrderItemId(itemToUpdate.id);\r\n\r\n\t\ttry {\r\n\t\t\tif (!order) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst response = await AxiosHelper.post('/ajax/cart/update', {\r\n\t\t\t\titemId: itemToUpdate.id,\r\n\t\t\t\tquantity: newQuantity,\r\n\t\t\t\tsavedProductsPageNumber:\r\n\t\t\t\t\t(savedProducts && savedProducts.pagination && savedProducts.pagination.pageNumber) || 1,\r\n\t\t\t\tsavedProductsPageSize:\r\n\t\t\t\t\t(savedProducts && savedProducts.pagination && savedProducts.pagination.pageSize) || 1000000,\r\n\t\t\t});\r\n\r\n\t\t\tupdateCartState(response.data);\r\n\t\t} catch (error) {\r\n\t\t\tconsole.warn(`Error when updating ${itemToUpdate.name}' quantity`, error);\r\n\r\n\t\t\tsetError(error);\r\n\t\t\tconst axiosError = error as AxiosError;\r\n\t\t\tif (axiosError && axiosError.response && axiosError.response.data && axiosError.response.data.message) {\r\n\t\t\t\tsetErrorMessage(axiosError.response.data.message);\r\n\t\t\t} else {\r\n\t\t\t\tsetErrorMessage(Localizer('ProblemWhenUpdatingItem', itemToUpdate.name));\r\n\t\t\t}\r\n\t\t} finally {\r\n\t\t\tsetUpdatingOrderItemId(null);\r\n\t\t\tclearUndoState();\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Updates the add ons of the requested item with the new ones\r\n\t */\r\n\tconst updateOrderItemAddOns = async (itemToUpdate: OrderItem, updatedAddOns: ProductAddOnDto[]) => {\r\n\t\tif (!setOrder) {\r\n\t\t\tconsole.warn('Item order add ons change requested with no setOrder function defined.');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tsetErrorMessage(null);\r\n\t\tsetError(null);\r\n\r\n\t\tif (!isUndoClicked) {\r\n\t\t\tclearUndoState();\r\n\t\t}\r\n\r\n\t\tsetUpdatingOrderItemId(itemToUpdate.id);\r\n\r\n\t\tif (!order) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst requestToken: CancelTokenSource = Axios.CancelToken.source();\r\n\t\tconst response = await AxiosHelper.post(\r\n\t\t\t'/ajax/cart/edit-add-ons',\r\n\t\t\t{ itemId: itemToUpdate.id, addOns: updatedAddOns },\r\n\t\t\t{\r\n\t\t\t\tcancelToken: requestToken.token,\r\n\t\t\t},\r\n\t\t);\r\n\r\n\t\tupdateCartState(response.data);\r\n\r\n\t\tsetUpdatingOrderItemId(null);\r\n\t\tclearUndoState();\r\n\t};\r\n\r\n\t/**\r\n\t * Removes the requested item from the cart\r\n\t * @param itemToRemove\r\n\t */\r\n\tconst removeOrderItem = async (itemToRemove: OrderItem) => {\r\n\t\tif (!setOrder || !order) {\r\n\t\t\tconsole.warn('Order item removal requested with no order or setOrder defined.');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tsetErrorMessage(null);\r\n\t\tsetError(null);\r\n\r\n\t\tif (!isUndoClicked) {\r\n\t\t\tclearUndoState();\r\n\t\t}\r\n\r\n\t\tsetOrderItemBeingRemovedId(itemToRemove.id);\r\n\r\n\t\ttry {\r\n\t\t\t// Find and save the moved item index\r\n\t\t\torder.recipients.map((recipient) => {\r\n\t\t\t\tsetStoredForUndoItemIndex({\r\n\t\t\t\t\trecipientId: recipient.id,\r\n\t\t\t\t\titemIndex: recipient.items.indexOf(itemToRemove),\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\tconst response = await AxiosHelper.post('/ajax/cart/remove', {\r\n\t\t\t\titemId: itemToRemove.id,\r\n\t\t\t\tsavedProductsPageNumber:\r\n\t\t\t\t\t(savedProducts && savedProducts.pagination && savedProducts.pagination.pageNumber) || 1,\r\n\t\t\t\tsavedProductsPageSize:\r\n\t\t\t\t\t(savedProducts && savedProducts.pagination && savedProducts.pagination.pageSize) || 1000000,\r\n\t\t\t});\r\n\r\n\t\t\tupdateCartState(response.data);\r\n\t\t\tsetStoredForUndoItem(itemToRemove);\r\n\t\t\tsetLastMoveStatus(MoveStatus.RemovedFromCart);\r\n\t\t} catch (error) {\r\n\t\t\tclearUndoState();\r\n\r\n\t\t\tsetErrorMessage(Localizer('ProblemWhenRemovingItem', itemToRemove.name));\r\n\t\t\tsetError(error);\r\n\t\t} finally {\r\n\t\t\tsetOrderItemBeingRemovedId(null);\r\n\t\t}\r\n\t};\r\n\t//#endregion\r\n\r\n\t//#region Save For Later\r\n\r\n\t/**\r\n\t * Handles adding an item to a saved products list\r\n\t * @param itemToAdd\r\n\t */\r\n\tconst addToSavedProducts = async (itemToAdd: OrderItem) => {\r\n\t\tif (!setSavedProducts) {\r\n\t\t\tconsole.warn('Add to saved products requested with no setSavedProducts defined.');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tsetErrorMessage(null);\r\n\t\tsetError(null);\r\n\r\n\t\tif (!isUndoClicked) {\r\n\t\t\tclearUndoState();\r\n\t\t}\r\n\r\n\t\tsetUpdatingSavedProductId(itemToAdd.product.id);\r\n\r\n\t\ttry {\r\n\t\t\t// Don't need to set undo info here as there is no way to run this function unless you are undoing a removal\r\n\t\t\tconst response = await AxiosHelper.post('/ajax/saved-products/save-for-later', {\r\n\t\t\t\tproductId: itemToAdd.product.id,\r\n\t\t\t\tproductPricingLineId: itemToAdd.pricingLine.id,\r\n\t\t\t\tquantity: itemToAdd.quantity,\r\n\t\t\t\tsavedProductsPageNumber:\r\n\t\t\t\t\t(savedProducts && savedProducts.pagination && savedProducts.pagination.pageNumber) || 1,\r\n\t\t\t\tsavedProductsPageSize:\r\n\t\t\t\t\t(savedProducts && savedProducts.pagination && savedProducts.pagination.pageSize) || 1000000,\r\n\t\t\t\taddOns: itemToAdd.addOns,\r\n\t\t\t});\r\n\r\n\t\t\tupdateCartState(response.data);\r\n\t\t} catch (error) {\r\n\t\t\tclearUndoState();\r\n\t\t\tsetError(error);\r\n\r\n\t\t\tconst axiosError = error as AxiosError;\r\n\r\n\t\t\tif (axiosError && axiosError.response && axiosError.response.data && axiosError.response.data.message) {\r\n\t\t\t\tsetErrorMessage(axiosError.response.data.message);\r\n\t\t\t} else {\r\n\t\t\t\tsetErrorMessage(Localizer('ProblemWhenSavingItem', itemToAdd.name));\r\n\t\t\t}\r\n\t\t} finally {\r\n\t\t\tsetUpdatingSavedProductId(null);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Moves a user's saved product to the shopping cart\r\n\t * @param productToMoveId\r\n\t * @param productName\r\n\t * @param productPricingLineId\r\n\t * @param quantity\r\n\t */\r\n\tconst moveSavedProductToCart = async (\r\n\t\tproductToMoveId: string,\r\n\t\tproductName: string,\r\n\t\tproductPricingLineId: string,\r\n\t\tquantity: number,\r\n\t\taddOns?: ProductAddOnDto[],\r\n\t) => {\r\n\t\tif (!setSavedProducts || !setOrder || !savedProducts) {\r\n\t\t\tconsole.warn(\r\n\t\t\t\t'Saved product move to cart requested with one or more of the following undefined:\\n' +\r\n\t\t\t\t\t'setSavedProducts, setOrder, savedProducts.',\r\n\t\t\t);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tsetErrorMessage(null);\r\n\t\tsetError(error);\r\n\r\n\t\tif (!isUndoClicked) {\r\n\t\t\tclearUndoState();\r\n\t\t}\r\n\r\n\t\tsetUpdatingSavedProductId(productToMoveId);\r\n\t\tsetUpdatingSavedProductPricingLineId(productPricingLineId);\r\n\r\n\t\ttry {\r\n\t\t\tif (!savedProducts || !savedProducts.results) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// find the index of the moved item in the saved products list\r\n\t\t\tconst savedProductIndex = savedProducts.results.findIndex(\r\n\t\t\t\t(product) => product.productId === productToMoveId,\r\n\t\t\t);\r\n\r\n\t\t\tconst response = await AxiosHelper.post('/ajax/saved-products/to-cart', {\r\n\t\t\t\tproductId: productToMoveId,\r\n\t\t\t\tquantity,\r\n\t\t\t\tproductPricingLineId: productPricingLineId,\r\n\t\t\t\tsavedProductsPageNumber:\r\n\t\t\t\t\t(savedProducts && savedProducts.pagination && savedProducts.pagination.pageNumber) || 1,\r\n\t\t\t\tsavedProductsPageSize:\r\n\t\t\t\t\t(savedProducts && savedProducts.pagination && savedProducts.pagination.pageSize) || 1000000,\r\n\t\t\t\taddOns: addOns,\r\n\t\t\t});\r\n\r\n\t\t\tupdateCartState(response.data);\r\n\r\n\t\t\tif (response.data.addToOrderResult) {\r\n\t\t\t\tdispatchAddToCartEvent(response.data.addToOrderResult);\r\n\t\t\t}\r\n\r\n\t\t\t// Find and save the moved item\r\n\t\t\tconst recipients = response.data.cart.recipients;\r\n\r\n\t\t\tfor (const recipient of recipients) {\r\n\t\t\t\tconst lastMovedItem = recipient.items.find(\r\n\t\t\t\t\t(item) => item.product.id === productToMoveId && item.pricingLine.id === productPricingLineId,\r\n\t\t\t\t);\r\n\t\t\t\tif (lastMovedItem) {\r\n\t\t\t\t\tsetStoredForUndoItem({ ...lastMovedItem, quantity });\r\n\t\t\t\t\tsetStoredForUndoItemIndex({ recipientId: recipient.id, itemIndex: savedProductIndex });\r\n\t\t\t\t\tconsole.log('Found last moved item');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tsetLastMoveStatus(MoveStatus.MovedToCart);\r\n\t\t} catch (error) {\r\n\t\t\tclearUndoState();\r\n\t\t\tsetError(error);\r\n\r\n\t\t\tconsole.warn('Error when moving the saved product to the cart.', error);\r\n\r\n\t\t\tconst axiosError = error as AxiosError;\r\n\r\n\t\t\tif (axiosError && axiosError.response && axiosError.response.data && axiosError.response.data.message) {\r\n\t\t\t\tsetErrorMessage(axiosError.response.data.message);\r\n\t\t\t} else {\r\n\t\t\t\tsetErrorMessage(Localizer('ProblemWhenMovingSavedItemToCart', productName));\r\n\t\t\t}\r\n\t\t} finally {\r\n\t\t\tsetUpdatingSavedProductId(null);\r\n\t\t\tsetUpdatingSavedProductPricingLineId(null);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Remove a user's saved product from their saved products list\r\n\t * @param productToRemoveId\r\n\t * @param productPricingLineId\r\n\t */\r\n\tconst removeSavedProduct = async (\r\n\t\tproductToRemoveId: string,\r\n\t\tproductToRemoveName: string,\r\n\t\tproductPricingLineId: string,\r\n\t\taddOns?: ProductAddOnDto[],\r\n\t) => {\r\n\t\tif (!setSavedProducts || !savedProducts) {\r\n\t\t\tconsole.warn('Saved product removal requested with savedProducts or setSavedProducts undefined');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tsetErrorMessage(null);\r\n\t\tsetError(null);\r\n\r\n\t\tif (!isUndoClicked) {\r\n\t\t\tclearUndoState();\r\n\t\t}\r\n\r\n\t\tsetSavedProductBeingRemovedId(productToRemoveId);\r\n\t\tsetSavedProductBeingRemovedPricingLineId(productPricingLineId);\r\n\r\n\t\ttry {\r\n\t\t\tif (!savedProducts.results) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst savedProductIndex = savedProducts.results.findIndex(\r\n\t\t\t\t(product) => product.productId === productToRemoveId,\r\n\t\t\t);\r\n\t\t\tconst savedProduct = savedProducts.results[savedProductIndex];\r\n\t\t\tconst response = await AxiosHelper.delete(\r\n\t\t\t\t'/ajax/saved-products/' +\r\n\t\t\t\t\tproductToRemoveId +\r\n\t\t\t\t\t'/' +\r\n\t\t\t\t\tproductPricingLineId +\r\n\t\t\t\t\t'?savedProductsPageNumber=' +\r\n\t\t\t\t\tsavedProducts.pagination.pageNumber.toString() +\r\n\t\t\t\t\t'&savedProductsPageSize=' +\r\n\t\t\t\t\tsavedProducts.pagination.pageSize.toString(),\r\n\t\t\t\t{\r\n\t\t\t\t\tdata: { addOns: addOns },\r\n\t\t\t\t},\r\n\t\t\t);\r\n\r\n\t\t\tif (savedProduct) {\r\n\t\t\t\t// Convert the SavedProduct into an OrderItem\r\n\t\t\t\tconst orderItemFromSaved: OrderItem = {\r\n\t\t\t\t\t...savedProduct,\r\n\t\t\t\t\tproduct: { ...savedProduct, id: savedProduct.productId },\r\n\t\t\t\t\ttotalPrice: savedProduct.totalPrice,\r\n\t\t\t\t\tunitPrice: savedProduct.unitPrice,\r\n\t\t\t\t};\r\n\r\n\t\t\t\tsetStoredForUndoItem(orderItemFromSaved);\r\n\t\t\t\tsetStoredForUndoItemIndex({ recipientId: '', itemIndex: savedProductIndex });\r\n\t\t\t}\r\n\r\n\t\t\tupdateCartState(response.data);\r\n\t\t\tsetLastMoveStatus(MoveStatus.RemovedFromSaved);\r\n\t\t} catch (error) {\r\n\t\t\tclearUndoState();\r\n\t\t\tsetError(error);\r\n\r\n\t\t\tconsole.warn('Error when removing the saved product.', error);\r\n\r\n\t\t\tsetErrorMessage(Localizer('ProblemWhenRemovingSavedItem', productToRemoveName));\r\n\t\t} finally {\r\n\t\t\tsetSavedProductBeingRemovedId(null);\r\n\t\t\tsetSavedProductBeingRemovedPricingLineId(null);\r\n\t\t}\r\n\t};\r\n\t//#endregion\r\n\r\n\t/**\r\n\t * Handle what happens when the Undo button is pressed\r\n\t */\r\n\tconst handleUndo = async () => {\r\n\t\tsetErrorMessage(null);\r\n\t\tsetError(null);\r\n\r\n\t\tif (!lastMoveStatus == null || !storedForUndoItem) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tisUndoClicked = true;\r\n\t\tsetIsUndoClickedState(true);\r\n\r\n\t\ttry {\r\n\t\t\tswitch (lastMoveStatus) {\r\n\t\t\t\tcase MoveStatus.RemovedFromCart:\r\n\t\t\t\t\tawait addToCart({\r\n\t\t\t\t\t\titemId: storedForUndoItem.product.id,\r\n\t\t\t\t\t\tquantity: storedForUndoItem.quantity,\r\n\t\t\t\t\t\tproductPricingLineId: storedForUndoItem.pricingLine.id,\r\n\t\t\t\t\t\taddOns: storedForUndoItem.addOns,\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase MoveStatus.MovedToCart:\r\n\t\t\t\t\tawait moveItemToSaved(storedForUndoItem);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase MoveStatus.MovedToSaved:\r\n\t\t\t\t\tawait moveSavedProductToCart(\r\n\t\t\t\t\t\tstoredForUndoItem.product.id,\r\n\t\t\t\t\t\tstoredForUndoItem.name,\r\n\t\t\t\t\t\tstoredForUndoItem.pricingLine.id,\r\n\t\t\t\t\t\tstoredForUndoItem.quantity,\r\n\t\t\t\t\t\tstoredForUndoItem.addOns,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase MoveStatus.RemovedFromSaved:\r\n\t\t\t\t\tawait addToSavedProducts(storedForUndoItem);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t} finally {\r\n\t\t\tisUndoClicked = false;\r\n\t\t\tsetIsUndoClickedState(false);\r\n\t\t\tclearUndoState();\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Handles updating order\r\n\t * @param newCart\r\n\t */\r\n\tconst updateOrder = (newCart: Order) => {\r\n\t\tif (setOrder) {\r\n\t\t\tsetOrder(newCart);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Handles updating order messages\r\n\t * @param orderMessages Updated order messages\r\n\t */\r\n\tconst updateOrderMessages = (orderMessages: OrderMessage[]) => {\r\n\t\tif (!setOrderMessages) {\r\n\t\t\tconsole.warn('setOrderMessages called but not defined.');\r\n\t\t} else {\r\n\t\t\tsetOrderMessages(orderMessages);\r\n\t\t}\r\n\t};\r\n\r\n\treturn {\r\n\t\tstate: {\r\n\t\t\torderIsUpdating,\r\n\t\t\torder: useShoppingCartParams ? useShoppingCartParams.order : null,\r\n\t\t\tsavedProducts: useShoppingCartParams ? useShoppingCartParams.savedProducts : null,\r\n\t\t\tcartTotalItemCount,\r\n\r\n\t\t\tupdatingOrderItemId,\r\n\t\t\torderItemBeingRemovedId,\r\n\t\t\tupdatingSavedProductId,\r\n\t\t\tupdatingSavedProductPricingLineId,\r\n\t\t\tsavedProductBeingRemovedId,\r\n\t\t\tsavedProductBeingRemovedPricingLineId,\r\n\r\n\t\t\tstoredForUndoItem,\r\n\t\t\tstoredForUndoItemIndex,\r\n\t\t\tlastMoveStatus,\r\n\t\t\tisUndoClickedState,\r\n\r\n\t\t\terror,\r\n\t\t\terrorMessage,\r\n\t\t\terrorType,\r\n\t\t},\r\n\t\tactor: {\r\n\t\t\taddToCart,\r\n\t\t\tbulkAddToCart,\r\n\t\t\taddAllFromListToCurrentCart,\r\n\t\t\taddAllFromListToNewCart,\r\n\t\t\tchangeOrderItemQuantity,\r\n\t\t\tupdateOrderItemAddOns,\r\n\t\t\tmoveItemToSaved,\r\n\t\t\tremoveOrderItem,\r\n\r\n\t\t\taddToSavedProducts,\r\n\t\t\tmoveSavedProductToCart,\r\n\t\t\tremoveSavedProduct,\r\n\r\n\t\t\thandleUndo,\r\n\t\t\tsetErrorMessage,\r\n\t\t\tsetError,\r\n\r\n\t\t\tupdateOrder,\r\n\t\t\tupdateOrderMessages,\r\n\t\t\tsetUpdatingOrderItemId,\r\n\t\t},\r\n\t};\r\n}\r\n","import { useInView, IntersectionOptions, InViewHookResponse } from 'react-intersection-observer';\r\nimport { useEffect, useState } from 'react';\r\n\r\n/**\r\n * Wrapper hook to useInView so that it only triggers once. Useful for lazy-loaded content that\r\n * doesn't need to change once it's out of view.\r\n */\r\nexport function useInViewOnce(options: IntersectionOptions = {}): InViewHookResponse {\r\n\tconst inViewHookResponse = useInView(options);\r\n\tconst [viewed, setViewed] = useState(false);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (inViewHookResponse.inView) {\r\n\t\t\tsetViewed(true);\r\n\t\t}\r\n\t}, [inViewHookResponse.inView]);\r\n\r\n\tconst newResponse: InViewHookResponse = {\r\n\t\t...inViewHookResponse,\r\n\t\tinView: viewed,\r\n\t\t[0]: inViewHookResponse[0],\r\n\t\t[1]: viewed,\r\n\t\t[2]: inViewHookResponse[2],\r\n\t};\r\n\r\n\tfunction* makeIterator() {\r\n\t\tyield newResponse[0];\r\n\t\tyield newResponse[1];\r\n\t\tyield newResponse[2];\r\n\t}\r\n\r\n\tnewResponse[Symbol.iterator] = makeIterator;\r\n\r\n\treturn newResponse;\r\n}\r\n","import classnames from 'classnames';\r\nimport React, { ImgHTMLAttributes, useEffect, useState } from 'react';\r\nimport { useInViewOnce } from 'shared/hooks/useInViewOnce';\r\n\r\ninterface LazyImageProps extends ImgHTMLAttributes {\r\n\tplaceholderImg?: string;\r\n\tbackgroundImg?: boolean;\r\n\tclassName?: string;\r\n\tinactiveClassName?: string;\r\n\tloadedClassName?: string;\r\n\tdelay?: number;\r\n\talt: string;\r\n\tsrc: string;\r\n}\r\n\r\n/**\r\n * Component that will render an tag that will have its source image lazily loaded only once\r\n * the element is visible in the viewport.\r\n * @param props\r\n */\r\nexport default function LazyImage({\r\n\tplaceholderImg = '/images/placeholder/placeholder-image.png',\r\n\tsrc,\r\n\talt,\r\n\tbackgroundImg = false,\r\n\tdelay = 0,\r\n\tclassName,\r\n\tinactiveClassName = 'roc-lazy-image--inactive',\r\n\tloadedClassName = 'roc-lazy-image--loaded',\r\n\t...rest\r\n}: LazyImageProps) {\r\n\tconst [ref, viewed] = useInViewOnce({\r\n\t\tthreshold: 0,\r\n\t});\r\n\r\n\tconst [loadedClassDisplayed, setLoadedClassDisplayed] = useState(false);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (viewed) {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tsetLoadedClassDisplayed(true);\r\n\t\t\t}, delay);\r\n\t\t}\r\n\t}, [viewed, delay]);\r\n\r\n\tconst imageSrc = viewed ? src : placeholderImg;\r\n\r\n\tconst classes = classnames(className, {\r\n\t\t[inactiveClassName]: !viewed,\r\n\t\t[loadedClassName]: loadedClassDisplayed,\r\n\t});\r\n\r\n\tif (backgroundImg) {\r\n\t\treturn
;\r\n\t} else {\r\n\t\treturn {alt};\r\n\t}\r\n}\r\n","import React from 'react';\r\nimport { SVGProps } from './SVGProps';\r\nimport classnames from 'classnames';\r\n\r\n/**\r\n * Spinner SVG for loading purposes\r\n *\r\n * @returns\r\n */\r\nfunction MagnifyingGlassSVG({ className, ...rest }: SVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default MagnifyingGlassSVG;\r\n","// These functions may be potentially innaccurate in certain locales that use differing amounts of characters in different cases\r\n\r\n/**\r\n * Tests if a string includes another if casing is ignored\r\n * @param thisString The string to test\r\n * @param otherString The potentially included string being tested for\r\n */\r\nexport function stringWeaklyIncludes(thisString: string, otherString: string) {\r\n\treturn thisString.toLocaleLowerCase().includes(otherString.toLocaleLowerCase());\r\n}\r\n\r\n/**\r\n * Tests if a string starts with another if casing is ignored\r\n * @param thisString The string to test\r\n * @param otherString The potentially included string being tested for\r\n */\r\nexport function stringWeaklyStartsWith(thisString: string, otherString: string) {\r\n\treturn thisString.toLocaleLowerCase().startsWith(otherString.toLocaleLowerCase());\r\n}\r\n\r\n/**\r\n * Tests if a string ends with another if casing is ignored\r\n * @param thisString The string to test\r\n * @param otherString The potentially included string being tested for\r\n */\r\nexport function stringWeaklyEndsWith(thisString: string, otherString: string) {\r\n\treturn thisString.toLocaleLowerCase().endsWith(otherString.toLocaleLowerCase());\r\n}\r\n\r\n/**\r\n * Converts the first character in a string to upper-case. Will not work for all languages (for example Dutch).\r\n *\r\n * @export\r\n * @param {string} thisString\r\n * @returns\r\n */\r\nexport function firstCharacterToUpper(thisString: string) {\r\n\tif (!thisString) {\r\n\t\treturn '';\r\n\t}\r\n\r\n\tlet newString = thisString.substring(0, 1).toLocaleUpperCase();\r\n\r\n\tif (thisString.length > 1) {\r\n\t\tnewString += thisString.substring(1);\r\n\t}\r\n\r\n\treturn newString;\r\n}\r\n\r\n/**\r\n * Converts the first character in a string to upper-case. Will not work for all languages (for example Dutch).\r\n *\r\n * @export\r\n * @param {string} thisString\r\n * @returns\r\n */\r\nexport function firstCharacterToLower(thisString: string) {\r\n\tif (!thisString) {\r\n\t\treturn '';\r\n\t}\r\n\r\n\tlet newString = thisString.substring(0, 1).toLocaleLowerCase();\r\n\r\n\tif (thisString.length > 1) {\r\n\t\tnewString += thisString.substring(1);\r\n\t}\r\n\r\n\treturn newString;\r\n}\r\n\r\n// https://github.com/uxitten/polyfill/blob/master/string.polyfill.js\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart\r\nexport function padStart(value, targetLength, padString) {\r\n\t// tslint:disable-next-line:no-bitwise\r\n\ttargetLength = targetLength >> 0; // truncate if number, or convert non-number to 0;\r\n\tpadString = String(typeof padString !== 'undefined' ? padString : ' ');\r\n\tif (value.length >= targetLength) {\r\n\t\treturn String(value);\r\n\t} else {\r\n\t\ttargetLength = targetLength - value.length;\r\n\t\tif (targetLength > padString.length) {\r\n\t\t\tpadString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed\r\n\t\t}\r\n\t\treturn padString.slice(0, targetLength) + String(value);\r\n\t}\r\n}\r\n\r\n/**\r\n * Converts a string from \" Something Like This\" to \"something-like-this\"\r\n * @param value The string to convert\r\n */\r\nexport function toKebabCase(value: string) {\r\n\tif (!value || !value.trim()) {\r\n\t\treturn '';\r\n\t}\r\n\r\n\treturn value\r\n\t\t.trim()\r\n\t\t.replace(/[^a-zA-Z0-9]+/g, '-')\r\n\t\t.replace(/([a-z0-9])([A-Z])/g, '$1-$2')\r\n\t\t.replace(/([A-Z])([A-Z])(?=[a-z])/g, '$1-$2')\r\n\t\t.replace(/-$/, '')\r\n\t\t.toLocaleLowerCase();\r\n}\r\n\r\n/**\r\n * Converts a string from PascalCase, camelCase, snake_case, or space separated to camelCase. Beginning and trailing whitespace are trimmed.\r\n * @param value The string to convert\r\n */\r\nexport function toCamelCase(value: string) {\r\n\treturn value\r\n\t\t.replace(/(?:^\\w|[A-Z]|\\b\\w)/g, function (word, index) {\r\n\t\t\treturn index === 0 ? word.toLowerCase() : word.toUpperCase();\r\n\t\t})\r\n\t\t.replace(/(?:\\s+|[-_])/g, '');\r\n}\r\n\r\n/**\r\n * Removes html characters\r\n *\r\n * @export\r\n * @param {*} html\r\n * @returns\r\n */\r\nexport function stripHtml(html) {\r\n\tconst tmp = document.createElement('div');\r\n\ttmp.innerHTML = html;\r\n\treturn tmp.textContent || tmp.innerText || '';\r\n}\r\n\r\n/**\r\n * Cuts of text and adds ellipsis (...) after a certain number of characters\r\n * @param text The text to format\r\n * @param cutoff The number of characters to add the ellipsis after\r\n */\r\nexport function addEllipsis(text: string, cutoff: number = 20) {\r\n\tif (!text || text.length < cutoff) {\r\n\t\treturn text;\r\n\t}\r\n\r\n\treturn text.substring(0, cutoff) + '...';\r\n}\r\n\r\n/**\r\n * Trims a string value\r\n */\r\nexport function trimString(value: string) {\r\n\treturn value ? value.trim() : '';\r\n}\r\n","import { CancelToken } from 'axios';\r\nimport { Request as AutocompleteRequest, Response as AutocompleteResponse } from 'models/Autocomplete';\r\nimport { Request as CompareItemRequest, Response as CompareDataResponse } from 'models/CompareItems';\r\nimport { Request as SearchRequest, Response as SearchResponse } from 'models/Search';\r\nimport { HawkSearchConfig } from 'types/HawkSearchConfig';\r\nimport * as Constants from 'util/Constants';\r\nimport AxiosHelper from '../../../../services/AxiosHelper';\r\nimport { Request as RecommendationRequest, Response as RecommendationResponse } from '../models/Recommendation';\r\n\r\nclass HawkClient {\r\n\tprivate baseUrl: string;\r\n\tprivate searchUrl: string;\r\n\tprivate dashboardUrl: string;\r\n\tprivate autocompleteUrl: string;\r\n\tprivate compareItemsURL: string;\r\n\tprivate recommendationUrl: string;\r\n\tprivate recommendationWidgetUrl: string;\r\n\t// #region HCL\r\n\tprivate enableRemovingDashesFromSearchKeyword: boolean;\r\n\t// #endregion\r\n\r\n\tconstructor(config: HawkSearchConfig) {\r\n\t\tthis.baseUrl = config.apiUrl || Constants.defaultApiUrl;\r\n\t\tthis.dashboardUrl = config.dashboardUrl || Constants.defaultDashboardUrl;\r\n\t\tthis.searchUrl = config.searchUrl || Constants.defaultSearchUrl;\r\n\t\tthis.autocompleteUrl = config.autocompleteUrl || Constants.defaultAutocompleteUrl;\r\n\t\tthis.recommendationUrl = config.recommendationUrl || Constants.defaultRecommendationUrl;\r\n\t\tthis.recommendationWidgetUrl = config.recommendationWidgetUrl || Constants.recommendationWidgetUrl;\r\n\t\t/* #region Commerce */\r\n\t\tthis.compareItemsURL = config.compareItemsURL || Constants.defaultCompareItemsURL;\r\n\t\t/* #endregion */\r\n\t\t/* #region HCL */\r\n\t\tthis.enableRemovingDashesFromSearchKeyword =\r\n\t\t\tconfig.enableRemovingDashesFromSearchKeyword || Constants.enableRemovingDashesFromSearchKeyword;\r\n\t\t/* #endregion */\r\n\t}\r\n\r\n\t// #region HCL\r\n\tpublic async search(request: SearchRequest, cancellationToken?: CancelToken): Promise {\r\n\t\tconst result = await AxiosHelper.post(\r\n\t\t\t'/ajax/hawksearch/search',\r\n\t\t\t{ request },\r\n\t\t\t{ cancelToken: cancellationToken },\r\n\t\t);\r\n\r\n\t\treturn result.data;\r\n\t}\r\n\r\n\tpublic async autocomplete(\r\n\t\trequest: AutocompleteRequest,\r\n\t\tcancellationToken?: CancelToken,\r\n\t): Promise {\r\n\t\tconst result = await AxiosHelper.post(\r\n\t\t\t'/ajax/hawksearch/autocomplete',\r\n\t\t\t{ request },\r\n\t\t\t{ cancelToken: cancellationToken },\r\n\t\t);\r\n\r\n\t\treturn result.data;\r\n\t}\r\n\r\n\tpublic async getComparedItems(\r\n\t\trequest: CompareItemRequest,\r\n\t\tcancellationToken?: CancelToken,\r\n\t): Promise {\r\n\t\tconst result = await AxiosHelper.post(\r\n\t\t\t'/ajax/hawksearch/compare',\r\n\t\t\t{ request },\r\n\t\t\t{ cancelToken: cancellationToken },\r\n\t\t);\r\n\r\n\t\treturn result.data;\r\n\t}\r\n\r\n\tpublic async getRecommendationWidgetItems(\r\n\t\trequest: RecommendationRequest,\r\n\t\tcancellationToken?: CancelToken,\r\n\t): Promise {\r\n\t\tconst result = await AxiosHelper.post(\r\n\t\t\t'/ajax/hawksearch/recommendation',\r\n\t\t\t{ request },\r\n\t\t\t{ cancelToken: cancellationToken },\r\n\t\t);\r\n\r\n\t\treturn result.data;\r\n\t}\r\n\t// #endregion\r\n}\r\n\r\nexport default HawkClient;\r\n","import React from 'react';\r\nimport { SVGProps } from './SVGProps';\r\n\r\n/**\r\n * Shopping Cart SVG\r\n *\r\n * @returns\r\n */\r\nfunction ShoppingCartSVG({ className, ...rest }: SVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nShoppingCartSVG.defaultProps = { className: '' };\r\n\r\nexport default ShoppingCartSVG;\r\n","import { Request } from 'models/Search/Request';\r\nimport * as Constants from 'util/Constants';\r\n\r\n/** Represents parts of the browser query string that are fixed and are always single strings. */\r\ninterface ParsedQueryStringFixed {\r\n\tkeyword?: string;\r\n\tsort?: string;\r\n\tpg?: string;\r\n\tlp?: string;\r\n\tPageId?: string;\r\n\tlpurl?: string;\r\n\tmpp?: string;\r\n\tsearchWithin?: string;\r\n\tis100Coverage?: string;\r\n\tindexName?: string;\r\n}\r\n\r\n/**\r\n * Represents the parts of the browser query string that are dynamic (the selected facets). Facets\r\n * can have multiple values, so the value of these is always an array of strings.\r\n */\r\ninterface ParsedQueryStringDynamic {\r\n\t[key: string]: string[];\r\n}\r\n\r\ntype ParsedQueryString = ParsedQueryStringFixed & ParsedQueryStringDynamic;\r\n\r\n/**\r\n * Parses the input query string and returns an object that can be used to build a search request.\r\n * The object returned will usually have the keys: `keyword`, `sort`, `pg`,`lp`,`lpurl`, `mpp`, and then more keys\r\n * for every selected facet.\r\n * @param search The input query string.\r\n */\r\nfunction parseQueryStringToObject(search: string) {\r\n\tconst params = new URLSearchParams(search);\r\n\r\n\tconst parsed: ParsedQueryString = {};\r\n\r\n\tparams.forEach((value, key) => {\r\n\t\tif (\r\n\t\t\tkey === 'keyword' ||\r\n\t\t\tkey === 'sort' ||\r\n\t\t\tkey === 'pg' ||\r\n\t\t\tkey === 'lp' ||\r\n\t\t\tkey === 'PageId' ||\r\n\t\t\tkey === 'lpurl' ||\r\n\t\t\tkey === 'mpp' ||\r\n\t\t\tkey === 'searchWithin' ||\r\n\t\t\tkey === 'is100Coverage' ||\r\n\t\t\tkey === 'indexName'\r\n\t\t) {\r\n\t\t\t// `keyword` is special and should never be turned into an array\r\n\t\t\tparsed[key] = value;\r\n\t\t} else {\r\n\t\t\t// everything else should be turned into an array\r\n\r\n\t\t\tif (!value) {\r\n\t\t\t\t// no useful value for this query param, so skip it\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// multiple selections are split by commas, so split into an array\r\n\t\t\tconst multipleValues = value.split(',');\r\n\r\n\t\t\t// and now handle any comma escaping - any single value that contained a comma is escaped to '::'\r\n\t\t\tfor (let x = 0; x < multipleValues.length; ++x) {\r\n\t\t\t\t/* #region HCL */\r\n\t\t\t\tmultipleValues[x] = multipleValues[x].replace(/%c%/g, ',');\r\n\t\t\t\t/* #endregion */\r\n\t\t\t}\r\n\r\n\t\t\tparsed[key] = multipleValues;\r\n\t\t}\r\n\t});\r\n\r\n\treturn parsed;\r\n}\r\n\r\n/**\r\n * Parses the abosulte url into a `HawkClient` client search request object.\r\n * @param location The input location.\r\n * @param searchUrl The search page URL.\r\n */\r\nexport function parseLocation(\r\n\tlocation: Location,\r\n\tsearchUrl: string = Constants.defaultSearchPageUrl,\r\n): Partial {\r\n\t// TODO: Constants.defaultSearchPageUrl could be problematic if\r\n\t// someone defines a landing page with the custom url '/search'\r\n\tconst searchRequest = parseSearchQueryString(location.search, searchUrl);\r\n\r\n\treturn searchRequest;\r\n}\r\n\r\n/**\r\n * Parses the input query string into a `HawkClient` client search request object.\r\n * @param search The input query string.\r\n * @param searchUrl The search page URL.\r\n */\r\nexport function parseSearchQueryString(\r\n\tsearch: string,\r\n\tsearchUrl: string = Constants.defaultSearchPageUrl,\r\n): Partial {\r\n\tconst queryObj = parseQueryStringToObject(search);\r\n\r\n\t// extract out components, including facet selections\r\n\tconst {\r\n\t\tkeyword,\r\n\t\tsort,\r\n\t\tpg,\r\n\t\tmpp,\r\n\t\tlp,\r\n\t\tPageId,\r\n\t\tlpurl,\r\n\t\tsearchWithin,\r\n\t\tis100Coverage,\r\n\t\tindexName,\r\n\t\t...facetSelections\r\n\t} = queryObj;\r\n\r\n\t// ignore landing pages if keyword is passed\r\n\tconst pageId = lp || PageId;\r\n\tconst request = {\r\n\t\tKeyword: lpurl || pageId ? '' : keyword,\r\n\r\n\t\tSortBy: sort,\r\n\t\tPageNo: pg ? Number(pg) : undefined,\r\n\t\tMaxPerPage: mpp ? Number(mpp) : undefined,\r\n\t\tPageId: pageId ? Number(pageId) : undefined,\r\n\t\tCustomUrl: lpurl,\r\n\t\tSearchWithin: searchWithin,\r\n\t\tIs100CoverageTurnedOn: is100Coverage ? Boolean(is100Coverage) : undefined,\r\n\t\tFacetSelections: facetSelections,\r\n\t\tIndexName: indexName,\r\n\t};\r\n\r\n\t// customUrl have priority over keywords\r\n\tif (isPathLandingPage(location.pathname, searchUrl)) {\r\n\t\t// #region HCL\r\n\t\trequest.Keyword = keyword;\r\n\t\t// #endregion\r\n\t\trequest.CustomUrl = location.pathname.replace(searchUrl, '');\r\n\t}\r\n\r\n\treturn request;\r\n}\r\n\r\n/**\r\n * Checks if the input path is a landing page and not the search page URL.\r\n * @param path The input path.\r\n * @param searchUrl The search page URL.\r\n */\r\nexport function isPathLandingPage(path: string, searchUrl: string): boolean {\r\n\tif (!path) {\r\n\t\t// if there's no path, this request can't be for a landing page\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif (!path.endsWith('/')) {\r\n\t\tpath = path + '/';\r\n\t}\r\n\r\n\tif (!searchUrl.endsWith('/')) {\r\n\t\tsearchUrl = searchUrl + '/';\r\n\t}\r\n\r\n\treturn path !== searchUrl;\r\n}\r\n\r\n/**\r\n * Converts a search query object (such as one returned from `parseSearchQueryString`) and converts\r\n * it into a browser query string\r\n * @param queryObj The query object to convert to a query string.\r\n */\r\nfunction convertObjectToQueryString(queryObj: ParsedQueryString) {\r\n\tconst queryStringValues: string[] = [];\r\n\r\n\tfor (const key in queryObj) {\r\n\t\tif (queryObj.hasOwnProperty(key)) {\r\n\t\t\tif (\r\n\t\t\t\tkey === 'keyword' ||\r\n\t\t\t\tkey === 'sort' ||\r\n\t\t\t\tkey === 'pg' ||\r\n\t\t\t\tkey === 'mpp' ||\r\n\t\t\t\tkey === 'searchWithin' ||\r\n\t\t\t\tkey === 'is100Coverage' ||\r\n\t\t\t\tkey === 'indexName'\r\n\t\t\t) {\r\n\t\t\t\tconst value = queryObj[key];\r\n\r\n\t\t\t\tif (value === undefined || value === null) {\r\n\t\t\t\t\t// if any of the special keys just aren't defined or are null, don't include them in\r\n\t\t\t\t\t// the query string\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (typeof value !== 'string') {\r\n\t\t\t\t\tthrow new Error(`${key} must be a string`);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// certain strings are special and are never arrays\r\n\t\t\t\tqueryStringValues.push(key + '=' + encodeURIComponent(value));\r\n\t\t\t} else {\r\n\t\t\t\tconst values = queryObj[key];\r\n\r\n\t\t\t\t// handle comma escaping - if any of the values contains a comma, they need to be escaped first\r\n\t\t\t\tconst escapedValues: string[] = [];\r\n\r\n\t\t\t\tfor (const unescapedValue of values) {\r\n\t\t\t\t\t/* #region HCL */\r\n\t\t\t\t\tescapedValues.push(unescapedValue.replace(/,/g, '%c%'));\r\n\t\t\t\t\t/* #endregion */\r\n\t\t\t\t}\r\n\r\n\t\t\t\tqueryStringValues.push(key + '=' + escapedValues.join(','));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn '?' + queryStringValues.join('&');\r\n}\r\n\r\n/**\r\n * Converts a partial search request object into a browser query string.\r\n * @param searchRequest The search request object to convert.\r\n */\r\nexport function getSearchQueryString(searchRequest: Partial) {\r\n\tconst searchQuery = {\r\n\t\tkeyword: searchRequest.Keyword,\r\n\t\tsort: searchRequest.SortBy,\r\n\t\tpg: searchRequest.PageNo ? String(searchRequest.PageNo) : undefined,\r\n\t\tmpp: searchRequest.MaxPerPage ? String(searchRequest.MaxPerPage) : undefined,\r\n\t\tis100Coverage: searchRequest.Is100CoverageTurnedOn ? String(searchRequest.Is100CoverageTurnedOn) : undefined,\r\n\t\tsearchWithin: searchRequest.SearchWithin,\r\n\r\n\t\t...searchRequest.FacetSelections,\r\n\t} as ParsedQueryString;\r\n\r\n\treturn convertObjectToQueryString(searchQuery);\r\n}\r\n","var api = require(\"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!./styles.css\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","/**\r\n * Returns the input string without dashes if the input matches this regex /^[A-Za-z0-9]{0,7}-[A-Za-z0-9]{0,7}$/.\r\n * The regex should be validated so the string contains at most 7 characters before the dash & Matches at most 7 characters after the dash\r\n */\r\n\r\nexport function validateQueryAndRemoveDash(inputString) {\r\n\t// Matches at most 7 characters before the dash & Matches at most 7 characters after the dash\r\n\tconst regex = /^[A-Za-z0-9]{0,7}-[A-Za-z0-9]{0,7}$/;\r\n\r\n\tif (regex.test(inputString)) {\r\n\t\treturn inputString.replace('-', '');\r\n\t}\r\n\r\n\treturn inputString;\r\n}\r\n","import { ExternalLoginProvider } from 'features/login/ExternalLogins';\r\n\r\n/**\r\n * Extends Window with a property that will hold the client data\r\n *\r\n * @interface WindowWithClientData\r\n * @extends {Window}\r\n */\r\ninterface WindowWithServerData extends Window {\r\n\t__ROC_SERVER_DATA__?: Array<{\r\n\t\t[name: string]: string;\r\n\t}>;\r\n}\r\n\r\n/**\r\n * This type will hold all the keys that are used by ServerData\r\n */\r\ninterface ServerData {\r\n\tIsReCaptchaEnabled?: boolean;\r\n\tReCaptchaV3Key?: string;\r\n\tTimeZone?: string;\r\n\tUSE_EMAIL_AS_USERNAME?: boolean;\r\n\tRegistrationThankYouTitle?: string;\r\n\tRegistrationThankYouMessage?: string;\r\n\tForgotPasswordConfirmationTitle?: string;\r\n\tForgotPasswordConfirmationMessage?: string;\r\n\tPageTitleSuffix?: string;\r\n\tRequireConfirmEmail?: boolean;\r\n\tACCOUNT_URL_BASE?: string;\r\n\tACCOUNT_LOGIN_URL?: string;\r\n\tACCOUNT_LOGOUT_URL?: string;\r\n\tACCOUNT_REGISTER_URL?: string;\r\n\tACCOUNT_LOGIN_WITH_2FA_URL?: string;\r\n\tACCOUNT_FORGOT_PASSWORD_URL?: string;\r\n\tACCOUNT_LOGIN_WITH_RECOVERY_CODE_URL?: string;\r\n\tEXTERNAL_LOGIN_PROVIDERS?: ExternalLoginProvider[];\r\n\t// #region Commerce\r\n\tACCOUNT_ORGANIZATION_REVIEW_URL?: string;\r\n\tACCOUNT_ORGANIZATION_SELECTOR_URL?: string;\r\n\tGoogleMapsApiKey?: string; // used in Store Locator\r\n\tMinimumTimeBeforeRecentlyViewedProductsAreValidated?: number;\r\n\tQuickOrderItemMinumumSearchCharacters?: number;\r\n\tMaxAllowedQuickOrderItems?: number;\r\n\tMaxNumberForQuantityDropdown?: number;\r\n\tOrderDetailsUIComponent?: string;\r\n\tGuestCheckoutEnabled?: boolean;\r\n\t// #endregion\r\n}\r\n\r\n/**\r\n * Main object that will hold all the client data\r\n */\r\nexport const ServerData: ServerData = {};\r\n\r\n/**\r\n * Initializer function that will populate the main settings object\r\n */\r\nfunction initializeServerData() {\r\n\tconst windowWithServerData = window as WindowWithServerData;\r\n\r\n\tif (\r\n\t\twindowWithServerData &&\r\n\t\twindowWithServerData.__ROC_SERVER_DATA__ &&\r\n\t\tArray.isArray(windowWithServerData.__ROC_SERVER_DATA__)\r\n\t) {\r\n\t\tfor (const obj of windowWithServerData.__ROC_SERVER_DATA__) {\r\n\t\t\tfor (const key of Object.keys(obj)) {\r\n\t\t\t\tServerData[key] = obj[key];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\ninitializeServerData();\r\n","import React from 'react';\r\nimport { SVGProps } from './SVGProps';\r\nimport classnames from 'classnames';\r\n\r\n/**\r\n * Question Mark within a Circle SVG\r\n */\r\nfunction QuestionMarkCircleSVG({ className, ...rest }: SVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default QuestionMarkCircleSVG;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { Localizer } from 'services/Localizer';\r\nimport { AddToCartResponse } from 'services/UserData.Commerce';\r\nimport ProductPricing from 'shared/components/commerce/ProductPricing';\r\nimport LockSVG from 'shared/components/svg/LockSVG';\r\nimport OrderMessages from '../shopping-cart/OrderMessages';\r\n\r\ninterface AddedToCartAlertProps {\r\n\tresponse: AddToCartResponse;\r\n}\r\n\r\n/**\r\n * Displays Added to Cart confirmation\r\n */\r\nexport default function AddedToCartAlert(props: AddedToCartAlertProps) {\r\n\tconst { response } = props;\r\n\tconst [displayAlert, setDisplayAlert] = useState(true);\r\n\r\n\tuseEffect(() => {\r\n\t\tsetDisplayAlert(true);\r\n\t}, [response]);\r\n\r\n\tif (!displayAlert) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\treturn (\r\n\t\t
\r\n\t\t\t\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t{response.imageUrl ? (\r\n\t\t\t\t\t\t\t{response.name}\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t

\r\n\t\t\t\t\t\t\t{response.name}\r\n\t\t\t\t\t\t

\r\n\t\t\t\t\t\t

\r\n\t\t\t\t\t\t\t{/* #region HCL - replace SKU to ItemNumber */}\r\n\t\t\t\t\t\t\t{Localizer('ItemNumber')}:  \r\n\t\t\t\t\t\t\t{/* #endregion */}\r\n\t\t\t\t\t\t\t{response.sku}\r\n\t\t\t\t\t\t

\r\n\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{response.selections !== null && response.selections.length > 0\r\n\t\t\t\t\t\t\t\t\t? response.selections.map((selection) => (\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t ))\r\n\t\t\t\t\t\t\t\t\t: null}\r\n\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{selection.name}:\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{selection.label}\r\n\t\t\t\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\t{Localizer('Qty')} \r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{response.adjustedQuantity}\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{Localizer('InCart')} {response.cartSummary.items}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{Localizer('Subtotal')}:\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t (window.location.href = '/cart')}\r\n\t\t\t\t\t\t\tclassName=\"roc-btn-secondary roc-btn-secondary--big roc-btn-secondary--block roc-item-summary__btn\"\r\n\t\t\t\t\t\t\tdata-testid=\"view-cart-modal-btn\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{Localizer('ViewCart')}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t (window.location.href = '/checkout')}\r\n\t\t\t\t\t\t\tclassName=\"roc-btn roc-btn--big roc-btn--block roc-item-summary__btn\"\r\n\t\t\t\t\t\t\tdata-testid=\"checkout-modal-btn\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{Localizer('CheckoutNow')}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t
\r\n\r\n\t\t//
\r\n\t\t// \t
\r\n\t\t// \t\t
\r\n\t\t// \t\t\t

Added to Cart

\r\n\t\t// \t\t
\r\n\t\t// \t\t
\r\n\t\t// \t\t\t\r\n\t\t// \t\t
\r\n\t\t// \t
\r\n\t\t// \t
\r\n\t\t// \t\t
\r\n\t\t// \t\t\t{response.imageUrl ? (\r\n\t\t// \t\t\t\t\r\n\t\t// \t\t\t) : (\r\n\t\t// \t\t\t\t\r\n\t\t// \t\t\t)}\r\n\t\t// \t\t
\r\n\t\t// \t\t
\r\n\t\t// \t\t\t
{response.name}
\r\n\t\t// \t\t\t
\r\n\t\t// \t\t\t\t{response.salePrice != null ? (\r\n\t\t// \t\t\t\t\t<>\r\n\t\t// \t\t\t\t\t\t\r\n\t\t// \t\t\t\t\t\t\t${formatPrice(response.basePrice)}\r\n\t\t// \t\t\t\t\t\t\r\n\t\t// \t\t\t\t\t\t${formatPrice(response.salePrice)}\r\n\t\t// \t\t\t\t\t\r\n\t\t// \t\t\t\t) : (\r\n\t\t// \t\t\t\t\t${formatPrice(response.basePrice)}\r\n\t\t// \t\t\t\t)}\r\n\t\t// \t\t\t
\r\n\t\t// \t\t\t{response.selections !== null &&\r\n\t\t// \t\t\t\tresponse.selections.length > 0 &&\r\n\t\t// \t\t\t\tresponse.selections.map(selection => (\r\n\t\t// \t\t\t\t\t
\r\n\t\t// \t\t\t\t\t\t{selection.name}: {selection.label}\r\n\t\t// \t\t\t\t\t
\r\n\t\t// \t\t\t\t))}\r\n\t\t// \t\t\t
Qty: {response.adjustedQuantity}
\r\n\t\t// \t\t
\r\n\t\t// \t
\r\n\r\n\t\t// \t
\r\n\t\t// \t
\r\n\t\t// \t\t
\r\n\t\t// \t\t\t{response.cartSummary.items} {response.cartSummary.items === 1 ? 'item' : 'items'} in cart\r\n\t\t// \t\t
\r\n\t\t// \t\t
\r\n\t\t// \t\t\tSubtotal: ${formatPrice(response.cartSummary.subtotal)}\r\n\t\t// \t\t
\r\n\t\t// \t
\r\n\t\t// \t
\r\n\t\t// \t\t
\r\n\t\t// \t\t\t\r\n\t\t// \t\t
\r\n\t\t// \t\t
\r\n\t\t// \t\t\t\r\n\t\t// \t\t
\r\n\t\t// \t
\r\n\t\t//
\r\n\t);\r\n}\r\n","import * as React from 'react';\r\n\r\ninterface CheckmarkSVGProps {\r\n\tclass?: string;\r\n}\r\n\r\n/**\r\n * Checkmark SVG\r\n *\r\n * @returns\r\n */\r\nfunction CheckmarkSVG(props: CheckmarkSVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default CheckmarkSVG;\r\n","import * as React from 'react';\r\n\r\ninterface PlusCircleSVGProps {\r\n\tclass: string;\r\n}\r\n\r\n/**\r\n * Plus SVG\r\n *\r\n * @returns\r\n */\r\nfunction PlusCircleSVG(props: PlusCircleSVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default PlusCircleSVG;\r\n","import React from 'react';\r\n\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport { useFacet } from 'components/ui/Facets/Facet';\r\nimport { FacetSelectionState } from 'store/Store';\r\nimport DashCircleSVG from 'components/svg/DashCircleSVG';\r\nimport CheckmarkSVG from 'components/svg/CheckmarkSVG';\r\nimport PlusCircleSVG from 'components/svg/PlusCircleSVG';\r\nimport { useHawkConfig } from 'components/ConfigProvider';\r\n\r\nfunction Checkbox() {\r\n\tconst { store } = useHawkSearch();\r\n\tconst { config } = useHawkConfig();\r\n\r\n\tconst {\r\n\t\tfacet,\r\n\t\tstate: { facetValues },\r\n\t\tactor,\r\n\t\trenderer,\r\n\t} = useFacet();\r\n\r\n\tfunction renderOptions() {\r\n\t\tif (facet.FieldType === 'range') {\r\n\t\t\treturn facetValues.map((value) => {\r\n\t\t\t\tconst correspondingRange = facet.Ranges.find((c) => c.Value === value.Value);\r\n\t\t\t\tconst rangeValueAssetUrl = correspondingRange\r\n\t\t\t\t\t? config.dashboardUrl + correspondingRange.AssetFullUrl\r\n\t\t\t\t\t: '';\r\n\r\n\t\t\t\t// facets can be selected or negated, so explicitly check that the facet is not selected\r\n\t\t\t\tconst selectionState = store.isFacetSelected(facet, value).state;\r\n\r\n\t\t\t\tconst isSelected = selectionState !== FacetSelectionState.NotSelected;\r\n\t\t\t\tconst isNegated = selectionState === FacetSelectionState.Negated;\r\n\r\n\t\t\t\treturn (\r\n\t\t\t\t\t
  • \r\n\t\t\t\t\t\t actor.selectFacet(value)}\r\n\t\t\t\t\t\t\tclassName=\"hawk-facet-rail__facet-btn\"\r\n\t\t\t\t\t\t\taria-pressed={isSelected}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{renderCheckMark(isSelected)}\r\n\t\t\t\t\t\t\t{rangeValueAssetUrl !== '' ? (\r\n\t\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\t\t\t{value.Label}\r\n\t\t\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{value.Label} ({value.Count})\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{value.Label} ({value.Count})\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t{renderFacetActions(value.Value || '', isNegated)}\r\n\t\t\t\t\t
  • \r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\treturn facetValues.map((value) => {\r\n\t\t\t\t// facets can be selected or negated, so explicitly check that the facet is not selected\r\n\t\t\t\tconst selectionState = store.isFacetSelected(facet, value).state;\r\n\r\n\t\t\t\tconst isSelected = selectionState !== FacetSelectionState.NotSelected;\r\n\t\t\t\tconst isNegated = selectionState === FacetSelectionState.Negated;\r\n\r\n\t\t\t\treturn (\r\n\t\t\t\t\t
  • \r\n\t\t\t\t\t\t actor.selectFacet(value)}\r\n\t\t\t\t\t\t\tclassName=\"hawk-facet-rail__facet-btn\"\r\n\t\t\t\t\t\t\taria-pressed={isSelected}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{renderCheckMark(isSelected)}\r\n\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{value.Label} ({value.Count})\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t{renderFacetActions(value.Value || '', isNegated)}\r\n\t\t\t\t\t
  • \r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfunction renderCheckMark(isSelected: boolean) {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t{isSelected ? : null}\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\tfunction renderFacetActions(value: string, isNegated: boolean) {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t{facetValues.length > 0 ? (\r\n\t\t\t\t
    \r\n\t\t\t\t\t
      {renderOptions()}
    \r\n\t\t\t\t
    \r\n\t\t\t) : null}\r\n\r\n\t\t\t{/* render the default truncation control as we don't need to customize this */}\r\n\t\t\t{renderer.renderTruncation()}\r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default Checkbox;\r\n","import React, { useState, useRef } from 'react';\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport { useFacet } from 'components/ui/Facets/Facet';\r\nimport { useTranslation } from 'react-i18next';\r\nimport MagnifyingGlassSVG from 'shared/components/svg/MagnifyingGlassSVG';\r\n\r\nfunction Search() {\r\n\tconst { store, actor: hawkActor } = useHawkSearch();\r\n\tconst { facet, actor } = useFacet();\r\n\r\n\tconst [input, setInput] = useState(undefined);\r\n\r\n\tconst searchInputRef = useRef(null);\r\n\tconst { t } = useTranslation();\r\n\r\n\tfunction onKeyDown(event: React.KeyboardEvent) {\r\n\t\tif (event.key === 'Enter') {\r\n\t\t\tsetInput(undefined); // clear the user's entered value as we want to be driven by the store again\r\n\r\n\t\t\tactor.selectFacet(event.currentTarget.value);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction clearFacet() {\r\n\t\tsetInput(undefined); // clear the user's entered value as we want to be driven by the store again\r\n\r\n\t\thawkActor.clearFacet(facet);\r\n\t}\r\n\r\n\tfunction getInputValue() {\r\n\t\tif (input !== undefined) {\r\n\t\t\t// if the user type an input, that's the value for the input\r\n\t\t\treturn input;\r\n\t\t}\r\n\r\n\t\t// otherwise, use the value from the store\r\n\t\treturn store.pendingSearch.SearchWithin ?? '';\r\n\t}\r\n\r\n\tconst labelFor = `search-within-${facet.FacetId.toString()}`;\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t
    \r\n\t\t\t\t\r\n\r\n\t\t\t\t {\r\n\t\t\t\t\t\tif (searchInputRef && searchInputRef.current) {\r\n\t\t\t\t\t\t\tsetInput(undefined);\r\n\r\n\t\t\t\t\t\t\tactor.selectFacet(searchInputRef.current.value);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\taria-label={facet.Name}\r\n\t\t\t\t>\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t
    \r\n\r\n\t\t\t{store.pendingSearch.SearchWithin ? (\r\n\t\t\t\t
    \r\n\t\t\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t) : null}\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default Search;\r\n","import React from 'react';\r\n\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport { useFacet } from 'components/ui/Facets/Facet';\r\nimport { FacetSelectionState } from 'store/Store';\r\n\r\nfunction Link() {\r\n\tconst { store } = useHawkSearch();\r\n\tconst {\r\n\t\tfacet,\r\n\t\tstate: { facetValues },\r\n\t\tactor,\r\n\t\trenderer,\r\n\t} = useFacet();\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t
    \r\n\t\t\t\t
      \r\n\t\t\t\t\t{facetValues.map((value) => {\r\n\t\t\t\t\t\t// facets can be selected or negated, so explicitly check that the facet is not selected\r\n\t\t\t\t\t\tconst selectionState = store.isFacetSelected(facet, value).state;\r\n\r\n\t\t\t\t\t\tconst isSelected = selectionState !== FacetSelectionState.NotSelected;\r\n\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t
    • \r\n\t\t\t\t\t\t\t\t actor.selectFacet(value)}\r\n\t\t\t\t\t\t\t\t\tclassName=\"hawk-facet-rail__facet-btn\"\r\n\t\t\t\t\t\t\t\t\taria-pressed={isSelected}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{value.Label} ({value.Count})\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
    • \r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t})}\r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\r\n\t\t\t{/* render the default truncation control as we don't need to customize this */}\r\n\t\t\t{renderer.renderTruncation()}\r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default Link;\r\n","import React, { useState, useEffect } from 'react';\r\nimport type NumberFormat from 'react-number-format';\r\nimport Spinner from 'shared/components/Spinner';\r\nconst LazyNumberFormat = React.lazy(() => import('react-number-format'));\r\n\r\nexport interface SliderNumericInputsProps {\r\n\tmin: number;\r\n\tmax: number;\r\n\tvalues: number[];\r\n\tisCurrency: boolean;\r\n\tcurrencySymbol: string;\r\n\tdecimalPrecision: number;\r\n\tonValueChange(minValue: number, maxValue: number): void;\r\n}\r\n\r\nfunction SliderNumericInputs(sliderProps: SliderNumericInputsProps) {\r\n\tconst [minValue, setMinValue] = useState('' as string);\r\n\tconst [maxValue, setMaxValue] = useState('' as string);\r\n\r\n\tfunction onMinUpdate(values: any) {\r\n\t\tconst { value } = values;\r\n\r\n\t\tconst newMinValue = Number(value);\r\n\t\tif (isNaN(newMinValue) || minValue === value) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tsetMinValue(value);\r\n\t}\r\n\r\n\tfunction onMaxUpdate(values: any) {\r\n\t\tconst { value } = values;\r\n\r\n\t\tconst newMaxValue = Number(value);\r\n\t\tif (isNaN(newMaxValue) || maxValue === value) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsetMaxValue(value);\r\n\t}\r\n\r\n\t// eslint-disable-next-line no-unused-vars\r\n\tfunction reloadFacets(event: React.FormEvent) {\r\n\t\tsliderProps.onValueChange(Number(minValue), Number(maxValue));\r\n\t}\r\n\r\n\tuseEffect(() => {\r\n\t\tsetMinValue(sliderProps.values[0].toString());\r\n\t\tsetMaxValue(sliderProps.values[1].toString());\r\n\t}, [sliderProps]);\r\n\r\n\treturn (\r\n\t\t}>\r\n\t\t\t
    \r\n\t\t\t\t\r\n\r\n\t\t\t\t\r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default SliderNumericInputs;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { PublicState } from 'rheostat';\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport { useFacet } from 'components/ui/Facets/Facet';\r\nimport SliderNumericInputs from 'components/ui/Facets/SliderNumericInputs';\r\n\r\nconst Rheostat = React.lazy(() => import(/* webpackChunkName: \"rheostat\" */ 'rheostat'));\r\n\r\nfunction Slider() {\r\n\tconst {\r\n\t\tstore: { facetSelections },\r\n\t} = useHawkSearch();\r\n\r\n\tconst {\r\n\t\tstate: { facetValues, decimalPrecision },\r\n\t\tfacet,\r\n\t\tactor,\r\n\t} = useFacet();\r\n\r\n\t// the range of the slider is defined by the first facet value. or null if there is no first value\r\n\tconst range = facetValues.length > 0 ? facetValues[0] : null;\r\n\r\n\tconst [rangeMin, setMinRange] = useState(range && Math.floor(parseFloat(range.RangeMin || '')));\r\n\tconst [rangeMax, setMaxRange] = useState(range && Math.ceil(parseFloat(range.RangeMax || '')));\r\n\tconst [rangeStart, setStartRange] = useState(range && Math.floor(parseFloat(range.RangeStart || '')));\r\n\tconst [rangeEnd, setEndRange] = useState(range && Math.ceil(parseFloat(range.RangeEnd || '')));\r\n\r\n\t// if there's no range, initialize to zeros\r\n\tconst [minValue, setMinValue] = useState();\r\n\tconst [maxValue, setMaxValue] = useState();\r\n\r\n\tconst [isCurrency, setIsCurrency] = useState(facet.IsCurrency);\r\n\tconst [currencySymbol, setCurrencySymbol] = useState(facet.CurrencySymbol);\r\n\r\n\tuseEffect(() => {\r\n\t\tsetCurrencySymbol(facet.CurrencySymbol ?? '$');\r\n\t\tsetIsCurrency(facet.IsCurrency);\r\n\t}, [facet]);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst paramName = facet.ParamName || facet.Field;\r\n\r\n\t\t// clear min and max value if these were cleared\r\n\t\tif (!paramName || !(paramName in facetSelections)) {\r\n\t\t\tsetMinValue(undefined);\r\n\t\t\tsetMaxValue(undefined);\r\n\t\t} else if (\r\n\t\t\tparamName in facetSelections &&\r\n\t\t\tfacetSelections[paramName].items &&\r\n\t\t\tfacetSelections[paramName].items.length > 0\r\n\t\t) {\r\n\t\t\tconst selectedValues = facetSelections[paramName].items[0].value.split(',');\r\n\t\t\tsetMinValue(Number(selectedValues[0]));\r\n\t\t\tsetMaxValue(Number(selectedValues[1]));\r\n\t\t}\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [facetSelections]);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst newRange = facetValues.length > 0 ? facetValues[0] : null;\r\n\t\tsetMinRange(newRange && Math.floor(parseFloat(newRange.RangeMin || '')));\r\n\t\tsetMaxRange(newRange && Math.ceil(parseFloat(newRange.RangeMax || '')));\r\n\t\tsetStartRange(newRange && Math.floor(parseFloat(newRange.RangeStart || '')));\r\n\t\tsetEndRange(newRange && Math.ceil(parseFloat(newRange.RangeEnd || '')));\r\n\t}, [facetValues]);\r\n\r\n\tif (\r\n\t\trangeMin === null ||\r\n\t\tisNaN(rangeMin) ||\r\n\t\trangeMax === null ||\r\n\t\tisNaN(rangeMax) ||\r\n\t\trangeStart === null ||\r\n\t\tisNaN(rangeStart) ||\r\n\t\trangeEnd === null ||\r\n\t\tisNaN(rangeEnd)\r\n\t) {\r\n\t\t// this facet is somehow misconfigured so don't render\r\n\t\treturn null;\r\n\t}\r\n\r\n\tfunction onSliderValueChange(state: PublicState) {\r\n\t\tconst [newMin, newMax] = state.values;\r\n\r\n\t\tsetFacetValues(newMin, newMax);\r\n\t}\r\n\r\n\tfunction onValueChange(newMinValue: number, newMaxValue: number) {\r\n\t\tlet currentMinValue = minValue;\r\n\t\tlet currentMaxValue = maxValue;\r\n\t\t// if min value wasn't yet selected use range start\r\n\t\tif (minValue === undefined && rangeStart !== null) {\r\n\t\t\tcurrentMinValue = rangeStart; // setMinValue(rangeStart);\r\n\t\t}\r\n\r\n\t\t// if max value wasn't yet selected use range end\r\n\t\tif (maxValue === undefined && rangeEnd !== null) {\r\n\t\t\tcurrentMaxValue = rangeEnd;\r\n\t\t}\r\n\r\n\t\tif (currentMinValue === undefined || currentMaxValue === undefined) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (currentMinValue !== newMinValue && newMinValue <= currentMaxValue) {\r\n\t\t\tcurrentMinValue = newMinValue;\r\n\t\t}\r\n\r\n\t\tif (currentMaxValue !== newMaxValue && newMaxValue >= currentMinValue) {\r\n\t\t\tcurrentMaxValue = newMaxValue;\r\n\t\t}\r\n\t\tsetMinValue(currentMinValue);\r\n\t\tsetMaxValue(currentMaxValue);\r\n\t\tsetFacetValues(currentMinValue, currentMaxValue);\r\n\t}\r\n\r\n\tfunction setFacetValues(minVal: number | undefined, maxVal: number | undefined) {\r\n\t\tif (minVal === undefined || maxVal === undefined || isNaN(minVal) || isNaN(maxVal)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsetMinValue(minVal);\r\n\t\tsetMaxValue(maxVal);\r\n\r\n\t\t// this selection is sent to hawk separated by commas, so build the value here\r\n\t\tconst selection = `${minVal},${maxVal}`;\r\n\r\n\t\tactor.setFacets([selection]);\r\n\t}\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t
    \r\n\t\t\t\tLoading...
    }>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t
    \r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default Slider;\r\n","import React from 'react';\r\n\r\nimport { Value } from 'models/Facets/Value';\r\nimport { Swatch } from 'models/Facets';\r\nimport { useHawkConfig } from 'components/ConfigProvider';\r\nimport * as Constants from 'util/Constants';\r\n\r\nexport interface SwatchItemProps {\r\n\tswatchValue: Value;\r\n\tfacetSwatch: Swatch;\r\n\tisNegated: boolean;\r\n\tisSelected: boolean;\r\n\tisColor: boolean;\r\n\tonSwatchSelected(facetValue: string, isNegated: boolean): void;\r\n}\r\n\r\n/**\r\n * Gets the absolute URL of the swatch's image resource.\r\n */\r\nfunction getSwatchUrl(item: SwatchItemProps) {\r\n\t// eslint-disable-next-line\r\n\tconst { config } = useHawkConfig();\r\n\r\n\tlet suffix = !item.facetSwatch.AssetUrl ? item.facetSwatch.AssetName : item.facetSwatch.AssetUrl;\r\n\r\n\tif (suffix.length === 0 || /^https?:\\/\\//.test(suffix)) {\r\n\t\t// If our \"suffix\" is an absolute url or empty it isn't meaningful to prepend anything to it.\r\n\t\treturn suffix;\r\n\t}\r\n\r\n\t// Suffix must have a prepended slash\r\n\tif (suffix[0] !== '/') {\r\n\t\tsuffix = '/' + suffix;\r\n\t}\r\n\r\n\t// Prefix shoudn't have an appended slash\r\n\t// Technically speaking this is legal eg \"https://www.example.com/test//assets/1232/red.gif\" but it is more likely than not, an error.\r\n\tconst dashboardUrl = config.dashboardUrl || Constants.defaultDashboardUrl;\r\n\tconst prefix =\r\n\t\tdashboardUrl[dashboardUrl.length - 1] === '/'\r\n\t\t\t? dashboardUrl.substring(0, dashboardUrl.length - 1)\r\n\t\t\t: dashboardUrl;\r\n\r\n\treturn prefix + suffix;\r\n}\r\n\r\nfunction SwatchItem(item: SwatchItemProps) {\r\n\tconst facetValue = item.swatchValue.Value || '';\r\n\r\n\t// facets can be selected or negated, so explicitly check that the facet is not selected\r\n\tconst swatchUrl = getSwatchUrl(item);\r\n\r\n\tconst colorSwatchStyle = {\r\n\t\tbackgroundColor: item.facetSwatch.Color,\r\n\t};\r\n\r\n\tconst listItemClassNames =\r\n\t\t'hawk-facet-rail__swatch-list-item' +\r\n\t\t(item.isSelected ? ' hawkFacet-active' : '') +\r\n\t\t(item.isNegated ? ' hawkFacet-negative' : '');\r\n\r\n\treturn (\r\n\t\t
  • \r\n\t\t\t item.onSwatchSelected(facetValue, false)}\r\n\t\t\t\tclassName=\"hawk-styleSwatch\"\r\n\t\t\t\taria-pressed={item.isSelected}\r\n\t\t\t>\r\n\t\t\t\t\r\n\t\t\t\t\t{item.isColor ? (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t{item.facetSwatch.Value}\r\n\t\t\t\t\t)}\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t
  • \r\n\t);\r\n}\r\n\r\nexport default SwatchItem;\r\n","import React from 'react';\r\n\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport { useFacet } from 'components/ui/Facets/Facet';\r\nimport { FacetSelectionState } from 'store/Store';\r\nimport SwatchItem from './SwatchItem';\r\n\r\nfunction Swatch() {\r\n\tconst { store } = useHawkSearch();\r\n\tconst {\r\n\t\tfacet,\r\n\t\tactor,\r\n\t\tstate: { facetValues },\r\n\t\trenderer,\r\n\t} = useFacet();\r\n\r\n\tfunction onSwatchSelected(facetValue: string, isNegated: boolean) {\r\n\t\tisNegated ? actor.negateFacet(facetValue) : actor.selectFacet(facetValue);\r\n\t}\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t
    \r\n\t\t\t\t
      \r\n\t\t\t\t\t{facet.SwatchData &&\r\n\t\t\t\t\t\tfacetValues.map((value) => {\r\n\t\t\t\t\t\t\tconst facetValue = value.Value || '';\r\n\t\t\t\t\t\t\t// find swatch that is corresponding with value\r\n\t\t\t\t\t\t\tconst facetSwatch =\r\n\t\t\t\t\t\t\t\tfacet.SwatchData &&\r\n\t\t\t\t\t\t\t\tfacet.SwatchData.find((s) => s.Value.toLowerCase() === facetValue.toLowerCase());\r\n\t\t\t\t\t\t\tif (!facetSwatch) {\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tconst selectionState = store.isFacetSelected(facet, value).state;\r\n\t\t\t\t\t\t\tconst isNegated = selectionState === FacetSelectionState.Negated;\r\n\t\t\t\t\t\t\tconst isSelected = selectionState !== FacetSelectionState.NotSelected;\r\n\r\n\t\t\t\t\t\t\tconst isColor = !!facetSwatch.Color;\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\r\n\t\t\t{/* render the default truncation control as we don't need to customize this */}\r\n\t\t\t{renderer.renderTruncation()}\r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default Swatch;\r\n","import React, { useState } from 'react';\r\n\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport { FacetSelectionState } from 'store/Store';\r\nimport { useFacet } from 'components/ui/Facets/Facet';\r\nimport CheckmarkSVG from 'components/svg/CheckmarkSVG';\r\nimport { Value } from 'models/Facets';\r\nimport PlusCircleSVG from 'components/svg/PlusCircleSVG';\r\nimport DashCircleSVG from 'components/svg/DashCircleSVG';\r\n\r\nexport interface NestedItemProps {\r\n\thierarchyValue: Value;\r\n\tisNegated: boolean;\r\n\tisSelected: boolean;\r\n\tonValueSelected(facetValue: Value, isNegated: boolean): void;\r\n}\r\n\r\nfunction NestedItem(item: NestedItemProps) {\r\n\tconst { store } = useHawkSearch();\r\n\tconst { facet } = useFacet();\r\n\r\n\tconst [isExpanded, setIsExpanded] = useState(false);\r\n\tconst [isTruncated, setIsTruncated] = useState(facet.shouldTruncate);\r\n\r\n\tconst hierarchyValue = item.hierarchyValue || '';\r\n\tlet hierarchyChildren = item.hierarchyValue.Children || [];\r\n\r\n\tlet remainingValues = 0;\r\n\r\n\tconst shouldTruncateChildren =\r\n\t\tfacet.DisplayType === 'truncating' && hierarchyChildren.length > facet.TruncateThreshold;\r\n\r\n\tif (shouldTruncateChildren && isTruncated) {\r\n\t\tconst valuesBeforeTrunc = hierarchyChildren.length;\r\n\r\n\t\thierarchyChildren = hierarchyChildren.slice(0, facet.TruncateThreshold);\r\n\r\n\t\tremainingValues = valuesBeforeTrunc - facet.TruncateThreshold;\r\n\t}\r\n\r\n\tfunction renderChildTruncation() {\r\n\t\treturn (\r\n\t\t\t<>\r\n\t\t\t\t{shouldTruncateChildren && (\r\n\t\t\t\t\t
  • \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
  • \r\n\t\t\t\t)}\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n\treturn (\r\n\t\t
  • \r\n\t\t\t
    \r\n\t\t\t\t item.onValueSelected(hierarchyValue, false)}\r\n\t\t\t\t\tclassName=\"hawk-facet-rail__facet-btn\"\r\n\t\t\t\t\taria-pressed={item.isSelected}\r\n\t\t\t\t>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{item.isSelected ? : null}\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{item.hierarchyValue.Label} ({item.hierarchyValue.Count})\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\r\n\t\t\t\t item.onValueSelected(hierarchyValue, true)}\r\n\t\t\t\t\tclassName=\"hawk-facet-rail__facet-btn-exclude\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{item.isNegated ? (\r\n\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tInclude facet\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tExclude facet\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t)}\r\n\t\t\t\t\r\n\t\t\t
    \r\n\r\n\t\t\t{hierarchyChildren.length > 0 ? (\r\n\t\t\t\t setIsExpanded(!isExpanded)}\r\n\t\t\t\t>\r\n\t\t\t\t\t{isExpanded ? (\r\n\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\tCollapse child facets\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\tExpand child facets\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t)}\r\n\t\t\t\t\r\n\t\t\t) : null}\r\n\r\n\t\t\t{isExpanded && hierarchyChildren ? (\r\n\t\t\t\t
    \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t{hierarchyChildren.map((value) => {\r\n\t\t\t\t\t\t\tconst selectionState = store.isFacetSelected(facet, value).state;\r\n\t\t\t\t\t\t\tconst isNegated = selectionState === FacetSelectionState.Negated;\r\n\t\t\t\t\t\t\tconst isSelected = selectionState !== FacetSelectionState.NotSelected;\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t{renderChildTruncation()}\r\n\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t) : (\r\n\t\t\t\t<>\r\n\t\t\t)}\r\n\t\t
  • \r\n\t);\r\n}\r\n\r\nexport default NestedItem;\r\n","import React from 'react';\r\n\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport { FacetSelectionState } from 'store/Store';\r\nimport { useFacet } from 'components/ui/Facets/Facet';\r\nimport NestedItem from './NestedItem';\r\nimport { Value } from 'models/Facets/Value';\r\n\r\nfunction Nested() {\r\n\tconst { store } = useHawkSearch();\r\n\tconst {\r\n\t\tfacet,\r\n\t\tstate: { facetValues },\r\n\t\tactor,\r\n\t\trenderer,\r\n\t} = useFacet();\r\n\r\n\tfunction onValueSelected(facetValue: Value, isNegated: boolean) {\r\n\t\tisNegated ? actor.negateFacet(facetValue) : actor.selectFacet(facetValue);\r\n\t}\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t{facetValues.length > 0 ? (\r\n\t\t\t\t
    \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t{facetValues.map((value) => {\r\n\t\t\t\t\t\t\t// facets can be selected or negated, so explicitly check that the facet is not selected\r\n\t\t\t\t\t\t\tconst selectionState = store.isFacetSelected(facet, value).state;\r\n\r\n\t\t\t\t\t\t\tconst isSelected = selectionState !== FacetSelectionState.NotSelected;\r\n\t\t\t\t\t\t\tconst isNegated = selectionState === FacetSelectionState.Negated;\r\n\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t) : null}\r\n\r\n\t\t\t{/* render the default truncation control as we don't need to customize this */}\r\n\t\t\t{renderer.renderTruncation()}\r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default Nested;\r\n","import React, { useState } from 'react';\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport { useFacet } from 'components/ui/Facets/Facet';\r\n\r\nfunction OpenRange() {\r\n\tconst { actor: hawkActor } = useHawkSearch();\r\n\r\n\tconst {\r\n\t\tstate: { facetValues },\r\n\t\tfacet,\r\n\t\tactor,\r\n\t} = useFacet();\r\n\r\n\t// the open range boundary values are defined by the first facet value. or null if there is no first value\r\n\r\n\tconst range = facetValues.length > 0 ? facetValues[0] : null;\r\n\r\n\tconst rangeStart = (range && range.RangeStart) || '';\r\n\tconst rangeEnd = (range && range.RangeEnd) || '';\r\n\r\n\t// if there's no range, initialize to empty strings\r\n\tconst [minValue, setStartValue] = useState(rangeStart || '');\r\n\tconst [maxValue, setEndValue] = useState(rangeEnd || '');\r\n\r\n\tif (rangeStart === null || rangeEnd === null) {\r\n\t\t// this facet is somehow misconfigured so don't render\r\n\t\treturn null;\r\n\t}\r\n\r\n\tfunction onRangeStartChange(event: React.FormEvent) {\r\n\t\tsetFacetValues(event.currentTarget.value, maxValue);\r\n\t}\r\n\r\n\tfunction onRangeEndChange(event: React.FormEvent) {\r\n\t\tsetFacetValues(minValue, event.currentTarget.value);\r\n\t}\r\n\r\n\tfunction setFacetValues(startVal: string, endVal: string) {\r\n\t\tsetStartValue(startVal);\r\n\t\tsetEndValue(endVal);\r\n\r\n\t\t// this selection is sent to hawk separated by commas, so build the value here\r\n\r\n\t\tif (startVal === '' && endVal === '') {\r\n\t\t\thawkActor.clearFacet(facet);\r\n\t\t} else {\r\n\t\t\tconst selection = `${startVal},${endVal}`;\r\n\t\t\tactor.setFacets([selection]);\r\n\t\t}\r\n\t}\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default OpenRange;\r\n","export enum FacetType {\r\n\tCheckbox = 'checkbox',\r\n\tNestedCheckbox = 'nestedcheckbox',\r\n\tLink = 'link',\r\n\tNestedlink = 'nestedlink',\r\n\tSlider = 'slider',\r\n\tSwatch = 'swatch',\r\n\tRating = 'rating',\r\n\tSize = 'size',\r\n\tSearchWithin = 'search',\r\n\tRecentSearches = 'recentsearches',\r\n\tRelatedSearches = 'relatedsearches',\r\n\tOpenRange = 'openRange',\r\n}\r\n","import {\r\n\tCheckbox as DefaultCheckbox,\r\n\tNestedCheckbox as DefaultNestedCheckbox,\r\n\tSearch as DefaultSearch,\r\n\tLink as DefaultLink,\r\n\tSlider as DefaultSlider,\r\n\tSwatch as DefaultSwatch,\r\n\tOpenRange as DefaultOpenRange,\r\n} from 'components/ui/Facets/FacetTypes';\r\nimport { FacetComponent } from 'types/FacetComponent';\r\nimport { FacetType } from 'models/Facets/FacetType';\r\nimport { SuggestionStrategyMatch, SuggestionType } from 'models/Autocomplete/Suggestion';\r\nimport { ProductStrategy, CategoryStrategy, PopularStrategy, ContentStrategy } from 'models/Autocomplete';\r\n\r\n// the default set of facet components that we support\r\nconst defaultFacetComponents: FacetComponent[] = [\r\n\t{ facetType: FacetType.Checkbox, component: DefaultCheckbox },\r\n\t{ facetType: FacetType.NestedCheckbox, component: DefaultNestedCheckbox },\r\n\t{ facetType: FacetType.SearchWithin, component: DefaultSearch },\r\n\t{ facetType: FacetType.Link, component: DefaultLink },\r\n\t{ facetType: FacetType.Slider, component: DefaultSlider },\r\n\t{ facetType: FacetType.Swatch, component: DefaultSwatch },\r\n\t{ facetType: FacetType.OpenRange, component: DefaultOpenRange },\r\n];\r\n\r\nconst defaultAutocompleteStrategies: SuggestionStrategyMatch[] = [\r\n\t{ type: SuggestionType.Product, strategy: new ProductStrategy() },\r\n\t{ type: SuggestionType.Category, strategy: new CategoryStrategy() },\r\n\t{ type: SuggestionType.Popular, strategy: new PopularStrategy() },\r\n\t{ type: SuggestionType.Content, strategy: new ContentStrategy() },\r\n];\r\n\r\n/**\r\n * Builds a list of all supported facet components by also taking into consideration overridden components.\r\n */\r\nexport function getFacetComponents(overridedComponents: FacetComponent[]) {\r\n\tconst facetComponents: FacetComponent[] = [];\r\n\r\n\tfor (const key in FacetType) {\r\n\t\tconst fType = FacetType[key];\r\n\r\n\t\tconst fComponent =\r\n\t\t\t// check to see if the facet is overridden\r\n\t\t\toverridedComponents.find((component) => component.facetType === fType) ||\r\n\t\t\t// otherwise, pull from defaults\r\n\t\t\tdefaultFacetComponents.find((component) => component.facetType === fType);\r\n\r\n\t\tif (fComponent) {\r\n\t\t\tfacetComponents.push(fComponent);\r\n\t\t}\r\n\t}\r\n\r\n\treturn facetComponents;\r\n}\r\n\r\n/**\r\n * Builds a list of all supported autocomplete suggestion strategiesby also taking into consideration overridden strategies.\r\n */\r\nexport function getAutocompleteStrategies(overridedStrategies: SuggestionStrategyMatch[]): SuggestionStrategyMatch[] {\r\n\tconst suggestionStrategies: SuggestionStrategyMatch[] = [];\r\n\r\n\t// tslint:disable-next-line:forin\r\n\tfor (const key in SuggestionType) {\r\n\t\tconst sType = SuggestionType[key];\r\n\r\n\t\tconst autocompleteStrategy =\r\n\t\t\t// check to see if the facet is overridden\r\n\t\t\toverridedStrategies.find((strategyMatch) => strategyMatch.type === sType) ||\r\n\t\t\t// otherwise, pull from defaults\r\n\t\t\tdefaultAutocompleteStrategies.find((strategyMatch) => strategyMatch.type === sType);\r\n\r\n\t\tif (autocompleteStrategy) {\r\n\t\t\tsuggestionStrategies.push(autocompleteStrategy);\r\n\t\t}\r\n\t}\r\n\treturn suggestionStrategies;\r\n}\r\n","// Imports\nvar ___CSS_LOADER_API_IMPORT___ = require(\"../../../../../node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.id, \"/* This code is subject to LICENSE in root of this repository */\\n\\n/* Used to detect in JavaScript if apps have loaded styles or not. */\\n:root {\\n --reach-dialog: 1;\\n}\\n\\n[data-reach-dialog-overlay] {\\n background: hsla(0, 0%, 0%, 0.33);\\n position: fixed;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n overflow: auto;\\n}\\n\\n[data-reach-dialog-content] {\\n width: 50vw;\\n margin: 10vh auto;\\n background: white;\\n padding: 2rem;\\n outline: none;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n","import React, { RefObject } from 'react';\r\n\r\nexport type RefElementType = RefObject | null;\r\n\r\n/**\r\n * Context to provide ability to set page change alerts from anywhere\r\n *\r\n * @interface VisuallyHiddenAnnouncementContext\r\n */\r\ninterface VisuallyHiddenAnnouncementContext {\r\n\tsetAlert: (message: string) => void;\r\n\tmainRef: RefElementType;\r\n\tsetMainRef: (value: RefElementType) => void;\r\n}\r\n\r\nexport default React.createContext({} as VisuallyHiddenAnnouncementContext);\r\n","import React from 'react';\r\n\r\nexport interface PlaceholderImageProps {\r\n\t/** Whether or not to display a spinner in the center of the placeholder. */\r\n\tshowSpinner: boolean;\r\n}\r\n\r\nfunction PlaceholderImage({ showSpinner }: PlaceholderImageProps) {\r\n\treturn (\r\n\t\t
    \r\n\t\t\t{showSpinner &&
    Loading...
    }\r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default PlaceholderImage;\r\n","import React from 'react';\r\nimport { SVGProps } from './SVGProps';\r\nimport classnames from 'classnames';\r\n\r\n/**\r\n * Lock SVG component\r\n *\r\n * @returns\r\n */\r\nfunction LockSVG({ className, ...rest }: SVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default LockSVG;\r\n","/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */\r\nimport React from 'react';\r\nimport { ControllerStateAndHelpers } from 'downshift';\r\nimport { Response, Product, Popular, Category, Content } from 'models/Autocomplete';\r\nimport { Suggestion, SuggestionType } from '../../../models/Autocomplete/Suggestion';\r\nimport { useTranslation } from 'react-i18next';\r\nimport classnames from 'classnames';\r\n/* #region Commerce */\r\nimport { dispatchRocEvent } from 'shared/hooks/useRocEventHandler';\r\nimport { CommerceSuggestType } from 'features/tracking/trackers/commerce/hawksearch/tracking-commerce';\r\n/* #endregion */\r\n\r\nexport interface SearchSuggestionsListProps {\r\n\tisLoading: boolean;\r\n\tsearchResults: Response;\r\n\tdownshift: ControllerStateAndHelpers;\r\n\tquery: string;\r\n\tonViewMatches: (downshift: ControllerStateAndHelpers) => void;\r\n}\r\n\r\nfunction hasAllEmpty(\r\n\tpopular: Popular[] | undefined,\r\n\tcategories: Category[] | undefined,\r\n\tproducts: Product[] | undefined,\r\n\tcontent: Content[] | undefined,\r\n) {\r\n\tconst hasPopular = popular && popular.length === 0;\r\n\tconst hasCategories = categories && categories.length === 0;\r\n\tconst hasProducts = products && products.length === 0;\r\n\tconst hasContent = content && content.length === 0;\r\n\treturn hasPopular && hasCategories && hasProducts && hasContent;\r\n}\r\n\r\nfunction getAtleastOneExist(\r\n\tpopular: Popular[] | undefined,\r\n\tcategories: Category[] | undefined,\r\n\tproducts: Product[] | undefined,\r\n\tcontent: Content[] | undefined,\r\n) {\r\n\tconst hasPopular = popular && popular.length > 0;\r\n\tconst hasCategories = categories && categories.length > 0;\r\n\tconst hasProducts = products && products.length > 0;\r\n\tconst hasContent = content && content.length > 0;\r\n\treturn hasPopular || hasCategories || hasProducts || hasContent;\r\n}\r\n\r\nfunction SearchSuggestionsList({\r\n\tisLoading,\r\n\tsearchResults,\r\n\tdownshift,\r\n\tquery,\r\n\tonViewMatches,\r\n}: SearchSuggestionsListProps) {\r\n\tconst {\r\n\t\tPopular: popular,\r\n\t\tCategories: categories,\r\n\t\tProducts: products,\r\n\t\tContent: content,\r\n\t\tPopularHeading,\r\n\t\tCategoryHeading,\r\n\t\tProductHeading,\r\n\t\tContentHeading,\r\n\t} = searchResults;\r\n\r\n\tconst { getItemProps, getMenuProps, highlightedIndex } = downshift;\r\n\tconst isRecordEmpty = hasAllEmpty(popular, categories, products, content);\r\n\tconst isAtleastOneExist = getAtleastOneExist(popular, categories, products, content);\r\n\tconst { t } = useTranslation();\r\n\r\n\tlet dynamicIndex = 0;\r\n\r\n\treturn (\r\n\t\t
      \r\n\t\t\t{isLoading &&
    • Loading...
    • }\r\n\t\t\t{products && products.length ? (\r\n\t\t\t\t<>\r\n\t\t\t\t\t{ProductHeading ?

      {ProductHeading}

      : ''}\r\n\t\t\t\t\t{products.map((item) => {\r\n\t\t\t\t\t\tdynamicIndex++;\r\n\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\t\tdispatchRocEvent('hawk-autocomplete-click', {\r\n\t\t\t\t\t\t\t\t\t\t\tkeyword: query,\r\n\t\t\t\t\t\t\t\t\t\t\tsuggestType: CommerceSuggestType.TopProductMatches,\r\n\t\t\t\t\t\t\t\t\t\t\titemName: item.ProductName,\r\n\t\t\t\t\t\t\t\t\t\t\turl: item.Url,\r\n\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t/* #endregion */\r\n\t\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t{item.ProductName}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t})}\r\n\t\t\t\t\r\n\t\t\t) : null}\r\n\t\t\t
      \r\n\t\t\t\t{categories && categories.length ? (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t

      {CategoryHeading}

      \r\n\t\t\t\t\t\t{categories.map((item) => {\r\n\t\t\t\t\t\t\tdynamicIndex++;\r\n\r\n\t\t\t\t\t\t\t/* #region HCL */\r\n\t\t\t\t\t\t\titem.Url = item.Url.replace(/%2c/g, '%c%');\r\n\t\t\t\t\t\t\t/* #endregion */\r\n\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t\r\n\t\t\t\t) : null}\r\n\t\t\t\t{popular && popular.length ? (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t

      {PopularHeading}

      \r\n\t\t\t\t\t\t{popular.map((item) => {\r\n\t\t\t\t\t\t\tdynamicIndex++;\r\n\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t\r\n\t\t\t\t) : null}\r\n\t\t\t\t{content && content.length ? (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t

      {ContentHeading}

      \r\n\t\t\t\t\t\t{content.map((item) => {\r\n\t\t\t\t\t\t\tdynamicIndex++;\r\n\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t{item.Thumb &&
      }\r\n\t\t\t\t\t\t\t\t\t{item.Value}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t\r\n\t\t\t\t) : null}\r\n\t\t\t
      \r\n\t\t\t{isAtleastOneExist && (\r\n\t\t\t\t// eslint-disable-next-line jsx-a11y/click-events-have-key-events\r\n\t\t\t\t onViewMatches(downshift)}\r\n\t\t\t\t>\r\n\t\t\t\t\tView all matches\r\n\t\t\t\t\r\n\t\t\t)}\r\n\t\t\t{!isLoading && isRecordEmpty &&
    • {t('No results.')}
    • }\r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default SearchSuggestionsList;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { ControllerStateAndHelpers } from 'downshift';\r\nimport axios, { CancelToken } from 'axios';\r\nimport HawkClient from 'net/HawkClient';\r\nimport { Response } from 'models/Autocomplete';\r\nimport { useHawkConfig } from 'components/ConfigProvider';\r\nimport SearchSuggestionsList from './SearchSuggestionsList';\r\nimport { Suggestion } from 'models/Autocomplete/Suggestion';\r\n// #region HCL\r\nimport { validateQueryAndRemoveDash } from '../../hcl/util';\r\n// #endregion\r\n\r\nexport interface SearchSuggestionsProps {\r\n\t/** The user entered search string in the autocomplete text input. */\r\n\tquery: string;\r\n\r\n\t/** Downshift's render prop parameter. */\r\n\tdownshift: ControllerStateAndHelpers;\r\n\r\n\tonViewMatches: (downshift: ControllerStateAndHelpers) => void;\r\n}\r\n\r\nfunction SearchSuggestions({ query, downshift, onViewMatches }: SearchSuggestionsProps) {\r\n\tconst { config } = useHawkConfig();\r\n\tconst client = new HawkClient(config);\r\n\r\n\tconst [results, setResults] = useState({} as Response);\r\n\tconst [isLoading, setIsLoading] = useState(false);\r\n\r\n\t// debounce the input search string so that we only do an autocomplete query every so often\r\n\tuseEffect(() => {\r\n\t\t// default to 200ms if not specified\r\n\t\tconst debounceMs = config.autocompleteDebounce || 200;\r\n\r\n\t\tconst cts = axios.CancelToken.source();\r\n\t\tconst timeout = setTimeout(() => doAutocomplete(query, cts.token), debounceMs);\r\n\r\n\t\treturn () => {\r\n\t\t\tcts.cancel();\r\n\t\t\tclearTimeout(timeout);\r\n\t\t};\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [query, config.autocompleteDebounce]);\r\n\r\n\t/**\r\n\t * Performs an autocomplete request to the Hawk API and populates the result set of this component.\r\n\t * @param input The user entered search string that results will be autocompleted for.\r\n\t */\r\n\tasync function doAutocomplete(input: string, cancellationToken?: CancelToken) {\r\n\t\tsetIsLoading(true);\r\n\r\n\t\tlet response: Response | null = null;\r\n\r\n\t\t// #region HCL\r\n\t\tif (config?.enableRemovingDashesFromSearchKeyword) {\r\n\t\t\tinput = validateQueryAndRemoveDash(input);\r\n\t\t}\r\n\t\t// #endregion\r\n\r\n\t\ttry {\r\n\t\t\tresponse = await client\r\n\t\t\t\t.autocomplete(\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tClientGuid: config.clientGuid,\r\n\r\n\t\t\t\t\t\tKeyword: input,\r\n\t\t\t\t\t\tIndexName: config.indexName,\r\n\t\t\t\t\t\tDisplayFullResponse: true,\r\n\t\t\t\t\t},\r\n\t\t\t\t\tcancellationToken,\r\n\t\t\t\t)\r\n\t\t\t\t.then((o) => {\r\n\t\t\t\t\t// ensure, returned object will return response\r\n\t\t\t\t\t// since by default, axios uses JSON.parse to parse an object,\r\n\t\t\t\t\t// it doesn't recognize it as Response type - this line is to prevent it\r\n\t\t\t\t\treturn new Response(o);\r\n\t\t\t\t});\r\n\t\t} catch (error) {\r\n\t\t\tif (axios.isCancel(error)) {\r\n\t\t\t\t// if the request was cancelled, it's because this component was updated\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconsole.error('Autocomplete request error:', error);\r\n\t\t}\r\n\r\n\t\tsetIsLoading(false);\r\n\r\n\t\tif (response) {\r\n\t\t\tsetResults(response);\r\n\t\t}\r\n\t}\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t\r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default SearchSuggestions;\r\n","import React, { useState } from 'react';\r\nimport { DownshiftState, StateChangeOptions, ControllerStateAndHelpers } from 'downshift';\r\nimport SearchSuggestions from 'components/ui/SearchBox/SearchSuggestions';\r\nimport MagnifyingGlassSVG from 'shared/components/svg/MagnifyingGlassSVG'; // ERRONEOUS: Referencing stuff outside of Hawk from within Hawk. This should be inverted.\r\nimport { Suggestion } from 'models/Autocomplete/Suggestion';\r\nimport { getAutocompleteStrategies } from '../Facets/Overrides';\r\nimport { useHawkConfig } from 'components/ConfigProvider';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nconst Downshift = React.lazy(() => import(/* webpackChunkName: \"downshift\" */ 'downshift'));\r\n\r\nexport interface SearchBoxBaseProps {\r\n\tinitialValue?: string;\r\n\tonSubmit: (keywords: string) => void;\r\n\tonViewMatches: (downshift: ControllerStateAndHelpers) => void;\r\n}\r\n\r\nfunction SearchBoxBase({ initialValue, onSubmit, onViewMatches }: SearchBoxBaseProps) {\r\n\tconst { config } = useHawkConfig();\r\n\tconst strategies = getAutocompleteStrategies(config.autocompleteStrategies || []);\r\n\tconst [isOpenOverride, setIsOpenOverride] = useState(true);\r\n\tconst { t } = useTranslation();\r\n\r\n\t/** Called when the internal state of downshift changes - we're handling a couple custom behaviors here */\r\n\tfunction handleStateChange(\r\n\t\tstate: DownshiftState,\r\n\t\tchanges: StateChangeOptions,\r\n\t): Partial> {\r\n\t\tif (\r\n\t\t\t// NOTE: these strings are hardcoded to support code splitting downshift.\r\n\t\t\t// using the constants from the package will prevent code splitting from operating correctly\r\n\t\t\tchanges.type === '__autocomplete_mouseup__' ||\r\n\t\t\tchanges.type === '__autocomplete_keydown_enter__' ||\r\n\t\t\tchanges.type === '__autocomplete_click_item__'\r\n\t\t) {\r\n\t\t\t// when:\r\n\t\t\t//\r\n\t\t\t// 1. the mouse the clicked outside of downshift\r\n\t\t\t// 2. enter is pressed on the keyboard\r\n\t\t\t// 3. an item is selected from the dropdown\r\n\t\t\t//\r\n\t\t\t// then we want to retain the input value that was originally typed in. by default downshift\r\n\t\t\t// will clear the input value, so we're overriding this behavior here.\r\n\t\t\treturn { ...changes, inputValue: state.inputValue };\r\n\t\t}\r\n\r\n\t\treturn changes;\r\n\t}\r\n\r\n\t/** Called when an item has been selected from the autocomplete results. */\r\n\tfunction handleItemChange(item: Suggestion, downshift: ControllerStateAndHelpers) {\r\n\t\tif (!item) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst matchedStrategy = strategies.find((strategy) => strategy.type === item.SuggestionType);\r\n\t\tif (!matchedStrategy) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tmatchedStrategy.strategy.handleItemChange(item, downshift);\r\n\t}\r\n\r\n\tfunction handleToString(item: Suggestion): string {\r\n\t\tif (!item) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\t\tconst matchedStrategy = strategies.find((strategy) => strategy.type === item.SuggestionType);\r\n\t\tif (!matchedStrategy) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\treturn matchedStrategy.strategy.toString(item);\r\n\t}\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t{t('Loading')}...
    }>\r\n\t\t\t\t handleToString(item)}\r\n\t\t\t\t\tonChange={handleItemChange}\r\n\t\t\t\t\tinitialInputValue={initialValue || ''}\r\n\t\t\t\t>\r\n\t\t\t\t\t{(options: ControllerStateAndHelpers) => {\r\n\t\t\t\t\t\tconst { isOpen, inputValue, getInputProps, openMenu } = options;\r\n\t\t\t\t\t\tconst showSuggestions = isOpen && inputValue && inputValue.length > 0 && isOpenOverride;\r\n\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\t\tif (onSubmit) {\r\n\t\t\t\t\t\t\t\t\t\t\tonSubmit(inputValue ?? '');\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tdata-testid=\"global-search-button\"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tSearch\r\n\t\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\t{showSuggestions ? (\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}}\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default SearchBoxBase;\r\n","import React from 'react';\r\nimport useDelayedDisplay from 'shared/hooks/useDelayedDisplay';\r\nimport classnames from 'classnames';\r\n\r\ntype SpinnerAlignment = 'left' | 'right' | 'none';\r\n\r\ninterface SpinnerProps {\r\n\tlight?: boolean;\r\n\twaitMs?: number;\r\n\talign?: SpinnerAlignment;\r\n\tblock?: boolean;\r\n\tparentCentered?: boolean;\r\n}\r\n\r\n/**\r\n * Reusable roc-spinner component with color, alignment and wait time props.\r\n *\r\n * @export\r\n * @param {SpinnerProps} { light = false, waitMs = 200, align = 'right', block }\r\n * @returns\r\n */\r\nexport default function Spinner({\r\n\tlight = false,\r\n\twaitMs = 200,\r\n\talign = 'right',\r\n\tblock,\r\n\tparentCentered = false,\r\n}: SpinnerProps) {\r\n\tconst display = useDelayedDisplay(waitMs);\r\n\r\n\tif (!display) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst spinner = (\r\n\t\t\r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n\r\n\tif (parentCentered) {\r\n\t\treturn
    {spinner}
    ;\r\n\t}\r\n\r\n\treturn spinner;\r\n}\r\n","import React from 'react';\r\nimport { ControllerStateAndHelpers } from 'downshift';\r\nimport { useHawkConfig } from 'components/ConfigProvider';\r\nimport { Product } from 'models/Autocomplete';\r\nimport SearchBoxBase from 'components/ui/SearchBox/SearchBoxBase';\r\nimport * as Constants from 'util/Constants';\r\n\r\n/**\r\n * This component is a simple search input box (with autosuggest) that can be placed globally throughout the site.\r\n * This search box is intended to be used on non-search pages. On search pages, the `SearchBox` component should be\r\n * used instead.\r\n */\r\nfunction GlobalSearchBox() {\r\n\tconst { config } = useHawkConfig();\r\n\tconst searchUrl = config.searchPageUrl || Constants.defaultSearchPageUrl;\r\n\r\n\tfunction redirectToSearchPage(keywords: string | null) {\r\n\t\tlet redirect = `${searchUrl}?keyword=${encodeURIComponent(keywords ?? '')}`;\r\n\t\tif (config.indexName) {\r\n\t\t\tredirect += '&indexName=' + config.indexName;\r\n\t\t}\r\n\r\n\t\tlocation.assign(redirect);\r\n\t}\r\n\r\n\tfunction handleSubmit(keywords: string) {\r\n\t\tredirectToSearchPage(keywords);\r\n\t}\r\n\r\n\t// On select view all matches from suggestions list\r\n\tfunction handleViewAllMatches(downshift: ControllerStateAndHelpers) {\r\n\t\tconst { inputValue } = downshift;\r\n\t\tredirectToSearchPage(inputValue);\r\n\t}\r\n\r\n\treturn ;\r\n}\r\n\r\nexport default GlobalSearchBox;\r\n","import axios, { AxiosInstance, AxiosResponse, AxiosError } from 'axios';\r\nimport AccountUrls from 'shared/util/AccountUrls';\r\nimport { getCsrfToken } from './UserData';\r\n\r\n/**\r\n * Helper that creates an instance of Axios to be used throughout the client application\r\n * and adds a default X-Requested-With header to all requests.\r\n *\r\n */\r\nconst AxiosHelper: AxiosInstance = axios.create();\r\nAxiosHelper.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\r\n\r\n// Add CSRF tokens to all commands that are not GET, HEAD, or OPTIONS\r\nAxiosHelper.interceptors.request.use(async (config) => {\r\n\tif (\r\n\t\tconfig.method?.toLowerCase() !== 'get' &&\r\n\t\tconfig.method?.toLowerCase() !== 'head' &&\r\n\t\tconfig.method?.toLowerCase() !== 'options'\r\n\t) {\r\n\t\tconst csrfToken = await getCsrfToken();\r\n\t\tconfig.headers = { RequestVerificationToken: csrfToken, ...config.headers };\r\n\t}\r\n\treturn config;\r\n});\r\n\r\nexport default AxiosHelper;\r\n\r\n// eslint-disable-next-line no-unused-vars\r\nexport const addUnauthorizedAccessInterceptor = (history) => {\r\n\t// this allows us to act when any request going through axios succeeds or fails.\r\n\tAxiosHelper.interceptors.response.use(\r\n\t\t(response: AxiosResponse) => {\r\n\t\t\treturn response;\r\n\t\t},\r\n\t\t(error: AxiosError) => {\r\n\t\t\tif (error.response && error.response.status === 401) {\r\n\t\t\t\twindow.location.replace(\r\n\t\t\t\t\t`${AccountUrls.Login}?ReturnUrl=${encodeURIComponent(window.location.pathname)}`,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\treturn Promise.reject(error);\r\n\t\t},\r\n\t);\r\n};\r\n","import * as React from 'react';\r\n\r\ninterface XCircleSVGProps {\r\n\tclass?: string;\r\n}\r\n\r\n/**\r\n * X Circle SVG\r\n *\r\n * @returns\r\n */\r\nfunction XCircleSVG(props: XCircleSVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default XCircleSVG;\r\n","import React from 'react';\r\n\r\nimport ConfigProvider from 'components/ConfigProvider';\r\nimport StoreProvider from 'components/StoreProvider';\r\nimport { HawkSearchConfig } from 'types/HawkSearchConfig';\r\nimport { Request } from 'models/Search';\r\n\r\nexport interface HawkSearchProps {\r\n\t/** Global configuration. */\r\n\tconfig: HawkSearchConfig;\r\n\t/** The initial search to perform when initializing the search components. */\r\n\tinitialSearch?: Partial;\r\n\tchildren: React.ReactNode;\r\n}\r\n\r\nfunction HawkSearch(props: HawkSearchProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t{props.children}\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default HawkSearch;\r\n","import React, { useState } from 'react';\r\n\r\nfunction PlaceholderFacetValue() {\r\n\tconst [width] = useState(Math.round(Math.random() * (200 - 100) + 100));\r\n\r\n\treturn (\r\n\t\t
  • \r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t
  • \r\n\t);\r\n}\r\n\r\nexport default PlaceholderFacetValue;\r\n","import React, { useState } from 'react';\r\n\r\nimport PlaceholderFacetValue from './PlaceholderFacetValue';\r\n\r\nfunction PlaceholderFacet() {\r\n\tconst [width] = useState(Math.round(Math.random() * (250 - 125) + 125));\r\n\tconst [numValues] = useState(Math.round(Math.random() * (8 - 1) + 1));\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t{[...Array(numValues)].map((_, i) => (\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default PlaceholderFacet;\r\n","import React from 'react';\r\nimport classnames from 'classnames';\r\n\r\ninterface XSVGProps {\r\n\tclassName?: string;\r\n}\r\n\r\n/**\r\n * X SVG\r\n *\r\n * @returns\r\n */\r\nfunction XSVG({ className, ...rest }: XSVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default XSVG;\r\n","import React from 'react';\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport { ClientSelectionValue } from 'store/ClientSelections';\r\nimport XSVG from 'components/svg/XSVG';\r\nimport { Facet, Range } from 'models/Facets';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\ninterface SelectionsProps {\r\n\tonFacetChange: () => void;\r\n}\r\n\r\nfunction Selections({ onFacetChange }: SelectionsProps) {\r\n\tconst {\r\n\t\tstore: { facetSelections },\r\n\t\tactor,\r\n\t} = useHawkSearch();\r\n\r\n\tconst { t } = useTranslation();\r\n\r\n\t// Added filter to hide selection for Tabs\r\n\tconst keys = Object.keys(facetSelections).filter((key) => key !== 'it');\r\n\r\n\tif (keys.length === 0) {\r\n\t\t// no selections, so render nothing\r\n\t\treturn null;\r\n\t}\r\n\r\n\tfunction clearSelection(facet: string, value?: ClientSelectionValue) {\r\n\t\tif (value) {\r\n\t\t\tactor.clearFacetValue(facet, value.value);\r\n\t\t} else {\r\n\t\t\tactor.clearFacet(facet);\r\n\t\t}\r\n\r\n\t\tonFacetChange();\r\n\t}\r\n\r\n\tfunction clearAll() {\r\n\t\tactor.clearAllFacets();\r\n\t\tonFacetChange();\r\n\t}\r\n\r\n\tfunction renderRange(value: ClientSelectionValue, facet: Facet) {\r\n\t\tconst displayValue = value.label || value.value;\r\n\r\n\t\tif (!displayValue || displayValue.indexOf(',') === -1) {\r\n\t\t\t// range facet selection values should include a comma, so if they don't then this likely isn't a valid\r\n\t\t\t// range value that we want to render\r\n\t\t\tconst selectedRange = facet.Ranges.find((range: Range) => range.Value === value.value);\r\n\t\t\treturn selectedRange?.Label ?? displayValue;\r\n\t\t}\r\n\r\n\t\tconst displayValueRange = displayValue.split(',');\r\n\t\tif (facet.IsCurrency && displayValueRange.length > 1) {\r\n\t\t\tif (facet.CurrencySymbol) {\r\n\t\t\t\treturn `${facet.CurrencySymbol} ${displayValueRange[0]} - ${facet.CurrencySymbol} ${displayValueRange[1]}`;\r\n\t\t\t}\r\n\t\t\treturn `${displayValueRange[0]} - ${displayValueRange[1]}`;\r\n\t\t}\r\n\r\n\t\t// return a prettier display value for ranges\r\n\t\treturn displayValue.replace(',', ' - ');\r\n\t}\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t
    \r\n\t\t\t\t

    {t(\"You've Selected\")}

    \r\n\t\t\t\t
      \r\n\t\t\t\t\t{keys.map((key) => {\r\n\t\t\t\t\t\tconst selection = facetSelections[key];\r\n\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t
    • \r\n\t\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t clearSelection(key)}\r\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"hawk-selections__category-remove\"\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t{selection.label}\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\tUnselect all facets for {selection.label}\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\t\t
        \r\n\t\t\t\t\t\t\t\t\t\t{selection.items.map((item) => {\r\n\t\t\t\t\t\t\t\t\t\t\tconst negation = item.value.startsWith('-');\r\n\r\n\t\t\t\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\t\t\t
      • \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t clearSelection(key, item)}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"hawk-selections__item-remove\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t
        \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t
        \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tUnselect facet {selection.label} {item.label}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{selection.facet.FieldType === 'range'\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? // render ranges in a specific way\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t renderRange(item, selection.facet)\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: // other facets can have their labels rendered directly\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t item.label}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t
      • \r\n\t\t\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t
    • \r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t})}\r\n\t\t\t\t
    \r\n\r\n\t\t\t\t
    \r\n\t\t\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default Selections;\r\n","import * as React from 'react';\r\n\r\ninterface PlusSVGProps {\r\n\tclass?: string;\r\n}\r\n\r\n/**\r\n * Plus SVG\r\n *\r\n * @returns\r\n */\r\nfunction PlusSVG(props: PlusSVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default PlusSVG;\r\n","import { useEffect, useState } from 'react';\r\nimport debounce from 'lodash-es/debounce';\r\ninterface WindowSize {\r\n\twidth: number | null;\r\n\theight: number | null;\r\n}\r\n\r\n/**\r\n * Reusable hook for handling window resize.\r\n *\r\n * @export\r\n * @returns\r\n */\r\nexport default function useWindowSize() {\r\n\tconst [windowSize, setWindowSize] = useState({\r\n\t\twidth: null,\r\n\t\theight: null,\r\n\t});\r\n\r\n\tconst executeResizeDebounced = debounce(update, 50);\r\n\r\n\tfunction update() {\r\n\t\tsetWindowSize({\r\n\t\t\twidth: window.innerWidth,\r\n\t\t\theight: window.innerHeight,\r\n\t\t});\r\n\t}\r\n\r\n\tfunction handleResize() {\r\n\t\texecuteResizeDebounced();\r\n\t}\r\n\r\n\tuseEffect(() => {\r\n\t\twindow.addEventListener('resize', handleResize);\r\n\r\n\t\thandleResize();\r\n\r\n\t\treturn () => window.removeEventListener('resize', handleResize);\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, []);\r\n\r\n\treturn windowSize;\r\n}\r\n","import React, { useState } from 'react';\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport { useHawkConfig } from 'components/ConfigProvider';\r\nimport Facet from './Facet';\r\nimport PlaceholderFacet from './PlaceholderFacet';\r\nimport { getFacetComponents } from 'components/ui/Facets/Overrides';\r\nimport Selections from './Selections';\r\nimport { useTranslation } from 'react-i18next';\r\nimport classnames from 'classnames';\r\nimport PlusSVG from '../../svg/PlusSVG';\r\nimport XSVG from '../../svg/XSVG';\r\nimport { Element } from 'react-scroll';\r\nimport useWindowSize from 'shared/hooks/useWindowSize';\r\nimport { ScrollToResults } from 'features/search/FacetsAndResults';\r\n\r\nfunction FacetList(props: ScrollToResults) {\r\n\tconst { scrollToResults } = props;\r\n\r\n\tconst [isFacetsOpen, setIsFacetsOpen] = useState(false);\r\n\tconst size = useWindowSize();\r\n\r\n\tconst {\r\n\t\tstore: { searchResults, facetSelections },\r\n\t} = useHawkSearch();\r\n\r\n\tconst { config } = useHawkConfig();\r\n\tconst { t } = useTranslation();\r\n\r\n\t// the number of random placeholders to render while we wait for results\r\n\tconst [numPlaceholders] = useState(Math.round(Math.random() * (5 - 3) + 3));\r\n\r\n\tfunction handleMobileToggleClick() {\r\n\t\tif (isFacetsOpen) {\r\n\t\t\tcloseFacets();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\topenFacets();\r\n\t}\r\n\r\n\tfunction openFacets() {\r\n\t\tsetIsFacetsOpen(true);\r\n\t\tdocument.body.classList.add('hawk-facets-open');\r\n\t}\r\n\r\n\tfunction closeFacets() {\r\n\t\tsetIsFacetsOpen(false);\r\n\t\tdocument.body.classList.remove('hawk-facets-open');\r\n\t}\r\n\r\n\tfunction onFacetChanged() {\r\n\t\tscrollToResults('facet');\r\n\t}\r\n\r\n\tconst components = getFacetComponents(config.facetOverrides || []);\r\n\r\n\tif (!searchResults) {\r\n\t\treturn (\r\n\t\t\t
    \r\n\t\t\t\t{[...Array(numPlaceholders)].map((_, i) => (\r\n\t\t\t\t\t\r\n\t\t\t\t))}\r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n\r\n\tconst isNoSelections = Object.keys(facetSelections).length === 0;\r\n\r\n\tconst isNoHawkFacets = searchResults.Facets.length === 0;\r\n\r\n\tif (searchResults.Results.length === 0 && (isNoSelections || isNoHawkFacets)) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst hawkFacetRailButtonIconClass = 'hawk-facet-rail__heading-icon';\r\n\tconst isMobile = size && size.width && size.width < 768;\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\t{isMobile ? (\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{t('Narrow Results')}\r\n\r\n\t\t\t\t\t\t{isFacetsOpen ? (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\r\n\t\t\t\t) : (\r\n\t\t\t\t\t
    {t('Narrow Results')}
    \r\n\t\t\t\t)}\r\n\t\t\t\t{!isMobile || (isMobile && isFacetsOpen) ? (\r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t{searchResults.Facets.map((facet) => {\r\n\t\t\t\t\t\t\tif (!facet.IsVisible || facet.FieldType === 'tab') {\r\n\t\t\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tconst registeredComponent = components.find(\r\n\t\t\t\t\t\t\t\t(component) => component.facetType === facet.FacetType,\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\tconst Component = !registeredComponent ? null : registeredComponent.component;\r\n\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t{Component ? (\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t\t\t{facet.FieldType} {facet.FacetType} is not implemented!\r\n\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t
    \r\n\t\t\t\t) : null}\r\n\t\t\t\t{isMobile && isFacetsOpen ? (\r\n\t\t\t\t\t\r\n\t\t\t\t) : null}\r\n\t\t\t
    \r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default FacetList;\r\n","import * as React from 'react';\r\n\r\ninterface LeftChevronSVGProps {\r\n\tclass?: string;\r\n}\r\n\r\n/**\r\n * Left chevron SVG\r\n *\r\n * @returns\r\n */\r\nfunction LeftChevronSVG(props: LeftChevronSVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default LeftChevronSVG;\r\n","import * as React from 'react';\r\n\r\ninterface RightChevronSVGProps {\r\n\tclass: string;\r\n}\r\n\r\n/**\r\n * Right chevron SVG\r\n *\r\n * @returns\r\n */\r\nfunction RightChevronSVG(props: RightChevronSVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default RightChevronSVG;\r\n","import React, { useState } from 'react';\r\nimport { LeftChevronSVG, RightChevronSVG } from 'components/svg';\r\nimport useWindowSize from 'shared/hooks/useWindowSize';\r\nimport classnames from 'classnames';\r\nimport { createGuid } from 'shared/components/hawksearch/helpers/Cookies';\r\n\r\ninterface PagerProps {\r\n\tpage: number;\r\n\ttotalPages: number;\r\n\r\n\tonPageChange: (page: number) => void;\r\n}\r\n\r\nfunction Pager({ page, totalPages, onPageChange }: PagerProps) {\r\n\tconst [inputValue, setInputValue] = useState(undefined);\r\n\tconst [hasError, setHasError] = useState(false);\r\n\tconst [uniqueId] = useState(`page-input-${createGuid()}`);\r\n\r\n\tconst size = useWindowSize();\r\n\r\n\tfunction goToPreviousPage(e) {\r\n\t\te.preventDefault();\r\n\r\n\t\tgoToPage(page - 1);\r\n\t}\r\n\r\n\tfunction goToNextPage(e) {\r\n\t\te.preventDefault();\r\n\r\n\t\tgoToPage(page + 1);\r\n\t}\r\n\r\n\tfunction goToPage(pageNo: number) {\r\n\t\tif (isNaN(pageNo)) {\r\n\t\t\t// not a valid number\r\n\t\t\tdoInputError();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (pageNo < 1) {\r\n\t\t\t// can't go beyond the first page\r\n\t\t\tdoInputError();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (pageNo > totalPages) {\r\n\t\t\t// can't go beyond the last page\r\n\t\t\tdoInputError();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// once we've determined that we *do* want to do this page change, clear the user's input\r\n\t\t// because the input should be driven by props again\r\n\t\tsetInputValue(undefined);\r\n\r\n\t\t// inform the consumer that we've changed pages\r\n\t\tonPageChange(pageNo);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the input value for the pager input control. If the user has typed in a value into the input then\r\n\t * that value will be returned; otherwise, the page value passed in via props will be returned.\r\n\t */\r\n\tfunction getInputValue() {\r\n\t\tif (inputValue !== undefined) {\r\n\t\t\t// if the user typed an input, that's the page value for the control\r\n\t\t\treturn inputValue || '';\r\n\t\t}\r\n\r\n\t\t// otherwise, fall back to what's passed in through props\r\n\t\treturn page;\r\n\t}\r\n\r\n\tfunction onKeyDown(event: React.KeyboardEvent) {\r\n\t\tif (event.key === 'Enter') {\r\n\t\t\tconst wantedPageNo = parseInt(event.currentTarget.value, 10);\r\n\t\t\tgoToPage(wantedPageNo);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction doInputError() {\r\n\t\tsetHasError(true);\r\n\r\n\t\t// in 500ms, clear the error animation\r\n\t\tsetTimeout(() => {\r\n\t\t\tsetHasError(false);\r\n\t\t}, 500);\r\n\t}\r\n\r\n\tfunction onChange(event: React.ChangeEvent) {\r\n\t\tsetInputValue(event.currentTarget.value);\r\n\t}\r\n\r\n\tconst prevSearchParams = new URLSearchParams(window.location.search);\r\n\tprevSearchParams.set('pg', (page > 1 ? page - 1 : page).toString());\r\n\r\n\tconst nextSearchParams = new URLSearchParams(window.location.search);\r\n\tnextSearchParams.set('pg', (page === totalPages ? page : page + 1).toString());\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tPrevious page\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t  of {totalPages}\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tNext page\r\n\t\t\t\r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default Pager;\r\n","import React from 'react';\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport { ScrollToResults } from 'features/search/FacetsAndResults';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nfunction ItemsPerPage(props: ScrollToResults) {\r\n\tconst { t } = useTranslation();\r\n\tconst { scrollToResults } = props;\r\n\r\n\tconst {\r\n\t\tstore: { searchResults, pendingSearch },\r\n\t\tactor,\r\n\t} = useHawkSearch();\r\n\r\n\tfunction onChangeAndBlur(event: React.ChangeEvent) {\r\n\t\tactor.setSearch({\r\n\t\t\tMaxPerPage: Number(event.currentTarget.value),\r\n\t\t\tPageNo: 1, // if we change our max items per page, reset to page 1\r\n\t\t});\r\n\r\n\t\tif (event.type !== 'blur') {\r\n\t\t\tscrollToResults(t('items per page'));\r\n\t\t}\r\n\t}\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\tView\r\n\t\t\t\r\n\t\t\t\t{searchResults ? (\r\n\t\t\t\t\tsearchResults.Pagination.Items.map((paginationItem) => (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t))\r\n\t\t\t\t) : (\r\n\t\t\t\t\t\r\n\t\t\t\t)}\r\n\t\t\t\r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default ItemsPerPage;\r\n","import React from 'react';\r\n\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport Pager from './Pager';\r\nimport ItemsPerPage from './ItemsPerPage';\r\nimport { ScrollToResults } from 'features/search/FacetsAndResults';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nfunction Pagination(props: ScrollToResults) {\r\n\tconst { scrollToResults } = props;\r\n\tconst { t } = useTranslation();\r\n\r\n\tconst {\r\n\t\tstore: { searchResults, pendingSearch },\r\n\t\tactor,\r\n\t} = useHawkSearch();\r\n\r\n\tfunction onPageChange(pageNo: number) {\r\n\t\t// when the pager's page changes, trigger a new search\r\n\t\tactor.setSearch({\r\n\t\t\tPageNo: pageNo,\r\n\t\t});\r\n\r\n\t\tscrollToResults(t('pagination'));\r\n\t}\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default Pagination;\r\n","import { ScrollToResults } from 'features/search/FacetsAndResults';\r\nimport React from 'react';\r\nimport { Pagination } from './Tools';\r\n\r\nfunction ToolRow(props: ScrollToResults) {\r\n\tconst { scrollToResults } = props;\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t{/* Have to decide if we need this or not. Not in design */}\r\n\t\t\t{/*
    \r\n\t\t\t\t\r\n\t\t\t
    */}\r\n\r\n\t\t\t
    \r\n\t\t\t\t\r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default ToolRow;\r\n","import React from 'react';\r\n\r\nimport { Result } from 'models/Search';\r\nimport ResultImage from './ResultImage';\r\nimport { dispatchRocEvent } from 'shared/hooks/useRocEventHandler';\r\nimport { WithTestIdOptional } from 'shared-client/types/test';\r\n// #region HCL\r\nimport { ProductPriceAndAvailability } from './data.HCL';\r\n// #endregion\r\n\r\nexport interface ResultItemProps extends WithTestIdOptional {\r\n\titem: Result;\r\n\t// #region HCL\r\n\tproductPricingAndAvailability?: ProductPriceAndAvailability;\r\n\tisLoadingPricing?: boolean;\r\n\t// #endregion\r\n}\r\n\r\nfunction ResultItem({ item }: ResultItemProps) {\r\n\tconst itemName = item.getDocumentValue('name');\r\n\tconst url = item.getDocumentValue('url_detail');\r\n\t// #region Commerce\r\n\tconst uniqueId = item.getDocumentValue('uniqueId');\r\n\t// #endregion\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t\r\n\r\n\t\t\t
    \r\n\t\t\t\t{url ? (\r\n\t\t\t\t\t {\r\n\t\t\t\t\t\t\tif (uniqueId) {\r\n\t\t\t\t\t\t\t\tdispatchRocEvent('product-clicked', {\r\n\t\t\t\t\t\t\t\t\tproductId: uniqueId,\r\n\t\t\t\t\t\t\t\t\turl: url,\r\n\t\t\t\t\t\t\t\t\tproductName: itemName ?? '',\r\n\t\t\t\t\t\t\t\t\tproductGroupId: null,\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t// #endregion\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{itemName}\r\n\t\t\t\t\t\r\n\t\t\t\t) : (\r\n\t\t\t\t\t{itemName}\r\n\t\t\t\t)}\r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default ResultItem;\r\n","import React from 'react';\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nfunction SearchResultsLabel() {\r\n\tconst {\r\n\t\tstore: { pendingSearch },\r\n\t} = useHawkSearch();\r\n\r\n\tconst { t } = useTranslation();\r\n\r\n\tif (!pendingSearch.Keyword) {\r\n\t\t// no selections, so render nothing\r\n\t\treturn null;\r\n\t}\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t

    \r\n\t\t\t\t{pendingSearch.Keyword ? t('Search Results for') + ' ' + pendingSearch.Keyword : t('Search Results')}\r\n\t\t\t

    \r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default SearchResultsLabel;\r\n","import * as React from 'react';\r\n\r\ninterface PlugSVGProps {\r\n\tclass?: string;\r\n}\r\n\r\n/**\r\n * Plug SVG for 404 and other pages\r\n *\r\n * @returns\r\n */\r\nfunction PlugSVG(svgProps: PlugSVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nPlugSVG.defaultProps = { class: '' };\r\n\r\nexport default PlugSVG;\r\n","import React from 'react';\r\nimport PlugSVG from 'components/svg/PlugSVG';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport default function NoResults() {\r\n\tconst { t } = useTranslation();\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t

    {t('No Search Results')}

    \r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t

    {t('Sorry about that!')}

    \r\n\t\t\t\t\t

    {t('Your search did not return any results.')}

    \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t
    • {t('Please double check your spelling.')}
    • \r\n\t\t\t\t\t\t
    • \r\n\t\t\t\t\t\t\t{t('Try searching for an item that is less specific.')}\r\n\t\t\t\t\t\t
    • \r\n\t\t\t\t\t\t
    • \r\n\t\t\t\t\t\t\t{t('You can always narrow your search results later.')}\r\n\t\t\t\t\t\t
    • \r\n\t\t\t\t\t\t
    • \r\n\t\t\t\t\t\t\t{t('You can enter a new search topic in the search bar at the top of the page.')}\r\n\t\t\t\t\t\t
    • \r\n\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n}\r\n","import React, { useState } from 'react';\r\nimport useShoppingCart, { UseShoppingCart } from 'features/commerce/shopping-cart/useShoppingCart';\r\nimport Modal from 'shared/components/Modal';\r\nimport { Localizer } from 'services/Localizer';\r\nimport { AddToCartExceptionCode } from 'features/commerce/product-details/types';\r\nimport { AddToCartResponse } from 'services/UserData.Commerce';\r\nimport AddedToCartAlert from 'features/commerce/store/AddedToCartAlert';\r\nimport InlineAlert from 'shared/edit/InlineAlert';\r\nimport Spinner from 'shared/components/Spinner';\r\nimport { dispatchRocEvent } from 'shared/hooks/useRocEventHandler';\r\nimport ShoppingCartSVG from 'shared/components/svg/ShoppingCartSVG';\r\nimport { CompareResultObject } from 'shared/components/hawksearch/models/CompareResultObject';\r\n\r\nexport interface CompareProductAddToCartProps {\r\n\tcompareResultItem: CompareResultObject;\r\n}\r\n\r\nexport default function CompareProductAddToCart({ compareResultItem }: CompareProductAddToCartProps) {\r\n\tconst productId = compareResultItem.DocId;\r\n\tconst [modalOpen, setModalOpen] = useState(true);\r\n\tconst [isLoading, setIsLoading] = useState(false);\r\n\tconst [addToCartResponse, setAddToCartResponse] = useState(null);\r\n\r\n\tconst UseShoppingCartResult: UseShoppingCart = useShoppingCart();\r\n\tconst {\r\n\t\tstate: { errorMessage, errorType },\r\n\t\tactor: { addToCart },\r\n\t} = UseShoppingCartResult;\r\n\r\n\tconst errorTitle =\r\n\t\terrorType === AddToCartExceptionCode.cartFull\r\n\t\t\t? Localizer('CartFull')\r\n\t\t\t: errorType === AddToCartExceptionCode.productOutOfStock\r\n\t\t\t? Localizer('OutOfStock')\r\n\t\t\t: errorType === AddToCartExceptionCode.productUnavailable\r\n\t\t\t? Localizer('ProductUnavailable')\r\n\t\t\t: Localizer('ErrorMessageGenericTitle');\r\n\r\n\tconst handleAddToCart = async () => {\r\n\t\ttry {\r\n\t\t\tif (!productId) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tsetAddToCartResponse(null);\r\n\t\t\tsetIsLoading(true);\r\n\t\t\tconst response = await addToCart({\r\n\t\t\t\titemId: productId,\r\n\t\t\t\tquantity: 1,\r\n\t\t\t\tproductPricingLineId: null,\r\n\t\t\t});\r\n\r\n\t\t\tsetModalOpen(true);\r\n\t\t\tsetIsLoading(false);\r\n\r\n\t\t\tif (!response) {\r\n\t\t\t\tsetAddToCartResponse(null);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tdispatchRocEvent('roc-cart-summary-updated', { cartSummary: response.cartSummary });\r\n\r\n\t\t\tsetAddToCartResponse(response);\r\n\t\t} catch (error) {\r\n\t\t\tsetAddToCartResponse(null);\r\n\t\t}\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t
    \r\n\t\t\t\t{isLoading ? (\r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t{Localizer('Loading')}\r\n\t\t\t\t\t
    \r\n\t\t\t\t) : (\r\n\t\t\t\t\t\r\n\t\t\t\t)}\r\n\t\t\t
    \r\n\r\n\t\t\t{addToCartResponse !== null ? (\r\n\t\t\t\t Localizer('AddedToCart')}\r\n\t\t\t\t\tcloseModal={() => setModalOpen(false)}\r\n\t\t\t\t\tclassName=\"addedToCartModal\"\r\n\t\t\t\t>\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t) : null}\r\n\r\n\t\t\t{errorMessage && (\r\n\t\t\t\t errorTitle} closeModal={() => setModalOpen(false)}>\r\n\t\t\t\t\t{errorMessage}} />\r\n\t\t\t\t\r\n\t\t\t)}\r\n\t\t\r\n\t);\r\n}\r\n","import Axios, { CancelTokenSource, AxiosError } from 'axios';\r\nimport AxiosHelper from 'services/AxiosHelper';\r\nimport { Item } from 'shared/components/hawksearch/models/Recommendation';\r\nimport { Result } from 'shared/components/hawksearch/models/Search';\r\nimport { CompareResultObject } from '../../../models/CompareResultObject';\r\n\r\nexport interface ProductPriceAndAvailability {\r\n\tsku: string;\r\n\tprice: string;\r\n\toutOfStock: boolean;\r\n}\r\n\r\nexport interface ProductPriceResponse {\r\n\tproductsPrices: ProductPriceAndAvailability[];\r\n}\r\n\r\n// Gets prices for items on PLP\r\nexport const GetProductsPriceDetails = async (results: Result[]) => {\r\n\tif (results.length === 0) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tlet itemSkus: string[] = [];\r\n\tresults.forEach((item) => {\r\n\t\tif (item.getDocumentValue('product_sku')) {\r\n\t\t\titemSkus.push(item.getDocumentValue('product_sku') ?? '');\r\n\t\t}\r\n\t});\r\n\r\n\titemSkus = itemSkus.filter((i) => i !== '');\r\n\treturn await SendRequest(itemSkus);\r\n};\r\n\r\n// Gets prices for recommendation items\r\nexport const GetProductComparisonPriceDetails = async (results: CompareResultObject[]) => {\r\n\tif (results.length === 0) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tlet itemSkus: string[] = [];\r\n\tresults.forEach((item) => {\r\n\t\tconst field = item.Document.find((item) => item.Field === 'product_sku');\r\n\r\n\t\tif (field && field.Value.length > 0) {\r\n\t\t\titemSkus.push(field.Value[0] ?? '');\r\n\t\t}\r\n\t});\r\n\r\n\titemSkus = itemSkus.filter((i) => i !== '');\r\n\treturn await SendRequest(itemSkus);\r\n};\r\n\r\n// Gets prices for recommendation items\r\nexport const GetRecommendationProductsPrice = async (results: Item[]) => {\r\n\tif (results.length === 0) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tlet itemSkus: string[] = [];\r\n\tresults.forEach((item) => {\r\n\t\titemSkus.push(item.sku ?? '');\r\n\t});\r\n\r\n\titemSkus = itemSkus.filter((i) => i !== '');\r\n\treturn await SendRequest(itemSkus);\r\n};\r\n\r\nconst SendRequest = async (itemSkus: string[]) => {\r\n\tconst requestToken: CancelTokenSource = Axios.CancelToken.source();\r\n\ttry {\r\n\t\tconst response = await AxiosHelper.post('/ajax/hawksearch/products-price', {\r\n\t\t\titemSkus,\r\n\t\t\tcancelToken: requestToken.token,\r\n\t\t});\r\n\t\treturn response?.data;\r\n\t} catch (error) {\r\n\t\tconst axiosError = error as AxiosError;\r\n\t\tconsole.error(`An error occurred while loading pricing organization: ${axiosError.message}`);\r\n\t\treturn undefined;\r\n\t}\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface SpinnerProps {\r\n\tisVisible: boolean;\r\n}\r\n\r\nfunction Spinner({ isVisible }: SpinnerProps) {\r\n\tconst { t } = useTranslation();\r\n\r\n\tif (!isVisible) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t
    {t('Loading')}...
    \r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default Spinner;\r\n","/* eslint-disable camelcase */\r\nimport * as React from 'react';\r\nimport { useState } from 'react';\r\nimport { useEffect } from 'react';\r\nimport { CompareResultObject } from '../../models/CompareResultObject';\r\nimport { CompareValueType } from '../../store/HawkState';\r\nimport { useHawkSearch } from '../StoreProvider';\r\n\r\n//#region Commerce\r\nimport ProductPricing from 'shared/components/commerce/ProductPricing';\r\n//#endregion Commerce\r\n\r\n//#region HCL\r\nimport CompareProductAddToCart from 'features/search/components/commerce/CompareProductAddToCart.HCL';\r\nimport { GetProductComparisonPriceDetails } from '../ui/Results/data.HCL';\r\nimport Spinner from '../ui/Spinner';\r\n//#endregion\r\n\r\ninterface CompareItemHeader {\r\n\tdocId: string;\r\n\tname: string;\r\n\turl: string;\r\n\timageUrl?: string;\r\n\timageAltTag?: string;\r\n}\r\n\r\n/**\r\n * A table of products that are being compared\r\n * @param props\r\n */\r\n// #region HCL - this entire widget is customized to override prices from Hawk with prices from ROC\r\nexport default function CompareItemsTableHCL(props: { compareItems: CompareResultObject[] }) {\r\n\tconst [isLoadingPricing, setIsLoadingPricing] = useState(false);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (props.compareItems) {\r\n\t\t\tsetIsLoadingPricing(true);\r\n\r\n\t\t\t(async () => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst response = await GetProductComparisonPriceDetails(props.compareItems);\r\n\t\t\t\t\tif (response && response.productsPrices && response.productsPrices.length > 0) {\r\n\t\t\t\t\t\t// add overridden pricing to items for display\r\n\t\t\t\t\t\tprops.compareItems.forEach((ci) => {\r\n\t\t\t\t\t\t\tconst skus = ci.Document.find((item) => item.Field === 'product_sku');\r\n\t\t\t\t\t\t\tif (skus && skus.Value.length > 0) {\r\n\t\t\t\t\t\t\t\tconst sku = skus.Value[0];\r\n\r\n\t\t\t\t\t\t\t\tconst matchingCustomPrice = response.productsPrices.find((p) => p.sku === sku);\r\n\r\n\t\t\t\t\t\t\t\tif (sku && matchingCustomPrice) {\r\n\t\t\t\t\t\t\t\t\tci.Document.push({\r\n\t\t\t\t\t\t\t\t\t\tCompare: true,\r\n\t\t\t\t\t\t\t\t\t\tField: 'customer_specific_pricing',\r\n\t\t\t\t\t\t\t\t\t\tLabel: 'Display Pricing',\r\n\t\t\t\t\t\t\t\t\t\tValue: [matchingCustomPrice.price],\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\t// Handle error if necessary\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tsetIsLoadingPricing(false);\r\n\t\t\t\t}\r\n\t\t\t})();\r\n\t\t}\r\n\t}, [props.compareItems]);\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t{!isLoadingPricing ? (\r\n\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t) : null}\r\n\t\t\r\n\t);\r\n}\r\n// #endregion HCL\r\n\r\n/**\r\n * Top of the compare items table which displays a product's image and name\r\n * @param props\r\n */\r\nfunction CompareTableHeaders(props: { compareItems: CompareResultObject[] }) {\r\n\tconst {\r\n\t\tactor: { getCompareFieldValue },\r\n\t} = useHawkSearch();\r\n\r\n\tconst [itemHeaders, setItemHeaders] = useState([]);\r\n\r\n\tuseEffect(() => {\r\n\t\tsetItemHeaders(\r\n\t\t\tprops.compareItems.map((item) => {\r\n\t\t\t\tconst name = getCompareFieldValue(item, 'name', CompareValueType.SingleValueString);\r\n\t\t\t\tconst url = getCompareFieldValue(item, 'url_detail', CompareValueType.SingleValueString);\r\n\t\t\t\tconst imageUrl = getCompareFieldValue(item, 'image', CompareValueType.SingleValueString);\r\n\t\t\t\tconst imageAltTag = getCompareFieldValue(\r\n\t\t\t\t\titem,\r\n\t\t\t\t\t'product_imagealttag',\r\n\t\t\t\t\tCompareValueType.SingleValueString,\r\n\t\t\t\t);\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tdocId: item.DocId,\r\n\t\t\t\t\tname: name ?? 'N/A',\r\n\t\t\t\t\turl: url ?? '/',\r\n\t\t\t\t\timageUrl: imageUrl ?? '/images/image-not-found.png',\r\n\t\t\t\t\timageAltTag: imageAltTag ?? name ?? 'N/A',\r\n\t\t\t\t};\r\n\t\t\t}),\r\n\t\t);\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [props.compareItems]);\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t{itemHeaders.map((item) => {\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
    {item.name}
    \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t);\r\n\t\t\t\t})}\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\n/** Hawksearch fields that should be included in the compare table */\r\nconst COMPARE_KEYS = [\r\n\t'product_brand',\r\n\t'product_displayprice', // JSON value, requires JSON parsing\r\n\t'product_groupdisplayprice', // Internal use only. Gets mapped to product_displayprice for the client\r\n\t'product_ratingaverage', // Decimal value, requires float parsing\r\n\t'product_sku',\r\n\t'productattr_c',\r\n\t'productattr_size',\r\n\t// #region HCL\r\n\t'customer_specific_pricing', // Internal use only, if loaded from ajax call, gets mapped to product_displayprice for the client\r\n\t'productattr_adacompliant',\r\n\t'productattr_adhesivetype',\r\n\t'productattr_autoclavable',\r\n\t'productattr_cdccompliant',\r\n\t'productattr_chemoclean',\r\n\t'productattr_hclexclusiveitem',\r\n\t'productattr_productlength',\r\n\t'productattr_productheight',\r\n\t'productattr_productwidth',\r\n\t'productattr_sealsremovalable',\r\n\t'productattr_sterile',\r\n\t'productattr_supplierpartno',\r\n\t'productattr_tempmeasurement',\r\n\t// #endregion\r\n];\r\n\r\n/**\r\n * Table body for compare items which lists the values of various attributes to be compared among the products\r\n * @param props\r\n */\r\nfunction CompareTableBody(props: { compareItems: CompareResultObject[] }) {\r\n\tconst {\r\n\t\tactor: { getCompareFieldValue },\r\n\t} = useHawkSearch();\r\n\r\n\tconst [compareFields, setCompareFields] = useState>({});\r\n\tconst [compareValues, setCompareValues] = useState[]>([]);\r\n\r\n\tconst { compareItems } = props;\r\n\r\n\tuseEffect(() => {\r\n\t\tconst distinctFields = {};\r\n\r\n\t\tconst valuesResult: Record[] = [];\r\n\t\tfor (const item of compareItems) {\r\n\t\t\tconst valuesItem = { docId: item.DocId };\r\n\r\n\t\t\t// Create a set of all distinct fields that should be included\r\n\t\t\tfor (const fieldItem of item.Document) {\r\n\t\t\t\tif (fieldItem.Compare && COMPARE_KEYS.includes(fieldItem.Field)) {\r\n\t\t\t\t\tif (distinctFields[fieldItem.Field] == null) {\r\n\t\t\t\t\t\tdistinctFields[fieldItem.Field] = fieldItem.Label;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Loop through the distinct fields and get their value if present\r\n\t\t\tfor (const key of Object.keys(distinctFields)) {\r\n\t\t\t\tswitch (key) {\r\n\t\t\t\t\tcase 'product_ratingaverage':\r\n\t\t\t\t\t\tvaluesItem[key] = getCompareFieldValue(item, key, CompareValueType.MultipleValueDecimal);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'product_displayprice':\r\n\t\t\t\t\tcase 'product_groupdisplayprice':\r\n\t\t\t\t\tcase 'customer_specific_pricing':\r\n\t\t\t\t\t\tvaluesItem[key] = getCompareFieldValue(item, key, CompareValueType.SingleValueString);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tvaluesItem[key] = getCompareFieldValue(item, key, CompareValueType.MultipleValueString);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvaluesResult.push(valuesItem);\r\n\t\t}\r\n\r\n\t\t// Set group products' prices to regular price field\r\n\t\tif (distinctFields['product_groupdisplayprice'] !== undefined) {\r\n\t\t\tfor (const value of valuesResult) {\r\n\t\t\t\tif (value['product_groupdisplayprice'] !== undefined) {\r\n\t\t\t\t\tvalue['product_displayprice'] = value['product_groupdisplayprice'];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Now delete group product price field since it has been mapped to non-group price field\r\n\t\t\tdelete distinctFields['product_groupdisplayprice'];\r\n\t\t}\r\n\r\n\t\t// Set products' prices to customer specific price field\r\n\t\tif (distinctFields['customer_specific_pricing'] !== undefined) {\r\n\t\t\tfor (const value of valuesResult) {\r\n\t\t\t\tif (value['customer_specific_pricing'] !== undefined) {\r\n\t\t\t\t\tvalue['product_displayprice'] = value['customer_specific_pricing'];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Now delete group product price field since it has been mapped to non-group price field\r\n\t\t\tdelete distinctFields['customer_specific_pricing'];\r\n\t\t}\r\n\r\n\t\tsetCompareFields(distinctFields);\r\n\t\tsetCompareValues(valuesResult);\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [compareItems]);\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t{Object.keys(compareFields).map((field) => {\r\n\t\t\t\tconst label = compareFields[field];\r\n\r\n\t\t\t\treturn (\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{label}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t{compareValues.map((value) => {\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t\r\n\t\t\t\t);\r\n\t\t\t})}\r\n\t\t\t{/* #region HCL */}\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t{compareItems.map((item) => {\r\n\t\t\t\t\tconst exists = item.Document.filter(obj => obj['Field'] === 'product_groupdisplayprice').length > 0;\r\n\t\t\t\t\tif(!exists) {\r\n\t\t\t\t\t\treturn (\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\t\t\t\t\t\r\n\t\t\t\t})}\r\n\t\t\t\r\n\t\t\t{/* #endregion HCL */}\r\n\t\t\r\n\t);\r\n}\r\n\r\n/**\r\n * The value for a field. Displays 'N/A' if the field's value is not present for this item\r\n * @param props\r\n */\r\nfunction CompareItemFieldValue(props: { value: string | null; field: string }) {\r\n\tconst { value } = props;\r\n\r\n\tif (value == null) {\r\n\t\treturn <>{'N/A'};\r\n\t}\r\n\r\n\t//#region Commerce\r\n\tif (props.field === 'product_displayprice') {\r\n\t\treturn ;\r\n\t}\r\n\t//#endregion Commerce\r\n\r\n\treturn <>{value};\r\n}\r\n","import * as React from 'react';\r\nimport Modal from 'shared/components/Modal';\r\nimport { CompareResultObject } from '../../models/CompareResultObject';\r\n// #region HCL\r\nimport CompareItemsTableHCL from './CompareItemsTable.HCL';\r\n// #endregion\r\n\r\nexport interface CompareItemsModalProps {\r\n\t/**\r\n\t * The compare items\r\n\t *\r\n\t * @type {CompareResultObject[]}\r\n\t * @memberof CompareItemsModalProps\r\n\t */\r\n\tresultItems: CompareResultObject[];\r\n\r\n\t/**\r\n\t * What happens when we toggle the modal visibility.\r\n\t *\r\n\t * @memberof CompareItemsModalProps\r\n\t */\r\n\tonModalToggle: (showModal: boolean) => void;\r\n\r\n\t/**\r\n\t * Controls whether the modal is open.\r\n\t *\r\n\t * @type {boolean}\r\n\t * @memberof CompareItemsModalProps\r\n\t */\r\n\tpopup: boolean;\r\n}\r\n\r\n/**\r\n * Modal containing a table of hawksearch result items to be compared\r\n */\r\nfunction CompareItemsModal({ resultItems, onModalToggle, popup }: CompareItemsModalProps) {\r\n\tif (resultItems == null || resultItems.length == 0 || !popup) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\treturn (\r\n\t\t {\r\n\t\t\t\tonModalToggle(false);\r\n\t\t\t}}\r\n\t\t\trenderTitle={() => 'Compare Items'}\r\n\t\t\trenderActions={() => (\r\n\t\t\t\t<>\r\n\t\t\t\t\t onModalToggle(false)}\r\n\t\t\t\t\t\tclassName=\"roc-btn roc-modal__btn roc-modal__btn-cancel\"\r\n\t\t\t\t\t\tdata-testid=\"compare-close-btn\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tClose\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t)}\r\n\t\t>\r\n\t\t\t{/* #region HCL */}\r\n\t\t\t\r\n\t\t\t{/* #endregion HCL */}\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default CompareItemsModal;\r\n","import React, { useEffect, useState } from 'react';\r\nimport type { Tooltip as TooltipType } from '@reach/tooltip';\r\nimport { Result } from 'models/Search';\r\nimport Spinner from 'shared/components/Spinner';\r\nimport InlineAlert from 'shared/edit/InlineAlert';\r\nimport XCircleSVG from '../../svg/XCircleSVG';\r\nimport DownChevronSVG from 'shared/components/svg/DownChevronSVG';\r\nimport UpChevronSVG from 'shared/components/svg/UpChevronSVG';\r\nimport useWindowSize from 'shared/hooks/useWindowSize';\r\n\r\nconst Tooltip = React.lazy(() => import('@reach/tooltip'));\r\n\r\ninterface CompareTilesProps {\r\n\t/**\r\n\t * Image url for compare item.\r\n\t *\r\n\t * @type {string}\r\n\t * @memberof CompareTilesProps\r\n\t */\r\n\timageURL: string;\r\n\r\n\t/**\r\n\t * Name of the item.\r\n\t *\r\n\t * @type {string}\r\n\t * @memberof CompareTilesProps\r\n\t */\r\n\titemName: string;\r\n\r\n\t/**\r\n\t * The item data itself.\r\n\t *\r\n\t * @type {Result}\r\n\t * @memberof CompareTilesProps\r\n\t */\r\n\titem?: Result;\r\n\r\n\t/**\r\n\t * What happens when a tile is selected.\r\n\t *\r\n\t * @memberof CompareTilesProps\r\n\t */\r\n\tonSelectTiles: (item: Result) => void;\r\n}\r\n\r\ninterface CompareItemProps {\r\n\t/**\r\n\t * The list of items themselves.\r\n\t *\r\n\t * @type {Result[]}\r\n\t * @memberof CompareItemProps\r\n\t */\r\n\titemsList: Result[];\r\n\r\n\t/**\r\n\t * Logic for when a compare button is pressed.\r\n\t *\r\n\t * @memberof CompareItemProps\r\n\t */\r\n\tonSelectCompareItems: () => void;\r\n\r\n\t/**\r\n\t * Clearing logic.\r\n\t *\r\n\t * @memberof CompareItemProps\r\n\t */\r\n\tclearItems: () => void;\r\n\r\n\t/**\r\n\t * What happens when you click a tile.\r\n\t *\r\n\t * @memberof CompareItemProps\r\n\t */\r\n\tonSelectTiles: (item: Result) => void;\r\n\terror: boolean;\r\n}\r\n\r\n/**\r\n * The tiles for each compare item w/ the tooltip from reach UI to display the name.\r\n *\r\n * @param {CompareTilesProps} { imageURL, itemName, onSelectTiles, item }\r\n * @returns\r\n */\r\nfunction CompareTiles({ imageURL, itemName, onSelectTiles, item }: CompareTilesProps) {\r\n\tif (item && onSelectTiles) {\r\n\t\treturn (\r\n\t\t\t}>\r\n\t\t\t\t\r\n\t\t\t\t\t onSelectTiles(item)}\r\n\t\t\t\t\t\tclassName=\"hawk-compare-bar__list-item hawk-compare-bar__list-item--has-image\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t{imageURL ? (\r\n\t\t\t\t\t\t\t{itemName}\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n\treturn
    {imageURL && {itemName}}
    ;\r\n}\r\n\r\n/**\r\n * Component that handles the actual map of the compare items.\r\n *\r\n * @param {CompareItemProps} { itemsList, onSelectCompareItems, clearItems, onSelectTiles, error }\r\n * @returns\r\n */\r\nfunction CompareItems({ itemsList, onSelectCompareItems, clearItems, onSelectTiles, error }: CompareItemProps) {\r\n\tconst [compareHidden, setCompareHidden] = useState(false);\r\n\tconst size = useWindowSize();\r\n\r\n\tfunction onMobileToggleCompare() {\r\n\t\tsetCompareHidden(!compareHidden);\r\n\t}\r\n\r\n\tuseEffect(() => {\r\n\t\tsetCompareHidden(false);\r\n\t}, [itemsList]);\r\n\r\n\tconst isMobile = size && size.width && size.width < 768;\r\n\tconst isCollapsed = isMobile && compareHidden;\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t
    \r\n\t\t\t\t{!isMobile ? (\r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tCompare up to 5 items\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
    \r\n\t\t\t\t) : null}\r\n\r\n\t\t\t\t{!isCollapsed ? (\r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t{[...Array(5)].map((_, index) => {\r\n\t\t\t\t\t\t\t\t\tif (itemsList && itemsList.length && itemsList[index]) {\r\n\t\t\t\t\t\t\t\t\t\tconst imageURL = itemsList[index].getDocumentValue('image');\r\n\t\t\t\t\t\t\t\t\t\tconst itemName = itemsList[index].getDocumentValue('name');\r\n\t\t\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t) : null}\r\n\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t onSelectCompareItems()}\r\n\t\t\t\t\t\t\tclassName=\"hawk-btn hawk-btn-primary hawk-compare-bar__action\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\tCompare\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t clearItems()}\r\n\t\t\t\t\t\t\tclassName=\"hawk-btn hawk-btn-primary-outline hawk-compare-bar__action\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\tClear\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{isCollapsed ? : }\r\n\t\t\t\t\t\t\tCollapse the compare bar\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\r\n\t\t\t{error ? : null}\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default CompareItems;\r\n","import React, { useState } from 'react';\r\nimport { useHawkSearch } from 'shared/components/hawksearch/components/StoreProvider';\r\nimport CompareItemsModal from './CompareItemsModal';\r\nimport RocHawkConfig from 'features/search/RocHawkConfig';\r\nimport CompareItems from '../ui/Compare/CompareItems';\r\nimport ErrorBoundary from 'shared/util/ErrorBoundary';\r\n\r\n/**\r\n * Component that renders the bar below the listing controls that houses the selected products for compare.\r\n *\r\n * @returns\r\n */\r\nfunction CompareItemsBar() {\r\n\tconst {\r\n\t\tactor,\r\n\t\tstore: { itemsToCompare, itemsToCompareIds, comparedResults },\r\n\t} = useHawkSearch();\r\n\r\n\tconst [popup, setPopup] = useState(false);\r\n\r\n\tconst [error, setError] = useState(false);\r\n\r\n\t/**\r\n\t * Grab the compared results from Hawk.\r\n\t *\r\n\t */\r\n\tasync function getCompareItems() {\r\n\t\ttry {\r\n\t\t\tconst resp = await actor.getComparedItems({\r\n\t\t\t\tClientGuid: RocHawkConfig.clientGuid || '',\r\n\t\t\t\tIds: itemsToCompareIds,\r\n\t\t\t});\r\n\t\t\tactor.setComparedResults(resp.Results);\r\n\t\t\tsetPopup(true);\r\n\t\t} catch (e) {\r\n\t\t\tsetError(true);\r\n\t\t\tconsole.log(e);\r\n\t\t}\r\n\t}\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t
    \r\n\t\t\t\t actor.clearItemsToCompare()}\r\n\t\t\t\t\tonSelectTiles={(item) => actor.setItemsToCompare(item, false)}\r\n\t\t\t\t\terror={error}\r\n\t\t\t\t/>\r\n\r\n\t\t\t\t\r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default CompareItemsBar;\r\n","import * as React from 'react';\r\nimport { SVGProps } from './SVGProps';\r\nimport classnames from 'classnames';\r\n\r\n/**\r\n * LIST SVG component\r\n *\r\n * @returns\r\n */\r\nfunction ListSVG({ className }: SVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default ListSVG;\r\n","import * as React from 'react';\r\nimport { SVGProps } from './SVGProps';\r\nimport classnames from 'classnames';\r\n\r\n/**\r\n * GRID SVG component\r\n *\r\n * @returns\r\n */\r\nfunction GridSVG({ className }: SVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default GridSVG;\r\n","import React from 'react';\r\n\r\nimport PlaceholderImage from './PlaceholderImage';\r\n\r\nfunction PlaceholderItem() {\r\n\treturn (\r\n\t\t
    \r\n\t\t\t
    \r\n\t\t\t\t\r\n\t\t\t
    \r\n\r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default PlaceholderItem;\r\n","import PlaceholderItem from './PlaceholderItem';\r\nimport Spinner from 'components/ui/Spinner';\r\nimport ResultItem, { ResultItemProps } from './ResultItem';\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport { ProductPriceResponse } from './data.HCL';\r\nimport React from 'react';\r\n\r\nexport interface ResultsListingProps {\r\n\tresultItem: React.ComponentType;\r\n\tpricingAndAvailability?: ProductPriceResponse;\r\n\tisLoadingPricing: boolean;\r\n}\r\n\r\nfunction ResultListingHCL({ resultItem = ResultItem, pricingAndAvailability, isLoadingPricing }: ResultsListingProps) {\r\n\tconst {\r\n\t\tstore: { isLoading, searchResults },\r\n\t} = useHawkSearch();\r\n\r\n\tconst results = searchResults ? searchResults.Results : [];\r\n\tconst ResultComponent = resultItem;\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t\r\n\t\t\t{results.length && !isLoading\r\n\t\t\t\t? // if we have results, display them\r\n\t\t\t\t results.map((result, index) => {\r\n\t\t\t\t\t\tconst sku = result.getDocumentValue('product_sku');\r\n\t\t\t\t\t\tconst productPricingAndAvailability = pricingAndAvailability?.productsPrices?.find(\r\n\t\t\t\t\t\t\t(r) => r.sku === sku,\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t);\r\n\t\t\t\t })\r\n\t\t\t\t: // otherwise display placeholder items as we're loading\r\n\t\t\t\t [...Array(12)].map((_, i) => )}\r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default ResultListingHCL;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport ToolRow from 'components/ui/Results/ToolRow';\r\nimport ResultItem, { ResultItemProps } from 'components/ui/Results/ResultItem';\r\nimport SearchResultsLabel from 'components/ui/Facets/SearchResultsLabel';\r\nimport NoResults from './NoResults';\r\nimport CompareItemsBar from 'components/compare-items/CompareItemsBar';\r\nimport classnames from 'classnames';\r\nimport { ScrollToResults } from 'features/search/FacetsAndResults';\r\nimport ListSVG from 'shared/components/svg/ListSVG';\r\nimport GridSVG from 'shared/components/svg/GridSVG';\r\nimport ResultListingHCL from './ResultListing.HCL';\r\nexport interface ResultsProps {\r\n\tresultItem?: React.ComponentType;\r\n}\r\nimport { GetProductsPriceDetails, ProductPriceResponse } from './data.HCL';\r\n\r\nfunction ResultsHCL({ resultItem = ResultItem, scrollToResults }: ResultsProps & ScrollToResults) {\r\n\tconst {\r\n\t\tstore: { isLoading, searchResults, requestError, itemsToCompare },\r\n\t} = useHawkSearch();\r\n\r\n\tconst [listView, ShowListView] = useState(false);\r\n\tconst [pricingAndAvailability, setPricingAndAvailability] = useState();\r\n\tconst [isLoadingPricing, setIsLoadingPricing] = useState(false);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (searchResults?.Results) {\r\n\t\t\tsetIsLoadingPricing(true);\r\n\r\n\t\t\t(async () => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst response = await GetProductsPriceDetails(searchResults?.Results);\r\n\t\t\t\t\tif (response) {\r\n\t\t\t\t\t\tsetPricingAndAvailability(response);\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\t// Handle error if necessary\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tsetIsLoadingPricing(false);\r\n\t\t\t\t}\r\n\t\t\t})();\r\n\t\t}\r\n\t}, [searchResults]);\r\n\r\n\tif (requestError) {\r\n\t\treturn An error occurred while searching for your results. Please contact the site administrator.;\r\n\t}\r\n\r\n\tif ((!searchResults || searchResults.Results.length === 0) && !isLoading) {\r\n\t\treturn ;\r\n\t}\r\n\r\n\tconst ToggleResultView = (elem) => {\r\n\t\tShowListView(!listView);\r\n\r\n\t\tconst controlBtn = document.querySelectorAll('.hawk-results-view-results-controls-btn');\r\n\r\n\t\tcontrolBtn.forEach((element) => {\r\n\t\t\telement.classList.remove('active');\r\n\t\t});\r\n\r\n\t\telem.currentTarget.classList.add('active');\r\n\t};\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\r\n\t\t\t
    \r\n\t\t\t\t\r\n\r\n\t\t\t\t
    \r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\r\n\t\t\t
    \r\n\t\t\t\t{itemsToCompare && itemsToCompare.length > 0 && 'Compare Bar Avaliable on Top of Listing'}\r\n\t\t\t
    \r\n\r\n\t\t\t{itemsToCompare && itemsToCompare.length > 0 && }\r\n\r\n\t\t\t\r\n\r\n\t\t\t
    \r\n\t\t\t\t\r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default ResultsHCL;\r\n","import React from 'react';\r\n\r\nimport ResultImage from 'components/ui/Results/ResultImage';\r\nimport { ResultItemProps } from 'components/ui/Results/ResultItem';\r\n\r\nfunction DefaultResultItem({ item, testId }: ResultItemProps) {\r\n\tconst itemName = item.getDocumentValue('name');\r\n\tconst url = item.getDocumentValue('url_detail');\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t\r\n\r\n\t\t\t
    \r\n\t\t\t\t{url ? (\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{itemName}\r\n\t\t\t\t\t\r\n\t\t\t\t) : (\r\n\t\t\t\t\t{itemName}\r\n\t\t\t\t)}\r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default DefaultResultItem;\r\n","import { ResultItemProps } from 'shared/components/hawksearch/components/ui/Results/ResultItem';\r\nimport React, { useState } from 'react';\r\nimport useShoppingCart, { UseShoppingCart } from 'features/commerce/shopping-cart/useShoppingCart';\r\nimport Modal from 'shared/components/Modal';\r\nimport { Localizer } from 'services/Localizer';\r\nimport { AddToCartExceptionCode } from 'features/commerce/product-details/types';\r\nimport { AddToCartResponse } from 'services/UserData.Commerce';\r\nimport AddedToCartAlert from 'features/commerce/store/AddedToCartAlert';\r\nimport InlineAlert from 'shared/edit/InlineAlert';\r\nimport Spinner from 'shared/components/Spinner';\r\nimport { dispatchRocEvent } from 'shared/hooks/useRocEventHandler';\r\nimport ShoppingCartSVG from 'shared/components/svg/ShoppingCartSVG';\r\n\r\nexport default function ProductAddToCart({ item, productPricingAndAvailability }: ResultItemProps) {\r\n\tconst productId = item.getDocumentValue('unique_id');\r\n\tconst [modalOpen, setModalOpen] = useState(true);\r\n\tconst [isLoading, setIsLoading] = useState(false);\r\n\tconst [addToCartResponse, setAddToCartResponse] = useState(null);\r\n\r\n\tconst UseShoppingCartResult: UseShoppingCart = useShoppingCart();\r\n\tconst {\r\n\t\tstate: { errorMessage, errorType },\r\n\t\tactor: { addToCart },\r\n\t} = UseShoppingCartResult;\r\n\r\n\tconst errorTitle =\r\n\t\terrorType === AddToCartExceptionCode.cartFull\r\n\t\t\t? Localizer('CartFull')\r\n\t\t\t: errorType === AddToCartExceptionCode.productOutOfStock\r\n\t\t\t? Localizer('OutOfStock')\r\n\t\t\t: errorType === AddToCartExceptionCode.productUnavailable\r\n\t\t\t? Localizer('ProductUnavailable')\r\n\t\t\t: Localizer('ErrorMessageGenericTitle');\r\n\r\n\tconst handleAddToCart = async () => {\r\n\t\ttry {\r\n\t\t\tif (!productId) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tsetAddToCartResponse(null);\r\n\t\t\tsetIsLoading(true);\r\n\t\t\tconst response = await addToCart({\r\n\t\t\t\titemId: productId,\r\n\t\t\t\tquantity: 1,\r\n\t\t\t\tproductPricingLineId: null,\r\n\t\t\t});\r\n\r\n\t\t\tsetModalOpen(true);\r\n\t\t\tsetIsLoading(false);\r\n\r\n\t\t\tif (!response) {\r\n\t\t\t\tsetAddToCartResponse(null);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tdispatchRocEvent('roc-cart-summary-updated', { cartSummary: response.cartSummary });\r\n\r\n\t\t\tsetAddToCartResponse(response);\r\n\t\t} catch (error) {\r\n\t\t\tsetAddToCartResponse(null);\r\n\t\t}\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t
    \r\n\t\t\t\t{isLoading ? (\r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t{Localizer('Loading')}\r\n\t\t\t\t\t
    \r\n\t\t\t\t) : (\r\n\t\t\t\t\t handleAddToCart()}\r\n\t\t\t\t\t\tkey={productId}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{Localizer('AddToCart')}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t)}\r\n\t\t\t
    \r\n\r\n\t\t\t{addToCartResponse !== null ? (\r\n\t\t\t\t Localizer('AddedToCart')}\r\n\t\t\t\t\tcloseModal={() => setModalOpen(false)}\r\n\t\t\t\t\tclassName=\"addedToCartModal\"\r\n\t\t\t\t>\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t) : null}\r\n\r\n\t\t\t{errorMessage && (\r\n\t\t\t\t errorTitle} closeModal={() => setModalOpen(false)}>\r\n\t\t\t\t\t{errorMessage}} />\r\n\t\t\t\t\r\n\t\t\t)}\r\n\t\t\r\n\t);\r\n}\r\n","import ResultImage from 'components/ui/Results/ResultImage';\r\nimport { ResultItemProps } from 'components/ui/Results/ResultItem';\r\nimport React, { useEffect, useState } from 'react';\r\n// #region HCL\r\nimport { Localizer } from 'services/Localizer';\r\nimport {\r\n\tAmbiguousDisplayPrice,\r\n\tDisplayPrice,\r\n\tPriceDisplayRule,\r\n\tSimpleDisplayPrice,\r\n} from 'shared-client/types/commerce/display-price';\r\n// #endregion\r\nimport ProductPricing from 'shared/components/commerce/ProductPricing';\r\nimport { useHawkSearch } from 'shared/components/hawksearch/components/StoreProvider';\r\nimport { dispatchRocEvent } from 'shared/hooks/useRocEventHandler';\r\n// #region HCL\r\nimport ProductAddToCart from './ProductAddToCart';\r\nimport Spinner from 'shared/components/Spinner';\r\n// #endregion\r\n\r\n// #region HCL - added productPricingAndAvailability\r\nfunction ProductResultItem({ item, testId, productPricingAndAvailability, isLoadingPricing }: ResultItemProps) {\r\n\t// #endregion\r\n\tconst [compareCheck, setCompareCheck] = useState(false);\r\n\tconst {\r\n\t\tstore: { itemsToCompareIds /*#region HCL*/, searchResults /*#endregion*/ },\r\n\t\tactor,\r\n\t} = useHawkSearch();\r\n\tuseEffect(() => {\r\n\t\tsetCompareCheck(itemsToCompareIds.indexOf(item.DocId) !== -1 ? true : false);\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [itemsToCompareIds]);\r\n\r\n\tconst itemName = item.getDocumentValue('name');\r\n\tconst url = item.getDocumentValue('url_detail');\r\n\r\n\t// unique_id is required for HawkSearch tracking\r\n\tconst uniqueId = item.getDocumentValue('unique_id');\r\n\r\n\t// function for dispatching product-clicked event\r\n\t// this is handled by hawksearch-commerce-tracker to report click event to Hawk Tracking API\r\n\tconst dispatchProductClickEvent = () => {\r\n\t\tif (uniqueId) {\r\n\t\t\tdispatchRocEvent('product-clicked', {\r\n\t\t\t\tproductId: uniqueId,\r\n\t\t\t\turl: url || '',\r\n\t\t\t\tproductName: itemName || '',\r\n\t\t\t\tproductGroupId: null,\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tfunction toggleItemsToCompare() {\r\n\t\tif (itemsToCompareIds.length >= 5 && compareCheck === false) {\r\n\t\t\talert('You can compare up to 5 items');\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tactor.setItemsToCompare(item, !compareCheck);\r\n\t}\r\n\r\n\t// #region HCL\r\n\tconst GetSalePercentageSummary = () => {\r\n\t\tconst displayPriceStringified =\r\n\t\t\titem.getDocumentValue('product_groupdisplayprice') || item.getDocumentValue('product_displayprice');\r\n\r\n\t\tconst displayPrice = displayPriceStringified\r\n\t\t\t? (JSON.parse(displayPriceStringified) as DisplayPrice)\r\n\t\t\t: undefined;\r\n\r\n\t\tif (!displayPrice) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet discount: number = 0;\r\n\t\tswitch (displayPrice.displayRule) {\r\n\t\t\tcase PriceDisplayRule.Normal:\r\n\t\t\t\tdiscount = getSimpleDiscount(displayPrice);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase PriceDisplayRule.AmbiguousRange:\r\n\t\t\t\tdiscount = getAmbiguousDiscount(displayPrice);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\treturn discount;\r\n\t};\r\n\r\n\tconst getSimpleDiscount = (price: SimpleDisplayPrice) => {\r\n\t\tlet discount: number = 0;\r\n\t\tif (price.salePrice?.rawValue) {\r\n\t\t\tconst basePrice = Number(price.basePrice.rawValue);\r\n\t\t\tconst salePrice = Number(price.salePrice.rawValue);\r\n\r\n\t\t\tdiscount = 100 - (100 * salePrice) / basePrice;\r\n\t\t}\r\n\t\treturn Math.round(discount);\r\n\t};\r\n\r\n\tconst getAmbiguousDiscount = (price: AmbiguousDisplayPrice) => {\r\n\t\tlet discount: number = 0;\r\n\t\tif (price.salePrice?.rawValue) {\r\n\t\t\tconst basePrice = Number(price.basePrice.rawValue);\r\n\t\t\tconst salePrice = Number(price.salePrice.rawValue);\r\n\r\n\t\t\tdiscount = 100 - (100 * salePrice) / basePrice;\r\n\t\t}\r\n\t\treturn Math.round(discount);\r\n\t};\r\n\r\n\tconst isNewProduct = () => {\r\n\t\tconst categories = item.getDocumentValues('category');\r\n\t\tif (!categories) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconst category = categories.find((c) => c.includes('New Products'));\r\n\t\tif (!category) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t};\r\n\r\n\t/**\r\n\t * Whether this item has child skus, or this item has multiple SKUs, which is only possible for products with child items\r\n\t */\r\n\tconst hasChildSkus = () => {\r\n\t\tconst childSkus = item.getDocumentValues('product_sku_child');\r\n\t\tif (childSkus) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tconst skus = item.getDocumentValues('product_sku');\r\n\t\tif (skus && skus.length > 1) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\r\n\tconst discount = GetSalePercentageSummary() ?? 0;\r\n\tconst sku = item.getDocumentValue('product_sku');\r\n\tconst search = searchResults?.Keyword !== '' ? '?keyword=' + searchResults?.Keyword : '';\r\n\t// #endregion\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t{/* #region HCL */}\r\n\t\t\t{discount > 0 ? (\r\n\t\t\t\t
    \r\n\t\t\t\t\t{Localizer('Sale')}\r\n\t\t\t\t\t{discount}%\r\n\t\t\t\t
    \r\n\t\t\t) : null}\r\n\r\n\t\t\t{isNewProduct() ? (\r\n\t\t\t\t
    \r\n\t\t\t\t\t{Localizer('New')}\r\n\t\t\t\t
    \r\n\t\t\t) : null}\r\n\t\t\t{/* #endregion */}\r\n\r\n\t\t\t\r\n\r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t{url ? (\r\n\t\t\t\t\t\t dispatchProductClickEvent()}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{itemName}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t{itemName}\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t{/* #region HCL */}\r\n\t\t\t\t\t{sku && !hasChildSkus() ? (\r\n\t\t\t\t\t\t

    \r\n\t\t\t\t\t\t\t{Localizer('ItemNo') + ': '}\r\n\t\t\t\t\t\t\t{sku}\r\n\t\t\t\t\t\t

    \r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\t{/* #endregion */}\r\n\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t{/* #region HCL */}\r\n\t\t\t\t\t\r\n\t\t\t\t\t{/* #endregion */}\r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t{/* #region HCL */}\r\n\t\t\t\t\t\t{!item.getDocumentValue('product_groupdisplayprice') ? (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t{/* #endregion */}\r\n\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n}\r\n\r\n// #region HCL - added productPricingAndAvailability & isLoadingPricing\r\nfunction ProductPriceRenderer({ item, testId, productPricingAndAvailability, isLoadingPricing }: ResultItemProps) {\r\n\tconst displayPriceStringified =\r\n\t\tproductPricingAndAvailability?.price ||\r\n\t\titem.getDocumentValue('product_groupdisplayprice') ||\r\n\t\titem.getDocumentValue('product_displayprice');\r\n\t// endregion\r\n\tconst displayPrice = displayPriceStringified ? (JSON.parse(displayPriceStringified) as DisplayPrice) : undefined;\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t{/* #region HCL */}\r\n\t\t\t{isLoadingPricing ? (\r\n\t\t\t\t\r\n\t\t\t) : (\r\n\t\t\t\t// #endregion\r\n\t\t\t\t\r\n\t\t\t\t// #region HCL\r\n\t\t\t)}\r\n\t\t\t{/* #endregion */}\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default ProductResultItem;\r\n","import React from 'react';\r\nimport DefaultResultItem from './DefaultResultItem';\r\nimport { ResultItemProps } from 'components/ui/Results/ResultItem';\r\n// #region Commerce\r\nimport ProductResultItem from './commerce/ProductResultItem';\r\n// #endregion\r\n\r\nfunction RocHawkResultItemHCL({ item, testId, productPricingAndAvailability, isLoadingPricing }: ResultItemProps) {\r\n\tconst itemType = item.getDocumentValue('roctype');\r\n\r\n\tswitch (itemType) {\r\n\t\t// #region Commerce\r\n\t\tcase 'Product':\r\n\t\t\treturn (\r\n\t\t\t\t\r\n\t\t\t);\r\n\t\t// #endregion\r\n\t\tdefault:\r\n\t\t\treturn ;\r\n\t}\r\n}\r\n\r\nexport default RocHawkResultItemHCL;\r\n","import React, { useContext } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport scroller from 'react-scroll/modules/mixins/scroller';\r\nimport FacetList from 'shared/components/hawksearch/components/ui/Facets/FacetList';\r\nimport { ResultsProps } from 'shared/components/hawksearch/components/ui/Results/Results';\r\nimport VisuallyHiddenAnnouncementContext from 'shared/components/VisuallyHiddenAnnouncementContext';\r\n// #region HCL\r\nimport ResultsHCL from '../../shared/components/hawksearch/components/ui/Results/Results.HCL';\r\nimport RocResultItemHCL from './components/RocResultItem.HCL';\r\n// #region\r\n\r\nexport type ScrollToResults = {\r\n\tscrollToResults: (controlChanged: string) => void;\r\n};\r\n\r\n/**\r\n * Interstitial component for enabling the visually hidden announcement.\r\n *\r\n * @export\r\n * @returns\r\n */\r\n// #region HCL - added option to change resultItem\r\nexport default function FacetsAndResults({ resultItem = RocResultItemHCL }: ResultsProps) {\r\n\t// #endregion\r\n\tconst { t } = useTranslation();\r\n\tconst { setAlert } = useContext(VisuallyHiddenAnnouncementContext);\r\n\r\n\tfunction scrollToResults(controlChanged: string) {\r\n\t\tscroller.scrollTo('hawk-facet-rail__scroll-to-facets', {\r\n\t\t\tduration: 400,\r\n\t\t\tsmooth: true,\r\n\t\t});\r\n\r\n\t\tconst focusEl = document.getElementById('hawk-sort-by');\r\n\r\n\t\tfocusEl?.focus();\r\n\r\n\t\tsetTimeout(() => {\r\n\t\t\tsetAlert(t(`Updated results based on changing ${controlChanged}. Scrolled to the top of results.`));\r\n\t\t}, 500);\r\n\t}\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n","import { createBrowserHistory } from 'history';\r\n\r\nexport const history = createBrowserHistory();\r\n","import { useEffect } from 'react';\r\n\r\nimport { useHawkSearch } from './StoreProvider';\r\nimport { useHawkConfig } from 'components/ConfigProvider';\r\nimport { history } from 'util/History';\r\nimport { parseSearchQueryString, getSearchQueryString } from 'util/QueryString';\r\n\r\nlet doSearch = true;\r\n\r\nfunction QueryStringListener() {\r\n\tconst { store, actor } = useHawkSearch();\r\n\tconst { config } = useHawkConfig();\r\n\r\n\tuseEffect(() => {\r\n\t\t// listen to history so that when we navigate backward/forward, trigger a new search based off\r\n\t\t// the new query string\r\n\t\tconst unlisten = history.listen((location) => {\r\n\t\t\tif (!doSearch) {\r\n\t\t\t\t// if the previous history change specified that we shouldn't do a search, clear the flag and bail\r\n\t\t\t\tdoSearch = true;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst searchRequest = parseSearchQueryString(location.search, config.searchPageUrl);\r\n\r\n\t\t\tactor.setSearch(\r\n\t\t\t\tsearchRequest,\r\n\t\t\t\t// explicitly flag this next search as not needing to push additional history, since this search\r\n\t\t\t\t// _is_ the result of history.\r\n\t\t\t\t/*doHistory*/ false,\r\n\t\t\t);\r\n\t\t});\r\n\r\n\t\treturn () => {\r\n\t\t\tunlisten();\r\n\t\t};\r\n\t});\r\n\r\n\tuseEffect(() => {\r\n\t\t// listen to changes in the pending search so that history records can be pushed to the browser's\r\n\t\t// query string\r\n\r\n\t\tif (store.doHistory) {\r\n\t\t\t// if we're pushing history, we don't want to to trigger a search as a result of this history\r\n\t\t\t// change\r\n\t\t\tdoSearch = false;\r\n\r\n\t\t\thistory.push({\r\n\t\t\t\tsearch: getSearchQueryString(store.pendingSearch),\r\n\t\t\t});\r\n\t\t}\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [store.pendingSearch]);\r\n\r\n\treturn null;\r\n}\r\n\r\nexport default QueryStringListener;\r\n","var api = require(\"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/postcss-loader/src/index.js!../../../../../node_modules/sass-loader/dist/cjs.js!./app.scss\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","var api = require(\"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!./styles.css\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","// Imports\nvar ___CSS_LOADER_API_IMPORT___ = require(\"../../../../../node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.id, \":root {\\n --reach-tooltip: 1;\\n}\\n\\n[data-reach-tooltip] {\\n z-index: 1;\\n pointer-events: none;\\n position: absolute;\\n padding: 0.25em 0.5em;\\n box-shadow: 2px 2px 10px hsla(0, 0%, 0%, 0.1);\\n white-space: nowrap;\\n font-size: 85%;\\n background: #f0f0f0;\\n color: #444;\\n border: solid 1px #ccc;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n","import React, { useState } from 'react';\r\nimport VisuallyHiddenAnnouncementContext, { RefElementType } from './VisuallyHiddenAnnouncementContext';\r\n\r\ninterface VisuallyHiddenAnnouncementProps {\r\n\tchildren: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Displays a page change alert for screen readers\r\n *\r\n * @param {*} props\r\n * @returns\r\n */\r\nfunction VisuallyHiddenAnnouncement(props: VisuallyHiddenAnnouncementProps) {\r\n\tconst [alert, setAlert] = useState('');\r\n\tconst [mainRef, setMainRef] = useState(null);\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t{props.children}\r\n\t\t\t
    \r\n\t\t\t\t{alert}\r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default VisuallyHiddenAnnouncement;\r\n","import React from 'react';\r\nimport classnames from 'classnames';\r\nimport { Localizer } from 'services/Localizer';\r\nimport { AxiosError } from 'axios';\r\nimport XSVG from 'shared/components/svg/XSVG';\r\n\r\ntype Theme = 'danger' | 'warning' | 'info' | 'success';\r\n\r\nexport interface ErrorAlertProps {\r\n\t/**\r\n\t * The title of the error message such as \"Uh Oh!\" or \"An Unexpected Error has Occurred!\"\r\n\t */\r\n\ttitle: string;\r\n\r\n\t/**\r\n\t * The error message to display if an error object doesn't have a more appropriate message.\r\n\t */\r\n\tmessage: React.ReactNode | string;\r\n\r\n\tchildren?: any;\r\n\r\n\ttheme?: Theme;\r\n\r\n\tisTitleOnOwnRow?: boolean;\r\n\r\n\t/** The error responsible for this message. */\r\n\terror: AxiosError | Error | null;\r\n\r\n\t/**\r\n\t * Method from parent that handles collapse state.\r\n\t */\r\n\tonCollapse?: (collased: boolean) => void;\r\n\r\n\t/**\r\n\t * Controlled collapse state from parent.\r\n\t */\r\n\tisCollapsed?: boolean;\r\n}\r\n\r\n/**\r\n * Reusable Error Alert Component.\r\n */\r\nexport default function InlineAlert(props: ErrorAlertProps) {\r\n\tconst {\r\n\t\ttitle = InlineAlert.defaultProps.title,\r\n\t\tchildren,\r\n\t\ttheme = 'danger',\r\n\t\tisTitleOnOwnRow = false,\r\n\t\terror = InlineAlert.defaultProps.error,\r\n\t\tisCollapsed = false,\r\n\t\tonCollapse,\r\n\t} = props;\r\n\r\n\tlet { message = InlineAlert.defaultProps.message } = props;\r\n\r\n\tconst axiosError = error as AxiosError | null;\r\n\tif (axiosError?.isAxiosError && axiosError != null && axiosError.response == null && axiosError.request != null) {\r\n\t\tmessage = Localizer('ErrorMessageNetwork');\r\n\t}\r\n\r\n\tif (axiosError?.isAxiosError && (axiosError?.response?.status === 401 || axiosError?.response?.status === 403)) {\r\n\t\tmessage = Localizer('ErrorMessageForbidden');\r\n\t}\r\n\r\n\tif (axiosError?.response?.data?.message) {\r\n\t\tmessage = axiosError.response.data.message;\r\n\t}\r\n\r\n\tif (isCollapsed) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t{onCollapse ? (\r\n\t\t\t\t\r\n\t\t\t) : null}\r\n\r\n\t\t\t{title ? (\r\n\t\t\t\t\r\n\t\t\t\t\t{title}\r\n\t\t\t\t\r\n\t\t\t) : null}\r\n\r\n\t\t\t{message ? {message} : null}\r\n\r\n\t\t\t{children ? <> {children} : null}\r\n\t\t
    \r\n\t);\r\n}\r\n\r\n/**\r\n * Error Alert Default Props\r\n */\r\nInlineAlert.defaultProps = {\r\n\ttitle: Localizer('ErrorMessageGenericTitle'),\r\n\tmessage: Localizer('UnexpectedErrorOccurred'),\r\n\terror: null,\r\n};\r\n","import { useEffect } from 'react';\r\nimport 'shared/polyfills/customEvent';\r\nimport { RocEventType, ExtractEventParameters, RocEvent } from 'shared/events';\r\nimport addRocEventHandler from 'shared/util/events/rocEventUtils';\r\n\r\n/**\r\n * Helper function for dispatching ROC events.\r\n *\r\n * @param eventType The event type for the dispatcher\r\n */\r\nexport function dispatchRocEvent(eventType: T, data: ExtractEventParameters) {\r\n\tconst event = new CustomEvent(eventType, {\r\n\t\tdetail: data,\r\n\t});\r\n\tdocument.dispatchEvent(event);\r\n}\r\n\r\n/**\r\n * Reusable hook for handling ROC events\r\n *\r\n * @param eventType The type of event to handle\r\n * @param eventHandler The event handler\r\n * @param deps List of dependencies\r\n */\r\nexport default function useRocEventHandler(\r\n\teventType: T,\r\n\teventHandler: (data: ExtractEventParameters) => void,\r\n\tdeps?: any[],\r\n) {\r\n\tuseEffect(() => {\r\n\t\tconst removeHandlerCallback = addRocEventHandler(eventType, eventHandler);\r\n\r\n\t\treturn () => {\r\n\t\t\tremoveHandlerCallback();\r\n\t\t};\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, deps);\r\n}\r\n","import React, { useContext } from 'react';\r\n\r\nimport { SearchStore } from 'store/Store';\r\nimport { useHawkState, SearchActor } from 'store/HawkState';\r\nimport { Request } from 'models/Search';\r\n\r\nconst HawkContext = React.createContext({} as HawkContextValue);\r\n\r\nexport interface HawkContextValue {\r\n\t/** The store of data used throughout the application. */\r\n\tstore: SearchStore;\r\n\r\n\t/**\r\n\t * An interface that allows actions to be performed on the store (such as executing searches,\r\n\t * changing pages, etc).\r\n\t */\r\n\tactor: SearchActor;\r\n}\r\n\r\nexport interface HawkStoreProviderProps {\r\n\t/** The initial search to perform when initializing the search components. */\r\n\tinitialSearch?: Partial;\r\n\tchildren: React.ReactNode;\r\n}\r\n\r\n/**\r\n * This component acts as the global store for the hawksearch application state. Only one instance of this component\r\n * should exist, and it should be the root level component.\r\n */\r\nfunction StoreProvider({ initialSearch, children }: HawkStoreProviderProps) {\r\n\tconst [store, actor] = useHawkState(initialSearch);\r\n\r\n\treturn {children};\r\n}\r\n\r\n/**\r\n * Retrieves the global hawk store for use within a component.\r\n */\r\nexport function useHawkSearch() {\r\n\treturn useContext(HawkContext);\r\n}\r\n\r\nexport default StoreProvider;\r\n","import React from 'react';\r\nimport { SVGProps } from './SVGProps';\r\nimport classnames from 'classnames';\r\n\r\n/**\r\n * X SVG\r\n *\r\n * @returns\r\n */\r\nfunction XSVG({ className, ...rest }: SVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default XSVG;\r\n","import AxiosHelper from 'services/AxiosHelper';\r\nimport { AxiosResponse } from 'axios';\r\n\r\nexport interface UserSummary {\r\n\tisSignedIn: boolean;\r\n\tuserName: string | null;\r\n\tfirstName: string | null;\r\n\tlastName: string | null;\r\n\temail: string | null;\r\n\tphoneNumber: string | null;\r\n\ttwoFactorEnabled: boolean;\r\n\thasRecoveryCodes: boolean;\r\n\tisMachineRemembered: boolean;\r\n\tannouncements: UserAnnouncement[];\r\n\tisExternalLoginUser: boolean;\r\n\t// #region HCL\r\n\tversaPayEnabled: boolean;\r\n\tversaPayRedirectUrl: string | null;\r\n\tazureUserId: string | null;\r\n\t// #endregion\r\n}\r\n\r\n/** Represents the details about an admin impersonation session of the logged in user. */\r\nexport interface Impersonation {\r\n\t/** The id of the admin impersonating the front end user. */\r\n\timpersonatorId: string;\r\n\r\n\t/** The name of the admin impersonating the front end user. */\r\n\timpersonatorName: string;\r\n\r\n\t/** The id of the active user impersonation session. */\r\n\tsessionId: string;\r\n}\r\n\r\nexport interface UserData {\r\n\t/**\r\n\t * Summary of user-specific details\r\n\t */\r\n\tsummary?: UserSummary;\r\n\r\n\t/**\r\n\t * CSRF validation token generated by the server\r\n\t */\r\n\trequestToken?: string;\r\n\r\n\t/**\r\n\t * The information on an impersonation session if one is active.\r\n\t * If an impersonation session isn't active this field will be undefined.\r\n\t */\r\n\timpersonation?: Impersonation;\r\n}\r\n\r\nexport interface UserAnnouncement {\r\n\t/** The id used as the primary key for the announcement in the database */\r\n\tid: string;\r\n\r\n\t/** An announcement to be displayed to the user */\r\n\tmessage: string;\r\n\r\n\t/** A list of pages where the announcement will be displayed. This will be an empty array if it is to be displayed on all pages. */\r\n\tpages: string[];\r\n}\r\n\r\nlet userDataPromise: Promise> | null = null;\r\n\r\n/**\r\n * Returns details related to the current user. By default, this is primarily their first/last name\r\n * and whether they are logged in or not. This can customized to include more details if necessary.\r\n */\r\nexport const getUserData = () => {\r\n\tif (userDataPromise === null) {\r\n\t\tuserDataPromise = AxiosHelper.get('/ajax/user');\r\n\t}\r\n\r\n\treturn userDataPromise;\r\n};\r\n\r\n/**\r\n * Returns non-cached details related to the current user. By default, this is primarily their first/last name\r\n * and whether they are logged in or not. This can customized to include more details if necessary.\r\n */\r\nexport const getUserDataNoCache = () => {\r\n\treturn AxiosHelper.get('/ajax/user');\r\n};\r\n\r\n/**\r\n * Returns a promise that will contain the CSRF token generated on the server to be used to validate\r\n * forms being posted via AJAX.\r\n */\r\nexport async function getCsrfToken() {\r\n\ttry {\r\n\t\tconst userData = await getUserData();\r\n\t\treturn userData.data.requestToken;\r\n\t} catch (error) {\r\n\t\tconsole.warn('Unable to load CSRF token.');\r\n\t\treturn '';\r\n\t}\r\n}\r\n\r\n// #region Commerce\r\nimport { CartSummary } from './UserData.Commerce';\r\nimport { LocationDto } from 'features/commerce/store-locator/types';\r\nimport { OrganizationInvite, OrganizationShipTo } from 'shared-client/types/commerce/organization';\r\nimport { AutoSuggestOption } from '../../../Roc.SharedClientApp/types/fields';\r\n\r\n// Commerce extensions to the UserData interface\r\nexport interface UserData {\r\n\t// #region HCL - allows null\r\n\tcartSummary?: CartSummary | null;\r\n\t// #endregion\r\n\r\n\t/***\r\n\t * The customer's default store location or null if not set\r\n\t */\r\n\tdefaultStoreLocation?: LocationDto | null;\r\n\r\n\t/**\r\n\t * If store is enabled for this site\r\n\t */\r\n\tenableStoreLocation?: boolean;\r\n}\r\n\r\n/***\r\n * Organization data and permissions\r\n */\r\nexport interface Organization {\r\n\tid: string;\r\n\tpurchaseOrderNumberRequired: boolean;\r\n\tcreditCardAllowed: boolean;\r\n\tgiftCardAllowed: boolean;\r\n\torganizationName: string;\r\n\tcorpAccountAllowed: boolean;\r\n}\r\n\r\n/***\r\n * Organization dto data\r\n */\r\nexport interface OrganizationDto extends AutoSuggestOption {}\r\n\r\n/***\r\n * User's organization and permissions data\r\n */\r\nexport interface UserSummary {\r\n\t/***\r\n\t * User's current default organization\r\n\t */\r\n\torganization: Organization | null;\r\n\r\n\t/***\r\n\t * The list of organizations the user is part of\r\n\t */\r\n\tuserOrganizations?: OrganizationDto[] | null;\r\n\r\n\t/***\r\n\t * The selected organization ship to\r\n\t */\r\n\tselectedShipTo: OrganizationShipTo | null;\r\n\r\n\t/***\r\n\t * Defines if the user has multiple shiptos to select from\r\n\t */\r\n\thasMultipleShipTos: boolean | null;\r\n\r\n\t/***\r\n\t * Defines if the user has saved payment methods\r\n\t */\r\n\thasSavedPaymentMethods: boolean | null;\r\n\r\n\t/***\r\n\t * The list of user permissions\r\n\t */\r\n\tpermissions?: UserPermissions;\r\n\r\n\t/***\r\n\t * The list of organizations the user is invited to join\r\n\t */\r\n\torganizationInvites?: OrganizationInvite[];\r\n\r\n\t/***\r\n\t * The user organization removal notification\r\n\t * Used to notify the user if he is no more part of his default organization\r\n\t */\r\n\tuserOrganizationRemovalNotification?: string;\r\n}\r\n\r\n/***\r\n * User's permissions\r\n */\r\nexport interface UserPermissions {\r\n\t/***\r\n\t * Defines if the current user can see organization users\r\n\t */\r\n\tcanSeeOrganizationUsers?: boolean;\r\n\r\n\t/***\r\n\t * Defines if the current user can assign roles to organization users\r\n\t */\r\n\tcanAssignRolesToOrganizationUsers?: boolean;\r\n\r\n\t/***\r\n\t * Defines if the current user can remove users from an organization\r\n\t */\r\n\tremoveUserFromOrganization?: boolean;\r\n\r\n\t/***\r\n\t * Defines if the current user can create organization users\r\n\t */\r\n\tcreateOrganizationUser?: boolean;\r\n\r\n\t/***\r\n\t * Defines if the current user can enable/disable ShipTos for organization users\r\n\t */\r\n\tmanageShipTosAssociation?: boolean;\r\n\r\n\t/***\r\n\t * Defines if the current user can see status of the organization users\r\n\t */\r\n\tcanSeePendingOrganizationUsers?: boolean;\r\n}\r\n// #endregion\r\n","import React from 'react';\r\nimport InlineAlert from 'shared/edit/InlineAlert';\r\n\r\n// eslint-disable-next-line\r\n// tslint:disable-next-line\r\nexport interface ErrorBoundaryRenderProps extends ErrorBoundaryState {}\r\n\r\nexport interface ErrorBoundaryProps {\r\n\tchildren: React.ReactNode;\r\n\trenderError?: (renderProps: ErrorBoundaryRenderProps) => React.ReactNode;\r\n}\r\n\r\nexport interface ErrorBoundaryState {\r\n\terror?: Error;\r\n}\r\n\r\n/**\r\n * Default Error Boundary component for frontend components, so that in case a JS error occurs, we show\r\n * something instead of nothing.\r\n */\r\nexport default class ErrorBoundary extends React.Component {\r\n\tpublic static defaultProps = {\r\n\t\trenderError: (renderProps: ErrorBoundaryRenderProps) => ,\r\n\t};\r\n\r\n\tpublic state: ErrorBoundaryState = {};\r\n\r\n\tpublic componentDidCatch(error: Error) {\r\n\t\tif (error.name === 'ChunkLoadError') {\r\n\t\t\tconst lastRefreshedTimestamp = new Date(\r\n\t\t\t\tparseInt(window.localStorage.getItem('force-refresh-timestamp') || '0'),\r\n\t\t\t);\r\n\t\t\tconst pageAlreadyRefreshedLessThan30SecondsAgo =\r\n\t\t\t\tnew Date(lastRefreshedTimestamp.getTime() + 30 * 1000) > new Date();\r\n\r\n\t\t\tif (!pageAlreadyRefreshedLessThan30SecondsAgo) {\r\n\t\t\t\t// Assuming that the user is not on the latest version of the application. Refresh the page immediately.\r\n\t\t\t\twindow.localStorage.setItem('force-refresh-timestamp', new Date().getTime().toString());\r\n\t\t\t\treturn window.location.reload();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.setState({\r\n\t\t\terror,\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tif (this.state.error) {\r\n\t\t\treturn this.props.renderError!(this.state);\r\n\t\t}\r\n\r\n\t\treturn this.props.children;\r\n\t}\r\n}\r\n","import { ServerData } from 'services/ServerData';\r\n\r\nexport default {\r\n\tBaseUrl: ServerData.ACCOUNT_URL_BASE ?? '/my-account',\r\n\tLogin: ServerData.ACCOUNT_LOGIN_URL ?? '/my-account/login',\r\n\tLogin2fa: ServerData.ACCOUNT_LOGIN_WITH_2FA_URL ?? '/my-account/login-with-2fa',\r\n\tRegister: ServerData.ACCOUNT_REGISTER_URL ?? '/my-account/register',\r\n\tForgotPassword: ServerData.ACCOUNT_FORGOT_PASSWORD_URL ?? '/my-account/forgot-password',\r\n\tLoginWithRecoveryCode: ServerData.ACCOUNT_LOGIN_WITH_RECOVERY_CODE_URL ?? '/my-account/login-with-recovery-code',\r\n\tLogout: ServerData.ACCOUNT_LOGOUT_URL ?? '/my-account/logout',\r\n\t// #region Commerce\r\n\tOrganizationReview: ServerData.ACCOUNT_ORGANIZATION_REVIEW_URL ?? '/my-account/organization-review',\r\n\tOrganizationSelector: ServerData.ACCOUNT_ORGANIZATION_SELECTOR_URL ?? '/my-account/organization-selector',\r\n\t// #endregion\r\n\t// #region HCL - hardcoded same way as external login is\r\n\tExternalLogout: '/my-account/external-logout',\r\n\t// #endregion\r\n};\r\n","import { AxiosError } from 'axios';\r\nimport RocHawkConfig from 'features/search/RocHawkConfig';\r\nimport AxiosHelper from 'services/AxiosHelper';\r\nimport { getCookie, setCookie } from 'shared/components/hawksearch/helpers/Cookies';\r\nimport { ExtractEventParameters } from 'shared/events';\r\n//#region Commerce\r\nimport { CommercePageType, CommerceSuggestType, trackCommerce } from '../commerce/hawksearch/tracking-commerce';\r\n//#endregion\r\n\r\nexport interface HawkSearch {\r\n\tClientGuid: string;\r\n\tContext: ContextDictionary;\r\n\tCustomContext: ContextDictionary;\r\n\tTrackingUrl: string | null;\r\n\tinitCustomEvents?: () => void;\r\n}\r\n\r\ndeclare global {\r\n\tinterface Window {\r\n\t\tHawkSearch: HawkSearch;\r\n\t}\r\n}\r\n\r\nexport enum EventTrackingType {\r\n\tpageLoad = 1,\r\n\tsearch = 2,\r\n\tclick = 3,\r\n\tbannerClick = 7,\r\n\tbannerImpression = 8,\r\n\trecommendationClick = 10,\r\n\tautoCompleteClick = 11,\r\n}\r\n\r\n/**\r\n * The page type\r\n */\r\nexport enum PageType {\r\n\t/**\r\n\t * Landing Page\r\n\t */\r\n\tlanding = 2,\r\n\t/**\r\n\t * All other Page Types\r\n\t */\r\n\tcustom = 5,\r\n}\r\n\r\nexport enum SuggestType {\r\n\tPopularSearches = 1,\r\n\tTopContentMatches = 4,\r\n}\r\n\r\nexport enum SearchType {\r\n\tInitial = 1,\r\n\tRefinement = 2,\r\n}\r\n\r\ntype HawkEvents =\r\n\t| ({ name: 'pageload' } & TrackPageLoadArgs)\r\n\t| ({ name: 'searchtracking' } & TrackSearchTrackingArgs)\r\n\t| ({ name: 'click' } & TrackClickArgs)\r\n\t| ({ name: 'bannerclick' } & TrackBannerClickArgs)\r\n\t| ({ name: 'bannerimpression' } & TrackBannerImpressionArgs)\r\n\t| ({ name: 'autocompleteclick' } & TrackAutoCompleteClickArgs)\r\n\t| ({ name: 'recommendationclick' } & TrackRecommendationClickArgs);\r\n\r\nexport type HawkEventType = HawkEvents['name'];\r\n\r\nfunction track(eventName: T, args: ExtractEventParameters) {\r\n\tswitch (eventName.toLocaleLowerCase()) {\r\n\t\tcase 'pageload':\r\n\t\t\t//HawkSearch.Context.add(\"uniqueid\", \"123456789\");\r\n\t\t\t//HawkSearch.Tracking.track('pageload',{pageType: \"item\"});\r\n\t\t\treturn trackPageLoad((args as unknown) as TrackPageLoadArgs);\r\n\t\tcase 'searchtracking':\r\n\t\t\t//HawkSearch.Tracking.track(\"searchtracking\", {trackingId:\"a9bd6e50-e434-45b9-9f66-489eca07ad0a\", typeId: HawkSearch.Tracking.SearchType.Initial});\r\n\t\t\t//HawkSearch.Tracking.track(\"searchtracking\", {trackingId:\"a9bd6e50-e434-45b9-9f66-489eca07ad0a\", typeId: HawkSearch.Tracking.SearchType.Refinement});\r\n\t\t\treturn trackSearchTracking((args as unknown) as TrackSearchTrackingArgs);\r\n\t\tcase 'click':\r\n\t\t\t//HawkSearch.Tracking.track('click',{event: e, uniqueId: \"33333\", trackingId: \"75a0801a-a93c-4bcb-81f1-f4b011f616e3\"});\r\n\t\t\treturn trackClick((args as unknown) as TrackClickArgs);\r\n\t\tcase 'bannerclick':\r\n\t\t\t//HawkSearch.Tracking.track('bannerclick',{bannerId: 1, campaignId: 2, trackingId:\"2d652a1e-2e05-4414-9d76-51979109f724\"});\r\n\t\t\treturn trackBannerClick((args as unknown) as TrackBannerClickArgs);\r\n\t\tcase 'bannerimpression':\r\n\t\t\t//HawkSearch.Tracking.track('bannerimpression',{bannerId: \"2\", campaignId: \"2\", trackingId:\"2d652a1e-2e05-4414-9d76-51979109f724\"});\r\n\t\t\treturn trackBannerImpression((args as unknown) as TrackBannerImpressionArgs);\r\n\t\tcase 'autocompleteclick':\r\n\t\t\t//HawkSearch.Tracking.track('autocompleteclick',{keyword: \"test\", suggestType: HawkSearch.Tracking.SuggestType.PopularSearches, name:\"tester\", url:\"/test\"});\r\n\t\t\treturn trackAutoCompleteClick((args as unknown) as TrackAutoCompleteClickArgs);\r\n\t\tcase 'recommendationclick':\r\n\t\t\t//HawkSearch.Tracking.track('recommendationclick',{uniqueId: \"223222\", itemIndex: \"222\", widgetGuid:\"2d652a1e-2e05-4414-9d76-51979109f724\", requestId:\"2d652a1e-2e05-4414-9d76-51979109f724\"});\r\n\t\t\treturn trackRecommendationClick((args as unknown) as TrackRecommendationClickArgs);\r\n\t}\r\n}\r\n\r\nfunction getVisitorExpiry() {\r\n\tconst d = new Date();\r\n\t// 1 year\r\n\td.setTime(d.getTime() + 360 * 24 * 60 * 60 * 1000);\r\n\treturn d.toUTCString();\r\n}\r\n\r\nfunction getVisitExpiry() {\r\n\tconst d = new Date();\r\n\t// 4 hours\r\n\td.setTime(d.getTime() + 4 * 60 * 60 * 1000);\r\n\treturn d.toUTCString();\r\n}\r\n\r\nfunction createGuid() {\r\n\tconst s: string[] = [];\r\n\tconst hexDigits = '0123456789abcdef';\r\n\tfor (let i = 0; i < 36; i++) {\r\n\t\ts[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);\r\n\t}\r\n\ts[14] = '4'; // bits 12-15 of the time_hi_and_version field to 0010\r\n\ts[19] = hexDigits.substr(((s[19] as any) & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01\r\n\ts[8] = s[13] = s[18] = s[23] = '-';\r\n\r\n\treturn s.join('');\r\n}\r\n\r\ntype TrackPageLoadArgs = {\r\n\t/**\r\n\t * The page type\r\n\t */\r\n\tpageType:\r\n\t\t| PageType\r\n\t\t// #region Commerce\r\n\t\t| CommercePageType;\r\n\t// #endregion\r\n\r\n\t/**\r\n\t * Unique identifier of item that was clicked\r\n\t */\r\n\tuniqueId?: string;\r\n};\r\n\r\nfunction trackPageLoad({ pageType, uniqueId }: TrackPageLoadArgs) {\r\n\tconst { clientHeight, clientWidth } = document.documentElement;\r\n\r\n\tconst payload = {\r\n\t\tEventType: EventTrackingType.pageLoad,\r\n\t\tEventData: preparePayload({\r\n\t\t\tPageTypeId: pageType,\r\n\t\t\tRequestPath: window.location.pathname,\r\n\t\t\tQs: window.location.search,\r\n\t\t\tViewportHeight: clientHeight,\r\n\t\t\tViewportWidth: clientWidth,\r\n\t\t\tUniqueId: uniqueId,\r\n\t\t}),\r\n\t};\r\n\r\n\tmakeRequest(payload);\r\n}\r\n\r\ntype TrackSearchTrackingArgs = {\r\n\t/**\r\n\t * The ‘TrackingId’ object that is passed in this function is returned in the Hawksearch response\r\n\t */\r\n\ttrackingId: string;\r\n\t/**\r\n\t * The type of search that is performed\r\n\t */\r\n\ttypeId: SearchType;\r\n};\r\n\r\nfunction trackSearchTracking({ trackingId, typeId }: TrackSearchTrackingArgs) {\r\n\tif (typeId == SearchType.Initial) {\r\n\t\tsetCookie('hawk_query_id', createGuid());\r\n\t}\r\n\r\n\tconst queryId = getCookie('hawk_query_id');\r\n\tconst { clientHeight, clientWidth } = document.documentElement;\r\n\tconst payload = {\r\n\t\tEventType: EventTrackingType.search,\r\n\t\tEventData: preparePayload({\r\n\t\t\tQueryId: queryId,\r\n\t\t\tTrackingId: trackingId,\r\n\t\t\tTypeId: typeId,\r\n\t\t\tViewportHeight: clientHeight,\r\n\t\t\tViewportWidth: clientWidth,\r\n\t\t}),\r\n\t};\r\n\r\n\tmakeRequest(payload);\r\n}\r\n\r\ntype TrackClickArgs = {\r\n\t/**\r\n\t * Unique identifier of item that was clicked\r\n\t */\r\n\tuniqueId: string;\r\n\t/**\r\n\t * This is the TrackingId that was passed back in the search response\r\n\t */\r\n\ttrackingId: string;\r\n\t/**\r\n\t * Target URL that clicked element points to\r\n\t */\r\n\turl: string;\r\n};\r\n\r\nfunction trackClick({ uniqueId, trackingId, url }: TrackClickArgs) {\r\n\tconst { clientHeight, clientWidth } = document.documentElement;\r\n\r\n\tconst payload = {\r\n\t\tEventType: EventTrackingType.click,\r\n\t\tEventData: preparePayload({\r\n\t\t\tUrl: url,\r\n\t\t\tQs: window.location.search,\r\n\t\t\tRequestPath: window.location.pathname,\r\n\t\t\tTrackingId: trackingId,\r\n\t\t\tUniqueId: uniqueId,\r\n\t\t\tViewportHeight: clientHeight,\r\n\t\t\tViewportWidth: clientWidth,\r\n\t\t}),\r\n\t};\r\n\r\n\tmakeRequest(payload);\r\n}\r\n\r\ntype TrackBannerClickArgs = {\r\n\t/**\r\n\t * The identifier of corresponding banner\r\n\t */\r\n\tbannerId: string;\r\n\t/**\r\n\t * The identifier of corresponding campaign (optional)\r\n\t */\r\n\tcampaignId: string;\r\n\t/**\r\n\t * The ‘TrackingId’ object that is passed in this function is returned in the Hawksearch response\r\n\t */\r\n\ttrackingId: string;\r\n};\r\n\r\nfunction trackBannerClick({ bannerId, trackingId, campaignId }: TrackBannerClickArgs) {\r\n\tconst payload = {\r\n\t\tEventType: EventTrackingType.bannerClick,\r\n\t\tEventData: preparePayload({\r\n\t\t\tCampaignId: campaignId,\r\n\t\t\tBannerId: bannerId,\r\n\t\t\tTrackingId: trackingId,\r\n\t\t}),\r\n\t};\r\n\r\n\tmakeRequest(payload);\r\n}\r\n\r\ntype TrackBannerImpressionArgs = TrackBannerClickArgs;\r\n\r\nfunction trackBannerImpression({ bannerId, campaignId, trackingId }: TrackBannerImpressionArgs) {\r\n\tconst payload = {\r\n\t\tEventType: EventTrackingType.bannerImpression,\r\n\t\tEventData: preparePayload({\r\n\t\t\tCampaignId: campaignId,\r\n\t\t\tBannerId: bannerId,\r\n\t\t\tTrackingId: trackingId,\r\n\t\t}),\r\n\t};\r\n\tmakeRequest(payload);\r\n}\r\n\r\ntype TrackAutoCompleteClickArgs = {\r\n\t/**\r\n\t * Selected keyword used as a autocomplete query\r\n\t */\r\n\tkeyword: string;\r\n\t/**\r\n\t * The type of autocomplete results type\r\n\t */\r\n\tsuggestType?: SuggestType | CommerceSuggestType;\r\n\t/**\r\n\t * Text value associated with the autocomplete item clicked\r\n\t */\r\n\titemName: string;\r\n\t/**\r\n\t * The target URL of clicked autocomplete item\r\n\t */\r\n\turl: string;\r\n};\r\n\r\nfunction trackAutoCompleteClick({ keyword, suggestType, itemName, url }: TrackAutoCompleteClickArgs) {\r\n\tconst payload = {\r\n\t\tEventType: EventTrackingType.autoCompleteClick,\r\n\t\tEventData: preparePayload({\r\n\t\t\tKeyword: keyword,\r\n\t\t\tName: itemName,\r\n\t\t\tSuggestType: suggestType,\r\n\t\t\tUrl: url,\r\n\t\t}),\r\n\t};\r\n\r\n\tmakeRequest(payload);\r\n}\r\n\r\ntype TrackRecommendationClickArgs = {\r\n\t/**\r\n\t * The unique identifier of the recommendation widget that displayed clicked item. This should correspond to the widget GUID generated for each widget individually in Hawksearch dashboard\r\n\t */\r\n\twidgetGuid: string;\r\n\t/**\r\n\t * Represents the unique identifier of a product. This should correspond to the value of the field set up as the primary key in the fields section of Hawksearch dashboard.\r\n\t */\r\n\tuniqueId: string;\r\n\t/**\r\n\t * The number of the clicked recommendation item on the displayed widget.\r\n\t */\r\n\titemIndex: number;\r\n\t/**\r\n\t * The ‘RequestId’ object that is passed in this function is returned in the recommendation widget response\r\n\t */\r\n\trequestId: string;\r\n};\r\n\r\nfunction trackRecommendationClick({ widgetGuid, uniqueId, itemIndex, requestId }: TrackRecommendationClickArgs) {\r\n\tconst payload = {\r\n\t\tEventType: EventTrackingType.recommendationClick,\r\n\t\tEventData: preparePayload({\r\n\t\t\tItemIndex: itemIndex,\r\n\t\t\tRequestId: requestId,\r\n\t\t\tUniqueId: uniqueId,\r\n\t\t\tWidgetGuid: widgetGuid,\r\n\t\t}),\r\n\t};\r\n\r\n\tmakeRequest(payload);\r\n}\r\n\r\n// #region HCL\r\nfunction safeBtoa(input: string): string {\r\n\t// Encode the string into UTF-8 and then to base64\r\n\tconst utf8Bytes = new TextEncoder().encode(input);\r\n\treturn btoa(String.fromCharCode(...utf8Bytes));\r\n}\r\n// #endregion\r\n\r\nexport function preparePayload(payload: any) {\r\n\t// #region HCL\r\n\treturn safeBtoa(JSON.stringify(payload));\r\n\t// #endregion\r\n}\r\n\r\nexport function makeRequest(data) {\r\n\tif (!HawkSearch.TrackingUrl) {\r\n\t\tconsole.warn(\r\n\t\t\t\"Unable to send tracking event to HawkSearch because site's configuration is missing tracking URL.\",\r\n\t\t);\r\n\t\treturn;\r\n\t}\r\n\r\n\tlet visitId = getCookie('hawk_visit_id');\r\n\tlet visitorId = getCookie('hawk_visitor_id');\r\n\tconst isNewVisitor = !visitId || !visitorId;\r\n\r\n\tif (!visitId) {\r\n\t\tsetCookie('hawk_visit_id', createGuid(), getVisitExpiry());\r\n\t\tvisitId = getCookie('hawk_visit_id');\r\n\t}\r\n\r\n\tif (!visitorId) {\r\n\t\tsetCookie('hawk_visitor_id', createGuid(), getVisitorExpiry());\r\n\t\tvisitorId = getCookie('hawk_visitor_id');\r\n\t}\r\n\r\n\tif (isNewVisitor) {\r\n\t\tAxiosHelper.post('/ajax/hawksearch/identify', {\r\n\t\t\tvisitId: visitId,\r\n\t\t\tvisitorId: visitorId,\r\n\t\t});\r\n\t}\r\n\r\n\tconst payload = Object.assign(\r\n\t\t{\r\n\t\t\tClientGuid: HawkSearch.ClientGuid,\r\n\t\t\tVisitId: visitId,\r\n\t\t\tVisitorId: visitorId,\r\n\t\t\tTrackingProperties: HawkSearch.Context,\r\n\t\t\tCustomDictionary: HawkSearch.CustomContext,\r\n\t\t},\r\n\t\tdata,\r\n\t);\r\n\r\n\t// #region HCL\r\n\tAxiosHelper.post('/ajax/hawksearch/trackevent', { request: payload })\r\n\t\t// #endregion\r\n\t\t.then((response) => {\r\n\t\t\tconsole.log('Success:', response.statusText);\r\n\t\t})\r\n\t\t.catch((error: AxiosError) => {\r\n\t\t\tconsole.error('Error:', error);\r\n\t\t});\r\n}\r\n\r\n// TODO: add comments about what this is for? i think it has to do with timing between hawksearch.js and this script?\r\nfunction init() {\r\n\tif (window.HawkSearch && typeof window.HawkSearch.initCustomEvents === 'function') {\r\n\t\twindow.HawkSearch.initCustomEvents();\r\n\t}\r\n}\r\n\r\nif (document.readyState === 'complete' || document.readyState === 'interactive') {\r\n\tsetTimeout(init);\r\n} else {\r\n\tdocument.addEventListener('DOMContentLoaded', init);\r\n}\r\n\r\nclass ContextDictionary {\r\n\tadd(key: string, value: any) {\r\n\t\tthis[key] = value;\r\n\t}\r\n\r\n\tclear() {\r\n\t\tfor (const key in this) {\r\n\t\t\tthis.remove(key);\r\n\t\t}\r\n\t}\r\n\r\n\tremove(key: string) {\r\n\t\tif (this.hasOwnProperty(key)) {\r\n\t\t\tdelete this[key];\r\n\t\t}\r\n\t}\r\n\r\n\tpush(key: string, value: any) {\r\n\t\tif (this.hasOwnProperty(key)) {\r\n\t\t\tconst existingValue = this[key];\r\n\t\t\tthis[key] = `${existingValue},${value}`;\r\n\t\t} else {\r\n\t\t\tthis.add(key, value);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nconst Context = new ContextDictionary();\r\nconst CustomContext = new ContextDictionary();\r\n\r\n// initialize HawkSearch with values from RocHawkConfig\r\nif (!window.HawkSearch) {\r\n\twindow.HawkSearch = {\r\n\t\tClientGuid: RocHawkConfig.clientGuid,\r\n\t\tTrackingUrl: RocHawkConfig.trackingUrl,\r\n\t\tContext: Context,\r\n\t\tCustomContext: CustomContext,\r\n\t};\r\n}\r\n\r\nconst HawkSearch = window.HawkSearch;\r\n\r\nexport default {\r\n\tTracking: {\r\n\t\ttrack,\r\n\t\t// #region Commerce\r\n\t\ttrackCommerce,\r\n\t\t// #endregion\r\n\t},\r\n\tContext,\r\n\tCustomContext,\r\n};\r\n","import { Address } from 'shared-client/types/address';\r\nimport {\r\n\tHasNoSalePrice,\r\n\tMissingDisplayPrice,\r\n\tPrice,\r\n\tSimpleDisplayPrice,\r\n} from 'shared-client/types/commerce/display-price';\r\nimport { OrderItemAddOn } from 'shared-client/types/commerce/add-ons';\r\nimport { ModelStatus } from 'shared-client/types/model-status';\r\nimport { BasicDto, PaginatedResult } from 'shared/types';\r\nimport { ShippingMethod, ShippingOption } from '../checkout/types/shipping';\r\nimport { ProductAddOnDto, ProductPricingLine, ProductSelection, SimpleSelectionDto } from '../product-details/types';\r\n\r\n/**\r\n * Represents a single line item on an order\r\n *\r\n */\r\nexport interface OrderItem {\r\n\t/**\r\n\t * The primary key (Guid)\r\n\t */\r\n\tid: string;\r\n\r\n\t/**\r\n\t * The order line item name\r\n\t */\r\n\tname: string;\r\n\r\n\t/**\r\n\t * The order line item Sku\r\n\t */\r\n\tsku: string;\r\n\r\n\t/**\r\n\t * The line item's quantity\r\n\t */\r\n\tquantity: number;\r\n\r\n\t/**\r\n\t *\r\n\t * The order line item product URL\r\n\t */\r\n\turl: string;\r\n\r\n\t/**\r\n\t * The order line item product group URL\r\n\t */\r\n\tgroupUrl: string;\r\n\r\n\t/**\r\n\t * The list of selectable attributes and their values for this line item\r\n\t */\r\n\tselections?: ProductSelection[];\r\n\r\n\t/**\r\n\t * The order line item related product entity\r\n\t */\r\n\tproduct: OrderItemProduct;\r\n\r\n\t/**\r\n\t * The product unit of measure for this line item\r\n\t */\r\n\tpricingLine: ProductPricingLine;\r\n\r\n\t/**\r\n\t * The amount of tax applied to this line item.\r\n\t */\r\n\ttax?: SimpleDisplayPrice & HasNoSalePrice;\r\n\r\n\t/**\r\n\t * The total discount amount applied to this line item across all quantities.\r\n\t */\r\n\tdiscount?: SimpleDisplayPrice & HasNoSalePrice;\r\n\r\n\t/**\r\n\t * The part of the order-level discount that is being spread to this line item.\r\n\t */\r\n\torderDiscount?: SimpleDisplayPrice & HasNoSalePrice;\r\n\r\n\t/**\r\n\t * The displayable price of a single unit of this line item.\r\n\t */\r\n\tunitPrice?: SimpleDisplayPrice;\r\n\r\n\t/**\r\n\t * The displayable total price of this line item.\r\n\t */\r\n\ttotalPrice?: SimpleDisplayPrice & HasNoSalePrice;\r\n\r\n\t/**\r\n\t * The status of the line item\r\n\t */\r\n\tstatus?: OrderStatus;\r\n\r\n\t/**\r\n\t * The list cart item attached add ons.\r\n\t */\r\n\taddOns?: CartProductAddOnDto[];\r\n\r\n\t/**\r\n\t * The addon order item data needed for displaying.\r\n\t */\r\n\torderItemAddOns?: OrderItemAddOn[];\r\n\r\n\t// #region HCL\r\n\t/**\r\n\t * The line item's quantity ordered\r\n\t */\r\n\tquantityShipped?: number;\r\n\tquantityOrdered?: number;\r\n\tquantityOnBackorder?: number;\r\n\t// #endregion\r\n}\r\n\r\nexport interface CartProductAddOnDto extends ProductAddOnDto {\r\n\ttotalPrice?: SimpleDisplayPrice;\r\n}\r\n\r\n/**\r\n * Represents a product related to the order line item\r\n */\r\nexport interface OrderItemProduct {\r\n\t/**\r\n\t * The primary key (Guid)\r\n\t */\r\n\tid: string;\r\n\r\n\t/**\r\n\t * The main image thumbnail url\r\n\t */\r\n\tthumbnailUrl: string | null;\r\n\r\n\t/**\r\n\t * The related brand name\r\n\t */\r\n\tbrandName: string | null;\r\n\r\n\t/**\r\n\t * The alt text for thumbnail\r\n\t */\r\n\taltText?: string;\r\n\r\n\t/**\r\n\t * Status of the Product\r\n\t */\r\n\tstatus?: ModelStatus;\r\n\r\n\t/**\r\n\t * The associated group product Id of a simple product, if applicable.\r\n\t */\r\n\tproductGroupId: string;\r\n\r\n\t// #region HCL\r\n\tsku?: string;\r\n\t// #endregion\r\n}\r\n\r\n/**\r\n * Represents a single recipient on an order\r\n */\r\nexport interface OrderRecipient extends Address {\r\n\t/**\r\n\t * The primary key (Guid)\r\n\t */\r\n\tid: string;\r\n\t/**\r\n\t * The order line items\r\n\t */\r\n\titems: OrderItem[];\r\n\t/**\r\n\t * The available shipping options for this recipient\r\n\t */\r\n\tshippingOptions: ShippingOption[];\r\n\t/**\r\n\t * The shipping service selected for this recipient\r\n\t */\r\n\tshippingMethodId: string | null;\r\n\t/**\r\n\t * The shipping service name selected for this recipient\r\n\t */\r\n\tshippingMethod: ShippingMethod;\r\n\t/**\r\n\t * The addressId of the selected address from the address book (if any)\r\n\t */\r\n\taddressId: string | null;\r\n\t/**\r\n\t * The order recepient's Recipient Name, used for organization orders\r\n\t */\r\n\trecipientName?: string;\r\n\r\n\t//#region HCL\r\n\t/**\r\n\t * The shipping account selected for this recipient\r\n\t */\r\n\tshippingAccountId: string | null;\r\n\tisCollectShippingMethod: boolean | null;\r\n\t//#endregion\r\n}\r\n\r\n/**\r\n * Represents totals on an order\r\n */\r\nexport interface OrderTotals {\r\n\t/**\r\n\t * The merchandise subtotal for the order, without consideration of discounts, tax, or shipping\r\n\t */\r\n\tbaseSubtotal: SimpleDisplayPrice & HasNoSalePrice;\r\n\t/**\r\n\t * The total discount amount applied to the order line items. Some discounts are applied at the order level\r\n\t */\r\n\tlineDiscount: SimpleDisplayPrice & HasNoSalePrice;\r\n\t/**\r\n\t * The baseSubtotal amount less the lineDiscount amount\r\n\t */\r\n\tsubtotal: SimpleDisplayPrice & HasNoSalePrice;\r\n\t/**\r\n\t * The sum of the recipients Discount\r\n\t */\r\n\tdiscount: (SimpleDisplayPrice & HasNoSalePrice) | MissingDisplayPrice;\r\n\t/**\r\n\t * The sum of the recipients shipping discount amounts\r\n\t */\r\n\tshippingDiscount: SimpleDisplayPrice & HasNoSalePrice;\r\n\t/**\r\n\t * The sum of the recipients shipping amounts\r\n\t */\r\n\tshipping?: SimpleDisplayPrice & HasNoSalePrice;\r\n\t/**\r\n\t * The sum of the recipients tax amounts\r\n\t */\r\n\ttax?: SimpleDisplayPrice & HasNoSalePrice;\r\n\t/**\r\n\t * The sum of the recipients line tax amounts\r\n\t */\r\n\tlineTax?: SimpleDisplayPrice & HasNoSalePrice;\r\n\t/**\r\n\t * The sum of the recipients shipping tax amounts\r\n\t */\r\n\tshippingTax?: SimpleDisplayPrice & HasNoSalePrice;\r\n\t/**\r\n\t * The total shipping charges determined by subtracting the shipping discount shipping amount then adding the shipping tax\r\n\t */\r\n\tshippingTotal: SimpleDisplayPrice & HasNoSalePrice;\r\n\t/**\r\n\t * The total order charges, which is the sum of the subtotal, the shipping reduced by the shipping discount, and the tax\r\n\t */\r\n\ttotal: SimpleDisplayPrice & HasNoSalePrice;\r\n\t/**\r\n\t * The total order charges after gift cards are applied\r\n\t */\r\n\tmodifiedOrderTotal: SimpleDisplayPrice & HasNoSalePrice;\r\n}\r\n\r\n/**\r\n * Represents a single customer order or shopping cart\r\n */\r\nexport interface Order extends OrderTotals, Address {\r\n\t/**\r\n\t * The primary key (Guid)\r\n\t */\r\n\tid: string;\r\n\t/**\r\n\t * The ID of the organizationShipTo associated with this order.\r\n\t * Null when the order is not created by a user in an organization, or there are no ship-tos available for the user\r\n\t */\r\n\torganizationShipToId: string | null;\r\n\t/**\r\n\t * The shopping cart or completed order recipients\r\n\t */\r\n\trecipients: OrderRecipient[];\r\n\t/**\r\n\t * The shopping cart or completed order unique cart code\r\n\t */\r\n\torderCode: string;\r\n\t/**\r\n\t * The email associated to the order.\r\n\t */\r\n\temail: string;\r\n\t/**\r\n\t * If the billing address is the same as the shipping address of a recipient,\r\n\t * this field will contain the ID of that recipient.\r\n\t */\r\n\tsameAsRecipientId: string | null;\r\n\r\n\t/**\r\n\t * The shopping cart or completed order promtions\r\n\t */\r\n\tpromotions: OrderPromotion[];\r\n\r\n\t/**\r\n\t * The unique order number of the completed order\r\n\t */\r\n\torderNo: string | null;\r\n\r\n\t/**\r\n\t * The date and time that the order was successfully placed. If null, this is still a pending shopping cart.\r\n\t */\r\n\tprocessDate: Date | null;\r\n\r\n\t/**\r\n\t * Modify date\r\n\t */\r\n\tmodifyDate: Date;\r\n\r\n\t/**\r\n\t * The current order status\r\n\t */\r\n\torderStatus: OrderStatus;\r\n\r\n\t/**\r\n\t * The localized order date string, used for display purposes\r\n\t */\r\n\tlocalizedOrderDate: string;\r\n\r\n\t/**\r\n\t * The authorization or sale payment for the current order\r\n\t */\r\n\tpaymentLogs: PaymentLog[];\r\n\r\n\t/**\r\n\t * The gift cards saved on the order.\r\n\t */\r\n\tpaymentMethods: PaymentMethod[];\r\n\r\n\t/**\r\n\t * If the order is locked\r\n\t */\r\n\tisLocked: boolean;\r\n\r\n\t/**\r\n\t * The list of notes associated to the order.\r\n\t */\r\n\tnotes: OrderNote[];\r\n\r\n\t/**\r\n\t * The 3-character ISO 4217 code representing currency of the order\r\n\t */\r\n\tsnapshotCurrencyISO: string;\r\n\r\n\t/**\r\n\t * The purchase order number\r\n\t */\r\n\tpurchaseOrderNumber: string;\r\n\r\n\t/**\r\n\t * Count of all the items in the order\r\n\t */\r\n\ttotalItemsCount: number;\r\n\r\n\t/**\r\n\t * The user specified name of saved cart.\r\n\t * Undefined if the user has not named the cart.\r\n\t */\r\n\tname?: string;\r\n\r\n\t// #region HCL\r\n\texportStatus?: ExportStatus;\r\n\ttrackingLink?: string;\r\n\ttrackingNo?: string;\r\n\tpaymentTypes: PaymentTypeEnum[];\r\n\tisP21Order: boolean;\r\n\t// #endregion\r\n}\r\n\r\n/**\r\n * Represents a single order note on an order\r\n */\r\nexport interface OrderNote {\r\n\t// #region HCL - nullable values\r\n\t/**\r\n\t * The primary key (Guid)\r\n\t */\r\n\tid: string | null;\r\n\r\n\t/**\r\n\t * The user who created the note.\r\n\t */\r\n\tcreateUser: string | null;\r\n\t// #endregion\r\n\r\n\t/**\r\n\t * The localized date note was created used for display purpose.\r\n\t */\r\n\tcreateDate: string | null;\r\n\r\n\t/**\r\n\t * Indicates the type of note.\r\n\t */\r\n\tnoteType: string;\r\n\r\n\t/**\r\n\t * The note entered in the admin.\r\n\t */\r\n\tnote: string;\r\n}\r\n\r\n/**\r\n * Represents a single promotion on an order\r\n */\r\nexport interface OrderPromotion {\r\n\t/**\r\n\t * The primary key (Guid)\r\n\t */\r\n\tid: string;\r\n\r\n\t/**\r\n\t * The identifier for the promotion (Guid)\r\n\t */\r\n\tpromotionId: string;\r\n\r\n\t/**\r\n\t * The coupon code associated with this cart or order promotion\r\n\t */\r\n\tcouponCode: string;\r\n}\r\n\r\n/**\r\n * Represents a list of user saved products\r\n */\r\nexport interface GetSavedProductsResult extends PaginatedResult {}\r\n\r\n/**\r\n * Represents what an item's last action was in the cart\r\n */\r\nexport enum MoveStatus {\r\n\tMovedToCart,\r\n\tMovedToSaved,\r\n\tRemovedFromSaved,\r\n\tRemovedFromCart,\r\n}\r\n\r\n/**\r\n * Represents a single user saved product\r\n * Contains only the information needed to display a product's basic information and move it to the cart\r\n */\r\nexport interface SavedProduct {\r\n\t/**\r\n\t * The UserSavedProduct primary key (Guid)\r\n\t */\r\n\tid: string;\r\n\r\n\t/**\r\n\t * The ID of the product represented by this SavedProduct\r\n\t */\r\n\tproductId: string;\r\n\r\n\tsku: string;\r\n\r\n\tname: string;\r\n\r\n\turl: string;\r\n\r\n\tgroupUrl: string;\r\n\r\n\tunitPrice: SimpleDisplayPrice;\r\n\r\n\ttotalPrice: SimpleDisplayPrice & HasNoSalePrice;\r\n\r\n\tselections?: SimpleSelectionDto[];\r\n\r\n\tisVirtual: boolean;\r\n\r\n\tthumbnailUrl: string | null;\r\n\r\n\tbrandName: string | null;\r\n\r\n\t/**\r\n\t * The pricing line for this line item\r\n\t */\r\n\tpricingLine: ProductPricingLine;\r\n\r\n\tsnapshotPricingLineId: string;\r\n\r\n\tsnapshotUnitOfMeasureId: string;\r\n\r\n\tquantity: number;\r\n\r\n\taltText?: string;\r\n\r\n\t/**\r\n\t * The associated group product Id of a simple product, if applicable.\r\n\t */\r\n\tproductGroupId: string;\r\n\r\n\t/**\r\n\t * Information about add-ons for this saved product, if it has any\r\n\t */\r\n\taddOns?: ProductAddOnDto[];\r\n}\r\n\r\nexport interface AddToCartProps {\r\n\t/**\r\n\t * The product id to add to cart.\r\n\t */\r\n\titemId: string;\r\n\r\n\t/**\r\n\t * The quantity to be added\r\n\t */\r\n\tquantity: number | null;\r\n\r\n\t/**\r\n\t * The selected pricing line\r\n\t */\r\n\tproductPricingLineId: string | null;\r\n\r\n\t/**\r\n\t * The product add ons selected\r\n\t */\r\n\taddOns?: ProductAddOnDto[];\r\n\r\n\t/**\r\n\t * Defines if we need to validate the product add ons before adding to cart\r\n\t */\r\n\tvalidateAddOns?: boolean;\r\n}\r\n\r\nexport interface AddAllToCartProps {\r\n\tshoppingListId: string;\r\n\r\n\t/**\r\n\t * List of selected products ids to be added to cart\r\n\t */\r\n\tselectedShoppingListProductIds: string[];\r\n}\r\n\r\n/**\r\n * The request used for bulk add to cart\r\n */\r\nexport interface BulkAddToCartProps {\r\n\titems: AddToCartProps[];\r\n}\r\n\r\n/**\r\n * Order status enum\r\n */\r\nexport enum OrderStatus {\r\n\tNew = 'New',\r\n\tSaved = 'Saved',\r\n\tDiscarded = 'Discarded',\r\n\tOrdered = 'Ordered',\r\n\tShipped = 'Shipped',\r\n\tPartiallyShipped = 'PartiallyShipped',\r\n\tCredited = 'Credited',\r\n\tCanceled = 'Canceled',\r\n\tPartiallyCanceled = 'PartiallyCanceled',\r\n\tReturned = 'Returned',\r\n\tCompleted = 'Completed',\r\n}\r\n\r\n/**\r\n * Payment Log DTO\r\n */\r\nexport type PaymentLog =\r\n\t| {\r\n\t\t\tpaymentType: PaymentTypeEnum.CreditCard;\r\n\t\t\tlast4: string;\r\n\t\t\tcreditCardType: CreditCardType | null;\r\n\t\t\tamount: SimpleDisplayPrice & HasNoSalePrice;\r\n\t }\r\n\t| {\r\n\t\t\tpaymentType: PaymentTypeEnum.GiftCard;\r\n\t\t\tgiftCardNumber: string;\r\n\t\t\tamount: SimpleDisplayPrice & HasNoSalePrice;\r\n\t }\r\n\t| {\r\n\t\t\tpaymentType: PaymentTypeEnum.CorporateAccount;\r\n\t\t\tamount: SimpleDisplayPrice & HasNoSalePrice;\r\n\t };\r\n\r\nexport enum PaymentTypeEnum {\r\n\tCreditCard = 'CreditCard',\r\n\tGiftCard = 'GiftCard',\r\n\t//TODO(Paradigm): do we comment these out? Also check why 'GiftCard' wasn't here already?\r\n\t// Not implemented yet:\r\n\tApplePay = 'ApplePay',\r\n\tGooglePay = 'GooglePay',\r\n\tPayPal = 'PayPal',\r\n\tPurchaseOrder = 'PurchaseOrder',\r\n\tCorporateAccount = 'CorporateAccount',\r\n}\r\n\r\n/**\r\n * Credit card type enum\r\n */\r\nexport enum CreditCardType {\r\n\tAMERICAN_EXPRESS = 'AMERICAN_EXPRESS',\r\n\tVISA = 'VISA',\r\n\tMASTERCARD = 'MASTERCARD',\r\n\tDISCOVER = 'DISCOVER',\r\n\tOTHER = 'OTHER',\r\n}\r\n\r\nexport interface PaymentMethod extends BasicDto {\r\n\tchargeAmount: SimpleDisplayPrice & HasNoSalePrice;\r\n\tbalanceAmount: SimpleDisplayPrice & HasNoSalePrice;\r\n\tpaymentType: PaymentTypeEnum;\r\n\tcardNumber: string;\r\n}\r\n\r\nexport interface AddToCartEvent {\r\n\t/**\r\n\t * The id of the product\r\n\t */\r\n\tid: string;\r\n\t/**\r\n\t * The name of the product\r\n\t */\r\n\tname: string;\r\n\t/**\r\n\t * The product SKU\r\n\t */\r\n\tsku: string;\r\n\t/**\r\n\t * The price of a product\r\n\t */\r\n\tprice: number;\r\n\t/**\r\n\t * The quantity of a product that actually got added to the cart\r\n\t */\r\n\tadjustedQuantity: number;\r\n\t/**\r\n\t * The 3-character ISO 4217 code representing currency of the item\r\n\t */\r\n\tcurrency: string;\r\n\r\n\t/**\r\n\t * The associated group product Id of a simple product, if applicable.\r\n\t */\r\n\tproductGroupId: string | null;\r\n\r\n\t/**\r\n\t * The list of selectable attributes and their values for the product that was added to cart\r\n\t */\r\n\tselections: ProductSelection[] | null;\r\n}\r\n\r\n/**\r\n * Represents the saved shopping cart\r\n */\r\nexport interface SavedCart {\r\n\torderId: string;\r\n\tname: string;\r\n\torderCode: string;\r\n\titemCount: number;\r\n\tlastModifiedDate: string;\r\n}\r\n\r\n// #region HCL\r\nexport enum ExportStatus {\r\n\tQueued = 'Queued',\r\n\tProcessing = 'Processing',\r\n\tSuccess = 'Success',\r\n\tFailed = 'Failed',\r\n}\r\n// #endregion\r\n","import { Response, Request, Result } from 'models/Search';\r\nimport { Value, Facet } from 'models/Facets';\r\nimport { ClientSelections, ClientSelectionValue } from 'store/ClientSelections';\r\nimport { CompareResultObject } from '../models/CompareResultObject';\r\n\r\nexport enum FacetSelectionState {\r\n\t/** The facet value is not selected. */\r\n\tNotSelected,\r\n\t/** The facet value is selected. */\r\n\tSelected,\r\n\t/** The facet value is selected, but negated. */\r\n\tNegated,\r\n}\r\n\r\nexport interface SelectionInfo {\r\n\t/** The facet value selection state. */\r\n\tstate: FacetSelectionState;\r\n\r\n\t/**\r\n\t * If the facet value is `FacetSelectionState.Selected` or `FacetSelectionState.Negated`, this is the value of\r\n\t * the facet value. For negated facet values this will be prefixed with the negation character `'-'`.\r\n\t */\r\n\tselectedValue?: string;\r\n\r\n\t/**\r\n\t * If the facet value is `FacetSelectionState.Selected` or `FacetSelectionState.Negated`, this is the index\r\n\t * into the `pendingSearch.FacetSelections[facetName]` array for this facet value.\r\n\t */\r\n\tselectionIndex?: number;\r\n}\r\n\r\nexport class SearchStore {\r\n\t/** This represents the next search request that will be executed. */\r\n\tpublic pendingSearch: Partial;\r\n\r\n\t/**\r\n\t * Whether or not the next search request will perform history actions (pushing the search into browser\r\n\t * history).\r\n\t */\r\n\tpublic doHistory: boolean;\r\n\r\n\t/** Whether or not a search request is waiting for completion. */\r\n\tpublic isLoading: boolean;\r\n\r\n\tpublic itemsToCompare: Result[];\r\n\tpublic itemsToCompareIds: string[];\r\n\tpublic comparedResults: CompareResultObject[];\r\n\r\n\t/** The results of the last search request, if one has been performed. Otherwise, `undefined`. */\r\n\tpublic searchResults?: Response;\r\n\r\n\tpublic requestError: boolean;\r\n\r\n\tpublic constructor(initial?: Partial) {\r\n\t\tObject.assign(this, initial);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns whether or not this is the initial load of the search results.\r\n\t */\r\n\tpublic get isInitialLoad() {\r\n\t\treturn this.isLoading && !this.searchResults;\r\n\t}\r\n\r\n\t/**\r\n\t * Determines whether or not the given facet and facet value is selected, and returns info regarding the selection.\r\n\t * @param facet The facet for which the facet value will be checked for selection.\r\n\t * @param facetValue The facet value that will be checked for selection.\r\n\t */\r\n\tpublic isFacetSelected(facet: Facet | string, facetValue: Value | string): SelectionInfo {\r\n\t\tconst facetName = typeof facet === 'string' ? facet : facet.Name;\r\n\t\tconst facetField = typeof facet === 'string' ? facet : facet.selectionField;\r\n\r\n\t\t/* #region HCL */\r\n\t\tconst valueValue = (typeof facetValue === 'string' ? facetValue : facetValue.Value)?.replace(/%c%/g, ',');\r\n\t\t/* #endregion */\r\n\t\tconst valueLabel = typeof facetValue === 'string' ? facetValue : facetValue.Label;\r\n\r\n\t\tif (!valueValue) {\r\n\t\t\tconsole.error(`Facet ${facetName} (${facetField}) has no facet value for ${valueLabel}`);\r\n\t\t\treturn { state: FacetSelectionState.NotSelected };\r\n\t\t}\r\n\r\n\t\tconst facetSelections = this.pendingSearch.FacetSelections;\r\n\r\n\t\tif (!facetSelections || !facetSelections[facetField]) {\r\n\t\t\treturn { state: FacetSelectionState.NotSelected };\r\n\t\t}\r\n\r\n\t\tconst selectionIdx = facetSelections[facetField]!.indexOf(valueValue);\r\n\t\tconst negationIdx = facetSelections[facetField]!.indexOf(`-${valueValue}`);\r\n\r\n\t\tif (selectionIdx !== -1) {\r\n\t\t\t// if the exact facet value exists, then we're normally selected\r\n\t\t\treturn {\r\n\t\t\t\tstate: FacetSelectionState.Selected,\r\n\t\t\t\tselectedValue: valueValue,\r\n\t\t\t\tselectionIndex: selectionIdx,\r\n\t\t\t};\r\n\t\t} else if (negationIdx !== -1) {\r\n\t\t\t// if the facet value is selected but prefixed with a -, then we're negated\r\n\t\t\treturn {\r\n\t\t\t\tstate: FacetSelectionState.Negated,\r\n\t\t\t\tselectedValue: `-${valueValue}`,\r\n\t\t\t\tselectionIndex: negationIdx,\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn { state: FacetSelectionState.NotSelected };\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an object containing the selections that have been made in both the next search request and also\r\n\t * in the previous search request. This should be used when iterating selections instead of pulling the values\r\n\t * out from the search result or pending search - as this will merge the values together and provide an accurate\r\n\t * view of all facet selections.\r\n\t */\r\n\tpublic get facetSelections(): ClientSelections {\r\n\t\tconst {\r\n\t\t\tpendingSearch: { FacetSelections: clientSelections, SearchWithin },\r\n\t\t\tsearchResults,\r\n\t\t} = this;\r\n\r\n\t\tconst selections: ClientSelections = {};\r\n\r\n\t\tif (!clientSelections && !SearchWithin) {\r\n\t\t\treturn selections;\r\n\t\t}\r\n\r\n\t\t// if we've made selections on the client, transform these into more detailed selections.\r\n\t\t// the client-side selections are just facet fields and values without any labels - so we\r\n\t\t// need to combine this information with the list of facets received from the server in the\r\n\t\t// previous search in order to return a rich list of selections\r\n\r\n\t\tconst facets = searchResults ? searchResults.Facets : null;\r\n\r\n\t\tif (!facets) {\r\n\t\t\t// but we can only do this if we've received facet information from the server. without this\r\n\t\t\t// info we can't determine what labels should be used\r\n\t\t\treturn selections;\r\n\t\t}\r\n\r\n\t\t// manually handle the `searchWithin` selection, as this doesn't usually behave like a normal facet selection\r\n\t\t// but instead a field on the search request\r\n\t\tif (SearchWithin) {\r\n\t\t\tconst facet = facets.find((f) => f.selectionField === 'searchWithin');\r\n\r\n\t\t\tif (facet) {\r\n\t\t\t\tselections.searchWithin = {\r\n\t\t\t\t\tfacet,\r\n\t\t\t\t\tlabel: facet.Name,\r\n\t\t\t\t\titems: [\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tlabel: SearchWithin,\r\n\t\t\t\t\t\t\tvalue: SearchWithin,\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t],\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!clientSelections) {\r\n\t\t\treturn selections;\r\n\t\t}\r\n\r\n\t\tObject.keys(clientSelections).forEach((fieldName) => {\r\n\t\t\tconst selectionValues = clientSelections[fieldName];\r\n\r\n\t\t\tif (!selectionValues) {\r\n\t\t\t\t// if this selection has no values, it's not really selected\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst facet = facets.find((f) => f.selectionField === fieldName);\r\n\r\n\t\t\tif (!facet) {\r\n\t\t\t\t// if there's no matching facet from the server, we can't show this since we'll have no labels\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst items: ClientSelectionValue[] = [];\r\n\r\n\t\t\tif (facet.FieldType === 'range') {\r\n\t\t\t\t// if the facet this selection is for is a range, there won't be a matching value and thus there won't be a label.\r\n\t\t\t\t// so because of this we'll just use the selection value as the label\r\n\r\n\t\t\t\tselectionValues.forEach((selectionValue) => {\r\n\t\t\t\t\titems.push({\r\n\t\t\t\t\t\tlabel: selectionValue,\r\n\t\t\t\t\t\tvalue: selectionValue,\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t} else if (facet.FieldType === 'tab') {\r\n\t\t\t\t// do not return the selection value for tab facet\r\n\t\t\t\treturn;\r\n\t\t\t} else {\r\n\t\t\t\t// for other types of facets, try to find a matching value\r\n\r\n\t\t\t\tselectionValues.forEach((selectionValue) => {\r\n\t\t\t\t\tconst matchingVal =\r\n\t\t\t\t\t\tthis.findMatchingValue(selectionValue, facet.Values) ||\r\n\t\t\t\t\t\tthis.findMatchingValue(selectionValue.replace(/,/g, '%c%'), facet.Values);\r\n\r\n\t\t\t\t\tif (!matchingVal || !matchingVal.Label) {\r\n\t\t\t\t\t\t// if there's no matching value from the server, we cannot display because there would\r\n\t\t\t\t\t\t// be no label - same if there's no label at all\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\titems.push({\r\n\t\t\t\t\t\tlabel: matchingVal.Label,\r\n\t\t\t\t\t\tvalue: selectionValue.replace(/%c%/g, ','),\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tselections[fieldName] = {\r\n\t\t\t\tfacet,\r\n\t\t\t\tlabel: facet.Name,\r\n\t\t\t\titems,\r\n\t\t\t};\r\n\t\t});\r\n\r\n\t\treturn selections;\r\n\t}\r\n\r\n\tprivate findMatchingValue(selectionValue: string, facetValues: Value[]): Value | null {\r\n\t\tlet matchingValue: Value | null = null;\r\n\t\tif (!facetValues || facetValues.length === 0) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tfor (const facetValue of facetValues) {\r\n\t\t\tconst isMatchingVal = facetValue.Value === selectionValue || `-${facetValue.Value}` === selectionValue;\r\n\t\t\t// loop through children\r\n\t\t\tif (!isMatchingVal) {\r\n\t\t\t\tmatchingValue = this.findMatchingValue(selectionValue, facetValue.Children);\r\n\t\t\t} else {\r\n\t\t\t\tmatchingValue = facetValue;\r\n\t\t\t}\r\n\r\n\t\t\tif (matchingValue) {\r\n\t\t\t\treturn matchingValue;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn matchingValue;\r\n\t}\r\n}\r\n","import { ControllerStateAndHelpers } from 'downshift';\r\n\r\nexport enum SuggestionType {\r\n\tProduct = 'product',\r\n\tCategory = 'category',\r\n\tContent = 'content',\r\n\tPopular = 'popular',\r\n\tViewAll = 'viewall',\r\n}\r\nexport abstract class Suggestion {\r\n\tpublic SuggestionType: SuggestionType;\r\n\tpublic constructor(suggestionType: SuggestionType) {\r\n\t\tthis.SuggestionType = suggestionType;\r\n\t}\r\n}\r\n\r\nexport interface SuggestionStrategy {\r\n\thandleItemChange(item: Suggestion, downshift: ControllerStateAndHelpers): void;\r\n\ttoString(item: Suggestion): string;\r\n}\r\n\r\nexport interface SuggestionStrategyMatch {\r\n\ttype: SuggestionType;\r\n\tstrategy: SuggestionStrategy;\r\n}\r\n","// source: https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttributeNames\r\n/* eslint-disable no-var */\r\n(function () {\r\n\tif (Element.prototype.getAttributeNames == undefined) {\r\n\t\tElement.prototype.getAttributeNames = function () {\r\n\t\t\tvar attributes = this.attributes;\r\n\t\t\tvar length = attributes.length;\r\n\t\t\tvar result = new Array(length);\r\n\t\t\tfor (var i = 0; i < length; i++) {\r\n\t\t\t\tresult[i] = attributes[i].name;\r\n\t\t\t}\r\n\t\t\treturn result;\r\n\t\t};\r\n\t}\r\n})();\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport ErrorBoundary from './ErrorBoundary';\r\nimport { toCamelCase } from 'util/StringUtil';\r\nimport 'shared/polyfills/getAttributeNames';\r\nimport Spinner from 'shared/components/Spinner';\r\n\r\ninterface AttributeProps {\r\n\t[index: string]: string;\r\n}\r\n\r\nfunction getDataPropsFromAttributes(element: Element): AttributeProps {\r\n\tconst props: AttributeProps = {};\r\n\r\n\tconst dataAttributePrefix = 'data-';\r\n\r\n\tconst attributeNames = element.getAttributeNames().filter((s) => s.startsWith(dataAttributePrefix));\r\n\tfor (const attributeName of attributeNames) {\r\n\t\tconst strippedName = toCamelCase(attributeName.substring(dataAttributePrefix.length));\r\n\t\tprops[strippedName] = element.getAttribute(attributeName) ?? '';\r\n\t}\r\n\r\n\treturn props;\r\n}\r\n\r\n/**\r\n * A helper function to facilitate initializing react applications on top of server-side rendered elements.\r\n * @param getReactElement Function that returns the react component to render.\r\n * @param elementId The ID of the DOM element being targeted.\r\n */\r\nexport const initReactApp = (getReactElement: (props: unknown) => React.ReactElement, elementId: string) => {\r\n\tif (typeof getReactElement !== 'function' || !elementId) {\r\n\t\treturn () => {\r\n\t\t\tconsole.warn('A react element generator function and element ID are required.');\r\n\t\t};\r\n\t}\r\n\r\n\tconst element = document.getElementById(elementId);\r\n\r\n\tif (!element) {\r\n\t\treturn () => {\r\n\t\t\tconsole.warn(\r\n\t\t\t\t`Element with ID '${elementId}' was not found. Did you forget to render it on the server or is this entry point not supposed to run?`,\r\n\t\t\t);\r\n\t\t};\r\n\t}\r\n\r\n\treturn () => {\r\n\t\tconst props = getDataPropsFromAttributes(element);\r\n\t\tconsole.debug(`Rendering application inside element with ID ${elementId}.`);\r\n\t\tReactDOM.render(\r\n\t\t\t}>\r\n\t\t\t\t{getReactElement(props)}\r\n\t\t\t,\r\n\t\t\telement,\r\n\t\t);\r\n\t};\r\n};\r\n\r\nexport const initReactAppByAttribute = (\r\n\tgetReactElement: (props: unknown, domElement: Element) => React.ReactElement,\r\n\tattribute: string,\r\n) => {\r\n\tif (typeof getReactElement !== 'function' || !attribute) {\r\n\t\treturn () => {\r\n\t\t\tconsole.warn('A react element generator function and element ID are required.');\r\n\t\t};\r\n\t}\r\n\r\n\tconst elements = document.querySelectorAll(`[${attribute}]`);\r\n\r\n\tif (!elements || elements.length == 0) {\r\n\t\treturn () => {\r\n\t\t\tconsole.warn(\r\n\t\t\t\t`No elements with data attribute '${attribute}' were found. Did you forget to render it on the server or is this entry point not supposed to run?`,\r\n\t\t\t);\r\n\t\t};\r\n\t}\r\n\r\n\treturn () => {\r\n\t\tfor (let i = 0; i < elements.length; ++i) {\r\n\t\t\tconst element = elements[i];\r\n\t\t\tconst props = getDataPropsFromAttributes(element);\r\n\t\t\tconsole.debug(`Rendering application inside element with attribute ${attribute}.`);\r\n\t\t\tReactDOM.render(\r\n\t\t\t\t}>\r\n\t\t\t\t\t{getReactElement(props, element)}\r\n\t\t\t\t,\r\n\t\t\t\telement,\r\n\t\t\t);\r\n\t\t}\r\n\t};\r\n};\r\n","/**\r\n * @see HawkSearchConfig.apiUrl\r\n */\r\nexport const defaultApiUrl = 'https://searchapi-dev.hawksearch.net';\r\n\r\n/**\r\n * @see HawkSearchConfig.dashboardUrl\r\n */\r\nexport const defaultDashboardUrl = 'https://dev.hawksearch.net';\r\n\r\n/**\r\n * @see HawkSearchConfig.searchUrl\r\n */\r\nexport const defaultSearchUrl = '/api/v2/search';\r\n\r\n/**\r\n * @see HawkSearchConfig.autocompleteUrl\r\n */\r\nexport const defaultAutocompleteUrl = '/api/autocomplete';\r\n\r\n/**\r\n * @see HawkSearchConfig.searchPageUrl\r\n */\r\nexport const defaultSearchPageUrl = '/search';\r\n\r\n/**\r\n * Endpoint for hawksearch's compare api\r\n */\r\nexport const defaultCompareItemsURL = '/api/v2/compare';\r\n\r\n/**\r\n * @see HawkSearchConfig.recommendationUrl\r\n */\r\nexport const defaultRecommendationUrl = 'https://recs-dev.hawksearch.net';\r\n\r\n/**\r\n * @see HawkSearchConfig.recommendationWidgetUrl\r\n */\r\nexport const recommendationWidgetUrl = '/api/recommendation/v2/getwidgetitems';\r\n\r\n// #region HCL\r\n/**\r\n * @see HawkSearchConfig.enableRemovingDashesFromSearchKeyword\r\n */\r\nexport const enableRemovingDashesFromSearchKeyword = false;\r\n// #endregion\r\n","/**\r\n * Returns visitor expiry date for hawksearch visitor id stored in the cookie for the user.\r\n */\r\nexport function getVisitorExpiry() {\r\n\tconst d = new Date();\r\n\t// 1 year\r\n\td.setTime(d.getTime() + 360 * 24 * 60 * 60 * 1000);\r\n\treturn d.toUTCString();\r\n}\r\n\r\n/**\r\n * Returns visitor expiry date for hawksearch visit id stored in the cookie for the user.\r\n */\r\nexport function getVisitExpiry() {\r\n\tconst d = new Date();\r\n\t// 4 hours\r\n\td.setTime(d.getTime() + 4 * 60 * 60 * 1000);\r\n\treturn d.toUTCString();\r\n}\r\n\r\n/**\r\n * Creates GUID.\r\n */\r\nexport function createGuid() {\r\n\tconst s: string[] = [];\r\n\tconst hexDigits = '0123456789abcdef';\r\n\tfor (let i = 0; i < 36; i++) {\r\n\t\ts[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);\r\n\t}\r\n\ts[14] = '4'; // bits 12-15 of the time_hi_and_version field to 0010\r\n\ts[19] = hexDigits.substr(((s[19] as any) & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01\r\n\ts[8] = s[13] = s[18] = s[23] = '-';\r\n\r\n\treturn s.join('');\r\n}\r\n\r\n/**\r\n * Returns the cookie.\r\n */\r\nexport function getCookie(name) {\r\n\tconst nameEQ = name + '=';\r\n\tconst ca = document.cookie.split(';');\r\n\r\n\tfor (let i = 0; i < ca.length; i++) {\r\n\t\tlet cookie = ca[i];\r\n\r\n\t\twhile (cookie.charAt(0) == ' ') {\r\n\t\t\tcookie = cookie.substring(1, cookie.length);\r\n\t\t}\r\n\r\n\t\tif (cookie.indexOf(nameEQ) == 0) {\r\n\t\t\treturn cookie.substring(nameEQ.length, cookie.length);\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n}\r\n\r\n/**\r\n * Sets the cookie.\r\n */\r\nexport function setCookie(name: string, value: string, expiry?: string) {\r\n\tlet expires = '';\r\n\r\n\tif (expiry) {\r\n\t\texpires = '; expires=' + expiry;\r\n\t}\r\n\r\n\tdocument.cookie = name + '=' + value + expires + '; path=/';\r\n}\r\n","/**\r\n * THIS HAS A COPY ON ROC.WEB. DO NOT MAKE CHANGES HERE WITHOUT ALSO MAKING THEM IN THE OTHER FILE.\r\n *\r\n * THIS MUST ALSO BE KEPT IN SYNC WITH THE \"RazorDisplayPrice\" VIEW COMPONENT.\r\n *\r\n * DIVERGENCES:\r\n * - The style \"visually-hidden\" DOES NOT EXIST ON ROC.WEB. Change this to \"roc-visually-hidden\"\r\n */\r\n\r\nimport classnames from 'classnames';\r\nimport React from 'react';\r\nimport { Localizer } from 'services/Localizer';\r\nimport { CssClasses, ProductPricingProps } from 'shared-client/types/commerce/product-details';\r\nimport {\r\n\tAmbiguousDisplayPrice,\r\n\tMissingDisplayPrice,\r\n\tPartialDisplayPrice,\r\n\tPrice,\r\n\tPriceDisplayRule,\r\n\tPriceSpan,\r\n\tSimpleDisplayPrice,\r\n} from 'shared-client/types/commerce/display-price';\r\n\r\nimport { PricingResourceKeys } from 'features/commerce/pricing/resources';\r\n\r\nconst GetCssClasses = (className: string | undefined, inline: boolean) => {\r\n\tconst priceClass = ['roc-pricing__price', className ? className + '__price' : null];\r\n\r\n\treturn {\r\n\t\tbase: ['roc-pricing', { 'roc-pricing--inline': inline }, className ? className : null],\r\n\t\tnormalPrice: ['roc-pricing__price', className ? className + '__price' : null],\r\n\t\tcrossedOutPrice: [\r\n\t\t\tpriceClass,\r\n\t\t\t'roc-pricing__price--original',\r\n\t\t\tclassName ? className + '__price--original' : null,\r\n\t\t],\r\n\t\thighlightedPrice: [priceClass, 'roc-pricing__price--sale', className ? className + '__price--sale' : null],\r\n\t};\r\n};\r\n\r\n/**\r\n * Renders a product price. This could be a simple price \"$4.99\", a price that's on sale \"~~$4.99~~ $3.99\",\r\n * a range of prices, an ambiguous price or potentially others.\r\n *\r\n * The pricing information is expected to have come from the server where it has already been validated.\r\n * It is the responsibility of the caller to verify pricing objects passed to ProductPricing are valid.\r\n */\r\nexport default function ProductPricing(props: ProductPricingProps) {\r\n\t// #region HCL\r\n\tconst { displayPrice, className, inline = false, testId = 'product-price', roundValue } = props;\r\n\t// #endregion\r\n\r\n\t// The server/caller is trusted to have provided valid props.\r\n\t// Do no validation here.\r\n\r\n\tif (displayPrice == null) {\r\n\t\t// Missing price. Remove this if MissingPrice functionality is ever needed beyond \"don't render\"\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst css = GetCssClasses(className, inline);\r\n\r\n\tlet renderResult: JSX.Element | null;\r\n\tswitch (displayPrice.displayRule) {\r\n\t\tcase PriceDisplayRule.Missing:\r\n\t\t\trenderResult = renderMissingPrice(css, displayPrice);\r\n\t\t\tbreak;\r\n\r\n\t\tcase PriceDisplayRule.Normal:\r\n\t\t\trenderResult = renderNormalPrice(css, displayPrice, testId);\r\n\t\t\tbreak;\r\n\r\n\t\tcase PriceDisplayRule.AmbiguousRange:\r\n\t\t\t// #region HCL\r\n\t\t\trenderResult = renderAmbiguousPrice(css, displayPrice, testId, roundValue);\r\n\t\t\t// #endregion\r\n\t\t\tbreak;\r\n\r\n\t\tdefault:\r\n\t\t\tthrow new Error('Erroneous price display rule');\r\n\t}\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t{renderResult}\r\n\t\t\r\n\t);\r\n}\r\n\r\n/**\r\n * Renders a missing price, eg nothing. This currently renders nothing but could be updated to render \"Not For Sale\" for example.\r\n * @param css The set of css rules that can be applied.\r\n * @param price The price object\r\n */\r\n// eslint-disable-next-line no-unused-vars\r\nfunction renderMissingPrice(css: CssClasses, price: MissingDisplayPrice) {\r\n\treturn null;\r\n}\r\n\r\n/**\r\n * Renders a normal price. This is a price that might be on sale and may either be a unit price (eg $4.99) or a\r\n * range (eg $3.99 - $7.99).\r\n * @param css The set of css rules that can be applied.\r\n * @param price The price object\r\n */\r\nfunction renderNormalPrice(css: CssClasses, price: SimpleDisplayPrice, testId: string) {\r\n\t// conditionally cross out the base price\r\n\tconst basePriceClass = price.salePrice != null ? css.crossedOutPrice : css.normalPrice;\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\t{Localizer('OriginalPrice')}\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t{price.salePrice != null ? (\r\n\t\t\t\t\r\n\t\t\t\t\t{Localizer('SalePrice')}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t) : null}\r\n\t\t\r\n\t);\r\n}\r\n\r\n/**\r\n * Renders an ambiguous price. This is a compound price representing multiple different products where the upperbound of the price\r\n * can't be reported in a useful way. The units of measure between the base and sale price may be different.\r\n * @param css The set of css rules that can be applied.\r\n * @param price The price object\r\n */\r\n// #region HCL\r\nfunction renderAmbiguousPrice(css: CssClasses, price: AmbiguousDisplayPrice, testId: string, roundValue?: boolean) {\r\n\t// #endregion\r\n\t// conditionally cross out the base price\r\n\tconst basePriceClass = price.salePrice != null ? css.crossedOutPrice : css.normalPrice;\r\n\t// #region HCL\r\n\tconst roundedPrice = roundValue ? price.basePrice.rawValue.toFixed(2) : price.basePrice.value;\r\n\t// #endregion\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\t{Localizer('OriginalPrice')}\r\n\t\t\t\t\r\n\t\t\t\t\t{/* #region HCL */}\r\n\t\t\t\t\t\r\n\t\t\t\t\t{/* #region HCL */}\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t{price.salePrice != null ? (\r\n\t\t\t\t\r\n\t\t\t\t\t{Localizer('SalePrice')}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t) : null}\r\n\t\t\r\n\t);\r\n}\r\n\r\n/**\r\n * Renders a partial display price (eg it may be either a simple price or a range price)\r\n */\r\nfunction VariantPriceComponent({ price }: { price: PartialDisplayPrice }) {\r\n\tconst label = price.unit?.label;\r\n\r\n\tswitch (typeof price.value) {\r\n\t\tcase 'string':\r\n\t\t\treturn ;\r\n\r\n\t\tcase 'object':\r\n\t\t\treturn ;\r\n\t}\r\n}\r\n\r\nfunction FormatAmbiguousPriceSpan(props: { price: Price; unitName: string }) {\r\n\t// Ambiguous prices always have a unit of measure. It is never optional.\r\n\treturn <>{Localizer('AmbiguousPriceRangeWithUnit', props.price, props.unitName)};\r\n}\r\n\r\n/**\r\n * Renders a price range (eg $14.99 - $19.99) with an optional unit of measure\r\n */\r\nfunction FormatPriceSpan(props: { priceRange: PriceSpan; unitName: string | undefined }) {\r\n\treturn props.unitName != null ? (\r\n\t\t<>\r\n\t\t\t{Localizer(\r\n\t\t\t\t'PriceRangeWithUnit',\r\n\t\t\t\tprops.priceRange.from,\r\n\t\t\t\tprops.priceRange.to,\r\n\t\t\t\tprops.unitName,\r\n\t\t\t)}\r\n\t\t\r\n\t) : (\r\n\t\t<>{Localizer('PriceRangeWithoutUnit', props.priceRange.from, props.priceRange.to)}\r\n\t);\r\n}\r\n\r\n/** Formats the price with the unit of measure (if present) appended. */\r\nfunction FormatPrice(props: { price: Price; unitName?: string }) {\r\n\treturn props.unitName != null ? (\r\n\t\t<>{Localizer('PriceWithUnit', props.price, props.unitName)}\r\n\t) : (\r\n\t\t<>{Localizer('PriceWithoutUnit', props.price)}\r\n\t);\r\n}\r\n","import { useState, useEffect } from 'react';\r\n\r\n/**\r\n * Reusable hook that returns true after a certain amount of time has passed. Useful to delay\r\n * displaying components in render functions.\r\n *\r\n * @export\r\n * @param {number} [waitMs=200]\r\n * @returns\r\n */\r\nexport default function useDelayedDisplay(waitMs: number = 200) {\r\n\tconst [display, setDisplay] = useState(false);\r\n\r\n\tuseEffect(() => {\r\n\t\t// after a set amount of time, show the spinner\r\n\t\tconst timeout = setTimeout(() => {\r\n\t\t\tsetDisplay(true);\r\n\t\t}, waitMs);\r\n\r\n\t\treturn () => {\r\n\t\t\tclearTimeout(timeout);\r\n\t\t};\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, []);\r\n\r\n\treturn display;\r\n}\r\n","import * as React from 'react';\r\n\r\ninterface PlusSVGProps {\r\n\tclass?: string;\r\n}\r\n\r\n/**\r\n * Plus SVG\r\n *\r\n * @returns\r\n */\r\nfunction PlusThinSVG(props: PlusSVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default PlusThinSVG;\r\n","import * as React from 'react';\r\n\r\ninterface MinusSVGProps {\r\n\tclass?: string;\r\n}\r\n\r\n/**\r\n * Minus SVG\r\n *\r\n * @returns\r\n */\r\nfunction MinusThinSVG(props: MinusSVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default MinusThinSVG;\r\n","import React, { useContext, useState, useRef, MouseEvent } from 'react';\r\nimport { Facet as FacetModel, Value } from 'models/Facets';\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport PlusThinSVG from 'components/svg/PlusThinSVG';\r\nimport MinusThinSVG from 'components/svg/MinusThinSVG';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type Tooltip from '@reach/tooltip';\r\nimport 'styles/node-modules/@reach/tooltip/styles.css';\r\nimport QuestionMarkCircleSVG from 'shared/components/svg/QuestionMarkCircleSVG';\r\nimport Spinner from 'shared/components/Spinner';\r\nimport classnames from 'classnames';\r\nconst LazyTooltip = React.lazy(() => import('@reach/tooltip'));\r\nconst FacetContext = React.createContext({} as FacetContextValue);\r\n\r\nexport interface FacetProps {\r\n\tfacet: FacetModel;\r\n\tchildren: React.ReactNode;\r\n\tonFacetChange: () => void;\r\n}\r\n\r\ninterface FacetContextValue {\r\n\t/** The facet model returned from the server for this facet. */\r\n\tfacet: FacetModel;\r\n\r\n\t/** Returns the state of the parent facet container. */\r\n\tstate: FacetState;\r\n\r\n\t/** An actor interface to perform actions for this facet. */\r\n\tactor: FacetActor;\r\n\r\n\trenderer: FacetRenderer;\r\n}\r\n\r\nexport interface FacetState {\r\n\t/**\r\n\t * An array of facet values for this facet. If this facet has a quick lookup search bar, this list\r\n\t * will be filtered by this quick lookup.\r\n\t */\r\n\tfacetValues: Value[];\r\n\r\n\t/**\r\n\t * If the facet is configured for filtering, this is the user's entered filter value. Updated on\r\n\t * immediately when the user types.\r\n\t */\r\n\tfilter: string;\r\n\r\n\t/** Whether or not this facet has its values truncated. */\r\n\tisTruncated: boolean;\r\n\r\n\t/** Whether or not this facet is collapsed. */\r\n\tisCollapsed: boolean;\r\n\r\n\t/** If filter is enabled, contains the number of facets that are truncated. */\r\n\tremainingFacets: number;\r\n\r\n\t/** The number of digits displayed after the decimal points for numeric facet values. */\r\n\tdecimalPrecision: number;\r\n}\r\n\r\nexport interface FacetActor {\r\n\t/** Select the given facet value. */\r\n\tselectFacet(facetValue: Value | string): void;\r\n\r\n\t/** Selects and negates the given facet value. */\r\n\tnegateFacet(facetValue: Value | string): void;\r\n\r\n\t/** Sets the selected facet values by replacing existing selections for this facet. */\r\n\tsetFacets(facetValues: Value[] | string[]): void;\r\n\r\n\t/** Sets the filter for this facet container. */\r\n\tsetFilter(filter: string): void;\r\n\r\n\t/** Sets whether or not this facet is currently being truncated. */\r\n\tsetTruncated(truncated: boolean): void;\r\n\r\n\t/** Sets whether or not this facet is currently collapsed. */\r\n\tsetCollapsed(collapsed: boolean): void;\r\n}\r\n\r\nexport interface FacetRenderer {\r\n\t/**\r\n\t * Conditionally renders the default truncation UI (the \"Show More\"/\"Show Less\" buttons). Nothing will render\r\n\t * if the facet is configured to not be truncated.\r\n\t */\r\n\trenderTruncation();\r\n}\r\n\r\nfunction Facet({ facet, children, onFacetChange }: FacetProps) {\r\n\tconst { actor: searchActor } = useHawkSearch();\r\n\tconst wrapperRef = useRef(null);\r\n\tconst [filter, setFilter] = useState('');\r\n\tconst [isTruncated, setTruncated] = useState(facet.shouldTruncate);\r\n\tconst [isCollapsed, setCollapsed] = useState(facet.IsCollapsible && facet.IsCollapsedDefault);\r\n\tconst { t } = useTranslation();\r\n\r\n\tconst hasTooltip = !!facet.Tooltip;\r\n\r\n\tfunction selectFacet(facetValue: Value | string): void {\r\n\t\tsetFilter('');\r\n\t\tsearchActor.toggleFacetValue(facet, facetValue);\r\n\t\tonFacetChange();\r\n\t}\r\n\r\n\tfunction setFacets(values: Value[] | string[]): void {\r\n\t\tsetFilter('');\r\n\t\tsearchActor.setFacetValues(facet, values);\r\n\t\tonFacetChange();\r\n\t}\r\n\r\n\tfunction negateFacet(facetValue: Value | string): void {\r\n\t\tsetFilter('');\r\n\t\tsearchActor.toggleFacetValue(facet, facetValue, /* negate */ true);\r\n\t\tonFacetChange();\r\n\t}\r\n\r\n\tfunction renderTruncation() {\r\n\t\t// only show the toggle button if the facet is configured for truncation and we're not filtering\r\n\r\n\t\treturn (\r\n\t\t\t<>\r\n\t\t\t\t{facet.shouldTruncate && !filter && (\r\n\t\t\t\t\t\r\n\t\t\t\t)}\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n\t// TODO: sort facet values\r\n\tlet facetValues = facet.Values;\r\n\r\n\t// first, perform any filtering if enabled and a filter has been typed in\r\n\tif (facet.shouldSearch && filter) {\r\n\t\tfacetValues = facet.Values.filter((val) => {\r\n\t\t\tif (!val.Label) {\r\n\t\t\t\t// if a facet value doesn't have a label, we can't really filter down to it\r\n\t\t\t\t// so exclude it\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\treturn val.Label.toLowerCase().indexOf(filter.toLowerCase()) !== -1;\r\n\t\t});\r\n\t}\r\n\r\n\t// next, handle truncation\r\n\tlet remainingFacets = 0;\r\n\r\n\tif (facet.shouldTruncate && isTruncated) {\r\n\t\tconst valuesBeforeTrunc = facetValues.length;\r\n\r\n\t\tfacetValues = facetValues.slice(0, facet.TruncateThreshold);\r\n\r\n\t\tremainingFacets = valuesBeforeTrunc - facet.TruncateThreshold;\r\n\t}\r\n\r\n\tconst actor: FacetActor = {\r\n\t\tselectFacet,\r\n\t\tnegateFacet,\r\n\t\tsetFacets,\r\n\t\tsetFilter,\r\n\t\tsetTruncated,\r\n\t\tsetCollapsed,\r\n\t};\r\n\r\n\tconst state: FacetState = {\r\n\t\tfacetValues,\r\n\t\tfilter,\r\n\t\tisTruncated,\r\n\t\tisCollapsed,\r\n\t\tremainingFacets,\r\n\t\tdecimalPrecision: 2,\r\n\t};\r\n\r\n\tconst renderer: FacetRenderer = {\r\n\t\trenderTruncation,\r\n\t};\r\n\r\n\tfunction toggleCollapsible(event: MouseEvent) {\r\n\t\tif (wrapperRef.current && wrapperRef.current.contains(event.target as Node)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsetCollapsed(!isCollapsed);\r\n\t}\r\n\r\n\tfunction facetStyle(facet: FacetModel) {\r\n\t\tif (facet.DisplayType === 'scrolling' && facet.ScrollHeight) {\r\n\t\t\treturn {\r\n\t\t\t\theight: facet.ScrollHeight,\r\n\t\t\t\toverflowY: 'auto',\r\n\t\t\t} as React.CSSProperties;\r\n\t\t}\r\n\t\treturn {};\r\n\t}\r\n\r\n\treturn (\r\n\t\t}>\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t toggleCollapsible(event)}\r\n\t\t\t\t\t\t\taria-expanded={!isCollapsed}\r\n\t\t\t\t\t\t\taria-describedby={'hawk-facet-rail-facet-heading-' + facet.Name}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t

    {facet.Name}

    \r\n\r\n\t\t\t\t\t\t\t{isCollapsed ? (\r\n\t\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t\t{' '}\r\n\t\t\t\t\t\t\t\t\tExpand facet category{' '}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t\t{' '}\r\n\t\t\t\t\t\t\t\t\tCollapse facet category\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t{facet.Tooltip ? (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t
    \r\n\r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\tClicking this button will display a list of tabbable {facet.Name} values below. Tab down to\r\n\t\t\t\t\t\tinteract with them.\r\n\t\t\t\t\t
    \r\n\r\n\t\t\t\t\t{!isCollapsed && (\r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t{facet.shouldSearch && (\r\n\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t setFilter(e.currentTarget.value)}\r\n\t\t\t\t\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\t\t\t\t\tplaceholder={t('Quick Lookup')}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t\t{/* render listing component */}\r\n\t\t\t\t\t\t\t{children}\r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t)}\r\n\t\t\t\t
    \r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport function useFacet() {\r\n\treturn useContext(FacetContext);\r\n}\r\n\r\nexport default Facet;\r\n","import { RocEventType, RocEvent, ExtractEventParameters } from 'shared/events';\r\n\r\n/**\r\n * Helper function for handling ROC events from non React functions.\r\n * @param eventType The type of event to handle\r\n * @param eventHandler The event handler\r\n * @returns The callback function to remove this handler\r\n */\r\nexport default function addRocEventHandler(\r\n\teventType: T,\r\n\teventHandler: (data: ExtractEventParameters) => void,\r\n): () => void {\r\n\tconst handler = (evt: CustomEvent): void => {\r\n\t\teventHandler(evt.detail);\r\n\t};\r\n\r\n\tdocument.addEventListener(eventType, handler);\r\n\r\n\treturn () => document.removeEventListener(eventType, handler);\r\n}\r\n","/*eslint camelcase: \"off\"*/\r\nimport React, { useContext } from 'react';\r\n\r\nimport { HawkSearchConfig } from 'types/HawkSearchConfig';\r\n\r\nconst ConfigContext = React.createContext({} as ConfigContextValue);\r\n\r\ndeclare global {\r\n\tinterface Window {\r\n\t\t__webpack_public_path__: string;\r\n\t}\r\n}\r\n\r\nexport interface ConfigContextValue {\r\n\t/** Global configuration. */\r\n\tconfig: HawkSearchConfig;\r\n}\r\n\r\nexport interface ConfigProviderProps {\r\n\tconfig: HawkSearchConfig;\r\n\tchildren: React.ReactNode;\r\n}\r\n\r\nfunction ConfigProvider({ config, children }: ConfigProviderProps) {\r\n\tif (config.assetPath) {\r\n\t\tlet path = config.assetPath;\r\n\r\n\t\t// ensure the provided path both starts and ends with a slash\r\n\t\tif (!path.startsWith('/')) {\r\n\t\t\tpath = '/' + path;\r\n\t\t}\r\n\t\tif (!path.endsWith('/')) {\r\n\t\t\tpath = path + '/';\r\n\t\t}\r\n\r\n\t\t// allow consumers to tell webpack where to load code split/lazy loaded files from, as they may not be\r\n\t\t// hosting our JS from /assets/ (the default path)\r\n\t\t// eslint-disable-next-line\r\n\t\twindow.__webpack_public_path__ = path;\r\n\t}\r\n\r\n\treturn {children};\r\n}\r\n\r\nexport function useHawkConfig() {\r\n\tconst context = useContext(ConfigContext);\r\n\r\n\tif (!context.config) {\r\n\t\tthrow new Error(\r\n\t\t\t'No HawkSearchConfig is available, did you forget to wrap your components in a ConfigProvider component?',\r\n\t\t);\r\n\t}\r\n\r\n\treturn context;\r\n}\r\n\r\nexport default ConfigProvider;\r\n","import * as React from 'react';\r\n\r\ninterface DashCircleSVGProps {\r\n\tclass?: string;\r\n}\r\n\r\n/**\r\n * Dash circle SVG\r\n *\r\n * @returns\r\n */\r\nfunction DashCircleSVG(props: DashCircleSVGProps) {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default DashCircleSVG;\r\n","import { PricingResult } from './pricing-result';\r\n\r\n/**\r\n * Represents a display pricing service result containing all necessary details to render a set of product prices.\r\n */\r\nexport type DisplayPricingResult = PricingResult;\r\n\r\n/**\r\n * Represents a simple price intended to be rendered.\r\n * Comparisons and arithmetic between prices is illegal besides !== and ===.\r\n * This is not suitable for transactions and attempting to use this for transactions is erroneous.\r\n */\r\nexport type Price = string;\r\n\r\n/**\r\n * Represents an inclusive range of prices. It is erroneous for a price span no length (eg the\r\n * from and to field are the same), as this should be represented by a @see Price instead.\r\n *\r\n * PriceSpan is typically used for ambiguous ranges\r\n */\r\nexport type PriceSpan = {\r\n\t/**\r\n\t * The lower bound of the price. If this is associated with a group of products, this\r\n\t * is the price of the cheapest associated product.\r\n\t */\r\n\tfrom: Price;\r\n\r\n\t/**\r\n\t * The upper bound of the price. If this is associated with a group of products, this\r\n\t * is the price of the most expensive associated product.\r\n\t */\r\n\tto: Price;\r\n};\r\n\r\n/**\r\n * Represents a displayable price of unknown type.\r\n */\r\nexport type VariantPrice = Price | PriceSpan;\r\n\r\n/**\r\n * The display rules for rendering a price on the frontend.\r\n */\r\nexport enum PriceDisplayRule {\r\n\t/**\r\n\t * Represents a lack of a price. This is typically used for a product\r\n\t * that isn't purchaseable. Distinct from free.\r\n\t *\r\n\t * If a price is missing, it is illegal to use any display price type besides @see MissingPrice\r\n\t */\r\n\tMissing = 'Missing',\r\n\r\n\t/**\r\n\t * Represents a normal price or price range. Expected price types are @see PriceSpan and @see Price\r\n\t */\r\n\tNormal = 'Normal',\r\n\r\n\t/**\r\n\t * Represents a price without a clearly defined upperbound. This can happen if multiple products in a group product\r\n\t * do not share a common unit of measure. Expected price types are @see Price\r\n\t */\r\n\tAmbiguousRange = 'AmbiguousRange',\r\n}\r\n\r\n/**\r\n * Represents a pricing object that is guaranteed to have a base price\r\n */\r\nexport interface HasBasePrice {\r\n\t/** The price of the product if it isn't on sale. */\r\n\tbasePrice: PartialDisplayPrice;\r\n}\r\n\r\n/**\r\n * Represents a pricing object that is guaranteed to have a sale price\r\n */\r\nexport interface HasSalePrice {\r\n\t/** The sale price of the product. This is always less than the base price. */\r\n\tsalePrice: PartialDisplayPrice;\r\n}\r\n\r\n/**\r\n * Represents a pricing object that has no base price, that is, it cannot be purchased.\r\n */\r\nexport interface HasNoBasePrice {\r\n\t/** The item in question has no base price and as such, it is illegal to access it. */\r\n\tbasePrice?: never;\r\n}\r\n\r\n/**\r\n * Represents a pricing object that has no sale price\r\n */\r\nexport interface HasNoSalePrice {\r\n\t/** The item in question has no sale price and as such, it is illegal to access it. */\r\n\tsalePrice?: never;\r\n}\r\n\r\n/**\r\n * Represents a \"primitive\" price object that would be displayed.\r\n * A product that has a base price and a sale price would have two unit display prices for example.\r\n */\r\nexport type PartialDisplayPrice = TPrice extends Price\r\n\t? UnitPrice & HasRawValue\r\n\t: UnitPrice;\r\n\r\ninterface UnitPrice {\r\n\t/** The unit of measure of the item/product being sold. This is typically appended to a price to yield a value like \"$2.99/ea\" */\r\n\tunit?: { label: string };\r\n\r\n\t/** The price value to be displayed. */\r\n\tvalue: TPrice;\r\n\r\n\t// #region HCL - added availability to pass rawValue\r\n\trawValue?: number;\r\n\t// #endregion\r\n}\r\n\r\ninterface HasRawValue {\r\n\t/**\r\n\t * The raw price value for use in comparing prices to eachother or checking if they are zero or negative.\r\n\t * It is not safe to assume this value for display purposes or price calculations.\r\n\t */\r\n\trawValue: number;\r\n}\r\n\r\n/**\r\n * Constrains a VariantPrice to a more specific price type\r\n */\r\ntype Filter = T extends U ? T : never;\r\n\r\n/**\r\n * Represents a price object that can be displayed.\r\n */\r\nexport type DisplayPrice<\r\n\tTBasePrice extends VariantPrice = VariantPrice,\r\n\tTSalePrice extends VariantPrice = TBasePrice\r\n> =\r\n\t| SimpleDisplayPrice\r\n\t| AmbiguousDisplayPrice, Filter>\r\n\t| MissingDisplayPrice;\r\n\r\n/**\r\n * Represents a missing price, typically if used on an object not for a sale or an erroneous object.\r\n * This would either not be rendered or be rendered as \"Not For Sale\"\r\n */\r\nexport interface MissingDisplayPrice {\r\n\t/** The display rules for rendering a price on the frontend.\r\n\t *\r\n\t * A \"missing\" or \"invisible\" price is for a product that is not on sale and thus should not have\r\n\t * a price rendered on screen */\r\n\tdisplayRule: PriceDisplayRule.Missing;\r\n}\r\n\r\n/**\r\n * Represents a simple price, that is a price that might be on sale with fixed upper and lower bounds. The unit\r\n * of measure for the base and sale price (if present) is expected to be the same\r\n */\r\nexport interface SimpleDisplayPrice<\r\n\tTBasePrice extends VariantPrice = VariantPrice,\r\n\tTSalePrice extends VariantPrice = TBasePrice\r\n> extends HasBasePrice,\r\n\t\tPartial> {\r\n\t/** The display rules for rendering a price on the frontend.\r\n\t *\r\n\t * A normal price is either a simple price like \"$3.12/ea\" or a range like \"$2.00-$5.00/ea\"\r\n\t */\r\n\tdisplayRule: PriceDisplayRule.Normal;\r\n}\r\n\r\n/**\r\n * Represents a price without a predictable upperbound for the price. This would typically be used if a group of products\r\n * didn't have a common unit of measure.\r\n */\r\nexport interface AmbiguousDisplayPrice\r\n\textends HasBasePrice,\r\n\t\tPartial> {\r\n\t/** The display rules for rendering a price on the frontend.\r\n\t *\r\n\t * An ambiguous price doesn't have a a specifiable upperbound because there isn't a common unit of measure\r\n\t * to use as a baseline for what the most expensive unit of measure is. This is will appear like \"From $2.00\"\r\n\t */\r\n\tdisplayRule: PriceDisplayRule.AmbiguousRange;\r\n}\r\n","import type { Dialog, DialogContent } from '@reach/dialog';\r\nimport classnames from 'classnames';\r\nimport React from 'react';\r\nimport { Localizer } from 'services/Localizer';\r\nimport 'styles/node-modules/@reach/dialog/styles.css';\r\nimport Spinner from './Spinner';\r\nimport XSVG from './svg/XSVG';\r\n\r\nconst LazyDialog = React.lazy(() =>\r\n\timport('@reach/dialog').then((module) => ({ default: module.Dialog })),\r\n);\r\nconst LazyDialogContent = React.lazy(() =>\r\n\timport('@reach/dialog').then((module) => ({ default: module.DialogContent })),\r\n);\r\n\r\n// TODO: the types are currently out of date so they don't include the definition for dangerouslyBypassFocusLock. Add the types here once they are updated\r\n// https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/reach__dialog\r\nconst LazyDialogOverlay = React.lazy(() =>\r\n\timport('@reach/dialog').then((module) => ({ default: module.DialogOverlay } as any)),\r\n);\r\n\r\nexport type ModalSize = 'xs' | 'sm' | 'md' | 'lg' | 'xlg' | 'full_width';\r\n\r\ninterface ModalProps {\r\n\tisOpen: boolean;\r\n\thideCloseButton?: boolean;\r\n\tchildren: React.ReactNode;\r\n\ttitleIcon?: React.ReactNode;\r\n\tsize?: ModalSize;\r\n\theaderDivider?: boolean;\r\n\tbypassFocusLock?: boolean;\r\n\tsubTitle?: string;\r\n\tclassName?: string;\r\n\trenderActions?: () => React.ReactNode;\r\n\tcloseModal: () => void;\r\n\trenderTitle: () => React.ReactNode;\r\n\trenderSubtitle?: () => React.ReactNode;\r\n}\r\n\r\n/**\r\n * Reusuable modal component with raised open state, takes title and children as props.\r\n *\r\n * @export\r\n * @param {ModalProps} props\r\n * @returns\r\n */\r\nexport default function Modal(props: ModalProps) {\r\n\tconst {\r\n\t\tisOpen,\r\n\t\thideCloseButton,\r\n\t\tsize = 'md',\r\n\t\tcloseModal,\r\n\t\trenderTitle,\r\n\t\trenderSubtitle,\r\n\t\ttitleIcon,\r\n\t\trenderActions,\r\n\t\tchildren,\r\n\t\theaderDivider = false,\r\n\t\tbypassFocusLock = false,\r\n\t\tsubTitle,\r\n\t\tclassName,\r\n\t} = props;\r\n\r\n\tconst innerModal = (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{titleIcon && (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{titleIcon}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{renderTitle()}\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t{renderSubtitle && (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{renderSubtitle()}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\r\n\t\t\t\t\t{hideCloseButton ? null : (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t closeModal()}\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tdata-testid=\"close-modal-btn\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t{Localizer('Close')}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t)}\r\n\t\t\t\t\r\n\r\n\t\t\t\t{subTitle ? (\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{subTitle}\r\n\t\t\t\t\t

    \r\n\t\t\t\t) : null}\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\t{children}\r\n\t\t\t\r\n\t\t\t{renderActions ? (\r\n\t\t\t\t\r\n\t\t\t\t\t{renderActions()}\r\n\t\t\t\t\r\n\t\t\t) : null}\r\n\t\t\r\n\t);\r\n\r\n\tconst ariaLabel = Localizer('ModalLabel');\r\n\r\n\treturn bypassFocusLock ? (\r\n\t\t}>\r\n\t\t\t closeModal()}\r\n\t\t\t\tdangerouslyBypassFocusLock={bypassFocusLock}\r\n\t\t\t>\r\n\t\t\t\t\r\n\t\t\t\t\t{innerModal}\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t) : (\r\n\t\t}>\r\n\t\t\t closeModal()}\r\n\t\t\t\taria-label={ariaLabel}\r\n\t\t\t\tas={'div'}\r\n\t\t\t>\r\n\t\t\t\t{innerModal}\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n","import { DisplayPricingResult, Price, SimpleDisplayPrice } from 'shared-client/types/commerce/display-price';\r\nimport { UnitOfMass } from 'shared-client/types/commerce/product-details';\r\nimport { BreadcrumbItem } from 'shared/components/Breadcrumbs';\r\nimport { PartialDataLoaderOptions } from 'shared/data/usePartialDataLoader';\r\nimport { BasePartialDetailsState } from 'shared/types';\r\nimport { Asset } from 'shared/assets/types';\r\n\r\nexport function getInitialProductDetailsState(): ProductDetailsState {\r\n\treturn window.__ROC_COMMERCE_PRODUCT_DETAILS__ ?? {};\r\n}\r\n\r\ndeclare global {\r\n\tinterface Window {\r\n\t\t__ROC_COMMERCE_PRODUCT_DETAILS__: ProductDetailsState;\r\n\t}\r\n}\r\n\r\nexport interface ProductDetailsState extends BasePartialDetailsState {\r\n\tsummary: Summary;\r\n\r\n\tassets?: ProductAsset[] | null;\r\n\r\n\tavailability?: Availability | null;\r\n\r\n\tbrand?: Brand | null;\r\n\r\n\t/**\r\n\t * Represents the visible tabs for the current product\r\n\t */\r\n\ttabs?: TabViewChunk[];\r\n\r\n\tselections?: ProductDetailSelection[];\r\n\r\n\tchildren?: SimpleProduct[];\r\n\r\n\trelatedProducts?: RelatedProduct[];\r\n\r\n\treviewsSummary: ReviewSummaryDto;\r\n\r\n\t/**\r\n\t * The available pricing lines for the product as well as the selected pricing line state\r\n\t */\r\n\tpricingLines?: ProductPricingLinesDetails;\r\n\r\n\t/**\r\n\t * The pricing result tree containing renderable prices for the product.\r\n\t */\r\n\tdisplayPricing?: DisplayPricingResult;\r\n\r\n\tbreadcrumbPath?: BreadcrumbItem[];\r\n\r\n\t/**\r\n\t * Information about the available product add ons for the product, and for child products, if this is a group\r\n\t */\r\n\taddOns?: AddOnsPdpDto;\r\n\r\n\tisNewProduct: boolean;\r\n}\r\n\r\n/**\r\n * Single add on data.\r\n */\r\nexport interface ProductAddOnDto {\r\n\t/**\r\n\t * The id of the product add on.\r\n\t */\r\n\tvalue: string;\r\n\r\n\t/**\r\n\t * The name of the product add on.\r\n\t */\r\n\tlabel: string;\r\n\r\n\t/**\r\n\t * The SKU of the product add on.\r\n\t */\r\n\tsku: string;\r\n\r\n\t/**\r\n\t * The description of the product add on.\r\n\t */\r\n\tdescription: string;\r\n\r\n\t/**\r\n\t * Represents if the current add on is required to add a product to cart.\r\n\t */\r\n\trequired: boolean;\r\n\r\n\t/**\r\n\t * Represents if the current add on is selected\r\n\t */\r\n\tselected: boolean;\r\n\r\n\t/**\r\n\t * Represents if the current add on is updated\r\n\t */\r\n\tisModified: boolean;\r\n\r\n\t/**\r\n\t * Represents the add on attributes\r\n\t */\r\n\tattributes: AddOnAttributeDto[];\r\n\r\n\t/**\r\n\t * The add on main image thumbnail.\r\n\t */\r\n\tthumbnailUrl: string;\r\n\r\n\t/**\r\n\t * The add on main image alt text.\r\n\t */\r\n\taltText: string;\r\n\r\n\t/**\r\n\t * The displayable price of a single unit of this line item.\r\n\t */\r\n\tunitPrice?: SimpleDisplayPrice;\r\n}\r\n\r\n/**\r\n * Product add on single attribute data\r\n */\r\nexport interface AddOnAttributeDto {\r\n\t/**\r\n\t * Product add on attribute id\r\n\t */\r\n\tvalue: string;\r\n\r\n\t/**\r\n\t * Product add on attribute name\r\n\t */\r\n\tlabel: string;\r\n\r\n\t/**\r\n\t * Represents if the add on attribute value is required\r\n\t */\r\n\trequired: boolean;\r\n\r\n\t/**\r\n\t * Product add on attribute instruction\r\n\t */\r\n\tinstructions: string;\r\n\r\n\t/**\r\n\t * Product add on attribute input type\r\n\t */\r\n\tinputAttributeType: InputAttributeType | null;\r\n\r\n\t/**\r\n\t * The maximum length constraint for the add on attribute value\r\n\t */\r\n\tmaximumLength: number | null;\r\n\r\n\t/**\r\n\t * The minimum length constraint for the add on attribute value\r\n\t */\r\n\tminimumLength: number | null;\r\n\r\n\t/**\r\n\t * The maximum number of line constraint for the add on attribute value\r\n\t * used for multiline attributes\r\n\t */\r\n\tmaximumNumberOfLines: number | null;\r\n\r\n\t/**\r\n\t * The default value of the add on attribute value\r\n\t */\r\n\tdefaultValue: string;\r\n\r\n\t/**\r\n\t * The entered value for the current attribute\r\n\t */\r\n\tdata: string;\r\n\r\n\t/**\r\n\t * The add on attribute selectable values\r\n\t */\r\n\tvalues: AttributeValueDto[];\r\n}\r\n\r\n/**\r\n * The add on attribute input type\r\n */\r\nexport enum InputAttributeType {\r\n\tSingle = 'Single',\r\n\tMultiline = 'Multiline',\r\n}\r\n\r\n/**\r\n * Single add on attribute selectable value\r\n */\r\nexport interface AttributeValueDto {\r\n\t/**\r\n\t * The add on attribute selectable value id\r\n\t */\r\n\tvalue: string;\r\n\r\n\t/**\r\n\t * The add on attribute selectable value label\r\n\t */\r\n\tlabel: string;\r\n\r\n\t/**\r\n\t * Represents if the current selectable value is selected\r\n\t */\r\n\tselected: boolean;\r\n}\r\n\r\nexport interface Summary {\r\n\tname: string;\r\n\ttype: ProductType;\r\n\tsku?: string;\r\n\tmanufacturerPartNumber?: string;\r\n\tproductUrl: string;\r\n\tdescription?: string;\r\n\tmeta?: Meta;\r\n\tproductGroupId: string | null;\r\n\t/**\r\n\t * \tFlag defining if the current product should use the alternate product details.\r\n\t */\r\n\tuseAlternateProductDetails?: boolean;\r\n\t// #region HCL\r\n\tproductGroupName?: string;\r\n\t// #endregion\r\n}\r\n\r\nexport interface Meta {\r\n\turl: string;\r\n\tpageTitle?: string;\r\n\tmetaKeywords?: string;\r\n\tmetaDescription?: string;\r\n\tnoIndex: boolean;\r\n\tnoFollow: boolean;\r\n}\r\n\r\nexport interface Availability {\r\n\tbackOrder: boolean;\r\n\toutOfStock: boolean;\r\n\t// #region HCL\r\n\tcallForAvailability: boolean;\r\n\t// #endregion\r\n}\r\n\r\n/**\r\n * Product Review Summary DTO\r\n */\r\nexport interface ReviewSummaryDto {\r\n\t/**\r\n\t * The average rating of the product. If undefined, the product has no reviews with ratings.\r\n\t */\r\n\taverageRating?: number;\r\n\r\n\t/**\r\n\t * The number of public reviews for the product\r\n\t */\r\n\treviewCount: number;\r\n}\r\n\r\nexport interface ProductAsset extends Asset {\r\n\t/**\r\n\t * The alternate text associated with the image\r\n\t */\r\n\taltText: string;\r\n\t/**\r\n\t * The main image URL\r\n\t */\r\n\tmainImageUrl: string;\r\n\t/**\r\n\t * The thumbnail URL\r\n\t */\r\n\tthumbnailUrl: string;\r\n\t/**\r\n\t * The enlarged image URL\r\n\t */\r\n\tenlargedImageUrl: string;\r\n\t/**\r\n\t * The sort order for this image\r\n\t */\r\n\tsortOrder: number;\r\n\t/**\r\n\t * Embedded URL for external media asset\r\n\t */\r\n\tembeddedUrl: string;\r\n}\r\n\r\nexport interface Brand {\r\n\tname: string;\r\n\tlogoUrl: string | null;\r\n}\r\n\r\nexport interface TabViewChunk {\r\n\ttab: Tab;\r\n\tmodel: T;\r\n\trawHtml?: string;\r\n}\r\n\r\nexport interface Tab {\r\n\tid: string;\r\n\tdisplayName: string;\r\n\ttabType: string;\r\n\tsortOrder: number;\r\n\tname: string;\r\n}\r\n\r\nexport interface TabViewModel {\r\n\tviewName: string;\r\n\tmodel: T;\r\n}\r\n\r\nexport interface ProductDetailSelection {\r\n\tlabel: string;\r\n\tvalues: SelectionValue[];\r\n\r\n\t/**\r\n\t * The selected attribute field name used for adding info to hawk context\r\n\t */\r\n\tfield: string;\r\n}\r\n\r\n/**\r\n * Represents a simple selection DTO object\r\n */\r\nexport interface SimpleSelectionDto {\r\n\t/**\r\n\t * The Code of the product attribute\r\n\t */\r\n\tid: string;\r\n\r\n\t/**\r\n\t * The Name of the product attribute\r\n\t */\r\n\tname: string;\r\n\r\n\t/**\r\n\t * The Id of the attribute value\r\n\t */\r\n\tvalue: string;\r\n\r\n\t/**\r\n\t * The Name of the attribute value\r\n\t */\r\n\tlabel: string;\r\n\r\n\t/**\r\n\t * The selected attribute field name used for adding info to hawk context\r\n\t */\r\n\tfield: string;\r\n}\r\n\r\nexport interface SelectionValue {\r\n\tvalue: string;\r\n\tlabel: string;\r\n\tvalid: boolean;\r\n\tchecked: boolean;\r\n\t// #region HCL\r\n\tswatchUrl: string;\r\n\t// #endregion\r\n}\r\n\r\nexport interface SimpleProduct {\r\n\tid: string;\r\n\tname: string;\r\n\t//#region HCL\r\n\tsku: string;\r\n\t//#endregion\r\n\tselections: string[];\r\n}\r\n\r\nexport interface RelatedProduct {\r\n\tid: string;\r\n\tname: string;\r\n\tdescription: string | null;\r\n\turl: string;\r\n\tmainImage: ProductAsset | null;\r\n}\r\n\r\nexport interface ProductSelectionDispatcherDto {\r\n\tproductId: string;\r\n\tproductDetails: ProductDetailsState;\r\n}\r\n\r\nexport interface AddOnsPdpDto {\r\n\t/**\r\n\t * The list of available product add-ons for the product.\r\n\t */\r\n\tproductAddOnData?: ProductAddOnDto[];\r\n\t/**\r\n\t * A list of add-ons available for child products, if this is a group product\r\n\t */\r\n\tavailableChildProductAddOns?: string[];\r\n}\r\n\r\n/*\r\n\tShirt Size: Small, Large\r\n\tColor: Red, Green\r\n\r\n\tScenario #1: All selections match\r\n\r\n\tValid selections:\r\n\tSmall, Red\r\n\tSmall, Green\r\n\tLarge, Red\r\n\tLarge, Green\r\n\r\n\t1. Pick Size\r\n\t2. Pick Color\r\n\t3. Find match and load child\r\n\r\n\tScenario #2: Selections mismatch\r\n\r\n\tValid selections:\r\n\tSmall, Red\r\n\tSmall, Green\r\n\tLarge, Red\r\n\r\n\t1. Pick Size (Small/Large)\r\n\t2. if Large, mark green as invalid\r\n\t3. if Small, show all colors\r\n\t4. Find match and load child\r\n\r\n\tScenario #3: Selections mismatch 2\r\n\r\n\tValid selections:\r\n\tSmall, Red\r\n\tSmall, Green\r\n\tLarge, Red\r\n\r\n\t1. Pick Green, mark large as invalid\r\n\t2. Pick Size\r\n\t3. Find match and load child\r\n\r\n\tScenario #4: Selections mismatch 3\r\n\r\n\tValid selections:\r\n\tSmall, Red\r\n\tSmall, Green\r\n\tLarge, Red\r\n\r\n\t1. Pick Green, mark large as invalid\r\n\t2. Pick Large anyway, remove color selection\r\n\t3. ...\r\n\t4. Find match and load child\r\n\r\n*/\r\n\r\n/**\r\n * All available product types\r\n *\r\n * @export\r\n */\r\nexport enum ProductType {\r\n\tSimple = 'Simple',\r\n\tGroup = 'Group',\r\n\tKit = 'Kit',\r\n\tGiftCard = 'GiftCard',\r\n}\r\n\r\nexport type ProductPartialDataLoaderOptions = Pick<\r\n\tPartialDataLoaderOptions,\r\n\t'initialState' | 'dataLoaderFn'\r\n>;\r\n\r\nexport interface ProductSelection {\r\n\t/**\r\n\t * The code of the product attribute\r\n\t */\r\n\tid: string;\r\n\t/**\r\n\t * The name of the product attribute\r\n\t */\r\n\tname: string;\r\n\t/**\r\n\t * The attribute value name (if available), otherwise attribute value value\r\n\t */\r\n\tlabel: string;\r\n\t/**\r\n\t * The id (Guid) of the attribute value\r\n\t */\r\n\tvalue: string;\r\n\r\n\t/**\r\n\t * The selected attribute field name used for adding info to hawk context\r\n\t */\r\n\tfield: string;\r\n}\r\n\r\n/**\r\n * Base unit of measure\r\n */\r\nexport interface UnitOfMeasure {\r\n\tname: string;\r\n\tdisplayName: string;\r\n}\r\n\r\n/**\r\n * Represents a single pricing line for a product (one of potentially many choices for purchasing a product)\r\n */\r\nexport type ProductPricingLine = {\r\n\t/**\r\n\t * The pricing line's id\r\n\t */\r\n\tid: string;\r\n\r\n\t/**\r\n\t *\r\n\t * Unit of measure id\r\n\t */\r\n\tunitOfMeasureId: string;\r\n\r\n\t/**\r\n\t * Base Unit of measure\r\n\t */\r\n\tunitOfMeasure: UnitOfMeasure;\r\n\r\n\t/**\r\n\t * The unit's of measure display name\r\n\t */\r\n\tlabel: string;\r\n\r\n\t/**\r\n\t * The unit's of measure quantity\r\n\t */\r\n\tquantity: number;\r\n\r\n\t/**\r\n\t * If this pricing line isn't available for purchase, this will contain a string-localizer-key explaining the reason why.\r\n\t */\r\n\tunavailabilityReason: string | undefined;\r\n} & MassPricingLineOptions;\r\n\r\ntype MassPricingLineOptions =\r\n\t| {\r\n\t\t\t/**\r\n\t\t\t * The unit's of measure weight unit\r\n\t\t\t */\r\n\t\t\tunitOfMass: UnitOfMass;\r\n\r\n\t\t\t/**\r\n\t\t\t * The unit's of measure weight\r\n\t\t\t */\r\n\t\t\tweight: number;\r\n\t }\r\n\t| {\r\n\t\t\tunitOfMass?: never;\r\n\t\t\tweight?: never;\r\n\t };\r\n\r\n/**\r\n * Represents state details pricing lines and pricing line selections for a product on a product details page.\r\n */\r\nexport interface ProductPricingLinesDetails {\r\n\t/**\r\n\t * The selected pricing lines\r\n\t */\r\n\tselected?: ProductPricingLine;\r\n\t/**\r\n\t * The array of available pricing lines\r\n\t */\r\n\tavailable: ProductPricingLine[];\r\n}\r\n\r\n/**\r\n * Reason that the exception was thrown when adding an item to the cart\r\n */\r\nexport enum AddToCartExceptionCode {\r\n\tgeneric = 'Generic',\r\n\tcartFull = 'CartFull',\r\n\tproductUnavailable = 'ProductUnavailable',\r\n\tproductOutOfStock = 'ProductOutOfStock',\r\n}\r\n\r\n/**\r\n * Interface used as request for getting bulk products partial data\r\n */\r\nexport interface BaseBulkPartialProductsDataOptions {\r\n\tproductIds: string[] | undefined;\r\n\tmissingKeys: Array;\r\n}\r\n","import React from 'react';\r\nimport { ControllerStateAndHelpers } from 'downshift';\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport SearchBoxBase from 'components/ui/SearchBox/SearchBoxBase';\r\nimport { Product } from 'models/Autocomplete';\r\n\r\n/**\r\n * This component is the search input box (with autosuggest) that should be utilized on search pages. For a simple\r\n * search input box that is meant to be used on non-search pages (or globally), see `GlobalSearchBox`.\r\n */\r\nfunction SearchBox() {\r\n\tconst { store, actor } = useHawkSearch();\r\n\r\n\tfunction handleSubmit(keywords: string) {\r\n\t\tconst request = {\r\n\t\t\tPageId: undefined,\r\n\t\t\tPageNo: undefined,\r\n\t\t\tCustomUrl: undefined,\r\n\t\t\tKeyword: keywords,\r\n\t\t\tFacetSelections: undefined,\r\n\t\t};\r\n\r\n\t\tactor.setSearch(request);\r\n\t}\r\n\r\n\t// On Select view all matches from suggestion list\r\n\tfunction handleViewAllMatches(downshift: ControllerStateAndHelpers) {\r\n\t\tconst { inputValue, closeMenu } = downshift;\r\n\r\n\t\tconst request = {\r\n\t\t\tPageId: undefined,\r\n\t\t\tPageNo: undefined,\r\n\t\t\tCustomUrl: undefined,\r\n\t\t\tKeyword: inputValue ?? '',\r\n\t\t};\r\n\r\n\t\tactor.setSearch(request);\r\n\t\tcloseMenu();\r\n\t}\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t\r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default SearchBox;\r\n","import { useEffect } from 'react';\r\nimport { useHawkSearch } from 'shared/components/hawksearch/components/StoreProvider';\r\n\r\ndeclare global {\r\n\tinterface Window {\r\n\t\t/**\r\n\t\t * The Tracking Id that was returned in the search response, undefined if no search has been performed\r\n\t\t */\r\n\t\tHawkSearchTrackingId?: string;\r\n\t}\r\n}\r\n\r\n/**\r\n * SearchResultListener component listens for the changes\r\n * in store for search results and whenever there is a change it sets\r\n * a session key of \"canGoBack\" to true and populates TrackingId of the last search\r\n * as a global \"HawkSearchTrackingId\" variable\r\n */\r\nfunction SearchResultListener() {\r\n\tconst { store } = useHawkSearch();\r\n\r\n\tuseEffect(() => {\r\n\t\tsessionStorage.setItem('canGoBack', 'true');\r\n\t\t// updating HawkSearchTrackingId that is used by hawksearch tracker to report product clicks from search page\r\n\t\twindow.HawkSearchTrackingId = store.searchResults?.TrackingId;\r\n\t}, [store.searchResults]);\r\n\r\n\treturn null;\r\n}\r\n\r\nexport default SearchResultListener;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport 'rheostat/initialize';\r\nimport 'shared/components/hawksearch/styles/app.scss';\r\nimport HawkSearch from 'shared/components/hawksearch/components/HawkSearch';\r\nimport QueryStringListener from 'shared/components/hawksearch/components/QueryStringListener';\r\nimport SearchBox from 'shared/components/hawksearch/components/ui/SearchBox/SearchBox';\r\nimport { parseLocation } from 'shared/components/hawksearch/util/QueryString';\r\nimport hawkConfig from './RocHawkConfig';\r\nimport GlobalSearchBox from 'shared/components/hawksearch/components/ui/SearchBox/GlobalSearchBox';\r\nimport { initReactApp } from 'shared/util/ApplicationInit';\r\nimport SearchResultListener from './SearchResultListener';\r\nimport VisuallyHiddenAnnouncement from 'shared/components/VisuallyHiddenAnnouncement';\r\nimport FacetsAndResults from './FacetsAndResults';\r\n\r\n// pull the initial search from location\r\nconst searchRequest = parseLocation(location);\r\n\r\nfunction SearchBoxPortal() {\r\n\tconst searchBoxDom = document.getElementById('searchbox');\r\n\tif (!searchBoxDom) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\t// Use the global search box on landing pages.\r\n\tconst searchBoxComponent = searchRequest.CustomUrl ? : ;\r\n\treturn ReactDOM.createPortal(searchBoxComponent, searchBoxDom);\r\n}\r\n\r\nfunction App() {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t
    \r\n\t\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n}\r\n\r\nconst render = initReactApp(() => , 'search-results');\r\n\r\nrender();\r\n"],"sourceRoot":""}