@envive-ai/react-hooks 0.1.4 → 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 (488) 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 +17 -13
  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 +1 -1
  41. package/dist/atoms/atomStore/index.js +2 -1
  42. package/dist/atoms/chat/index.cjs +44 -40
  43. package/dist/atoms/chat/index.d.cts +35 -36
  44. package/dist/atoms/chat/index.d.ts +35 -36
  45. package/dist/atoms/chat/index.js +14 -10
  46. package/dist/atoms/globalSearch/index.cjs +1 -1
  47. package/dist/atoms/globalSearch/index.d.cts +5 -5
  48. package/dist/atoms/globalSearch/index.d.ts +5 -5
  49. package/dist/atoms/globalSearch/index.js +1 -1
  50. package/dist/atoms/org/index.cjs +26 -37
  51. package/dist/atoms/org/index.d.cts +37 -47
  52. package/dist/atoms/org/index.d.ts +37 -47
  53. package/dist/atoms/org/index.js +11 -11
  54. package/dist/atoms/search/index.cjs +47 -41
  55. package/dist/atoms/search/index.d.cts +7 -9
  56. package/dist/atoms/search/index.d.ts +7 -9
  57. package/dist/atoms/search/index.js +16 -10
  58. package/dist/bandolier-DYEz4-8C.js +1229 -0
  59. package/dist/bandolier-o_-xrbOV.cjs +1229 -0
  60. package/dist/carpe-CsG5jCcl.cjs +607 -0
  61. package/dist/carpe-DONk00bZ.js +605 -0
  62. package/dist/cdnUtils-32v8bDX9.cjs +16 -0
  63. package/dist/cdnUtils-E4tLBt2g.js +11 -0
  64. package/dist/{chat-BgONoYU7.cjs → chat-BubCW1as.cjs} +1 -1
  65. package/dist/chat-CO7cRkaq.cjs +506 -0
  66. package/dist/{chat-CLJ4NWcN.js → chat-CV6MXeID.js} +1 -1
  67. package/dist/chat-hcRc4RRd.js +285 -0
  68. package/dist/{components-CV1fhAkj.js → components-B4T3Uzth.js} +1 -1
  69. package/dist/{components-BKZbet67.cjs → components-Cw9WjA6g.cjs} +1 -1
  70. package/dist/config/locators/components/chat/index.cjs +1 -1
  71. package/dist/config/locators/components/chat/index.d.cts +1 -1
  72. package/dist/config/locators/components/chat/index.d.ts +1 -1
  73. package/dist/config/locators/components/chat/index.js +1 -1
  74. package/dist/config/locators/components/chat/variants/index.d.ts +1 -1
  75. package/dist/config/locators/components/index.cjs +1 -1
  76. package/dist/config/locators/components/index.d.cts +1 -1
  77. package/dist/config/locators/components/index.d.ts +1 -1
  78. package/dist/config/locators/components/index.js +1 -1
  79. package/dist/config/locators/index.cjs +4 -4
  80. package/dist/config/locators/index.d.cts +2 -2
  81. package/dist/config/locators/index.d.ts +3 -3
  82. package/dist/config/locators/index.js +4 -4
  83. package/dist/contexts/index.cjs +45 -14
  84. package/dist/contexts/index.d.cts +10 -78
  85. package/dist/contexts/index.d.ts +10 -78
  86. package/dist/contexts/index.js +22 -11
  87. package/dist/contexts-B4ihTBsV.cjs +2980 -0
  88. package/dist/contexts-DGlr7M1o.js +2596 -0
  89. package/dist/coterie-CKB93qfz.cjs +239 -0
  90. package/dist/{coterie-yQ-_JXSw.cjs → coterie-DHcj2fRE.js} +64 -65
  91. package/dist/{custservice-types-C83itZmy.cjs → custservice-types-Dy0kc9TW.cjs} +1 -1
  92. package/dist/{custservice-types-DPQ-4TI6.js → custservice-types-mnIunabv.js} +1 -1
  93. package/dist/default-BnB4p0Se.cjs +234 -0
  94. package/dist/default-D6f5Dyt7.js +199 -0
  95. package/dist/default-ZKkE5zT4.cjs +4 -0
  96. package/dist/default-legGZJwI.js +4 -0
  97. package/dist/{divIds-DEL_-qU0.cjs → divIds-2dJlU3z8.cjs} +1 -15
  98. package/dist/{divIds-CWkntTsx.js → divIds-BUrN2vY-.js} +2 -4
  99. package/dist/dreamlandBaby-BiRYYFav.js +346 -0
  100. package/dist/dreamlandBaby-zuvmfzfD.cjs +346 -0
  101. package/dist/{embedded-C5uJqmuD.js → embedded-BJLWIriJ.js} +1 -1
  102. package/dist/{embedded--2L0F4b5.cjs → embedded-Dl79TJLC.cjs} +1 -1
  103. package/dist/{entrypoints-CNUvSgnk.js → entrypoints-Bs3pn6EV.js} +1 -1
  104. package/dist/{entrypoints-DM9Sm18O.cjs → entrypoints-Dqi5pzWH.cjs} +1 -1
  105. package/dist/enviveConfig-BccuzS2a.cjs +240 -0
  106. package/dist/enviveConfig-CzhTz8Aa.js +152 -0
  107. package/dist/events/index.cjs +1 -1
  108. package/dist/events/index.d.cts +1 -1
  109. package/dist/events/index.js +1 -1
  110. package/dist/{events-ClCDFK7t.js → events-BrLpaNxh.js} +1 -1
  111. package/dist/{events-Da7gpmGv.cjs → events-DwT6cEwI.cjs} +1 -1
  112. package/dist/fiveCbd-DwTTwC2j.cjs +613 -0
  113. package/dist/fiveCbd-Dz2NouOF.js +613 -0
  114. package/dist/forLoveAndLemons-DqSdyD6S.js +665 -0
  115. package/dist/forLoveAndLemons-Ud6mPrV3.cjs +667 -0
  116. package/dist/{globalSearch-b0wC7ZEO.js → globalSearch-B6THR7Jx.js} +1 -1
  117. package/dist/{globalSearch-BTeZxvk1.cjs → globalSearch-BFvEg53C.cjs} +1 -1
  118. package/dist/graphql-BNW60InJ.cjs +128 -0
  119. package/dist/graphql-CjB8wHzm.js +74 -0
  120. package/dist/graphqlConfig-CYt6tWII.js +30 -0
  121. package/dist/graphqlConfig-DicykC-o.cjs +61 -0
  122. package/dist/greenpan-B_EbPkSP.js +397 -0
  123. package/dist/greenpan-kPE4fJgd.cjs +397 -0
  124. package/dist/grooveLife-Ckuir319.js +342 -0
  125. package/dist/grooveLife-DKSEQp1F.cjs +342 -0
  126. package/dist/homegrownCannabis-BVPa2pqe.js +410 -0
  127. package/dist/homegrownCannabis-BwIAkxuA.cjs +410 -0
  128. package/dist/hooks/index.cjs +40 -16
  129. package/dist/hooks/index.d.cts +122 -95
  130. package/dist/hooks/index.d.ts +122 -95
  131. package/dist/hooks/index.js +22 -11
  132. package/dist/{index-D46Rd0io.d.cts → index-B0NW9KTj.d.cts} +1 -1
  133. package/dist/{index-jBATkcc_.d.cts → index-BDPWBU3h.d.cts} +1 -1
  134. package/dist/index-BMPtlgac.d.ts +191 -0
  135. package/dist/{index-BTK5uzs6.d.cts → index-Bmub8e38.d.cts} +1 -1
  136. package/dist/{index-C62lPpy4.d.cts → index-Byb45OPg.d.cts} +1 -1
  137. package/dist/{index-DPx8s5YH.d.ts → index-C6KdON7d.d.ts} +1 -1
  138. package/dist/index-C7pGDl1A.d.ts +1609 -0
  139. package/dist/{index-CYtsPztZ.d.cts → index-C9lgsCWp.d.cts} +32 -32
  140. package/dist/{index-BzgkfbNO.d.cts → index-CESxqFso.d.cts} +1 -1
  141. package/dist/{index-C_C0tLeD.d.ts → index-Cc-wBCn6.d.ts} +32 -32
  142. package/dist/{index-Cx9e-fRi.d.ts → index-CcIG01PJ.d.ts} +2 -2
  143. package/dist/{index-ClJ0nMsR.d.cts → index-CiWEYzXl.d.cts} +2 -2
  144. package/dist/{index-CKKkTsms.d.ts → index-Cqg6ltII.d.ts} +1 -1
  145. package/dist/{index-CExtydIH.d.ts → index-DOii3C6b.d.ts} +1 -1
  146. package/dist/index-DTu2X-YS.d.cts +1609 -0
  147. package/dist/index-OEifcBsm.d.cts +191 -0
  148. package/dist/{index-Dxpscrvz.d.ts → index-PGF8BvxQ.d.ts} +1 -1
  149. package/dist/{index-D2VaMPA3.d.ts → index-ylUiJvnr.d.ts} +1 -1
  150. package/dist/interceptors/index.cjs +2 -12
  151. package/dist/interceptors/index.d.cts +8 -13
  152. package/dist/interceptors/index.d.ts +8 -13
  153. package/dist/interceptors/index.js +2 -11
  154. package/dist/jackArcher-B39OEIj6.cjs +727 -0
  155. package/dist/{jackArcher-CXf_IAmC.js → jackArcher-BwkWGybC.js} +24 -25
  156. package/dist/jordanCraig-CxRH_jLi.js +1786 -0
  157. package/dist/jordanCraig-RwmWw-jM.cjs +1786 -0
  158. package/dist/kindredBravely-D78VwL20.cjs +490 -0
  159. package/dist/kindredBravely-DQDpAzdl.js +490 -0
  160. package/dist/kutFromTheKloth-TcXQkIti.js +369 -0
  161. package/dist/kutFromTheKloth-dXRrNti0.cjs +369 -0
  162. package/dist/larryAndSerges-Bh5XEXsZ.js +262 -0
  163. package/dist/larryAndSerges-COdBzOzu.cjs +262 -0
  164. package/dist/leapsAndRebounds-BbXnqkl5.cjs +360 -0
  165. package/dist/leapsAndRebounds-mjCaH1k-.js +360 -0
  166. package/dist/longevityrx-DdV3v26F.cjs +320 -0
  167. package/dist/longevityrx-DfPDfvAt.js +320 -0
  168. package/dist/lookOptic-DgXFGBPP.cjs +282 -0
  169. package/dist/{lookOptic-BGhU4910.js → lookOptic-FgVW1afF.js} +19 -20
  170. package/dist/mantraBrand-C5gVm3rk.cjs +750 -0
  171. package/dist/{mantraBrand-DrqG9uqO.js → mantraBrand-uV8HCDR8.js} +22 -23
  172. package/dist/medterra-BtDpr1Hw.cjs +583 -0
  173. package/dist/medterra-DgzE7-mj.js +583 -0
  174. package/dist/modells-CJjsxOIR.js +484 -0
  175. package/dist/modells-Ck5KbRFj.cjs +484 -0
  176. package/dist/models-BkXg5eIP.cjs +1534 -0
  177. package/dist/models-UZ6HszfZ.js +1281 -0
  178. package/dist/{nodeSelector-BiCDowlK.d.ts → nodeSelector-BxrS2S_k.d.ts} +1 -1
  179. package/dist/{nodeSelector-B3bPtEjX.d.cts → nodeSelector-Dm4S-10n.d.cts} +1 -1
  180. package/dist/org-C2RrBVQR.cjs +81 -0
  181. package/dist/org-xMytX--e.js +38 -0
  182. package/dist/orgAnalyticsConfig-BJ2A1RZ-.cjs +39 -0
  183. package/dist/orgAnalyticsConfig-ClrFy2qH.js +14 -0
  184. package/dist/pressedFloral-Bteoboms.js +661 -0
  185. package/dist/pressedFloral-CexgV-xy.cjs +661 -0
  186. package/dist/search-BMOAmrmY.js +459 -0
  187. package/dist/search-Df0Ifneg.cjs +672 -0
  188. package/dist/{search-filter-types-BNTLVXqQ.d.cts → search-filter-types-DosbseF3.d.cts} +1 -1
  189. package/dist/{search-filter-types-DkmH1TxJ.d.ts → search-filter-types-fZf91Pdw.d.ts} +1 -1
  190. package/dist/skinPerfection-BGzq9lq-.cjs +334 -0
  191. package/dist/skinPerfection-BlvcEcUE.js +334 -0
  192. package/dist/snapSupplements-CbbGzAgO.cjs +285 -0
  193. package/dist/snapSupplements-kcsPAOm9.js +285 -0
  194. package/dist/{socialProofClasses-ky69yppk.cjs → socialProofClasses-Db8gzsfi.cjs} +1 -1
  195. package/dist/{socialProofClasses-DdzG1tZy.js → socialProofClasses-kwDvwLOZ.js} +1 -1
  196. package/dist/spanx-B4WFA_rI.js +661 -0
  197. package/dist/spanx-BWoE4F8b.cjs +663 -0
  198. package/dist/spanxStaging-BOrOjhXn.js +845 -0
  199. package/dist/spanxStaging-BfdfIug4.cjs +848 -0
  200. package/dist/{suggestionBarV2-types-CwOXzIKq.js → suggestionBarV2-types-IMMOmCir.js} +1 -1
  201. package/dist/{suggestionBarV2-types-Dc4-zJlV.cjs → suggestionBarV2-types-nnGNgFvR.cjs} +1 -1
  202. package/dist/supergoop-22dd5_BS.js +323 -0
  203. package/dist/supergoop-B-a4cku2.cjs +323 -0
  204. package/dist/{test-types-CXVJxTeu.d.ts → test-types-C9b_OdfO.d.ts} +1 -1
  205. package/dist/{test-types-CuOq25VT.d.cts → test-types-CgVJtwUr.d.cts} +1 -1
  206. package/dist/types/index.cjs +2 -2
  207. package/dist/types/index.d.cts +2 -2
  208. package/dist/types/index.d.ts +2 -2
  209. package/dist/types/index.js +2 -2
  210. package/dist/types--pr1GQQx.js +154 -0
  211. package/dist/types-BVSyY3Hk.cjs +196 -0
  212. package/dist/{uniqueVintage-Cui74mlJ.js → uniqueVintage-CJXiNNe7.js} +19 -20
  213. package/dist/uniqueVintage-D0jzJWlo.cjs +1213 -0
  214. package/dist/useMessageInterceptor-B87e3yu3.cjs +33 -0
  215. package/dist/useMessageInterceptor-Bb7YRaWk.js +25 -0
  216. package/dist/userIdentityContext-BPqvVIg0.d.cts +20 -0
  217. package/dist/userIdentityContext-wbCRmlzp.d.ts +20 -0
  218. package/dist/utils-C9ZSCx12.js +888 -0
  219. package/dist/utils-D5HO61hG.cjs +1016 -0
  220. package/dist/variantInfo-DbVxA1yE.js +1 -0
  221. package/dist/variantInfo-orXoPBCU.cjs +0 -0
  222. package/dist/venaCbd-Bhhu_qUf.cjs +365 -0
  223. package/dist/venaCbd-CanovPS_.js +365 -0
  224. package/dist/westonJonBoucher-BC0x1ktI.cjs +422 -0
  225. package/dist/{westonJonBoucher-C95EuCl-.js → westonJonBoucher-BUu1_wP1.js} +19 -20
  226. package/dist/wineEnthusiast-BlCryfil.cjs +940 -0
  227. package/dist/{wineEnthusiast-DeTFY8Gm.js → wineEnthusiast-Ck1x5iJq.js} +19 -20
  228. package/dist/wolfMattress-D9Mjq-HP.js +372 -0
  229. package/dist/wolfMattress-JssghhC-.cjs +372 -0
  230. package/dist/wolfTactical-C6exYhL7.cjs +349 -0
  231. package/dist/wolfTactical-CnV3KQdI.js +349 -0
  232. package/package.json +101 -19
  233. package/src/{adapters/spiffy/commerce/api.ts → application/commerce-api.ts} +31 -23
  234. package/src/application/models/colorsConfig.ts +18 -18
  235. package/src/application/models/frontendConfig.ts +3 -3
  236. package/src/application/models/graphql/queries/getMerchantColorsQuery.ts +1 -1
  237. package/src/application/models/graphql/queries/getMerchantFrontendConfigQuery.ts +1 -1
  238. package/src/application/models/index.ts +0 -2
  239. package/src/application/models/localStorageEventListener.ts +2 -2
  240. package/src/application/models/supportedOrgs.ts +1 -1
  241. package/src/application/models/utils/snakeToCamelTransformer.ts +8 -8
  242. package/src/application/models/validators/validateGraphQLColorsConfig.ts +0 -21
  243. package/src/application/models/validators/validateGraphQLFrontendConfig.ts +2 -2
  244. package/src/application/utils/analyticsUtils.ts +53 -22
  245. package/src/application/utils/cdnUtils.ts +11 -0
  246. package/src/atoms/amplitude/amplitudeTrackEventAtom.ts +15 -0
  247. package/src/atoms/app/index.ts +7 -17
  248. package/src/atoms/app/variant.ts +13 -4
  249. package/src/atoms/chat/chatState.ts +28 -18
  250. package/src/atoms/chat/messageQueue.ts +36 -5
  251. package/src/atoms/chat/replies.ts +45 -37
  252. package/src/atoms/envive/enviveConfig.ts +10 -6
  253. package/src/atoms/org/graphqlConfig.ts +21 -4
  254. package/src/atoms/org/index.ts +7 -7
  255. package/src/atoms/org/newOrgConfigAtom.ts +8 -0
  256. package/src/atoms/org/orgPageConfig.ts +6 -5
  257. package/src/atoms/search/chatSearch.ts +11 -5
  258. package/src/atoms/search/searchAPI.ts +68 -48
  259. package/src/atoms/search/searchServiceAdapter.ts +25 -0
  260. package/src/contexts/amplitudeContext.tsx +466 -0
  261. package/src/contexts/cdnContext.tsx +48 -0
  262. package/src/contexts/chatContext.tsx +15 -12
  263. package/src/contexts/enviveConfigContext.tsx +22 -17
  264. package/src/contexts/enviveCssContext.tsx +34 -5
  265. package/src/contexts/featureFlagContext.tsx +193 -0
  266. package/src/contexts/featureFlagServiceContext.tsx +87 -0
  267. package/src/contexts/graphqlContext.tsx +165 -0
  268. package/src/contexts/index.ts +13 -3
  269. package/src/contexts/localStorageContext.tsx +159 -0
  270. package/src/contexts/newOrgConfigContext.tsx +104 -0
  271. package/src/contexts/orgConfigContext.tsx +92 -92
  272. package/src/contexts/searchContext.tsx +187 -0
  273. package/src/contexts/sessionStorageContext.tsx +80 -0
  274. package/src/contexts/shopifyUrlContext.tsx +97 -0
  275. package/src/contexts/types.ts +12 -8
  276. package/src/contexts/userIdentityContext.tsx +197 -0
  277. package/src/events/registerAnalyticsListeners.ts +32 -38
  278. package/src/hooks/index.ts +10 -6
  279. package/src/hooks/useAmplitudeOperations.ts +35 -0
  280. package/src/hooks/useAppDetails.ts +49 -0
  281. package/src/hooks/useCdnOperations.ts +16 -0
  282. package/src/hooks/useChatToggle.ts +5 -4
  283. package/src/hooks/useChatToggleAnalytics.ts +15 -0
  284. package/src/hooks/useGraphQLConfig.ts +63 -0
  285. package/src/hooks/useIdentifyUser.ts +33 -0
  286. package/src/hooks/useImageResolver.ts +18 -10
  287. package/src/hooks/useLocalStorageOperations.ts +92 -0
  288. package/src/hooks/useNewOrgConfig.ts +7 -0
  289. package/src/hooks/useSearch.tsx +21 -18
  290. package/src/hooks/useSearchOperations.ts +97 -0
  291. package/src/hooks/useSessionStorageOperations.ts +28 -0
  292. package/src/hooks/useShopifyUrlOperations.ts +45 -0
  293. package/src/hooks/useTrackComponentVisibleEvent.ts +12 -8
  294. package/src/hooks/useUpdateAnalyticsProps.ts +28 -17
  295. package/src/interceptors/index.ts +0 -1
  296. package/src/interceptors/useMessageInterceptor.ts +5 -8
  297. package/src/merchants/bandolier/bandolier.ts +10 -28
  298. package/src/merchants/carpe/carpe.ts +5 -8
  299. package/src/merchants/coterie/coterie.ts +3 -6
  300. package/src/merchants/default.ts +73 -70
  301. package/src/merchants/domInsertion.ts +30 -0
  302. package/src/merchants/dreamlandBaby/dreamlandBaby.ts +12 -6
  303. package/src/merchants/fiveCbd/fiveCbd.ts +7 -13
  304. package/src/merchants/forLoveAndLemons/forLoveAndLemons.ts +44 -14
  305. package/src/merchants/greenpan/greenpan.ts +6 -12
  306. package/src/merchants/gridInsertion.ts +19 -0
  307. package/src/merchants/grooveLife/grooveLife.ts +13 -7
  308. package/src/merchants/homegrownCannabis/homegrownCannabis.ts +12 -6
  309. package/src/merchants/jackArcher/jackArcher.ts +26 -11
  310. package/src/merchants/jordanCraig/jordanCraig.ts +5 -5
  311. package/src/merchants/kindredBravely/kindredBravely.ts +16 -7
  312. package/src/merchants/kutFromTheKloth/kutFromTheKloth.ts +9 -6
  313. package/src/merchants/larryAndSerges/larryAndSerges.ts +6 -2
  314. package/src/merchants/leapsAndRebounds/leapsAndRebounds.ts +7 -7
  315. package/src/merchants/longevityrx/longevityrx.ts +14 -8
  316. package/src/merchants/lookOptic/lookOptic.ts +6 -6
  317. package/src/merchants/mantraBrand/mantraBrand.ts +14 -8
  318. package/src/merchants/medterra/medterra.ts +14 -11
  319. package/src/merchants/modells/modells.ts +6 -9
  320. package/src/merchants/pressedFloral/pressedFloral.ts +7 -13
  321. package/src/merchants/skinPerfection/skinPerfection.ts +13 -7
  322. package/src/merchants/snapSupplements/snapSupplements.ts +13 -10
  323. package/src/merchants/spanx/spanx.ts +6 -6
  324. package/src/merchants/spanx/spanxStaging.ts +6 -12
  325. package/src/merchants/supergoop/supergoop.ts +11 -12
  326. package/src/merchants/uniqueVintage/uniqueVintage.ts +6 -6
  327. package/src/merchants/venaCbd/venaCbd.ts +6 -9
  328. package/src/merchants/westonJonBoucher/westonJonBoucher.ts +6 -6
  329. package/src/merchants/wineEnthusiast/wineEnthusiast.ts +6 -6
  330. package/src/merchants/wolfMattress/wolfMattress.ts +3 -3
  331. package/src/merchants/wolfTactical/wolfTactical.ts +5 -11
  332. package/src/types/config-versions.ts +6 -0
  333. package/src/types.ts +0 -53
  334. package/dist/adapters/amplitude/index.cjs +0 -14
  335. package/dist/adapters/amplitude/index.d.cts +0 -6
  336. package/dist/adapters/amplitude/index.d.ts +0 -6
  337. package/dist/adapters/amplitude/index.js +0 -12
  338. package/dist/api-B2euFL-5.cjs +0 -269
  339. package/dist/api-XRr_lAG6.js +0 -190
  340. package/dist/application/config/index.cjs +0 -43
  341. package/dist/application/config/index.d.cts +0 -15
  342. package/dist/application/config/index.d.ts +0 -15
  343. package/dist/application/config/index.js +0 -41
  344. package/dist/application/service/customerService/index.cjs +0 -4
  345. package/dist/application/service/customerService/index.d.cts +0 -3
  346. package/dist/application/service/customerService/index.d.ts +0 -3
  347. package/dist/application/service/customerService/index.js +0 -4
  348. package/dist/application/service/index.cjs +0 -41
  349. package/dist/application/service/index.d.cts +0 -399
  350. package/dist/application/service/index.d.ts +0 -399
  351. package/dist/application/service/index.js +0 -12
  352. package/dist/bandolier-B76-OE75.cjs +0 -1230
  353. package/dist/bandolier-DRn_x1g1.js +0 -1230
  354. package/dist/carpe-kHi4RLB5.cjs +0 -608
  355. package/dist/carpe-qrSU99gq.js +0 -606
  356. package/dist/contexts-CQDwe3rK.cjs +0 -14333
  357. package/dist/contexts-e2sM-B9g.js +0 -12919
  358. package/dist/coterie-mMirPcHP.js +0 -240
  359. package/dist/customerService-BG1uNZZ1.cjs +0 -36
  360. package/dist/customerService-BHQRnLhC.js +0 -23
  361. package/dist/default-8Jfv8ehQ.cjs +0 -199
  362. package/dist/default-C8PQf-38.js +0 -176
  363. package/dist/default-LukSiCz1.js +0 -4
  364. package/dist/default-rJSJ887P.cjs +0 -4
  365. package/dist/dreamlandBaby-DHltv12Z.cjs +0 -347
  366. package/dist/dreamlandBaby-cG0HM9bt.js +0 -347
  367. package/dist/featureFlagService-5wdmW02z.d.ts +0 -18
  368. package/dist/featureFlagService-DaelrXEk.d.cts +0 -18
  369. package/dist/fiveCbd-Cvnwh03g.cjs +0 -614
  370. package/dist/fiveCbd-DhYMlsf9.js +0 -614
  371. package/dist/forLoveAndLemons-C8DuUexW.js +0 -666
  372. package/dist/forLoveAndLemons-DR6a1zjJ.cjs +0 -668
  373. package/dist/greenpan-B4Pu65kV.js +0 -398
  374. package/dist/greenpan-BL5p6j7f.cjs +0 -398
  375. package/dist/grooveLife-DjKWHoN3.cjs +0 -343
  376. package/dist/grooveLife-JK0TyaPz.js +0 -343
  377. package/dist/homegrownCannabis-DxqSDkmS.js +0 -411
  378. package/dist/homegrownCannabis-ZnfCqW-m.cjs +0 -411
  379. package/dist/index-BfuO9b0Q.d.ts +0 -749
  380. package/dist/index-CNsGWfS6.d.cts +0 -749
  381. package/dist/index-DFL1dIT_.d.ts +0 -7
  382. package/dist/index-MFbPQ8Ji.d.ts +0 -95
  383. package/dist/index-VSFakgAI.d.cts +0 -95
  384. package/dist/index-zZjcds15.d.cts +0 -7
  385. package/dist/jackArcher-mGkojXek.cjs +0 -728
  386. package/dist/jordanCraig-BvCvPRoR.js +0 -1787
  387. package/dist/jordanCraig-Dv8pVCiS.cjs +0 -1787
  388. package/dist/kindredBravely-UQP7wiNu.cjs +0 -491
  389. package/dist/kindredBravely-X8F_LNph.js +0 -491
  390. package/dist/kutFromTheKloth-BhYKk3CN.cjs +0 -370
  391. package/dist/kutFromTheKloth-D1xsTSJr.js +0 -370
  392. package/dist/larryAndSerges-1411NuZa.cjs +0 -262
  393. package/dist/larryAndSerges-DVIRLItu.js +0 -262
  394. package/dist/leapsAndRebounds-BJ8mwr33.js +0 -361
  395. package/dist/leapsAndRebounds-UcP9EJVO.cjs +0 -361
  396. package/dist/logger-Dln20ans.cjs +0 -26
  397. package/dist/logger-pdEEY8T2.js +0 -20
  398. package/dist/longevityrx-BFSv9GF5.cjs +0 -321
  399. package/dist/longevityrx-Cp6wleWr.js +0 -321
  400. package/dist/lookOptic-KieSqskd.cjs +0 -283
  401. package/dist/mantraBrand-CHQw-0nw.cjs +0 -751
  402. package/dist/medterra-CLG6Co1C.cjs +0 -584
  403. package/dist/medterra-D8ZX9NZC.js +0 -584
  404. package/dist/modells-BzyPwN2m.cjs +0 -485
  405. package/dist/modells-CAfqOCW4.js +0 -485
  406. package/dist/orgConfigResults--dAwtw3W.d.ts +0 -881
  407. package/dist/orgConfigResults-BL0XBA6x.d.cts +0 -881
  408. package/dist/pressedFloral-DULBuQwR.cjs +0 -662
  409. package/dist/pressedFloral-Dp-7Fk3S.js +0 -662
  410. package/dist/skinPerfection-BxuYCeJX.js +0 -335
  411. package/dist/skinPerfection-Cd3XZ6By.cjs +0 -335
  412. package/dist/snapSupplements-Bf6htPM0.js +0 -286
  413. package/dist/snapSupplements-ZFnXyMuZ.cjs +0 -286
  414. package/dist/spanx-CwDPQaGj.js +0 -662
  415. package/dist/spanx-Cyd4qDlK.cjs +0 -664
  416. package/dist/spanxStaging-D43nyAGy.js +0 -846
  417. package/dist/spanxStaging-ijbYnHzr.cjs +0 -849
  418. package/dist/supergoop-BnbFG7hm.cjs +0 -338
  419. package/dist/supergoop-CY043wIg.js +0 -336
  420. package/dist/types-BF_CJeck.js +0 -177
  421. package/dist/types-CD4LFta-.d.cts +0 -33
  422. package/dist/types-CNH4sfF-.cjs +0 -231
  423. package/dist/types-DBdI0j89.d.ts +0 -33
  424. package/dist/uniqueVintage-R2Jcu1y1.cjs +0 -1214
  425. package/dist/variant-CKVRF2-W.d.ts +0 -13
  426. package/dist/variant-raYuOP4L.d.cts +0 -13
  427. package/dist/venaCbd-o5_vOp4e.js +0 -366
  428. package/dist/venaCbd-r-IxEVc1.cjs +0 -366
  429. package/dist/westonJonBoucher-DjGEW3ZB.cjs +0 -423
  430. package/dist/wineEnthusiast-DvfcV5B3.cjs +0 -941
  431. package/dist/wolfMattress-6xPfOJt3.js +0 -373
  432. package/dist/wolfMattress-BjGnGKjP.cjs +0 -373
  433. package/dist/wolfTactical-Bi3WZu0m.cjs +0 -350
  434. package/dist/wolfTactical-C_F9-oPX.js +0 -350
  435. package/src/adapters/amplitude/amplitudeAdapter.ts +0 -477
  436. package/src/adapters/amplitude/index.ts +0 -2
  437. package/src/adapters/amplitude/stubAmplitudeAdapter.ts +0 -34
  438. package/src/adapters/spiffy/commerce/graphql.ts +0 -219
  439. package/src/application/config/generalStaticConfig.ts +0 -40
  440. package/src/application/config/index.ts +0 -1
  441. package/src/application/models/domMutationContinuation.ts +0 -7
  442. package/src/application/models/domObservationStrategy.ts +0 -9
  443. package/src/application/service/cachingService.ts +0 -84
  444. package/src/application/service/cdnService.ts +0 -20
  445. package/src/application/service/customerService/index.ts +0 -8
  446. package/src/application/service/customerService/providers/UnsupportedCustomerService.ts +0 -15
  447. package/src/application/service/domMutationObserver.ts +0 -320
  448. package/src/application/service/domMutations/GridInsertionService.ts +0 -123
  449. package/src/application/service/domMutations/dataLayer/dataLayerEventsListener.ts +0 -99
  450. package/src/application/service/domMutations/domInsertionService.ts +0 -90
  451. package/src/application/service/domMutations/domMutationListener.ts +0 -15
  452. package/src/application/service/domMutations/domMutationListenerState.ts +0 -52
  453. package/src/application/service/domMutations/floatingChat/embeddedChatsPlacementsListener.ts +0 -41
  454. package/src/application/service/domMutations/gladly/gladlyListener.ts +0 -61
  455. package/src/application/service/domMutations/spiffy/orgs/common/kustomerVisibilityListener.ts +0 -41
  456. package/src/application/service/domMutations/spiffy/orgs/common/orgsCommonDataLayerListener.ts +0 -119
  457. package/src/application/service/featureFlagService.ts +0 -130
  458. package/src/application/service/index.ts +0 -31
  459. package/src/application/service/kustomerIntegrationService.ts +0 -111
  460. package/src/application/service/localStorageService.ts +0 -77
  461. package/src/application/service/pageVariantService.ts +0 -866
  462. package/src/application/service/searchService.ts +0 -147
  463. package/src/application/service/sessionStorageService.ts +0 -27
  464. package/src/application/service/shopifyUrlService.ts +0 -63
  465. package/src/application/service/userIdentityService.ts +0 -114
  466. package/src/application/service/windowChatToggleService.ts +0 -80
  467. package/src/application/service/windowDataLayerService.ts +0 -181
  468. package/src/application/service/windowFrontendConfigService.ts +0 -129
  469. package/src/atoms/org/merchantCss.ts +0 -158
  470. package/src/atoms/org/org.ts +0 -291
  471. package/src/atoms/org/orgUIConfig.ts +0 -142
  472. package/src/enabled-features.ts +0 -83
  473. package/src/hooks/useDynamicVariants.ts +0 -210
  474. package/src/hooks/useFileUpload.ts +0 -63
  475. package/src/hooks/useHideElements.ts +0 -82
  476. package/src/hooks/useHorizontalScrollAnimation.ts +0 -115
  477. package/src/hooks/useReducedMotionWithOverride.ts +0 -15
  478. package/src/hooks/useSnapControl.ts +0 -155
  479. package/src/interceptors/useFormEscalation.ts +0 -57
  480. /package/dist/{variantInfo-CzhR5W6h.js → atomStore-CZnUUsrr.js} +0 -0
  481. /package/dist/{variantInfo-CNRTY0gH.cjs → atomStore-KSoFS3Jj.cjs} +0 -0
  482. /package/dist/{utilityTypes-C4h2wgAK.cjs → locators-0YYZu9n4.cjs} +0 -0
  483. /package/dist/{utilityTypes-BVikejDo.js → locators-fBXS_pxP.js} +0 -0
  484. /package/dist/{locators-Dc5ZT0aF.js → utilityTypes-8sETsYPk.js} +0 -0
  485. /package/dist/{locators-lQMJj830.cjs → utilityTypes-COShxVir.cjs} +0 -0
  486. /package/src/{application/service/customerService/types.ts → types/customerService.ts} +0 -0
  487. /package/src/{adapters/spiffy/commerce → types}/exceptions/sessionExceptions.ts +0 -0
  488. /package/src/{adapters/spiffy/commerce → types}/exceptions/unsupportedProductExceptions.ts +0 -0
@@ -1,142 +0,0 @@
1
- import { atom } from "jotai";
2
- import { FeatureGates, getOrgInfo } from "src/application/models";
3
- import { findCustomerServiceImpl } from "src/application/service/customerService";
4
- import { CustomerServiceIntegrationMode } from "src/application/service/customerService/types";
5
- import { featureFlagServiceAtom, orgShortNameAtom } from "src/atoms/org/org";
6
- import { OrgUIConfig } from "src/contexts/types";
7
- import { getAtomStore } from "src/atoms/atomStore/atomStore";
8
- import Logger from "src/application/logging/logger";
9
-
10
- const getCustomerServiceIntegrationMode = ({
11
- integrationMode,
12
- isNewFeatureEnabled,
13
- }: {
14
- integrationMode: CustomerServiceIntegrationMode;
15
- isNewFeatureEnabled: boolean;
16
- }): CustomerServiceIntegrationMode => {
17
- if (integrationMode !== CustomerServiceIntegrationMode.full) {
18
- return integrationMode;
19
- }
20
- // Only allow CustomerServiceIntegrationMode.full if `isNewFeatureEnabled` is also true
21
- return isNewFeatureEnabled
22
- ? integrationMode
23
- : CustomerServiceIntegrationMode.simple;
24
- };
25
-
26
- const internalOrgUIConfigAtom = atom<OrgUIConfig | undefined>(undefined);
27
-
28
- export const orgUIConfigAtom = atom(
29
- (get) => {
30
- const orgUIConfig = get(internalOrgUIConfigAtom);
31
- return orgUIConfig; // Return undefined if not set instead of throwing
32
- },
33
- (_, set, value: OrgUIConfig) => {
34
- set(internalOrgUIConfigAtom, value);
35
- }
36
- );
37
-
38
- export const getOrgUIConfig = async (
39
- graphqlOrgUIConfig?: Omit<OrgUIConfig, "merchantOverrideCss">,
40
- graphqlMerchantOverrideCss?: string
41
- ) => {
42
- const atomStore = getAtomStore();
43
- const orgShortName = atomStore.get(orgShortNameAtom);
44
- if (!orgShortName) {
45
- Logger.logWarn("orgShortName is undefined, cannot get org info", undefined);
46
- return;
47
- }
48
-
49
- const orgInfo = await getOrgInfo(orgShortName);
50
-
51
- const featureFlagService = atomStore.get(featureFlagServiceAtom);
52
- if (!featureFlagService) {
53
- Logger.logWarn(
54
- "featureFlagService is undefined, cannot get feature flags",
55
- undefined
56
- );
57
- return;
58
- }
59
-
60
- const isNewFeatureEnabled = featureFlagService.isFeatureGateEnabled(
61
- FeatureGates.IsNewFeatureEnabled
62
- );
63
- const enableWatermark = featureFlagService.isFeatureGateEnabled(
64
- FeatureGates.IsWatermarkEnabled
65
- );
66
- const userQueryAwaysEnabled = featureFlagService.isFeatureGateEnabled(
67
- FeatureGates.IsUserQueryAlwaysEnabled
68
- );
69
- const isGraphQLUIConfigsEnabled = featureFlagService.isFeatureGateEnabled(
70
- FeatureGates.IsGraphQLUIConfigsEnabled
71
- );
72
- const isGraphQLComponentConfigsEnabled =
73
- featureFlagService.isFeatureGateEnabled(
74
- FeatureGates.IsGraphQLComponentConfigsEnabled
75
- );
76
-
77
- const localOrgUIConfig = orgInfo.orgUIConfig();
78
- let orgUIConfig: Partial<OrgUIConfig> = { ...localOrgUIConfig };
79
-
80
- if (isGraphQLUIConfigsEnabled && graphqlMerchantOverrideCss) {
81
- orgUIConfig = {
82
- ...orgUIConfig,
83
- merchantOverrideCss: graphqlMerchantOverrideCss,
84
- };
85
- }
86
-
87
- if (isGraphQLComponentConfigsEnabled && graphqlOrgUIConfig) {
88
- orgUIConfig = {
89
- ...orgUIConfig,
90
- ...graphqlOrgUIConfig,
91
- };
92
- }
93
-
94
- Logger.logInfo("[spiffy-ai] Feature gate enableWatermark check", {
95
- enableWatermark,
96
- floatingChatConfig: orgUIConfig.floatingChatConfig,
97
- });
98
-
99
- const updatedOrgUIConfig: OrgUIConfig = {
100
- ...orgUIConfig,
101
- conversationalSearch: orgUIConfig.conversationalSearch
102
- ? {
103
- ...orgUIConfig.conversationalSearch,
104
- enabled: isNewFeatureEnabled,
105
- }
106
- : undefined,
107
- customerServiceIntegration: {
108
- ...orgUIConfig.customerServiceIntegration,
109
- integrationMode: getCustomerServiceIntegrationMode({
110
- isNewFeatureEnabled,
111
- integrationMode:
112
- orgUIConfig.customerServiceIntegration?.integrationMode ??
113
- CustomerServiceIntegrationMode.none,
114
- }),
115
- },
116
- floatingChatConfig: {
117
- ...orgUIConfig.floatingChatConfig,
118
- // Only enable the watermark if it is enabled in config and through featureFlag.
119
- // This enables a quick "off-switch" in case a merchant tells us to turn it off
120
- // quickly. This can be removed once the config is moved to the backend
121
- enableWatermark:
122
- orgUIConfig.floatingChatConfig?.enableWatermark && enableWatermark,
123
- userQueryInputEnabled:
124
- orgUIConfig.floatingChatConfig?.userQueryInputEnabled ||
125
- userQueryAwaysEnabled,
126
- },
127
- } as OrgUIConfig;
128
-
129
- atomStore.set(orgUIConfigAtom, updatedOrgUIConfig);
130
- };
131
-
132
- export const orgCustomerServiceConfig = atom(
133
- (get) => get(orgUIConfigAtom)?.customerServiceIntegration
134
- );
135
-
136
- export const orgCustomerServiceService = atom((get) => {
137
- const config = get(orgCustomerServiceConfig);
138
- if (!config?.provider) {
139
- return undefined;
140
- }
141
- return findCustomerServiceImpl(config.provider);
142
- });
@@ -1,83 +0,0 @@
1
- import Logger from 'src/application/logging/logger';
2
- import { LocalStorageService } from 'src/application/service/localStorageService';
3
- import { getOrgInfo } from 'src/application/models';
4
- import { OrgConfig } from 'src/application/models/api/orgConfigResults';
5
- import { FeatureFlagService } from 'src/application/service/featureFlagService';
6
-
7
-
8
- type EnabledFeaturesValues = {
9
- envive: boolean;
10
- salesAgent: boolean;
11
- };
12
- class EnabledFeatures {
13
- private static values: EnabledFeaturesValues | undefined = undefined;
14
-
15
- static async get(
16
- orgConfig: OrgConfig,
17
- featureFlagService: FeatureFlagService,
18
- ): Promise<EnabledFeaturesValues> {
19
- if (this.values !== undefined) {
20
- return this.values;
21
- }
22
-
23
- const isSpiffyEnabled = async (orgConfig: OrgConfig, featureFlagService: FeatureFlagService): Promise<boolean> => {
24
- // "spiffy_on" is the highest precedence override and typically used for development/testing
25
- // skip all other checks if it is "true"
26
- if (LocalStorageService.getSpiffyOnFeatureFlag() === 'true') {
27
- Logger.logDebug(`[spiffy-ai] spiffy enabled by "spiffy_on" override`);
28
- return true;
29
- }
30
-
31
- if (LocalStorageService.getSpiffyOnFeatureFlag() === 'false') {
32
- Logger.logDebug(`[spiffy-ai] envive disabled by "envive_on" override`);
33
- return false;
34
- }
35
-
36
- if (window._spiffy?.show != null && !window._spiffy.show) {
37
- Logger.logDebug(`[spiffy-ai] spiffy disabled by window._spiffy.show`);
38
- return false;
39
- }
40
-
41
- if (!featureFlagService.isClientSessionEnabled()) {
42
- Logger.logDebug(`[spiffy-ai] spiffy disabled by feature flag`);
43
- return false;
44
- }
45
-
46
- // this is for when visibility is controlled by the merchant
47
- if (window._spiffy?.show != null && window._spiffy.show) {
48
- Logger.logDebug(`[spiffy-ai] spiffy enabled by window._spiffy.show`);
49
- return true;
50
- }
51
-
52
- // otherwise, spiffy controls the visibility of the experience through a feature flag
53
- const orgInfo = await getOrgInfo(orgConfig.org.org.shortName);
54
- if (orgInfo.alwaysEnabledMerchants) {
55
- Logger.logDebug(`[spiffy-ai] spiffy enabled by org config and feature flag`);
56
- return true;
57
- }
58
-
59
- if (featureFlagService.isClientSessionEnabled()) {
60
- Logger.logDebug(`[spiffy-ai] spiffy is enabled by feature flag`);
61
- return true;
62
- }
63
-
64
- Logger.logDebug(`[spiffy-ai] spiffy is disabled because not all checks have passed`);
65
- return false;
66
- };
67
-
68
- const isSalesAgentEnabled = isSpiffyEnabled;
69
-
70
- this.values = {
71
- envive: await isSpiffyEnabled(orgConfig, featureFlagService),
72
- salesAgent: await isSalesAgentEnabled(orgConfig, featureFlagService),
73
- };
74
-
75
- return this.values;
76
- }
77
-
78
- static reset() {
79
- this.values = undefined;
80
- }
81
- }
82
-
83
- export { EnabledFeatures };
@@ -1,210 +0,0 @@
1
- import Logger from 'src/application/logging/logger';
2
- import { useEffect, useRef, useCallback, useState } from 'react';
3
- import { useAtom, useAtomValue, useSetAtom } from 'jotai';
4
- import { variantInfoAtom } from 'src/atoms/app';
5
- import { PageVariantService } from 'src/application/service/pageVariantService';
6
- import { orgPageConfigAtom } from 'src/atoms/org/orgPageConfig';
7
- import { hasParsedVariantInfoAtom, supportedEventAtom } from 'src/atoms/app/variant';
8
- import { SpiffyMetricsEventName, AmplitudeAdapter } from 'src/adapters/amplitude';
9
- import { orgUIConfigAtom } from 'src/atoms/org/orgUIConfig';
10
- import { createAppLoadedEvent, createVisitUserEvent } from 'src/hooks/utils';
11
- import { queueUserEventAtom } from 'src/atoms/chat/messageQueue';
12
- import { UserEvent } from 'src/application/models';
13
- import { UserEventCategory } from '@spiffy-ai/commerce-api-client';
14
-
15
- // consider putting this in the org config
16
- const DEBOUNCE_DELAY_MS = 300;
17
-
18
- // a debounced function that sets the location href to prevent rapidly changing urls from
19
- // causing the variant info to be changed too early
20
- const debounce = (func: () => void, delay: number): (() => void) => {
21
- let timeoutId: NodeJS.Timeout;
22
-
23
- return () => {
24
- clearTimeout(timeoutId);
25
- timeoutId = setTimeout(() => func(), delay);
26
- };
27
- };
28
-
29
- const isUserEventEqual = (event1: UserEvent | null, event2: UserEvent | null) => {
30
- if (!event1 || !event2) {
31
- return false;
32
- }
33
- if (event1.category !== event2.category) {
34
- return false;
35
- }
36
- if (
37
- event1.category === UserEventCategory.Search &&
38
- event2.category === UserEventCategory.Search
39
- ) {
40
- return event1.attributes.searchTerm === event2.attributes.searchTerm;
41
- }
42
- if (
43
- event1.category === UserEventCategory.PdpVisit &&
44
- event2.category === UserEventCategory.PdpVisit
45
- ) {
46
- return event1.attributes.productId === event2.attributes.productId;
47
- }
48
- if (
49
- event1.category === UserEventCategory.PlpVisit &&
50
- event2.category === UserEventCategory.PlpVisit &&
51
- 'id' in event1.attributes.attributes &&
52
- 'id' in event2.attributes.attributes
53
- ) {
54
- return event1.attributes.attributes.id === event2.attributes.attributes.id;
55
- }
56
- if (
57
- event1.category === UserEventCategory.PageVisit &&
58
- event2.category === UserEventCategory.PageVisit
59
- ) {
60
- return event1.attributes.url === event2.attributes.url;
61
- }
62
- return false;
63
- };
64
-
65
- export const useDynamicVariants = () => {
66
- const orgUIConfig = useAtomValue(orgUIConfigAtom);
67
- const locationHrefRef = useRef<string>(window.location.href);
68
- const setVariantInfo = useSetAtom(variantInfoAtom);
69
- const setSupportedEvent = useSetAtom(supportedEventAtom);
70
- const queueUserEvent = useSetAtom(queueUserEventAtom);
71
- const [mostRecentUserEvent, setMostRecentUserEvent] = useState<UserEvent | null>(null);
72
-
73
- const orgPageConfig = useAtomValue(orgPageConfigAtom);
74
- const debouncedFunc = useRef<(() => void) | null>(null);
75
- // we need to fetch org info before we can get the variant info. this prevents the rest of the application
76
- // logic from running before that happens. More specifically, we want to have all org and variant states
77
- // settled before mounting the ChatContextProvider which will start the session.
78
- const [hasParsedVariantInfo, setHasParsedVariantInfo] = useAtom(hasParsedVariantInfoAtom);
79
- const animationFrameRef = useRef<number | null>(null);
80
- const isBeforeUnload = useRef(false);
81
-
82
- const handleLocationChange = () => {
83
- if (animationFrameRef.current) {
84
- cancelAnimationFrame(animationFrameRef.current);
85
- }
86
-
87
- animationFrameRef.current = requestAnimationFrame(() => {
88
- if (locationHrefRef.current !== window.location.href) {
89
- debouncedFunc.current?.();
90
- }
91
- });
92
- };
93
-
94
- const handlePageChange = useCallback(async () => {
95
- if (isBeforeUnload.current) {
96
- return;
97
- }
98
-
99
- if (!orgPageConfig) {
100
- Logger.logWarn(
101
- '[spiffy-ai] orgPageConfig not found. skipping page change handling',
102
- undefined,
103
- );
104
- return;
105
- }
106
-
107
- const parsedVariantInfo = await PageVariantService.getVariantInfoWithPageConfig(orgPageConfig);
108
-
109
- if (parsedVariantInfo) {
110
- Logger.logDebug('[spiffy-ai] variantInfo changed', parsedVariantInfo);
111
- const [newVariantInfo, pageVariantConfig] = parsedVariantInfo;
112
-
113
- setVariantInfo(newVariantInfo);
114
- setHasParsedVariantInfo(true);
115
-
116
- const visitEvent = createVisitUserEvent({ variantInfo: newVariantInfo });
117
- if (visitEvent && !isUserEventEqual(mostRecentUserEvent, visitEvent)) {
118
- setMostRecentUserEvent(visitEvent);
119
- queueUserEvent(createAppLoadedEvent());
120
- queueUserEvent(visitEvent);
121
- }
122
-
123
- const supportedEvent = await PageVariantService.checkSupportedEvent(pageVariantConfig);
124
- console.log('useDynamicVariants - supportedEvent', supportedEvent);
125
- setSupportedEvent(supportedEvent);
126
- AmplitudeAdapter.trackEvent({
127
- eventName: SpiffyMetricsEventName.SupportedEvent,
128
- eventProps: {
129
- ...supportedEvent,
130
- },
131
- });
132
- } else {
133
- setHasParsedVariantInfo(false);
134
- }
135
- }, [
136
- orgPageConfig,
137
- setVariantInfo,
138
- setHasParsedVariantInfo,
139
- setSupportedEvent,
140
- queueUserEvent,
141
- mostRecentUserEvent,
142
- setMostRecentUserEvent,
143
- ]);
144
-
145
- useEffect(() => {
146
- debouncedFunc.current = debounce(() => {
147
- locationHrefRef.current = window.location.href;
148
- handlePageChange();
149
- }, DEBOUNCE_DELAY_MS);
150
-
151
- return () => {
152
- debouncedFunc.current = null;
153
- };
154
- }, [handlePageChange]);
155
-
156
- useEffect(() => {
157
- // when navigation happens, the url is updated before the page is unloaded & reloaded
158
- // this causes the variant info to be changed first and triggering the hook that fetches
159
- // next responses. On non-SPA's, this handler prevents variant info from being updated
160
- // and lets the usual initialization sequence update it instead. On SPA's, this is not called
161
- // and handleLocationChange is called instead
162
- const handleBeforeUnload = () => {
163
- setSupportedEvent(undefined);
164
- isBeforeUnload.current = true;
165
- };
166
-
167
- window.addEventListener('click', handleLocationChange);
168
- window.addEventListener('popstate', handleLocationChange);
169
- window.addEventListener('beforeunload', handleBeforeUnload);
170
-
171
- return () => {
172
- window.removeEventListener('click', handleLocationChange);
173
- window.removeEventListener('popstate', handleLocationChange);
174
- window.removeEventListener('beforeunload', handleBeforeUnload);
175
- // TODO: this is causing the supportedEvent to be undefined for Magento customers
176
- // Why is unclear however...
177
- // setSupportedEvent(undefined);
178
-
179
- if (animationFrameRef.current) {
180
- cancelAnimationFrame(animationFrameRef.current);
181
- }
182
- };
183
- }, [handlePageChange, setSupportedEvent]);
184
-
185
- useEffect(() => {
186
- // handle the initial page load and when the variant info is overridden
187
- if (!hasParsedVariantInfo) {
188
- handlePageChange();
189
- }
190
- }, [hasParsedVariantInfo, handlePageChange]);
191
-
192
- useEffect(() => {
193
- let windowInterval: number | null = null;
194
- const { merchantVariantSettings } = orgUIConfig;
195
-
196
- if (merchantVariantSettings?.dynamicVariants?.enabled) {
197
- const refreshInterval = merchantVariantSettings?.dynamicVariants?.refreshInterval;
198
- windowInterval = window.setInterval(() => {
199
- handleLocationChange();
200
- }, refreshInterval);
201
- }
202
-
203
- return () => {
204
- if (windowInterval) {
205
- window.clearInterval(windowInterval);
206
- }
207
- };
208
- // eslint-disable-next-line react-hooks/exhaustive-deps
209
- }, []);
210
- };
@@ -1,63 +0,0 @@
1
- import { AttachmentRequest } from "@spiffy-ai/commerce-api-client";
2
- import { useAtom, useAtomValue } from "jotai";
3
- import { useRef, useState } from "react";
4
- import {
5
- orgCustomerServiceService,
6
- customerServiceAttachment,
7
- } from "src/atoms/org";
8
-
9
- export const useFileUpload = () => {
10
- const fileInputRef = useRef(null);
11
- const [attachment, setAttachment] = useAtom(customerServiceAttachment);
12
- const customerServiceImpl = useAtomValue(orgCustomerServiceService);
13
- const [error, setError] = useState("");
14
-
15
- const isValidFile = (file?: File) => {
16
- const maxSize = customerServiceImpl.maxfileUploadSize;
17
- if (maxSize && (file?.size || 0) > maxSize) {
18
- const strFileSize = `${(maxSize / 1000000).toFixed(1)}MB`;
19
- setError(`Exceeded file size of ${strFileSize}`);
20
- return false;
21
- }
22
- return true;
23
- };
24
-
25
- const handleFileSelect = (event: React.ChangeEvent<HTMLInputElement>) => {
26
- const file = event?.target?.files?.[0];
27
-
28
- if (file && isValidFile(file)) {
29
- const reader = new FileReader();
30
- reader.readAsDataURL(file);
31
- reader.onloadend = () => {
32
- const base64 = reader?.result as string;
33
- setAttachment({
34
- base64_content: base64,
35
- content_type: file.type,
36
- file_name: file.name,
37
- });
38
- };
39
- }
40
- };
41
-
42
- const prepareAttachment = (): AttachmentRequest | undefined => {
43
- if (attachment) {
44
- return {
45
- ...attachment,
46
- base64_content: attachment?.base64_content.split(",")[1],
47
- } as AttachmentRequest;
48
- }
49
- };
50
-
51
- const handleFileRemove = () => {
52
- setAttachment(undefined);
53
- };
54
-
55
- return {
56
- error,
57
- fileInputRef,
58
- attachment,
59
- handleFileSelect,
60
- handleFileRemove,
61
- prepareAttachment,
62
- };
63
- };
@@ -1,82 +0,0 @@
1
- import Logger from 'src/application/logging/logger';
2
- import { SelectorFactory } from 'src/application/utils/nodeSelector';
3
- import { useEffect, useRef, useState } from 'react';
4
- import { useAtomValue } from 'jotai';
5
- import { SpiffyEventName } from 'src/application/models/events';
6
- import { ElementObserver } from 'src/application/utils/elementObserver';
7
- import { DOMObserver } from 'src/application/utils/domObserver';
8
- import { orgUIConfigAtom } from 'src/atoms/org/orgUIConfig';
9
-
10
- /**
11
- * This hook hides/shows elements that could overlap with the chat when the chat is opened/closed.
12
- */
13
- export const useHideElements = () => {
14
- const orgUIConfig = useAtomValue(orgUIConfigAtom);
15
- const [hasRegisteredEventListeners, setHasRegisteredEventListeners] = useState(false);
16
- const elementObservers = useRef<ElementObserver[]>([]);
17
-
18
- const hideElements = (elements: ElementObserver[]) => {
19
- elements.forEach((element) => {
20
- element.hide();
21
- });
22
- };
23
-
24
- const showElements = (elements: ElementObserver[]) => {
25
- elements.forEach((element) => {
26
- element.show();
27
- });
28
- };
29
-
30
- useEffect(() => {
31
- elementObservers.current = [];
32
- orgUIConfig.hiddenElementSelectors?.forEach((selector) => {
33
- elementObservers.current.push(DOMObserver.add(SelectorFactory.query(selector)));
34
- });
35
- // since we're not using useElementObserver, we need to manually start the observer
36
- elementObservers.current.forEach((element) => {
37
- element.init();
38
- });
39
- DOMObserver.observe();
40
-
41
- return () => {
42
- elementObservers.current.forEach((element) => {
43
- element.destroy();
44
- });
45
- elementObservers.current = [];
46
- };
47
- }, [orgUIConfig.hiddenElementSelectors]);
48
-
49
- useEffect(() => {
50
- if (elementObservers.current.length > 0 && !hasRegisteredEventListeners) {
51
- Logger.logDebug(
52
- `Registering ${SpiffyEventName.WidgetOpen} event for ${elementObservers.current.length} elements`,
53
- );
54
- window.addEventListener(SpiffyEventName.WidgetOpen, () =>
55
- hideElements(elementObservers.current),
56
- );
57
-
58
- Logger.logDebug(
59
- `Registering ${SpiffyEventName.WidgetClose} event for ${elementObservers.current.length} elements`,
60
- );
61
- window.addEventListener(SpiffyEventName.WidgetClose, () =>
62
- showElements(elementObservers.current),
63
- );
64
-
65
- setHasRegisteredEventListeners(true);
66
- }
67
-
68
- return () => {
69
- if (elementObservers.current.length > 0 && hasRegisteredEventListeners) {
70
- window.removeEventListener(SpiffyEventName.WidgetOpen, () =>
71
- hideElements(elementObservers.current),
72
- );
73
-
74
- window.removeEventListener(SpiffyEventName.WidgetClose, () =>
75
- showElements(elementObservers.current),
76
- );
77
-
78
- setHasRegisteredEventListeners(false);
79
- }
80
- };
81
- }, [hasRegisteredEventListeners]);
82
- };
@@ -1,115 +0,0 @@
1
- import { useEffect, RefObject, useRef } from 'react';
2
- import { useReducedMotionWithOverride } from 'src/hooks/useReducedMotionWithOverride';
3
-
4
- // IMPORTANT: All refs passed to this hook must be mutable (not Readonly)
5
- interface UseHorizontalScrollAnimationOptions {
6
- scrollContainerRef: RefObject<HTMLDivElement>;
7
- animationSpeed?: 'standard' | 'slow' | 'none';
8
- }
9
-
10
- // When using this hook, ensure that scrouuContainerRef is not undefined. It is allowed to
11
- // prevent issued elsewhere in the codebase, but it should be dealt with whenever you use this hook.
12
- export function useHorizontalScrollAnimation({
13
- scrollContainerRef,
14
- animationSpeed = 'standard',
15
- }: UseHorizontalScrollAnimationOptions): void {
16
- const reducedMotion = useReducedMotionWithOverride();
17
- const resumeTimeoutRef = useRef<NodeJS.Timeout | null>(null);
18
- const scrollAnimationRef = useRef<number | null>(null);
19
-
20
- const pauseOnHover = true; // This is unlikely to need to be configurable but I'm throwing it up here just in case.
21
-
22
- // Animation constants: time-based
23
- let PIXELS_PER_SECOND = 40;
24
- switch (animationSpeed) {
25
- case 'standard':
26
- PIXELS_PER_SECOND = 40;
27
- break;
28
- case 'slow':
29
- PIXELS_PER_SECOND = 25;
30
- break;
31
- case 'none':
32
- PIXELS_PER_SECOND = 0;
33
- break;
34
- default:
35
- PIXELS_PER_SECOND = 40;
36
- }
37
- const RESUME_DELAY_MS = 2000;
38
- const isAnimated = animationSpeed !== 'none';
39
-
40
- useEffect(() => {
41
- if (!isAnimated || reducedMotion || !scrollContainerRef) return;
42
-
43
- const container = scrollContainerRef.current;
44
- if (!container) return;
45
- if (container.scrollWidth <= container.clientWidth) return;
46
-
47
- let isPaused = false;
48
- let lastTimestamp: number | null = null;
49
- let accumulatedScroll = 0; // Accumulate fractional pixels
50
-
51
- const step = (timestamp: number) => {
52
- if (lastTimestamp === null) lastTimestamp = timestamp;
53
- if (!isPaused) {
54
- const delta = timestamp - lastTimestamp;
55
- lastTimestamp = timestamp;
56
-
57
- // Accumulate the scroll amount (including fractional pixels)
58
- accumulatedScroll += PIXELS_PER_SECOND * (delta / 1000);
59
-
60
- // Only apply whole pixel movements
61
- const pixelsToScroll = Math.floor(accumulatedScroll);
62
- if (pixelsToScroll > 0) {
63
- container.scrollLeft += pixelsToScroll;
64
- accumulatedScroll -= pixelsToScroll; // Keep the fractional remainder
65
-
66
- if (container.scrollLeft >= container.scrollWidth - container.clientWidth) {
67
- container.scrollLeft = 0; // Reset scroll to create a looping effect
68
- accumulatedScroll = 0; // Reset accumulated scroll when looping
69
- }
70
- }
71
- }
72
- scrollAnimationRef.current = requestAnimationFrame(step);
73
- };
74
-
75
- // Start animation
76
- scrollAnimationRef.current = requestAnimationFrame(step);
77
-
78
- // Pause/resume logic
79
- const pauseAnimation = () => {
80
- isPaused = true;
81
- if (resumeTimeoutRef.current) {
82
- clearTimeout(resumeTimeoutRef.current);
83
- resumeTimeoutRef.current = null;
84
- }
85
- };
86
- const scheduleResumeAnimation = () => {
87
- resumeTimeoutRef.current = setTimeout(() => {
88
- isPaused = false;
89
- lastTimestamp = null; // Reset timestamp so delta is correct after pause
90
- }, RESUME_DELAY_MS);
91
- };
92
-
93
- if (pauseOnHover) {
94
- container.addEventListener('mouseenter', pauseAnimation);
95
- container.addEventListener('mouseleave', scheduleResumeAnimation);
96
- container.addEventListener('touchstart', pauseAnimation);
97
- container.addEventListener('touchend', scheduleResumeAnimation);
98
- }
99
-
100
- return () => {
101
- if (scrollAnimationRef.current) {
102
- cancelAnimationFrame(scrollAnimationRef.current);
103
- }
104
- if (pauseOnHover) {
105
- container.removeEventListener('mouseenter', pauseAnimation);
106
- container.removeEventListener('mouseleave', scheduleResumeAnimation);
107
- container.removeEventListener('touchstart', pauseAnimation);
108
- container.removeEventListener('touchend', scheduleResumeAnimation);
109
- }
110
- if (resumeTimeoutRef.current) {
111
- clearTimeout(resumeTimeoutRef.current);
112
- }
113
- };
114
- }, [isAnimated, reducedMotion, PIXELS_PER_SECOND, pauseOnHover, scrollContainerRef]);
115
- }