@envive-ai/react-hooks 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. package/LICENSE +2 -0
  2. package/README.md +2 -0
  3. package/dist/GridInsertionService-CEYo9pGj.js +22 -0
  4. package/dist/GridInsertionService-CS_bnPh0.cjs +28 -0
  5. package/dist/bandolier-Ble8jEa8.js +1221 -0
  6. package/dist/bandolier-Bm2xAt_j.cjs +1221 -0
  7. package/dist/carpe-Da7b-LCW.cjs +599 -0
  8. package/dist/carpe-W13mhRRP.js +597 -0
  9. package/dist/cdnService-CZ-aXcY6.cjs +23 -0
  10. package/dist/cdnService-zQfKk3Eb.js +18 -0
  11. package/dist/chatElementDisplayLocation-CX8fuNao.d.cts +239 -0
  12. package/dist/chatElementDisplayLocation-CwptS9tx.d.ts +239 -0
  13. package/dist/chunk-CUT6urMc.cjs +30 -0
  14. package/dist/contexts/index.cjs +13 -0
  15. package/dist/contexts/index.d.cts +65 -0
  16. package/dist/contexts/index.d.ts +66 -0
  17. package/dist/contexts/index.js +7 -0
  18. package/dist/contexts-BRjfVq_k.js +5064 -0
  19. package/dist/contexts-BYArqZtK.cjs +5164 -0
  20. package/dist/coterie-3y0D9ko4.cjs +229 -0
  21. package/dist/coterie-DOWcJAYv.js +229 -0
  22. package/dist/custservice-types-CFIFwZ-r.js +10 -0
  23. package/dist/custservice-types-CkfxZiHY.cjs +16 -0
  24. package/dist/default-C2fEZKXk.js +175 -0
  25. package/dist/default-CBUq6Q6G.cjs +4 -0
  26. package/dist/default-CGIFZK6m.js +4 -0
  27. package/dist/default-D_KPZdPJ.cjs +198 -0
  28. package/dist/divIds-Bss-btao.js +49 -0
  29. package/dist/divIds-DnZNd7rA.cjs +223 -0
  30. package/dist/dreamlandBaby-DCIsuU9R.cjs +338 -0
  31. package/dist/dreamlandBaby-DvSaZGrz.js +338 -0
  32. package/dist/entrypoints-D_JUvkgy.cjs +18 -0
  33. package/dist/entrypoints-YLQsbBRD.js +6 -0
  34. package/dist/enviveConfigContext-CUGLpPGU.js +34 -0
  35. package/dist/enviveConfigContext-Dfr2VH6u.cjs +48 -0
  36. package/dist/fiveCbd-B1SESMCO.js +605 -0
  37. package/dist/fiveCbd-CkOlVby_.cjs +605 -0
  38. package/dist/forLoveAndLemons-CfYPMnKS.cjs +660 -0
  39. package/dist/forLoveAndLemons-DmwYZIk0.js +658 -0
  40. package/dist/greenpan-Bsl3ir59.cjs +389 -0
  41. package/dist/greenpan-BtOi45lf.js +389 -0
  42. package/dist/grooveLife-6_dtYsRk.js +334 -0
  43. package/dist/grooveLife-Cmm1PSCL.cjs +334 -0
  44. package/dist/homegrownCannabis-C-kw-74X.js +400 -0
  45. package/dist/homegrownCannabis-CO0uY_mp.cjs +400 -0
  46. package/dist/hooks/index.cjs +16 -0
  47. package/dist/hooks/index.d.cts +357 -0
  48. package/dist/hooks/index.d.ts +357 -0
  49. package/dist/hooks/index.js +7 -0
  50. package/dist/jackArcher-CLVmwwpI.js +719 -0
  51. package/dist/jackArcher-DdYTIzAV.cjs +719 -0
  52. package/dist/jordanCraig-Am-Oor-O.js +1778 -0
  53. package/dist/jordanCraig-_u3-w4Hp.cjs +1778 -0
  54. package/dist/kindredBravely-CWovIDSc.cjs +482 -0
  55. package/dist/kindredBravely-eWp-ud_E.js +482 -0
  56. package/dist/kutFromTheKloth-BMV4BuGQ.js +361 -0
  57. package/dist/kutFromTheKloth-Q589bAOC.cjs +361 -0
  58. package/dist/larryAndSerges-BMUlTgI-.js +252 -0
  59. package/dist/larryAndSerges-CEau764j.cjs +252 -0
  60. package/dist/leapsAndRebounds-DGMzPO7T.js +352 -0
  61. package/dist/leapsAndRebounds-DHAtRTJD.cjs +352 -0
  62. package/dist/logger-Dln20ans.cjs +25 -0
  63. package/dist/logger-pdEEY8T2.js +19 -0
  64. package/dist/longevityrx-CZW8Hxzi.cjs +312 -0
  65. package/dist/longevityrx-jH2JLhNH.js +312 -0
  66. package/dist/lookOptic-BGXP5P_V.js +274 -0
  67. package/dist/lookOptic-CA6RwLbG.cjs +274 -0
  68. package/dist/mantraBrand-Cm9_PBCT.js +742 -0
  69. package/dist/mantraBrand-DByNqpnL.cjs +742 -0
  70. package/dist/medterra-B0wxj_PV.js +575 -0
  71. package/dist/medterra-DnPN2ksU.cjs +575 -0
  72. package/dist/modells-Bmz8Ag5M.js +476 -0
  73. package/dist/modells-CoYgkLSp.cjs +476 -0
  74. package/dist/models-DHdb7QWn.js +51 -0
  75. package/dist/models-ixxUsGL_.cjs +69 -0
  76. package/dist/pressedFloral-DSKs_oVG.js +653 -0
  77. package/dist/pressedFloral-DjBiSoUl.cjs +653 -0
  78. package/dist/skinPerfection-B_3xzVNS.cjs +326 -0
  79. package/dist/skinPerfection-IDrBuAPt.js +326 -0
  80. package/dist/snapSupplements-BJk5T5ba.js +277 -0
  81. package/dist/snapSupplements-BStTsdOZ.cjs +277 -0
  82. package/dist/socialProofClasses-Bhv2Vulz.js +9 -0
  83. package/dist/socialProofClasses-CrQBWdSA.cjs +39 -0
  84. package/dist/spanx-BYg0LE7R.js +653 -0
  85. package/dist/spanx-LwU1zSzq.cjs +655 -0
  86. package/dist/spanxStaging-CfSmuKYB.js +837 -0
  87. package/dist/spanxStaging-OZLV9qix.cjs +840 -0
  88. package/dist/suggestionBarV2-types-BllzwsBD.js +34 -0
  89. package/dist/suggestionBarV2-types-CaovchMP.cjs +46 -0
  90. package/dist/supergoop-BqPXDnKk.cjs +327 -0
  91. package/dist/supergoop-CIlrHND_.js +325 -0
  92. package/dist/types-C4T5UOIW.cjs +230 -0
  93. package/dist/types-CYNvLeSA.js +176 -0
  94. package/dist/uniqueVintage-B30mOqbH.cjs +1205 -0
  95. package/dist/uniqueVintage-CFueJOhO.js +1203 -0
  96. package/dist/venaCbd-DHGZy49P.cjs +357 -0
  97. package/dist/venaCbd-T0CqVD4k.js +357 -0
  98. package/dist/westonJonBoucher-BdMzs_Yg.cjs +414 -0
  99. package/dist/westonJonBoucher-b4TCQ4ev.js +414 -0
  100. package/dist/wineEnthusiast-BLGlOjgr.cjs +932 -0
  101. package/dist/wineEnthusiast-BqR0i_54.js +932 -0
  102. package/dist/wolfMattress-CyyO-LoC.js +362 -0
  103. package/dist/wolfMattress-DNGZOivg.cjs +362 -0
  104. package/dist/wolfTactical-3Mm2fvVF.js +341 -0
  105. package/dist/wolfTactical-BmXYlFjr.cjs +341 -0
  106. package/package.json +66 -0
  107. package/src/adapters/amplitude/amplitudeAdapter.ts +454 -0
  108. package/src/adapters/amplitude/index.ts +2 -0
  109. package/src/adapters/amplitude/stubAmplitudeAdapter.ts +34 -0
  110. package/src/adapters/spiffy/commerce/api.ts +596 -0
  111. package/src/adapters/spiffy/commerce/exceptions/sessionExceptions.ts +6 -0
  112. package/src/adapters/spiffy/commerce/exceptions/unsupportedProductExceptions.ts +6 -0
  113. package/src/adapters/spiffy/commerce/graphql.ts +184 -0
  114. package/src/application/config/generalStaticConfig.ts +37 -0
  115. package/src/application/logging/logger.ts +29 -0
  116. package/src/application/models/api/context.ts +4 -0
  117. package/src/application/models/api/generationParams.ts +4 -0
  118. package/src/application/models/api/nextMessageRequest.ts +11 -0
  119. package/src/application/models/api/orgAnalyticsConfig.ts +19 -0
  120. package/src/application/models/api/orgConfigResults.ts +40 -0
  121. package/src/application/models/api/organizationConfig.ts +12 -0
  122. package/src/application/models/api/response.ts +132 -0
  123. package/src/application/models/api/responseGenerics.ts +67 -0
  124. package/src/application/models/api/search.ts +26 -0
  125. package/src/application/models/api/suggestion.ts +4 -0
  126. package/src/application/models/api/supportedEventRequest.ts +8 -0
  127. package/src/application/models/api/userEvent.ts +101 -0
  128. package/src/application/models/cachedValue.ts +8 -0
  129. package/src/application/models/chatElementDisplayLocation.ts +22 -0
  130. package/src/application/models/clientDetails.ts +18 -0
  131. package/src/application/models/colorsConfig.ts +28 -0
  132. package/src/application/models/conversationalSearchIds.ts +5 -0
  133. package/src/application/models/dataLayer.ts +45 -0
  134. package/src/application/models/domMutationContinuation.ts +7 -0
  135. package/src/application/models/domObservationStrategy.ts +9 -0
  136. package/src/application/models/events.ts +5 -0
  137. package/src/application/models/featureGates.ts +23 -0
  138. package/src/application/models/frontendConfig.ts +14 -0
  139. package/src/application/models/googleAnalyticsEvents.ts +8 -0
  140. package/src/application/models/graphql/index.ts +2 -0
  141. package/src/application/models/graphql/queries/getMerchantColorsQuery.ts +37 -0
  142. package/src/application/models/graphql/queries/getMerchantFrontendConfigQuery.ts +103 -0
  143. package/src/application/models/graphql/queries/getMerchantOrgIdQuery.ts +11 -0
  144. package/src/application/models/guards/api/index.ts +12 -0
  145. package/src/application/models/guards/api/isApiFormResponse.ts +90 -0
  146. package/src/application/models/guards/api/isApiFormSubmittedResponseAttributes.ts +37 -0
  147. package/src/application/models/guards/api/isApiOrderResponseAttributes.ts +155 -0
  148. package/src/application/models/guards/api/isApiOrgConfigResults.ts +277 -0
  149. package/src/application/models/guards/api/isApiOrganizationConfig.ts +207 -0
  150. package/src/application/models/guards/api/isApiPDPEventAttributes.ts +21 -0
  151. package/src/application/models/guards/api/isApiPLPEventAttributes.ts +41 -0
  152. package/src/application/models/guards/api/isApiPageResponseAttributes.ts +21 -0
  153. package/src/application/models/guards/api/isApiProductResponseAttributes.ts +85 -0
  154. package/src/application/models/guards/api/isApiProductSearchAttributes.ts +23 -0
  155. package/src/application/models/guards/api/isApiProductSearchFilterAttributes.ts +15 -0
  156. package/src/application/models/guards/api/isApiQueryTypedEventAttributes.ts +4 -0
  157. package/src/application/models/guards/api/isApiResponse.ts +39 -0
  158. package/src/application/models/guards/api/isApiReviewResponseAttributes.ts +30 -0
  159. package/src/application/models/guards/api/isApiReviewRichInformation.ts +37 -0
  160. package/src/application/models/guards/api/isApiSearchEventAttributes.ts +28 -0
  161. package/src/application/models/guards/api/isApiSuggestion.ts +36 -0
  162. package/src/application/models/guards/api/isApiSuggestionClickedEventAttributes.ts +9 -0
  163. package/src/application/models/guards/api/isApiTextResponseAttributes.ts +9 -0
  164. package/src/application/models/guards/api/isApiUserEvent.ts +25 -0
  165. package/src/application/models/guards/graphQL/isGraphQLColorsConfig.ts +50 -0
  166. package/src/application/models/guards/isBaseEcommerceEvent.ts +17 -0
  167. package/src/application/models/guards/isGA4EcommerceEvent.ts +17 -0
  168. package/src/application/models/guards/isLegacyUAEcommerceEvent.ts +17 -0
  169. package/src/application/models/guards/isMobilePLPChatPlacementParameter.ts +11 -0
  170. package/src/application/models/guards/isSpanxTakeAQuizCtaParameter.ts +4 -0
  171. package/src/application/models/guards/isVariantInfo.ts +37 -0
  172. package/src/application/models/guards/utils.ts +43 -0
  173. package/src/application/models/index.ts +20 -0
  174. package/src/application/models/localStorageEventListener.ts +4 -0
  175. package/src/application/models/message.ts +146 -0
  176. package/src/application/models/mobilePLPChatPlacementParameter.ts +3 -0
  177. package/src/application/models/orgsEnum.ts +36 -0
  178. package/src/application/models/productExperiment.ts +5 -0
  179. package/src/application/models/spanxTakeAQuizCtaParameter.ts +4 -0
  180. package/src/application/models/spiffyWidgets.ts +16 -0
  181. package/src/application/models/supportedOrgs.ts +137 -0
  182. package/src/application/models/utilityTypes/camelCase.ts +87 -0
  183. package/src/application/models/utilityTypes/camelCasedPropertiesDeep.ts +80 -0
  184. package/src/application/models/utilityTypes/delimiterCase.ts +121 -0
  185. package/src/application/models/utilityTypes/delimiterCasedPropertiesDeep.ts +98 -0
  186. package/src/application/models/utilityTypes/index.ts +1 -0
  187. package/src/application/models/utilityTypes/internal.ts +93 -0
  188. package/src/application/models/utilityTypes/primitive.ts +8 -0
  189. package/src/application/models/utilityTypes/snakeCasedPropertiesDeep.ts +49 -0
  190. package/src/application/models/utilityTypes/splitWords.ts +76 -0
  191. package/src/application/models/utilityTypes/trim.ts +28 -0
  192. package/src/application/models/utilityTypes/unknownArray.ts +25 -0
  193. package/src/application/models/utils/snakeToCamelTransformer.ts +90 -0
  194. package/src/application/models/utils/stringToFulfillmentDisplayStatusEnumValue.ts +68 -0
  195. package/src/application/models/validators/validateGraphQLColorsConfig.ts +29 -0
  196. package/src/application/models/validators/validateGraphQLFrontendConfig.ts +594 -0
  197. package/src/application/models/validators/validateGraphQLOrgId.ts +7 -0
  198. package/src/application/models/validators/validateMobilePLPChatPlacementParameter.ts +14 -0
  199. package/src/application/models/validators/validateOrgConfigResults.ts +47 -0
  200. package/src/application/models/validators/validateOrganizationConfig.ts +37 -0
  201. package/src/application/models/validators/validateResponse.ts +187 -0
  202. package/src/application/models/validators/validateSuggestion.ts +16 -0
  203. package/src/application/models/validators/validateUserEvent.ts +110 -0
  204. package/src/application/models/variantInfo/index.ts +1 -0
  205. package/src/application/models/variantInfo/pageVisitInfo.ts +6 -0
  206. package/src/application/models/variantInfo/plpInfo.ts +3 -0
  207. package/src/application/models/variantInfo/productInfo.ts +5 -0
  208. package/src/application/models/variantInfo/variantInfo.ts +23 -0
  209. package/src/application/service/cachingService.ts +84 -0
  210. package/src/application/service/cdnService.ts +18 -0
  211. package/src/application/service/customerService/index.ts +8 -0
  212. package/src/application/service/customerService/providers/UnsupportedCustomerService.ts +15 -0
  213. package/src/application/service/customerService/types.ts +31 -0
  214. package/src/application/service/domMutationObserver.ts +320 -0
  215. package/src/application/service/domMutations/GridInsertionService.ts +123 -0
  216. package/src/application/service/domMutations/dataLayer/dataLayerEventsListener.ts +99 -0
  217. package/src/application/service/domMutations/domInsertionService.ts +90 -0
  218. package/src/application/service/domMutations/domMutationListener.ts +15 -0
  219. package/src/application/service/domMutations/domMutationListenerState.ts +52 -0
  220. package/src/application/service/domMutations/floatingChat/embeddedChatsPlacementsListener.ts +41 -0
  221. package/src/application/service/domMutations/gladly/gladlyListener.ts +61 -0
  222. package/src/application/service/domMutations/spiffy/orgs/common/kustomerVisibilityListener.ts +41 -0
  223. package/src/application/service/domMutations/spiffy/orgs/common/orgsCommonDataLayerListener.ts +119 -0
  224. package/src/application/service/environmentService.ts +51 -0
  225. package/src/application/service/featureFlagService.ts +130 -0
  226. package/src/application/service/kustomerIntegrationService.ts +111 -0
  227. package/src/application/service/localStorageService.ts +77 -0
  228. package/src/application/service/pageVariantService.ts +779 -0
  229. package/src/application/service/searchService.ts +140 -0
  230. package/src/application/service/sessionStorageService.ts +27 -0
  231. package/src/application/service/shopifyUrlService.ts +63 -0
  232. package/src/application/service/userIdentityService.ts +114 -0
  233. package/src/application/service/windowChatToggleService.ts +71 -0
  234. package/src/application/service/windowDataLayerService.ts +181 -0
  235. package/src/application/service/windowFrontendConfigService.ts +104 -0
  236. package/src/application/utils/__tests__/divideArrays.test.ts +14 -0
  237. package/src/application/utils/analyticsUtils.ts +110 -0
  238. package/src/application/utils/coreContextToApiContext.ts +11 -0
  239. package/src/application/utils/coreUserEventToApiUserEvent.ts +106 -0
  240. package/src/application/utils/divideArray.ts +7 -0
  241. package/src/application/utils/domObserver.ts +96 -0
  242. package/src/application/utils/elementObserver.ts +246 -0
  243. package/src/application/utils/imageFilter.ts +12 -0
  244. package/src/application/utils/index.ts +3 -0
  245. package/src/application/utils/merchantUtils.ts +16 -0
  246. package/src/application/utils/messageFromFormSubmittedEvent.ts +31 -0
  247. package/src/application/utils/messageFromQueryEvent.ts +38 -0
  248. package/src/application/utils/messageFromResponse.ts +133 -0
  249. package/src/application/utils/messageFromSuggestionEvent.ts +32 -0
  250. package/src/application/utils/mouseEventTypes.ts +1 -0
  251. package/src/application/utils/mutationHelper.ts +51 -0
  252. package/src/application/utils/nextMessageRequestToApiRequest.ts +31 -0
  253. package/src/application/utils/nodeSelector.ts +133 -0
  254. package/src/application/utils/overrides.ts +196 -0
  255. package/src/application/utils/stringUtils.ts +55 -0
  256. package/src/application/utils/supportedEventRequestToApiRequest.ts +12 -0
  257. package/src/application/utils/urlsParser.ts +53 -0
  258. package/src/application/utils/validation.ts +5 -0
  259. package/src/atoms/app/index.ts +57 -0
  260. package/src/atoms/app/variant.ts +261 -0
  261. package/src/atoms/atomStore.ts +34 -0
  262. package/src/atoms/chat/chatState.ts +44 -0
  263. package/src/atoms/chat/form.ts +19 -0
  264. package/src/atoms/chat/index.ts +38 -0
  265. package/src/atoms/chat/lastMessage.ts +11 -0
  266. package/src/atoms/chat/messageQueue.ts +65 -0
  267. package/src/atoms/chat/performanceMetrics.ts +84 -0
  268. package/src/atoms/chat/renderedWidgetRefs.ts +28 -0
  269. package/src/atoms/chat/replies.ts +51 -0
  270. package/src/atoms/chat/suggestions.ts +36 -0
  271. package/src/atoms/globalSearch.ts +12 -0
  272. package/src/atoms/index.ts +5 -0
  273. package/src/atoms/org/customerService.ts +13 -0
  274. package/src/atoms/org/graphqlConfig.ts +27 -0
  275. package/src/atoms/org/index.ts +7 -0
  276. package/src/atoms/org/merchantCss.ts +44 -0
  277. package/src/atoms/org/org.ts +256 -0
  278. package/src/atoms/org/orgAnalyticsConfig.ts +28 -0
  279. package/src/atoms/org/orgPageConfig.ts +38 -0
  280. package/src/atoms/org/orgUIConfig.ts +122 -0
  281. package/src/atoms/search/chatSearch.ts +293 -0
  282. package/src/atoms/search/index.ts +2 -0
  283. package/src/atoms/search/productFilters.ts +207 -0
  284. package/src/atoms/search/productSorter.ts +23 -0
  285. package/src/atoms/search/searchAPI.ts +194 -0
  286. package/src/atoms/search/types.ts +55 -0
  287. package/src/atoms/search/utils.ts +18 -0
  288. package/src/config/divIds.ts +27 -0
  289. package/src/config/locators/components/chat/entrypoints.ts +13 -0
  290. package/src/config/locators/components/chat/index.ts +23 -0
  291. package/src/config/locators/components/chat/preview.ts +13 -0
  292. package/src/config/locators/components/chat/variants/index.ts +16 -0
  293. package/src/config/locators/components/common/buttons.ts +6 -0
  294. package/src/config/locators/components/common/cards.ts +18 -0
  295. package/src/config/locators/components/common/links.ts +1 -0
  296. package/src/config/locators/components/common/tables.ts +2 -0
  297. package/src/config/locators/components/floating-button.ts +2 -0
  298. package/src/config/locators/components/index.ts +3 -0
  299. package/src/config/locators/components/report-issue.ts +21 -0
  300. package/src/config/locators/components/search/index.ts +5 -0
  301. package/src/config/locators/components/shadow-dom.ts +1 -0
  302. package/src/config/locators/embedded.ts +21 -0
  303. package/src/config/locators/index.ts +3 -0
  304. package/src/config/socialProofClasses.ts +17 -0
  305. package/src/contexts/chatContext.tsx +451 -0
  306. package/src/contexts/enviveConfigContext.tsx +70 -0
  307. package/src/contexts/index.ts +4 -0
  308. package/src/contexts/systemSettingsContext.tsx +61 -0
  309. package/src/contexts/types.ts +1059 -0
  310. package/src/enabled-features.ts +83 -0
  311. package/src/events/event-types.ts +11 -0
  312. package/src/events/index.ts +52 -0
  313. package/src/events/registerAnalyticsListeners.ts +49 -0
  314. package/src/extension.ts +63 -0
  315. package/src/hooks/index.ts +22 -0
  316. package/src/hooks/useBlockBackButton.ts +29 -0
  317. package/src/hooks/useChatToggle.ts +66 -0
  318. package/src/hooks/useCustomerSupportHandoff.ts +39 -0
  319. package/src/hooks/useDebounce.ts +17 -0
  320. package/src/hooks/useDynamicVariants.ts +210 -0
  321. package/src/hooks/useElementObserver.ts +245 -0
  322. package/src/hooks/useFileUpload.ts +61 -0
  323. package/src/hooks/useGrabAndScroll.ts +133 -0
  324. package/src/hooks/useHideElements.ts +82 -0
  325. package/src/hooks/useHorizontalScrollAnimation.ts +115 -0
  326. package/src/hooks/useImageResolver.ts +51 -0
  327. package/src/hooks/useIntersection.ts +28 -0
  328. package/src/hooks/useIsSmallScreen.ts +23 -0
  329. package/src/hooks/useMessageFilter.ts +49 -0
  330. package/src/hooks/useMessageScrollObserver.ts +47 -0
  331. package/src/hooks/useReducedMotionWithOverride.ts +15 -0
  332. package/src/hooks/useSearch.tsx +433 -0
  333. package/src/hooks/useSnapCalculator.ts +38 -0
  334. package/src/hooks/useSnapControl.ts +155 -0
  335. package/src/hooks/useSystemSettingsContext.ts +12 -0
  336. package/src/hooks/useTrackComponentVisibleEvent.ts +52 -0
  337. package/src/hooks/useUpdateAnalyticsProps.ts +56 -0
  338. package/src/hooks/utils.ts +153 -0
  339. package/src/index.ts +31 -0
  340. package/src/initialize.ts +163 -0
  341. package/src/interceptors/types.ts +6 -0
  342. package/src/interceptors/useFormEscalation.ts +40 -0
  343. package/src/interceptors/useMessageInterceptor.ts +32 -0
  344. package/src/main.ts +85 -0
  345. package/src/main.tsx +123 -0
  346. package/src/merchants/bandolier/bandolier.ts +1389 -0
  347. package/src/merchants/carpe/carpe.ts +656 -0
  348. package/src/merchants/coterie/coterie.ts +280 -0
  349. package/src/merchants/default.ts +193 -0
  350. package/src/merchants/dreamlandBaby/dreamlandBaby.ts +375 -0
  351. package/src/merchants/fiveCbd/fiveCbd.ts +697 -0
  352. package/src/merchants/forLoveAndLemons/forLoveAndLemons.ts +721 -0
  353. package/src/merchants/greenpan/greenpan.ts +440 -0
  354. package/src/merchants/grooveLife/grooveLife.ts +386 -0
  355. package/src/merchants/homegrownCannabis/homegrownCannabis.ts +468 -0
  356. package/src/merchants/init-merchant.sh +53 -0
  357. package/src/merchants/jackArcher/jackArcher.ts +974 -0
  358. package/src/merchants/jordanCraig/jordanCraig.ts +1927 -0
  359. package/src/merchants/kindredBravely/kindredBravely.ts +529 -0
  360. package/src/merchants/kutFromTheKloth/kutFromTheKloth.ts +418 -0
  361. package/src/merchants/larryAndSerges/larryAndSerges.ts +314 -0
  362. package/src/merchants/leapsAndRebounds/leapsAndRebounds.ts +424 -0
  363. package/src/merchants/longevityrx/longevityrx.ts +368 -0
  364. package/src/merchants/lookOptic/lookOptic.ts +323 -0
  365. package/src/merchants/mantraBrand/mantraBrand.ts +838 -0
  366. package/src/merchants/medterra/medterra.ts +670 -0
  367. package/src/merchants/modells/modells.ts +546 -0
  368. package/src/merchants/pressedFloral/pressedFloral.ts +734 -0
  369. package/src/merchants/skinPerfection/skinPerfection.ts +379 -0
  370. package/src/merchants/snapSupplements/snapSupplements.ts +325 -0
  371. package/src/merchants/spanx/spanx.ts +810 -0
  372. package/src/merchants/spanx/spanxStaging.ts +942 -0
  373. package/src/merchants/supergoop/supergoop.ts +376 -0
  374. package/src/merchants/uniqueVintage/uniqueVintage.ts +1314 -0
  375. package/src/merchants/uniqueVintage/views/useUniqueVintageChatSearch.ts +147 -0
  376. package/src/merchants/venaCbd/venaCbd.ts +410 -0
  377. package/src/merchants/westonJonBoucher/westonJonBoucher.ts +473 -0
  378. package/src/merchants/wineEnthusiast/wineEnthusiast.ts +990 -0
  379. package/src/merchants/wolfMattress/wolfMattress.ts +411 -0
  380. package/src/merchants/wolfTactical/wolfTactical.ts +389 -0
  381. package/src/types/custservice-types.ts +28 -0
  382. package/src/types/search-filter-types.ts +111 -0
  383. package/src/types/suggestionBarV2-types.ts +4 -0
  384. package/src/types/test-types.ts +3 -0
  385. package/src/types.ts +66 -0
@@ -0,0 +1,454 @@
1
+ import Logger from "src/application/logging/logger";
2
+ import { createInstance } from "@amplitude/analytics-browser";
3
+ // import { sessionReplayPlugin } from '@amplitude/plugin-session-replay-browser';
4
+ import { FeatureGates } from "src/application/models/featureGates";
5
+ import { OrgConfig } from "src/application/models/api/orgConfigResults";
6
+ import { OrgShortName } from "src/application/models";
7
+ import { FeatureFlagService } from "src/application/service/featureFlagService";
8
+ import { userIdAtom } from "src/atoms/app";
9
+ import { getAtomStore } from "src/atoms/atomStore";
10
+ import { featureFlagServiceAtom, orgConfigAtom } from "src/atoms/org/org";
11
+ import { WindowDataLayerService } from "src/application/service/windowDataLayerService";
12
+ import { orgAnalyticsGoogleAnalyticsConfigAtom } from "src/atoms/org/orgAnalyticsConfig";
13
+ import { OrgAnalyticsGoogleAnalyticsConfig } from "src/application/models/api/orgAnalyticsConfig";
14
+ import { EnvironmentService } from "src/application/service/environmentService";
15
+ import {
16
+ LocalStorageKeys,
17
+ LocalStorageService,
18
+ } from "src/application/service/localStorageService";
19
+ import { StubAmplitudeAdapter } from "src/adapters/amplitude";
20
+ import { ContextSourceEnum } from "@spiffy-ai/commerce-api-client";
21
+ import { useEnviveConfig } from "src/contexts/enviveConfigContext";
22
+
23
+ import type {
24
+ BrowserClient,
25
+ EnrichmentPlugin,
26
+ Event,
27
+ ServerZoneType,
28
+ } from "@amplitude/analytics-types";
29
+ import { EnabledFeatures } from "src/enabled-features";
30
+ import { EventsDispatcher, SpiffyEvent } from "src/events";
31
+
32
+ export enum SpiffyMetricsEventName {
33
+ BundleLoaded = "Bundle Loaded",
34
+ ChatLiveAgentBtnClick = "Chat Live Agent Btn Click",
35
+ ChatFloatingButtonVisible = "Chat Floating Button Visible",
36
+ ChatComponentVisible = "Chat Component Visible",
37
+ ChatComponentExpanded = "Chat Component Expanded",
38
+ ChatComponentCollapsed = "Chat Component Collapsed",
39
+ ChatUserMessageInput = "Chat User Message Input",
40
+ ChatSuggestionClicked = "Chat Suggestion Clicked",
41
+ ChatAssistantResponse = "Chat Assistant Response",
42
+ ProductCardClicked = "Product Card Clicked",
43
+ ProductReviewCardClicked = "Product Review Card Clicked",
44
+ AddToCartClicked = "Add to Cart Clicked",
45
+ PromptCardClicked = "Prompt Card Clicked",
46
+ SupportedEvent = "Supported Event",
47
+ SearchBackToResponseClicked = "Search Back to Response Clicked",
48
+ PerformanceMetrics = "Performance Metrics",
49
+ SearchBarClicked = "Search Bar Clicked",
50
+ OrderLookupStarted = "Order Lookup Started",
51
+ OrderLookupFormSubmitted = "Order Lookup Form Submitted",
52
+ SearchComponentVisible = "Search Component Visible",
53
+ GlobalSearchPromptClicked = "Global Search Prompt Clicked", // This is the scrolling list of suggestion buttons in global search
54
+ SearchInputStarted = "Search Input Started",
55
+ SearchQuerySubmitted = "Search Query Submitted",
56
+ // SearchAutocompleteViewed = 'Search Autocomplete Viewed', // TODO: add this when autocomplete is added
57
+ // SearchAutocompleteClicked = 'Search Autocomplete Clicked', // TODO: add this when autocomplete is added
58
+ SearchResultsViewed = "Search Results Viewed",
59
+ SearchTimeToFirstClick = "Search Time to First Click",
60
+ SearchZeroResultsRate = "Search Zero Results Rate",
61
+ SearchFilterClicked = "Search Filter Clicked",
62
+ SearchSortClicked = "Search Sort Clicked",
63
+ }
64
+
65
+ class AmplitudeAdapter {
66
+ private underlyingAmplitudeClient: BrowserClient | undefined = undefined;
67
+
68
+ private internalEventTrackingEnrichment: EnrichmentPlugin | undefined =
69
+ undefined;
70
+
71
+ private supplementalDefaultProps: Record<string, unknown>;
72
+
73
+ constructor(
74
+ private readonly userId: string,
75
+ private readonly orgConfig: OrgConfig,
76
+ private readonly featureFlagService: FeatureFlagService,
77
+ private readonly orgGaConfig?: OrgAnalyticsGoogleAnalyticsConfig
78
+ ) {
79
+ this.supplementalDefaultProps = {};
80
+ }
81
+
82
+ init(): void {
83
+ this.underlyingAmplitudeClient = this.createUnderlyingClient();
84
+ }
85
+
86
+ getUnderlyingAmplitudeClient(): BrowserClient | undefined {
87
+ return this.underlyingAmplitudeClient;
88
+ }
89
+
90
+ getSupplementalDefaultProps(): Record<string, unknown> {
91
+ return this.supplementalDefaultProps;
92
+ }
93
+
94
+ setSupplementalDefaultProps(
95
+ supplementalDefaultProps: Record<string, unknown>
96
+ ): void {
97
+ this.supplementalDefaultProps = supplementalDefaultProps;
98
+ }
99
+
100
+ getEventTrackingEnrichment(): EnrichmentPlugin {
101
+ if (this.internalEventTrackingEnrichment !== undefined) {
102
+ return this.internalEventTrackingEnrichment;
103
+ }
104
+
105
+ this.internalEventTrackingEnrichment = {
106
+ name: "page-view-tracking-enrichment",
107
+ type: "enrichment",
108
+ setup: async () => undefined,
109
+ execute: async (event: Event): Promise<Event> => {
110
+ let enrichedEvent: Event;
111
+
112
+ const eventsToEnrich = [
113
+ "[Amplitude] Page Viewed",
114
+ `[Spiffy] ${SpiffyMetricsEventName.BundleLoaded}`,
115
+ ];
116
+
117
+ if (eventsToEnrich.includes(event.event_type)) {
118
+ const windowProps = window._spiffy ? { ...window._spiffy } : {};
119
+
120
+ if (windowProps.publicKey) {
121
+ delete windowProps.publicKey;
122
+ }
123
+
124
+ const globalProperties = Object.entries(windowProps).reduce<
125
+ Record<string, string>
126
+ >(
127
+ (acc, [key, value]) => ({
128
+ ...acc,
129
+ [`globalProperties.${key}`]: `${value}`,
130
+ }),
131
+ {}
132
+ );
133
+
134
+ const enabledFeatures = await EnabledFeatures.get(
135
+ this.orgConfig,
136
+ this.featureFlagService
137
+ );
138
+ const enabledFeaturesProperties = Object.entries(
139
+ enabledFeatures
140
+ ).reduce<Record<string, string>>(
141
+ (acc, [key, value]) => ({
142
+ ...acc,
143
+ [`enabledFeatures.${key}`]: `${value}`,
144
+ }),
145
+ {}
146
+ );
147
+
148
+ const timingProperties = {
149
+ // This property can be useful to detect bias in A/B testing.
150
+ //
151
+ // It is a proxy metric for the value of "Started" (in Dev Tools > Network > Timing)
152
+ // for the network request to send the Page Viewed event to Amplitude.
153
+ //
154
+ // If the value is higher for one group, visitors in that group are subject to
155
+ // a higher likelihood that the page fails to send the event to Amplitude before
156
+ // they navigate away, leading to relative underreporting of page views for that group.
157
+ "timing.enriched_at_ms": window.performance?.now(),
158
+ };
159
+
160
+ enrichedEvent = {
161
+ ...event,
162
+ event_properties: {
163
+ ...event.event_properties,
164
+ ...this.getDefaultTrackingProps(),
165
+ ...globalProperties,
166
+ ...enabledFeaturesProperties,
167
+ ...timingProperties,
168
+ },
169
+ };
170
+ } else {
171
+ enrichedEvent = event;
172
+ }
173
+
174
+ EventsDispatcher.dispatch(SpiffyEvent.AMPLITUDE_EVENT, enrichedEvent);
175
+
176
+ return enrichedEvent;
177
+ },
178
+ };
179
+
180
+ return this.internalEventTrackingEnrichment;
181
+ }
182
+
183
+ amplitudeSessionReplayInit(): boolean {
184
+ // TODO: enable session replay only for UV so we can triage issues with search analytics
185
+ // remove when we can easily do this through AI Studio or no longer needed for UV
186
+ const orgShortName = this.orgConfig.org.org.shortName;
187
+ const isEnabled =
188
+ orgShortName === OrgShortName.UniqueVintage &&
189
+ this.featureFlagService.isClientSessionEnabled() &&
190
+ this.featureFlagService.isFeatureGateEnabled(
191
+ FeatureGates.IsNewFeatureEnabled
192
+ );
193
+ const sampleRate = 1;
194
+
195
+ try {
196
+ Logger.logDebug(
197
+ `[spiffy-ai] amplitude session-replay initializing isEnabled=${isEnabled} sampleRate=${sampleRate}`
198
+ );
199
+
200
+ if (!isEnabled) {
201
+ return isEnabled;
202
+ }
203
+
204
+ // amplitudeInstance.add(sessionReplayPlugin({ sampleRate }));
205
+
206
+ return isEnabled;
207
+ } catch (e) {
208
+ Logger.logError(
209
+ "[spiffy-ai] Error initializing amplitude session-replay",
210
+ e
211
+ );
212
+ return false;
213
+ }
214
+ }
215
+
216
+ createUnderlyingClient(): BrowserClient {
217
+ const { amplitudeApiKey, dataResidency } = useEnviveConfig();
218
+ const currentAmplitudeInstance: BrowserClient = createInstance();
219
+ const isSessionsEnabled = this.amplitudeSessionReplayInit();
220
+ currentAmplitudeInstance.add(this.getEventTrackingEnrichment());
221
+ currentAmplitudeInstance.init(amplitudeApiKey, this.userId, {
222
+ serverZone: dataResidency as ServerZoneType,
223
+ trackingOptions: {
224
+ ipAddress: true,
225
+ },
226
+ autocapture: {
227
+ // Amplitude tracks marketing attribution by default.
228
+ // Browser SDK 2 captures UTM parameters, referrer information,
229
+ // and click IDs as user properties.
230
+ attribution: true,
231
+ // Amplitude tracks page view events by default.
232
+ // The default behavior sends a page view event on initialization.
233
+ // The event type for this event is [Amplitude] Page Viewed.
234
+ pageViews: {
235
+ trackHistoryChanges: "pathOnly",
236
+ },
237
+ // Amplitude tracks session events by default.
238
+ // A session is the period of time a user has your website open.
239
+ sessions: isSessionsEnabled,
240
+ // Amplitude tracks form interaction events by default.
241
+ // The SDK tracks [Amplitude] Form Started when the user initially
242
+ // interacts with the form element. An initial interaction can be the
243
+ // first change to a text input, radio button, or dropdown.
244
+ formInteractions: false,
245
+ // Amplitude tracks file download events by default.
246
+ // The SDK tracks [Amplitude] File Downloaded when the user clicks an anchor
247
+ // or <a> tag linked to a file
248
+ fileDownloads: false,
249
+ },
250
+ });
251
+
252
+ return currentAmplitudeInstance;
253
+ }
254
+
255
+ getDefaultTrackingProps(): Record<string, unknown> {
256
+ const { env } = useEnviveConfig();
257
+ const gatesProps = this.orgConfig.gates
258
+ ? this.orgConfig.gates.reduce<Record<string, boolean>>((acc, curr) => {
259
+ if (curr.name && curr.value != null) {
260
+ return { ...acc, [`feature_gate.${curr.name}`]: curr.value };
261
+ }
262
+
263
+ return acc;
264
+ }, {})
265
+ : {};
266
+ const experimentProps = this.orgConfig.experiments
267
+ ? this.orgConfig.experiments.reduce<Record<string, unknown>>(
268
+ (acc, curr) => {
269
+ if (curr.name && curr.value != null) {
270
+ return {
271
+ ...acc,
272
+ [`product_experiment.${curr.name}`]: curr.value,
273
+ };
274
+ }
275
+
276
+ return acc;
277
+ },
278
+ {}
279
+ )
280
+ : {};
281
+ const orgLevelAmplitudeTrackingProps = {
282
+ ...gatesProps,
283
+ ...experimentProps,
284
+ };
285
+
286
+ // Keep these name value/pairs consistent with server side tracking events sent to amplitude
287
+ // Consult pymono for the latest list of properties. The "null" values are placeholders and
288
+ // left here for reference and documentation purposes.
289
+ return {
290
+ ...orgLevelAmplitudeTrackingProps,
291
+ ...this.supplementalDefaultProps,
292
+ org_id: this.orgConfig.org?.org.id,
293
+ app_id: "commerce-chat-react-component", // This is the app id of the current app
294
+ chat_id: LocalStorageService.getItem(LocalStorageKeys.ChatId),
295
+ env: env || "unknown",
296
+ app_source: EnvironmentService.getContextSource(),
297
+ "org.short_name": this.orgConfig.org?.org.shortName,
298
+ "user.id": this.userId, // This is the user id of the current user (aka "spiffy user id")
299
+ "cdp.user_id": null, // Not applicable, left here for future use
300
+ "cdp.provider": null, // Not applicable, left here for future use
301
+ "event.source": "web-browser",
302
+ "event.type": "user-activity",
303
+ "event.id": null, // Not applicable, left here for future use
304
+ "event.channel": "web",
305
+ "event.timestamp": null, // Implicitly set by amplitude
306
+ };
307
+ }
308
+
309
+ /**
310
+ * Prefixes the event properties sent to Amplitude with the event name to prevent event-level
311
+ * property names from clashing with app-level property names. Event properties will be in the
312
+ * format of `event_name.property_name`.
313
+ *
314
+ * @param eventName - The name of the event to prefix the properties for.
315
+ * @param eventProps - The event properties to prefix.
316
+ *
317
+ * @returns The prefixed properties.
318
+ */
319
+ private eventPropsToPrefixedEventProps = (
320
+ eventName: SpiffyMetricsEventName,
321
+ eventProps: Record<string, unknown>
322
+ ): Record<string, unknown> => {
323
+ // replaces all spaces in the event name with underscores
324
+ const prefix = eventName.toLowerCase().replace(/\s+/g, "_");
325
+
326
+ return Object.entries(eventProps).reduce((acc, [key, value]) => {
327
+ acc[`${prefix}.${key}`] = value;
328
+ return acc;
329
+ }, {} as Record<string, unknown>);
330
+ };
331
+
332
+ static trackEvent = async ({
333
+ eventName,
334
+ eventProps,
335
+ eventGroups,
336
+ alsoSendToGoogleAnalytics = false,
337
+ }: {
338
+ eventName: SpiffyMetricsEventName;
339
+ eventProps?: Record<string, unknown>;
340
+ eventGroups?: Record<string, unknown>;
341
+ alsoSendToGoogleAnalytics?: boolean;
342
+ }): Promise<void> => {
343
+ try {
344
+ const decoratedEventName = `[Spiffy] ${eventName}`;
345
+ const amplitudeInstance = AmplitudeAdapter.getSingletonInstanceOf();
346
+ const amplitudeClient = amplitudeInstance.getUnderlyingAmplitudeClient();
347
+
348
+ if (!amplitudeClient) {
349
+ Logger.logWarn("amplitude instance undefined", undefined, {
350
+ event_name: decoratedEventName,
351
+ });
352
+ return;
353
+ }
354
+
355
+ const eventData = JSON.stringify({
356
+ eventName,
357
+ eventProps,
358
+ created_at: new Date().toISOString(),
359
+ });
360
+ const encoder = new TextEncoder();
361
+ const data = encoder.encode(eventData);
362
+ // calculate a hash of the event properties to use as the insert_id so that duplicate events
363
+ // are automatically dropped by Amplitude
364
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
365
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
366
+ const currentInsertId = hashArray
367
+ .map((b) => b.toString(16).padStart(2, "0"))
368
+ .join("");
369
+
370
+ Logger.logDebug(`amplitude tracking ${decoratedEventName}`, null, {
371
+ event_name: decoratedEventName,
372
+ props: eventProps,
373
+ });
374
+
375
+ amplitudeClient.track(
376
+ decoratedEventName,
377
+ {
378
+ ...amplitudeInstance.getDefaultTrackingProps(),
379
+ ...eventProps,
380
+ ...(eventProps
381
+ ? AmplitudeAdapter.getSingletonInstanceOf().eventPropsToPrefixedEventProps(
382
+ eventName,
383
+ eventProps
384
+ )
385
+ : {}),
386
+ },
387
+ {
388
+ ...eventGroups,
389
+ insert_id: currentInsertId,
390
+ }
391
+ );
392
+
393
+ if (alsoSendToGoogleAnalytics && amplitudeInstance.orgGaConfig) {
394
+ const dataLayer = WindowDataLayerService.getSingletonInstanceOf(
395
+ amplitudeInstance.orgGaConfig
396
+ );
397
+ Logger.logDebug("[spiffy-ai] GA tracking", decoratedEventName);
398
+ dataLayer.sendToGoogleAnalyticsCircularEventsSafe(
399
+ decoratedEventName,
400
+ eventProps
401
+ );
402
+ }
403
+ } catch (err) {
404
+ Logger.logError("[spiffy-ai] Error tracking event", err, {
405
+ eventName,
406
+ eventProps,
407
+ });
408
+ }
409
+ };
410
+
411
+ // All string values, like user_id, event, or user property values, have a character limit of 1024 characters.
412
+ // https://amplitude.com/docs/apis/analytics/http-v2
413
+ static amplitudeSafeString(input: string | undefined) {
414
+ if (!input) {
415
+ return null;
416
+ }
417
+ if (input.length > 1024) {
418
+ return input.slice(0, 1024);
419
+ }
420
+ return input;
421
+ }
422
+
423
+ static getSingletonInstanceOf(): AmplitudeAdapter {
424
+ if (EnvironmentService.getContextSource() === ContextSourceEnum.Test) {
425
+ return new StubAmplitudeAdapter();
426
+ }
427
+
428
+ const identifyingPrefix = EnvironmentService.getIdentifyingPrefix();
429
+
430
+ if (!window[identifyingPrefix]) {
431
+ window[identifyingPrefix] = {} as Window[typeof identifyingPrefix];
432
+ }
433
+
434
+ if (!window[identifyingPrefix]._amplitudeAdapter) {
435
+ const atomStore = getAtomStore();
436
+ const userId = atomStore.get(userIdAtom);
437
+ const orgConfig = atomStore.get(orgConfigAtom);
438
+ const orgGaConfig = atomStore.get(orgAnalyticsGoogleAnalyticsConfigAtom);
439
+ const featureFlagService = atomStore.get(featureFlagServiceAtom);
440
+
441
+ window[identifyingPrefix]._amplitudeAdapter = new AmplitudeAdapter(
442
+ userId,
443
+ orgConfig,
444
+ featureFlagService,
445
+ orgGaConfig
446
+ );
447
+ window[identifyingPrefix]._amplitudeAdapter?.init();
448
+ }
449
+
450
+ return window[identifyingPrefix]._amplitudeAdapter as AmplitudeAdapter;
451
+ }
452
+ }
453
+
454
+ export { AmplitudeAdapter };
@@ -0,0 +1,2 @@
1
+ export * from './amplitudeAdapter';
2
+ export * from './stubAmplitudeAdapter';
@@ -0,0 +1,34 @@
1
+ import { AmplitudeAdapter } from 'src/adapters/amplitude';
2
+ import { OrgConfig } from 'src/application/models/api/orgConfigResults';
3
+ import { FeatureFlagService } from 'src/application/service/featureFlagService';
4
+
5
+ import type { BrowserClient, EnrichmentPlugin, Event } from '@amplitude/analytics-types';
6
+
7
+ export class StubAmplitudeAdapter extends AmplitudeAdapter {
8
+ constructor() {
9
+ super('test', {} as OrgConfig, {} as FeatureFlagService );
10
+ }
11
+
12
+ init = (): void => {};
13
+
14
+ getUnderlyingAmplitudeClient = (): BrowserClient | undefined => undefined;
15
+
16
+ getSupplementalDefaultProps = (): Record<string, unknown> => ({});
17
+
18
+ setSupplementalDefaultProps = (): void => {};
19
+
20
+ getEventTrackingEnrichment = (): EnrichmentPlugin => ({
21
+ name: 'stub-enrichment',
22
+ type: 'enrichment',
23
+ setup: async () => undefined,
24
+ execute: async (event: Event) => event,
25
+ });
26
+
27
+ amplitudeSessionReplayInit = (): boolean => false;
28
+
29
+ createUnderlyingClient = (): BrowserClient => ({}) as BrowserClient;
30
+
31
+ getDefaultTrackingProps = (): Record<string, unknown> => ({});
32
+
33
+ trackEvent = (): Promise<void> => Promise.resolve();
34
+ }