{"version":3,"sources":["webpack:///./ClientApp/services/Localizer.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/components/svg/DownChevronSVG.tsx","webpack:///./ClientApp/shared/components/svg/UpChevronSVG.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ConfigProvider.tsx","webpack:///./ClientApp/shared/assets/LazyImage.tsx","webpack:///./ClientApp/shared/polyfills/customEvent.js","webpack:///./ClientApp/features/search/RocHawkConfig.ts","webpack:///./ClientApp/features/tracking/trackers/commerce/hawksearch/tracking-commerce.ts","webpack:///./ClientApp/shared/hooks/useInViewOnce.ts","webpack:///./ClientApp/styles/node-modules/@reach/dialog/styles.css?d0c1","webpack:///./ClientApp/styles/node-modules/@reach/dialog/styles.css","webpack:///./ClientApp/shared/components/svg/QuestionMarkCircleSVG.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/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/store/HawkState.ts","webpack:///./ClientApp/shared/components/hawksearch/util/SearchTracking.ts","webpack:///./ClientApp/shared/components/hawksearch/util/MergableState.ts","webpack:///./ClientApp/shared/components/Spinner.tsx","webpack:///./ClientApp/shared/components/hawksearch/net/HawkClient.ts","webpack:///./ClientApp/shared/components/svg/MagnifyingGlassSVG.tsx","webpack:///./ClientApp/shared/components/VisuallyHiddenAnnouncementContext.tsx","webpack:///./ClientApp/services/AxiosHelper.ts","webpack:///./ClientApp/shared/components/VisuallyHiddenAnnouncement.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/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/hawksearch/components/ui/SearchBox/GlobalSearchBox.tsx","webpack:///./ClientApp/shared/edit/InlineAlert.tsx","webpack:///./ClientApp/shared/components/svg/XSVG.tsx","webpack:///./ClientApp/services/UserData.ts","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/util/AccountUrls.ts","webpack:///./ClientApp/shared/hooks/useRocEventHandler.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/svg/XCircleSVG.tsx","webpack:///./ClientApp/shared/util/ErrorBoundary.tsx","webpack:///./ClientApp/shared/polyfills/getAttributeNames.js","webpack:///./ClientApp/shared/util/ApplicationInit.tsx","webpack:///./ClientApp/shared/hooks/useDelayedDisplay.tsx","webpack:///./ClientApp/features/tracking/trackers/hawksearch/tracking.ts","webpack:///./ClientApp/shared/util/events/rocEventUtils.ts","webpack:///./ClientApp/shared/components/hawksearch/components/svg/DashCircleSVG.tsx","webpack:///./ClientApp/shared/components/commerce/ProductPricing.tsx","webpack:///./ClientApp/shared/components/hawksearch/helpers/Cookies.ts","webpack:///./ClientApp/shared/components/hawksearch/components/HawkSearch.tsx","webpack:///./ClientApp/shared/components/hawksearch/util/History.ts","webpack:///./ClientApp/shared/components/hawksearch/util/QueryString.ts","webpack:///./ClientApp/shared/components/hawksearch/components/QueryStringListener.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/SearchBox/SearchBox.tsx","webpack:///./ClientApp/features/search/SearchResultListener.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/Tools/Sorting.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/ToolRow.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/PlaceholderImage.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/PlaceholderItem.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/ResultImage.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/ResultItem.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Results/ResultListing.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/shared/components/hawksearch/components/compare-items/CompareItemsTable.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/hawksearch/components/ui/Results/Results.tsx","webpack:///./ClientApp/features/search/components/DefaultResultItem.tsx","webpack:///./ClientApp/features/search/components/commerce/ProductResultItem.tsx","webpack:///./ClientApp/features/search/components/RocResultItem.tsx","webpack:///./ClientApp/features/search/FacetsAndResults.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Spinner.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Merchandising/CategoryLandingBanner.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/ui/Merchandising/Banner.tsx","webpack:///./ClientApp/features/search/SearchResults.tsx","webpack:///./ClientApp/shared/components/hawksearch/components/StoreProvider.tsx","webpack:///./ClientApp/services/ServerData.ts","webpack:///../Roc.SharedClientApp/types/commerce/display-price.ts","webpack:///./ClientApp/util/StringUtil.ts","webpack:///./ClientApp/shared/components/Modal.tsx","webpack:///./ClientApp/shared/components/hawksearch/util/Constants.ts","webpack:///./ClientApp/shared/components/hawksearch/store/Store.ts","webpack:///./ClientApp/shared/components/hawksearch/models/Autocomplete/Suggestion.ts"],"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","PlusThinSVG","viewBox","className","class","focusable","aria-hidden","d","MinusThinSVG","LazyTooltip","React","lazy","FacetContext","createContext","useFacet","useContext","Facet","facet","children","onFacetChange","searchActor","useHawkSearch","actor","wrapperRef","useRef","useState","filter","setFilter","shouldTruncate","isTruncated","setTruncated","IsCollapsible","IsCollapsedDefault","isCollapsed","setCollapsed","t","useTranslation","hasTooltip","Tooltip","facetValues","Values","shouldSearch","val","Label","toLowerCase","indexOf","remainingFacets","valuesBeforeTrunc","slice","TruncateThreshold","selectFacet","facetValue","toggleFacetValue","negateFacet","setFacets","values","setFacetValues","state","decimalPrecision","renderer","renderTruncation","onClick","Suspense","fallback","Spinner","Provider","value","classnames","type","event","current","contains","target","toggleCollapsible","aria-expanded","aria-describedby","Name","label","as","aria-label","QuestionMarkCircleSVG","id","style","DisplayType","ScrollHeight","height","overflowY","facetStyle","onChange","e","currentTarget","placeholder","DownChevronSVG","rest","UpChevronSVG","ConfigContext","useHawkConfig","context","config","Error","ConfigProvider","assetPath","path","startsWith","endsWith","__webpack_public_path__","LazyImage","placeholderImg","src","alt","backgroundImg","delay","inactiveClassName","loadedClassName","useInViewOnce","threshold","ref","viewed","loadedClassDisplayed","setLoadedClassDisplayed","useEffect","setTimeout","imageSrc","classes","backgroundImage","CustomEvent","params","bubbles","cancelable","detail","undefined","evt","document","createEvent","initCustomEvent","prototype","Event","searchState","__ROC_SEARCH_STATE__","RocHawkConfig","apiUrl","searchEndpoint","clientGuid","trackingKey","searchPageUrl","dashboardUrl","Constants","searchBoxPlaceholder","trackingUrl","recommendationUrl","recommendationEndpoint","organizationId","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","Value","trackRate","makeIterator","options","inViewHookResponse","useInView","setViewed","inView","newResponse","Symbol","iterator","api","content","__esModule","default","module","i","exports","locals","___CSS_LOADER_API_IMPORT___","push","stroke","strokeWidth","fill","fillRule","transform","Category","init","SuggestionType","assign","Suggestion","CategoryStrategy","item","downshift","location","Url","Product","Results","Result","ProductStrategy","ProductName","Content","ContentStrategy","Popular","PopularStrategy","Response","this","Categories","map","r","Products","Pagination","Items","PaginationItem","field","Document","Sorting","SortingItem","Selections","selFacet","SelectionFacet","SelectionFacetValue","Swatch","Range","SwatchData","s","Ranges","v","IsSearch","SearchThreshold","ParamName","Field","RuleType","RuleOperatorType","Rule","Parent","Rules","BannerTrigger","FeaturedItems","FeaturedItem","Merchandising","MerchandisingItem","PageContentItem","Trigger","PageContent","Facets","f","p","ContentType","CompareValueType","setSearchTracking","request","response","isLandingPage","CustomUrl","searchType","FacetSelections","MaxPerPage","PageNo","SearchType","Refinement","Initial","dispatchRocEvent","trackingId","TrackingId","useHawkState","initialSearch","initialValue","typeConstructor","setState","client","HawkClient","pendingSearch","Keyword","SearchStore","isLoading","itemsToCompare","comparedResults","itemsToCompareIds","prevState","newState","store","setStore","cancellationToken","getComparedItems","search","searchResults","searchParams","IsInPreview","isInPreview","ClientGuid","indexName","IndexName","keyword","query","Query","Success","axios","isCancel","error","requestError","setSearch","doHistory","setSearchSelections","selections","searchWithin","SearchWithin","cts","CancelToken","source","token","cancel","negate","facetName","facetField","selectionField","valueValue","valueLabel","facetSelections","isFacetSelected","selState","selectionIndex","FacetSelectionState","Selected","Negated","splice","clearFacet","clearFacetValue","NotSelected","clearAllFacets","setItemsToCompare","resultItem","isCheck","itemsArray","DocId","setComparedResults","data","clearItemsToCompare","getCompareFieldValue","compareItem","fieldName","compareType","find","MultipleValueDecimal","parsedValues","rawValue","parseFloat","toFixed","toString","join","SingleValueString","MultipleValueString","light","waitMs","align","block","parentCentered","useDelayedDisplay","spinner","baseUrl","searchUrl","autocompleteUrl","recommendationWidgetUrl","compareItemsURL","post","URL","href","cancelToken","result","MagnifyingGlassSVG","AxiosHelper","create","defaults","headers","common","interceptors","use","method","getCsrfToken","csrfToken","RequestVerificationToken","addUnauthorizedAccessInterceptor","history","status","AccountUrls","Login","encodeURIComponent","pathname","Promise","reject","VisuallyHiddenAnnouncement","alert","setAlert","mainRef","setMainRef","role","aria-live","aria-atomic","CheckmarkSVG","PlusCircleSVG","Checkbox","renderCheckMark","isSelected","renderFacetActions","isNegated","DashCircleSVG","FieldType","correspondingRange","c","rangeValueAssetUrl","AssetFullUrl","selectionState","aria-pressed","title","textDecoration","Count","Search","hawkActor","input","setInput","searchInputRef","labelFor","FacetId","htmlFor","onKeyDown","name","Link","LazyNumberFormat","SliderNumericInputs","sliderProps","minValue","setMinValue","maxValue","setMaxValue","reloadFacets","onValueChange","Number","thousandSeparator","isCurrency","prefix","currencySymbol","min","max","newMinValue","isNaN","onBlur","decimalScale","newMaxValue","Rheostat","Slider","range","Math","floor","RangeMin","rangeMin","setMinRange","ceil","RangeMax","rangeMax","setMaxRange","RangeStart","rangeStart","setStartRange","RangeEnd","rangeEnd","setEndRange","IsCurrency","setIsCurrency","CurrencySymbol","setCurrencySymbol","paramName","items","selectedValues","split","newRange","minVal","maxVal","selection","currentMinValue","currentMaxValue","SwatchItem","swatchValue","swatchUrl","suffix","facetSwatch","AssetUrl","AssetName","test","substring","getSwatchUrl","colorSwatchStyle","backgroundColor","Color","listItemClassNames","onSwatchSelected","isColor","NestedItem","isExpanded","setIsExpanded","setIsTruncated","hierarchyValue","hierarchyChildren","Children","remainingValues","shouldTruncateChildren","onValueSelected","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","SearchSuggestionsList","onViewMatches","popular","categories","products","PopularHeading","CategoryHeading","ProductHeading","ContentHeading","getItemProps","getMenuProps","highlightedIndex","isRecordEmpty","hasPopular","hasCategories","hasProducts","hasContent","hasAllEmpty","isAtleastOneExist","getAtleastOneExist","dynamicIndex","suggestType","TopProductMatches","itemName","url","Thumb","ViewAll","SearchSuggestions","results","setResults","setIsLoading","autocomplete","DisplayFullResponse","then","o","debounceMs","autocompleteDebounce","timeout","doAutocomplete","clearTimeout","Downshift","SearchBoxBase","onSubmit","strategies","autocompleteStrategies","stateReducer","changes","inputValue","itemToString","matchedStrategy","handleToString","handleItemChange","initialInputValue","isOpen","getInputProps","openMenu","showSuggestions","getLabelProps","onFocus","GlobalSearchBox","redirectToSearchPage","keywords","redirect","InlineAlert","defaultProps","theme","isTitleOnOwnRow","onCollapse","message","axiosError","isAxiosError","XSVG","userDataPromise","getUserData","get","getUserDataNoCache","userData","requestToken","BaseUrl","ServerData","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","eventType","dispatchEvent","useRocEventHandler","eventHandler","deps","removeHandlerCallback","addRocEventHandler","XCircleSVG","ErrorBoundary","renderError","Component","renderProps","Element","getAttributeNames","attributes","getDataPropsFromAttributes","element","attributeName","toCamelCase","getAttribute","initReactApp","getReactElement","elementId","getElementById","ReactDOM","render","initReactAppByAttribute","attribute","elements","querySelectorAll","display","setDisplay","EventTrackingType","PageType","SuggestType","createGuid","substr","random","btoa","JSON","stringify","HawkSearch","TrackingUrl","visitId","getCookie","visitorId","isNewVisitor","setCookie","Date","setTime","getTime","toUTCString","getVisitorExpiry","VisitId","VisitorId","TrackingProperties","Context","CustomDictionary","CustomContext","catch","initCustomEvents","readyState","addEventListener","ContextDictionary","remove","hasOwnProperty","existingValue","add","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","itemIndex","requestId","recommendationClick","ItemIndex","RequestId","WidgetGuid","trackRecommendationClick","handler","removeEventListener","ProductPricing","displayPrice","inline","testId","renderResult","css","priceClass","base","normalPrice","crossedOutPrice","highlightedPrice","GetCssClasses","displayRule","PriceDisplayRule","Missing","Normal","basePriceClass","salePrice","VariantPriceComponent","basePrice","renderNormalPrice","AmbiguousRange","FormatAmbiguousPriceSpan","unitName","unit","renderAmbiguousPrice","FormatPrice","FormatPriceSpan","priceRange","from","to","getVisitExpiry","nameEQ","ca","cookie","charAt","expiry","expires","StoreProvider","createBrowserHistory","parseQueryStringToObject","URLSearchParams","parsed","multipleValues","x","parseSearchQueryString","queryObj","sort","pg","mpp","lp","PageId","lpurl","is100Coverage","pageId","SortBy","Is100CoverageTurnedOn","Boolean","isPathLandingPage","getSearchQueryString","searchRequest","queryStringValues","escapedValues","unescapedValue","convertObjectToQueryString","String","doSearch","QueryStringListener","unlisten","listen","SearchBox","closeMenu","SearchResultListener","sessionStorage","setItem","HawkSearchTrackingId","PlaceholderFacetValue","width","round","PlaceholderFacet","numValues","_","clearSelection","negation","displayValue","selectedRange","displayValueRange","renderRange","PlusSVG","useWindowSize","windowSize","setWindowSize","executeResizeDebounced","debounce","innerWidth","innerHeight","handleResize","FacetList","scrollToResults","isFacetsOpen","setIsFacetsOpen","size","numPlaceholders","closeFacets","body","classList","onFacetChanged","components","facetOverrides","isNoSelections","isNoHawkFacets","isMobile","IsVisible","registeredComponent","LeftChevronSVG","RightChevronSVG","Pager","page","totalPages","onPageChange","setInputValue","hasError","setHasError","goToPage","pageNo","doInputError","prevSearchParams","set","nextSearchParams","preventDefault","parseInt","ItemsPerPage","onChangeAndBlur","paginationItem","PageSize","NofPages","sortingItem","ToolRow","PlaceholderImage","showSpinner","PlaceholderItem","OptionalAnchor","ResultImage","imageUrl","getDocumentValue","hasImage","setHasImage","imageLoaded","setImageLoaded","overflow","onLoad","onError","ResultItem","productId","productName","productGroupId","ResultListing","ResultComponent","SearchResultsLabel","PlugSVG","svgProps","NoResults","CompareItemsTable","CompareTableHeaders","compareItems","CompareTableBody","itemHeaders","setItemHeaders","imageAltTag","docId","COMPARE_KEYS","compareFields","setCompareFields","compareValues","setCompareValues","distinctFields","valuesResult","valuesItem","fieldItem","Compare","includes","CompareItemFieldValue","parse","CompareItemsModal","resultItems","onModalToggle","popup","Modal","hideCloseButton","closeModal","renderTitle","renderActions","CompareTiles","imageURL","onSelectTiles","CompareItems","onSelectCompareItems","clearItems","compareHidden","setCompareHidden","disabled","CompareItemsBar","position","setPopup","setError","Ids","resp","CustomHtml","DefaultResultItem","ProductResultItem","VisuallyHiddenAnnouncementContext","compareCheck","setCompareCheck","leadTime","plpDescription","dispatchProductClickEvent","checked","RocHawkResultItem","FacetsAndResults","controlChanged","scroller","scrollTo","duration","smooth","productEl","querySelector","focusEl","focus","RocResultItem","isVisible","CategoryLandingBanner","bannerImage","PageHeading","bannerPageHeading","renderBanner","parseLocation","SearchBoxPortal","searchBoxDom","searchBoxComponent","createPortal","App","hawkConfig","HawkContext","windowWithServerData","__ROC_SERVER_DATA__","initializeServerData","trim","word","toUpperCase","stripHtml","html","tmp","createElement","innerHTML","textContent","innerText","trimString","LazyDialog","Dialog","LazyDialogContent","DialogContent","LazyDialogOverlay","DialogOverlay","renderSubtitle","titleIcon","headerDivider","bypassFocusLock","subTitle","innerModal","ariaLabel","onDismiss","dangerouslyBypassFocusLock","defaultApiUrl","defaultDashboardUrl","defaultSearchUrl","defaultAutocompleteUrl","defaultSearchPageUrl","defaultCompareItemsURL","defaultRecommendationUrl","initial","selectionIdx","negationIdx","selectedValue","selectionValue","matchingValue","findMatchingValue","clientSelections","facets","selectionValues","matchingVal","suggestionType"],"mappings":"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","file":"search-results.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 TapeCase Customization\r\nimport { SubmitQuoteResourceKeys } from 'features/submit-quote/resources';\r\nimport { TapeCaseRegistrationResourceKeys } from 'features/register-tapecase/resources';\r\nimport { CareersFormResourceKeys } from 'features/careers-form/resources';\r\nimport { FileUploadResourceKeys } from 'features/file-upload/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 TapeCase Customization\r\n\t| SubmitQuoteResourceKeys\r\n\t| TapeCaseRegistrationResourceKeys\r\n\t| CareersFormResourceKeys\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 * 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 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","/*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 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","// 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 { 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\t/* #endregion */\r\n\t/* #region TapeCase */\r\n\torganizationId: searchState.organizationId as string,\r\n\t/* #endregion */\r\n};\r\n\r\nexport default RocHawkConfig;\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 { 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","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, \"/* 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 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 { 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://hawk-dev.americaneagle.com/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/** 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","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\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 { 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\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\ttry {\r\n\t\t\t//#region TapeCase - search by CPN/Keyword\r\n\t\t\tconst keyword = searchParams.Keyword;\r\n\t\t\tconst query = searchParams.Query;\r\n\r\n\t\t\tif (config.organizationId) {\r\n\t\t\t\t// perform search by CPN\r\n\t\t\t\tsearchParams.Query =\r\n\t\t\t\t\t'organization_id_part_no: \"' + config.organizationId + '||' + searchParams.Keyword + '\"';\r\n\t\t\t\tsearchParams.Keyword = undefined;\r\n\t\t\t\tsearchResults = await client.search(searchParams, cancellationToken);\r\n\t\t\t}\r\n\r\n\t\t\tif (\r\n\t\t\t\t!config.organizationId ||\r\n\t\t\t\t(searchResults && searchResults.Success && searchResults.Results.length == 0)\r\n\t\t\t) {\r\n\t\t\t\t// perform search by keyword\r\n\t\t\t\tsearchParams.Keyword = keyword;\r\n\t\t\t\tsearchParams.Query = query;\r\n\t\t\t\tsearchResults = await client.search(searchParams, cancellationToken);\r\n\t\t\t}\r\n\t\t\t//#endregion\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\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\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","/* 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 { 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 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 axios, { 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 { 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\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}\r\n\r\n\tpublic async search(request: SearchRequest, cancellationToken?: CancelToken): Promise {\r\n\t\tconst result = await axios.post(new URL(this.searchUrl, this.baseUrl).href, request, {\r\n\t\t\tcancelToken: cancellationToken,\r\n\t\t});\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 axios.post(\r\n\t\t\tnew URL(this.autocompleteUrl, this.baseUrl).href,\r\n\t\t\trequest,\r\n\t\t\t{\r\n\t\t\t\tcancelToken: cancellationToken,\r\n\t\t\t},\r\n\t\t);\r\n\r\n\t\treturn result.data;\r\n\t}\r\n\r\n\t/**\r\n\t * Request the compared items from hawk.\r\n\t *\r\n\t * @param {CompareItemRequest} request\r\n\t * @param {CancelToken} [cancellationToken]\r\n\t * @returns {Promise}\r\n\t * @memberof HawkClient\r\n\t */\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 axios.post(\r\n\t\t\tnew URL(this.compareItemsURL, this.baseUrl).href,\r\n\t\t\trequest,\r\n\t\t\t{\r\n\t\t\t\tcancelToken: cancellationToken,\r\n\t\t\t},\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 axios.post(\r\n\t\t\tnew URL(this.recommendationWidgetUrl, this.recommendationUrl).href,\r\n\t\t\trequest,\r\n\t\t\t{\r\n\t\t\t\tcancelToken: cancellationToken,\r\n\t\t\t},\r\n\t\t);\r\n\t\treturn result.data;\r\n\t}\r\n}\r\n\r\nexport default HawkClient;\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","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 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 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 * 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","/* 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\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.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\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\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\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 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 { 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;\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 { 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 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 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\r\n\t// #region TapeCase\r\n\tisOptedInForMarketingEmails: boolean;\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\tcartSummary?: CartSummary;\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\t//#region TapeCase Customization\r\n\tisApprovedDistributor: boolean;\r\n\tpurchaseOrderAllowed: boolean;\r\n\t//#endregion\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","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 { 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};\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 * 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\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\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","// 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","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 { 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\nexport function preparePayload(payload: any) {\r\n\treturn btoa(JSON.stringify(payload));\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\tAxiosHelper.post(HawkSearch.TrackingUrl + '/api/trackevent', payload)\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 { 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","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","/**\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\tconst { displayPrice, className, inline = false, testId = 'product-price' } = props;\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\trenderResult = renderAmbiguousPrice(css, displayPrice, testId);\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\nfunction renderAmbiguousPrice(css: CssClasses, price: AmbiguousDisplayPrice, 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 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","/**\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","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 { createBrowserHistory } from 'history';\r\n\r\nexport const history = createBrowserHistory();\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\tmultipleValues[x] = multipleValues[x].replace('::', ',');\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\trequest.Keyword = undefined;\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\tescapedValues.push(unescapedValue.replace(',', '::'));\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","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","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\tactor.setSearch({\r\n\t\t\tPageId: 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\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\t\tactor.setSearch({\r\n\t\t\tPageId: undefined,\r\n\t\t\tCustomUrl: undefined,\r\n\t\t\tKeyword: inputValue ?? '',\r\n\t\t});\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, { 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","/* eslint-disable jsx-a11y/click-events-have-key-events */\r\n/* eslint-disable jsx-a11y/no-static-element-interactions */\r\nimport 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\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 React from 'react';\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ScrollToResults } from 'features/search/FacetsAndResults';\r\n\r\nfunction Sorting(props: ScrollToResults) {\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\tconst { t } = useTranslation();\r\n\r\n\tfunction onChangeAndBlur(event: React.ChangeEvent) {\r\n\t\tactor.setSearch({\r\n\t\t\tSortBy: event.currentTarget.value,\r\n\t\t});\r\n\r\n\t\tif (event.type !== 'blur') {\r\n\t\t\tscrollToResults(t('sort by'));\r\n\t\t}\r\n\t}\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t{t('Sort By')}\r\n\r\n\t\t\t\r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default Sorting;\r\n","import { ScrollToResults } from 'features/search/FacetsAndResults';\r\nimport React from 'react';\r\nimport { Sorting, 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
    \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\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\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 React, { useState } from 'react';\r\n\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}\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 }: 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\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()} name={itemName}>\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\r\n\t\t\t) : null}\r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default ResultImage;\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\r\nexport interface ResultItemProps extends WithTestIdOptional {\r\n\titem: Result;\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 PlaceholderItem from './PlaceholderItem';\r\nimport Spinner from 'shared/components/Spinner';\r\nimport ResultItem, { ResultItemProps } from './ResultItem';\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\n\r\nexport interface ResultsListingProps {\r\n\tresultItem: React.ComponentType;\r\n}\r\n\r\nfunction ResultListing({ resultItem = ResultItem }: 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{isLoading ? : null}\r\n\r\n\t\t\t{results.length\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\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 ResultListing;\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","/* 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\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\nexport default function CompareItemsTable(props: { compareItems: CompareResultObject[] }) {\r\n\treturn (\r\n\t\t
    \r\n\t\t\t
    \r\n\t\t\t\t{/* #region Tapecase */}\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\t{/* #endregion */}\r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n}\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{/* #region Tapecase */}\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\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\t{/* #endregion */}\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 TapeCase\r\n\t'productattr_totalthickness',\r\n\t'productattr_materialbacking',\r\n\t'productattr_adhesivetype',\r\n\t'productattr_adhesivestrength',\r\n\t'productattr_liner',\r\n\t'productattr_tensilestrength',\r\n\t'oductattr_temperatureperformance',\r\n\t'productattr_backingthickness',\r\n\t'productattr_flameretardant',\r\n\t'productattr_thermallyconductiv',\r\n\t'productattr_hightemperature',\r\n\t'productattr_standardsspecifications',\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\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\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\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\nimport CompareItemsTable from './CompareItemsTable';\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\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 forwhen 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// #region Tapecase\r\nimport classnames from 'classnames';\r\n// #endregion\r\n\r\n// #region Tapecase\r\ntype ComparePosition = 'top' | 'bottom';\r\n\r\ninterface CompareItemsBarProps {\r\n\tposition?: ComparePosition;\r\n}\r\n// #endregion\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\n// #region Tapecase\r\nfunction CompareItemsBar(props: CompareItemsBarProps) {\r\n\tconst { position = 'top' } = props;\r\n\t// #endregion\r\n\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{/* #region Tapecase */}\r\n\t\t\t\r\n\t\t\t\t{/* #endregion */}\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 React from 'react';\r\nimport { useHawkSearch } from 'components/StoreProvider';\r\nimport ToolRow from 'components/ui/Results/ToolRow';\r\nimport ResultListing from 'components/ui/Results/ResultListing';\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\n\r\nexport interface ResultsProps {\r\n\tresultItem?: React.ComponentType;\r\n}\r\n\r\nfunction Results({ resultItem = ResultItem, scrollToResults }: ResultsProps & ScrollToResults) {\r\n\tconst {\r\n\t\tstore: { isLoading, searchResults, requestError, itemsToCompare },\r\n\t} = useHawkSearch();\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\t// end of overrides\r\n\tif ((!searchResults || searchResults.Results.length === 0) && !isLoading) {\r\n\t\treturn ;\r\n\t}\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t{/*#region : TapeCase*/}\r\n\t\t\t{searchResults?.Name &&

    {searchResults.Name}

    }\r\n\r\n\t\t\t{searchResults?.CustomHtml && (\r\n\t\t\t\t\r\n\t\t\t)}\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
    \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{/*#region : TapeCase*/}\r\n\t\t\t{itemsToCompare && itemsToCompare.length > 0 && }\r\n\t\t\t{/*#endregion*/}\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 Results;\r\n","/* eslint-disable jsx-a11y/label-has-associated-control */\r\n/* eslint-disable jsx-a11y/label-has-for */\r\nimport React from 'react';\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\t{/*#region Tapecase */}\r\n\t\t\t

    \r\n\t\t\t\t1 mil polyimide film, single coated with a high performance acrylic adhesive.\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
    \r\n\t\t\t{/*#endregion */}\r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default DefaultResultItem;\r\n","import ResultImage from 'components/ui/Results/ResultImage';\r\nimport { ResultItemProps } from 'components/ui/Results/ResultItem';\r\n// #region Tapecase\r\nimport React, { useContext, useEffect, useState } from 'react';\r\n// #endregion\r\nimport { useHawkSearch } from 'shared/components/hawksearch/components/StoreProvider';\r\n// #region Tapecase\r\nimport VisuallyHiddenAnnouncementContext from 'shared/components/VisuallyHiddenAnnouncementContext';\r\n// #endregion\r\nimport { dispatchRocEvent } from 'shared/hooks/useRocEventHandler';\r\n// #region Tapecase\r\n// import { DisplayPrice } from 'shared-client/types/commerce/display-price';\r\n// import ProductPricing from 'shared/components/commerce/ProductPricing';\r\n// #endregion\r\n\r\nfunction ProductResultItem({ item, testId }: ResultItemProps) {\r\n\t// #region Tapecase\r\n\tconst { setAlert } = useContext(VisuallyHiddenAnnouncementContext);\r\n\t// #endregion\r\n\r\n\tconst [compareCheck, setCompareCheck] = useState(false);\r\n\tconst {\r\n\t\tstore: { itemsToCompareIds },\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//#region: TapeCase\r\n\tconst leadTime = item.getDocumentValue('productattr_leadtime');\r\n\tconst plpDescription = item.getDocumentValue('productattr_plpdescription');\r\n\t//#endregion\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\r\n\t\t// #region Tapecase\r\n\t\tif (!compareCheck) {\r\n\t\t\t// Adding\r\n\r\n\t\t\tif (itemsToCompareIds.length === 0) {\r\n\t\t\t\t// First item added\r\n\t\t\t\tsetAlert(\r\n\t\t\t\t\t`Now comparing ${\r\n\t\t\t\t\t\titemsToCompareIds.length + 1\r\n\t\t\t\t\t} item. The comparison area is at the end of the products results.`,\r\n\t\t\t\t);\r\n\t\t\t} else {\r\n\t\t\t\tsetAlert(\r\n\t\t\t\t\t`Now comparing ${\r\n\t\t\t\t\t\titemsToCompareIds.length + 1\r\n\t\t\t\t\t} items. The comparison area is at the end of the products results.`,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// Removing\r\n\r\n\t\t\tif (itemsToCompareIds.length === 1) {\r\n\t\t\t\t// Removing last item\r\n\t\t\t\tsetAlert(`Now comparing ${itemsToCompareIds.length - 1} items.`);\r\n\t\t\t} else if (itemsToCompareIds.length === 2) {\r\n\t\t\t\t// Removing 2nd to last item\r\n\t\t\t\tsetAlert(\r\n\t\t\t\t\t`Now comparing ${\r\n\t\t\t\t\t\titemsToCompareIds.length - 1\r\n\t\t\t\t\t} item. The comparison area is at the end of the products results.`,\r\n\t\t\t\t);\r\n\t\t\t} else {\r\n\t\t\t\tsetAlert(\r\n\t\t\t\t\t`Now comparing ${\r\n\t\t\t\t\t\titemsToCompareIds.length - 1\r\n\t\t\t\t\t} items. The comparison area is at the end of the products results.`,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\t\t// #endregion\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{url ? (\r\n\t\t\t\t\t dispatchProductClickEvent()}>\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\r\n\t\t\t{/* #region Tapecase */}\r\n\t\t\t{/* */}\r\n\t\t\t

    {plpDescription}

    \r\n\t\t\t{/* #endregion */}\r\n\t\t\t{leadTime ?

    Lead Time : {leadTime}

    : null}\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\n//#region TapeCase\r\n// function ProductPriceRenderer({ item, testId }: ResultItemProps) {\r\n// \t// fields for group pricing\r\n// \tconst displayPriceStringified =\r\n// \t\titem.getDocumentValue('product_groupdisplayprice') || item.getDocumentValue('product_displayprice');\r\n\r\n// \tconst displayPrice = displayPriceStringified ? (JSON.parse(displayPriceStringified) as DisplayPrice) : undefined;\r\n\r\n// \treturn (\r\n// \t\t\r\n// \t);\r\n// }\r\n//#endregion\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 RocHawkResultItem({ item, testId }: 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// #endregion\r\n\t\tdefault:\r\n\t\t\treturn ;\r\n\t}\r\n}\r\n\r\nexport default RocHawkResultItem;\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 { Results } from 'shared/components/hawksearch/components/ui/Results';\r\n// #region Tapecase\r\nimport VisuallyHiddenAnnouncement from 'shared/components/VisuallyHiddenAnnouncement';\r\nimport VisuallyHiddenAnnouncementContext from 'shared/components/VisuallyHiddenAnnouncementContext';\r\n// #endregion\r\nimport RocResultItem from './components/RocResultItem';\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\nexport default function FacetsAndResults() {\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 productEl = document.querySelector('.hawk-results__item');\r\n\t\tconst focusEl = productEl?.querySelector('.hawk-results__item-image-link');\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\t\t\t{/* #region Tapecase */}\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t{/* #endregion */}\r\n\t\t\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","import * as React from 'react';\r\nimport Spinner from 'shared/components/hawksearch/components/ui/Spinner';\r\nimport { useHawkSearch } from '../../StoreProvider';\r\nimport { renderBanner } from './Banner';\r\n\r\nfunction CategoryLandingBanner() {\r\n\tconst {\r\n\t\tstore: { isLoading, searchResults },\r\n\t} = useHawkSearch();\r\n\r\n\tconst bannerImage = searchResults?.PageHeading != null ? searchResults.PageHeading : null;\r\n\tconst bannerPageHeading = searchResults?.Name != null ? searchResults?.Name : null;\r\n\r\n\tif (isLoading) {\r\n\t\treturn ;\r\n\t} else {\r\n\t\treturn renderBanner(bannerImage, bannerPageHeading);\r\n\t}\r\n}\r\n\r\nexport default CategoryLandingBanner;\r\n","import React from 'react';\r\n\r\nexport function renderBanner(bannerImage: string | null, bannerPageHeading: string | null) {\r\n\tif (bannerImage) {\r\n\t\tbannerImage = bannerImage.replace(/\\\\/g, '/');\r\n\t\tbannerImage = \"url('\" + bannerImage + \"')\";\r\n\t} else {\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

    {bannerPageHeading}

    \r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n}\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//#region : TapeCase\r\nimport CategoryLandingBanner from '../../shared/components/hawksearch/components/ui/Merchandising/CategoryLandingBanner';\r\n//#endregion\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{/*#region : TapeCase*/}\r\n\t\t\t\t\r\n\t\t\t\t{/*#endregion*/}\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","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 { 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\t// #region TapeCase Customizations\r\n\tListPriceMessagingForNotApprovedDistributors?: string;\r\n\tMaxNumberOfDaysToCancelOrders?: number;\r\n\tMaxNumberOfDaysToCancelOrdersMessage?: string;\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 { 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\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","// 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 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","/**\r\n * @see HawkSearchConfig.apiUrl\r\n */\r\nexport const defaultApiUrl = 'https://searchapi-dev.americaneagle.com';\r\n\r\n/**\r\n * @see HawkSearchConfig.dashboardUrl\r\n */\r\nexport const defaultDashboardUrl = 'https://hawk-dev.americaneagle.com';\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.americaneagle.com';\r\n\r\n/**\r\n * @see HawkSearchConfig.recommendationWidgetUrl\r\n */\r\nexport const recommendationWidgetUrl = '/api/recommendation/v2/getwidgetitems';\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\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 { 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 = this.findMatchingValue(selectionValue, 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,\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"],"sourceRoot":""}