@envive-ai/react-hooks 0.3.7 → 0.3.9

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 (460) hide show
  1. package/dist/_virtual/rolldown_runtime.cjs +0 -2
  2. package/dist/application/commerce-api.cjs +1 -1
  3. package/dist/application/commerce-api.js +1 -1
  4. package/dist/application/models/chatElementDisplayLocationV3.cjs +5 -1
  5. package/dist/application/models/chatElementDisplayLocationV3.d.cts +5 -1
  6. package/dist/application/models/chatElementDisplayLocationV3.d.ts +5 -1
  7. package/dist/application/models/chatElementDisplayLocationV3.js +5 -1
  8. package/dist/application/models/frontendConfigV3.d.cts +2 -2
  9. package/dist/application/models/frontendConfigV3.d.ts +2 -2
  10. package/dist/application/models/variantInfo/variantInfo.cjs +2 -2
  11. package/dist/application/models/variantInfo/variantInfo.d.cts +2 -2
  12. package/dist/application/models/variantInfo/variantInfo.d.ts +2 -2
  13. package/dist/application/models/variantInfo/variantInfo.js +2 -2
  14. package/dist/application/utils/widgetTextRequestToApiRequest.cjs +6 -2
  15. package/dist/application/utils/widgetTextRequestToApiRequest.js +6 -2
  16. package/dist/atoms/app/index.cjs +4 -4
  17. package/dist/atoms/app/index.d.cts +7 -7
  18. package/dist/atoms/app/index.d.ts +2 -2
  19. package/dist/atoms/app/index.js +4 -4
  20. package/dist/atoms/app/variant.d.cts +6 -6
  21. package/dist/atoms/app/variant.d.ts +6 -6
  22. package/dist/atoms/chat/chatState.d.cts +18 -18
  23. package/dist/atoms/chat/chatState.d.ts +17 -17
  24. package/dist/atoms/chat/form.d.cts +2 -2
  25. package/dist/atoms/chat/form.d.ts +2 -2
  26. package/dist/atoms/chat/index.cjs +7 -1
  27. package/dist/atoms/chat/index.d.cts +5 -4
  28. package/dist/atoms/chat/index.d.ts +5 -4
  29. package/dist/atoms/chat/index.js +3 -2
  30. package/dist/atoms/chat/lastMessage.d.cts +2 -2
  31. package/dist/atoms/chat/lastMessage.d.ts +2 -2
  32. package/dist/atoms/chat/messageQueue.cjs +1 -0
  33. package/dist/atoms/chat/messageQueue.d.cts +31 -0
  34. package/dist/atoms/chat/messageQueue.d.ts +31 -0
  35. package/dist/atoms/chat/messageQueue.js +1 -1
  36. package/dist/atoms/chat/performanceMetrics.d.cts +6 -6
  37. package/dist/atoms/chat/performanceMetrics.d.ts +6 -6
  38. package/dist/atoms/chat/renderedWidgetRefs.d.cts +2 -2
  39. package/dist/atoms/chat/renderedWidgetRefs.d.ts +2 -2
  40. package/dist/atoms/chat/replies.cjs +46 -0
  41. package/dist/atoms/chat/replies.d.cts +14 -0
  42. package/dist/atoms/chat/replies.d.ts +14 -0
  43. package/dist/atoms/chat/replies.js +45 -0
  44. package/dist/atoms/chat/suggestions.d.cts +2 -2
  45. package/dist/atoms/chat/suggestions.d.ts +2 -2
  46. package/dist/atoms/globalSearch/globalSearch.d.cts +5 -5
  47. package/dist/atoms/globalSearch/globalSearch.d.ts +5 -5
  48. package/dist/atoms/org/customerService.d.cts +6 -6
  49. package/dist/atoms/org/customerService.d.ts +6 -6
  50. package/dist/atoms/org/graphqlConfig.d.cts +4 -4
  51. package/dist/atoms/org/graphqlConfig.d.ts +4 -4
  52. package/dist/atoms/org/index.cjs +2 -2
  53. package/dist/atoms/org/index.js +2 -2
  54. package/dist/atoms/org/newOrgConfigAtom.d.cts +2 -2
  55. package/dist/atoms/org/newOrgConfigAtom.d.ts +2 -2
  56. package/dist/atoms/org/orgAnalyticsConfig.d.cts +5 -5
  57. package/dist/atoms/org/orgAnalyticsConfig.d.ts +5 -5
  58. package/dist/atoms/search/chatSearch.cjs +1 -1
  59. package/dist/atoms/search/chatSearch.d.cts +17 -17
  60. package/dist/atoms/search/chatSearch.d.ts +17 -17
  61. package/dist/atoms/search/chatSearch.js +1 -1
  62. package/dist/atoms/search/searchAPI.cjs +1 -1
  63. package/dist/atoms/search/searchAPI.d.cts +13 -13
  64. package/dist/atoms/search/searchAPI.d.ts +13 -13
  65. package/dist/atoms/search/searchAPI.js +1 -1
  66. package/dist/atoms/search/types.d.cts +1 -1
  67. package/dist/atoms/widget/chatPreviewLoading.d.cts +2 -2
  68. package/dist/atoms/widget/chatPreviewLoading.d.ts +2 -2
  69. package/dist/contexts/amplitudeContext/amplitudeContext.cjs +6 -4
  70. package/dist/contexts/amplitudeContext/amplitudeContext.js +6 -4
  71. package/dist/contexts/enviveContext/WindowChatToggleBinder.cjs +66 -0
  72. package/dist/contexts/enviveContext/WindowChatToggleBinder.js +65 -0
  73. package/dist/contexts/enviveContext/enviveContext.cjs +40 -17
  74. package/dist/contexts/enviveContext/enviveContext.d.cts +4 -1
  75. package/dist/contexts/enviveContext/enviveContext.d.ts +4 -1
  76. package/dist/contexts/enviveContext/enviveContext.js +41 -18
  77. package/dist/contexts/enviveContext/types.d.cts +1 -1
  78. package/dist/contexts/enviveContext/types.d.ts +1 -1
  79. package/dist/contexts/featureFlagServiceContext/featureFlagServiceContext.cjs +56 -2
  80. package/dist/contexts/featureFlagServiceContext/featureFlagServiceContext.d.cts +6 -1
  81. package/dist/contexts/featureFlagServiceContext/featureFlagServiceContext.d.ts +6 -1
  82. package/dist/contexts/featureFlagServiceContext/featureFlagServiceContext.js +56 -2
  83. package/dist/contexts/graphqlContext/graphqlContext.cjs +15 -10
  84. package/dist/contexts/graphqlContext/graphqlContext.js +11 -6
  85. package/dist/contexts/graphqlContext/mockV3Config.cjs +65 -58
  86. package/dist/contexts/graphqlContext/mockV3Config.js +27 -21
  87. package/dist/contexts/hardcopyContext/hardcopyContext.cjs +29 -1
  88. package/dist/contexts/hardcopyContext/hardcopyContext.js +29 -1
  89. package/dist/contexts/newOrgConfigContext/newOrgConfigContext.cjs +1 -1
  90. package/dist/contexts/newOrgConfigContext/newOrgConfigContext.js +1 -1
  91. package/dist/contexts/pageContext/mapping.cjs +9 -1
  92. package/dist/contexts/pageContext/mapping.js +9 -1
  93. package/dist/contexts/pageContext/pageContext.cjs +8 -3
  94. package/dist/contexts/pageContext/pageContext.d.cts +2 -1
  95. package/dist/contexts/pageContext/pageContext.d.ts +2 -1
  96. package/dist/contexts/pageContext/pageContext.js +8 -3
  97. package/dist/contexts/pageContext/types.d.cts +11 -3
  98. package/dist/contexts/pageContext/types.d.ts +11 -3
  99. package/dist/contexts/salesAgentContext/chatAPI.cjs +44 -8
  100. package/dist/contexts/salesAgentContext/chatAPI.d.cts +7 -6
  101. package/dist/contexts/salesAgentContext/chatAPI.d.ts +7 -6
  102. package/dist/contexts/salesAgentContext/chatAPI.js +44 -8
  103. package/dist/contexts/salesAgentContext/formSubmittedUtils.cjs +37 -0
  104. package/dist/contexts/salesAgentContext/formSubmittedUtils.js +36 -0
  105. package/dist/contexts/salesAgentContext/index.d.cts +2 -2
  106. package/dist/contexts/salesAgentContext/index.d.ts +2 -2
  107. package/dist/contexts/salesAgentContext/salesAgentContext.cjs +39 -6
  108. package/dist/contexts/salesAgentContext/salesAgentContext.d.cts +11 -4
  109. package/dist/contexts/salesAgentContext/salesAgentContext.d.ts +11 -4
  110. package/dist/contexts/salesAgentContext/salesAgentContext.js +40 -7
  111. package/dist/contexts/salesAgentContext/salesAgentService.cjs +13 -7
  112. package/dist/contexts/salesAgentContext/salesAgentService.js +13 -7
  113. package/dist/contexts/searchContext/searchContext.cjs +1 -1
  114. package/dist/contexts/searchContext/searchContext.js +1 -1
  115. package/dist/contexts/types.d.cts +1 -1
  116. package/dist/contexts/typesV3.cjs +2 -7
  117. package/dist/contexts/typesV3.d.cts +19 -11
  118. package/dist/contexts/typesV3.d.ts +21 -13
  119. package/dist/contexts/typesV3.js +3 -7
  120. package/dist/contexts/userIdentityContext/userIdentityContext.cjs +22 -29
  121. package/dist/contexts/userIdentityContext/userIdentityContext.d.cts +9 -8
  122. package/dist/contexts/userIdentityContext/userIdentityContext.d.ts +9 -8
  123. package/dist/contexts/userIdentityContext/userIdentityContext.js +22 -29
  124. package/dist/contexts/widgetConfigContext/widgetConfigContext.cjs +2 -1
  125. package/dist/contexts/widgetConfigContext/widgetConfigContext.js +2 -1
  126. package/dist/hooks/ElementObserver/useElementObserver.cjs +3 -2
  127. package/dist/hooks/ElementObserver/useElementObserver.js +3 -2
  128. package/dist/hooks/GrabAndScroll/useGrabAndScroll.d.ts +2 -2
  129. package/dist/hooks/Search/useSearch.cjs +2 -2
  130. package/dist/hooks/Search/useSearch.js +2 -2
  131. package/dist/hooks/Search/useSearchInput.cjs +2 -2
  132. package/dist/hooks/Search/useSearchInput.js +2 -2
  133. package/dist/hooks/utils.d.cts +1 -1
  134. package/dist/mocks/index.cjs +5 -0
  135. package/dist/mocks/index.d.cts +2 -0
  136. package/dist/mocks/index.d.ts +2 -0
  137. package/dist/mocks/index.js +3 -0
  138. package/dist/mocks/salesAgentMockData.cjs +207 -0
  139. package/dist/mocks/salesAgentMockData.d.cts +11 -0
  140. package/dist/mocks/salesAgentMockData.d.ts +11 -0
  141. package/dist/mocks/salesAgentMockData.js +204 -0
  142. package/dist/services/amplitudeService/amplitudeService.cjs +77 -12
  143. package/dist/services/amplitudeService/amplitudeService.d.cts +12 -3
  144. package/dist/services/amplitudeService/amplitudeService.d.ts +12 -3
  145. package/dist/services/amplitudeService/amplitudeService.js +77 -12
  146. package/dist/services/userIdentityService/index.cjs +3 -0
  147. package/dist/services/userIdentityService/index.d.cts +2 -0
  148. package/dist/services/userIdentityService/index.d.ts +2 -0
  149. package/dist/services/userIdentityService/index.js +3 -0
  150. package/dist/services/userIdentityService/userIdentityService.cjs +49 -0
  151. package/dist/services/userIdentityService/userIdentityService.d.cts +19 -0
  152. package/dist/services/userIdentityService/userIdentityService.d.ts +19 -0
  153. package/dist/services/userIdentityService/userIdentityService.js +48 -0
  154. package/package.json +18 -5
  155. package/src/application/models/chatElementDisplayLocationV3.ts +4 -0
  156. package/src/application/models/frontendConfigV3.ts +1 -1
  157. package/src/application/models/variantInfo/variantInfo.ts +1 -1
  158. package/src/application/utils/widgetTextRequestToApiRequest.ts +7 -5
  159. package/src/atoms/app/index.ts +9 -7
  160. package/src/atoms/chat/index.ts +1 -0
  161. package/src/atoms/chat/replies.ts +56 -0
  162. package/src/contexts/amplitudeContext/__tests__/amplitudeContext.test.tsx +47 -66
  163. package/src/contexts/amplitudeContext/amplitudeContext.tsx +4 -1
  164. package/src/contexts/enviveContext/WindowChatToggleBinder.tsx +66 -0
  165. package/src/contexts/enviveContext/enviveContext.tsx +50 -7
  166. package/src/contexts/featureFlagServiceContext/featureFlagServiceContext.tsx +101 -2
  167. package/src/contexts/graphqlContext/graphqlContext.tsx +11 -2
  168. package/src/contexts/graphqlContext/mockV3Config.ts +19 -4
  169. package/src/contexts/hardcopyContext/hardcopyContext.tsx +29 -0
  170. package/src/contexts/pageContext/mapping.ts +16 -1
  171. package/src/contexts/pageContext/pageContext.tsx +12 -3
  172. package/src/contexts/pageContext/types.ts +16 -1
  173. package/src/contexts/salesAgentContext/chatAPI.ts +52 -11
  174. package/src/contexts/salesAgentContext/formSubmittedUtils.ts +57 -0
  175. package/src/contexts/salesAgentContext/salesAgentContext.tsx +71 -5
  176. package/src/contexts/salesAgentContext/salesAgentService.ts +15 -9
  177. package/src/contexts/searchContext/__tests__/searchContext.test.tsx +3 -1
  178. package/src/contexts/typesV3.ts +22 -12
  179. package/src/contexts/userIdentityContext/__tests__/userIdentityContext.test.tsx +18 -131
  180. package/src/contexts/userIdentityContext/userIdentityContext.tsx +47 -41
  181. package/src/contexts/widgetConfigContext/widgetConfigContext.tsx +4 -0
  182. package/src/hooks/ElementObserver/useElementObserver.ts +2 -1
  183. package/src/hooks/Search/__tests__/useSearch.test.tsx +11 -1
  184. package/src/mocks/index.ts +1 -0
  185. package/src/mocks/salesAgentMockData.ts +247 -0
  186. package/src/services/amplitudeService/__tests__/amplitudeService.test.ts +17 -0
  187. package/src/services/amplitudeService/amplitudeService.ts +106 -11
  188. package/src/services/userIdentityService/index.ts +1 -0
  189. package/src/services/userIdentityService/userIdentityService.ts +64 -0
  190. package/dist/_virtual/rolldown_runtime.js +0 -29
  191. package/dist/contexts/featureFlagContext/featureFlagContext.cjs +0 -105
  192. package/dist/contexts/featureFlagContext/featureFlagContext.d.cts +0 -19
  193. package/dist/contexts/featureFlagContext/featureFlagContext.d.ts +0 -19
  194. package/dist/contexts/featureFlagContext/featureFlagContext.js +0 -102
  195. package/dist/contexts/featureFlagContext/index.cjs +0 -4
  196. package/dist/contexts/featureFlagContext/index.d.cts +0 -2
  197. package/dist/contexts/featureFlagContext/index.d.ts +0 -2
  198. package/dist/contexts/featureFlagContext/index.js +0 -3
  199. package/dist/node_modules/classnames/index.cjs +0 -52
  200. package/dist/node_modules/classnames/index.js +0 -49
  201. package/dist/packages/components-v3/dist/ChatHeader/ChatHeader.cjs +0 -2
  202. package/dist/packages/components-v3/dist/ChatHeader/ChatHeader.js +0 -4
  203. package/dist/packages/components-v3/dist/ChatHeader/components/CloseButton.cjs +0 -16
  204. package/dist/packages/components-v3/dist/ChatHeader/components/CloseButton.js +0 -17
  205. package/dist/packages/components-v3/dist/ChatHeader/components/Handle.cjs +0 -6
  206. package/dist/packages/components-v3/dist/ChatHeader/components/Handle.js +0 -8
  207. package/dist/packages/components-v3/dist/ChatHeader/components/Layout.cjs +0 -4
  208. package/dist/packages/components-v3/dist/ChatHeader/components/Layout.js +0 -6
  209. package/dist/packages/components-v3/dist/ChatHeader/components/Logo.cjs +0 -3
  210. package/dist/packages/components-v3/dist/ChatHeader/components/Logo.js +0 -5
  211. package/dist/packages/components-v3/dist/ChatHeader/components/Toggle.cjs +0 -7
  212. package/dist/packages/components-v3/dist/ChatHeader/components/Toggle.js +0 -9
  213. package/dist/packages/components-v3/dist/ChatHeader/components/ToggleItem.cjs +0 -6
  214. package/dist/packages/components-v3/dist/ChatHeader/components/ToggleItem.js +0 -8
  215. package/dist/packages/components-v3/dist/ChatHeader/components/index.cjs +0 -6
  216. package/dist/packages/components-v3/dist/ChatHeader/components/index.js +0 -8
  217. package/dist/packages/components-v3/dist/ChatHeader/hooks/useGetCloseButtonProperties.cjs +0 -22
  218. package/dist/packages/components-v3/dist/ChatHeader/hooks/useGetCloseButtonProperties.js +0 -23
  219. package/dist/packages/components-v3/dist/ChatHeader/hooks/useGetHandleProperties.cjs +0 -58
  220. package/dist/packages/components-v3/dist/ChatHeader/hooks/useGetHandleProperties.js +0 -59
  221. package/dist/packages/components-v3/dist/ChatHeader/hooks/useGetLayoutProperties.cjs +0 -8
  222. package/dist/packages/components-v3/dist/ChatHeader/hooks/useGetLayoutProperties.js +0 -9
  223. package/dist/packages/components-v3/dist/ChatHeader/hooks/useGetToggleOptionProperties.cjs +0 -1
  224. package/dist/packages/components-v3/dist/ChatHeader/hooks/useGetToggleOptionProperties.js +0 -3
  225. package/dist/packages/components-v3/dist/ChatHeader/hooks/useGetToggleProperties.cjs +0 -12
  226. package/dist/packages/components-v3/dist/ChatHeader/hooks/useGetToggleProperties.js +0 -13
  227. package/dist/packages/components-v3/dist/ChatHeader/index.cjs +0 -2
  228. package/dist/packages/components-v3/dist/ChatHeader/index.js +0 -4
  229. package/dist/packages/components-v3/dist/ChatHeader/types/index.cjs +0 -11
  230. package/dist/packages/components-v3/dist/ChatHeader/types/index.js +0 -10
  231. package/dist/packages/components-v3/dist/Container/Container.cjs +0 -11
  232. package/dist/packages/components-v3/dist/Container/Container.js +0 -12
  233. package/dist/packages/components-v3/dist/Container/hooks/useGetCenterContentProperties.cjs +0 -1
  234. package/dist/packages/components-v3/dist/Container/hooks/useGetCenterContentProperties.js +0 -3
  235. package/dist/packages/components-v3/dist/Container/hooks/useGetFluidProperties.cjs +0 -1
  236. package/dist/packages/components-v3/dist/Container/hooks/useGetFluidProperties.js +0 -3
  237. package/dist/packages/components-v3/dist/Container/index.cjs +0 -1
  238. package/dist/packages/components-v3/dist/Container/index.js +0 -3
  239. package/dist/packages/components-v3/dist/FloatingButton/FloatingButton.cjs +0 -2
  240. package/dist/packages/components-v3/dist/FloatingButton/FloatingButton.js +0 -4
  241. package/dist/packages/components-v3/dist/FloatingButton/components/Button.cjs +0 -9
  242. package/dist/packages/components-v3/dist/FloatingButton/components/Button.js +0 -10
  243. package/dist/packages/components-v3/dist/FloatingButton/components/Container.cjs +0 -9
  244. package/dist/packages/components-v3/dist/FloatingButton/components/Container.js +0 -10
  245. package/dist/packages/components-v3/dist/FloatingButton/components/Icon.cjs +0 -3
  246. package/dist/packages/components-v3/dist/FloatingButton/components/Icon.js +0 -5
  247. package/dist/packages/components-v3/dist/FloatingButton/components/Wrapper.cjs +0 -9
  248. package/dist/packages/components-v3/dist/FloatingButton/components/Wrapper.js +0 -10
  249. package/dist/packages/components-v3/dist/FloatingButton/components/index.cjs +0 -4
  250. package/dist/packages/components-v3/dist/FloatingButton/components/index.js +0 -6
  251. package/dist/packages/components-v3/dist/FloatingButton/index.cjs +0 -2
  252. package/dist/packages/components-v3/dist/FloatingButton/index.js +0 -4
  253. package/dist/packages/components-v3/dist/FloatingButton/types/types.cjs +0 -17
  254. package/dist/packages/components-v3/dist/FloatingButton/types/types.js +0 -16
  255. package/dist/packages/components-v3/dist/Image/Image.cjs +0 -16
  256. package/dist/packages/components-v3/dist/Image/Image.js +0 -17
  257. package/dist/packages/components-v3/dist/Image/hooks/useGetAccessibilityProperties.cjs +0 -1
  258. package/dist/packages/components-v3/dist/Image/hooks/useGetAccessibilityProperties.js +0 -3
  259. package/dist/packages/components-v3/dist/Image/hooks/useGetAspectRatioProperties.cjs +0 -1
  260. package/dist/packages/components-v3/dist/Image/hooks/useGetAspectRatioProperties.js +0 -3
  261. package/dist/packages/components-v3/dist/Image/hooks/useGetObjectFitProperties.cjs +0 -1
  262. package/dist/packages/components-v3/dist/Image/hooks/useGetObjectFitProperties.js +0 -3
  263. package/dist/packages/components-v3/dist/Image/hooks/useGetRoundedProperties.cjs +0 -1
  264. package/dist/packages/components-v3/dist/Image/hooks/useGetRoundedProperties.js +0 -3
  265. package/dist/packages/components-v3/dist/Image/hooks/useGetSkeletonProperties.cjs +0 -1
  266. package/dist/packages/components-v3/dist/Image/hooks/useGetSkeletonProperties.js +0 -3
  267. package/dist/packages/components-v3/dist/Image/hooks/useGetWidthProperties.cjs +0 -1
  268. package/dist/packages/components-v3/dist/Image/hooks/useGetWidthProperties.js +0 -3
  269. package/dist/packages/components-v3/dist/Image/hooks/useHandleImageLoading.cjs +0 -1
  270. package/dist/packages/components-v3/dist/Image/hooks/useHandleImageLoading.js +0 -3
  271. package/dist/packages/components-v3/dist/ImageGallery/ImageGallery.cjs +0 -2
  272. package/dist/packages/components-v3/dist/ImageGallery/ImageGallery.js +0 -4
  273. package/dist/packages/components-v3/dist/ImageGallery/components/ImageItem.cjs +0 -2
  274. package/dist/packages/components-v3/dist/ImageGallery/components/ImageItem.js +0 -4
  275. package/dist/packages/components-v3/dist/ImageGallery/components/Layout.cjs +0 -15
  276. package/dist/packages/components-v3/dist/ImageGallery/components/Layout.js +0 -16
  277. package/dist/packages/components-v3/dist/ImageGallery/components/NormalLayout.cjs +0 -4
  278. package/dist/packages/components-v3/dist/ImageGallery/components/NormalLayout.js +0 -4
  279. package/dist/packages/components-v3/dist/ImageGallery/components/OverlappedLayout.cjs +0 -1
  280. package/dist/packages/components-v3/dist/ImageGallery/components/OverlappedLayout.js +0 -3
  281. package/dist/packages/components-v3/dist/ImageGallery/components/index.cjs +0 -4
  282. package/dist/packages/components-v3/dist/ImageGallery/components/index.js +0 -6
  283. package/dist/packages/components-v3/dist/ImageGallery/hooks/useGetContainerProperties.cjs +0 -1
  284. package/dist/packages/components-v3/dist/ImageGallery/hooks/useGetContainerProperties.js +0 -3
  285. package/dist/packages/components-v3/dist/ImageGallery/index.cjs +0 -2
  286. package/dist/packages/components-v3/dist/ImageGallery/index.js +0 -4
  287. package/dist/packages/components-v3/dist/ImageGallery/types/types.cjs +0 -13
  288. package/dist/packages/components-v3/dist/ImageGallery/types/types.js +0 -12
  289. package/dist/packages/components-v3/dist/PromptButton/PromptButton.cjs +0 -12
  290. package/dist/packages/components-v3/dist/PromptButton/PromptButton.js +0 -13
  291. package/dist/packages/components-v3/dist/PromptButton/components/Icon.cjs +0 -1
  292. package/dist/packages/components-v3/dist/PromptButton/components/Icon.js +0 -3
  293. package/dist/packages/components-v3/dist/PromptButton/components/Label.cjs +0 -3
  294. package/dist/packages/components-v3/dist/PromptButton/components/Label.js +0 -5
  295. package/dist/packages/components-v3/dist/PromptButton/components/Layout.cjs +0 -12
  296. package/dist/packages/components-v3/dist/PromptButton/components/Layout.js +0 -13
  297. package/dist/packages/components-v3/dist/PromptButton/components/Loading.cjs +0 -9
  298. package/dist/packages/components-v3/dist/PromptButton/components/Loading.js +0 -10
  299. package/dist/packages/components-v3/dist/PromptButton/components/index.cjs +0 -4
  300. package/dist/packages/components-v3/dist/PromptButton/components/index.js +0 -6
  301. package/dist/packages/components-v3/dist/PromptButton/hooks/useGetBoldTextProperties.cjs +0 -1
  302. package/dist/packages/components-v3/dist/PromptButton/hooks/useGetBoldTextProperties.js +0 -3
  303. package/dist/packages/components-v3/dist/PromptButton/hooks/useGetLayoutBaseProperties.cjs +0 -8
  304. package/dist/packages/components-v3/dist/PromptButton/hooks/useGetLayoutBaseProperties.js +0 -9
  305. package/dist/packages/components-v3/dist/PromptButton/index.cjs +0 -2
  306. package/dist/packages/components-v3/dist/PromptButton/index.js +0 -4
  307. package/dist/packages/components-v3/dist/PromptButton/types/index.cjs +0 -13
  308. package/dist/packages/components-v3/dist/PromptButton/types/index.js +0 -12
  309. package/dist/packages/components-v3/dist/PromptCarousel/PromptCarousel.cjs +0 -12
  310. package/dist/packages/components-v3/dist/PromptCarousel/PromptCarousel.js +0 -14
  311. package/dist/packages/components-v3/dist/PromptCarousel/components/BlockScrollContainer.cjs +0 -9
  312. package/dist/packages/components-v3/dist/PromptCarousel/components/BlockScrollContainer.js +0 -10
  313. package/dist/packages/components-v3/dist/PromptCarousel/components/ButtonContainerRow.cjs +0 -11
  314. package/dist/packages/components-v3/dist/PromptCarousel/components/ButtonContainerRow.js +0 -12
  315. package/dist/packages/components-v3/dist/PromptCarousel/components/CarouselContentWithBlockScroll.cjs +0 -4
  316. package/dist/packages/components-v3/dist/PromptCarousel/components/CarouselContentWithBlockScroll.js +0 -6
  317. package/dist/packages/components-v3/dist/PromptCarousel/components/CarouselContentWithRowScroll.cjs +0 -4
  318. package/dist/packages/components-v3/dist/PromptCarousel/components/CarouselContentWithRowScroll.js +0 -6
  319. package/dist/packages/components-v3/dist/PromptCarousel/components/index.cjs +0 -3
  320. package/dist/packages/components-v3/dist/PromptCarousel/components/index.js +0 -5
  321. package/dist/packages/components-v3/dist/PromptCarousel/hooks/index.cjs +0 -5
  322. package/dist/packages/components-v3/dist/PromptCarousel/hooks/index.js +0 -7
  323. package/dist/packages/components-v3/dist/PromptCarousel/hooks/useButtonScrollPosition.cjs +0 -1
  324. package/dist/packages/components-v3/dist/PromptCarousel/hooks/useButtonScrollPosition.js +0 -3
  325. package/dist/packages/components-v3/dist/PromptCarousel/hooks/useCarouselAnimation.cjs +0 -3
  326. package/dist/packages/components-v3/dist/PromptCarousel/hooks/useCarouselAnimation.js +0 -5
  327. package/dist/packages/components-v3/dist/PromptCarousel/hooks/useCarouselButtons.cjs +0 -1
  328. package/dist/packages/components-v3/dist/PromptCarousel/hooks/useCarouselButtons.js +0 -3
  329. package/dist/packages/components-v3/dist/PromptCarousel/hooks/useCarouselRefs.cjs +0 -1
  330. package/dist/packages/components-v3/dist/PromptCarousel/hooks/useCarouselRefs.js +0 -3
  331. package/dist/packages/components-v3/dist/PromptCarousel/hooks/useHorizontalScrollAnimation.cjs +0 -1
  332. package/dist/packages/components-v3/dist/PromptCarousel/hooks/useHorizontalScrollAnimation.js +0 -3
  333. package/dist/packages/components-v3/dist/PromptCarousel/index.cjs +0 -2
  334. package/dist/packages/components-v3/dist/PromptCarousel/index.js +0 -4
  335. package/dist/packages/components-v3/dist/PromptCarousel/types/types.cjs +0 -19
  336. package/dist/packages/components-v3/dist/PromptCarousel/types/types.js +0 -17
  337. package/dist/packages/components-v3/dist/Stack/Stack.cjs +0 -36
  338. package/dist/packages/components-v3/dist/Stack/Stack.js +0 -36
  339. package/dist/packages/components-v3/dist/Stack/hooks/useFormatStackChildren.cjs +0 -27
  340. package/dist/packages/components-v3/dist/Stack/hooks/useFormatStackChildren.js +0 -26
  341. package/dist/packages/components-v3/dist/Stack/hooks/useGetAlignProperties.cjs +0 -20
  342. package/dist/packages/components-v3/dist/Stack/hooks/useGetAlignProperties.js +0 -19
  343. package/dist/packages/components-v3/dist/Stack/hooks/useGetDirectionProperties.cjs +0 -19
  344. package/dist/packages/components-v3/dist/Stack/hooks/useGetDirectionProperties.js +0 -18
  345. package/dist/packages/components-v3/dist/Stack/hooks/useGetGapProperties.cjs +0 -16
  346. package/dist/packages/components-v3/dist/Stack/hooks/useGetGapProperties.js +0 -15
  347. package/dist/packages/components-v3/dist/Stack/hooks/useGetJustifyProperties.cjs +0 -21
  348. package/dist/packages/components-v3/dist/Stack/hooks/useGetJustifyProperties.js +0 -20
  349. package/dist/packages/components-v3/dist/Stack/hooks/useGetStyleProperties.cjs +0 -38
  350. package/dist/packages/components-v3/dist/Stack/hooks/useGetStyleProperties.js +0 -38
  351. package/dist/packages/components-v3/dist/Stack/hooks/useGetWrapProperties.cjs +0 -13
  352. package/dist/packages/components-v3/dist/Stack/hooks/useGetWrapProperties.js +0 -12
  353. package/dist/packages/components-v3/dist/Stack/index.cjs +0 -1
  354. package/dist/packages/components-v3/dist/Stack/index.js +0 -3
  355. package/dist/packages/components-v3/dist/Stack/utils/constants.cjs +0 -42
  356. package/dist/packages/components-v3/dist/Stack/utils/constants.js +0 -41
  357. package/dist/packages/components-v3/dist/Tokens/index.cjs +0 -11
  358. package/dist/packages/components-v3/dist/Tokens/index.js +0 -13
  359. package/dist/packages/components-v3/dist/Typography/Typography.cjs +0 -15
  360. package/dist/packages/components-v3/dist/Typography/Typography.js +0 -16
  361. package/dist/packages/components-v3/dist/Typography/hooks/useGetAccessibilityAttributes.cjs +0 -1
  362. package/dist/packages/components-v3/dist/Typography/hooks/useGetAccessibilityAttributes.js +0 -3
  363. package/dist/packages/components-v3/dist/Typography/hooks/useGetAlignProperties.cjs +0 -1
  364. package/dist/packages/components-v3/dist/Typography/hooks/useGetAlignProperties.js +0 -3
  365. package/dist/packages/components-v3/dist/Typography/hooks/useGetColorProperties.cjs +0 -1
  366. package/dist/packages/components-v3/dist/Typography/hooks/useGetColorProperties.js +0 -3
  367. package/dist/packages/components-v3/dist/Typography/hooks/useGetNoWrapProperties.cjs +0 -1
  368. package/dist/packages/components-v3/dist/Typography/hooks/useGetNoWrapProperties.js +0 -3
  369. package/dist/packages/components-v3/dist/Typography/hooks/useGetNumberOfLinesProperties.cjs +0 -1
  370. package/dist/packages/components-v3/dist/Typography/hooks/useGetNumberOfLinesProperties.js +0 -3
  371. package/dist/packages/components-v3/dist/Typography/hooks/useGetVariantProperties.cjs +0 -1
  372. package/dist/packages/components-v3/dist/Typography/hooks/useGetVariantProperties.js +0 -3
  373. package/dist/packages/components-v3/dist/Typography/index.cjs +0 -1
  374. package/dist/packages/components-v3/dist/Typography/index.js +0 -3
  375. package/dist/packages/components-v3/dist/WelcomeMessage/WelcomeMessage.cjs +0 -2
  376. package/dist/packages/components-v3/dist/WelcomeMessage/WelcomeMessage.js +0 -4
  377. package/dist/packages/components-v3/dist/WelcomeMessage/components/Container.cjs +0 -14
  378. package/dist/packages/components-v3/dist/WelcomeMessage/components/Container.js +0 -15
  379. package/dist/packages/components-v3/dist/WelcomeMessage/components/SparkleIcon.cjs +0 -3
  380. package/dist/packages/components-v3/dist/WelcomeMessage/components/SparkleIcon.js +0 -5
  381. package/dist/packages/components-v3/dist/WelcomeMessage/components/Text.cjs +0 -3
  382. package/dist/packages/components-v3/dist/WelcomeMessage/components/Text.js +0 -5
  383. package/dist/packages/components-v3/dist/WelcomeMessage/components/Title.cjs +0 -3
  384. package/dist/packages/components-v3/dist/WelcomeMessage/components/Title.js +0 -5
  385. package/dist/packages/components-v3/dist/WelcomeMessage/components/index.cjs +0 -4
  386. package/dist/packages/components-v3/dist/WelcomeMessage/components/index.js +0 -6
  387. package/dist/packages/components-v3/dist/WelcomeMessage/hooks/useGetContainerProperties.cjs +0 -1
  388. package/dist/packages/components-v3/dist/WelcomeMessage/hooks/useGetContainerProperties.js +0 -3
  389. package/dist/packages/components-v3/dist/WelcomeMessage/hooks/useGetSparkleIconProperties.cjs +0 -1
  390. package/dist/packages/components-v3/dist/WelcomeMessage/hooks/useGetSparkleIconProperties.js +0 -3
  391. package/dist/packages/components-v3/dist/WelcomeMessage/index.cjs +0 -2
  392. package/dist/packages/components-v3/dist/WelcomeMessage/index.js +0 -4
  393. package/dist/packages/components-v3/dist/WelcomeMessage/types/types.cjs +0 -14
  394. package/dist/packages/components-v3/dist/WelcomeMessage/types/types.js +0 -14
  395. package/dist/packages/components-v3/dist/WidgetWrapper/WidgetWrapper.cjs +0 -12
  396. package/dist/packages/components-v3/dist/WidgetWrapper/WidgetWrapper.js +0 -13
  397. package/dist/packages/components-v3/dist/WidgetWrapper/hooks/useGetWrapperProperties.cjs +0 -1
  398. package/dist/packages/components-v3/dist/WidgetWrapper/hooks/useGetWrapperProperties.js +0 -3
  399. package/dist/packages/components-v3/dist/WidgetWrapper/index.cjs +0 -2
  400. package/dist/packages/components-v3/dist/WidgetWrapper/index.js +0 -4
  401. package/dist/packages/components-v3/dist/WidgetWrapper/types/types.cjs +0 -13
  402. package/dist/packages/components-v3/dist/WidgetWrapper/types/types.js +0 -12
  403. package/dist/packages/components-v3/dist/src/models/colorsConfig.cjs +0 -26
  404. package/dist/packages/components-v3/dist/src/models/colorsConfig.js +0 -25
  405. package/dist/packages/components-v3/dist/tokens/aspectRatio/aspectRatio.cjs +0 -16
  406. package/dist/packages/components-v3/dist/tokens/aspectRatio/aspectRatio.js +0 -17
  407. package/dist/packages/components-v3/dist/tokens/breakpoints/breakpoints.cjs +0 -25
  408. package/dist/packages/components-v3/dist/tokens/breakpoints/breakpoints.js +0 -23
  409. package/dist/packages/components-v3/dist/tokens/colors/colors.cjs +0 -51
  410. package/dist/packages/components-v3/dist/tokens/colors/colors.js +0 -51
  411. package/dist/packages/components-v3/dist/tokens/radius/radius.cjs +0 -64
  412. package/dist/packages/components-v3/dist/tokens/radius/radius.js +0 -65
  413. package/dist/packages/components-v3/dist/tokens/theme/theme.cjs +0 -13
  414. package/dist/packages/components-v3/dist/tokens/theme/theme.js +0 -12
  415. package/dist/packages/components-v3/dist/tokens/typography/fontFamily.cjs +0 -25
  416. package/dist/packages/components-v3/dist/tokens/typography/fontFamily.js +0 -25
  417. package/dist/packages/components-v3/dist/tokens/typography/fontSize.cjs +0 -37
  418. package/dist/packages/components-v3/dist/tokens/typography/fontSize.js +0 -38
  419. package/dist/packages/components-v3/dist/tokens/typography/fontWeight.cjs +0 -17
  420. package/dist/packages/components-v3/dist/tokens/typography/fontWeight.js +0 -18
  421. package/dist/packages/components-v3/dist/tokens/typography/letterSpacing.cjs +0 -15
  422. package/dist/packages/components-v3/dist/tokens/typography/letterSpacing.js +0 -16
  423. package/dist/packages/components-v3/dist/tokens/typography/lineHeight.cjs +0 -31
  424. package/dist/packages/components-v3/dist/tokens/typography/lineHeight.js +0 -32
  425. package/dist/packages/components-v3/dist/tokens/typography/typography.cjs +0 -5
  426. package/dist/packages/components-v3/dist/tokens/typography/typography.js +0 -7
  427. package/dist/packages/components-v3/dist/tokens/utils.cjs +0 -7
  428. package/dist/packages/components-v3/dist/tokens/utils.js +0 -6
  429. package/dist/packages/components-v3/dist/utils/CustomIcon.cjs +0 -2
  430. package/dist/packages/components-v3/dist/utils/CustomIcon.js +0 -4
  431. package/dist/packages/components-v3/dist/utils/useCheckIsMobile.cjs +0 -1
  432. package/dist/packages/components-v3/dist/utils/useCheckIsMobile.js +0 -3
  433. package/dist/packages/components-v3/dist/utils/useResponsiveValue.cjs +0 -57
  434. package/dist/packages/components-v3/dist/utils/useResponsiveValue.js +0 -56
  435. package/dist/packages/icons/dist/FourPointStar.cjs +0 -8
  436. package/dist/packages/icons/dist/FourPointStar.js +0 -9
  437. package/dist/packages/icons/dist/IconCloseRounded.cjs +0 -22
  438. package/dist/packages/icons/dist/IconCloseRounded.js +0 -22
  439. package/dist/packages/icons/dist/IconCloseSharp.cjs +0 -31
  440. package/dist/packages/icons/dist/IconCloseSharp.js +0 -31
  441. package/dist/packages/icons/dist/IconCloseTransparent.cjs +0 -24
  442. package/dist/packages/icons/dist/IconCloseTransparent.js +0 -24
  443. package/dist/packages/icons/dist/Sparkles.cjs +0 -8
  444. package/dist/packages/icons/dist/Sparkles.js +0 -9
  445. package/dist/packages/icons/dist/_virtual/rolldown_runtime.cjs +0 -28
  446. package/dist/packages/icons/dist/_virtual/rolldown_runtime.js +0 -26
  447. package/dist/packages/icons/dist/node_modules/react/cjs/react-jsx-runtime.development.cjs +0 -697
  448. package/dist/packages/icons/dist/node_modules/react/cjs/react-jsx-runtime.development.js +0 -697
  449. package/dist/packages/icons/dist/node_modules/react/cjs/react-jsx-runtime.production.min.cjs +0 -44
  450. package/dist/packages/icons/dist/node_modules/react/cjs/react-jsx-runtime.production.min.js +0 -44
  451. package/dist/packages/icons/dist/node_modules/react/cjs/react.development.cjs +0 -1529
  452. package/dist/packages/icons/dist/node_modules/react/cjs/react.development.js +0 -1529
  453. package/dist/packages/icons/dist/node_modules/react/cjs/react.production.min.cjs +0 -330
  454. package/dist/packages/icons/dist/node_modules/react/cjs/react.production.min.js +0 -330
  455. package/dist/packages/icons/dist/node_modules/react/index.cjs +0 -14
  456. package/dist/packages/icons/dist/node_modules/react/index.js +0 -14
  457. package/dist/packages/icons/dist/node_modules/react/jsx-runtime.cjs +0 -14
  458. package/dist/packages/icons/dist/node_modules/react/jsx-runtime.js +0 -14
  459. package/src/contexts/featureFlagContext/featureFlagContext.tsx +0 -180
  460. package/src/contexts/featureFlagContext/index.ts +0 -1
@@ -0,0 +1,56 @@
1
+ import { atom } from 'jotai';
2
+ import { Message, MessageType } from 'src/application/models';
3
+ import {
4
+ messagesAtom,
5
+ replyEventCategoryAtom,
6
+ userHasRepliedAtom,
7
+ userQueryAtom,
8
+ } from 'src/atoms/chat';
9
+ import { UserEventCategory } from '@spiffy-ai/commerce-api-client';
10
+ import { SpiffyMetricsEventName } from 'src/contexts/amplitudeContext/amplitudeContext';
11
+ import { amplitudeTrackEventAtom } from 'src/atoms/amplitude/amplitudeTrackEventAtom';
12
+ import { queueUserEventAtom } from './messageQueue';
13
+
14
+ type HandleReplyParams = {
15
+ message: Message;
16
+ userTyped: boolean;
17
+ };
18
+
19
+ export const handleReplyAtom = atom(null, (get, set, { message, userTyped }: HandleReplyParams) => {
20
+ if (message.type !== MessageType.QueryTyped) {
21
+ return;
22
+ }
23
+
24
+ const trackEvent = get(amplitudeTrackEventAtom);
25
+ const queryTyped = message.metadata.content;
26
+
27
+ set(replyEventCategoryAtom, UserEventCategory.QueryTyped);
28
+ set(userQueryAtom, queryTyped);
29
+ set(messagesAtom, [...get(messagesAtom), [message]]);
30
+ set(userHasRepliedAtom, true);
31
+ set(queueUserEventAtom, {
32
+ eventId: message.id,
33
+ createdAt: message.createdAt,
34
+ category: UserEventCategory.QueryTyped,
35
+ attributes: {
36
+ query: queryTyped,
37
+ },
38
+ });
39
+
40
+ if (trackEvent) {
41
+ trackEvent({
42
+ eventName: SpiffyMetricsEventName.ChatUserMessageInput,
43
+ eventProps: {
44
+ message_id: message.id,
45
+ message_role: message.role,
46
+ message_type: message.type,
47
+ message_metadata: {
48
+ content: message?.metadata?.content, // Removed amplitudeSafeString
49
+ created_at: message.createdAt,
50
+ user_typed: userTyped,
51
+ },
52
+ },
53
+ alsoSendToGoogleAnalytics: true,
54
+ });
55
+ }
56
+ });
@@ -5,7 +5,7 @@ import {
5
5
  UserIdentityProvider,
6
6
  useUserIdentity,
7
7
  } from 'src/contexts/userIdentityContext/userIdentityContext';
8
- import { LocalStorageProvider } from 'src/contexts/localStorageContext';
8
+ import { LocalStorageKeys, LocalStorageProvider } from 'src/contexts/localStorageContext';
9
9
  import { EnviveConfigProvider } from 'src/contexts/enviveConfigContext/enviveConfigContext';
10
10
  import {
11
11
  FeatureFlagService,
@@ -13,6 +13,7 @@ import {
13
13
  } from 'src/contexts/featureFlagServiceContext/featureFlagServiceContext';
14
14
  import { userIdAtom } from 'src/atoms/app';
15
15
  import { AmplitudeService } from 'src/services/amplitudeService/amplitudeService';
16
+ import { UserIdentityService } from 'src/services/userIdentityService';
16
17
  import { AmplitudeProvider, SpiffyMetricsEventName, useAmplitude } from '../amplitudeContext';
17
18
 
18
19
  // Mock AmplitudeService
@@ -111,10 +112,20 @@ const AtomReaderComponent: React.FC = () => {
111
112
  const CombinedContextComponent: React.FC = () => {
112
113
  const userIdentity = useUserIdentity();
113
114
  const amplitude = useAmplitude();
115
+ const [userId, setUserId] = React.useState<string>('');
116
+
117
+ React.useEffect(() => {
118
+ const fetchUserId = async () => {
119
+ const id = await userIdentity.getUserIdOrDefault();
120
+ setUserId(id);
121
+ };
122
+
123
+ fetchUserId();
124
+ }, [userIdentity]);
114
125
 
115
126
  return (
116
127
  <div data-testid="combined-component">
117
- <div data-testid="user-id-from-identity">{userIdentity.getUserIdOrDefault()}</div>
128
+ <div data-testid="user-id-from-identity">{userId}</div>
118
129
  <div data-testid="amplitude-ready">{amplitude.isReady.toString()}</div>
119
130
  </div>
120
131
  );
@@ -123,18 +134,33 @@ const CombinedContextComponent: React.FC = () => {
123
134
  // FeatureFlagService
124
135
  const testFeatureFlagService = new FeatureFlagService([]);
125
136
 
137
+ // userID service
138
+ const mockInitializeUser = vi.fn().mockResolvedValue(undefined);
139
+ const mockGetUserId = vi.fn().mockImplementation(async () => {
140
+ // Check for override first
141
+ const override = localStorage.getItem('v1-spiffy-user-id-override');
142
+ if (override) return override;
143
+ return 'test-user-id';
144
+ });
145
+
146
+ const testUserIdService = {
147
+ getUserIdOrDefault: mockGetUserId,
148
+ initializeUser: mockInitializeUser,
149
+ getUserIdOverrideFromLocalStorage: vi.fn().mockImplementation(() => {
150
+ return localStorage.getItem('v1-spiffy-user-id-override') || undefined;
151
+ }),
152
+ } as unknown as UserIdentityService;
153
+
126
154
  // Wrapper component with all required providers
127
155
  const TestWrapper: React.FC<{
128
156
  children: React.ReactNode;
129
157
  amplitudeApiKey?: string;
130
158
  userIdOverride?: string;
131
- userIdDefault?: string;
132
159
  externalAmplitudeService?: AmplitudeService;
133
160
  }> = ({
134
161
  children,
135
162
  amplitudeApiKey = 'test-amplitude-key',
136
163
  userIdOverride,
137
- userIdDefault,
138
164
  externalAmplitudeService,
139
165
  }) => {
140
166
  // Set up localStorage with user IDs if provided
@@ -142,10 +168,7 @@ const TestWrapper: React.FC<{
142
168
  if (userIdOverride) {
143
169
  localStorage.setItem('v1-spiffy-user-id-override', userIdOverride);
144
170
  }
145
- if (userIdDefault) {
146
- localStorage.setItem('v1-spiffy-user-id-default', userIdDefault);
147
- }
148
- }, [userIdOverride, userIdDefault]);
171
+ }, [userIdOverride]);
149
172
 
150
173
  return (
151
174
  <Provider>
@@ -159,7 +182,7 @@ const TestWrapper: React.FC<{
159
182
  featureGates={[]}
160
183
  >
161
184
  <LocalStorageProvider>
162
- <UserIdentityProvider>
185
+ <UserIdentityProvider userIdService={testUserIdService}>
163
186
  <FeatureFlagServiceProvider featureFlagService={testFeatureFlagService}>
164
187
  <AmplitudeProvider externalAmplitudeService={externalAmplitudeService}>
165
188
  {children}
@@ -173,8 +196,16 @@ const TestWrapper: React.FC<{
173
196
  };
174
197
 
175
198
  describe('AmplitudeProvider - React Context Integration', () => {
199
+ let mockGetLocalStorageItem: (key: string) => string | null;
176
200
  beforeEach(() => {
177
201
  vi.clearAllMocks();
202
+ vi.clearAllMocks();
203
+ mockGetLocalStorageItem = vi.fn((key: string) => {
204
+ if (key === LocalStorageKeys.ChatId) {
205
+ return 'test-chat-id';
206
+ }
207
+ return null;
208
+ });
178
209
  if (typeof localStorage !== 'undefined') {
179
210
  localStorage.clear();
180
211
  }
@@ -227,62 +258,6 @@ describe('AmplitudeProvider - React Context Integration', () => {
227
258
  });
228
259
  });
229
260
 
230
- it('should use default userId from UserIdentityContext when override is not set', async () => {
231
- const testUserId = 'default-user-id-456';
232
- render(
233
- <TestWrapper userIdDefault={testUserId}>
234
- <MockAmplitudeComponent />
235
- </TestWrapper>,
236
- );
237
-
238
- await waitFor(() => {
239
- expect(screen.getByTestId('is-ready').textContent).toBe('true');
240
- });
241
-
242
- await act(async () => {
243
- screen.getByTestId('track-event-button').click();
244
- });
245
-
246
- await waitFor(() => {
247
- expect(mockTrackEvent).toHaveBeenCalled();
248
- const callArgs = mockTrackEvent.mock.calls[0];
249
- expect(callArgs[0]).toEqual({
250
- eventName: SpiffyMetricsEventName.ChatUserMessageInput,
251
- eventProps: { message: 'test message' },
252
- });
253
- });
254
- });
255
-
256
- it('should prioritize override userId over default userId', async () => {
257
- const overrideUserId = 'override-user-id-789';
258
- const defaultUserId = 'default-user-id-012';
259
- render(
260
- <TestWrapper
261
- userIdOverride={overrideUserId}
262
- userIdDefault={defaultUserId}
263
- >
264
- <MockAmplitudeComponent />
265
- </TestWrapper>,
266
- );
267
-
268
- await waitFor(() => {
269
- expect(screen.getByTestId('is-ready').textContent).toBe('true');
270
- });
271
-
272
- await act(async () => {
273
- screen.getByTestId('track-event-button').click();
274
- });
275
-
276
- await waitFor(() => {
277
- expect(mockTrackEvent).toHaveBeenCalled();
278
- const callArgs = mockTrackEvent.mock.calls[0];
279
- expect(callArgs[0]).toEqual({
280
- eventName: SpiffyMetricsEventName.ChatUserMessageInput,
281
- eventProps: { message: 'test message' },
282
- });
283
- });
284
- });
285
-
286
261
  it('should initialize AmplitudeService with userId from UserIdentityContext', async () => {
287
262
  const testUserId = 'init-user-id-345';
288
263
  render(
@@ -369,7 +344,7 @@ describe('AmplitudeProvider - React Context Integration', () => {
369
344
  featureGates={[]}
370
345
  >
371
346
  <LocalStorageProvider>
372
- <UserIdentityProvider>
347
+ <UserIdentityProvider userIdService={testUserIdService}>
373
348
  <FeatureFlagServiceProvider featureFlagService={testFeatureFlagService}>
374
349
  <AmplitudeProvider>{children}</AmplitudeProvider>
375
350
  </FeatureFlagServiceProvider>
@@ -399,6 +374,9 @@ describe('AmplitudeProvider - React Context Integration', () => {
399
374
  userId: 'external-user-id',
400
375
  amplitudeApiKey: 'external-api-key',
401
376
  dataResidency: 'EU',
377
+ orgId: 'test-org-id',
378
+ show: true,
379
+ getLocalStorageItem: mockGetLocalStorageItem,
402
380
  featureFlagService: new FeatureFlagService([]),
403
381
  env: 'test', // Provide required fields to match AmplitudeServiceConfig
404
382
  contextSource: 'test-source',
@@ -435,6 +413,9 @@ describe('AmplitudeProvider - React Context Integration', () => {
435
413
  userId: 'external-user-id',
436
414
  amplitudeApiKey: 'external-api-key',
437
415
  dataResidency: 'EU',
416
+ orgId: 'test-org-id',
417
+ show: true,
418
+ getLocalStorageItem: mockGetLocalStorageItem,
438
419
  featureFlagService: new FeatureFlagService([]),
439
420
  env: 'test',
440
421
  contextSource: 'test-source',
@@ -43,6 +43,7 @@ export const AmplitudeProvider: React.FC<{
43
43
  variantUrlOverride,
44
44
  variantInfoOverride,
45
45
  show,
46
+ orgId,
46
47
  orgShortName,
47
48
  featureGates,
48
49
  } = useEnviveConfig();
@@ -67,9 +68,10 @@ export const AmplitudeProvider: React.FC<{
67
68
  env: env || '',
68
69
  contextSource: contextSource || '',
69
70
  orgShortName: orgShortName || '',
71
+ orgId: orgId || '',
70
72
  featureFlagService,
71
73
  orgGaConfig,
72
- show,
74
+ show: show ?? false,
73
75
  getLocalStorageItem: getItem,
74
76
  });
75
77
  setService(amplitudeService);
@@ -92,6 +94,7 @@ export const AmplitudeProvider: React.FC<{
92
94
  featureGates,
93
95
  getItem,
94
96
  externalAmplitudeService,
97
+ orgId,
95
98
  ]);
96
99
 
97
100
  const value = useMemo(
@@ -0,0 +1,66 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { ChatElementDisplayLocationV3 } from 'src/application/models/chatElementDisplayLocationV3';
3
+ import Logger from 'src/application/logging/logger';
4
+ import { useEnviveConfig } from 'src/contexts/enviveConfigContext/enviveConfigContext';
5
+ import { useSalesAgent } from 'src/contexts/salesAgentContext/salesAgentContext';
6
+ import { useChatToggle } from 'src/hooks/ChatToggle';
7
+
8
+ const attachedPrefixes = new Set<string>();
9
+
10
+ export const WindowChatToggleBinder = () => {
11
+ const triggerLocation = ChatElementDisplayLocationV3.WINDOW_API_CALL;
12
+ const hook = useChatToggle();
13
+ const { onTypedMessageSubmitted } = useSalesAgent();
14
+ const { identifyingPrefix } = useEnviveConfig();
15
+
16
+ const openChatRef = useRef<(triggerId?: string) => void>(() => {});
17
+ const closeChatRef = useRef<(triggerId?: string) => void>(() => {});
18
+ const toggleChatRef = useRef<(triggerId?: string) => void>(() => {});
19
+ const isOpenRef = useRef<boolean>(hook.isOpen);
20
+ const openChatWithPromptRef = useRef<(prompt: string, triggerId?: string) => void>(() => {});
21
+
22
+ useEffect(() => {
23
+ openChatRef.current = (triggerId?: string) => hook.openChat(triggerLocation, triggerId);
24
+ closeChatRef.current = (triggerId?: string) => hook.closeChat(triggerLocation, triggerId);
25
+ toggleChatRef.current = (triggerId?: string) => hook.toggle(triggerLocation, triggerId);
26
+ isOpenRef.current = hook.isOpen;
27
+ openChatWithPromptRef.current = (prompt: string, triggerId?: string) => {
28
+ onTypedMessageSubmitted({ query: prompt, userTyped: false });
29
+ hook.openChat(triggerLocation, triggerId);
30
+ };
31
+ }, [hook, onTypedMessageSubmitted, triggerLocation]);
32
+
33
+ useEffect(() => {
34
+ if (!identifyingPrefix || attachedPrefixes.has(identifyingPrefix)) return;
35
+ try {
36
+ const win = window as unknown as Window & Record<string, unknown>;
37
+ if (!win[identifyingPrefix]) {
38
+ win[identifyingPrefix] = {} as Record<string, unknown>;
39
+ }
40
+ const api = win[identifyingPrefix] as Record<string, unknown>;
41
+ api.openChat = (triggerId?: string) => openChatRef.current?.(triggerId);
42
+ api.closeChat = (triggerId?: string) => closeChatRef.current?.(triggerId);
43
+ api.toggleChat = (triggerId?: string) => toggleChatRef.current?.(triggerId);
44
+ api.getChatIsOpen = () => !!isOpenRef.current;
45
+ api.openChatWithPrompt = (prompt: string, triggerId?: string) =>
46
+ openChatWithPromptRef.current?.(prompt, triggerId);
47
+
48
+ attachedPrefixes.add(identifyingPrefix);
49
+
50
+ // Always expose the same API at window["spiffy"] so both work (e.g. injection-bundle + spiffy)
51
+ const spiffyAlias = 'spiffy';
52
+ if (!attachedPrefixes.has(spiffyAlias)) {
53
+ win[spiffyAlias] = api;
54
+ attachedPrefixes.add(spiffyAlias);
55
+ }
56
+
57
+ Logger.logDebug(
58
+ `[envive-ai] Chat toggle attached at window["${identifyingPrefix}"] and window["${spiffyAlias}"]`,
59
+ );
60
+ } catch (e) {
61
+ Logger.logError('[envive-ai] Failed to attach Chat toggle functions', e);
62
+ }
63
+ }, [identifyingPrefix]);
64
+
65
+ return null;
66
+ };
@@ -4,11 +4,12 @@ import { OrgConfigFeatureGate } from 'src/application/models/api/orgConfigResult
4
4
  import { EnviveConfigService, EnviveServiceConfig } from 'src/services/enviveConfigService';
5
5
  import { AmplitudeService } from 'src/services/amplitudeService/amplitudeService';
6
6
  import Logger from 'src/application/logging/logger';
7
+ import { UserIdentityService } from 'src/services/userIdentityService';
7
8
  import { AmplitudeProvider } from '../amplitudeContext';
8
9
  import { EnviveConfigProvider } from '../enviveConfigContext';
9
10
  import { EnviveCssProvider } from '../enviveCssContext';
10
11
  import { FeatureFlagService, FeatureFlagServiceProvider } from '../featureFlagServiceContext';
11
- import { GraphQlConfigValues, GraphQLProvider } from '../graphqlContext';
12
+ import { GraphQLProvider, GraphQlConfigValues } from '../graphqlContext';
12
13
  import { LocalStorageProvider } from '../localStorageContext';
13
14
  import { NewOrgConfigProvider } from '../newOrgConfigContext';
14
15
  import { UserIdentityProvider } from '../userIdentityContext';
@@ -20,6 +21,7 @@ import { HardcopyProvider } from '../hardcopyContext';
20
21
  import { WidgetConfigProvider } from '../widgetConfigContext';
21
22
  import { PageProvider } from '../pageContext';
22
23
  import { UiConfigProvider } from '../uiConfigContext';
24
+ import { WindowChatToggleBinder } from './WindowChatToggleBinder';
23
25
 
24
26
  const EnviveContext = createContext<null>(null);
25
27
 
@@ -50,8 +52,10 @@ interface EnviveProviderProps extends AgentWrapperProps {
50
52
  amplitudeService?: AmplitudeService;
51
53
  mockV3ConfigToDeprecatedConfig?: boolean;
52
54
  requestV3Config?: boolean;
55
+ userIdentityService?: UserIdentityService;
53
56
  previewMode?: boolean;
54
57
  overrideConfig?: GraphQlConfigValues;
58
+ mockSalesAgentData?: any;
55
59
  }
56
60
 
57
61
  const SearchAgentWrapper: React.FC<AgentWrapperProps> = ({ children, enabledAgents }) => {
@@ -61,13 +65,28 @@ const SearchAgentWrapper: React.FC<AgentWrapperProps> = ({ children, enabledAgen
61
65
  return <SearchProvider>{children}</SearchProvider>;
62
66
  };
63
67
 
64
- const SalesAgentWrapper: React.FC<AgentWrapperProps> = ({ children, enabledAgents }) => {
68
+ interface SalesAgentWrapperProps extends AgentWrapperProps {
69
+ previewMode?: boolean;
70
+ mockSalesAgentData?: any;
71
+ }
72
+
73
+ const SalesAgentWrapper: React.FC<SalesAgentWrapperProps> = ({
74
+ children,
75
+ enabledAgents,
76
+ previewMode,
77
+ mockSalesAgentData,
78
+ }) => {
65
79
  if (!enabledAgents.includes(EnviveAgent.SalesAgent)) {
66
80
  return children;
67
81
  }
68
82
  return (
69
83
  <SystemSettingsContextProvider>
70
- <SalesAgentProvider>{children}</SalesAgentProvider>
84
+ <SalesAgentProvider
85
+ previewMode={previewMode}
86
+ mockData={mockSalesAgentData}
87
+ >
88
+ {children}
89
+ </SalesAgentProvider>
71
90
  </SystemSettingsContextProvider>
72
91
  );
73
92
  };
@@ -80,11 +99,30 @@ export const EnviveProvider: React.FC<EnviveProviderProps> = ({
80
99
  enviveConfigService: inputEnviveConfigService,
81
100
  featureFlagService: inputFeatureFlagService,
82
101
  amplitudeService: inputAmplitudeService,
102
+ userIdentityService: inputUserIdentityService,
83
103
  mockV3ConfigToDeprecatedConfig = false,
84
104
  requestV3Config = false,
105
+ mockSalesAgentData,
85
106
  ...config
86
107
  }) => {
87
- const userId = 'spiffy-user-id-0b64d781-e1c2-4b6d-9cf5-32b4f7c1e3f2'; // TODO: How should this be derived?
108
+ const [userId, setUserId] = useState<string>('');
109
+
110
+ const userIdService = useMemo(
111
+ () =>
112
+ inputUserIdentityService ??
113
+ new UserIdentityService({ apiKey: config?.amplitudeApiKey || '' }),
114
+ [config?.amplitudeApiKey, inputUserIdentityService],
115
+ );
116
+
117
+ useEffect(() => {
118
+ const fetchUserId = async () => {
119
+ const id = await userIdService.getUserIdOrDefault();
120
+ setUserId(id);
121
+ };
122
+
123
+ fetchUserId();
124
+ }, [config.amplitudeApiKey, inputUserIdentityService, userIdService]);
125
+
88
126
  const namespace = 'spiffy-react-components'; // TODO: Should this be different from the current namespace?
89
127
  const source = 'app'; // TODO: Make this dependent upon the "spiffy_on" query param
90
128
  const [enviveServiceConfig, setEnviveServiceConfig] = useState<EnviveServiceConfig | null>(null);
@@ -97,7 +135,7 @@ export const EnviveProvider: React.FC<EnviveProviderProps> = ({
97
135
  new EnviveConfigService({
98
136
  baseUrl: config?.baseUrl || '',
99
137
  apiKey: config?.orgLevelApiKey || '',
100
- userId: userId || '',
138
+ userId,
101
139
  namespace: namespace || '',
102
140
  source: source || '',
103
141
  });
@@ -138,7 +176,7 @@ export const EnviveProvider: React.FC<EnviveProviderProps> = ({
138
176
  <NewOrgConfigProvider overrideConfig={overrideConfig}>
139
177
  <LocalStorageProvider>
140
178
  <FeatureFlagServiceProvider featureFlagService={featureFlagService}>
141
- <UserIdentityProvider>
179
+ <UserIdentityProvider userIdService={userIdService}>
142
180
  <AmplitudeProvider externalAmplitudeService={inputAmplitudeService}>
143
181
  <PageProvider previewMode={previewMode}>
144
182
  <UiConfigProvider>
@@ -146,7 +184,12 @@ export const EnviveProvider: React.FC<EnviveProviderProps> = ({
146
184
  <HardcopyProvider>
147
185
  <EnviveCssProvider>
148
186
  <SearchAgentWrapper enabledAgents={enabledAgents}>
149
- <SalesAgentWrapper enabledAgents={enabledAgents}>
187
+ <WindowChatToggleBinder />
188
+ <SalesAgentWrapper
189
+ enabledAgents={enabledAgents}
190
+ previewMode={previewMode}
191
+ mockSalesAgentData={mockSalesAgentData}
192
+ >
150
193
  {children}
151
194
  </SalesAgentWrapper>
152
195
  </SearchAgentWrapper>
@@ -3,6 +3,8 @@ import { OrgConfigFeatureGate } from 'src/application/models/api/orgConfigResult
3
3
  import { FeatureGates } from 'src/application/models/featureGates';
4
4
  import Logger from 'src/application/logging/logger';
5
5
 
6
+ const FEATURE_FLAGS_STORAGE_KEY = 'spiffy-feature-flags';
7
+
6
8
  // This is the class that was previously implicitly used or defined elsewhere
7
9
  export class FeatureFlagService {
8
10
  private featureGates: OrgConfigFeatureGate[];
@@ -11,11 +13,94 @@ export class FeatureFlagService {
11
13
  this.featureGates = featureGates;
12
14
  }
13
15
 
16
+ static getQueryParamFeatureGateOverrides(featureGate: FeatureGates): boolean | undefined {
17
+ const url = window.location?.href ?? '';
18
+ if (url.includes('?')) {
19
+ const urlObj = new URL(url);
20
+ const params = new URLSearchParams(urlObj.search);
21
+ const paramsObj = Object.fromEntries(params.entries());
22
+ const value = paramsObj[featureGate];
23
+
24
+ if (value != null) {
25
+ return value === 'true';
26
+ }
27
+ }
28
+
29
+ return undefined;
30
+ }
31
+
32
+ static getWindowFeatureGateOverrides(featureGate: FeatureGates): boolean | undefined {
33
+ if (typeof window === 'undefined') {
34
+ return undefined;
35
+ }
36
+ const windowOverride = window as Window & {
37
+ _envive?: { featureOverrides?: Record<string, boolean> };
38
+ _spiffy?: { featureOverrides?: Record<string, boolean> };
39
+ };
40
+ const featureOverrides =
41
+ windowOverride?._envive?.featureOverrides ?? windowOverride?._spiffy?.featureOverrides;
42
+ const value = featureOverrides?.[String(featureGate)];
43
+ if (value != null) {
44
+ return value;
45
+ }
46
+ return undefined;
47
+ }
48
+
49
+ static getStoredFeatureGateOverrides(featureGate: FeatureGates): boolean | undefined {
50
+ if (typeof window === 'undefined' || typeof window.localStorage === 'undefined') {
51
+ return undefined;
52
+ }
53
+ try {
54
+ const featureFlags = window.localStorage.getItem(FEATURE_FLAGS_STORAGE_KEY);
55
+ if (!featureFlags) {
56
+ return undefined;
57
+ }
58
+ const featureFlagsObj = JSON.parse(featureFlags) as Record<string, boolean>;
59
+ return featureFlagsObj[featureGate];
60
+ } catch (err) {
61
+ Logger.logError(
62
+ '[spiffy-ai] getStoredFeatureGateOverrides: error parsing feature flags',
63
+ err,
64
+ );
65
+ return undefined;
66
+ }
67
+ }
68
+
69
+ static getFeatureFlagOverride(featureGate: FeatureGates): boolean | undefined {
70
+ const queryOverride = FeatureFlagService.getQueryParamFeatureGateOverrides(featureGate);
71
+ if (queryOverride != null) {
72
+ Logger.logDebug(
73
+ `[spiffy-ai] isFeatureGateEnabled featureGate:${featureGate} overridden by URL param. New value: ${queryOverride}`,
74
+ );
75
+ return queryOverride;
76
+ }
77
+
78
+ const windowOverride = FeatureFlagService.getWindowFeatureGateOverrides(featureGate);
79
+ if (windowOverride != null) {
80
+ Logger.logDebug(
81
+ `[spiffy-ai] isFeatureGateEnabled featureGate:${featureGate} overridden by window param. New value: ${windowOverride}`,
82
+ );
83
+ return windowOverride;
84
+ }
85
+
86
+ const storedOverride = FeatureFlagService.getStoredFeatureGateOverrides(featureGate);
87
+ if (storedOverride != null) {
88
+ Logger.logDebug(
89
+ `[spiffy-ai] isFeatureGateEnabled featureGate:${featureGate} overridden by stored value. New value: ${storedOverride}`,
90
+ );
91
+ return storedOverride;
92
+ }
93
+
94
+ return undefined;
95
+ }
96
+
14
97
  isFeatureGateEnabled = (featureGate: FeatureGates): boolean => {
15
98
  const gateValue = this.featureGates.find(gate => gate.name === featureGate);
16
99
 
17
- // TODO: Add logic for overrides (query params, window, stored) if needed, similar to the old FeatureFlagContext.tsx
18
- // For now, direct value from config is used.
100
+ const featureFlagOverride = FeatureFlagService.getFeatureFlagOverride(featureGate);
101
+ if (featureFlagOverride !== undefined) {
102
+ return featureFlagOverride;
103
+ }
19
104
 
20
105
  if (gateValue == null || gateValue.value == null) {
21
106
  Logger.logDebug(
@@ -38,6 +123,20 @@ export class FeatureFlagService {
38
123
  ]),
39
124
  );
40
125
  };
126
+
127
+ static persistFeatureGateOverrides(): void {
128
+ if (typeof window === 'undefined' || typeof window.localStorage === 'undefined') {
129
+ return;
130
+ }
131
+ const overrides = Object.values(FeatureGates)
132
+ .map(
133
+ featureGate =>
134
+ [featureGate, FeatureFlagService.getFeatureFlagOverride(featureGate)] as const,
135
+ )
136
+ .filter(([, value]) => value !== undefined)
137
+ .reduce<Record<string, boolean>>((acc, [key, value]) => ({ ...acc, [key]: value! }), {});
138
+ window.localStorage.setItem(FEATURE_FLAGS_STORAGE_KEY, JSON.stringify(overrides));
139
+ }
41
140
  }
42
141
 
43
142
  export interface FeatureFlagContextType {
@@ -214,11 +214,17 @@ export const GraphQLProvider = ({
214
214
 
215
215
  // We may update this root config location in the future
216
216
  const v3RootConfig = response.me.getProductsConfigByVersion?.v_three_config?.values;
217
+ const frontendValues = response.me.getProductsConfigByVersion?.frontend?.values;
217
218
 
218
219
  const v3FrontendConfig = v3FrontendConfigCleanup(
219
220
  transformSnakeToCamel(v3RootConfig) as FrontendConfigV3Response,
220
221
  );
221
222
 
223
+ // Get merchant_override_css from frontend.values if v3RootConfig is not available
224
+ const frontendMerchantOverrideCss = frontendValues?.merchant_override_css;
225
+ const v3MerchantOverrideCss = v3FrontendConfig.uiConfigs?.merchantOverrideCss;
226
+ const merchantOverrideCss = v3MerchantOverrideCss || frontendMerchantOverrideCss;
227
+
222
228
  const v3MountingConfigsArray = (transformSnakeToCamel(v3RootConfig?.mounting_configs) ??
223
229
  []) as unknown as { key: string; config: WidgetMountingConfig }[];
224
230
 
@@ -243,9 +249,11 @@ export const GraphQLProvider = ({
243
249
  : DEFAULT_PAGE_VARIANTS;
244
250
 
245
251
  const v3ColorsConfig = transformSnakeToCamel(v3RootConfig?.colors?.values);
252
+ const isSemanticColors = !window.location.href.includes('globals=merchant');
253
+ const isStorybook = window.top?.location.href.includes('?path=');
254
+
246
255
  // If the v3 root config is not found and we are configured to return the deprecated config, we will return the mocked config
247
- if (!v3RootConfig && mockV3ConfigToDeprecatedConfig) {
248
- const isSemanticColors = !window.location.href.includes('globals=merchant');
256
+ if ((!v3RootConfig && mockV3ConfigToDeprecatedConfig) || (isStorybook && isSemanticColors)) {
249
257
  Logger.logInfo('GraphQLContext | Returning mock v3 config', {
250
258
  colorsConfig: mockV3ColorsConfig as ColorsConfigV3Response,
251
259
  frontendConfig: mockV3FrontendConfig as FrontendConfigV3Response,
@@ -279,6 +287,7 @@ export const GraphQLProvider = ({
279
287
  colorsConfig: v3ColorsConfig as ColorsConfigV3Response,
280
288
  frontendConfig: {
281
289
  ...(v3FrontendConfig as FrontendConfigV3Response),
290
+ merchantOverrideCss,
282
291
  // Need to replace the automatic widget configs with the object based ones
283
292
  widgetConfigs: v3WidgetConfigs,
284
293
  },