@envive-ai/react-widgets-v3 0.3.14 → 0.3.15-alpha.1

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 (336) hide show
  1. package/dist/debug/chatEmbed.cjs +1 -1
  2. package/dist/debug/chatEmbed.js +1 -1
  3. package/dist/debug/reportIssue.cjs +1 -1
  4. package/dist/debug/reportIssue.js +1 -1
  5. package/dist/hocs/withBaseWidget/types.d.cts +3 -3
  6. package/dist/hocs/withBaseWidget/types.d.ts +5 -3
  7. package/dist/hocs/withBaseWidget/withBaseWidget.d.cts +2 -2
  8. package/dist/hocs/withBaseWidget/withBaseWidget.d.ts +2 -2
  9. package/dist/hooks/dist/application/models/api/widgetText.d.cts +8 -0
  10. package/dist/hooks/dist/contexts/hardcopyContext/hardcopyContext.d.cts +12 -0
  11. package/dist/hooks/dist/contexts/types.d.cts +38 -0
  12. package/dist/hooks/dist/contexts/typesV3.d.cts +230 -0
  13. package/dist/hooks/dist/services/amplitudeService/eventNames.d.cts +43 -0
  14. package/dist/hooks/dist/types/customerService.d.cts +21 -0
  15. package/dist/node_modules/@spiffy-ai/commerce-api-client/dist/models/WidgetType.cjs +1 -0
  16. package/dist/packages/hooks/dist/application/models/api/orgConfigResults.d.ts +1 -0
  17. package/dist/packages/hooks/dist/application/models/api/widgetText.d.ts +8 -0
  18. package/dist/packages/hooks/dist/application/models/frontendConfig.d.ts +1 -0
  19. package/dist/packages/hooks/dist/contexts/amplitudeContext/amplitudeContext.d.ts +2 -0
  20. package/dist/packages/hooks/dist/contexts/amplitudeContext/index.d.ts +2 -0
  21. package/dist/packages/hooks/dist/contexts/featureFlagServiceContext/featureFlagServiceContext.d.ts +2 -0
  22. package/dist/packages/hooks/dist/contexts/hardcopyContext/hardcopyContext.d.ts +14 -0
  23. package/dist/packages/hooks/dist/contexts/hardcopyContext/index.d.ts +1 -0
  24. package/dist/packages/hooks/dist/contexts/types.d.ts +42 -0
  25. package/dist/packages/hooks/dist/contexts/typesV3.d.ts +230 -0
  26. package/dist/packages/hooks/dist/services/amplitudeService/amplitudeService.d.ts +1 -0
  27. package/dist/packages/hooks/dist/services/amplitudeService/eventNames.d.ts +43 -0
  28. package/dist/packages/hooks/dist/types/customerService.d.ts +21 -0
  29. package/dist/packages/icons/dist/IconCloseVariant.cjs +5 -6
  30. package/dist/packages/icons/dist/IconCloseVariant.js +4 -6
  31. package/dist/packages/widgets/dist/SearchResults/SearchResults.d.ts +4 -3
  32. package/dist/packages/widgets/dist/SearchResults/SearchResultsWidget.d.ts +2 -2
  33. package/dist/packages/widgets/dist/SearchZeroState/SearchZeroStateWidget.d.ts +2 -2
  34. package/dist/packages/widgets/dist/SearchZeroState/index.d.ts +2 -1
  35. package/dist/packages/widgets/dist/SearchZeroState/types.d.ts +2 -2
  36. package/dist/packages/widgets/dist/SuggestionBar/SuggestionBar.d.ts +3 -3
  37. package/dist/packages/widgets/dist/SuggestionButtonContainer/index.d.ts +2 -0
  38. package/dist/packages/widgets/dist/SuggestionButtonContainer/types.d.ts +3 -2
  39. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/api/response.d.ts +14 -0
  40. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/api/search.d.ts +15 -0
  41. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/utilityTypes/camelCase.d.ts +73 -0
  42. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/utilityTypes/camelCasedPropertiesDeep.d.ts +61 -0
  43. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/utilityTypes/internal.d.ts +25 -0
  44. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/utilityTypes/splitWords.d.ts +35 -0
  45. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/utilityTypes/trim.d.ts +32 -0
  46. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/utilityTypes/unknownArray.d.ts +32 -0
  47. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/variantInfo/variantInfo.d.ts +1 -0
  48. package/dist/packages/widgets/dist/packages/hooks/dist/atoms/search/searchAPI.d.ts +15 -0
  49. package/dist/packages/widgets/dist/packages/hooks/dist/contexts/hardcopyContext/hardcopyContext.d.ts +1 -0
  50. package/dist/packages/widgets/dist/packages/hooks/dist/contexts/types.d.ts +63 -0
  51. package/dist/packages/widgets/dist/packages/hooks/dist/hooks/Search/useSearch.d.ts +60 -0
  52. package/dist/packages/widgets/dist/packages/hooks/dist/hooks/utils.d.ts +13 -0
  53. package/dist/packages/widgets/dist/packages/hooks/dist/types/OrgInfo.d.ts +1 -0
  54. package/dist/packages/widgets/dist/packages/hooks/dist/types/index.d.ts +1 -0
  55. package/dist/packages/widgets/dist/packages/hooks/dist/types/search-filter-types.d.ts +28 -0
  56. package/dist/packages/widgets/dist/packages/hooks/dist/types/test-types.d.ts +10 -0
  57. package/dist/src/CXIntegration/hooks/useUnifiedCXButton.d.ts +10 -0
  58. package/dist/src/CXIntegration/hooks/useUnifiedCXButton.js +29 -0
  59. package/dist/src/CXIntegration/implementations/useDefaultUnifiedCXButton.d.ts +2 -0
  60. package/dist/src/CXIntegration/implementations/useDefaultUnifiedCXButton.js +6 -0
  61. package/dist/src/CXIntegration/implementations/useEightByEightUnifiedCXButton.d.ts +5 -0
  62. package/dist/src/CXIntegration/implementations/useEightByEightUnifiedCXButton.js +63 -0
  63. package/dist/src/CXIntegration/implementations/useGladlyUnifiedCXButton.d.ts +5 -0
  64. package/dist/src/CXIntegration/implementations/useGladlyUnifiedCXButton.js +23 -0
  65. package/dist/src/CXIntegration/implementations/useGorgiasUnifiedCXButton.d.ts +5 -0
  66. package/dist/src/CXIntegration/implementations/useGorgiasUnifiedCXButton.js +54 -0
  67. package/dist/src/CXIntegration/implementations/useGrooveUnifiedCXButton.d.ts +18 -0
  68. package/dist/src/CXIntegration/implementations/useGrooveUnifiedCXButton.js +48 -0
  69. package/dist/src/CXIntegration/implementations/useHelpScoutUnifiedCXButton.d.ts +5 -0
  70. package/dist/src/CXIntegration/implementations/useHelpScoutUnifiedCXButton.js +84 -0
  71. package/dist/src/CXIntegration/implementations/useKustomerUnifiedCXButton.d.ts +5 -0
  72. package/dist/src/CXIntegration/implementations/useKustomerUnifiedCXButton.js +86 -0
  73. package/dist/src/CXIntegration/implementations/useReDoUnifiedCXButton.d.ts +5 -0
  74. package/dist/src/CXIntegration/implementations/useReDoUnifiedCXButton.js +59 -0
  75. package/dist/src/CXIntegration/implementations/useRichpanelUnifiedCXButton.d.ts +5 -0
  76. package/dist/src/CXIntegration/implementations/useRichpanelUnifiedCXButton.js +62 -0
  77. package/dist/src/CXIntegration/implementations/useShopifyChatUnifiedCXButton.d.ts +5 -0
  78. package/dist/src/CXIntegration/implementations/useShopifyChatUnifiedCXButton.js +49 -0
  79. package/dist/src/CXIntegration/implementations/useTalkdeskUnifiedCXButton.d.ts +5 -0
  80. package/dist/src/CXIntegration/implementations/useTalkdeskUnifiedCXButton.js +77 -0
  81. package/dist/src/CXIntegration/implementations/useTidioUnifiedCXButton.d.ts +13 -0
  82. package/dist/src/CXIntegration/implementations/useTidioUnifiedCXButton.js +20 -0
  83. package/dist/src/CXIntegration/implementations/useZendeskUnifiedCXButton.d.ts +5 -0
  84. package/dist/src/CXIntegration/implementations/useZendeskUnifiedCXButton.js +55 -0
  85. package/dist/src/CXIntegration/implementations/useZowieUnifiedCXButton.d.ts +13 -0
  86. package/dist/src/CXIntegration/implementations/useZowieUnifiedCXButton.js +20 -0
  87. package/dist/src/CXIntegration/types.d.ts +26 -0
  88. package/dist/src/CXIntegration/types.js +17 -0
  89. package/dist/src/CXIntegration/utils/functions.d.ts +2 -0
  90. package/dist/src/CXIntegration/utils/functions.js +57 -0
  91. package/dist/src/debug/GenericSelect.d.ts +11 -0
  92. package/dist/src/debug/GenericSelect.js +151 -0
  93. package/dist/src/debug/MessageContent.d.ts +4 -0
  94. package/dist/src/debug/MessageContent.js +87 -0
  95. package/dist/src/debug/chatEmbed.d.ts +2 -0
  96. package/dist/src/debug/chatEmbed.js +58 -0
  97. package/dist/src/debug/debugBar.d.ts +1 -0
  98. package/dist/src/debug/debugBar.js +9 -0
  99. package/dist/src/debug/reportIssue.d.ts +1 -0
  100. package/dist/src/debug/reportIssue.js +322 -0
  101. package/dist/src/hocs/withBaseWidget/__tests__/withBaseWidget.test.d.ts +1 -0
  102. package/dist/src/hocs/withBaseWidget/__tests__/withBaseWidget.test.js +452 -0
  103. package/dist/src/hocs/withBaseWidget/index.d.ts +2 -0
  104. package/dist/src/hocs/withBaseWidget/index.js +1 -0
  105. package/dist/src/hocs/withBaseWidget/types.d.ts +33 -0
  106. package/dist/src/hocs/withBaseWidget/types.js +0 -0
  107. package/dist/src/hocs/withBaseWidget/withBaseWidget.d.ts +5 -0
  108. package/dist/src/hocs/withBaseWidget/withBaseWidget.js +80 -0
  109. package/dist/src/stories/FloatingChatWidget.stories.d.ts +25 -0
  110. package/dist/src/stories/FloatingChatWidget.stories.js +44 -0
  111. package/dist/src/stories/FullPageSalesAgentWidget.stories.d.ts +31 -0
  112. package/dist/src/stories/FullPageSalesAgentWidget.stories.js +51 -0
  113. package/dist/src/stories/ProductCardWidget.stories.d.ts +31 -0
  114. package/dist/src/stories/ProductCardWidget.stories.js +44 -0
  115. package/dist/src/stories/PromptButtonCarouselWithImageWidget.stories.d.ts +31 -0
  116. package/dist/src/stories/PromptButtonCarouselWithImageWidget.stories.js +40 -0
  117. package/dist/src/stories/PromptCarouselWidget.stories.d.ts +31 -0
  118. package/dist/src/stories/PromptCarouselWidget.stories.js +40 -0
  119. package/dist/src/stories/SalesAgentTest/SalesAgentTest.d.ts +1 -0
  120. package/dist/src/stories/SalesAgentTest/SalesAgentTest.js +40 -0
  121. package/dist/src/stories/SalesAgentTest/SalesAgentTest.stories.d.ts +12 -0
  122. package/dist/src/stories/SalesAgentTest/SalesAgentTest.stories.js +12 -0
  123. package/dist/src/stories/SalesAgentTest/index.d.ts +0 -0
  124. package/dist/src/stories/SalesAgentTest/index.js +0 -0
  125. package/dist/src/stories/SearchResults.stories.d.ts +6 -0
  126. package/dist/src/stories/SearchResults.stories.js +23 -0
  127. package/dist/src/stories/SearchZeroState.stories.d.ts +38 -0
  128. package/dist/src/stories/SearchZeroState.stories.js +42 -0
  129. package/dist/src/stories/SocialProofFlowWidget.stories.d.ts +35 -0
  130. package/dist/src/stories/SocialProofFlowWidget.stories.js +60 -0
  131. package/dist/src/stories/SuggestionBar.stories.d.ts +7 -0
  132. package/dist/src/stories/SuggestionBar.stories.js +36 -0
  133. package/dist/src/stories/TitledPromptCarouselWidget.stories.d.ts +32 -0
  134. package/dist/src/stories/TitledPromptCarouselWidget.stories.js +55 -0
  135. package/dist/src/stories/TypingAnimationFlowWidget.stories.d.ts +34 -0
  136. package/dist/src/stories/TypingAnimationFlowWidget.stories.js +51 -0
  137. package/dist/src/widgets/ChatPreviewComparisonWidget/ChatPreviewComparisonWidget.d.ts +12 -0
  138. package/dist/src/widgets/ChatPreviewComparisonWidget/ChatPreviewComparisonWidget.js +112 -0
  139. package/dist/src/widgets/ChatPreviewComparisonWidget/index.d.ts +3 -0
  140. package/dist/src/widgets/ChatPreviewComparisonWidget/index.js +2 -0
  141. package/dist/src/widgets/ChatPreviewLoadingWidget/ChatPreviewLoadingWidget.d.ts +9 -0
  142. package/dist/src/widgets/ChatPreviewLoadingWidget/ChatPreviewLoadingWidget.js +34 -0
  143. package/dist/src/widgets/ChatPreviewLoadingWidget/index.d.ts +3 -0
  144. package/dist/src/widgets/ChatPreviewLoadingWidget/index.js +2 -0
  145. package/dist/src/widgets/ChatPreviewWidget/ChatPreviewWidget.d.ts +12 -0
  146. package/dist/src/widgets/ChatPreviewWidget/ChatPreviewWidget.js +111 -0
  147. package/dist/src/widgets/ChatPreviewWidget/__tests__/ChatPreviewWidget.test.d.ts +1 -0
  148. package/dist/src/widgets/ChatPreviewWidget/__tests__/ChatPreviewWidget.test.js +97 -0
  149. package/dist/src/widgets/ChatPreviewWidget/index.d.ts +3 -0
  150. package/dist/src/widgets/ChatPreviewWidget/index.js +2 -0
  151. package/dist/src/widgets/FloatingChatWidget/FloatingChatOverlay.d.ts +14 -0
  152. package/dist/src/widgets/FloatingChatWidget/FloatingChatOverlay.js +44 -0
  153. package/dist/src/widgets/FloatingChatWidget/FloatingChatWidget.d.ts +8 -0
  154. package/dist/src/widgets/FloatingChatWidget/FloatingChatWidget.js +134 -0
  155. package/dist/src/widgets/FloatingChatWidget/__tests__/FloatingChatWidget.test.d.ts +1 -0
  156. package/dist/src/widgets/FloatingChatWidget/__tests__/FloatingChatWidget.test.js +100 -0
  157. package/dist/src/widgets/FloatingChatWidget/constants.d.ts +1 -0
  158. package/dist/src/widgets/FloatingChatWidget/constants.js +1 -0
  159. package/dist/src/widgets/FloatingChatWidget/hooks/useAutoPopup.d.ts +4 -0
  160. package/dist/src/widgets/FloatingChatWidget/hooks/useAutoPopup.js +51 -0
  161. package/dist/src/widgets/FloatingChatWidget/hooks/useFloatingButtonVisibility.d.ts +11 -0
  162. package/dist/src/widgets/FloatingChatWidget/hooks/useFloatingButtonVisibility.js +21 -0
  163. package/dist/src/widgets/FloatingChatWidget/index.d.ts +4 -0
  164. package/dist/src/widgets/FloatingChatWidget/index.js +3 -0
  165. package/dist/src/widgets/FullPageSalesAgentWidget/FullPageSalesAgentWidget.d.ts +12 -0
  166. package/dist/src/widgets/FullPageSalesAgentWidget/FullPageSalesAgentWidget.js +14 -0
  167. package/dist/src/widgets/FullPageSalesAgentWidget/index.d.ts +1 -0
  168. package/dist/src/widgets/FullPageSalesAgentWidget/index.js +1 -0
  169. package/dist/src/widgets/ProductCardWidget/ProductCardWidget.d.ts +7 -0
  170. package/dist/src/widgets/ProductCardWidget/ProductCardWidget.js +94 -0
  171. package/dist/src/widgets/ProductCardWidget/__tests__/ProductCardWidget.test.d.ts +1 -0
  172. package/dist/src/widgets/ProductCardWidget/__tests__/ProductCardWidget.test.js +106 -0
  173. package/dist/src/widgets/ProductCardWidget/index.d.ts +2 -0
  174. package/dist/src/widgets/ProductCardWidget/index.js +1 -0
  175. package/dist/src/widgets/PromptButtonCarouselWithImageWidget/PromptButtonCarouselWithImageWidget.d.ts +12 -0
  176. package/dist/src/widgets/PromptButtonCarouselWithImageWidget/PromptButtonCarouselWithImageWidget.js +88 -0
  177. package/dist/src/widgets/PromptButtonCarouselWithImageWidget/__tests__/PromptButtonCarouselWithImageWidget.test.d.ts +1 -0
  178. package/dist/src/widgets/PromptButtonCarouselWithImageWidget/__tests__/PromptButtonCarouselWithImageWidget.test.js +132 -0
  179. package/dist/src/widgets/PromptButtonCarouselWithImageWidget/index.d.ts +2 -0
  180. package/dist/src/widgets/PromptButtonCarouselWithImageWidget/index.js +2 -0
  181. package/dist/src/widgets/PromptCarouselWidget/PromptCarouselWidget.d.ts +7 -0
  182. package/dist/src/widgets/PromptCarouselWidget/PromptCarouselWidget.js +74 -0
  183. package/dist/src/widgets/PromptCarouselWidget/__tests__/PromptCarouselWidget.test.d.ts +1 -0
  184. package/dist/src/widgets/PromptCarouselWidget/__tests__/PromptCarouselWidget.test.js +106 -0
  185. package/dist/src/widgets/PromptCarouselWidget/index.d.ts +2 -0
  186. package/dist/src/widgets/PromptCarouselWidget/index.js +1 -0
  187. package/dist/src/widgets/SocialProofFlowWidget/SocialProofFlowWidget.d.ts +7 -0
  188. package/dist/src/widgets/SocialProofFlowWidget/SocialProofFlowWidget.js +25 -0
  189. package/dist/src/widgets/SocialProofFlowWidget/index.d.ts +3 -0
  190. package/dist/src/widgets/SocialProofFlowWidget/index.js +2 -0
  191. package/dist/src/widgets/SocialProofWidget/SocialProofWidget.d.ts +12 -0
  192. package/dist/src/widgets/SocialProofWidget/SocialProofWidget.js +203 -0
  193. package/dist/src/widgets/SocialProofWidget/__tests__/SocialProofWidget.test.d.ts +1 -0
  194. package/dist/src/widgets/SocialProofWidget/__tests__/SocialProofWidget.test.js +135 -0
  195. package/dist/src/widgets/SocialProofWidget/index.d.ts +2 -0
  196. package/dist/src/widgets/SocialProofWidget/index.js +1 -0
  197. package/dist/src/widgets/TitledPromptCarouselWidget/TitledPromptCarouselWidget.d.ts +7 -0
  198. package/dist/src/widgets/TitledPromptCarouselWidget/TitledPromptCarouselWidget.js +75 -0
  199. package/dist/src/widgets/TitledPromptCarouselWidget/__tests__/TitledPromptCarouselWidget.test.d.ts +1 -0
  200. package/dist/src/widgets/TitledPromptCarouselWidget/__tests__/TitledPromptCarouselWidget.test.js +106 -0
  201. package/dist/src/widgets/TitledPromptCarouselWidget/index.d.ts +2 -0
  202. package/dist/src/widgets/TitledPromptCarouselWidget/index.js +1 -0
  203. package/dist/src/widgets/TypingAnimationFlowWidget/TypingAnimationFlowWidget.d.ts +7 -0
  204. package/dist/src/widgets/TypingAnimationFlowWidget/TypingAnimationFlowWidget.js +25 -0
  205. package/dist/src/widgets/TypingAnimationFlowWidget/index.d.ts +3 -0
  206. package/dist/src/widgets/TypingAnimationFlowWidget/index.js +2 -0
  207. package/dist/src/widgets/TypingAnimationWidget/TypingAnimationWidget.d.ts +12 -0
  208. package/dist/src/widgets/TypingAnimationWidget/TypingAnimationWidget.js +126 -0
  209. package/dist/src/widgets/TypingAnimationWidget/__tests__/TypingAnimationWidget.test.d.ts +1 -0
  210. package/dist/src/widgets/TypingAnimationWidget/__tests__/TypingAnimationWidget.test.js +118 -0
  211. package/dist/src/widgets/TypingAnimationWidget/index.d.ts +2 -0
  212. package/dist/src/widgets/TypingAnimationWidget/index.js +1 -0
  213. package/dist/src/widgets/__tests__/testUtils.d.ts +60 -0
  214. package/dist/src/widgets/__tests__/testUtils.js +46 -0
  215. package/dist/src/widgets/__tests__/trackEventCanary.test.d.ts +1 -0
  216. package/dist/src/widgets/__tests__/trackEventCanary.test.js +37 -0
  217. package/dist/src/widgets/hooks/useGetWidgetStatus.d.ts +7 -0
  218. package/dist/src/widgets/hooks/useGetWidgetStatus.js +17 -0
  219. package/dist/src/widgets/utils/functions.d.ts +16 -0
  220. package/dist/src/widgets/utils/functions.js +87 -0
  221. package/dist/src/widgets-v2/SearchResults/index.d.ts +2 -0
  222. package/dist/src/widgets-v2/SearchResults/index.js +2 -0
  223. package/dist/src/widgets-v2/SearchZeroState/index.d.ts +2 -0
  224. package/dist/src/widgets-v2/SearchZeroState/index.js +2 -0
  225. package/dist/src/widgets-v2/SuggestionBar/index.d.ts +2 -0
  226. package/dist/src/widgets-v2/SuggestionBar/index.js +2 -0
  227. package/dist/src/widgets-v2/SuggestionButtonContainer/index.d.ts +2 -0
  228. package/dist/src/widgets-v2/SuggestionButtonContainer/index.js +2 -0
  229. package/dist/tsdown.config.d.ts +2 -0
  230. package/dist/tsdown.config.js +12 -0
  231. package/dist/widgets/ChatPreviewComparisonWidget/ChatPreviewComparisonWidget.cjs +36 -5
  232. package/dist/widgets/ChatPreviewComparisonWidget/ChatPreviewComparisonWidget.d.ts +3 -3
  233. package/dist/widgets/ChatPreviewComparisonWidget/ChatPreviewComparisonWidget.js +36 -5
  234. package/dist/widgets/ChatPreviewLoadingWidget/ChatPreviewLoadingWidget.d.cts +3 -3
  235. package/dist/widgets/ChatPreviewLoadingWidget/ChatPreviewLoadingWidget.d.ts +3 -3
  236. package/dist/widgets/ChatPreviewWidget/ChatPreviewWidget.cjs +34 -4
  237. package/dist/widgets/ChatPreviewWidget/ChatPreviewWidget.d.cts +3 -3
  238. package/dist/widgets/ChatPreviewWidget/ChatPreviewWidget.d.ts +3 -3
  239. package/dist/widgets/ChatPreviewWidget/ChatPreviewWidget.js +35 -5
  240. package/dist/widgets/FloatingChatWidget/FloatingChatOverlay.cjs +0 -2
  241. package/dist/widgets/FloatingChatWidget/FloatingChatOverlay.js +0 -2
  242. package/dist/widgets/FloatingChatWidget/FloatingChatWidget.cjs +31 -7
  243. package/dist/widgets/FloatingChatWidget/FloatingChatWidget.d.cts +2 -2
  244. package/dist/widgets/FloatingChatWidget/FloatingChatWidget.js +32 -8
  245. package/dist/widgets/FullPageSalesAgentWidget/FullPageSalesAgentWidget.d.cts +2 -2
  246. package/dist/widgets/FullPageSalesAgentWidget/FullPageSalesAgentWidget.d.ts +2 -2
  247. package/dist/widgets/ProductCardWidget/ProductCardWidget.cjs +25 -3
  248. package/dist/widgets/ProductCardWidget/ProductCardWidget.d.cts +2 -2
  249. package/dist/widgets/ProductCardWidget/ProductCardWidget.d.ts +2 -2
  250. package/dist/widgets/ProductCardWidget/ProductCardWidget.js +25 -3
  251. package/dist/widgets/PromptButtonCarouselWithImageWidget/PromptButtonCarouselWithImageWidget.cjs +23 -4
  252. package/dist/widgets/PromptButtonCarouselWithImageWidget/PromptButtonCarouselWithImageWidget.d.cts +3 -3
  253. package/dist/widgets/PromptButtonCarouselWithImageWidget/PromptButtonCarouselWithImageWidget.d.ts +3 -3
  254. package/dist/widgets/PromptButtonCarouselWithImageWidget/PromptButtonCarouselWithImageWidget.js +23 -4
  255. package/dist/widgets/PromptCarouselWidget/PromptCarouselWidget.cjs +15 -3
  256. package/dist/widgets/PromptCarouselWidget/PromptCarouselWidget.d.cts +2 -2
  257. package/dist/widgets/PromptCarouselWidget/PromptCarouselWidget.d.ts +2 -2
  258. package/dist/widgets/PromptCarouselWidget/PromptCarouselWidget.js +17 -5
  259. package/dist/widgets/SocialProofFlowWidget/SocialProofFlowWidget.d.cts +2 -2
  260. package/dist/widgets/SocialProofFlowWidget/SocialProofFlowWidget.d.ts +2 -2
  261. package/dist/widgets/SocialProofWidget/SocialProofWidget.cjs +53 -6
  262. package/dist/widgets/SocialProofWidget/SocialProofWidget.d.ts +3 -3
  263. package/dist/widgets/SocialProofWidget/SocialProofWidget.js +54 -7
  264. package/dist/widgets/TitledPromptCarouselWidget/TitledPromptCarouselWidget.cjs +10 -1
  265. package/dist/widgets/TitledPromptCarouselWidget/TitledPromptCarouselWidget.d.cts +2 -2
  266. package/dist/widgets/TitledPromptCarouselWidget/TitledPromptCarouselWidget.d.ts +2 -2
  267. package/dist/widgets/TitledPromptCarouselWidget/TitledPromptCarouselWidget.js +11 -2
  268. package/dist/widgets/TypingAnimationFlowWidget/TypingAnimationFlowWidget.d.ts +2 -2
  269. package/dist/widgets/TypingAnimationWidget/TypingAnimationWidget.cjs +24 -3
  270. package/dist/widgets/TypingAnimationWidget/TypingAnimationWidget.d.cts +3 -3
  271. package/dist/widgets/TypingAnimationWidget/TypingAnimationWidget.d.ts +3 -3
  272. package/dist/widgets/TypingAnimationWidget/TypingAnimationWidget.js +25 -4
  273. package/dist/widgets/dist/SearchResults/SearchResults.d.cts +4 -3
  274. package/dist/widgets/dist/SearchResults/SearchResultsWidget.d.cts +2 -2
  275. package/dist/widgets/dist/SearchZeroState/SearchZeroStateWidget.d.cts +2 -2
  276. package/dist/widgets/dist/SearchZeroState/types.d.cts +2 -2
  277. package/dist/widgets/dist/SuggestionBar/SuggestionBar.d.cts +3 -3
  278. package/dist/widgets/dist/SuggestionButtonContainer/types.d.cts +3 -2
  279. package/dist/widgets/dist/packages/hooks/dist/application/models/api/response.d.cts +14 -0
  280. package/dist/widgets/dist/packages/hooks/dist/application/models/api/search.d.cts +15 -0
  281. package/dist/widgets/dist/packages/hooks/dist/application/models/utilityTypes/camelCase.d.cts +73 -0
  282. package/dist/widgets/dist/packages/hooks/dist/application/models/utilityTypes/camelCasedPropertiesDeep.d.cts +61 -0
  283. package/dist/widgets/dist/packages/hooks/dist/application/models/utilityTypes/internal.d.cts +25 -0
  284. package/dist/widgets/dist/packages/hooks/dist/application/models/utilityTypes/splitWords.d.cts +35 -0
  285. package/dist/widgets/dist/packages/hooks/dist/application/models/utilityTypes/trim.d.cts +32 -0
  286. package/dist/widgets/dist/packages/hooks/dist/application/models/utilityTypes/unknownArray.d.cts +32 -0
  287. package/dist/widgets/dist/packages/hooks/dist/atoms/search/searchAPI.d.cts +14 -0
  288. package/dist/widgets/dist/packages/hooks/dist/contexts/types.d.cts +61 -0
  289. package/dist/widgets/dist/packages/hooks/dist/hooks/Search/useSearch.d.cts +60 -0
  290. package/dist/widgets/dist/packages/hooks/dist/hooks/utils.d.cts +12 -0
  291. package/dist/widgets/dist/packages/hooks/dist/types/search-filter-types.d.cts +28 -0
  292. package/dist/widgets/dist/packages/hooks/dist/types/test-types.d.cts +10 -0
  293. package/dist/widgets/hooks/useGetWidgetStatus.cjs +1 -1
  294. package/dist/widgets/hooks/useGetWidgetStatus.js +1 -1
  295. package/dist/widgets/utils/functions.cjs +0 -14
  296. package/dist/widgets/utils/functions.js +1 -14
  297. package/dist/widgets-v2/SearchZeroState/index.d.cts +2 -1
  298. package/dist/widgets-v2/SearchZeroState/index.d.ts +2 -1
  299. package/dist/widgets-v2/SuggestionButtonContainer/index.d.ts +1 -0
  300. package/package.json +4 -4
  301. package/src/hocs/withBaseWidget/__tests__/withBaseWidget.test.tsx +68 -302
  302. package/src/hocs/withBaseWidget/types.ts +6 -6
  303. package/src/hocs/withBaseWidget/withBaseWidget.tsx +46 -61
  304. package/src/widgets/ChatPreviewComparisonWidget/ChatPreviewComparisonWidget.tsx +59 -8
  305. package/src/widgets/ChatPreviewWidget/ChatPreviewWidget.tsx +54 -18
  306. package/src/widgets/ChatPreviewWidget/__tests__/ChatPreviewWidget.test.tsx +11 -5
  307. package/src/widgets/FloatingChatWidget/FloatingChatOverlay.tsx +48 -19
  308. package/src/widgets/FloatingChatWidget/FloatingChatWidget.tsx +100 -52
  309. package/src/widgets/FloatingChatWidget/__tests__/FloatingChatWidget.test.tsx +11 -5
  310. package/src/widgets/ProductCardWidget/ProductCardWidget.tsx +37 -16
  311. package/src/widgets/ProductCardWidget/__tests__/ProductCardWidget.test.tsx +12 -8
  312. package/src/widgets/PromptButtonCarouselWithImageWidget/PromptButtonCarouselWithImageWidget.tsx +38 -19
  313. package/src/widgets/PromptButtonCarouselWithImageWidget/__tests__/PromptButtonCarouselWithImageWidget.test.tsx +19 -8
  314. package/src/widgets/PromptCarouselWidget/PromptCarouselWidget.tsx +32 -19
  315. package/src/widgets/PromptCarouselWidget/__tests__/PromptCarouselWidget.test.tsx +21 -8
  316. package/src/widgets/SocialProofWidget/SocialProofWidget.tsx +77 -18
  317. package/src/widgets/SocialProofWidget/__tests__/SocialProofWidget.test.tsx +19 -8
  318. package/src/widgets/TitledPromptCarouselWidget/TitledPromptCarouselWidget.tsx +23 -19
  319. package/src/widgets/TitledPromptCarouselWidget/__tests__/TitledPromptCarouselWidget.test.tsx +19 -8
  320. package/src/widgets/TypingAnimationWidget/TypingAnimationWidget.tsx +45 -21
  321. package/src/widgets/TypingAnimationWidget/__tests__/TypingAnimationWidget.test.tsx +19 -8
  322. package/src/widgets/__tests__/trackEventCanary.test.ts +1 -1
  323. package/dist/packages/icons/dist/_virtual/rolldown_runtime.cjs +0 -27
  324. package/dist/packages/icons/dist/_virtual/rolldown_runtime.js +0 -25
  325. package/dist/packages/icons/dist/node_modules/react/cjs/react-jsx-runtime.development.cjs +0 -696
  326. package/dist/packages/icons/dist/node_modules/react/cjs/react-jsx-runtime.development.js +0 -696
  327. package/dist/packages/icons/dist/node_modules/react/cjs/react-jsx-runtime.production.min.cjs +0 -43
  328. package/dist/packages/icons/dist/node_modules/react/cjs/react-jsx-runtime.production.min.js +0 -43
  329. package/dist/packages/icons/dist/node_modules/react/cjs/react.development.cjs +0 -1528
  330. package/dist/packages/icons/dist/node_modules/react/cjs/react.development.js +0 -1528
  331. package/dist/packages/icons/dist/node_modules/react/cjs/react.production.min.cjs +0 -329
  332. package/dist/packages/icons/dist/node_modules/react/cjs/react.production.min.js +0 -329
  333. package/dist/packages/icons/dist/node_modules/react/index.cjs +0 -13
  334. package/dist/packages/icons/dist/node_modules/react/index.js +0 -13
  335. package/dist/packages/icons/dist/node_modules/react/jsx-runtime.cjs +0 -13
  336. package/dist/packages/icons/dist/node_modules/react/jsx-runtime.js +0 -13
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AnimatePresence, motion } from 'framer-motion';
3
+ import classNames from 'classnames';
4
+ import { useCheckIsMobile } from '@envive-ai/react-toolkit-v3/utils/useCheckIsMobile';
5
+ const ANIMATION_DURATION = 0.3;
6
+ const useOverlayAnimations = ({ previewMode, isMobile, }) => {
7
+ if (previewMode) {
8
+ return {
9
+ overlayExitAnimation: { opacity: 0, x: 0 },
10
+ overlayAnimation: { opacity: 1, x: 0 },
11
+ };
12
+ }
13
+ if (isMobile) {
14
+ return {
15
+ overlayExitAnimation: { opacity: 0 },
16
+ overlayAnimation: { opacity: 1 },
17
+ };
18
+ }
19
+ return {
20
+ overlayExitAnimation: { opacity: 0, x: 512 },
21
+ overlayAnimation: { opacity: 1, x: 0 },
22
+ };
23
+ };
24
+ export const FloatingChatOverlay = ({ children, isOpened, onClose, className, dataTestId, previewMode = false, isResultsModalOpen = false, }) => {
25
+ const { isMobile } = useCheckIsMobile();
26
+ const { overlayExitAnimation, overlayAnimation } = useOverlayAnimations({
27
+ previewMode,
28
+ isMobile,
29
+ });
30
+ const overlayClasses = classNames(previewMode ? 'envive-tw-absolute' : 'envive-tw-fixed', 'envive-tw-top-0', 'envive-tw-left-0', previewMode ? 'envive-tw-h-full' : 'envive-tw-h-screen', 'envive-tw-w-full', 'envive-tw-z-[2147483647]', className);
31
+ const backdropClasses = classNames('envive-tw-absolute', 'envive-tw-top-0', 'envive-tw-left-0', 'envive-tw-h-full', 'envive-tw-w-full', isMobile ? 'envive-tw-bg-black' : '', 'envive-tw-opacity-50', 'envive-tw-pointer-events-none', 'envive-tw-z-0');
32
+ const overlayContentClasses = classNames('envive-tw-relative', 'envive-tw-flex', 'envive-tw-justify-end', 'envive-tw-items-stretch', 'envive-tw-h-full', 'envive-tw-w-full', 'envive-tw-pointer-events-auto', 'envive-tw-cursor-pointer', 'envive-tw-z-10');
33
+ const chatWrapper = (_jsx(AnimatePresence, { children: isOpened && (_jsxs(motion.div, { className: overlayClasses, style: { top: '0px' }, initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: ANIMATION_DURATION }, "data-testid": dataTestId, children: [!previewMode && (_jsx(motion.div, { className: backdropClasses, initial: { opacity: 0 }, animate: { opacity: 0.5 }, exit: { opacity: 0 }, transition: { duration: ANIMATION_DURATION }, "aria-label": "Close chat" })), _jsx("div", { className: overlayContentClasses, style: { top: '0px' }, onClick: onClose, onKeyDown: e => {
34
+ if (e.key === 'Escape') {
35
+ onClose();
36
+ }
37
+ }, role: "button", tabIndex: 0, "aria-label": "Close floating chat", children: _jsx(motion.div, { initial: overlayExitAnimation, animate: overlayAnimation, exit: overlayExitAnimation, transition: { duration: ANIMATION_DURATION }, style: {
38
+ height: previewMode ? '100%' : '100dvh',
39
+ cursor: 'default',
40
+ margin: isResultsModalOpen ? '0 auto' : '0',
41
+ }, className: "envive-tw-shadow-md", onClick: e => e.stopPropagation(), children: children }) })] }, "floating-chat-overlay")) }));
42
+ return chatWrapper;
43
+ };
44
+ FloatingChatOverlay.displayName = 'FloatingChatOverlay';
@@ -0,0 +1,8 @@
1
+ export interface FloatingChatWidgetProps {
2
+ previewButtonOnly?: boolean;
3
+ previewChatAlwaysOpen?: boolean;
4
+ }
5
+ export declare const FloatingChatWidget: {
6
+ ({ previewButtonOnly, previewChatAlwaysOpen, }?: FloatingChatWidgetProps): import("react/jsx-runtime").JSX.Element;
7
+ displayName: string;
8
+ };
@@ -0,0 +1,134 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ChatElementDisplayLocationV3 } from '@envive-ai/react-hooks/application/models';
3
+ import { EnviveMetricsEventName, SpiffyMetricsEventName, useAmplitude, } from '@envive-ai/react-hooks/contexts/amplitudeContext';
4
+ import { useSalesAgent } from '@envive-ai/react-hooks/contexts/salesAgentContext';
5
+ import { WidgetTypeV3, } from '@envive-ai/react-hooks/contexts/typesV3';
6
+ import { useChatToggle } from '@envive-ai/react-hooks/hooks/ChatToggle';
7
+ import { useWidgetInteraction } from '@envive-ai/react-hooks/hooks/WidgetInteraction';
8
+ import { WidgetInteractionComponent, WidgetInteractionType, } from '@envive-ai/react-hooks/hooks/WidgetInteraction/types';
9
+ import { FloatingButton, } from '@envive-ai/react-toolkit-v3/FloatingButton';
10
+ import { Theme } from '@envive-ai/react-toolkit-v3/Tokens';
11
+ import { Suspense, lazy, useEffect, useMemo, useRef, useState } from 'react';
12
+ import { DebugBar } from 'src/debug/debugBar';
13
+ import { useUnifiedCXButton } from '../../CXIntegration/hooks/useUnifiedCXButton';
14
+ import { CustomerServiceType } from '../../CXIntegration/types';
15
+ import { withBaseWidget } from '../../hocs/withBaseWidget';
16
+ import useGetWidgetStatus from '../hooks/useGetWidgetStatus';
17
+ import { FLOATING_BUTTON_ID } from './constants';
18
+ import { FloatingChatOverlay } from './FloatingChatOverlay';
19
+ import { useFloatingButtonVisibility } from './hooks/useFloatingButtonVisibility';
20
+ import { useAutoPopup } from './hooks/useAutoPopup';
21
+ const FloatingChat = lazy(async () => ({
22
+ default: (await import('@envive-ai/react-toolkit-v3/FloatingChat')).FloatingChat,
23
+ }));
24
+ /**
25
+ * Wrapper component that isolates the useUnifiedCXButton hook call.
26
+ * Provider implementations use different React hooks internally, so the
27
+ * provider value must be stable across renders. Use a `key` prop based on
28
+ * provider to force a clean remount when the provider changes.
29
+ */
30
+ const CXButtonProvider = ({ provider, enabled, suppressMerchantButton, onSwitchToAgent, onCXClose, children, }) => {
31
+ const unifiedCXButton = useUnifiedCXButton({
32
+ provider,
33
+ enabled,
34
+ suppressMerchantButton,
35
+ onSwitchToAgent,
36
+ onCXClose,
37
+ });
38
+ const { isSwitchEnabled, toggle } = unifiedCXButton ?? {};
39
+ return _jsx(_Fragment, { children: children({ isSwitchEnabled, toggle }) });
40
+ };
41
+ const FloatingChatWidgetHandler = (props) => {
42
+ const { previewButtonOnly, previewChatAlwaysOpen } = props;
43
+ const salesAgentData = useSalesAgent();
44
+ const { trackWidgetInteraction } = useWidgetInteraction();
45
+ const { userHasInteractedValue } = useGetWidgetStatus();
46
+ // TODO: Get hardcopy
47
+ const { uiConfig, isUiConfigLoading, hardcopyContent } = props;
48
+ const { customerServiceIntegration, floatingButton, floatingChat } = uiConfig ?? {};
49
+ const cxProvider = customerServiceIntegration?.provider ??
50
+ CustomerServiceType.unsupported;
51
+ // TODO: Get hardcopy content
52
+ const { isOpen, openChat, closeChat, onHover } = useChatToggle();
53
+ const [isCXOpen, setIsCXOpen] = useState(false);
54
+ const [isResultsModalOpen, setIsResultsModalOpen] = useState(false);
55
+ // Reset CX open state when the envive widget is reopened
56
+ useEffect(() => {
57
+ if (isOpen)
58
+ setIsCXOpen(false);
59
+ }, [isOpen]);
60
+ const handleClose = (type) => {
61
+ trackWidgetInteraction({
62
+ eventName: EnviveMetricsEventName.WidgetInteraction,
63
+ trigger: {
64
+ widget: WidgetInteractionComponent.FLOATING_CHAT,
65
+ widget_interaction: WidgetInteractionType.WIDGET_COLLAPSED,
66
+ widget_interaction_data: {
67
+ widget_collapsed: type,
68
+ },
69
+ },
70
+ });
71
+ };
72
+ const { shouldShowFloatingButton } = useFloatingButtonVisibility({
73
+ floatingButtonShowConfig: floatingButton?.showOption,
74
+ isChatOpen: isOpen,
75
+ userHasInteracted: userHasInteractedValue,
76
+ });
77
+ // Override isOpen for preview modes
78
+ const effectiveIsOpen = previewChatAlwaysOpen ? true : isOpen;
79
+ const effectiveShouldRenderFloatingButton = !effectiveIsOpen && shouldShowFloatingButton;
80
+ const buttonShouldRender = previewButtonOnly
81
+ ? true
82
+ : effectiveShouldRenderFloatingButton && !isCXOpen;
83
+ const theme = useMemo(() => {
84
+ if (isUiConfigLoading || !uiConfig) {
85
+ return Theme.STANDARD;
86
+ }
87
+ return uiConfig?.lookAndFeel?.theme ?? Theme.GLOBAL_CUSTOM;
88
+ }, [isUiConfigLoading, uiConfig]);
89
+ useAutoPopup({ autoPopupConfig: floatingChat?.autoPopupConfig });
90
+ const { trackEvent } = useAmplitude();
91
+ const hasTrackedEvent = useRef(false);
92
+ // When we add support for initially hidden floating buttons, we will need to update this to handle that case
93
+ useEffect(() => {
94
+ if (buttonShouldRender && !hasTrackedEvent.current) {
95
+ trackEvent({
96
+ eventName: SpiffyMetricsEventName.ChatComponentVisible,
97
+ eventProps: {
98
+ widget_config_id: 'floating-button',
99
+ widget_type: WidgetTypeV3.FloatingButtonV3,
100
+ },
101
+ });
102
+ hasTrackedEvent.current = true;
103
+ }
104
+ }, [trackEvent, buttonShouldRender]);
105
+ return (_jsx(CXButtonProvider, { provider: cxProvider, enabled: customerServiceIntegration?.enabled ?? false, suppressMerchantButton: customerServiceIntegration?.suppressMerchantButton ?? false, onSwitchToAgent: () => setIsCXOpen(true), onCXClose: () => setIsCXOpen(false), children: ({ isSwitchEnabled, toggle }) => (_jsxs(_Fragment, { children: [!previewButtonOnly && (_jsx(FloatingChatOverlay, { isOpened: effectiveIsOpen, isResultsModalOpen: isResultsModalOpen, onClose: previewChatAlwaysOpen
106
+ ? () => { }
107
+ : () => {
108
+ closeChat(ChatElementDisplayLocationV3.FLOATING_CHAT_OVERLAY);
109
+ handleClose({
110
+ collapse_source: 'body_click',
111
+ });
112
+ }, previewMode: !!previewChatAlwaysOpen, children: _jsx(Suspense, { children: _jsx(FloatingChat, { setIsResultsModalOpen: setIsResultsModalOpen, theme: theme, salesAgentData: salesAgentData, hardcopyContent: hardcopyContent, floatingChatConfig: uiConfig?.floatingChat ?? {}, lookAndFeelConfig: uiConfig?.lookAndFeel ?? {}, isCXButtonSwitchEnabled: !!isSwitchEnabled?.(), isFloatingChatOpen: effectiveIsOpen, onToggleCXButton: toggle, debugBar: _jsx(DebugBar, {}), onSwipeClose: previewChatAlwaysOpen
113
+ ? () => { }
114
+ : () => {
115
+ closeChat(ChatElementDisplayLocationV3.FLOATING_CHAT_CLOSE_BUTTON);
116
+ handleClose({
117
+ collapse_source: 'swipe',
118
+ });
119
+ }, onClose: previewChatAlwaysOpen
120
+ ? () => { }
121
+ : () => {
122
+ closeChat(ChatElementDisplayLocationV3.FLOATING_CHAT_CLOSE_BUTTON);
123
+ handleClose({
124
+ collapse_source: 'close_button',
125
+ });
126
+ } }) }) })), buttonShouldRender && (_jsx(FloatingButton, { id: FLOATING_BUTTON_ID, variant: floatingButton?.style, mode: floatingButton?.mode, backgroundColor: floatingButton?.backgroundColor, onClick: previewButtonOnly
127
+ ? () => { }
128
+ : () => openChat(ChatElementDisplayLocationV3.FLOATING_BUTTON), onMouseOver: onHover, customIcon: floatingButton?.iconSVGSrc, show: floatingButton?.showOption, location: floatingButton?.position, hasInteractionHappened: userHasInteractedValue, ariaLabel: "Open chat", previewMode: !!previewButtonOnly }))] })) }, cxProvider));
129
+ };
130
+ const FloatingChatWidgetWithBaseWidget = withBaseWidget(FloatingChatWidgetHandler);
131
+ export const FloatingChatWidget = ({ previewButtonOnly, previewChatAlwaysOpen, } = {}) => {
132
+ return (_jsx(FloatingChatWidgetWithBaseWidget, { widgetType: WidgetTypeV3.FloatingChatV3, widgetConfigId: "fake-widget-config-id", previewButtonOnly: previewButtonOnly, previewChatAlwaysOpen: previewChatAlwaysOpen }));
133
+ };
134
+ FloatingChatWidget.displayName = 'FloatingChatWidget';
@@ -0,0 +1,100 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { render, waitFor } from '@testing-library/react';
3
+ import { SpiffyMetricsEventName } from '@envive-ai/react-hooks/contexts/amplitudeContext';
4
+ import { WidgetTypeV3 } from '@envive-ai/react-hooks/contexts/typesV3';
5
+ import { UserEventCategory } from '@spiffy-ai/commerce-api-client';
6
+ import { FloatingChatWidget } from '../FloatingChatWidget';
7
+ const mockTrackEvent = vi.fn();
8
+ const mockGetHardcopy = vi.fn();
9
+ vi.mock('@envive-ai/react-toolkit-v3/FloatingButton', () => ({
10
+ FloatingButton: () => _jsx("div", { "data-testid": "floating-button", children: "Floating Button" }),
11
+ }));
12
+ vi.mock('@envive-ai/react-hooks/contexts/amplitudeContext', () => ({
13
+ useAmplitude: () => ({
14
+ trackEvent: mockTrackEvent,
15
+ isReady: true,
16
+ }),
17
+ SpiffyMetricsEventName: {
18
+ ChatComponentVisible: 'Chat Component Visible',
19
+ SearchComponentVisible: 'Search Component Visible',
20
+ },
21
+ }));
22
+ vi.mock('@envive-ai/react-hooks/contexts/hardcopyContext', () => ({
23
+ useHardcopy: () => ({
24
+ getHardcopy: mockGetHardcopy,
25
+ }),
26
+ }));
27
+ vi.mock('@envive-ai/react-hooks/contexts/pageContext', () => ({
28
+ usePage: () => ({
29
+ userEvent: {
30
+ id: 'test-user-event-id',
31
+ category: UserEventCategory.PageVisit,
32
+ created_at: '2025-01-01T00:00:00Z',
33
+ event_id: 'test-event-id',
34
+ },
35
+ }),
36
+ }));
37
+ vi.mock('@envive-ai/react-hooks/contexts/widgetConfigContext', () => ({
38
+ useWidgetConfig: () => ({
39
+ getWidgetConfig: vi.fn().mockResolvedValue({}),
40
+ }),
41
+ }));
42
+ vi.mock('@envive-ai/react-hooks/contexts/uiConfigContext', () => ({
43
+ useUiConfig: () => ({
44
+ getUiConfig: vi.fn().mockResolvedValue({
45
+ floatingButton: { showOption: 'always', position: 'bottom-right' },
46
+ floatingChat: {},
47
+ lookAndFeel: {},
48
+ }),
49
+ }),
50
+ }));
51
+ vi.mock('@envive-ai/react-hooks/contexts/salesAgentContext', () => ({
52
+ useSalesAgent: () => ({}),
53
+ }));
54
+ vi.mock('@envive-ai/react-hooks/hooks/ChatToggle', () => ({
55
+ useChatToggle: () => ({
56
+ isOpen: false,
57
+ openChat: vi.fn(),
58
+ closeChat: vi.fn(),
59
+ }),
60
+ }));
61
+ vi.mock('../hooks/useFloatingButtonVisibility', () => ({
62
+ useFloatingButtonVisibility: () => ({
63
+ shouldShowFloatingButton: true,
64
+ }),
65
+ }));
66
+ vi.mock('../hooks/useAutoPopup', () => ({
67
+ useAutoPopup: () => { },
68
+ }));
69
+ vi.mock('../../hooks/useGetWidgetStatus', () => ({
70
+ default: () => ({
71
+ userHasInteractedValue: false,
72
+ }),
73
+ }));
74
+ vi.mock('src/debug/debugBar', () => ({
75
+ DebugBar: () => null,
76
+ }));
77
+ vi.mock('../../CXIntegration/hooks/useUnifiedCXButton', () => ({
78
+ useUnifiedCXButton: () => ({
79
+ isSwitchEnabled: () => false,
80
+ toggle: vi.fn(),
81
+ }),
82
+ }));
83
+ describe('FloatingChatWidget analytics', () => {
84
+ beforeEach(() => {
85
+ vi.clearAllMocks();
86
+ mockGetHardcopy.mockResolvedValue({ language: 'en', values: {} });
87
+ });
88
+ it('should track ChatComponentVisible when floating button is shown', async () => {
89
+ render(_jsx(FloatingChatWidget, { previewButtonOnly: true }));
90
+ await waitFor(() => {
91
+ expect(mockTrackEvent).toHaveBeenCalledWith({
92
+ eventName: SpiffyMetricsEventName.ChatComponentVisible,
93
+ eventProps: {
94
+ widget_config_id: 'floating-button',
95
+ widget_type: WidgetTypeV3.FloatingButtonV3,
96
+ },
97
+ });
98
+ }, { timeout: 3000 });
99
+ }, 5000);
100
+ });
@@ -0,0 +1 @@
1
+ export declare const FLOATING_BUTTON_ID = "envive-ai-floating-button";
@@ -0,0 +1 @@
1
+ export const FLOATING_BUTTON_ID = 'envive-ai-floating-button';
@@ -0,0 +1,4 @@
1
+ import { AutoPopupConfig } from '@envive-ai/react-hooks/contexts/typesV3';
2
+ export declare const useAutoPopup: ({ autoPopupConfig }: {
3
+ autoPopupConfig?: AutoPopupConfig;
4
+ }) => void;
@@ -0,0 +1,51 @@
1
+ import { useCallback, useEffect, useMemo, useRef } from 'react';
2
+ import { useFeatureFlagService } from '@envive-ai/react-hooks/contexts/featureFlagServiceContext';
3
+ import { useChatToggle } from '@envive-ai/react-hooks/hooks/ChatToggle';
4
+ import { ChatElementDisplayLocationV3, FeatureGates, } from '@envive-ai/react-hooks/application/models';
5
+ export const useAutoPopup = ({ autoPopupConfig }) => {
6
+ const { isOpen, openChat } = useChatToggle();
7
+ const { featureFlagService } = useFeatureFlagService();
8
+ const hasBeenOpenedRef = useRef(false);
9
+ const autoPopupTimerRef = useRef(null);
10
+ const isReferrerBasedPromptEnabled = useMemo(() => featureFlagService.isFeatureGateEnabled(FeatureGates.IsReferrerBasedPromptEnabled), [featureFlagService]);
11
+ useEffect(() => {
12
+ if (!hasBeenOpenedRef.current && isOpen) {
13
+ hasBeenOpenedRef.current = true;
14
+ }
15
+ }, [isOpen]);
16
+ const openChatSafely = useCallback((triggerLocation) => {
17
+ if (!hasBeenOpenedRef.current) {
18
+ hasBeenOpenedRef.current = true;
19
+ openChat(triggerLocation);
20
+ }
21
+ }, [openChat]);
22
+ useEffect(() => {
23
+ const cleanup = () => {
24
+ if (autoPopupTimerRef.current) {
25
+ clearTimeout(autoPopupTimerRef.current);
26
+ }
27
+ };
28
+ if (!autoPopupConfig || hasBeenOpenedRef.current) {
29
+ return cleanup;
30
+ }
31
+ for (const trigger of autoPopupConfig.triggers) {
32
+ if (trigger.trigger.type === 'referrer') {
33
+ if (!isReferrerBasedPromptEnabled) {
34
+ break;
35
+ }
36
+ const utmSource = new URLSearchParams(window.location.search).get('utm_source');
37
+ if (trigger.trigger.referrers.includes(utmSource)) {
38
+ autoPopupTimerRef.current = setTimeout(() => {
39
+ openChatSafely(ChatElementDisplayLocationV3.REFERRER_BASED_PROMPT);
40
+ }, trigger.delay);
41
+ }
42
+ }
43
+ if (trigger.trigger.type === 'automatic') {
44
+ autoPopupTimerRef.current = setTimeout(() => {
45
+ openChatSafely(ChatElementDisplayLocationV3.AUTOMATIC_PROMPT);
46
+ }, trigger.delay);
47
+ }
48
+ }
49
+ return cleanup;
50
+ }, [autoPopupConfig, isOpen, isReferrerBasedPromptEnabled, openChatSafely]);
51
+ };
@@ -0,0 +1,11 @@
1
+ import { FloatingButtonShow } from '@envive-ai/react-toolkit-v3/FloatingButton';
2
+ export interface UseFloatingButtonVisibilityProps {
3
+ floatingButtonShowConfig?: FloatingButtonShow;
4
+ isChatOpen: boolean;
5
+ userHasInteracted: boolean;
6
+ }
7
+ export interface UseFloatingButtonVisibilityReturn {
8
+ shouldShowFloatingButton: boolean;
9
+ isSalesAgentEnabled: boolean;
10
+ }
11
+ export declare const useFloatingButtonVisibility: ({ floatingButtonShowConfig, isChatOpen, userHasInteracted, }: UseFloatingButtonVisibilityProps) => UseFloatingButtonVisibilityReturn;
@@ -0,0 +1,21 @@
1
+ import { FeatureGates } from '@envive-ai/react-hooks/application/models';
2
+ import { variantInfoAtom } from '@envive-ai/react-hooks/atoms/app';
3
+ import { featureFlagServiceAtom } from '@envive-ai/react-hooks/atoms/org';
4
+ import { FloatingButtonShow } from '@envive-ai/react-toolkit-v3/FloatingButton';
5
+ import { useAtom, useAtomValue } from 'jotai';
6
+ import { useMemo } from 'react';
7
+ export const useFloatingButtonVisibility = ({ floatingButtonShowConfig = FloatingButtonShow.ALWAYS, isChatOpen, userHasInteracted, }) => {
8
+ const featureFlagService = useAtomValue(featureFlagServiceAtom);
9
+ const [variantInfo] = useAtom(variantInfoAtom);
10
+ const internalfloatingButtonShowConfig = variantInfo.floatingButtonOverride ?? floatingButtonShowConfig;
11
+ const isSalesAgentEnabled = useMemo(() => featureFlagService?.featureFlagService?.isFeatureGateEnabled(FeatureGates.IsSalesAgentEnabled), [featureFlagService]);
12
+ const shouldShowFloatingButton = (isSalesAgentEnabled || isSalesAgentEnabled === undefined) &&
13
+ !isChatOpen &&
14
+ (internalfloatingButtonShowConfig === FloatingButtonShow.ALWAYS ||
15
+ (internalfloatingButtonShowConfig === FloatingButtonShow.POST_INTERACTION &&
16
+ userHasInteracted));
17
+ return {
18
+ shouldShowFloatingButton,
19
+ isSalesAgentEnabled,
20
+ };
21
+ };
@@ -0,0 +1,4 @@
1
+ import { FloatingChatWidget } from './FloatingChatWidget';
2
+ export { FloatingChatWidget };
3
+ export type { FloatingChatWidgetProps } from './FloatingChatWidget';
4
+ export { FLOATING_BUTTON_ID } from './constants';
@@ -0,0 +1,3 @@
1
+ import { FloatingChatWidget } from './FloatingChatWidget';
2
+ export { FloatingChatWidget };
3
+ export { FLOATING_BUTTON_ID } from './constants';
@@ -0,0 +1,12 @@
1
+ import { BaseWidgetProps } from 'src/hocs/withBaseWidget';
2
+ export declare const FullPageSalesAgentBaseWidget: {
3
+ (props: BaseWidgetProps): import("react/jsx-runtime").JSX.Element;
4
+ displayName: string;
5
+ };
6
+ export interface FullPageSalesAgentBaseWidgetProps {
7
+ widgetConfigId: string;
8
+ }
9
+ export declare const FullPageSalesAgentWidget: {
10
+ ({ widgetConfigId }: FullPageSalesAgentBaseWidgetProps): import("react/jsx-runtime").JSX.Element;
11
+ displayName: string;
12
+ };
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { WidgetTypeV3, } from '@envive-ai/react-hooks/contexts/typesV3';
3
+ import { FullPageSalesAgent } from '@envive-ai/react-toolkit-v3/FullPageSalesAgent';
4
+ import { Theme } from '@envive-ai/react-toolkit-v3/Tokens';
5
+ import { withBaseWidget } from 'src/hocs/withBaseWidget';
6
+ const FullPageSalesAgentHandler = ({ uiConfig, hardcopyContent, widgetConfig, }) => {
7
+ const { headerContainer, autoHeight } = widgetConfig || {};
8
+ return (_jsx(FullPageSalesAgent, { theme: Theme.STANDARD, floatingChatConfig: uiConfig?.floatingChat ?? {}, lookAndFeelConfig: uiConfig?.lookAndFeel ?? {}, hardcopyContent: hardcopyContent, headerContainer: headerContainer, autoHeight: autoHeight }));
9
+ };
10
+ export const FullPageSalesAgentBaseWidget = withBaseWidget(FullPageSalesAgentHandler);
11
+ export const FullPageSalesAgentWidget = ({ widgetConfigId }) => {
12
+ return (_jsx(FullPageSalesAgentBaseWidget, { widgetConfigId: widgetConfigId, widgetType: WidgetTypeV3.FullPageSalesAgentV3 }));
13
+ };
14
+ FullPageSalesAgentWidget.displayName = 'FullPageSalesAgentWidget';
@@ -0,0 +1 @@
1
+ export { FullPageSalesAgentWidget } from './FullPageSalesAgentWidget';
@@ -0,0 +1 @@
1
+ export { FullPageSalesAgentWidget } from './FullPageSalesAgentWidget';
@@ -0,0 +1,7 @@
1
+ export interface ProductCardWidgetProps {
2
+ widgetConfigId: string;
3
+ }
4
+ export declare const ProductCardWidget: {
5
+ ({ widgetConfigId }: ProductCardWidgetProps): import("react/jsx-runtime").JSX.Element;
6
+ displayName: string;
7
+ };
@@ -0,0 +1,94 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { ChatElementDisplayLocationV3 } from '@envive-ai/react-hooks/application/models';
3
+ import { EnviveMetricsEventName, SpiffyMetricsEventName, useAmplitude, } from '@envive-ai/react-hooks/contexts/amplitudeContext';
4
+ import { useSalesAgent } from '@envive-ai/react-hooks/contexts/salesAgentContext';
5
+ import { WidgetTypeV3 } from '@envive-ai/react-hooks/contexts/typesV3';
6
+ import { useChatToggle } from '@envive-ai/react-hooks/hooks/ChatToggle';
7
+ import { useWidgetInteraction } from '@envive-ai/react-hooks/hooks/WidgetInteraction';
8
+ import { WidgetInteractionComponent, WidgetInteractionType, } from '@envive-ai/react-hooks/hooks/WidgetInteraction/types';
9
+ import { ProductCard } from '@envive-ai/react-toolkit-v3/ProductCard';
10
+ import { PromptButtonVariant } from '@envive-ai/react-toolkit-v3/PromptButton/types';
11
+ import { usePromptCarouselAnalytics } from '@envive-ai/react-toolkit-v3/PromptCarousel';
12
+ import { Theme } from '@envive-ai/react-toolkit-v3/Tokens';
13
+ import { useCallback, useEffect } from 'react';
14
+ import { withBaseWidget } from '../../hocs/withBaseWidget';
15
+ import { getStringIdForText } from '../utils/functions';
16
+ const mockPrompts = [
17
+ 'Loading prompt 1',
18
+ 'Loading prompt 2',
19
+ 'Loading prompt 3',
20
+ 'Loading prompt 4',
21
+ 'Loading prompt 5',
22
+ ];
23
+ const mockHeadline = 'Loading...';
24
+ const mockAnimatedText = ['Loading...'];
25
+ const ProductCardWidgetHandler = (props) => {
26
+ const { onTypedMessageSubmitted } = useSalesAgent();
27
+ const { openChat } = useChatToggle();
28
+ const { hardcopyContent, widgetConfig, isLoading } = props;
29
+ const hardCopyHeadline = hardcopyContent?.values?.headline;
30
+ const headline = isLoading ? mockHeadline : hardCopyHeadline || '';
31
+ const hardCopyAnimatedText = hardcopyContent?.values?.animatedText || [];
32
+ const animatedText = isLoading ? mockAnimatedText : hardCopyAnimatedText;
33
+ const hardCopyPrompts = hardcopyContent?.values?.prompts || [];
34
+ const prompts = isLoading ? mockPrompts : hardCopyPrompts;
35
+ const hardCopyPlaceholder = hardcopyContent?.values?.placeholder;
36
+ const placeholder = hardCopyPlaceholder;
37
+ const productCardWidgetConfig = widgetConfig;
38
+ const carouselId = productCardWidgetConfig?.contentId || '';
39
+ const promptButtonType = productCardWidgetConfig?.promptButtonType || PromptButtonVariant.LIGHT;
40
+ const italicizeHeadline = productCardWidgetConfig?.italicizeHeadline;
41
+ const fallbackColor = productCardWidgetConfig?.fallbackColor;
42
+ const imageSrc = productCardWidgetConfig?.imageSrc || '';
43
+ const { trackEvent } = useAmplitude();
44
+ const { trackWidgetInteraction } = useWidgetInteraction();
45
+ const { onClick: onSuggestionClick, onDrag, onHover, onMouseDown, onMouseUp, onTouchStart, onTouchEnd, } = usePromptCarouselAnalytics(WidgetInteractionComponent.IMAGE_PROMPT_CARD, text => {
46
+ const rawValues = hardcopyContent?.rawValues;
47
+ return getStringIdForText(rawValues, text);
48
+ });
49
+ const { widgetConfigId } = props;
50
+ useEffect(() => {
51
+ trackEvent({
52
+ eventName: SpiffyMetricsEventName.ChatComponentVisible,
53
+ eventProps: {
54
+ widget_config_id: widgetConfigId,
55
+ widget_type: WidgetTypeV3.ProductCardV3,
56
+ },
57
+ });
58
+ }, [trackEvent, widgetConfigId]);
59
+ const handleSelect = useCallback((text) => {
60
+ const rawValues = hardcopyContent?.rawValues;
61
+ const stringId = getStringIdForText(rawValues, text);
62
+ trackEvent({
63
+ eventName: EnviveMetricsEventName.WidgetTextClicked,
64
+ eventProps: {
65
+ response_id: hardcopyContent?.responseId,
66
+ string_id: stringId,
67
+ text,
68
+ },
69
+ });
70
+ onTypedMessageSubmitted({
71
+ query: text,
72
+ userTyped: false,
73
+ displayLocation: ChatElementDisplayLocationV3.PRODUCT_CARD_PROMPT_BUTTON,
74
+ });
75
+ openChat(ChatElementDisplayLocationV3.PRODUCT_CARD_PROMPT_BUTTON);
76
+ onSuggestionClick(text);
77
+ }, [hardcopyContent, onTypedMessageSubmitted, openChat, trackEvent]);
78
+ const handleInputClick = useCallback(() => {
79
+ openChat(ChatElementDisplayLocationV3.PRODUCT_CARD_TEXT_FIELD);
80
+ trackWidgetInteraction({
81
+ eventName: EnviveMetricsEventName.WidgetInteraction,
82
+ trigger: {
83
+ widget: WidgetInteractionComponent.IMAGE_PROMPT_CARD,
84
+ widget_interaction: WidgetInteractionType.QUERY_INPUT_CLICKED,
85
+ },
86
+ });
87
+ }, [openChat]);
88
+ return (_jsx(ProductCard, { theme: Theme.GLOBAL_CUSTOM, imageSrc: imageSrc, fallbackColor: fallbackColor, headline: headline, italicizeHeadline: italicizeHeadline, animatedText: animatedText, prompts: prompts, promptButtonType: promptButtonType, carouselId: carouselId, placeholder: placeholder, textTypingDuration: 800, textTransition: 2000, onSelect: handleSelect, onDrag: onDrag, onHover: onHover, onMouseDown: onMouseDown, onMouseUp: onMouseUp, onTouchStart: onTouchStart, onTouchEnd: onTouchEnd, onInputClick: handleInputClick }));
89
+ };
90
+ const ProductCardWidgetWithBaseWidget = withBaseWidget(ProductCardWidgetHandler);
91
+ export const ProductCardWidget = ({ widgetConfigId }) => {
92
+ return (_jsx(ProductCardWidgetWithBaseWidget, { widgetConfigId: widgetConfigId, widgetType: WidgetTypeV3.ProductCardV3 }));
93
+ };
94
+ ProductCardWidget.displayName = 'ProductCardWidget';