{"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/util/StringUtil.ts","webpack:///./ClientApp/services/ServerData.ts","webpack:///./ClientApp/services/AxiosHelper.ts","webpack:///./ClientApp/services/UserData.ts","webpack:///./ClientApp/shared/util/AccountUrls.ts","webpack:///./ClientApp/features/tracking/trackers/hawksearch/tracking.ts","webpack:///./ClientApp/shared/components/hawksearch/util/Constants.ts","webpack:///./ClientApp/shared/components/hawksearch/helpers/Cookies.ts","webpack:///./ClientApp/shared/util/events/rocEventUtils.ts","webpack:///./ClientApp/features/tracking/trackers/hawksearch/hawk-search-tracker.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","enableRemovingDashesFromSearchKeyword","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","trim","toCamelCase","word","toLowerCase","toUpperCase","stripHtml","html","tmp","document","createElement","innerHTML","textContent","innerText","addEllipsis","text","cutoff","substring","trimString","ServerData","windowWithServerData","__ROC_SERVER_DATA__","initializeServerData","AxiosHelper","axios","create","defaults","headers","common","interceptors","request","use","config","method","getCsrfToken","csrfToken","RequestVerificationToken","addUnauthorizedAccessInterceptor","history","response","error","status","location","AccountUrls","Login","encodeURIComponent","pathname","Promise","reject","userDataPromise","getUserData","get","getUserDataNoCache","userData","data","requestToken","BaseUrl","ACCOUNT_URL_BASE","ACCOUNT_LOGIN_URL","Login2fa","ACCOUNT_LOGIN_WITH_2FA_URL","Register","ACCOUNT_REGISTER_URL","ForgotPassword","ACCOUNT_FORGOT_PASSWORD_URL","LoginWithRecoveryCode","ACCOUNT_LOGIN_WITH_RECOVERY_CODE_URL","Logout","ACCOUNT_LOGOUT_URL","OrganizationReview","ACCOUNT_ORGANIZATION_REVIEW_URL","OrganizationSelector","ACCOUNT_ORGANIZATION_SELECTOR_URL","ExternalLogout","EventTrackingType","PageType","SuggestType","SearchType","createGuid","s","i","substr","Math","floor","random","join","input","JSON","stringify","utf8Bytes","TextEncoder","encode","btoa","String","fromCharCode","HawkSearch","TrackingUrl","d","visitId","getCookie","visitorId","isNewVisitor","setCookie","Date","setTime","getTime","toUTCString","getVisitorExpiry","post","assign","ClientGuid","VisitId","VisitorId","TrackingProperties","Context","CustomDictionary","CustomContext","then","catch","init","initCustomEvents","readyState","setTimeout","addEventListener","ContextDictionary","this","remove","hasOwnProperty","existingValue","add","Tracking","track","pageType","documentElement","clientHeight","clientWidth","pageLoad","PageTypeId","RequestPath","Qs","search","ViewportHeight","ViewportWidth","trackingId","typeId","Initial","queryId","QueryId","TrackingId","TypeId","trackSearchTracking","url","click","Url","trackClick","bannerId","campaignId","bannerClick","CampaignId","BannerId","bannerImpression","trackBannerImpression","keyword","suggestType","itemName","autoCompleteClick","Keyword","Name","widgetGuid","itemIndex","requestId","recommendationClick","ItemIndex","RequestId","WidgetGuid","trackRecommendationClick","defaultApiUrl","defaultDashboardUrl","defaultSearchUrl","defaultAutocompleteUrl","defaultSearchPageUrl","defaultCompareItemsURL","defaultRecommendationUrl","recommendationWidgetUrl","getVisitExpiry","name","nameEQ","ca","cookie","split","charAt","indexOf","expiry","expires","addRocEventHandler","eventType","eventHandler","handler","evt","detail","removeEventListener","landing","searchType"],"mappings":"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","file":"hawk-search-tracker.d96e1c13.js","sourcesContent":["import { AddressResourceKeys } from 'features/address-book/resources';\r\nimport { ContactFormResourceKeys } from 'features/contact-form/resources';\r\nimport { CreatePasswordResourceKeys } from 'features/create-password/resources';\r\nimport { LoginWith2faResourceKeys } from 'features/login-with-2fa/resources';\r\nimport { LoginWithRecoveryCodeResourceKeys } from 'features/login-with-recovery-code/resources';\r\nimport { LoginResourceKeys } from 'features/login/resources';\r\nimport { MyAccountResourceKeys } from 'features/my-account/resources';\r\nimport { ResetPasswordResourceKeys } from 'features/reset-password/resources';\r\nimport { SubmitQuestionResourceKeys } from 'features/submit-question/resources';\r\nimport * as React from 'react';\r\nimport { toKebabCase } from 'util/StringUtil';\r\n\r\n// #region Commerce\r\nimport { CommerceResourceKeys } from 'features/commerce/CommerceResourceKeys';\r\n// #endregion\r\n\r\n// #region HCL\r\nimport { QuickBagsResourceKeys } from 'features/hcl/quick-bags/resources';\r\nimport { QuickLabelsResourceKeys } from 'features/hcl/quick-labels/resources';\r\nimport { ProductCatalogsResourceKeys } from 'features/hcl/product-catalogs/resources';\r\nimport { FileUploadResourceKeys } from 'features/hcl/file-upload/resources';\r\nimport { NewsletterKeys } from 'features/hcl/newsletter-signup/resources';\r\n// #endregion\r\n\r\n/**\r\n * Type that will hold all the global localization keys\r\n */\r\ntype LocalizerGlobalResourceKeys =\r\n\t| 'Success'\r\n\t| 'OfTotalPages'\r\n\t| 'Cancel'\r\n\t| 'Confirm'\r\n\t| 'FirstName'\r\n\t| 'LastName'\r\n\t| 'Email'\r\n\t| 'Username'\r\n\t| 'Amount'\r\n\t| 'NameOnCard'\r\n\t| 'CardNumber'\r\n\t| 'ExpDate'\r\n\t| 'ExpMonth'\r\n\t| 'ExpYear'\r\n\t| 'Expires'\r\n\t| 'Expired'\r\n\t| 'SecurityCode'\r\n\t| 'Submit'\r\n\t| 'Save'\r\n\t| 'ZipCode'\r\n\t| 'Remove'\r\n\t| 'Removed'\r\n\t| 'Update'\r\n\t| 'Undo'\r\n\t| 'Cancel'\r\n\t| 'Enter'\r\n\t| 'Close'\r\n\t| 'SortBy'\r\n\t| 'PleaseWait'\r\n\t| 'Unknown'\r\n\t| 'Yes'\r\n\t| 'No'\r\n\t| 'Delete'\r\n\t| 'Update'\r\n\t| 'SaveAndContinueButtonText'\r\n\t| 'SaveAndContinue'\r\n\t| 'Continue'\r\n\t| 'SaveErrorMessage'\r\n\t| 'Edit'\r\n\t| 'ErrorMessageGenericTitle'\r\n\t| 'CheckEnteredValues'\r\n\t| 'ErrorMessageForbidden'\r\n\t| 'ErrorMessageNetwork'\r\n\t| 'ErrorOccurredSubmittingTheForm'\r\n\t| 'UnexpectedErrorOccurred'\r\n\t| 'Login'\r\n\t| 'ReturnToShipping'\r\n\t| 'BreadcrumbsLabel'\r\n\t| 'Other'\r\n\t| 'RememberMe'\r\n\t| 'ForgotYourPassword'\r\n\t| 'RegisterNewUserLinkText'\r\n\t| 'LoginPageTitleText'\r\n\t| 'ForgotPasswordPageTitle'\r\n\t| 'ForgotPasswordConfirmationPageTitle'\r\n\t| 'ForgotPasswordConfirmation'\r\n\t| 'Optional'\r\n\t| 'SearchBoxPlaceholder'\r\n\t| 'XOutOfYStars'\r\n\t| 'XToYOfZ'\r\n\t| 'ModalLabel'\r\n\t| 'RequiredFields'\r\n\t| 'Status'\r\n\t| 'Version'\r\n\t| 'CreatedOn'\r\n\t| 'CreatedBy'\r\n\t| 'ModifiedOn'\r\n\t| 'ModifiedBy'\r\n\t| 'OpenStatusInformation'\r\n\t| 'CloseStatusInformation'\r\n\t| 'SearchFilter'\r\n\t| 'Pagination'\r\n\t| 'Previous'\r\n\t| 'Next'\r\n\t| 'ClearFilter';\r\n\r\n/**\r\n * Type that will hold all the localization keys\r\n */\r\nexport type LocalizerResourceKey =\r\n\t| LocalizerGlobalResourceKeys\r\n\t| LoginResourceKeys\r\n\t| ContactFormResourceKeys\r\n\t// #region Commerce\r\n\t| CommerceResourceKeys\r\n\t// #endregion\r\n\t| ResetPasswordResourceKeys\r\n\t| CreatePasswordResourceKeys\r\n\t| SubmitQuestionResourceKeys\r\n\t| ResetPasswordResourceKeys\r\n\t| CreatePasswordResourceKeys\r\n\t| MyAccountResourceKeys\r\n\t| LoginWith2faResourceKeys\r\n\t| LoginWithRecoveryCodeResourceKeys\r\n\t| AddressResourceKeys\r\n\t// #region HCL\r\n\t| QuickBagsResourceKeys\r\n\t| QuickLabelsResourceKeys\r\n\t| ProductCatalogsResourceKeys\r\n\t| NewsletterKeys\r\n\t| FileUploadResourceKeys;\r\n// #endregion\r\n\r\n/**\r\n * Interface for the resources\r\n *\r\n * @export\r\n * @interface LocalizerResource\r\n */\r\ninterface LocalizerResource {\r\n\t[id: string]: string;\r\n}\r\n\r\n/**\r\n * Extends Window with a property that will hold the localizer resources\r\n *\r\n * @interface WindowWithResources\r\n * @extends {Window}\r\n */\r\nexport interface WindowWithResources extends Window {\r\n\t__ROC_LOCALIZER_RESOURCES__?: LocalizerResource[];\r\n}\r\n\r\n/**\r\n * Main object that will hold all the localized resources\r\n */\r\nconst LocalizerResources: LocalizerResource = {};\r\n\r\n/**\r\n * To prevent redundant logging\r\n */\r\nconst isAlreadyLogged: Record = {};\r\n\r\n/**\r\n * Initializer function that will populate the main localized resources object\r\n */\r\nfunction initializeLocalizerResources() {\r\n\tconst windowWithResources = window as WindowWithResources;\r\n\r\n\tif (\r\n\t\twindowWithResources &&\r\n\t\twindowWithResources.__ROC_LOCALIZER_RESOURCES__ &&\r\n\t\tArray.isArray(windowWithResources.__ROC_LOCALIZER_RESOURCES__)\r\n\t) {\r\n\t\twindowWithResources.__ROC_LOCALIZER_RESOURCES__.forEach((obj) => {\r\n\t\t\tfor (const key of Object.keys(obj)) {\r\n\t\t\t\tLocalizerResources[key] = obj[key];\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n\r\n/**\r\n * Function that can be used to load the localized strings with support to parameter replacements\r\n *\r\n * @export\r\n * @param {string} key\r\n * @param {...string[]} replaceStrings\r\n * @returns\r\n */\r\nexport function Localizer(\r\n\tkey: TResourceKey,\r\n\t...replaceStrings: string[]\r\n) {\r\n\tif (Object.keys(LocalizerResources).length === 0) {\r\n\t\tinitializeLocalizerResources();\r\n\t}\r\n\r\n\tif (!LocalizerResources || !LocalizerResources[key]) {\r\n\t\t// if running in a test environment, just skip any warnings.\r\n\t\tif (process.env.NODE_ENV !== 'test') {\r\n\t\t\tif (!isAlreadyLogged[key]) {\r\n\t\t\t\tconsole.warn(key, 'Localizer Resource not found. Key will be used instead.');\r\n\t\t\t\tisAlreadyLogged[key] = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn key;\r\n\t}\r\n\r\n\tconst resource = LocalizerResources[key];\r\n\r\n\tif (!replaceStrings) {\r\n\t\treturn resource;\r\n\t}\r\n\r\n\treturn resource.replace(/{(\\d+)}/g, (match: string, index: number) => {\r\n\t\treturn replaceStrings[index] ? replaceStrings[index] : '';\r\n\t});\r\n}\r\n\r\n/**\r\n * Interface for the LocalizedSpan component\r\n *\r\n * @interface LocalizedSpanProps\r\n */\r\ninterface LocalizedSpanProps {\r\n\tresourceKey: LocalizerResourceKey;\r\n\targs?: string[];\r\n}\r\n\r\n/**\r\n * Component responsible for the initialization of the react app\r\n */\r\nexport function LocalizedSpan(props: LocalizedSpanProps) {\r\n\tconst { resourceKey, args = [] } = props;\r\n\tconst localizedString = Localizer(resourceKey, ...args);\r\n\r\n\treturn (\r\n\t\t\r\n\t);\r\n}\r\n","import { HawkSearchConfig } from 'shared/components/hawksearch/types/HawkSearchConfig';\r\nimport * as Constants from 'util/Constants';\r\nimport { Localizer } from 'services/Localizer';\r\n\r\nconst searchState = (window as any).__ROC_SEARCH_STATE__;\r\n\r\nconst RocHawkConfig: HawkSearchConfig = {\r\n\tapiUrl: searchState.searchEndpoint as string,\r\n\tclientGuid: searchState.trackingKey as string,\r\n\tsearchPageUrl: (searchState.searchPageUrl as string) || '/search',\r\n\tdashboardUrl: (searchState.dashboardUrl as string) || Constants.defaultDashboardUrl,\r\n\tsearchBoxPlaceholder: Localizer('SearchBoxPlaceholder'),\r\n\ttrackingUrl: searchState.trackingUrl as string,\r\n\t/* #region Commerce */\r\n\trecommendationUrl: searchState.recommendationEndpoint as string,\r\n\tenableRemovingDashesFromSearchKeyword: searchState.enableRemovingDashesFromSearchKeyword as boolean,\r\n\t/* #endregion */\r\n};\r\n\r\nexport default RocHawkConfig;\r\n","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","// 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 { ExternalLoginProvider } from 'features/login/ExternalLogins';\r\n\r\n/**\r\n * Extends Window with a property that will hold the client data\r\n *\r\n * @interface WindowWithClientData\r\n * @extends {Window}\r\n */\r\ninterface WindowWithServerData extends Window {\r\n\t__ROC_SERVER_DATA__?: Array<{\r\n\t\t[name: string]: string;\r\n\t}>;\r\n}\r\n\r\n/**\r\n * This type will hold all the keys that are used by ServerData\r\n */\r\ninterface ServerData {\r\n\tIsReCaptchaEnabled?: boolean;\r\n\tReCaptchaV3Key?: string;\r\n\tTimeZone?: string;\r\n\tUSE_EMAIL_AS_USERNAME?: boolean;\r\n\tRegistrationThankYouTitle?: string;\r\n\tRegistrationThankYouMessage?: string;\r\n\tForgotPasswordConfirmationTitle?: string;\r\n\tForgotPasswordConfirmationMessage?: string;\r\n\tPageTitleSuffix?: string;\r\n\tRequireConfirmEmail?: boolean;\r\n\tACCOUNT_URL_BASE?: string;\r\n\tACCOUNT_LOGIN_URL?: string;\r\n\tACCOUNT_LOGOUT_URL?: string;\r\n\tACCOUNT_REGISTER_URL?: string;\r\n\tACCOUNT_LOGIN_WITH_2FA_URL?: string;\r\n\tACCOUNT_FORGOT_PASSWORD_URL?: string;\r\n\tACCOUNT_LOGIN_WITH_RECOVERY_CODE_URL?: string;\r\n\tEXTERNAL_LOGIN_PROVIDERS?: ExternalLoginProvider[];\r\n\t// #region Commerce\r\n\tACCOUNT_ORGANIZATION_REVIEW_URL?: string;\r\n\tACCOUNT_ORGANIZATION_SELECTOR_URL?: string;\r\n\tGoogleMapsApiKey?: string; // used in Store Locator\r\n\tMinimumTimeBeforeRecentlyViewedProductsAreValidated?: number;\r\n\tQuickOrderItemMinumumSearchCharacters?: number;\r\n\tMaxAllowedQuickOrderItems?: number;\r\n\tMaxNumberForQuantityDropdown?: number;\r\n\tOrderDetailsUIComponent?: string;\r\n\tGuestCheckoutEnabled?: boolean;\r\n\t// #endregion\r\n}\r\n\r\n/**\r\n * Main object that will hold all the client data\r\n */\r\nexport const ServerData: ServerData = {};\r\n\r\n/**\r\n * Initializer function that will populate the main settings object\r\n */\r\nfunction initializeServerData() {\r\n\tconst windowWithServerData = window as WindowWithServerData;\r\n\r\n\tif (\r\n\t\twindowWithServerData &&\r\n\t\twindowWithServerData.__ROC_SERVER_DATA__ &&\r\n\t\tArray.isArray(windowWithServerData.__ROC_SERVER_DATA__)\r\n\t) {\r\n\t\tfor (const obj of windowWithServerData.__ROC_SERVER_DATA__) {\r\n\t\t\tfor (const key of Object.keys(obj)) {\r\n\t\t\t\tServerData[key] = obj[key];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\ninitializeServerData();\r\n","import 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 AxiosHelper from 'services/AxiosHelper';\r\nimport { AxiosResponse } from 'axios';\r\n\r\nexport interface UserSummary {\r\n\tisSignedIn: boolean;\r\n\tuserName: string | null;\r\n\tfirstName: string | null;\r\n\tlastName: string | null;\r\n\temail: string | null;\r\n\tphoneNumber: string | null;\r\n\ttwoFactorEnabled: boolean;\r\n\thasRecoveryCodes: boolean;\r\n\tisMachineRemembered: boolean;\r\n\tannouncements: UserAnnouncement[];\r\n\tisExternalLoginUser: boolean;\r\n\t// #region HCL\r\n\tversaPayEnabled: boolean;\r\n\tversaPayRedirectUrl: string | null;\r\n\tazureUserId: string | null;\r\n\t// #endregion\r\n}\r\n\r\n/** Represents the details about an admin impersonation session of the logged in user. */\r\nexport interface Impersonation {\r\n\t/** The id of the admin impersonating the front end user. */\r\n\timpersonatorId: string;\r\n\r\n\t/** The name of the admin impersonating the front end user. */\r\n\timpersonatorName: string;\r\n\r\n\t/** The id of the active user impersonation session. */\r\n\tsessionId: string;\r\n}\r\n\r\nexport interface UserData {\r\n\t/**\r\n\t * Summary of user-specific details\r\n\t */\r\n\tsummary?: UserSummary;\r\n\r\n\t/**\r\n\t * CSRF validation token generated by the server\r\n\t */\r\n\trequestToken?: string;\r\n\r\n\t/**\r\n\t * The information on an impersonation session if one is active.\r\n\t * If an impersonation session isn't active this field will be undefined.\r\n\t */\r\n\timpersonation?: Impersonation;\r\n}\r\n\r\nexport interface UserAnnouncement {\r\n\t/** The id used as the primary key for the announcement in the database */\r\n\tid: string;\r\n\r\n\t/** An announcement to be displayed to the user */\r\n\tmessage: string;\r\n\r\n\t/** A list of pages where the announcement will be displayed. This will be an empty array if it is to be displayed on all pages. */\r\n\tpages: string[];\r\n}\r\n\r\nlet userDataPromise: Promise> | null = null;\r\n\r\n/**\r\n * Returns details related to the current user. By default, this is primarily their first/last name\r\n * and whether they are logged in or not. This can customized to include more details if necessary.\r\n */\r\nexport const getUserData = () => {\r\n\tif (userDataPromise === null) {\r\n\t\tuserDataPromise = AxiosHelper.get('/ajax/user');\r\n\t}\r\n\r\n\treturn userDataPromise;\r\n};\r\n\r\n/**\r\n * Returns non-cached details related to the current user. By default, this is primarily their first/last name\r\n * and whether they are logged in or not. This can customized to include more details if necessary.\r\n */\r\nexport const getUserDataNoCache = () => {\r\n\treturn AxiosHelper.get('/ajax/user');\r\n};\r\n\r\n/**\r\n * Returns a promise that will contain the CSRF token generated on the server to be used to validate\r\n * forms being posted via AJAX.\r\n */\r\nexport async function getCsrfToken() {\r\n\ttry {\r\n\t\tconst userData = await getUserData();\r\n\t\treturn userData.data.requestToken;\r\n\t} catch (error) {\r\n\t\tconsole.warn('Unable to load CSRF token.');\r\n\t\treturn '';\r\n\t}\r\n}\r\n\r\n// #region Commerce\r\nimport { CartSummary } from './UserData.Commerce';\r\nimport { LocationDto } from 'features/commerce/store-locator/types';\r\nimport { OrganizationInvite, OrganizationShipTo } from 'shared-client/types/commerce/organization';\r\nimport { AutoSuggestOption } from '../../../Roc.SharedClientApp/types/fields';\r\n\r\n// Commerce extensions to the UserData interface\r\nexport interface UserData {\r\n\t// #region HCL - allows null\r\n\tcartSummary?: CartSummary | null;\r\n\t// #endregion\r\n\r\n\t/***\r\n\t * The customer's default store location or null if not set\r\n\t */\r\n\tdefaultStoreLocation?: LocationDto | null;\r\n\r\n\t/**\r\n\t * If store is enabled for this site\r\n\t */\r\n\tenableStoreLocation?: boolean;\r\n}\r\n\r\n/***\r\n * Organization data and permissions\r\n */\r\nexport interface Organization {\r\n\tid: string;\r\n\tpurchaseOrderNumberRequired: boolean;\r\n\tcreditCardAllowed: boolean;\r\n\tgiftCardAllowed: boolean;\r\n\torganizationName: string;\r\n\tcorpAccountAllowed: boolean;\r\n}\r\n\r\n/***\r\n * Organization dto data\r\n */\r\nexport interface OrganizationDto extends AutoSuggestOption {}\r\n\r\n/***\r\n * User's organization and permissions data\r\n */\r\nexport interface UserSummary {\r\n\t/***\r\n\t * User's current default organization\r\n\t */\r\n\torganization: Organization | null;\r\n\r\n\t/***\r\n\t * The list of organizations the user is part of\r\n\t */\r\n\tuserOrganizations?: OrganizationDto[] | null;\r\n\r\n\t/***\r\n\t * The selected organization ship to\r\n\t */\r\n\tselectedShipTo: OrganizationShipTo | null;\r\n\r\n\t/***\r\n\t * Defines if the user has multiple shiptos to select from\r\n\t */\r\n\thasMultipleShipTos: boolean | null;\r\n\r\n\t/***\r\n\t * Defines if the user has saved payment methods\r\n\t */\r\n\thasSavedPaymentMethods: boolean | null;\r\n\r\n\t/***\r\n\t * The list of user permissions\r\n\t */\r\n\tpermissions?: UserPermissions;\r\n\r\n\t/***\r\n\t * The list of organizations the user is invited to join\r\n\t */\r\n\torganizationInvites?: OrganizationInvite[];\r\n\r\n\t/***\r\n\t * The user organization removal notification\r\n\t * Used to notify the user if he is no more part of his default organization\r\n\t */\r\n\tuserOrganizationRemovalNotification?: string;\r\n}\r\n\r\n/***\r\n * User's permissions\r\n */\r\nexport interface UserPermissions {\r\n\t/***\r\n\t * Defines if the current user can see organization users\r\n\t */\r\n\tcanSeeOrganizationUsers?: boolean;\r\n\r\n\t/***\r\n\t * Defines if the current user can assign roles to organization users\r\n\t */\r\n\tcanAssignRolesToOrganizationUsers?: boolean;\r\n\r\n\t/***\r\n\t * Defines if the current user can remove users from an organization\r\n\t */\r\n\tremoveUserFromOrganization?: boolean;\r\n\r\n\t/***\r\n\t * Defines if the current user can create organization users\r\n\t */\r\n\tcreateOrganizationUser?: boolean;\r\n\r\n\t/***\r\n\t * Defines if the current user can enable/disable ShipTos for organization users\r\n\t */\r\n\tmanageShipTosAssociation?: boolean;\r\n\r\n\t/***\r\n\t * Defines if the current user can see status of the organization users\r\n\t */\r\n\tcanSeePendingOrganizationUsers?: boolean;\r\n}\r\n// #endregion\r\n","import { ServerData } from 'services/ServerData';\r\n\r\nexport default {\r\n\tBaseUrl: ServerData.ACCOUNT_URL_BASE ?? '/my-account',\r\n\tLogin: ServerData.ACCOUNT_LOGIN_URL ?? '/my-account/login',\r\n\tLogin2fa: ServerData.ACCOUNT_LOGIN_WITH_2FA_URL ?? '/my-account/login-with-2fa',\r\n\tRegister: ServerData.ACCOUNT_REGISTER_URL ?? '/my-account/register',\r\n\tForgotPassword: ServerData.ACCOUNT_FORGOT_PASSWORD_URL ?? '/my-account/forgot-password',\r\n\tLoginWithRecoveryCode: ServerData.ACCOUNT_LOGIN_WITH_RECOVERY_CODE_URL ?? '/my-account/login-with-recovery-code',\r\n\tLogout: ServerData.ACCOUNT_LOGOUT_URL ?? '/my-account/logout',\r\n\t// #region Commerce\r\n\tOrganizationReview: ServerData.ACCOUNT_ORGANIZATION_REVIEW_URL ?? '/my-account/organization-review',\r\n\tOrganizationSelector: ServerData.ACCOUNT_ORGANIZATION_SELECTOR_URL ?? '/my-account/organization-selector',\r\n\t// #endregion\r\n\t// #region HCL - hardcoded same way as external login is\r\n\tExternalLogout: '/my-account/external-logout',\r\n\t// #endregion\r\n};\r\n","import { AxiosError } from 'axios';\r\nimport RocHawkConfig from 'features/search/RocHawkConfig';\r\nimport AxiosHelper from 'services/AxiosHelper';\r\nimport { getCookie, setCookie } from 'shared/components/hawksearch/helpers/Cookies';\r\nimport { ExtractEventParameters } from 'shared/events';\r\n//#region Commerce\r\nimport { CommercePageType, CommerceSuggestType, trackCommerce } from '../commerce/hawksearch/tracking-commerce';\r\n//#endregion\r\n\r\nexport interface HawkSearch {\r\n\tClientGuid: string;\r\n\tContext: ContextDictionary;\r\n\tCustomContext: ContextDictionary;\r\n\tTrackingUrl: string | null;\r\n\tinitCustomEvents?: () => void;\r\n}\r\n\r\ndeclare global {\r\n\tinterface Window {\r\n\t\tHawkSearch: HawkSearch;\r\n\t}\r\n}\r\n\r\nexport enum EventTrackingType {\r\n\tpageLoad = 1,\r\n\tsearch = 2,\r\n\tclick = 3,\r\n\tbannerClick = 7,\r\n\tbannerImpression = 8,\r\n\trecommendationClick = 10,\r\n\tautoCompleteClick = 11,\r\n}\r\n\r\n/**\r\n * The page type\r\n */\r\nexport enum PageType {\r\n\t/**\r\n\t * Landing Page\r\n\t */\r\n\tlanding = 2,\r\n\t/**\r\n\t * All other Page Types\r\n\t */\r\n\tcustom = 5,\r\n}\r\n\r\nexport enum SuggestType {\r\n\tPopularSearches = 1,\r\n\tTopContentMatches = 4,\r\n}\r\n\r\nexport enum SearchType {\r\n\tInitial = 1,\r\n\tRefinement = 2,\r\n}\r\n\r\ntype HawkEvents =\r\n\t| ({ name: 'pageload' } & TrackPageLoadArgs)\r\n\t| ({ name: 'searchtracking' } & TrackSearchTrackingArgs)\r\n\t| ({ name: 'click' } & TrackClickArgs)\r\n\t| ({ name: 'bannerclick' } & TrackBannerClickArgs)\r\n\t| ({ name: 'bannerimpression' } & TrackBannerImpressionArgs)\r\n\t| ({ name: 'autocompleteclick' } & TrackAutoCompleteClickArgs)\r\n\t| ({ name: 'recommendationclick' } & TrackRecommendationClickArgs);\r\n\r\nexport type HawkEventType = HawkEvents['name'];\r\n\r\nfunction track(eventName: T, args: ExtractEventParameters) {\r\n\tswitch (eventName.toLocaleLowerCase()) {\r\n\t\tcase 'pageload':\r\n\t\t\t//HawkSearch.Context.add(\"uniqueid\", \"123456789\");\r\n\t\t\t//HawkSearch.Tracking.track('pageload',{pageType: \"item\"});\r\n\t\t\treturn trackPageLoad((args as unknown) as TrackPageLoadArgs);\r\n\t\tcase 'searchtracking':\r\n\t\t\t//HawkSearch.Tracking.track(\"searchtracking\", {trackingId:\"a9bd6e50-e434-45b9-9f66-489eca07ad0a\", typeId: HawkSearch.Tracking.SearchType.Initial});\r\n\t\t\t//HawkSearch.Tracking.track(\"searchtracking\", {trackingId:\"a9bd6e50-e434-45b9-9f66-489eca07ad0a\", typeId: HawkSearch.Tracking.SearchType.Refinement});\r\n\t\t\treturn trackSearchTracking((args as unknown) as TrackSearchTrackingArgs);\r\n\t\tcase 'click':\r\n\t\t\t//HawkSearch.Tracking.track('click',{event: e, uniqueId: \"33333\", trackingId: \"75a0801a-a93c-4bcb-81f1-f4b011f616e3\"});\r\n\t\t\treturn trackClick((args as unknown) as TrackClickArgs);\r\n\t\tcase 'bannerclick':\r\n\t\t\t//HawkSearch.Tracking.track('bannerclick',{bannerId: 1, campaignId: 2, trackingId:\"2d652a1e-2e05-4414-9d76-51979109f724\"});\r\n\t\t\treturn trackBannerClick((args as unknown) as TrackBannerClickArgs);\r\n\t\tcase 'bannerimpression':\r\n\t\t\t//HawkSearch.Tracking.track('bannerimpression',{bannerId: \"2\", campaignId: \"2\", trackingId:\"2d652a1e-2e05-4414-9d76-51979109f724\"});\r\n\t\t\treturn trackBannerImpression((args as unknown) as TrackBannerImpressionArgs);\r\n\t\tcase 'autocompleteclick':\r\n\t\t\t//HawkSearch.Tracking.track('autocompleteclick',{keyword: \"test\", suggestType: HawkSearch.Tracking.SuggestType.PopularSearches, name:\"tester\", url:\"/test\"});\r\n\t\t\treturn trackAutoCompleteClick((args as unknown) as TrackAutoCompleteClickArgs);\r\n\t\tcase 'recommendationclick':\r\n\t\t\t//HawkSearch.Tracking.track('recommendationclick',{uniqueId: \"223222\", itemIndex: \"222\", widgetGuid:\"2d652a1e-2e05-4414-9d76-51979109f724\", requestId:\"2d652a1e-2e05-4414-9d76-51979109f724\"});\r\n\t\t\treturn trackRecommendationClick((args as unknown) as TrackRecommendationClickArgs);\r\n\t}\r\n}\r\n\r\nfunction getVisitorExpiry() {\r\n\tconst d = new Date();\r\n\t// 1 year\r\n\td.setTime(d.getTime() + 360 * 24 * 60 * 60 * 1000);\r\n\treturn d.toUTCString();\r\n}\r\n\r\nfunction getVisitExpiry() {\r\n\tconst d = new Date();\r\n\t// 4 hours\r\n\td.setTime(d.getTime() + 4 * 60 * 60 * 1000);\r\n\treturn d.toUTCString();\r\n}\r\n\r\nfunction createGuid() {\r\n\tconst s: string[] = [];\r\n\tconst hexDigits = '0123456789abcdef';\r\n\tfor (let i = 0; i < 36; i++) {\r\n\t\ts[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);\r\n\t}\r\n\ts[14] = '4'; // bits 12-15 of the time_hi_and_version field to 0010\r\n\ts[19] = hexDigits.substr(((s[19] as any) & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01\r\n\ts[8] = s[13] = s[18] = s[23] = '-';\r\n\r\n\treturn s.join('');\r\n}\r\n\r\ntype TrackPageLoadArgs = {\r\n\t/**\r\n\t * The page type\r\n\t */\r\n\tpageType:\r\n\t\t| PageType\r\n\t\t// #region Commerce\r\n\t\t| CommercePageType;\r\n\t// #endregion\r\n\r\n\t/**\r\n\t * Unique identifier of item that was clicked\r\n\t */\r\n\tuniqueId?: string;\r\n};\r\n\r\nfunction trackPageLoad({ pageType, uniqueId }: TrackPageLoadArgs) {\r\n\tconst { clientHeight, clientWidth } = document.documentElement;\r\n\r\n\tconst payload = {\r\n\t\tEventType: EventTrackingType.pageLoad,\r\n\t\tEventData: preparePayload({\r\n\t\t\tPageTypeId: pageType,\r\n\t\t\tRequestPath: window.location.pathname,\r\n\t\t\tQs: window.location.search,\r\n\t\t\tViewportHeight: clientHeight,\r\n\t\t\tViewportWidth: clientWidth,\r\n\t\t\tUniqueId: uniqueId,\r\n\t\t}),\r\n\t};\r\n\r\n\tmakeRequest(payload);\r\n}\r\n\r\ntype TrackSearchTrackingArgs = {\r\n\t/**\r\n\t * The ‘TrackingId’ object that is passed in this function is returned in the Hawksearch response\r\n\t */\r\n\ttrackingId: string;\r\n\t/**\r\n\t * The type of search that is performed\r\n\t */\r\n\ttypeId: SearchType;\r\n};\r\n\r\nfunction trackSearchTracking({ trackingId, typeId }: TrackSearchTrackingArgs) {\r\n\tif (typeId == SearchType.Initial) {\r\n\t\tsetCookie('hawk_query_id', createGuid());\r\n\t}\r\n\r\n\tconst queryId = getCookie('hawk_query_id');\r\n\tconst { clientHeight, clientWidth } = document.documentElement;\r\n\tconst payload = {\r\n\t\tEventType: EventTrackingType.search,\r\n\t\tEventData: preparePayload({\r\n\t\t\tQueryId: queryId,\r\n\t\t\tTrackingId: trackingId,\r\n\t\t\tTypeId: typeId,\r\n\t\t\tViewportHeight: clientHeight,\r\n\t\t\tViewportWidth: clientWidth,\r\n\t\t}),\r\n\t};\r\n\r\n\tmakeRequest(payload);\r\n}\r\n\r\ntype TrackClickArgs = {\r\n\t/**\r\n\t * Unique identifier of item that was clicked\r\n\t */\r\n\tuniqueId: string;\r\n\t/**\r\n\t * This is the TrackingId that was passed back in the search response\r\n\t */\r\n\ttrackingId: string;\r\n\t/**\r\n\t * Target URL that clicked element points to\r\n\t */\r\n\turl: string;\r\n};\r\n\r\nfunction trackClick({ uniqueId, trackingId, url }: TrackClickArgs) {\r\n\tconst { clientHeight, clientWidth } = document.documentElement;\r\n\r\n\tconst payload = {\r\n\t\tEventType: EventTrackingType.click,\r\n\t\tEventData: preparePayload({\r\n\t\t\tUrl: url,\r\n\t\t\tQs: window.location.search,\r\n\t\t\tRequestPath: window.location.pathname,\r\n\t\t\tTrackingId: trackingId,\r\n\t\t\tUniqueId: uniqueId,\r\n\t\t\tViewportHeight: clientHeight,\r\n\t\t\tViewportWidth: clientWidth,\r\n\t\t}),\r\n\t};\r\n\r\n\tmakeRequest(payload);\r\n}\r\n\r\ntype TrackBannerClickArgs = {\r\n\t/**\r\n\t * The identifier of corresponding banner\r\n\t */\r\n\tbannerId: string;\r\n\t/**\r\n\t * The identifier of corresponding campaign (optional)\r\n\t */\r\n\tcampaignId: string;\r\n\t/**\r\n\t * The ‘TrackingId’ object that is passed in this function is returned in the Hawksearch response\r\n\t */\r\n\ttrackingId: string;\r\n};\r\n\r\nfunction trackBannerClick({ bannerId, trackingId, campaignId }: TrackBannerClickArgs) {\r\n\tconst payload = {\r\n\t\tEventType: EventTrackingType.bannerClick,\r\n\t\tEventData: preparePayload({\r\n\t\t\tCampaignId: campaignId,\r\n\t\t\tBannerId: bannerId,\r\n\t\t\tTrackingId: trackingId,\r\n\t\t}),\r\n\t};\r\n\r\n\tmakeRequest(payload);\r\n}\r\n\r\ntype TrackBannerImpressionArgs = TrackBannerClickArgs;\r\n\r\nfunction trackBannerImpression({ bannerId, campaignId, trackingId }: TrackBannerImpressionArgs) {\r\n\tconst payload = {\r\n\t\tEventType: EventTrackingType.bannerImpression,\r\n\t\tEventData: preparePayload({\r\n\t\t\tCampaignId: campaignId,\r\n\t\t\tBannerId: bannerId,\r\n\t\t\tTrackingId: trackingId,\r\n\t\t}),\r\n\t};\r\n\tmakeRequest(payload);\r\n}\r\n\r\ntype TrackAutoCompleteClickArgs = {\r\n\t/**\r\n\t * Selected keyword used as a autocomplete query\r\n\t */\r\n\tkeyword: string;\r\n\t/**\r\n\t * The type of autocomplete results type\r\n\t */\r\n\tsuggestType?: SuggestType | CommerceSuggestType;\r\n\t/**\r\n\t * Text value associated with the autocomplete item clicked\r\n\t */\r\n\titemName: string;\r\n\t/**\r\n\t * The target URL of clicked autocomplete item\r\n\t */\r\n\turl: string;\r\n};\r\n\r\nfunction trackAutoCompleteClick({ keyword, suggestType, itemName, url }: TrackAutoCompleteClickArgs) {\r\n\tconst payload = {\r\n\t\tEventType: EventTrackingType.autoCompleteClick,\r\n\t\tEventData: preparePayload({\r\n\t\t\tKeyword: keyword,\r\n\t\t\tName: itemName,\r\n\t\t\tSuggestType: suggestType,\r\n\t\t\tUrl: url,\r\n\t\t}),\r\n\t};\r\n\r\n\tmakeRequest(payload);\r\n}\r\n\r\ntype TrackRecommendationClickArgs = {\r\n\t/**\r\n\t * The unique identifier of the recommendation widget that displayed clicked item. This should correspond to the widget GUID generated for each widget individually in Hawksearch dashboard\r\n\t */\r\n\twidgetGuid: string;\r\n\t/**\r\n\t * Represents the unique identifier of a product. This should correspond to the value of the field set up as the primary key in the fields section of Hawksearch dashboard.\r\n\t */\r\n\tuniqueId: string;\r\n\t/**\r\n\t * The number of the clicked recommendation item on the displayed widget.\r\n\t */\r\n\titemIndex: number;\r\n\t/**\r\n\t * The ‘RequestId’ object that is passed in this function is returned in the recommendation widget response\r\n\t */\r\n\trequestId: string;\r\n};\r\n\r\nfunction trackRecommendationClick({ widgetGuid, uniqueId, itemIndex, requestId }: TrackRecommendationClickArgs) {\r\n\tconst payload = {\r\n\t\tEventType: EventTrackingType.recommendationClick,\r\n\t\tEventData: preparePayload({\r\n\t\t\tItemIndex: itemIndex,\r\n\t\t\tRequestId: requestId,\r\n\t\t\tUniqueId: uniqueId,\r\n\t\t\tWidgetGuid: widgetGuid,\r\n\t\t}),\r\n\t};\r\n\r\n\tmakeRequest(payload);\r\n}\r\n\r\n// #region HCL\r\nfunction safeBtoa(input: string): string {\r\n\t// Encode the string into UTF-8 and then to base64\r\n\tconst utf8Bytes = new TextEncoder().encode(input);\r\n\treturn btoa(String.fromCharCode(...utf8Bytes));\r\n}\r\n// #endregion\r\n\r\nexport function preparePayload(payload: any) {\r\n\t// #region HCL\r\n\treturn safeBtoa(JSON.stringify(payload));\r\n\t// #endregion\r\n}\r\n\r\nexport function makeRequest(data) {\r\n\tif (!HawkSearch.TrackingUrl) {\r\n\t\tconsole.warn(\r\n\t\t\t\"Unable to send tracking event to HawkSearch because site's configuration is missing tracking URL.\",\r\n\t\t);\r\n\t\treturn;\r\n\t}\r\n\r\n\tlet visitId = getCookie('hawk_visit_id');\r\n\tlet visitorId = getCookie('hawk_visitor_id');\r\n\tconst isNewVisitor = !visitId || !visitorId;\r\n\r\n\tif (!visitId) {\r\n\t\tsetCookie('hawk_visit_id', createGuid(), getVisitExpiry());\r\n\t\tvisitId = getCookie('hawk_visit_id');\r\n\t}\r\n\r\n\tif (!visitorId) {\r\n\t\tsetCookie('hawk_visitor_id', createGuid(), getVisitorExpiry());\r\n\t\tvisitorId = getCookie('hawk_visitor_id');\r\n\t}\r\n\r\n\tif (isNewVisitor) {\r\n\t\tAxiosHelper.post('/ajax/hawksearch/identify', {\r\n\t\t\tvisitId: visitId,\r\n\t\t\tvisitorId: visitorId,\r\n\t\t});\r\n\t}\r\n\r\n\tconst payload = Object.assign(\r\n\t\t{\r\n\t\t\tClientGuid: HawkSearch.ClientGuid,\r\n\t\t\tVisitId: visitId,\r\n\t\t\tVisitorId: visitorId,\r\n\t\t\tTrackingProperties: HawkSearch.Context,\r\n\t\t\tCustomDictionary: HawkSearch.CustomContext,\r\n\t\t},\r\n\t\tdata,\r\n\t);\r\n\r\n\t// #region HCL\r\n\tAxiosHelper.post('/ajax/hawksearch/trackevent', { request: payload })\r\n\t\t// #endregion\r\n\t\t.then((response) => {\r\n\t\t\tconsole.log('Success:', response.statusText);\r\n\t\t})\r\n\t\t.catch((error: AxiosError) => {\r\n\t\t\tconsole.error('Error:', error);\r\n\t\t});\r\n}\r\n\r\n// TODO: add comments about what this is for? i think it has to do with timing between hawksearch.js and this script?\r\nfunction init() {\r\n\tif (window.HawkSearch && typeof window.HawkSearch.initCustomEvents === 'function') {\r\n\t\twindow.HawkSearch.initCustomEvents();\r\n\t}\r\n}\r\n\r\nif (document.readyState === 'complete' || document.readyState === 'interactive') {\r\n\tsetTimeout(init);\r\n} else {\r\n\tdocument.addEventListener('DOMContentLoaded', init);\r\n}\r\n\r\nclass ContextDictionary {\r\n\tadd(key: string, value: any) {\r\n\t\tthis[key] = value;\r\n\t}\r\n\r\n\tclear() {\r\n\t\tfor (const key in this) {\r\n\t\t\tthis.remove(key);\r\n\t\t}\r\n\t}\r\n\r\n\tremove(key: string) {\r\n\t\tif (this.hasOwnProperty(key)) {\r\n\t\t\tdelete this[key];\r\n\t\t}\r\n\t}\r\n\r\n\tpush(key: string, value: any) {\r\n\t\tif (this.hasOwnProperty(key)) {\r\n\t\t\tconst existingValue = this[key];\r\n\t\t\tthis[key] = `${existingValue},${value}`;\r\n\t\t} else {\r\n\t\t\tthis.add(key, value);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nconst Context = new ContextDictionary();\r\nconst CustomContext = new ContextDictionary();\r\n\r\n// initialize HawkSearch with values from RocHawkConfig\r\nif (!window.HawkSearch) {\r\n\twindow.HawkSearch = {\r\n\t\tClientGuid: RocHawkConfig.clientGuid,\r\n\t\tTrackingUrl: RocHawkConfig.trackingUrl,\r\n\t\tContext: Context,\r\n\t\tCustomContext: CustomContext,\r\n\t};\r\n}\r\n\r\nconst HawkSearch = window.HawkSearch;\r\n\r\nexport default {\r\n\tTracking: {\r\n\t\ttrack,\r\n\t\t// #region Commerce\r\n\t\ttrackCommerce,\r\n\t\t// #endregion\r\n\t},\r\n\tContext,\r\n\tCustomContext,\r\n};\r\n","/**\r\n * @see HawkSearchConfig.apiUrl\r\n */\r\nexport const defaultApiUrl = 'https://searchapi-dev.hawksearch.net';\r\n\r\n/**\r\n * @see HawkSearchConfig.dashboardUrl\r\n */\r\nexport const defaultDashboardUrl = 'https://dev.hawksearch.net';\r\n\r\n/**\r\n * @see HawkSearchConfig.searchUrl\r\n */\r\nexport const defaultSearchUrl = '/api/v2/search';\r\n\r\n/**\r\n * @see HawkSearchConfig.autocompleteUrl\r\n */\r\nexport const defaultAutocompleteUrl = '/api/autocomplete';\r\n\r\n/**\r\n * @see HawkSearchConfig.searchPageUrl\r\n */\r\nexport const defaultSearchPageUrl = '/search';\r\n\r\n/**\r\n * Endpoint for hawksearch's compare api\r\n */\r\nexport const defaultCompareItemsURL = '/api/v2/compare';\r\n\r\n/**\r\n * @see HawkSearchConfig.recommendationUrl\r\n */\r\nexport const defaultRecommendationUrl = 'https://recs-dev.hawksearch.net';\r\n\r\n/**\r\n * @see HawkSearchConfig.recommendationWidgetUrl\r\n */\r\nexport const recommendationWidgetUrl = '/api/recommendation/v2/getwidgetitems';\r\n\r\n// #region HCL\r\n/**\r\n * @see HawkSearchConfig.enableRemovingDashesFromSearchKeyword\r\n */\r\nexport const enableRemovingDashesFromSearchKeyword = false;\r\n// #endregion\r\n","/**\r\n * Returns visitor expiry date for hawksearch visitor id stored in the cookie for the user.\r\n */\r\nexport function getVisitorExpiry() {\r\n\tconst d = new Date();\r\n\t// 1 year\r\n\td.setTime(d.getTime() + 360 * 24 * 60 * 60 * 1000);\r\n\treturn d.toUTCString();\r\n}\r\n\r\n/**\r\n * Returns visitor expiry date for hawksearch visit id stored in the cookie for the user.\r\n */\r\nexport function getVisitExpiry() {\r\n\tconst d = new Date();\r\n\t// 4 hours\r\n\td.setTime(d.getTime() + 4 * 60 * 60 * 1000);\r\n\treturn d.toUTCString();\r\n}\r\n\r\n/**\r\n * Creates GUID.\r\n */\r\nexport function createGuid() {\r\n\tconst s: string[] = [];\r\n\tconst hexDigits = '0123456789abcdef';\r\n\tfor (let i = 0; i < 36; i++) {\r\n\t\ts[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);\r\n\t}\r\n\ts[14] = '4'; // bits 12-15 of the time_hi_and_version field to 0010\r\n\ts[19] = hexDigits.substr(((s[19] as any) & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01\r\n\ts[8] = s[13] = s[18] = s[23] = '-';\r\n\r\n\treturn s.join('');\r\n}\r\n\r\n/**\r\n * Returns the cookie.\r\n */\r\nexport function getCookie(name) {\r\n\tconst nameEQ = name + '=';\r\n\tconst ca = document.cookie.split(';');\r\n\r\n\tfor (let i = 0; i < ca.length; i++) {\r\n\t\tlet cookie = ca[i];\r\n\r\n\t\twhile (cookie.charAt(0) == ' ') {\r\n\t\t\tcookie = cookie.substring(1, cookie.length);\r\n\t\t}\r\n\r\n\t\tif (cookie.indexOf(nameEQ) == 0) {\r\n\t\t\treturn cookie.substring(nameEQ.length, cookie.length);\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n}\r\n\r\n/**\r\n * Sets the cookie.\r\n */\r\nexport function setCookie(name: string, value: string, expiry?: string) {\r\n\tlet expires = '';\r\n\r\n\tif (expiry) {\r\n\t\texpires = '; expires=' + expiry;\r\n\t}\r\n\r\n\tdocument.cookie = name + '=' + value + expires + '; path=/';\r\n}\r\n","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 addRocEventHandler from 'shared/util/events/rocEventUtils';\r\nimport HawkSearch, { PageType } from './tracking';\r\n\r\nexport default function setup() {\r\n\taddRocEventHandler('hawk-landing-page-viewed', () => {\r\n\t\tHawkSearch.Tracking.track('pageload', {\r\n\t\t\tpageType: PageType.landing,\r\n\t\t\tuniqueId: '',\r\n\t\t});\r\n\t});\r\n\r\n\taddRocEventHandler('hawk-search-tracking', ({ trackingId, searchType }) => {\r\n\t\tif (!trackingId) {\r\n\t\t\t// do not report search unless there is tracking id from hawk\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tHawkSearch.Tracking.track('searchtracking', {\r\n\t\t\ttrackingId: trackingId,\r\n\t\t\ttypeId: searchType,\r\n\t\t});\r\n\t});\r\n\r\n\taddRocEventHandler('hawk-autocomplete-click', ({ keyword, suggestType, itemName, url }) => {\r\n\t\tHawkSearch.Tracking.track('autocompleteclick', {\r\n\t\t\tkeyword: keyword,\r\n\t\t\tsuggestType: suggestType,\r\n\t\t\titemName: itemName,\r\n\t\t\turl: url,\r\n\t\t});\r\n\t});\r\n\r\n\taddRocEventHandler('hawk-recommendation-click', ({ itemIndex, requestId, uniqueId, widgetGuid }) => {\r\n\t\tHawkSearch.Tracking.track('recommendationclick', {\r\n\t\t\tuniqueId: uniqueId,\r\n\t\t\titemIndex: itemIndex,\r\n\t\t\trequestId: requestId,\r\n\t\t\twidgetGuid: widgetGuid,\r\n\t\t});\r\n\t});\r\n}\r\n"],"sourceRoot":""}