{"version":3,"sources":["webpack:///./ClientApp/services/Localizer.tsx","webpack:///./ClientApp/features/search/RocHawkConfig.ts","webpack:///./ClientApp/features/tracking/trackers/commerce/hawksearch/tracking-commerce.ts","webpack:///./ClientApp/services/AxiosHelper.ts","webpack:///./ClientApp/features/tracking/trackers/commerce/hawksearch/hawk-search-commerce-tracker.ts","webpack:///./ClientApp/services/UserData.ts","webpack:///./ClientApp/shared/util/AccountUrls.ts","webpack:///./ClientApp/features/tracking/trackers/hawksearch/tracking.ts","webpack:///./ClientApp/shared/util/events/rocEventUtils.ts","webpack:///./ClientApp/features/tracking/trackers/commerce/hawksearch/index.ts","webpack:///./ClientApp/shared/components/hawksearch/helpers/Cookies.ts","webpack:///./ClientApp/services/ServerData.ts","webpack:///./ClientApp/util/StringUtil.ts","webpack:///./ClientApp/shared/components/hawksearch/util/Constants.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","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","value","rate","Value","trackRate","AxiosHelper","axios","create","defaults","headers","common","interceptors","request","use","config","method","toLowerCase","getCsrfToken","csrfToken","RequestVerificationToken","addUnauthorizedAccessInterceptor","history","response","error","status","location","AccountUrls","Login","encodeURIComponent","pathname","Promise","reject","convertOrderToHawkSearchItems","order","resolveItemPrice","item","unitPrice","salePrice","rawValue","basePrice","recipients","reduce","items","recipient","map","product","productGroupId","id","itemPrice","addProductToContext","HawkSearch","Context","add","toString","addProductAttributesToContext","hawkAttributes","attribute","name","remove","addMultipleProductAttributesToContext","push","selectionsToHawkAttributes","selections","selection","field","values","find","s","checked","label","undefined","convertProductSelectionToHawksearchAttributes","setup","addRocEventHandler","Tracking","track","pageType","cart","productId","rating","orderCode","snapshotCurrencyISO","subtotal","adjustedQuantity","url","HawkSearchTrackingId","trackingId","productDetails","summary","userDataPromise","getUserData","get","getUserDataNoCache","userData","data","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","EventTrackingType","PageType","SuggestType","SearchType","createGuid","i","substr","Math","floor","random","join","btoa","JSON","stringify","TrackingUrl","d","visitId","getCookie","visitorId","isNewVisitor","setCookie","Date","setTime","getTime","toUTCString","getVisitorExpiry","post","assign","ClientGuid","VisitId","VisitorId","TrackingProperties","CustomDictionary","CustomContext","then","catch","init","initCustomEvents","document","readyState","setTimeout","addEventListener","ContextDictionary","this","hasOwnProperty","existingValue","documentElement","clientHeight","clientWidth","pageLoad","PageTypeId","RequestPath","Qs","search","ViewportHeight","ViewportWidth","typeId","Initial","queryId","QueryId","TrackingId","TypeId","trackSearchTracking","click","Url","trackClick","bannerId","campaignId","bannerClick","CampaignId","BannerId","bannerImpression","trackBannerImpression","keyword","suggestType","itemName","autoCompleteClick","Keyword","Name","widgetGuid","itemIndex","requestId","recommendationClick","ItemIndex","RequestId","WidgetGuid","trackRecommendationClick","eventType","eventHandler","handler","evt","detail","removeEventListener","getVisitExpiry","nameEQ","ca","cookie","split","charAt","substring","indexOf","expiry","expires","windowWithServerData","__ROC_SERVER_DATA__","initializeServerData","trim","toCamelCase","word","toUpperCase","stripHtml","html","tmp","createElement","innerHTML","textContent","innerText","trimString","defaultApiUrl","defaultDashboardUrl","defaultSearchUrl","defaultAutocompleteUrl","defaultSearchPageUrl","defaultCompareItemsURL","defaultRecommendationUrl","recommendationWidgetUrl"],"mappings":"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","file":"hawk-search-commerce-tracker.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 { 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 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 { ProductDetailSelection, ProductSelection } from 'features/commerce/product-details/types';\r\nimport { Order, OrderItem } from 'features/commerce/shopping-cart/types';\r\nimport addRocEventHandler from 'shared/util/events/rocEventUtils';\r\nimport { CommercePageType, TrackSaleItemArgs } from './tracking-commerce';\r\nimport HawkSearch from '../../hawksearch/tracking';\r\n\r\n/**\r\n * Helper function for converting order model to the list of items in format expected by Google Analytics\r\n * @param order\r\n */\r\nfunction convertOrderToHawkSearchItems(order: Order): Array {\r\n\t// helper function for resolving item's price\r\n\tconst resolveItemPrice = (item: OrderItem): number => {\r\n\t\tif (item.unitPrice) {\r\n\t\t\tif (item.unitPrice.salePrice) {\r\n\t\t\t\treturn item.unitPrice.salePrice.rawValue;\r\n\t\t\t}\r\n\r\n\t\t\tif (item.unitPrice.basePrice) {\r\n\t\t\t\treturn item.unitPrice.basePrice.rawValue;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn 0;\r\n\t};\r\n\r\n\treturn order.recipients.reduce(\r\n\t\t(items, recipient) => [\r\n\t\t\t...items,\r\n\t\t\t...recipient.items.map((item) => {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tuniqueId: item.product.productGroupId ?? item.product.id,\r\n\t\t\t\t\titemPrice: resolveItemPrice(item),\r\n\t\t\t\t\tquantity: item.quantity,\r\n\t\t\t\t};\r\n\t\t\t}),\r\n\t\t],\r\n\t\t[],\r\n\t);\r\n}\r\n\r\n/**\r\n * Represents attributes and values used for adding in hawksearch context\r\n */\r\nexport interface HawksearchAttributes {\r\n\tname: string;\r\n\tvalue?: string;\r\n}\r\n\r\n/**\r\n * Helper function to add the associated group product Id of a simple product, if applicable.\r\n * @param uniqueId - the associated unique group product Id of a simple product, if applicable.\r\n */\r\nfunction addProductToContext(uniqueId: string) {\r\n\tHawkSearch.Context.add('unique_id', uniqueId.toString());\r\n}\r\n\r\n/**\r\n * Helper function to add multiple associated group product Ids of a simple product, if applicable.\r\n * @param uniqueId - the associated unique group product Id of a simple product, if applicable.\r\n */\r\nfunction addMultipleProductsToContext(uniqueId: string) {\r\n\tHawkSearch.Context.push('unique_id', uniqueId.toString());\r\n}\r\n\r\n/**\r\n * Helper function to add attribute value to hawk context\r\n * @param selections - The list of selectable attributes and their values for the product which are relevant for product recommendations.\r\n */\r\nfunction addProductAttributesToContext(hawkAttributes: HawksearchAttributes[]) {\r\n\t// add attribute to context if the tracking key is present\r\n\thawkAttributes?.map((attribute) => {\r\n\t\tif (attribute.value) {\r\n\t\t\tHawkSearch.Context.add(attribute.name, attribute.value);\r\n\t\t} else {\r\n\t\t\tHawkSearch.Context.remove(attribute.name);\r\n\t\t}\r\n\t});\r\n}\r\n\r\n/**\r\n * Helper function to add multiple attribute values to hawk context separated by ','\r\n * @param selections - The list of selectable attributes and their values for the product which are relevant for product recommendations.\r\n */\r\nfunction addMultipleProductAttributesToContext(hawkAttributes: HawksearchAttributes[]) {\r\n\t// add attribute to context if the tracking key is present\r\n\thawkAttributes?.map((attribute) => {\r\n\t\tif (attribute.value) {\r\n\t\t\tHawkSearch.Context.push(attribute.name, attribute.value);\r\n\t\t} else {\r\n\t\t\tHawkSearch.Context.remove(attribute.name);\r\n\t\t}\r\n\t});\r\n}\r\n\r\n/**\r\n * Converts roc product selections to hawk context attribute fields\r\n * @param selections - The list of selectable attributes and their values for the product which are relevant for product recommendations.\r\n */\r\nexport function selectionsToHawkAttributes(\r\n\tselections: ProductDetailSelection[] | undefined | null,\r\n): HawksearchAttributes[] {\r\n\tconst hawkSearchAttributes: HawksearchAttributes[] = selections?.length\r\n\t\t? selections.map((selection: ProductDetailSelection) => {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tname: selection.field,\r\n\t\t\t\t\tvalue: selection.values?.find((s) => s.checked === true)?.label ?? undefined,\r\n\t\t\t\t};\r\n\t\t })\r\n\t\t: [];\r\n\r\n\treturn hawkSearchAttributes;\r\n}\r\n\r\n/**\r\n * Converts roc product selections to hawk context attribute fields\r\n */\r\nexport function convertProductSelectionToHawksearchAttributes(\r\n\tselections: ProductSelection[] | null | undefined,\r\n): HawksearchAttributes[] {\r\n\tconst hawkSearchAttributes: HawksearchAttributes[] = selections?.length\r\n\t\t? selections.map((selection: ProductSelection) => {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tname: selection.field,\r\n\t\t\t\t\tvalue: selection.label.toString() ?? undefined,\r\n\t\t\t\t};\r\n\t\t })\r\n\t\t: [];\r\n\r\n\treturn hawkSearchAttributes;\r\n}\r\n\r\nexport default function setup() {\r\n\taddRocEventHandler('cart-page-viewed', () => {\r\n\t\tHawkSearch.Tracking.track('pageload', {\r\n\t\t\tpageType: CommercePageType.cart,\r\n\t\t\tuniqueId: '',\r\n\t\t});\r\n\t});\r\n\r\n\taddRocEventHandler('product-viewed', ({ productId, productGroupId, selections }) => {\r\n\t\tif (productGroupId != null) {\r\n\t\t\tconst hawkAttributes = selectionsToHawkAttributes(selections);\r\n\t\t\taddProductAttributesToContext(hawkAttributes);\r\n\t\t}\r\n\t\taddProductToContext(productGroupId ?? productId);\r\n\r\n\t\tHawkSearch.Tracking.track('pageload', {\r\n\t\t\tpageType: CommercePageType.item,\r\n\t\t\tuniqueId: productGroupId ?? productId,\r\n\t\t});\r\n\t});\r\n\r\n\taddRocEventHandler('product-rated', ({ productId, rating }) => {\r\n\t\tHawkSearch.Tracking.trackCommerce('rate', {\r\n\t\t\tuniqueId: productId,\r\n\t\t\tvalue: rating,\r\n\t\t});\r\n\t});\r\n\r\n\taddRocEventHandler('order-placed', ({ order }) => {\r\n\t\torder.recipients.map((recipient) => {\r\n\t\t\trecipient.items.map((item) => {\r\n\t\t\t\tif (item.product.productGroupId != null) {\r\n\t\t\t\t\tconst hawkAttributes = convertProductSelectionToHawksearchAttributes(item.selections);\r\n\t\t\t\t\taddMultipleProductAttributesToContext(hawkAttributes);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tHawkSearch.Tracking.trackCommerce('sale', {\r\n\t\t\torderNo: order.orderNo || order.orderCode,\r\n\t\t\tcurrency: order.snapshotCurrencyISO,\r\n\t\t\titemList: convertOrderToHawkSearchItems(order),\r\n\t\t\tsubTotal: order.subtotal.basePrice.rawValue,\r\n\t\t\ttax: order.tax?.basePrice.rawValue,\r\n\t\t\ttotal: order.total.basePrice.rawValue,\r\n\t\t});\r\n\r\n\t\tHawkSearch.Tracking.track('pageload', { pageType: CommercePageType.order, uniqueId: '' });\r\n\t});\r\n\r\n\taddRocEventHandler('added-to-cart', ({ items }) => {\r\n\t\titems.map((item) => {\r\n\t\t\tif (item.productGroupId) {\r\n\t\t\t\tconst hawkAttributes = convertProductSelectionToHawksearchAttributes(item.selections);\r\n\t\t\t\taddProductAttributesToContext(hawkAttributes);\r\n\t\t\t}\r\n\t\t\taddProductToContext(item.productGroupId ?? item.id);\r\n\t\t});\r\n\r\n\t\tHawkSearch.Tracking.trackCommerce('add2cartmultiple', {\r\n\t\t\titemsList: items.map((item) => {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcurrency: item.currency,\r\n\t\t\t\t\tprice: item.price,\r\n\t\t\t\t\tquantity: item.adjustedQuantity,\r\n\t\t\t\t\tuniqueId: item.productGroupId ?? item.id,\r\n\t\t\t\t};\r\n\t\t\t}),\r\n\t\t});\r\n\t});\r\n\r\n\taddRocEventHandler('added-to-cart-multiple', ({ items }) => {\r\n\t\titems.map((item) => {\r\n\t\t\tif (item.productGroupId) {\r\n\t\t\t\tconst hawkAttributes = convertProductSelectionToHawksearchAttributes(item.selections);\r\n\t\t\t\taddMultipleProductAttributesToContext(hawkAttributes);\r\n\t\t\t}\r\n\t\t\taddMultipleProductsToContext(item.productGroupId ?? item.id);\r\n\t\t});\r\n\r\n\t\tHawkSearch.Tracking.trackCommerce('add2cartmultiple', {\r\n\t\t\titemsList: items.map((item) => {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcurrency: item.currency,\r\n\t\t\t\t\tprice: item.price,\r\n\t\t\t\t\tquantity: item.adjustedQuantity,\r\n\t\t\t\t\tuniqueId: item.productGroupId ?? item.id,\r\n\t\t\t\t};\r\n\t\t\t}),\r\n\t\t});\r\n\t});\r\n\r\n\taddRocEventHandler('product-clicked', ({ productId, productGroupId, url }) => {\r\n\t\tif (!window.HawkSearchTrackingId) {\r\n\t\t\t// do not report product clicks unless there is tracking id from hawk\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tHawkSearch.Tracking.track('click', {\r\n\t\t\tuniqueId: productGroupId ?? productId,\r\n\t\t\turl: url,\r\n\t\t\ttrackingId: window.HawkSearchTrackingId,\r\n\t\t});\r\n\t});\r\n\r\n\taddRocEventHandler('product-selection-updated', ({ product }) => {\r\n\t\tconst hawkAttributes = selectionsToHawkAttributes(product.productDetails?.selections);\r\n\t\taddProductAttributesToContext(hawkAttributes);\r\n\t\taddProductToContext(product.productDetails?.summary?.productGroupId ?? product.productId);\r\n\t});\r\n}\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","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 { 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 setup from './hawk-search-commerce-tracker';\r\n\r\nsetup();\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 { 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","// 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","/**\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"],"sourceRoot":""}