@envive-ai/react-widgets-v3 0.3.15-beta.0 → 0.3.15

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 (111) hide show
  1. package/dist/hocs/withBaseWidget/types.d.cts +3 -3
  2. package/dist/hocs/withBaseWidget/types.d.ts +3 -5
  3. package/dist/hocs/withBaseWidget/withBaseWidget.d.cts +2 -2
  4. package/dist/hocs/withBaseWidget/withBaseWidget.d.ts +2 -2
  5. package/dist/packages/widgets/dist/SearchResults/SearchResults.d.ts +2 -3
  6. package/dist/packages/widgets/dist/SearchResults/SearchResultsWidget.d.ts +2 -2
  7. package/dist/packages/widgets/dist/SearchZeroState/SearchZeroStateWidget.d.ts +2 -2
  8. package/dist/packages/widgets/dist/SearchZeroState/index.d.ts +1 -2
  9. package/dist/packages/widgets/dist/SearchZeroState/types.d.ts +2 -2
  10. package/dist/packages/widgets/dist/SuggestionBar/SuggestionBar.d.ts +3 -3
  11. package/dist/packages/widgets/dist/SuggestionButtonContainer/types.d.ts +2 -3
  12. package/dist/widgets/ChatPreviewComparisonWidget/ChatPreviewComparisonWidget.d.ts +3 -3
  13. package/dist/widgets/ChatPreviewLoadingWidget/ChatPreviewLoadingWidget.d.cts +3 -3
  14. package/dist/widgets/ChatPreviewLoadingWidget/ChatPreviewLoadingWidget.d.ts +3 -3
  15. package/dist/widgets/ChatPreviewWidget/ChatPreviewWidget.d.cts +3 -3
  16. package/dist/widgets/ChatPreviewWidget/ChatPreviewWidget.d.ts +3 -3
  17. package/dist/widgets/FloatingChatWidget/FloatingChatOverlay.cjs +0 -2
  18. package/dist/widgets/FloatingChatWidget/FloatingChatOverlay.js +0 -2
  19. package/dist/widgets/FloatingChatWidget/FloatingChatWidget.d.cts +2 -2
  20. package/dist/widgets/FloatingChatWidget/FloatingChatWidget.d.ts +2 -2
  21. package/dist/widgets/FullPageSalesAgentWidget/FullPageSalesAgentWidget.d.cts +2 -2
  22. package/dist/widgets/FullPageSalesAgentWidget/FullPageSalesAgentWidget.d.ts +2 -2
  23. package/dist/widgets/ProductCardWidget/ProductCardWidget.d.cts +2 -2
  24. package/dist/widgets/ProductCardWidget/ProductCardWidget.d.ts +2 -2
  25. package/dist/widgets/PromptButtonCarouselWithImageWidget/PromptButtonCarouselWithImageWidget.cjs +19 -0
  26. package/dist/widgets/PromptButtonCarouselWithImageWidget/PromptButtonCarouselWithImageWidget.d.cts +3 -3
  27. package/dist/widgets/PromptButtonCarouselWithImageWidget/PromptButtonCarouselWithImageWidget.d.ts +3 -3
  28. package/dist/widgets/PromptButtonCarouselWithImageWidget/PromptButtonCarouselWithImageWidget.js +19 -0
  29. package/dist/widgets/PromptCarouselWidget/PromptCarouselWidget.d.cts +2 -2
  30. package/dist/widgets/PromptCarouselWidget/PromptCarouselWidget.d.ts +2 -2
  31. package/dist/widgets/SocialProofFlowWidget/SocialProofFlowWidget.d.cts +2 -2
  32. package/dist/widgets/SocialProofFlowWidget/SocialProofFlowWidget.d.ts +2 -2
  33. package/dist/widgets/SocialProofWidget/SocialProofWidget.cjs +50 -3
  34. package/dist/widgets/SocialProofWidget/SocialProofWidget.d.cts +3 -3
  35. package/dist/widgets/SocialProofWidget/SocialProofWidget.d.ts +3 -3
  36. package/dist/widgets/SocialProofWidget/SocialProofWidget.js +51 -4
  37. package/dist/widgets/TitledPromptCarouselWidget/TitledPromptCarouselWidget.cjs +9 -0
  38. package/dist/widgets/TitledPromptCarouselWidget/TitledPromptCarouselWidget.d.cts +2 -2
  39. package/dist/widgets/TitledPromptCarouselWidget/TitledPromptCarouselWidget.d.ts +2 -2
  40. package/dist/widgets/TitledPromptCarouselWidget/TitledPromptCarouselWidget.js +10 -1
  41. package/dist/widgets/TypingAnimationFlowWidget/TypingAnimationFlowWidget.d.ts +2 -2
  42. package/dist/widgets/TypingAnimationWidget/TypingAnimationWidget.d.cts +3 -3
  43. package/dist/widgets/dist/SearchResults/SearchResults.d.cts +2 -3
  44. package/dist/widgets/dist/SearchResults/SearchResultsWidget.d.cts +2 -2
  45. package/dist/widgets/dist/SearchZeroState/SearchZeroStateWidget.d.cts +2 -2
  46. package/dist/widgets/dist/SearchZeroState/types.d.cts +2 -2
  47. package/dist/widgets/dist/SuggestionBar/SuggestionBar.d.cts +3 -3
  48. package/dist/widgets/dist/SuggestionButtonContainer/types.d.cts +2 -3
  49. package/dist/widgets/utils/functions.cjs +0 -14
  50. package/dist/widgets/utils/functions.js +1 -14
  51. package/dist/widgets-v2/SearchZeroState/index.d.cts +1 -2
  52. package/dist/widgets-v2/SearchZeroState/index.d.ts +1 -2
  53. package/dist/widgets-v2/SuggestionButtonContainer/index.d.ts +0 -1
  54. package/package.json +1 -1
  55. package/src/widgets/FloatingChatWidget/FloatingChatOverlay.tsx +0 -6
  56. package/src/widgets/PromptButtonCarouselWithImageWidget/PromptButtonCarouselWithImageWidget.tsx +38 -8
  57. package/src/widgets/PromptCarouselWidget/PromptCarouselWidget.tsx +3 -2
  58. package/src/widgets/SocialProofWidget/SocialProofWidget.tsx +77 -7
  59. package/src/widgets/TitledPromptCarouselWidget/TitledPromptCarouselWidget.tsx +23 -8
  60. package/dist/hooks/dist/application/models/api/widgetText.d.cts +0 -8
  61. package/dist/hooks/dist/contexts/hardcopyContext/hardcopyContext.d.cts +0 -12
  62. package/dist/hooks/dist/contexts/types.d.cts +0 -38
  63. package/dist/hooks/dist/contexts/typesV3.d.cts +0 -239
  64. package/dist/hooks/dist/services/amplitudeService/eventNames.d.cts +0 -43
  65. package/dist/hooks/dist/types/customerService.d.cts +0 -21
  66. package/dist/packages/hooks/dist/application/models/api/orgConfigResults.d.ts +0 -1
  67. package/dist/packages/hooks/dist/application/models/api/widgetText.d.ts +0 -8
  68. package/dist/packages/hooks/dist/application/models/frontendConfig.d.ts +0 -1
  69. package/dist/packages/hooks/dist/contexts/amplitudeContext/amplitudeContext.d.ts +0 -2
  70. package/dist/packages/hooks/dist/contexts/amplitudeContext/index.d.ts +0 -2
  71. package/dist/packages/hooks/dist/contexts/featureFlagServiceContext/featureFlagServiceContext.d.ts +0 -2
  72. package/dist/packages/hooks/dist/contexts/hardcopyContext/hardcopyContext.d.ts +0 -14
  73. package/dist/packages/hooks/dist/contexts/hardcopyContext/index.d.ts +0 -1
  74. package/dist/packages/hooks/dist/contexts/types.d.ts +0 -42
  75. package/dist/packages/hooks/dist/contexts/typesV3.d.ts +0 -239
  76. package/dist/packages/hooks/dist/services/amplitudeService/amplitudeService.d.ts +0 -1
  77. package/dist/packages/hooks/dist/services/amplitudeService/eventNames.d.ts +0 -43
  78. package/dist/packages/hooks/dist/types/customerService.d.ts +0 -21
  79. package/dist/packages/widgets/dist/SuggestionButtonContainer/index.d.ts +0 -2
  80. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/api/response.d.ts +0 -14
  81. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/api/search.d.ts +0 -15
  82. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/utilityTypes/camelCase.d.ts +0 -73
  83. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/utilityTypes/camelCasedPropertiesDeep.d.ts +0 -61
  84. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/utilityTypes/internal.d.ts +0 -25
  85. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/utilityTypes/splitWords.d.ts +0 -35
  86. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/utilityTypes/trim.d.ts +0 -32
  87. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/utilityTypes/unknownArray.d.ts +0 -32
  88. package/dist/packages/widgets/dist/packages/hooks/dist/application/models/variantInfo/variantInfo.d.ts +0 -1
  89. package/dist/packages/widgets/dist/packages/hooks/dist/atoms/search/searchAPI.d.ts +0 -15
  90. package/dist/packages/widgets/dist/packages/hooks/dist/contexts/hardcopyContext/hardcopyContext.d.ts +0 -1
  91. package/dist/packages/widgets/dist/packages/hooks/dist/contexts/types.d.ts +0 -63
  92. package/dist/packages/widgets/dist/packages/hooks/dist/hooks/Search/useSearch.d.ts +0 -60
  93. package/dist/packages/widgets/dist/packages/hooks/dist/hooks/utils.d.ts +0 -13
  94. package/dist/packages/widgets/dist/packages/hooks/dist/types/OrgInfo.d.ts +0 -1
  95. package/dist/packages/widgets/dist/packages/hooks/dist/types/index.d.ts +0 -1
  96. package/dist/packages/widgets/dist/packages/hooks/dist/types/search-filter-types.d.ts +0 -28
  97. package/dist/packages/widgets/dist/packages/hooks/dist/types/test-types.d.ts +0 -10
  98. package/dist/widgets/dist/packages/hooks/dist/application/models/api/response.d.cts +0 -14
  99. package/dist/widgets/dist/packages/hooks/dist/application/models/api/search.d.cts +0 -15
  100. package/dist/widgets/dist/packages/hooks/dist/application/models/utilityTypes/camelCase.d.cts +0 -73
  101. package/dist/widgets/dist/packages/hooks/dist/application/models/utilityTypes/camelCasedPropertiesDeep.d.cts +0 -61
  102. package/dist/widgets/dist/packages/hooks/dist/application/models/utilityTypes/internal.d.cts +0 -25
  103. package/dist/widgets/dist/packages/hooks/dist/application/models/utilityTypes/splitWords.d.cts +0 -35
  104. package/dist/widgets/dist/packages/hooks/dist/application/models/utilityTypes/trim.d.cts +0 -32
  105. package/dist/widgets/dist/packages/hooks/dist/application/models/utilityTypes/unknownArray.d.cts +0 -32
  106. package/dist/widgets/dist/packages/hooks/dist/atoms/search/searchAPI.d.cts +0 -14
  107. package/dist/widgets/dist/packages/hooks/dist/contexts/types.d.cts +0 -61
  108. package/dist/widgets/dist/packages/hooks/dist/hooks/Search/useSearch.d.cts +0 -60
  109. package/dist/widgets/dist/packages/hooks/dist/hooks/utils.d.cts +0 -12
  110. package/dist/widgets/dist/packages/hooks/dist/types/search-filter-types.d.cts +0 -28
  111. package/dist/widgets/dist/packages/hooks/dist/types/test-types.d.cts +0 -10
@@ -1,28 +1,34 @@
1
+ import { useSalesAgent } from '@envive-ai/react-hooks/contexts/salesAgentContext';
1
2
  import {
2
3
  PromptButtonCarouselWithImageWidgetV3Config,
3
4
  WidgetTypeV3,
4
5
  } from '@envive-ai/react-hooks/contexts/typesV3';
5
- import { useSalesAgent } from '@envive-ai/react-hooks/contexts/salesAgentContext';
6
6
  import { useChatToggle } from '@envive-ai/react-hooks/hooks/ChatToggle';
7
7
 
8
- import { Theme } from '@envive-ai/react-toolkit-v3/Tokens';
9
- import { useCallback, useEffect, useMemo } from 'react';
8
+ import {
9
+ ChatElementDisplayLocationV3,
10
+ VariantTypeEnum,
11
+ } from '@envive-ai/react-hooks/application/models';
12
+ import { variantInfoAtom } from '@envive-ai/react-hooks/atoms/app';
13
+ import { lastAssistantMessageAtom } from '@envive-ai/react-hooks/atoms/chat';
10
14
  import {
11
15
  EnviveMetricsEventName,
12
16
  SpiffyMetricsEventName,
13
17
  useAmplitude,
14
18
  } from '@envive-ai/react-hooks/contexts/amplitudeContext';
19
+ import { useWidgetInteraction } from '@envive-ai/react-hooks/hooks/WidgetInteraction';
15
20
  import {
16
- ChatElementDisplayLocationV3,
17
- VariantTypeEnum,
18
- } from '@envive-ai/react-hooks/application/models';
21
+ WidgetInteractionComponent,
22
+ WidgetInteractionType,
23
+ } from '@envive-ai/react-hooks/hooks/WidgetInteraction/types';
19
24
  import {
20
25
  PromptButtonCarouselWithImage,
21
26
  PromptButtonCarouselWithImageProps,
22
27
  } from '@envive-ai/react-toolkit-v3/PromptButtonCarouselWithImage';
23
- import { lastAssistantMessageAtom } from '@envive-ai/react-hooks/atoms/chat';
28
+ import { usePromptCarouselAnalytics } from '@envive-ai/react-toolkit-v3/PromptCarousel';
29
+ import { Theme } from '@envive-ai/react-toolkit-v3/Tokens';
24
30
  import { useAtomValue } from 'jotai';
25
- import { variantInfoAtom } from '@envive-ai/react-hooks/atoms/app';
31
+ import { useCallback, useEffect, useMemo } from 'react';
26
32
  import { BaseWidgetProps } from '../../hocs/withBaseWidget/types';
27
33
  import { withBaseWidget } from '../../hocs/withBaseWidget/withBaseWidget';
28
34
  import { RawValues, getRecentProductImageUrls, getStringIdForText } from '../utils/functions';
@@ -30,6 +36,16 @@ import { RawValues, getRecentProductImageUrls, getStringIdForText } from '../uti
30
36
  const PromptButtonCarouselWithImageWidgetHandler = (props: BaseWidgetProps) => {
31
37
  const { onTypedMessageSubmitted } = useSalesAgent();
32
38
  const { openChat } = useChatToggle();
39
+ const { trackWidgetInteraction } = useWidgetInteraction();
40
+ const {
41
+ onClick: onSuggestionClick,
42
+ onDrag,
43
+ onHover,
44
+ onMouseDown,
45
+ onMouseUp,
46
+ onTouchStart,
47
+ onTouchEnd,
48
+ } = usePromptCarouselAnalytics(WidgetInteractionComponent.SINGLE_IMAGE_PROMPT, text => text);
33
49
 
34
50
  const { hardcopyContent, widgetConfig, isLoading, widgetConfigId } = props;
35
51
 
@@ -78,12 +94,20 @@ const PromptButtonCarouselWithImageWidgetHandler = (props: BaseWidgetProps) => {
78
94
  ChatElementDisplayLocationV3.PROMPT_BUTTON_CAROUSEL_WITH_IMAGE_PROMPT_BUTTON,
79
95
  });
80
96
  openChat(ChatElementDisplayLocationV3.PROMPT_BUTTON_CAROUSEL_WITH_IMAGE_PROMPT_BUTTON);
97
+ onSuggestionClick(text);
81
98
  },
82
99
  [onTypedMessageSubmitted, openChat],
83
100
  );
84
101
 
85
102
  const handleTextFieldClick = useCallback(() => {
86
103
  openChat(ChatElementDisplayLocationV3.PROMPT_BUTTON_CAROUSEL_WITH_IMAGE_TEXT_FIELD);
104
+ trackWidgetInteraction({
105
+ eventName: EnviveMetricsEventName.WidgetInteraction,
106
+ trigger: {
107
+ widget: WidgetInteractionComponent.SINGLE_IMAGE_PROMPT,
108
+ widget_interaction: WidgetInteractionType.QUERY_INPUT_CLICKED,
109
+ },
110
+ });
87
111
  }, [openChat]);
88
112
 
89
113
  const variantInfo = useAtomValue(variantInfoAtom);
@@ -120,6 +144,12 @@ const PromptButtonCarouselWithImageWidgetHandler = (props: BaseWidgetProps) => {
120
144
  textFieldPlaceholder={hardCopyContent?.textFieldPlaceholder}
121
145
  hideTextField={promptButtonCarouselWithImageWidgetConfig?.hideTextField}
122
146
  handlePromptButtonClick={handlePromptButtonClick}
147
+ handlePromptButtonDrag={onDrag}
148
+ handlePromptButtonHover={onHover}
149
+ handlePromptButtonMouseDown={onMouseDown}
150
+ handlePromptButtonMouseUp={onMouseUp}
151
+ handlePromptButtonTouchStart={onTouchStart}
152
+ handlePromptButtonTouchEnd={onTouchEnd}
123
153
  handleTextFieldClick={handleTextFieldClick}
124
154
  />
125
155
  );
@@ -9,16 +9,17 @@ import {
9
9
  PromptCarouselWidgetV3Config,
10
10
  WidgetTypeV3,
11
11
  } from '@envive-ai/react-hooks/contexts/typesV3';
12
+ import { PromptButtonVariant } from '@envive-ai/react-toolkit-v3/PromptButton/types';
13
+ import { useCallback, useEffect } from 'react';
14
+
12
15
  import { useChatToggle } from '@envive-ai/react-hooks/hooks/ChatToggle';
13
16
  import { WidgetInteractionComponent } from '@envive-ai/react-hooks/hooks/WidgetInteraction/types';
14
- import { PromptButtonVariant } from '@envive-ai/react-toolkit-v3/PromptButton/types';
15
17
  import {
16
18
  PromptCarousel,
17
19
  usePromptCarouselAnalytics,
18
20
  } from '@envive-ai/react-toolkit-v3/PromptCarousel';
19
21
  import { AnimationSpeed } from '@envive-ai/react-toolkit-v3/PromptCarousel/types/types';
20
22
  import { Theme } from '@envive-ai/react-toolkit-v3/Tokens';
21
- import { useCallback, useEffect } from 'react';
22
23
  import { BaseWidgetProps, withBaseWidget } from '../../hocs/withBaseWidget';
23
24
  import { RawValues, getStringIdForText } from '../utils/functions';
24
25
 
@@ -1,8 +1,8 @@
1
+ import { useCallback, useEffect, useMemo } from 'react';
1
2
  import { SocialProofWidgetV3Config, WidgetTypeV3 } from '@envive-ai/react-hooks/contexts/typesV3';
2
3
  import { useAtomValue, useSetAtom } from 'jotai';
3
4
  import { useSalesAgent } from '@envive-ai/react-hooks/contexts/salesAgentContext';
4
5
  import { useChatToggle } from '@envive-ai/react-hooks/hooks/ChatToggle';
5
- import { lastAssistantMessageAtom } from '@envive-ai/react-hooks/atoms/chat';
6
6
  import { variantInfoAtom } from '@envive-ai/react-hooks/atoms/app';
7
7
  import {
8
8
  PageVariant,
@@ -15,26 +15,42 @@ import {
15
15
  ChatElementDisplayLocationV3,
16
16
  VariantTypeEnum,
17
17
  } from '@envive-ai/react-hooks/application/models';
18
- import { Theme } from '@envive-ai/react-toolkit-v3/Tokens';
18
+ import { chatPreviewLoadingDataAtom } from '@envive-ai/react-hooks/atoms/widget';
19
19
  import {
20
20
  EnviveMetricsEventName,
21
21
  SpiffyMetricsEventName,
22
22
  useAmplitude,
23
23
  } from '@envive-ai/react-hooks/contexts/amplitudeContext';
24
- import { useCallback, useEffect, useMemo } from 'react';
25
- import { chatPreviewLoadingDataAtom } from '@envive-ai/react-hooks/atoms/widget';
24
+ import { useWidgetInteraction } from '@envive-ai/react-hooks/hooks/WidgetInteraction';
25
+ import {
26
+ WidgetInteractionComponent,
27
+ WidgetInteractionType,
28
+ } from '@envive-ai/react-hooks/hooks/WidgetInteraction/types';
29
+ import { useProductImageUrl } from '@envive-ai/react-hooks/hooks/ProductImageUrl';
26
30
  import { ChatPreviewLoading } from '@envive-ai/react-toolkit-v3/ChatPreviewLoading';
31
+ import { usePromptCarouselAnalytics } from '@envive-ai/react-toolkit-v3/PromptCarousel';
32
+ import { Theme } from '@envive-ai/react-toolkit-v3/Tokens';
33
+
27
34
  import { BaseWidgetProps } from '../../hocs/withBaseWidget/types';
28
35
  import { withBaseWidget } from '../../hocs/withBaseWidget/withBaseWidget';
29
- import { RawValues, getProductImageUrl, getStringIdForText } from '../utils/functions';
36
+ import { RawValues, getStringIdForText } from '../utils/functions';
30
37
 
31
38
  const SocialProofWidgetHandler = (props: BaseWidgetProps) => {
32
39
  const setChatPreviewLoadingData = useSetAtom(chatPreviewLoadingDataAtom);
33
40
 
34
41
  const { onTypedMessageSubmitted } = useSalesAgent();
35
42
  const { openChat } = useChatToggle();
36
- const lastAssistantMessage = useAtomValue(lastAssistantMessageAtom);
37
43
  const variantInfo = useAtomValue(variantInfoAtom);
44
+ const { trackWidgetInteraction } = useWidgetInteraction();
45
+ const {
46
+ onClick: onSuggestionClick,
47
+ onHover,
48
+ onDrag,
49
+ onMouseDown,
50
+ onMouseUp,
51
+ onTouchStart,
52
+ onTouchEnd,
53
+ } = usePromptCarouselAnalytics(WidgetInteractionComponent.SOCIAL_PROOF, text => text);
38
54
 
39
55
  const { hardcopyContent, widgetConfig, uiConfig, isLoading, widgetConfigId } = props;
40
56
 
@@ -82,7 +98,8 @@ const SocialProofWidgetHandler = (props: BaseWidgetProps) => {
82
98
 
83
99
  const hideLogo = uiConfig?.lookAndFeel?.hideWidgetLogo;
84
100
 
85
- const dynamicImageUrl = getProductImageUrl(lastAssistantMessage);
101
+ const productId = variantInfo.variant === VariantTypeEnum.Pdp ? variantInfo.productId : undefined;
102
+ const dynamicImageUrl = useProductImageUrl(productId);
86
103
 
87
104
  const images =
88
105
  socialProofWidgetConfig?.kind !== WidgetKind.DYNAMIC
@@ -119,24 +136,70 @@ const SocialProofWidgetHandler = (props: BaseWidgetProps) => {
119
136
  displayLocation: ChatElementDisplayLocationV3.SOCIAL_PROOF_PRIMARY_BUTTON,
120
137
  });
121
138
  openChat(ChatElementDisplayLocationV3.SOCIAL_PROOF_PRIMARY_BUTTON);
139
+
140
+ trackWidgetInteraction({
141
+ eventName: EnviveMetricsEventName.WidgetInteraction,
142
+ trigger: {
143
+ widget: WidgetInteractionComponent.SOCIAL_PROOF,
144
+ widget_interaction: WidgetInteractionType.SUGGESTION_CLICKED,
145
+ widget_interaction_data: {
146
+ suggestion_clicked: {
147
+ suggestion_id: text,
148
+ },
149
+ },
150
+ },
151
+ });
122
152
  },
123
153
  [onTypedMessageSubmitted, openChat],
124
154
  );
125
155
 
156
+ const handlePrimaryButtonHover = useCallback((text: string) => {
157
+ trackWidgetInteraction({
158
+ eventName: EnviveMetricsEventName.WidgetInteraction,
159
+ trigger: {
160
+ widget: WidgetInteractionComponent.SOCIAL_PROOF,
161
+ widget_interaction: WidgetInteractionType.WIDGET_HOVERED,
162
+ widget_interaction_data: {
163
+ suggestion_hovered: {
164
+ suggestion_id: text,
165
+ },
166
+ },
167
+ },
168
+ });
169
+ }, []);
170
+
126
171
  const handleSecondaryButtonClick = useCallback(
127
172
  (text: string) => {
173
+ const rawValues = (hardcopyContent as { rawValues?: RawValues } | undefined)?.rawValues;
174
+ const stringId = getStringIdForText(rawValues, text);
175
+ trackEvent({
176
+ eventName: EnviveMetricsEventName.WidgetTextClicked,
177
+ eventProps: {
178
+ response_id: hardcopyContent?.responseId,
179
+ string_id: stringId,
180
+ text,
181
+ },
182
+ });
128
183
  onTypedMessageSubmitted({
129
184
  query: text,
130
185
  userTyped: false,
131
186
  displayLocation: ChatElementDisplayLocationV3.SOCIAL_PROOF_SECONDARY_BUTTON,
132
187
  });
133
188
  openChat(ChatElementDisplayLocationV3.SOCIAL_PROOF_SECONDARY_BUTTON);
189
+ onSuggestionClick(text);
134
190
  },
135
191
  [onTypedMessageSubmitted, openChat],
136
192
  );
137
193
 
138
194
  const handleTextFieldClick = useCallback(() => {
139
195
  openChat(ChatElementDisplayLocationV3.SOCIAL_PROOF_TEXT_FIELD);
196
+ trackWidgetInteraction({
197
+ eventName: EnviveMetricsEventName.WidgetInteraction,
198
+ trigger: {
199
+ widget: WidgetInteractionComponent.SOCIAL_PROOF,
200
+ widget_interaction: WidgetInteractionType.QUERY_INPUT_CLICKED,
201
+ },
202
+ });
140
203
  }, [openChat]);
141
204
 
142
205
  if (isLoading) {
@@ -185,7 +248,14 @@ const SocialProofWidgetHandler = (props: BaseWidgetProps) => {
185
248
 
186
249
  const widgetEventProps: SocialProofProps['widgetEventProps'] = {
187
250
  handlePrimaryButtonClick,
251
+ handlePrimaryButtonHover,
188
252
  handleSecondaryButtonClick,
253
+ handleSecondaryButtonHover: onHover,
254
+ handleSecondaryButtonDrag: onDrag,
255
+ handleSecondaryButtonMouseDown: onMouseDown,
256
+ handleSecondaryButtonMouseUp: onMouseUp,
257
+ handleSecondaryButtonTouchStart: onTouchStart,
258
+ handleSecondaryButtonTouchEnd: onTouchEnd,
189
259
  handleTextFieldClick,
190
260
  };
191
261
 
@@ -1,20 +1,25 @@
1
- import {
2
- TitledPromptCarouselWidgetV3Config,
3
- WidgetTypeV3,
4
- } from '@envive-ai/react-hooks/contexts/typesV3';
5
- import { PromptButtonVariant } from '@envive-ai/react-toolkit-v3/PromptButton/types';
6
1
  import { ChatElementDisplayLocationV3 } from '@envive-ai/react-hooks/application/models';
7
- import { useSalesAgent } from '@envive-ai/react-hooks/contexts/salesAgentContext';
8
- import { useCallback, useEffect } from 'react';
9
2
  import {
10
3
  EnviveMetricsEventName,
11
4
  SpiffyMetricsEventName,
12
5
  useAmplitude,
13
6
  } from '@envive-ai/react-hooks/contexts/amplitudeContext';
7
+ import { useSalesAgent } from '@envive-ai/react-hooks/contexts/salesAgentContext';
8
+ import {
9
+ TitledPromptCarouselWidgetV3Config,
10
+ WidgetTypeV3,
11
+ } from '@envive-ai/react-hooks/contexts/typesV3';
12
+ import { PromptButtonVariant } from '@envive-ai/react-toolkit-v3/PromptButton/types';
13
+ import { useCallback, useEffect } from 'react';
14
14
 
15
15
  import { useChatToggle } from '@envive-ai/react-hooks/hooks/ChatToggle';
16
+ import { WidgetInteractionComponent } from '@envive-ai/react-hooks/hooks/WidgetInteraction/types';
17
+ import {
18
+ AnimationSpeed,
19
+ PromptCarouselRows,
20
+ usePromptCarouselAnalytics,
21
+ } from '@envive-ai/react-toolkit-v3/PromptCarousel';
16
22
  import { TitledPromptCarousel } from '@envive-ai/react-toolkit-v3/TitledPromptCarousel';
17
- import { AnimationSpeed, PromptCarouselRows } from '@envive-ai/react-toolkit-v3/PromptCarousel';
18
23
  import { BaseWidgetProps, withBaseWidget } from '../../hocs/withBaseWidget';
19
24
  import { RawValues, getStringIdForText } from '../utils/functions';
20
25
 
@@ -33,6 +38,9 @@ const TitledPromptCarouselWidgetHandler = (props: BaseWidgetProps) => {
33
38
  const { openChat } = useChatToggle();
34
39
  const { hardcopyContent, widgetConfig, isLoading, widgetConfigId } = props;
35
40
 
41
+ const { onClick, onDrag, onHover, onMouseDown, onMouseUp, onTouchStart, onTouchEnd } =
42
+ usePromptCarouselAnalytics(WidgetInteractionComponent.EMBEDDED_WIDGET, text => text);
43
+
36
44
  const hardCopyTitleLabel = hardcopyContent?.values?.titleLabel as string | undefined;
37
45
  const titleLabel = isLoading ? mockTitleLabel : hardCopyTitleLabel;
38
46
 
@@ -85,6 +93,7 @@ const TitledPromptCarouselWidgetHandler = (props: BaseWidgetProps) => {
85
93
  displayLocation: ChatElementDisplayLocationV3.TITLED_PROMPT_CAROUSEL,
86
94
  });
87
95
  openChat(ChatElementDisplayLocationV3.TITLED_PROMPT_CAROUSEL);
96
+ onClick(text);
88
97
  },
89
98
  [onTypedMessageSubmitted, openChat],
90
99
  );
@@ -100,6 +109,12 @@ const TitledPromptCarouselWidgetHandler = (props: BaseWidgetProps) => {
100
109
  promptCarouselRows={promptCarouselRows as PromptCarouselRows}
101
110
  animationSpeed={animationSpeed as AnimationSpeed}
102
111
  handleButtonClick={handleButtonClick}
112
+ handleButtonDrag={onDrag}
113
+ handleButtonHover={onHover}
114
+ handleButtonMouseDown={onMouseDown}
115
+ handleButtonMouseUp={onMouseUp}
116
+ handleButtonTouchStart={onTouchStart}
117
+ handleButtonTouchEnd={onTouchEnd}
103
118
  promptButtonTexts={buttonTexts}
104
119
  promptCarouselAriaLabel={promptCarouselAriaLabel}
105
120
  />
@@ -1,8 +0,0 @@
1
- //#region ../hooks/dist/application/models/api/widgetText.d.ts
2
- //#region src/application/models/api/widgetText.d.ts
3
- type WidgetString = {
4
- id: string;
5
- value: string;
6
- };
7
- //#endregion
8
- export { WidgetString };
@@ -1,12 +0,0 @@
1
- import { WidgetString } from "../../application/models/api/widgetText.cjs";
2
-
3
- //#region ../hooks/dist/contexts/hardcopyContext/hardcopyContext.d.ts
4
-
5
- type HardcopyResponse = {
6
- responseId: string;
7
- language: string;
8
- rawValues?: Record<string, WidgetString | WidgetString[]>;
9
- values: Record<string, string | string[]>;
10
- };
11
- //#endregion
12
- export { HardcopyResponse };
@@ -1,38 +0,0 @@
1
- //#region ../hooks/dist/contexts/types.d.ts
2
-
3
- interface AlphabeticFilterSorting {
4
- type: 'alphabetic';
5
- }
6
- interface ProductCountFilterSorting {
7
- type: 'productCount';
8
- }
9
- interface CustomFilterSorting {
10
- type: 'custom';
11
- map: Record<string, number>;
12
- }
13
- type FilterSorting = AlphabeticFilterSorting | ProductCountFilterSorting | CustomFilterSorting;
14
- interface BaseFilterConfig {
15
- filterId: string;
16
- displayName: string;
17
- }
18
- interface DynamicFilterConfig extends BaseFilterConfig {
19
- type: 'dynamic';
20
- attribute: string;
21
- sorting: FilterSorting;
22
- }
23
- interface PriceFilterConfig extends BaseFilterConfig {
24
- type: 'price';
25
- bucketSize: number;
26
- }
27
- type FilterAttribute = DynamicFilterConfig | PriceFilterConfig;
28
- interface SearchConfig {
29
- enableGlobalSearch: boolean;
30
- searchFilterConfig: FilterAttribute[];
31
- searchOverlayHeading?: string;
32
- redirectSearchResultsUrl?: string;
33
- additiveDynamicFilters?: boolean;
34
- recommendedProducts?: string[];
35
- recommendedProductsHeading?: string;
36
- }
37
- //#endregion
38
- export { type SearchConfig };
@@ -1,239 +0,0 @@
1
- import { CustomerServiceType } from "../types/customerService.cjs";
2
- import { SearchConfig } from "./types.cjs";
3
- import { FloatingButtonLocation } from "@envive-ai/react-toolkit-v3/FloatingButton";
4
- import { ImageGalleryImage, ImageGalleryLayout } from "@envive-ai/react-toolkit-v3/ImageGallery";
5
- import { PromptButtonVariant } from "@envive-ai/react-toolkit-v3/PromptButton";
6
- import { AnimationSpeed, PromptCarouselRows } from "@envive-ai/react-toolkit-v3/PromptCarousel";
7
- import { DynamicLayout, WidgetKind } from "@envive-ai/react-toolkit-v3/SocialProof";
8
- import { Theme } from "@envive-ai/react-toolkit-v3/Tokens";
9
- import { SparkleIconColor } from "@envive-ai/react-toolkit-v3/WelcomeMessage";
10
- import { WidgetWrapperVariant } from "@envive-ai/react-toolkit-v3/WidgetWrapper";
11
-
12
- //#region ../hooks/dist/contexts/typesV3.d.ts
13
-
14
- type ImageAspectRatio = '1/1' | '3/4';
15
- type ButtonColors = {
16
- lightButtonBackgroundColor: string;
17
- lightButtonIconColor: string;
18
- darkButtonBackgroundColor: string;
19
- darkButtonIconColor: string;
20
- };
21
- type Typography = {
22
- titleFontFamily: string;
23
- headerFontFamily: string;
24
- bodyFontFamily: string;
25
- fontSize?: {
26
- t1: string;
27
- t2: string;
28
- t3: string;
29
- h1: string;
30
- h2: string;
31
- h3: string;
32
- b1: string;
33
- b2: string;
34
- b3: string;
35
- b4: string;
36
- b5: string;
37
- l1: string;
38
- l2: string;
39
- };
40
- fontWeight?: {
41
- rg: string;
42
- md: string;
43
- sb: string;
44
- };
45
- letterSpacing?: {
46
- '0': string;
47
- 'wide-1': string;
48
- };
49
- lineHeight?: {
50
- '124': number;
51
- '120': number;
52
- '118': number;
53
- '116': number;
54
- '114': number;
55
- '148': number;
56
- '140': number;
57
- '128': number;
58
- '130': number;
59
- '133': number;
60
- };
61
- };
62
- type LookAndFeelConfig = {
63
- theme: Theme;
64
- agentName: string;
65
- chatHeaderLogoDarkSrc: string;
66
- chatHeaderLogoLightSrc: string;
67
- widgetLogoSrc: string;
68
- hideWidgetLogo: boolean;
69
- elementRadius: number;
70
- imageAspectRatio: ImageAspectRatio;
71
- buttonColors: ButtonColors;
72
- typography: Typography;
73
- };
74
- declare enum ConfigVersionEnum {
75
- V3 = "v3",
76
- Deprecated = "deprecated",
77
- }
78
- type ConfigVersion = ConfigVersionEnum.V3 | ConfigVersionEnum.Deprecated | undefined;
79
- type Mode = 'dark' | 'light';
80
- type ShowOptions = 'always' | 'postInteraction' | 'none';
81
- type Style = 'attached' | 'detached';
82
- type FloatingButtonConfig = {
83
- position: FloatingButtonLocation;
84
- backgroundColor?: string;
85
- mode: Mode;
86
- showOption: ShowOptions;
87
- iconSVGSrc?: string;
88
- style: Style;
89
- };
90
- type ReferrerPopupTrigger = {
91
- type: 'referrer';
92
- referrers: string[];
93
- };
94
- type AutomaticPopupTrigger = {
95
- type: 'automatic';
96
- };
97
- type PopupTrigger = ReferrerPopupTrigger | AutomaticPopupTrigger;
98
- type AutoPopupTrigger = {
99
- delay: number;
100
- trigger: PopupTrigger;
101
- };
102
- interface AutoPopupConfig {
103
- triggers: AutoPopupTrigger[];
104
- }
105
- type PartialViewConfig = {
106
- /**
107
- * When true, only full-screen mode is supported (no partial/draggable middle state).
108
- * Useful when partial view causes usability issues on mobile.
109
- * Default: false (undefined and false = partial view enabled).
110
- */
111
- disabled?: boolean;
112
- };
113
- type FloatingChatConfig = {
114
- headerBackgroundColor?: string;
115
- headerMode: Mode;
116
- welcomeMessageIconColor: SparkleIconColor;
117
- showVerifiedBuyer: boolean;
118
- userQueryInputEnabled: boolean;
119
- showEnviveLogo: boolean;
120
- ignoreFirstModelResponse?: boolean;
121
- neverShowSingleProductCards?: boolean;
122
- welcomeMessageTitle: string;
123
- welcomeMessageText: string;
124
- chatFooterTextFieldPlaceholderText: string;
125
- autoPopupConfig?: AutoPopupConfig;
126
- partialViewConfig?: PartialViewConfig;
127
- };
128
- type CustomerServiceIntegration = {
129
- enabled: boolean;
130
- provider: CustomerServiceType;
131
- suppressMerchantButton?: boolean;
132
- };
133
- type SPASettings = {
134
- enabled: boolean;
135
- refreshInterval?: number;
136
- };
137
- type OrgUIConfigV3 = {
138
- id?: string;
139
- version: ConfigVersion;
140
- shortName: string;
141
- lookAndFeel: LookAndFeelConfig;
142
- floatingButton: FloatingButtonConfig;
143
- floatingChat: FloatingChatConfig;
144
- merchantOverrideCss?: string;
145
- customerServiceIntegration?: CustomerServiceIntegration;
146
- singlePageApplicationSettings?: SPASettings;
147
- searchConfig?: SearchConfig;
148
- };
149
- declare enum WidgetTypeV3 {
150
- PromptCarouselV3 = "PromptCarouselV3",
151
- TitledPromptCarouselV3 = "TitledPromptCarouselV3",
152
- SocialProofV3 = "SocialProofV3",
153
- TypingAnimationV3 = "TypingAnimationV3",
154
- ChatPreviewV3 = "ChatPreviewV3",
155
- ChatPreviewComparisonV3 = "ChatPreviewComparisonV3",
156
- ChatPreviewLoadingV3 = "ChatPreviewLoadingV3",
157
- ImagePromptCardV3 = "ImagePromptCardV3",
158
- PromptButtonCarouselWithImageV3 = "PromptButtonCarouselWithImageV3",
159
- ImageBannerV3 = "ImageBannerV3",
160
- SingleImagePromptV3 = "SingleImagePromptV3",
161
- FloatingChatV3 = "FloatingChatV3",
162
- FloatingButtonV3 = "FloatingButtonV3",
163
- ProductCardV3 = "ProductCardV3",
164
- FullPageSalesAgentV3 = "FullPageSalesAgentV3",
165
- }
166
- interface BaseWidgetConfig<T extends WidgetTypeV3> {
167
- widgetConfigId: string;
168
- type: T;
169
- contentId?: string;
170
- }
171
- interface PromptCarouselWidgetV3Config extends BaseWidgetConfig<WidgetTypeV3.PromptCarouselV3> {
172
- promptButtonType?: PromptButtonVariant;
173
- boldFirstButton?: boolean;
174
- promptCarouselRows?: PromptCarouselRows;
175
- animationSpeed?: AnimationSpeed;
176
- }
177
- interface TitledPromptCarouselWidgetV3Config extends BaseWidgetConfig<WidgetTypeV3.TitledPromptCarouselV3> {
178
- promptButtonType?: PromptButtonVariant;
179
- boldFirstButton?: boolean;
180
- promptCarouselRows?: PromptCarouselRows;
181
- animationSpeed?: AnimationSpeed;
182
- }
183
- interface SocialProofWidgetV3Config extends BaseWidgetConfig<WidgetTypeV3.SocialProofV3> {
184
- kind: WidgetKind;
185
- variant: WidgetWrapperVariant;
186
- hexCardColor?: string;
187
- promptCarouselRows: PromptCarouselRows;
188
- hideImage?: boolean;
189
- imageGalleryLayout: Exclude<ImageGalleryLayout, 'TWO_SIDE'>;
190
- hideTextField?: boolean;
191
- primaryButtonVariant: Exclude<PromptButtonVariant, 'suggestedResponse' | 'ghost'>;
192
- secondaryButtonVariant: Exclude<PromptButtonVariant, 'suggestedResponse' | 'ghost'>;
193
- dynamicLayout?: DynamicLayout;
194
- images?: ImageGalleryImage[];
195
- }
196
- interface TypingAnimationWidgetV3Config extends BaseWidgetConfig<WidgetTypeV3.TypingAnimationV3> {
197
- widgetVariant?: WidgetWrapperVariant;
198
- cardColor?: string;
199
- promptButtonType?: PromptButtonVariant;
200
- promptCarouselRows?: PromptCarouselRows;
201
- showTextField?: boolean;
202
- }
203
- interface ChatPreviewComparisonWidgetV3Config extends BaseWidgetConfig<WidgetTypeV3.ChatPreviewComparisonV3> {
204
- variant: WidgetWrapperVariant;
205
- hexCardColor?: string;
206
- hideImage?: boolean;
207
- hideTextField?: boolean;
208
- }
209
- interface ChatPreviewLoadingWidgetV3Config extends BaseWidgetConfig<WidgetTypeV3.ChatPreviewLoadingV3> {
210
- variant: WidgetWrapperVariant;
211
- hexCardColor?: string;
212
- hideTextField?: boolean;
213
- }
214
- interface ChatPreviewWidgetV3Config extends BaseWidgetConfig<WidgetTypeV3.ChatPreviewV3> {
215
- variant: WidgetWrapperVariant;
216
- hexCardColor?: string;
217
- hideTextField?: boolean;
218
- }
219
- interface PromptButtonCarouselWithImageWidgetV3Config extends BaseWidgetConfig<WidgetTypeV3.PromptButtonCarouselWithImageV3> {
220
- promptButtonType?: PromptButtonVariant;
221
- image?: ImageGalleryImage;
222
- hideTextField?: boolean;
223
- isDynamic?: boolean;
224
- }
225
- interface FloatingChatWidgetV3Config extends BaseWidgetConfig<WidgetTypeV3.FloatingChatV3> {}
226
- interface ProductCardWidgetV3Config extends BaseWidgetConfig<WidgetTypeV3.ProductCardV3> {
227
- promptButtonType?: PromptButtonVariant;
228
- italicizeHeadline?: boolean;
229
- fallbackColor?: string;
230
- imageSrc?: string;
231
- }
232
- interface FullPageSalesAgentWidgetV3Config extends BaseWidgetConfig<WidgetTypeV3.FullPageSalesAgentV3> {
233
- headerContainer?: string;
234
- autoHeight?: boolean;
235
- }
236
- type WidgetConfigV3 = PromptCarouselWidgetV3Config | SocialProofWidgetV3Config | TitledPromptCarouselWidgetV3Config | ChatPreviewComparisonWidgetV3Config | ChatPreviewLoadingWidgetV3Config | TypingAnimationWidgetV3Config | ChatPreviewWidgetV3Config | PromptButtonCarouselWithImageWidgetV3Config | FloatingChatWidgetV3Config | ProductCardWidgetV3Config | FullPageSalesAgentWidgetV3Config;
237
- //#endregion
238
- //#endregion
239
- export { type OrgUIConfigV3, type WidgetConfigV3, WidgetTypeV3 };
@@ -1,43 +0,0 @@
1
- //#region ../hooks/dist/services/amplitudeService/eventNames.d.ts
2
- //#region src/services/amplitudeService/eventNames.d.ts
3
- /**
4
- * Event name enums for Amplitude tracking.
5
- *
6
- * NOTE: This file exists separately to avoid circular dependency issues.
7
- * The amplitudeService imports from ga4ProjectionService, which needs these enums.
8
- * By keeping the enums in a separate file, ga4ProjectionService can import them
9
- * without creating a circular dependency with amplitudeService.
10
- */
11
- declare enum SpiffyMetricsEventName {
12
- BundleLoaded = "Bundle Loaded",
13
- EnvironmentInitialized = "Environment Initialized",
14
- ChatLiveAgentBtnClick = "Chat Live Agent Btn Click",
15
- ChatFloatingButtonVisible = "Chat Floating Button Visible",
16
- ChatComponentVisible = "Chat Component Visible",
17
- ChatComponentExpanded = "Chat Component Expanded",
18
- ChatComponentCollapsed = "Chat Component Collapsed",
19
- ChatUserMessageInput = "Chat User Message Input",
20
- ChatSuggestionClicked = "Chat Suggestion Clicked",
21
- ChatAssistantResponse = "Chat Assistant Response",
22
- ProductCardClicked = "Product Card Clicked",
23
- ProductReviewCardClicked = "Product Review Card Clicked",
24
- AddToCartClicked = "Add To Cart Clicked",
25
- PromptCardClicked = "Prompt Card Clicked",
26
- SupportedEvent = "Supported Event",
27
- SearchBackToResponseClicked = "Search Back to Response Clicked",
28
- PerformanceMetrics = "Performance Metrics",
29
- SearchBarClicked = "Search Bar Clicked",
30
- OrderLookupStarted = "Order Lookup Started",
31
- OrderLookupFormSubmitted = "Order Lookup Form Submitted",
32
- SearchComponentVisible = "Search Component Visible",
33
- SearchZeroStateSuggestionClicked = "Search Zero State Suggestion Clicked",
34
- SearchInputStarted = "Search Input Started",
35
- SearchQuerySubmitted = "Search Query Submitted",
36
- SearchResultsViewed = "Search Results Viewed",
37
- SearchTimeToFirstClick = "Search Time to First Click",
38
- SearchZeroResultsRate = "Search Zero Results Rate",
39
- SearchFilterClicked = "Search Filter Clicked",
40
- SearchSortClicked = "Search Sort Clicked",
41
- }
42
- //#endregion
43
- export { SpiffyMetricsEventName };