@envive-ai/react-hooks 0.1.5 → 0.1.6

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 (491) hide show
  1. package/dist/amplitudeContext-CHzas7Cf.d.cts +52 -0
  2. package/dist/amplitudeContext-D-7fmVh1.cjs +356 -0
  3. package/dist/amplitudeContext-hY3caPC6.js +322 -0
  4. package/dist/amplitudeContext-tJ4y-SzX.d.ts +52 -0
  5. package/dist/api-DjeZXxl_.js +207 -0
  6. package/dist/api-_JaUnIUj.cjs +292 -0
  7. package/dist/app-CjsQ2_n-.js +132 -0
  8. package/dist/app-CnKRZ9RW.cjs +178 -0
  9. package/dist/application/models/graphql/index.cjs +3 -12
  10. package/dist/application/models/graphql/index.d.cts +1 -1
  11. package/dist/application/models/graphql/index.d.ts +1 -1
  12. package/dist/application/models/graphql/index.js +1 -10
  13. package/dist/application/models/guards/api/index.cjs +1 -2
  14. package/dist/application/models/guards/api/index.d.cts +2 -2
  15. package/dist/application/models/guards/api/index.d.ts +2 -2
  16. package/dist/application/models/guards/api/index.js +1 -2
  17. package/dist/application/models/index.cjs +48 -54
  18. package/dist/application/models/index.d.cts +7 -9
  19. package/dist/application/models/index.d.ts +7 -9
  20. package/dist/application/models/index.js +7 -11
  21. package/dist/application/models/utilityTypes/index.cjs +1 -1
  22. package/dist/application/models/utilityTypes/index.d.cts +1 -1
  23. package/dist/application/models/utilityTypes/index.d.ts +1 -1
  24. package/dist/application/models/utilityTypes/index.js +1 -1
  25. package/dist/application/models/variantInfo/index.cjs +1 -1
  26. package/dist/application/models/variantInfo/index.d.cts +1 -1
  27. package/dist/application/models/variantInfo/index.d.ts +1 -1
  28. package/dist/application/models/variantInfo/index.js +1 -1
  29. package/dist/application/utils/index.cjs +40 -37
  30. package/dist/application/utils/index.d.cts +18 -14
  31. package/dist/application/utils/index.d.ts +19 -15
  32. package/dist/application/utils/index.js +13 -10
  33. package/dist/{atomStore-JwGb7pcy.cjs → atomStore-B4jIaDPd.cjs} +1 -1
  34. package/dist/{atomStore-B1cgmbP0.js → atomStore-D8pjE1vL.js} +1 -1
  35. package/dist/atoms/app/index.cjs +14 -16
  36. package/dist/atoms/app/index.d.cts +20 -19
  37. package/dist/atoms/app/index.d.ts +20 -19
  38. package/dist/atoms/app/index.js +10 -11
  39. package/dist/atoms/atomStore/index.cjs +2 -1
  40. package/dist/atoms/atomStore/index.d.cts +24 -2
  41. package/dist/atoms/atomStore/index.d.ts +24 -2
  42. package/dist/atoms/atomStore/index.js +2 -1
  43. package/dist/atoms/chat/index.cjs +44 -40
  44. package/dist/atoms/chat/index.d.cts +35 -36
  45. package/dist/atoms/chat/index.d.ts +35 -36
  46. package/dist/atoms/chat/index.js +14 -10
  47. package/dist/atoms/globalSearch/index.cjs +1 -1
  48. package/dist/atoms/globalSearch/index.d.cts +5 -5
  49. package/dist/atoms/globalSearch/index.d.ts +6 -6
  50. package/dist/atoms/globalSearch/index.js +1 -1
  51. package/dist/atoms/org/index.cjs +26 -38
  52. package/dist/atoms/org/index.d.cts +35 -48
  53. package/dist/atoms/org/index.d.ts +35 -48
  54. package/dist/atoms/org/index.js +11 -11
  55. package/dist/atoms/search/index.cjs +47 -41
  56. package/dist/atoms/search/index.d.cts +7 -9
  57. package/dist/atoms/search/index.d.ts +7 -9
  58. package/dist/atoms/search/index.js +16 -10
  59. package/dist/bandolier-DYEz4-8C.js +1229 -0
  60. package/dist/bandolier-o_-xrbOV.cjs +1229 -0
  61. package/dist/carpe-CsG5jCcl.cjs +607 -0
  62. package/dist/carpe-DONk00bZ.js +605 -0
  63. package/dist/cdnUtils-32v8bDX9.cjs +16 -0
  64. package/dist/cdnUtils-E4tLBt2g.js +11 -0
  65. package/dist/{chat-_NzpO_Hn.cjs → chat-BubCW1as.cjs} +1 -1
  66. package/dist/chat-CO7cRkaq.cjs +506 -0
  67. package/dist/{chat-CHmD79E1.js → chat-CV6MXeID.js} +1 -1
  68. package/dist/chat-hcRc4RRd.js +285 -0
  69. package/dist/{components-Dl-TMD9k.js → components-B4T3Uzth.js} +1 -1
  70. package/dist/{components-D0XDRcaN.cjs → components-Cw9WjA6g.cjs} +1 -1
  71. package/dist/config/locators/components/chat/index.cjs +1 -1
  72. package/dist/config/locators/components/chat/index.d.cts +1 -1
  73. package/dist/config/locators/components/chat/index.d.ts +1 -1
  74. package/dist/config/locators/components/chat/index.js +1 -1
  75. package/dist/config/locators/components/chat/variants/index.d.cts +1 -1
  76. package/dist/config/locators/components/chat/variants/index.d.ts +1 -1
  77. package/dist/config/locators/components/index.cjs +1 -1
  78. package/dist/config/locators/components/index.d.cts +1 -1
  79. package/dist/config/locators/components/index.d.ts +1 -1
  80. package/dist/config/locators/components/index.js +1 -1
  81. package/dist/config/locators/components/search/index.d.ts +1 -1
  82. package/dist/config/locators/index.cjs +4 -4
  83. package/dist/config/locators/index.d.cts +2 -2
  84. package/dist/config/locators/index.d.ts +2 -2
  85. package/dist/config/locators/index.js +4 -4
  86. package/dist/contexts/index.cjs +45 -14
  87. package/dist/contexts/index.d.cts +10 -10
  88. package/dist/contexts/index.d.ts +10 -10
  89. package/dist/contexts/index.js +22 -11
  90. package/dist/contexts-B4ihTBsV.cjs +2980 -0
  91. package/dist/contexts-DGlr7M1o.js +2596 -0
  92. package/dist/coterie-CKB93qfz.cjs +239 -0
  93. package/dist/{coterie--MGvWeVh.cjs → coterie-DHcj2fRE.js} +64 -65
  94. package/dist/{custservice-types-C8-9vKWb.cjs → custservice-types-Dy0kc9TW.cjs} +1 -1
  95. package/dist/{custservice-types-CamCiXjq.js → custservice-types-mnIunabv.js} +1 -1
  96. package/dist/default-BnB4p0Se.cjs +234 -0
  97. package/dist/default-D6f5Dyt7.js +199 -0
  98. package/dist/default-ZKkE5zT4.cjs +4 -0
  99. package/dist/default-legGZJwI.js +4 -0
  100. package/dist/{divIds-CjceLRD9.cjs → divIds-2dJlU3z8.cjs} +1 -15
  101. package/dist/{divIds-0Vj9g-fM.js → divIds-BUrN2vY-.js} +2 -4
  102. package/dist/dreamlandBaby-BiRYYFav.js +346 -0
  103. package/dist/dreamlandBaby-zuvmfzfD.cjs +346 -0
  104. package/dist/{embedded-_cLpd6FK.js → embedded-BJLWIriJ.js} +1 -1
  105. package/dist/{embedded-B5Wi9g0T.cjs → embedded-Dl79TJLC.cjs} +1 -1
  106. package/dist/{entrypoints-CNUvSgnk.js → entrypoints-Bs3pn6EV.js} +1 -1
  107. package/dist/{entrypoints-DM9Sm18O.cjs → entrypoints-Dqi5pzWH.cjs} +1 -1
  108. package/dist/enviveConfig-BccuzS2a.cjs +240 -0
  109. package/dist/enviveConfig-CzhTz8Aa.js +152 -0
  110. package/dist/events/index.cjs +1 -1
  111. package/dist/events/index.js +1 -1
  112. package/dist/{events-ClCDFK7t.js → events-BrLpaNxh.js} +1 -1
  113. package/dist/{events-Da7gpmGv.cjs → events-DwT6cEwI.cjs} +1 -1
  114. package/dist/fiveCbd-DwTTwC2j.cjs +613 -0
  115. package/dist/fiveCbd-Dz2NouOF.js +613 -0
  116. package/dist/forLoveAndLemons-DqSdyD6S.js +665 -0
  117. package/dist/forLoveAndLemons-Ud6mPrV3.cjs +667 -0
  118. package/dist/{globalSearch-b0wC7ZEO.js → globalSearch-B6THR7Jx.js} +1 -1
  119. package/dist/{globalSearch-BTeZxvk1.cjs → globalSearch-BFvEg53C.cjs} +1 -1
  120. package/dist/graphql-BNW60InJ.cjs +128 -0
  121. package/dist/graphql-CjB8wHzm.js +74 -0
  122. package/dist/graphqlConfig-CYt6tWII.js +30 -0
  123. package/dist/graphqlConfig-DicykC-o.cjs +61 -0
  124. package/dist/greenpan-B_EbPkSP.js +397 -0
  125. package/dist/greenpan-kPE4fJgd.cjs +397 -0
  126. package/dist/grooveLife-Ckuir319.js +342 -0
  127. package/dist/grooveLife-DKSEQp1F.cjs +342 -0
  128. package/dist/homegrownCannabis-BVPa2pqe.js +410 -0
  129. package/dist/homegrownCannabis-BwIAkxuA.cjs +410 -0
  130. package/dist/hooks/index.cjs +39 -13
  131. package/dist/hooks/index.d.cts +127 -45
  132. package/dist/hooks/index.d.ts +124 -42
  133. package/dist/hooks/index.js +22 -11
  134. package/dist/{index-D46Rd0io.d.cts → index-B0NW9KTj.d.cts} +1 -1
  135. package/dist/{index-BdNKc2ix.d.cts → index-BDPWBU3h.d.cts} +1 -1
  136. package/dist/index-BMPtlgac.d.ts +191 -0
  137. package/dist/{index-BTK5uzs6.d.cts → index-Bmub8e38.d.cts} +1 -1
  138. package/dist/{index-BrXuc_Ck.d.cts → index-Byb45OPg.d.cts} +1 -1
  139. package/dist/{index-CSIOQD-A.d.ts → index-C6KdON7d.d.ts} +1 -1
  140. package/dist/index-C7pGDl1A.d.ts +1609 -0
  141. package/dist/{index-K2kNsOTw.d.cts → index-C9lgsCWp.d.cts} +32 -32
  142. package/dist/{index-BzgkfbNO.d.cts → index-CESxqFso.d.cts} +1 -1
  143. package/dist/{index-CbJZOEU4.d.ts → index-Cc-wBCn6.d.ts} +32 -32
  144. package/dist/{index-Cx9e-fRi.d.ts → index-CcIG01PJ.d.ts} +2 -2
  145. package/dist/{index-ClJ0nMsR.d.cts → index-CiWEYzXl.d.cts} +2 -2
  146. package/dist/{index-CKKkTsms.d.ts → index-Cqg6ltII.d.ts} +1 -1
  147. package/dist/{index-Cr2y08f1.d.ts → index-DOii3C6b.d.ts} +1 -1
  148. package/dist/index-DTu2X-YS.d.cts +1609 -0
  149. package/dist/index-OEifcBsm.d.cts +191 -0
  150. package/dist/{index-Dxpscrvz.d.ts → index-PGF8BvxQ.d.ts} +1 -1
  151. package/dist/{index-D2VaMPA3.d.ts → index-ylUiJvnr.d.ts} +1 -1
  152. package/dist/interceptors/index.cjs +2 -12
  153. package/dist/interceptors/index.d.cts +8 -13
  154. package/dist/interceptors/index.d.ts +8 -13
  155. package/dist/interceptors/index.js +2 -11
  156. package/dist/jackArcher-B39OEIj6.cjs +727 -0
  157. package/dist/{jackArcher-sO9EbgrZ.js → jackArcher-BwkWGybC.js} +24 -25
  158. package/dist/jordanCraig-CxRH_jLi.js +1786 -0
  159. package/dist/jordanCraig-RwmWw-jM.cjs +1786 -0
  160. package/dist/kindredBravely-D78VwL20.cjs +490 -0
  161. package/dist/kindredBravely-DQDpAzdl.js +490 -0
  162. package/dist/kutFromTheKloth-TcXQkIti.js +369 -0
  163. package/dist/kutFromTheKloth-dXRrNti0.cjs +369 -0
  164. package/dist/larryAndSerges-Bh5XEXsZ.js +262 -0
  165. package/dist/larryAndSerges-COdBzOzu.cjs +262 -0
  166. package/dist/leapsAndRebounds-BbXnqkl5.cjs +360 -0
  167. package/dist/leapsAndRebounds-mjCaH1k-.js +360 -0
  168. package/dist/longevityrx-DdV3v26F.cjs +320 -0
  169. package/dist/longevityrx-DfPDfvAt.js +320 -0
  170. package/dist/lookOptic-DgXFGBPP.cjs +282 -0
  171. package/dist/{lookOptic-Jwf7EAU8.js → lookOptic-FgVW1afF.js} +19 -20
  172. package/dist/mantraBrand-C5gVm3rk.cjs +750 -0
  173. package/dist/{mantraBrand-DoaVj837.js → mantraBrand-uV8HCDR8.js} +22 -23
  174. package/dist/medterra-BtDpr1Hw.cjs +583 -0
  175. package/dist/medterra-DgzE7-mj.js +583 -0
  176. package/dist/modells-CJjsxOIR.js +484 -0
  177. package/dist/modells-Ck5KbRFj.cjs +484 -0
  178. package/dist/models-BkXg5eIP.cjs +1534 -0
  179. package/dist/models-UZ6HszfZ.js +1281 -0
  180. package/dist/{nodeSelector-DybpVr-i.d.ts → nodeSelector-BxrS2S_k.d.ts} +1 -1
  181. package/dist/{nodeSelector-vKB44CDB.d.cts → nodeSelector-Dm4S-10n.d.cts} +1 -1
  182. package/dist/org-C2RrBVQR.cjs +81 -0
  183. package/dist/org-xMytX--e.js +38 -0
  184. package/dist/orgAnalyticsConfig-BJ2A1RZ-.cjs +39 -0
  185. package/dist/orgAnalyticsConfig-ClrFy2qH.js +14 -0
  186. package/dist/pressedFloral-Bteoboms.js +661 -0
  187. package/dist/pressedFloral-CexgV-xy.cjs +661 -0
  188. package/dist/search-BMOAmrmY.js +459 -0
  189. package/dist/search-Df0Ifneg.cjs +672 -0
  190. package/dist/{search-filter-types-9rTb3jMj.d.cts → search-filter-types-DosbseF3.d.cts} +1 -1
  191. package/dist/{search-filter-types-C-zZSpGo.d.ts → search-filter-types-fZf91Pdw.d.ts} +1 -1
  192. package/dist/skinPerfection-BGzq9lq-.cjs +334 -0
  193. package/dist/skinPerfection-BlvcEcUE.js +334 -0
  194. package/dist/snapSupplements-CbbGzAgO.cjs +285 -0
  195. package/dist/snapSupplements-kcsPAOm9.js +285 -0
  196. package/dist/{socialProofClasses-ky69yppk.cjs → socialProofClasses-Db8gzsfi.cjs} +1 -1
  197. package/dist/{socialProofClasses-DdzG1tZy.js → socialProofClasses-kwDvwLOZ.js} +1 -1
  198. package/dist/spanx-B4WFA_rI.js +661 -0
  199. package/dist/spanx-BWoE4F8b.cjs +663 -0
  200. package/dist/spanxStaging-BOrOjhXn.js +845 -0
  201. package/dist/spanxStaging-BfdfIug4.cjs +848 -0
  202. package/dist/{suggestionBarV2-types-Penx3Y67.js → suggestionBarV2-types-IMMOmCir.js} +1 -1
  203. package/dist/{suggestionBarV2-types-B3lwrENK.cjs → suggestionBarV2-types-nnGNgFvR.cjs} +1 -1
  204. package/dist/supergoop-22dd5_BS.js +323 -0
  205. package/dist/supergoop-B-a4cku2.cjs +323 -0
  206. package/dist/{test-types-CXVJxTeu.d.ts → test-types-C9b_OdfO.d.ts} +1 -1
  207. package/dist/{test-types-CuOq25VT.d.cts → test-types-CgVJtwUr.d.cts} +1 -1
  208. package/dist/types/index.cjs +2 -2
  209. package/dist/types/index.d.cts +2 -2
  210. package/dist/types/index.d.ts +2 -2
  211. package/dist/types/index.js +2 -2
  212. package/dist/types--pr1GQQx.js +154 -0
  213. package/dist/types-BVSyY3Hk.cjs +196 -0
  214. package/dist/{uniqueVintage-BWkDgt1z.js → uniqueVintage-CJXiNNe7.js} +19 -20
  215. package/dist/uniqueVintage-D0jzJWlo.cjs +1213 -0
  216. package/dist/useMessageInterceptor-B87e3yu3.cjs +33 -0
  217. package/dist/useMessageInterceptor-Bb7YRaWk.js +25 -0
  218. package/dist/userIdentityContext-BPqvVIg0.d.cts +20 -0
  219. package/dist/userIdentityContext-wbCRmlzp.d.ts +20 -0
  220. package/dist/utils-C9ZSCx12.js +888 -0
  221. package/dist/utils-D5HO61hG.cjs +1016 -0
  222. package/dist/variantInfo-DbVxA1yE.js +1 -0
  223. package/dist/variantInfo-orXoPBCU.cjs +0 -0
  224. package/dist/venaCbd-Bhhu_qUf.cjs +365 -0
  225. package/dist/venaCbd-CanovPS_.js +365 -0
  226. package/dist/westonJonBoucher-BC0x1ktI.cjs +422 -0
  227. package/dist/{westonJonBoucher-BAGXegsX.js → westonJonBoucher-BUu1_wP1.js} +19 -20
  228. package/dist/wineEnthusiast-BlCryfil.cjs +940 -0
  229. package/dist/{wineEnthusiast-EJbhMeKQ.js → wineEnthusiast-Ck1x5iJq.js} +19 -20
  230. package/dist/wolfMattress-D9Mjq-HP.js +372 -0
  231. package/dist/wolfMattress-JssghhC-.cjs +372 -0
  232. package/dist/wolfTactical-C6exYhL7.cjs +349 -0
  233. package/dist/wolfTactical-CnV3KQdI.js +349 -0
  234. package/package.json +100 -19
  235. package/src/{adapters/spiffy/commerce/api.ts → application/commerce-api.ts} +31 -23
  236. package/src/application/models/colorsConfig.ts +18 -18
  237. package/src/application/models/frontendConfig.ts +3 -3
  238. package/src/application/models/graphql/queries/getMerchantColorsQuery.ts +1 -1
  239. package/src/application/models/graphql/queries/getMerchantFrontendConfigQuery.ts +1 -1
  240. package/src/application/models/index.ts +0 -2
  241. package/src/application/models/localStorageEventListener.ts +2 -2
  242. package/src/application/models/utils/snakeToCamelTransformer.ts +8 -8
  243. package/src/application/models/validators/validateGraphQLColorsConfig.ts +0 -21
  244. package/src/application/models/validators/validateGraphQLFrontendConfig.ts +2 -2
  245. package/src/application/utils/analyticsUtils.ts +53 -22
  246. package/src/application/utils/cdnUtils.ts +11 -0
  247. package/src/atoms/amplitude/amplitudeTrackEventAtom.ts +15 -0
  248. package/src/atoms/app/index.ts +7 -17
  249. package/src/atoms/app/variant.ts +13 -4
  250. package/src/atoms/chat/chatState.ts +28 -18
  251. package/src/atoms/chat/messageQueue.ts +36 -5
  252. package/src/atoms/chat/replies.ts +45 -37
  253. package/src/atoms/envive/enviveConfig.ts +10 -6
  254. package/src/atoms/org/graphqlConfig.ts +7 -1
  255. package/src/atoms/org/index.ts +3 -3
  256. package/src/atoms/org/newOrgConfigAtom.ts +8 -0
  257. package/src/atoms/org/orgPageConfig.ts +6 -5
  258. package/src/atoms/search/chatSearch.ts +11 -5
  259. package/src/atoms/search/searchAPI.ts +22 -12
  260. package/src/atoms/search/searchServiceAdapter.ts +25 -0
  261. package/src/contexts/amplitudeContext.tsx +466 -0
  262. package/src/contexts/cdnContext.tsx +48 -0
  263. package/src/contexts/chatContext.tsx +15 -12
  264. package/src/contexts/enviveConfigContext.tsx +22 -17
  265. package/src/contexts/enviveCssContext.tsx +34 -5
  266. package/src/contexts/featureFlagContext.tsx +193 -0
  267. package/src/contexts/featureFlagServiceContext.tsx +87 -0
  268. package/src/contexts/graphqlContext.tsx +165 -0
  269. package/src/contexts/index.ts +13 -3
  270. package/src/contexts/localStorageContext.tsx +159 -0
  271. package/src/contexts/newOrgConfigContext.tsx +104 -0
  272. package/src/contexts/orgConfigContext.tsx +92 -92
  273. package/src/contexts/searchContext.tsx +187 -0
  274. package/src/contexts/sessionStorageContext.tsx +80 -0
  275. package/src/contexts/shopifyUrlContext.tsx +97 -0
  276. package/src/contexts/types.ts +12 -8
  277. package/src/contexts/userIdentityContext.tsx +197 -0
  278. package/src/events/registerAnalyticsListeners.ts +32 -38
  279. package/src/hooks/index.ts +10 -4
  280. package/src/hooks/useAmplitudeOperations.ts +35 -0
  281. package/src/hooks/useAppDetails.ts +49 -0
  282. package/src/hooks/useCdnOperations.ts +16 -0
  283. package/src/hooks/useChatToggle.ts +5 -4
  284. package/src/hooks/useChatToggleAnalytics.ts +15 -0
  285. package/src/hooks/useGraphQLConfig.ts +63 -0
  286. package/src/hooks/useIdentifyUser.ts +33 -0
  287. package/src/hooks/useImageResolver.ts +7 -7
  288. package/src/hooks/useLocalStorageOperations.ts +92 -0
  289. package/src/hooks/useNewOrgConfig.ts +3 -76
  290. package/src/hooks/useSearch.tsx +21 -18
  291. package/src/hooks/useSearchOperations.ts +97 -0
  292. package/src/hooks/useSessionStorageOperations.ts +28 -0
  293. package/src/hooks/useShopifyUrlOperations.ts +45 -0
  294. package/src/hooks/useTrackComponentVisibleEvent.ts +12 -8
  295. package/src/hooks/useUpdateAnalyticsProps.ts +28 -17
  296. package/src/interceptors/index.ts +0 -1
  297. package/src/interceptors/useMessageInterceptor.ts +5 -8
  298. package/src/merchants/bandolier/bandolier.ts +10 -28
  299. package/src/merchants/carpe/carpe.ts +5 -8
  300. package/src/merchants/coterie/coterie.ts +3 -6
  301. package/src/merchants/default.ts +73 -70
  302. package/src/merchants/domInsertion.ts +30 -0
  303. package/src/merchants/dreamlandBaby/dreamlandBaby.ts +12 -6
  304. package/src/merchants/fiveCbd/fiveCbd.ts +7 -13
  305. package/src/merchants/forLoveAndLemons/forLoveAndLemons.ts +44 -14
  306. package/src/merchants/greenpan/greenpan.ts +6 -12
  307. package/src/merchants/gridInsertion.ts +19 -0
  308. package/src/merchants/grooveLife/grooveLife.ts +13 -7
  309. package/src/merchants/homegrownCannabis/homegrownCannabis.ts +12 -6
  310. package/src/merchants/jackArcher/jackArcher.ts +26 -11
  311. package/src/merchants/jordanCraig/jordanCraig.ts +5 -5
  312. package/src/merchants/kindredBravely/kindredBravely.ts +16 -7
  313. package/src/merchants/kutFromTheKloth/kutFromTheKloth.ts +9 -6
  314. package/src/merchants/larryAndSerges/larryAndSerges.ts +6 -2
  315. package/src/merchants/leapsAndRebounds/leapsAndRebounds.ts +7 -7
  316. package/src/merchants/longevityrx/longevityrx.ts +14 -8
  317. package/src/merchants/lookOptic/lookOptic.ts +6 -6
  318. package/src/merchants/mantraBrand/mantraBrand.ts +14 -8
  319. package/src/merchants/medterra/medterra.ts +14 -11
  320. package/src/merchants/modells/modells.ts +6 -9
  321. package/src/merchants/pressedFloral/pressedFloral.ts +7 -13
  322. package/src/merchants/skinPerfection/skinPerfection.ts +13 -7
  323. package/src/merchants/snapSupplements/snapSupplements.ts +13 -10
  324. package/src/merchants/spanx/spanx.ts +6 -6
  325. package/src/merchants/spanx/spanxStaging.ts +6 -12
  326. package/src/merchants/supergoop/supergoop.ts +11 -12
  327. package/src/merchants/uniqueVintage/uniqueVintage.ts +6 -6
  328. package/src/merchants/venaCbd/venaCbd.ts +6 -9
  329. package/src/merchants/westonJonBoucher/westonJonBoucher.ts +6 -6
  330. package/src/merchants/wineEnthusiast/wineEnthusiast.ts +6 -6
  331. package/src/merchants/wolfMattress/wolfMattress.ts +3 -3
  332. package/src/merchants/wolfTactical/wolfTactical.ts +5 -11
  333. package/src/types/config-versions.ts +6 -0
  334. package/src/types.ts +0 -53
  335. package/dist/adapters/amplitude/index.cjs +0 -14
  336. package/dist/adapters/amplitude/index.d.cts +0 -6
  337. package/dist/adapters/amplitude/index.d.ts +0 -6
  338. package/dist/adapters/amplitude/index.js +0 -12
  339. package/dist/api-B2euFL-5.cjs +0 -269
  340. package/dist/api-XRr_lAG6.js +0 -190
  341. package/dist/application/config/index.cjs +0 -43
  342. package/dist/application/config/index.d.cts +0 -15
  343. package/dist/application/config/index.d.ts +0 -15
  344. package/dist/application/config/index.js +0 -41
  345. package/dist/application/service/customerService/index.cjs +0 -4
  346. package/dist/application/service/customerService/index.d.cts +0 -3
  347. package/dist/application/service/customerService/index.d.ts +0 -3
  348. package/dist/application/service/customerService/index.js +0 -4
  349. package/dist/application/service/index.cjs +0 -42
  350. package/dist/application/service/index.d.cts +0 -413
  351. package/dist/application/service/index.d.ts +0 -413
  352. package/dist/application/service/index.js +0 -12
  353. package/dist/atomStore-ONYy0XuA.d.cts +0 -24
  354. package/dist/atomStore-kOKiEcNl.d.ts +0 -24
  355. package/dist/bandolier-Da4wt6sm.cjs +0 -1230
  356. package/dist/bandolier-DzEmYWcz.js +0 -1230
  357. package/dist/carpe-AXipz0Xl.cjs +0 -608
  358. package/dist/carpe-CaUKwcEa.js +0 -606
  359. package/dist/contexts-CtRlNXaS.js +0 -7674
  360. package/dist/contexts-CtgmnYNn.cjs +0 -9088
  361. package/dist/coterie-oKHAT0lx.js +0 -240
  362. package/dist/customerService-BG1uNZZ1.cjs +0 -36
  363. package/dist/customerService-BHQRnLhC.js +0 -23
  364. package/dist/default-B4fINY5_.cjs +0 -4
  365. package/dist/default-BrTQxA0c.js +0 -4
  366. package/dist/default-C3LrcbZB.cjs +0 -199
  367. package/dist/default-CXkYrLEr.js +0 -176
  368. package/dist/dreamlandBaby-BEqt0eKF.js +0 -347
  369. package/dist/dreamlandBaby-DBDjEJCc.cjs +0 -347
  370. package/dist/featureFlagService-5wdmW02z.d.ts +0 -18
  371. package/dist/featureFlagService-DaelrXEk.d.cts +0 -18
  372. package/dist/fiveCbd-CdqNt16h.cjs +0 -614
  373. package/dist/fiveCbd-D6B-sgnX.js +0 -614
  374. package/dist/forLoveAndLemons-C7GsJG7f.cjs +0 -668
  375. package/dist/forLoveAndLemons-gNDlMtPR.js +0 -666
  376. package/dist/greenpan-B5AaW4M_.js +0 -398
  377. package/dist/greenpan-DrORpYms.cjs +0 -398
  378. package/dist/grooveLife-BJqsfH2H.cjs +0 -343
  379. package/dist/grooveLife-xIUmDM8s.js +0 -343
  380. package/dist/homegrownCannabis-8TZ21u6L.cjs +0 -411
  381. package/dist/homegrownCannabis-BtMuEvbZ.js +0 -411
  382. package/dist/index-CKUpnyJQ.d.ts +0 -72
  383. package/dist/index-DFL1dIT_.d.ts +0 -7
  384. package/dist/index-DXpgMVpp.d.ts +0 -749
  385. package/dist/index-MFbPQ8Ji.d.ts +0 -95
  386. package/dist/index-VHFMGkO-.d.cts +0 -72
  387. package/dist/index-VSFakgAI.d.cts +0 -95
  388. package/dist/index-aNW5V9fh.d.cts +0 -749
  389. package/dist/index-zZjcds15.d.cts +0 -7
  390. package/dist/jackArcher-WtkbLBZj.cjs +0 -728
  391. package/dist/jordanCraig-471FcgqF.cjs +0 -1787
  392. package/dist/jordanCraig-DNOncplU.js +0 -1787
  393. package/dist/kindredBravely-BlLyHGMX.cjs +0 -491
  394. package/dist/kindredBravely-cqZ4OvXp.js +0 -491
  395. package/dist/kutFromTheKloth-3mOIryvt.cjs +0 -370
  396. package/dist/kutFromTheKloth-DtVNCMKa.js +0 -370
  397. package/dist/larryAndSerges-88Bvq-Us.cjs +0 -262
  398. package/dist/larryAndSerges-cvak6May.js +0 -262
  399. package/dist/leapsAndRebounds-Dmf8eUPq.js +0 -361
  400. package/dist/leapsAndRebounds-iWKc923H.cjs +0 -361
  401. package/dist/logger-Dln20ans.cjs +0 -26
  402. package/dist/logger-pdEEY8T2.js +0 -20
  403. package/dist/longevityrx-BTMI9vn-.js +0 -321
  404. package/dist/longevityrx-CobPyigd.cjs +0 -321
  405. package/dist/lookOptic-C4H_c0JZ.cjs +0 -283
  406. package/dist/mantraBrand-CySGqbn6.cjs +0 -751
  407. package/dist/medterra-BnZ5p27n.cjs +0 -584
  408. package/dist/medterra-DaICcPPp.js +0 -584
  409. package/dist/modells-CZ1L6dD_.js +0 -485
  410. package/dist/modells-DF0SndHr.cjs +0 -485
  411. package/dist/orgConfigResults--dAwtw3W.d.ts +0 -881
  412. package/dist/orgConfigResults-BL0XBA6x.d.cts +0 -881
  413. package/dist/pressedFloral-B3t2cYzs.cjs +0 -662
  414. package/dist/pressedFloral-Dsws2Kfb.js +0 -662
  415. package/dist/skinPerfection-CILQM2bR.cjs +0 -335
  416. package/dist/skinPerfection-DmQCntRf.js +0 -335
  417. package/dist/snapSupplements--X_v0KRM.js +0 -286
  418. package/dist/snapSupplements-Djuzl0Ed.cjs +0 -286
  419. package/dist/spanx-Bo81yXSF.cjs +0 -664
  420. package/dist/spanx-DauxB8KE.js +0 -662
  421. package/dist/spanxStaging-BucYQvR1.cjs +0 -849
  422. package/dist/spanxStaging-CfXUukdP.js +0 -846
  423. package/dist/supergoop-8qa_NV3F.cjs +0 -338
  424. package/dist/supergoop-DOaui-A6.js +0 -336
  425. package/dist/types-CD4LFta-.d.cts +0 -33
  426. package/dist/types-CGC6Oozp.cjs +0 -231
  427. package/dist/types-CnTCkyvK.js +0 -177
  428. package/dist/types-DBdI0j89.d.ts +0 -33
  429. package/dist/uniqueVintage-DAne8XcL.cjs +0 -1214
  430. package/dist/variant-CC1nrywd.d.ts +0 -13
  431. package/dist/variant-CQTuQQSq.d.cts +0 -13
  432. package/dist/venaCbd-B1HO_Pkr.cjs +0 -366
  433. package/dist/venaCbd-CnByO-5R.js +0 -366
  434. package/dist/westonJonBoucher-BRfHWMbs.cjs +0 -423
  435. package/dist/wineEnthusiast-DW8JVwV8.cjs +0 -941
  436. package/dist/wolfMattress-B6INZNRJ.cjs +0 -373
  437. package/dist/wolfMattress-D9P7ErH_.js +0 -373
  438. package/dist/wolfTactical-C5Pupi3J.js +0 -350
  439. package/dist/wolfTactical-TMthZM93.cjs +0 -350
  440. package/src/adapters/amplitude/amplitudeAdapter.ts +0 -477
  441. package/src/adapters/amplitude/index.ts +0 -2
  442. package/src/adapters/amplitude/stubAmplitudeAdapter.ts +0 -34
  443. package/src/adapters/spiffy/commerce/graphql.ts +0 -219
  444. package/src/application/config/generalStaticConfig.ts +0 -40
  445. package/src/application/config/index.ts +0 -1
  446. package/src/application/models/domMutationContinuation.ts +0 -7
  447. package/src/application/models/domObservationStrategy.ts +0 -9
  448. package/src/application/service/cachingService.ts +0 -84
  449. package/src/application/service/cdnService.ts +0 -20
  450. package/src/application/service/customerService/index.ts +0 -8
  451. package/src/application/service/customerService/providers/UnsupportedCustomerService.ts +0 -15
  452. package/src/application/service/domMutationObserver.ts +0 -320
  453. package/src/application/service/domMutations/GridInsertionService.ts +0 -123
  454. package/src/application/service/domMutations/dataLayer/dataLayerEventsListener.ts +0 -99
  455. package/src/application/service/domMutations/domInsertionService.ts +0 -90
  456. package/src/application/service/domMutations/domMutationListener.ts +0 -15
  457. package/src/application/service/domMutations/domMutationListenerState.ts +0 -52
  458. package/src/application/service/domMutations/floatingChat/embeddedChatsPlacementsListener.ts +0 -41
  459. package/src/application/service/domMutations/gladly/gladlyListener.ts +0 -61
  460. package/src/application/service/domMutations/spiffy/orgs/common/kustomerVisibilityListener.ts +0 -41
  461. package/src/application/service/domMutations/spiffy/orgs/common/orgsCommonDataLayerListener.ts +0 -119
  462. package/src/application/service/featureFlagService.ts +0 -130
  463. package/src/application/service/graphqlConfigService.ts +0 -59
  464. package/src/application/service/index.ts +0 -32
  465. package/src/application/service/kustomerIntegrationService.ts +0 -111
  466. package/src/application/service/localStorageService.ts +0 -77
  467. package/src/application/service/pageVariantService.ts +0 -866
  468. package/src/application/service/searchService.ts +0 -147
  469. package/src/application/service/sessionStorageService.ts +0 -27
  470. package/src/application/service/shopifyUrlService.ts +0 -63
  471. package/src/application/service/userIdentityService.ts +0 -114
  472. package/src/application/service/windowChatToggleService.ts +0 -80
  473. package/src/application/service/windowDataLayerService.ts +0 -181
  474. package/src/application/service/windowFrontendConfigService.ts +0 -129
  475. package/src/atoms/org/merchantCss.ts +0 -161
  476. package/src/atoms/org/org.ts +0 -251
  477. package/src/atoms/org/orgUIConfig.ts +0 -142
  478. package/src/enabled-features.ts +0 -83
  479. package/src/hooks/useDynamicVariants.ts +0 -226
  480. package/src/hooks/useFileUpload.ts +0 -63
  481. package/src/hooks/useHideElements.ts +0 -85
  482. package/src/interceptors/useFormEscalation.ts +0 -57
  483. /package/dist/{locators-DnKpajbY.js → atomStore-CZnUUsrr.js} +0 -0
  484. /package/dist/{locators-CugndTUM.cjs → atomStore-KSoFS3Jj.cjs} +0 -0
  485. /package/dist/{utilityTypes-C4h2wgAK.cjs → locators-0YYZu9n4.cjs} +0 -0
  486. /package/dist/{utilityTypes-BVikejDo.js → locators-fBXS_pxP.js} +0 -0
  487. /package/dist/{variantInfo-CzhR5W6h.js → utilityTypes-8sETsYPk.js} +0 -0
  488. /package/dist/{variantInfo-CNRTY0gH.cjs → utilityTypes-COShxVir.cjs} +0 -0
  489. /package/src/{application/service/customerService/types.ts → types/customerService.ts} +0 -0
  490. /package/src/{adapters/spiffy/commerce → types}/exceptions/sessionExceptions.ts +0 -0
  491. /package/src/{adapters/spiffy/commerce → types}/exceptions/unsupportedProductExceptions.ts +0 -0
@@ -0,0 +1,466 @@
1
+ import React, {
2
+ createContext,
3
+ useContext,
4
+ useCallback,
5
+ useMemo,
6
+ useEffect,
7
+ } from "react";
8
+ import { useAtomValue } from "jotai";
9
+ import { createInstance } from "@amplitude/analytics-browser";
10
+ import { FeatureGates } from "src/application/models/featureGates";
11
+ import { OrgShortName } from "src/application/models";
12
+ import { EventsDispatcher, SpiffyEvent } from "src/events";
13
+ import {
14
+ amplitudeApiKeyAtom,
15
+ contextSourceAtom,
16
+ dataResidencyAtom,
17
+ identifyingPrefixAtom,
18
+ } from "src/atoms/envive/enviveConfig";
19
+ import {
20
+ LocalStorageKeys,
21
+ useLocalStorage,
22
+ } from "src/contexts/localStorageContext";
23
+ import { orgAnalyticsGoogleAnalyticsConfigAtom } from "src/atoms/org/orgAnalyticsConfig";
24
+ import { userIdAtom } from "src/atoms/app";
25
+ import { envAtom } from "src/atoms/envive/enviveConfig";
26
+ import Logger from "src/application/logging/logger";
27
+ import type {
28
+ BrowserClient,
29
+ EnrichmentPlugin,
30
+ Event,
31
+ ServerZoneType,
32
+ } from "@amplitude/analytics-types";
33
+ import { useEnviveConfig } from "src/contexts/enviveConfigContext";
34
+ import { OrgConfigFeatureGate } from "src/application/models/api/orgConfigResults";
35
+
36
+ export enum SpiffyMetricsEventName {
37
+ BundleLoaded = "Bundle Loaded",
38
+ ChatLiveAgentBtnClick = "Chat Live Agent Btn Click",
39
+ ChatFloatingButtonVisible = "Chat Floating Button Visible",
40
+ ChatComponentVisible = "Chat Component Visible",
41
+ ChatComponentExpanded = "Chat Component Expanded",
42
+ ChatComponentCollapsed = "Chat Component Collapsed",
43
+ ChatUserMessageInput = "Chat User Message Input",
44
+ ChatSuggestionClicked = "Chat Suggestion Clicked",
45
+ ChatAssistantResponse = "Chat Assistant Response",
46
+ ProductCardClicked = "Product Card Clicked",
47
+ ProductReviewCardClicked = "Product Review Card Clicked",
48
+ AddToCartClicked = "Add to Cart Clicked",
49
+ PromptCardClicked = "Prompt Card Clicked",
50
+ SupportedEvent = "Supported Event",
51
+ SearchBackToResponseClicked = "Search Back to Response Clicked",
52
+ PerformanceMetrics = "Performance Metrics",
53
+ SearchBarClicked = "Search Bar Clicked",
54
+ OrderLookupStarted = "Order Lookup Started",
55
+ OrderLookupFormSubmitted = "Order Lookup Form Submitted",
56
+ SearchComponentVisible = "Search Component Visible",
57
+ SearchZeroStateSuggestionClicked = "Search Zero State Suggestion Clicked", // This is the scrolling list of suggestion buttons in global search
58
+ SearchInputStarted = "Search Input Started",
59
+ SearchQuerySubmitted = "Search Query Submitted",
60
+ // SearchAutocompleteViewed = 'Search Autocomplete Viewed', // TODO: add this when autocomplete is added
61
+ // SearchAutocompleteClicked = 'Search Autocomplete Clicked', // TODO: add this when autocomplete is added
62
+ SearchResultsViewed = "Search Results Viewed",
63
+ SearchTimeToFirstClick = "Search Time to First Click",
64
+ SearchZeroResultsRate = "Search Zero Results Rate",
65
+ SearchFilterClicked = "Search Filter Clicked",
66
+ SearchSortClicked = "Search Sort Clicked",
67
+ }
68
+
69
+ interface TrackEventParams {
70
+ eventName: SpiffyMetricsEventName;
71
+ eventProps?: Record<string, unknown>;
72
+ eventGroups?: Record<string, unknown>;
73
+ alsoSendToGoogleAnalytics?: boolean;
74
+ }
75
+
76
+ interface AmplitudeContextType {
77
+ trackEvent: (params: TrackEventParams) => Promise<void>;
78
+ isReady: boolean;
79
+ setSupplementalDefaultProps: (props: Record<string, unknown>) => void;
80
+ }
81
+
82
+ const AmplitudeContext = createContext<AmplitudeContextType | null>(null);
83
+
84
+ export const AmplitudeProvider: React.FC<{ children: React.ReactNode }> = ({
85
+ children,
86
+ }) => {
87
+ const userId = useAtomValue(userIdAtom);
88
+ const amplitudeApiKey = useAtomValue(amplitudeApiKeyAtom);
89
+ const dataResidency = useAtomValue(dataResidencyAtom);
90
+ const orgGaConfig = useAtomValue(orgAnalyticsGoogleAnalyticsConfigAtom);
91
+ const env = useAtomValue(envAtom);
92
+ const contextSource = useAtomValue(contextSourceAtom);
93
+ const identifyingPrefix = useAtomValue(identifyingPrefixAtom);
94
+ const { getItem } = useLocalStorage();
95
+ const {
96
+ publicKey,
97
+ featureOverrides,
98
+ variantUrlOverride,
99
+ variantInfoOverride,
100
+ show,
101
+ orgShortName,
102
+ featureGates,
103
+ } = useEnviveConfig();
104
+
105
+ const useFeatureFlagService = () => {
106
+ const isFeatureGateEnabled = useCallback(
107
+ (gate: string) => {
108
+ const override = featureOverrides?.[gate];
109
+ if (override !== undefined) {
110
+ return override;
111
+ }
112
+ return (
113
+ featureGates?.some((fg) => fg.name === gate && fg.value) || false
114
+ );
115
+ },
116
+ [featureOverrides, featureGates]
117
+ );
118
+
119
+ const isClientSessionEnabled = useCallback(() => {
120
+ // Assuming this is a feature gate, or needs to be explicitly passed
121
+ return isFeatureGateEnabled(FeatureGates.IsClientSessionEnabled);
122
+ }, [isFeatureGateEnabled]);
123
+
124
+ const getFeatureFlags = useCallback(() => {
125
+ const flags: Record<string, boolean> = {};
126
+ if (featureOverrides) {
127
+ Object.entries(featureOverrides).forEach(([key, value]) => {
128
+ flags[key] = value;
129
+ });
130
+ }
131
+ if (featureGates) {
132
+ featureGates.forEach((fg) => {
133
+ if (fg.name) {
134
+ flags[fg.name] = Boolean(fg.value);
135
+ }
136
+ });
137
+ }
138
+ return flags;
139
+ }, [featureOverrides, featureGates]);
140
+
141
+ return {
142
+ isFeatureGateEnabled,
143
+ isClientSessionEnabled,
144
+ getFeatureFlags,
145
+ };
146
+ };
147
+
148
+ const featureFlagService = useFeatureFlagService();
149
+
150
+ const [amplitudeClient, setAmplitudeClient] = React.useState<
151
+ BrowserClient | undefined
152
+ >(undefined);
153
+ const [internalEventTrackingEnrichment, setInternalEventTrackingEnrichment] =
154
+ React.useState<EnrichmentPlugin | undefined>(undefined);
155
+ const [supplementalDefaultProps, setSupplementalDefaultProps] =
156
+ React.useState<Record<string, unknown>>({});
157
+
158
+ const isReady = Boolean(userId && featureFlagService && amplitudeApiKey);
159
+
160
+ const getDefaultTrackingProps = useCallback((): Record<string, unknown> => {
161
+ const gatesProps = featureGates
162
+ ? featureGates.reduce<Record<string, boolean>>((acc, curr) => {
163
+ if (curr.name && curr.value != null) {
164
+ return { ...acc, [`feature_gate.${curr.name}`]: curr.value };
165
+ }
166
+ return acc;
167
+ }, {})
168
+ : {};
169
+ const experimentProps = {}; // No direct equivalent for experiments in EnviveConfig yet
170
+
171
+ const orgLevelAmplitudeTrackingProps = {
172
+ ...gatesProps,
173
+ ...experimentProps,
174
+ };
175
+
176
+ return {
177
+ ...orgLevelAmplitudeTrackingProps,
178
+ ...supplementalDefaultProps,
179
+ // TODO: org_id is not directly available in EnviveConfig. Need to find a new source or derive it.
180
+ // org_id: orgConfig?.org?.org?.id,
181
+ app_id: "commerce-chat-react-component",
182
+ chat_id: getItem(LocalStorageKeys.ChatId),
183
+ env: env || "unknown",
184
+ app_source: contextSource,
185
+ "org.short_name": orgShortName,
186
+ "user.id": userId,
187
+ "cdp.user_id": null,
188
+ "cdp.provider": null,
189
+ "event.source": "web-browser",
190
+ "event.type": "user-activity",
191
+ "event.id": null,
192
+ "event.channel": "web",
193
+ "event.timestamp": null,
194
+ };
195
+ }, [
196
+ featureGates,
197
+ supplementalDefaultProps,
198
+ env,
199
+ contextSource,
200
+ orgShortName,
201
+ userId,
202
+ ]);
203
+
204
+ const eventPropsToPrefixedEventProps = useCallback(
205
+ (
206
+ eventName: SpiffyMetricsEventName,
207
+ eventProps: Record<string, unknown>
208
+ ): Record<string, unknown> => {
209
+ const prefix = eventName.toLowerCase().replace(/\s+/g, "_");
210
+ return Object.entries(eventProps).reduce((acc, [key, value]) => {
211
+ acc[`${prefix}.${key}`] = value;
212
+ return acc;
213
+ }, {} as Record<string, unknown>);
214
+ },
215
+ []
216
+ );
217
+
218
+ const amplitudeSessionReplayInit = useCallback((): boolean => {
219
+ const isEnabled = Boolean(
220
+ orgShortName === OrgShortName.UniqueVintage &&
221
+ featureFlagService?.isClientSessionEnabled() &&
222
+ featureFlagService?.isFeatureGateEnabled(
223
+ FeatureGates.IsNewFeatureEnabled
224
+ )
225
+ );
226
+ const sampleRate = 1;
227
+
228
+ try {
229
+ Logger.logDebug(
230
+ `[spiffy-ai] amplitude session-replay initializing isEnabled=${isEnabled} sampleRate=${sampleRate}`
231
+ );
232
+
233
+ if (!isEnabled) {
234
+ return isEnabled;
235
+ }
236
+
237
+ // amplitudeInstance.add(sessionReplayPlugin({ sampleRate }));
238
+
239
+ return isEnabled;
240
+ } catch (e) {
241
+ Logger.logError(
242
+ "[spiffy-ai] Error initializing amplitude session-replay",
243
+ e
244
+ );
245
+ return false;
246
+ }
247
+ }, [orgShortName, featureFlagService]);
248
+
249
+ const getEventTrackingEnrichment = useCallback((): EnrichmentPlugin => {
250
+ if (internalEventTrackingEnrichment !== undefined) {
251
+ return internalEventTrackingEnrichment;
252
+ }
253
+
254
+ const enrichment: EnrichmentPlugin = {
255
+ name: "page-view-tracking-enrichment",
256
+ type: "enrichment",
257
+ setup: async () => undefined,
258
+ execute: async (event: Event): Promise<Event> => {
259
+ let enrichedEvent: Event;
260
+
261
+ const eventsToEnrich = [
262
+ "[Amplitude] Page Viewed",
263
+ `[Spiffy] ${SpiffyMetricsEventName.BundleLoaded}`,
264
+ ];
265
+
266
+ if (eventsToEnrich.includes(event.event_type)) {
267
+ const globalProperties: Record<string, string> = {};
268
+
269
+ if (publicKey) {
270
+ globalProperties["globalProperties.publicKey"] = publicKey;
271
+ }
272
+ if (featureOverrides) {
273
+ Object.entries(featureOverrides).forEach(([key, value]) => {
274
+ globalProperties[`globalProperties.featureOverrides.${key}`] =
275
+ String(value);
276
+ });
277
+ }
278
+ if (variantUrlOverride) {
279
+ globalProperties["globalProperties.variantUrlOverride"] =
280
+ variantUrlOverride;
281
+ }
282
+ if (variantInfoOverride) {
283
+ globalProperties["globalProperties.variantInfoOverride"] =
284
+ JSON.stringify(variantInfoOverride);
285
+ }
286
+ if (show != null) {
287
+ globalProperties["globalProperties.show"] = String(show);
288
+ }
289
+
290
+ const enabledFeatures = featureFlagService!.getFeatureFlags();
291
+ const enabledFeaturesProperties = Object.entries(
292
+ enabledFeatures
293
+ ).reduce<Record<string, string>>(
294
+ (acc, [key, value]) => ({
295
+ ...acc,
296
+ [`enabledFeatures.${key}`]: `${value}`,
297
+ }),
298
+ {}
299
+ );
300
+
301
+ const timingProperties = {
302
+ "timing.enriched_at_ms": window.performance?.now(),
303
+ };
304
+
305
+ enrichedEvent = {
306
+ ...event,
307
+ event_properties: {
308
+ ...event.event_properties,
309
+ ...getDefaultTrackingProps(),
310
+ ...globalProperties,
311
+ ...enabledFeaturesProperties,
312
+ ...timingProperties,
313
+ },
314
+ };
315
+ } else {
316
+ enrichedEvent = event;
317
+ }
318
+
319
+ EventsDispatcher.dispatch(SpiffyEvent.AMPLITUDE_EVENT, enrichedEvent);
320
+
321
+ return enrichedEvent;
322
+ },
323
+ };
324
+ setInternalEventTrackingEnrichment(enrichment);
325
+ return enrichment;
326
+ }, [
327
+ internalEventTrackingEnrichment,
328
+ getDefaultTrackingProps,
329
+ featureFlagService,
330
+ publicKey,
331
+ featureOverrides,
332
+ variantUrlOverride,
333
+ variantInfoOverride,
334
+ show,
335
+ ]);
336
+
337
+ useEffect(() => {
338
+ if (isReady && !amplitudeClient) {
339
+ const currentAmplitudeInstance: BrowserClient = createInstance();
340
+ const isSessionsEnabled = amplitudeSessionReplayInit();
341
+ currentAmplitudeInstance.add(getEventTrackingEnrichment());
342
+ currentAmplitudeInstance.init(amplitudeApiKey!, userId!, {
343
+ serverZone: dataResidency as ServerZoneType,
344
+ trackingOptions: {
345
+ ipAddress: true,
346
+ },
347
+ autocapture: {
348
+ attribution: true,
349
+ pageViews: {
350
+ trackHistoryChanges: "pathOnly",
351
+ },
352
+ sessions: isSessionsEnabled,
353
+ formInteractions: false,
354
+ fileDownloads: false,
355
+ },
356
+ });
357
+ setAmplitudeClient(currentAmplitudeInstance);
358
+ }
359
+ }, [
360
+ isReady,
361
+ amplitudeClient,
362
+ amplitudeApiKey,
363
+ userId,
364
+ dataResidency,
365
+ amplitudeSessionReplayInit,
366
+ getEventTrackingEnrichment,
367
+ ]);
368
+
369
+ const trackEvent = useCallback(
370
+ async ({
371
+ eventName,
372
+ eventProps,
373
+ eventGroups,
374
+ alsoSendToGoogleAnalytics = false,
375
+ }: TrackEventParams): Promise<void> => {
376
+ try {
377
+ const decoratedEventName = `[Spiffy] ${eventName}`;
378
+
379
+ if (!amplitudeClient) {
380
+ Logger.logWarn("amplitude client undefined", undefined, {
381
+ event_name: decoratedEventName,
382
+ });
383
+ return;
384
+ }
385
+
386
+ const eventData = JSON.stringify({
387
+ eventName,
388
+ eventProps,
389
+ created_at: new Date().toISOString(),
390
+ });
391
+ const encoder = new TextEncoder();
392
+ const data = encoder.encode(eventData);
393
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
394
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
395
+ const currentInsertId = hashArray
396
+ .map((b) => b.toString(16).padStart(2, "0"))
397
+ .join("");
398
+
399
+ Logger.logDebug(`amplitude tracking ${decoratedEventName}`, null, {
400
+ event_name: decoratedEventName,
401
+ props: eventProps,
402
+ });
403
+
404
+ amplitudeClient.track(
405
+ decoratedEventName,
406
+ {
407
+ ...getDefaultTrackingProps(),
408
+ ...eventProps,
409
+ ...(eventProps
410
+ ? eventPropsToPrefixedEventProps(eventName, eventProps)
411
+ : {}),
412
+ },
413
+ {
414
+ ...eventGroups,
415
+ insert_id: currentInsertId,
416
+ }
417
+ );
418
+
419
+ if (alsoSendToGoogleAnalytics && orgGaConfig) {
420
+ Logger.logDebug("[spiffy-ai] GA tracking", decoratedEventName);
421
+ if (window.dataLayer) {
422
+ (window.dataLayer as any[]).push({
423
+ event: decoratedEventName,
424
+ eventProps: eventProps,
425
+ });
426
+ }
427
+ }
428
+ } catch (err) {
429
+ Logger.logError("[spiffy-ai] Error tracking event", err, {
430
+ eventName,
431
+ eventProps,
432
+ });
433
+ }
434
+ },
435
+ [
436
+ amplitudeClient,
437
+ getDefaultTrackingProps,
438
+ eventPropsToPrefixedEventProps,
439
+ orgGaConfig,
440
+ ]
441
+ );
442
+
443
+ const value = useMemo(
444
+ () => ({
445
+ trackEvent,
446
+ isReady,
447
+ setSupplementalDefaultProps: (props: Record<string, unknown>) =>
448
+ setSupplementalDefaultProps(props),
449
+ }),
450
+ [trackEvent, isReady, setSupplementalDefaultProps]
451
+ );
452
+
453
+ return (
454
+ <AmplitudeContext.Provider value={value}>
455
+ {children}
456
+ </AmplitudeContext.Provider>
457
+ );
458
+ };
459
+
460
+ export const useAmplitude = () => {
461
+ const context = useContext(AmplitudeContext);
462
+ if (!context) {
463
+ throw new Error("useAmplitude must be used within AmplitudeProvider");
464
+ }
465
+ return context;
466
+ };
@@ -0,0 +1,48 @@
1
+ import React, { createContext, useContext, useCallback, useMemo } from "react";
2
+ import { useAtomValue } from "jotai";
3
+ import { cdnUrlAtom } from "../atoms/envive/enviveConfig";
4
+
5
+ interface CdnContextType {
6
+ cdnUrl: string;
7
+ getCdnBasePath: () => string;
8
+ getAssetURL: (assetName: string, orgShortName: string) => string;
9
+ }
10
+
11
+ const CdnContext = createContext<CdnContextType | null>(null);
12
+
13
+ export const CdnProvider: React.FC<{ children: React.ReactNode }> = ({
14
+ children,
15
+ }) => {
16
+ const cdnUrlAtomValue = useAtomValue(cdnUrlAtom);
17
+ const cdnUrl = cdnUrlAtomValue || "https://cdn.spiffy.ai/other";
18
+
19
+ const getCdnBasePath = useCallback(() => {
20
+ return cdnUrl;
21
+ }, [cdnUrl]);
22
+
23
+ const getAssetURL = useCallback(
24
+ (assetName: string, orgShortName: string) => {
25
+ return `${getCdnBasePath()}/assets/${orgShortName}/${assetName}`;
26
+ },
27
+ [getCdnBasePath]
28
+ );
29
+
30
+ const value = useMemo(
31
+ () => ({
32
+ cdnUrl,
33
+ getCdnBasePath,
34
+ getAssetURL,
35
+ }),
36
+ [cdnUrl, getCdnBasePath, getAssetURL]
37
+ );
38
+
39
+ return <CdnContext.Provider value={value}>{children}</CdnContext.Provider>;
40
+ };
41
+
42
+ export const useCdn = () => {
43
+ const context = useContext(CdnContext);
44
+ if (!context) {
45
+ throw new Error("useCdn must be used within a CdnProvider");
46
+ }
47
+ return context;
48
+ };
@@ -8,9 +8,9 @@ import {
8
8
  useCallback,
9
9
  useMemo,
10
10
  } from "react";
11
- import CommerceApiClient from "src/adapters/spiffy/commerce/api";
11
+ import CommerceApiClient from "src/application/commerce-api";
12
12
  import { v4 as uuid } from "uuid";
13
- import { SessionRestartRequired } from "src/adapters/spiffy/commerce/exceptions/sessionExceptions";
13
+ import { SessionRestartRequired } from "src/types/exceptions/sessionExceptions";
14
14
  import Logger from "src/application/logging/logger";
15
15
  import {
16
16
  Message,
@@ -19,10 +19,7 @@ import {
19
19
  NextMessageRequest,
20
20
  Response,
21
21
  } from "src/application/models";
22
- import {
23
- AmplitudeAdapter,
24
- SpiffyMetricsEventName,
25
- } from "src/adapters/amplitude";
22
+ import { SpiffyMetricsEventName } from "src/contexts/amplitudeContext";
26
23
  import { messageFromResponse } from "src/application/utils";
27
24
  import { chatIdAtom, userIdAtom, variantInfoAtom } from "src/atoms/app";
28
25
  import {
@@ -43,7 +40,6 @@ import {
43
40
  handleSearchResultsAtom,
44
41
  chatSearchIsLoadingAtom,
45
42
  } from "src/atoms/search/chatSearch";
46
- import { orgIdAtom } from "src/atoms/org/org";
47
43
  import { useSystemSettingsContext } from "src/hooks";
48
44
  import { createAppLoadedEvent, createVisitUserEvent } from "src/hooks/utils";
49
45
  import { useMessageInterceptor } from "src/interceptors/useMessageInterceptor";
@@ -57,6 +53,7 @@ import {
57
53
  userEventQueueAtom,
58
54
  userQueueEventCountAtom,
59
55
  } from "src/atoms/chat/messageQueue";
56
+ import { useAmplitudeTracking } from "src/hooks/useAmplitudeOperations";
60
57
 
61
58
  /**
62
59
  * Record the chat assistant response in Amplitude
@@ -66,7 +63,11 @@ import {
66
63
  */
67
64
  const recordAssistantResponse = (
68
65
  startTimeMs: number,
69
- payload: NextMessageRequest
66
+ payload: NextMessageRequest,
67
+ track: (
68
+ eventName: SpiffyMetricsEventName,
69
+ eventProps?: Record<string, unknown>
70
+ ) => void
70
71
  ) => {
71
72
  const atomStore = getAtomStore();
72
73
  const chatState = atomStore.get(chatAtom);
@@ -115,8 +116,7 @@ const recordAssistantResponse = (
115
116
  eventProps.search_products_sort_type = searchProductsSort;
116
117
  }
117
118
 
118
- AmplitudeAdapter.trackEvent({
119
- eventName: SpiffyMetricsEventName.ChatAssistantResponse,
119
+ track(SpiffyMetricsEventName.ChatAssistantResponse, {
120
120
  eventProps,
121
121
  });
122
122
  };
@@ -252,13 +252,15 @@ const ChatContextProvider = ({ children }: { children: ReactNode }) => {
252
252
  const userId = useAtomValue(userIdAtom);
253
253
  const chatId = useAtomValue(chatIdAtom);
254
254
  const supportedEvent = useAtomValue(supportedEventAtom);
255
- const orgId = useAtomValue(orgIdAtom);
255
+ // TODO: Replace with actual orgId from useEnviveConfig or NewOrgConfigContext when available
256
+ const orgId = "mock-org-id";
256
257
 
257
258
  const variantInfo = useAtomValue(variantInfoAtom);
258
259
  const settingsContext = useSystemSettingsContext();
259
260
  const messageInterceptor = useMessageInterceptor();
260
261
  const handleSearchResults = useSetAtom(handleSearchResultsAtom);
261
262
  const setSearchIsLoading = useSetAtom(chatSearchIsLoadingAtom);
263
+ const { track } = useAmplitudeTracking();
262
264
 
263
265
  const getStreamingResponses = useCallback(
264
266
  async (
@@ -340,7 +342,7 @@ const ChatContextProvider = ({ children }: { children: ReactNode }) => {
340
342
 
341
343
  await getStreamingResponses(requestPayload);
342
344
 
343
- recordAssistantResponse(startTimeMs, requestPayload);
345
+ recordAssistantResponse(startTimeMs, requestPayload, track);
344
346
  await getSuggestions();
345
347
  } catch (error) {
346
348
  Logger.logError("[spiffy-ai] getResponses error", error);
@@ -361,6 +363,7 @@ const ChatContextProvider = ({ children }: { children: ReactNode }) => {
361
363
  markUserEventsProcessed,
362
364
  getSuggestions,
363
365
  setUserHasReplied,
366
+ track,
364
367
  ]
365
368
  );
366
369
 
@@ -3,6 +3,7 @@ import { useSetAtom, useAtomValue } from "jotai";
3
3
  import type { EnviveConfig } from "./types";
4
4
  import { enviveConfigAtom } from "src/atoms/envive/enviveConfig";
5
5
  import Logger from "src/application/logging/logger";
6
+ import { OrgConfigFeatureGate } from "src/application/models/api/orgConfigResults";
6
7
 
7
8
  const EnviveConfigContext = createContext<EnviveConfig | undefined>(undefined);
8
9
 
@@ -18,6 +19,12 @@ interface EnviveConfigProviderProps {
18
19
  orgLevelApiKey?: string;
19
20
  orgShortName?: string;
20
21
  identifyingPrefix: string;
22
+ featureOverrides?: Record<string, boolean>;
23
+ variantUrlOverride?: string;
24
+ variantInfoOverride?: any;
25
+ show?: boolean;
26
+ publicKey?: string;
27
+ featureGates?: OrgConfigFeatureGate[]; // New prop for feature gates
21
28
  }
22
29
 
23
30
  export const EnviveConfigProvider: React.FC<EnviveConfigProviderProps> = ({
@@ -32,8 +39,15 @@ export const EnviveConfigProvider: React.FC<EnviveConfigProviderProps> = ({
32
39
  orgLevelApiKey,
33
40
  orgShortName,
34
41
  identifyingPrefix,
42
+ featureOverrides,
43
+ variantUrlOverride,
44
+ variantInfoOverride,
45
+ show,
46
+ publicKey,
47
+ featureGates, // Destructure new prop
35
48
  }) => {
36
49
  const setEnviveConfig = useSetAtom(enviveConfigAtom);
50
+
37
51
  const config: EnviveConfig = {
38
52
  amplitudeApiKey,
39
53
  dataResidency,
@@ -45,6 +59,12 @@ export const EnviveConfigProvider: React.FC<EnviveConfigProviderProps> = ({
45
59
  orgLevelApiKey,
46
60
  orgShortName,
47
61
  identifyingPrefix,
62
+ featureOverrides,
63
+ variantUrlOverride,
64
+ variantInfoOverride,
65
+ show,
66
+ publicKey,
67
+ featureGates, // Add to config
48
68
  };
49
69
 
50
70
  useEffect(() => {
@@ -54,28 +74,13 @@ export const EnviveConfigProvider: React.FC<EnviveConfigProviderProps> = ({
54
74
 
55
75
  return (
56
76
  <EnviveConfigContext.Provider value={config}>
57
- {children}
77
+ {config ? children : null}
58
78
  </EnviveConfigContext.Provider>
59
79
  );
60
80
  };
61
81
 
62
82
  export const useEnviveConfig = (): EnviveConfig => {
63
83
  const config = useAtomValue(enviveConfigAtom);
64
- Logger.logDebug("useEnviveConfig: Accessing EnviveConfig", config);
65
-
66
- // During initial render, the atom might not be set yet, so we need to be more patient
67
- // The EnviveConfigProvider will set it in its useEffect
68
- if (!config) {
69
- // Instead of throwing immediately, let's return a default/empty config
70
- // This prevents the error during initial render
71
- Logger.logWarn(
72
- "EnviveConfig not yet available, returning default config",
73
- undefined
74
- );
75
- return {
76
- identifyingPrefix: "spiffy", // This is required, so provide a default
77
- } as EnviveConfig;
78
- }
79
84
 
80
- return config;
85
+ return config ? config : {};
81
86
  };