@envive-ai/react-hooks 0.3.32 → 0.3.33

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 (170) hide show
  1. package/dist/application/commerce-api.d.cts +1 -1
  2. package/dist/application/commerce-api.d.ts +1 -1
  3. package/dist/atoms/app/index.d.cts +9 -9
  4. package/dist/atoms/app/index.d.ts +9 -9
  5. package/dist/atoms/app/variant.d.cts +8 -8
  6. package/dist/atoms/app/variant.d.ts +8 -8
  7. package/dist/atoms/chat/chatState.d.cts +20 -20
  8. package/dist/atoms/chat/chatState.d.ts +20 -20
  9. package/dist/atoms/chat/form.d.cts +2 -2
  10. package/dist/atoms/chat/form.d.ts +2 -2
  11. package/dist/atoms/chat/index.cjs +1 -1
  12. package/dist/atoms/chat/index.d.cts +3 -3
  13. package/dist/atoms/chat/index.d.ts +2 -2
  14. package/dist/atoms/chat/index.js +1 -1
  15. package/dist/atoms/chat/lastMessage.d.ts +2 -2
  16. package/dist/atoms/chat/messageQueue.d.cts +6 -6
  17. package/dist/atoms/chat/messageQueue.d.ts +6 -6
  18. package/dist/atoms/chat/performanceMetrics.d.ts +6 -6
  19. package/dist/atoms/chat/renderedWidgetRefs.d.cts +2 -2
  20. package/dist/atoms/chat/renderedWidgetRefs.d.ts +3 -3
  21. package/dist/atoms/chat/replies.d.ts +3 -3
  22. package/dist/atoms/chat/suggestions.d.cts +2 -2
  23. package/dist/atoms/chat/suggestions.d.ts +2 -2
  24. package/dist/atoms/envive/enviveConfig.d.cts +13 -13
  25. package/dist/atoms/envive/enviveConfig.d.ts +13 -13
  26. package/dist/atoms/globalSearch/globalSearch.d.cts +5 -5
  27. package/dist/atoms/globalSearch/globalSearch.d.ts +6 -6
  28. package/dist/atoms/org/customerService.d.cts +6 -6
  29. package/dist/atoms/org/customerService.d.ts +6 -6
  30. package/dist/atoms/org/graphqlConfig.d.cts +5 -5
  31. package/dist/atoms/org/graphqlConfig.d.ts +5 -5
  32. package/dist/atoms/org/index.cjs +2 -3
  33. package/dist/atoms/org/index.d.cts +2 -2
  34. package/dist/atoms/org/index.d.ts +2 -2
  35. package/dist/atoms/org/index.js +3 -3
  36. package/dist/atoms/org/newOrgConfigAtom.d.cts +2 -2
  37. package/dist/atoms/org/newOrgConfigAtom.d.ts +2 -2
  38. package/dist/atoms/org/orgAnalyticsConfig.cjs +1 -3
  39. package/dist/atoms/org/orgAnalyticsConfig.d.cts +7 -8
  40. package/dist/atoms/org/orgAnalyticsConfig.d.ts +7 -8
  41. package/dist/atoms/org/orgAnalyticsConfig.js +2 -3
  42. package/dist/atoms/search/chatSearch.cjs +1 -1
  43. package/dist/atoms/search/chatSearch.d.cts +17 -17
  44. package/dist/atoms/search/chatSearch.d.ts +17 -17
  45. package/dist/atoms/search/chatSearch.js +1 -1
  46. package/dist/atoms/search/searchAPI.cjs +1 -1
  47. package/dist/atoms/search/searchAPI.d.cts +13 -13
  48. package/dist/atoms/search/searchAPI.d.ts +13 -13
  49. package/dist/atoms/search/searchAPI.js +1 -1
  50. package/dist/atoms/widget/chatPreviewLoading.d.ts +2 -2
  51. package/dist/contexts/amplitudeContext/amplitudeContext.cjs +1 -5
  52. package/dist/contexts/amplitudeContext/amplitudeContext.js +1 -5
  53. package/dist/contexts/enviveConfigContext/enviveConfigContext.cjs +18 -23
  54. package/dist/contexts/enviveConfigContext/enviveConfigContext.d.cts +10 -12
  55. package/dist/contexts/enviveConfigContext/enviveConfigContext.d.ts +10 -12
  56. package/dist/contexts/enviveConfigContext/enviveConfigContext.js +18 -23
  57. package/dist/contexts/enviveContext/enviveContext.cjs +41 -74
  58. package/dist/contexts/enviveContext/enviveContext.d.cts +15 -32
  59. package/dist/contexts/enviveContext/enviveContext.d.ts +15 -32
  60. package/dist/contexts/enviveContext/enviveContext.js +41 -74
  61. package/dist/contexts/enviveContext/index.d.cts +2 -2
  62. package/dist/contexts/enviveContext/index.d.ts +2 -2
  63. package/dist/contexts/enviveCssContext/enviveCssContext.cjs +31 -16
  64. package/dist/contexts/enviveCssContext/enviveCssContext.js +31 -16
  65. package/dist/contexts/graphqlContext/graphqlContext.cjs +3 -212
  66. package/dist/contexts/graphqlContext/graphqlContext.d.cts +2 -10
  67. package/dist/contexts/graphqlContext/graphqlContext.d.ts +2 -10
  68. package/dist/contexts/graphqlContext/graphqlContext.js +3 -212
  69. package/dist/contexts/graphqlContext/mockV3Config.cjs +31 -16
  70. package/dist/contexts/graphqlContext/mockV3Config.js +31 -16
  71. package/dist/contexts/hardcopyContext/hardcopyContext.cjs +9 -238
  72. package/dist/contexts/hardcopyContext/hardcopyContext.d.cts +5 -17
  73. package/dist/contexts/hardcopyContext/hardcopyContext.d.ts +5 -17
  74. package/dist/contexts/hardcopyContext/hardcopyContext.js +9 -238
  75. package/dist/contexts/hardcopyContext/index.d.cts +3 -2
  76. package/dist/contexts/hardcopyContext/index.d.ts +3 -2
  77. package/dist/contexts/newOrgConfigContext/newOrgConfigContext.cjs +10 -32
  78. package/dist/contexts/newOrgConfigContext/newOrgConfigContext.d.cts +2 -2
  79. package/dist/contexts/newOrgConfigContext/newOrgConfigContext.d.ts +2 -2
  80. package/dist/contexts/newOrgConfigContext/newOrgConfigContext.js +12 -34
  81. package/dist/contexts/pageContext/mapping.d.cts +1 -1
  82. package/dist/contexts/pageContext/mapping.d.ts +1 -1
  83. package/dist/contexts/pageContext/types.d.cts +1 -1
  84. package/dist/contexts/salesAgentContext/chatAPI.cjs +2 -2
  85. package/dist/contexts/salesAgentContext/chatAPI.js +2 -2
  86. package/dist/contexts/salesAgentContext/salesAgentService.cjs +1 -1
  87. package/dist/contexts/salesAgentContext/salesAgentService.js +1 -1
  88. package/dist/contexts/searchContext/searchContext.cjs +1 -1
  89. package/dist/contexts/searchContext/searchContext.js +1 -1
  90. package/dist/contexts/systemSettingsContext/systemSettingsContext.d.cts +2 -2
  91. package/dist/contexts/types.d.cts +2 -2
  92. package/dist/contexts/types.d.ts +2 -2
  93. package/dist/contexts/typesV3.cjs +31 -16
  94. package/dist/contexts/typesV3.d.cts +62 -31
  95. package/dist/contexts/typesV3.d.ts +62 -31
  96. package/dist/contexts/typesV3.js +31 -16
  97. package/dist/contexts/userIdentityContext/userIdentityContext.cjs +1 -1
  98. package/dist/contexts/userIdentityContext/userIdentityContext.d.cts +3 -3
  99. package/dist/contexts/userIdentityContext/userIdentityContext.d.ts +3 -3
  100. package/dist/contexts/userIdentityContext/userIdentityContext.js +1 -1
  101. package/dist/hooks/ChatToggle/useChatToggle.cjs +1 -1
  102. package/dist/hooks/ChatToggle/useChatToggle.js +1 -1
  103. package/dist/hooks/GrabAndScroll/useGrabAndScroll.d.cts +2 -2
  104. package/dist/hooks/GraphQLConfig/index.cjs +0 -1
  105. package/dist/hooks/GraphQLConfig/index.d.cts +2 -2
  106. package/dist/hooks/GraphQLConfig/index.d.ts +2 -2
  107. package/dist/hooks/GraphQLConfig/index.js +2 -2
  108. package/dist/hooks/GraphQLConfig/useGraphQLConfig.cjs +7 -66
  109. package/dist/hooks/GraphQLConfig/useGraphQLConfig.d.cts +5 -13
  110. package/dist/hooks/GraphQLConfig/useGraphQLConfig.d.ts +5 -13
  111. package/dist/hooks/GraphQLConfig/useGraphQLConfig.js +8 -66
  112. package/dist/hooks/Search/useSearch.cjs +3 -3
  113. package/dist/hooks/Search/useSearch.js +3 -3
  114. package/dist/services/amplitudeService/amplitudeService.cjs +4 -3
  115. package/dist/services/amplitudeService/amplitudeService.d.cts +1 -2
  116. package/dist/services/amplitudeService/amplitudeService.d.ts +1 -2
  117. package/dist/services/amplitudeService/amplitudeService.js +4 -3
  118. package/dist/services/enviveConfigService/enviveConfigService.cjs +25 -5
  119. package/dist/services/enviveConfigService/enviveConfigService.d.cts +24 -5
  120. package/dist/services/enviveConfigService/enviveConfigService.d.ts +24 -5
  121. package/dist/services/enviveConfigService/enviveConfigService.js +25 -6
  122. package/dist/services/enviveConfigService/fetchGraphQLConfig.cjs +181 -0
  123. package/dist/services/enviveConfigService/fetchGraphQLConfig.js +180 -0
  124. package/dist/services/enviveConfigService/index.cjs +2 -1
  125. package/dist/services/enviveConfigService/index.d.cts +2 -2
  126. package/dist/services/enviveConfigService/index.d.ts +2 -2
  127. package/dist/services/enviveConfigService/index.js +2 -2
  128. package/dist/services/hardcopyService/hardcopyService.cjs +232 -0
  129. package/dist/services/hardcopyService/hardcopyService.d.cts +39 -0
  130. package/dist/services/hardcopyService/hardcopyService.d.ts +39 -0
  131. package/dist/services/hardcopyService/hardcopyService.js +229 -0
  132. package/dist/services/hardcopyService/index.cjs +5 -0
  133. package/dist/services/hardcopyService/index.d.cts +2 -0
  134. package/dist/services/hardcopyService/index.d.ts +2 -0
  135. package/dist/services/hardcopyService/index.js +3 -0
  136. package/dist/services/userIdentityService/index.cjs +1 -0
  137. package/dist/services/userIdentityService/index.d.cts +2 -2
  138. package/dist/services/userIdentityService/index.d.ts +2 -2
  139. package/dist/services/userIdentityService/index.js +2 -2
  140. package/dist/services/userIdentityService/userIdentityService.cjs +13 -1
  141. package/dist/services/userIdentityService/userIdentityService.d.cts +12 -2
  142. package/dist/services/userIdentityService/userIdentityService.d.ts +12 -2
  143. package/dist/services/userIdentityService/userIdentityService.js +13 -2
  144. package/dist/types/enviveConfig.d.cts +1 -1
  145. package/dist/types/enviveConfig.d.ts +1 -1
  146. package/package.json +5 -1
  147. package/src/atoms/org/orgAnalyticsConfig.ts +0 -5
  148. package/src/contexts/amplitudeContext/amplitudeContext.tsx +0 -4
  149. package/src/contexts/enviveConfigContext/enviveConfigContext.tsx +37 -49
  150. package/src/contexts/enviveContext/enviveContext.tsx +72 -134
  151. package/src/contexts/enviveCssContext/enviveCssContext.tsx +32 -17
  152. package/src/contexts/graphqlContext/__tests__/graphqlContext.test.tsx +3 -36
  153. package/src/contexts/graphqlContext/graphqlContext.tsx +4 -304
  154. package/src/contexts/graphqlContext/mockV3Config.ts +30 -15
  155. package/src/contexts/hardcopyContext/hardcopyContext.tsx +12 -270
  156. package/src/contexts/newOrgConfigContext/__tests__/newOrgConfigContext.test.tsx +54 -478
  157. package/src/contexts/newOrgConfigContext/newOrgConfigContext.tsx +9 -26
  158. package/src/contexts/typesV3.ts +61 -30
  159. package/src/contexts/userIdentityContext/userIdentityContext.tsx +2 -2
  160. package/src/hooks/GraphQLConfig/useGraphQLConfig.ts +2 -62
  161. package/src/hooks/Search/__tests__/useSearch.test.tsx +2 -2
  162. package/src/services/amplitudeService/__tests__/amplitudeService.test.ts +3 -5
  163. package/src/services/amplitudeService/amplitudeService.ts +5 -3
  164. package/src/services/enviveConfigService/__tests__/fetchGraphQLConfig.test.ts +425 -0
  165. package/src/services/enviveConfigService/enviveConfigService.ts +41 -13
  166. package/src/services/enviveConfigService/fetchGraphQLConfig.ts +225 -0
  167. package/src/services/hardcopyService/__tests__/hardcopyService.test.ts +367 -0
  168. package/src/services/hardcopyService/hardcopyService.ts +271 -0
  169. package/src/services/hardcopyService/index.ts +1 -0
  170. package/src/services/userIdentityService/userIdentityService.ts +18 -0
@@ -1,301 +1,43 @@
1
1
  import { ReactNode, createContext, useCallback, useContext, useMemo, useState } from 'react';
2
2
  import Logger from 'src/application/logging/logger';
3
- import { v4 as uuid } from 'uuid';
4
- import CommerceApiClient from 'src/application/commerce-api';
5
- import { WidgetString, WidgetText } from 'src/application/models/api/widgetText';
6
- import { WidgetTextRequest } from 'src/application/models/api/widgetTextRequest';
3
+ import { HardcopyRequest, HardcopyResponse, IHardcopyService } from 'src/services/hardcopyService';
7
4
 
8
- import { useAtomValue } from 'jotai';
9
- import { appDetailsAtom } from 'src/atoms/app';
10
- import { EnviveMetricsEventName } from 'src/services/amplitudeService/amplitudeService';
11
- import { toCamelCase } from 'src/application/models/utils/snakeToCamelTransformer';
12
- import { UserEvent } from 'src/application/models';
13
- import { getQueryParam } from 'src/application/utils';
14
- import { WidgetTypeV3 } from '../typesV3';
15
- import { useFeatureFlagService } from '../featureFlagServiceContext/featureFlagServiceContext';
16
- import { useAmplitude } from '../amplitudeContext';
5
+ export type { HardcopyRequest, HardcopyResponse } from 'src/services/hardcopyService';
17
6
 
18
7
  const logger = new Logger('hardcopyContext');
19
8
 
20
- interface HardcopyRequest {
21
- widgetType: WidgetTypeV3;
22
- userEvent: UserEvent;
23
- }
24
-
25
- export type HardcopyResponse = {
26
- responseId: string;
27
- language: string;
28
- rawValues?: Record<string, WidgetString | WidgetString[]>;
29
- values: Record<string, string | string[]>;
30
- };
31
-
32
9
  interface HardcopyContextType {
33
- getHardcopy: (HardcopyRequest: HardcopyRequest) => Promise<HardcopyResponse>;
10
+ getHardcopy: (request: HardcopyRequest) => Promise<HardcopyResponse>;
34
11
  isLoading: boolean;
35
12
  }
36
13
 
37
- const convertToHardcopyResponse = (response: WidgetText): HardcopyResponse => {
38
- return {
39
- responseId: response.responseId,
40
- language: response.language,
41
- rawValues: response.values,
42
- values: Object.fromEntries(
43
- Object.entries(response.values).map(([key, value]) => [
44
- // Transform the key from snake_case to camelCase
45
- toCamelCase(key),
46
- value.length === 1 ? value[0].value : value.map(v => v.value),
47
- ]),
48
- ),
49
- };
50
- };
51
-
52
- // These are just sample responses for the sake of testing.
53
- // As we start to build the actual widgets we should determine what the actual
54
- // values and their names should be.
55
- const MOCK_HARDCOPY_RESPONSE: Partial<Record<WidgetTypeV3, HardcopyResponse>> = {
56
- [WidgetTypeV3.PromptCarouselV3]: {
57
- responseId: uuid(),
58
- language: 'en',
59
- values: {
60
- promptButtonTexts: [
61
- 'What are your best sellers?',
62
- 'Show me summer dresses',
63
- 'Do you have free shipping?',
64
- 'What sizes are available?',
65
- 'Can I return items?',
66
- ],
67
- },
68
- },
69
- [WidgetTypeV3.TitledPromptCarouselV3]: {
70
- responseId: 'mock-response-id',
71
- language: 'en',
72
- values: {
73
- titleLabel: 'Need some help?',
74
- promptButtonTexts: [
75
- 'What are your best sellers?',
76
- 'Show me summer dresses',
77
- 'Do you have free shipping?',
78
- 'What sizes are available?',
79
- 'Can I return items?',
80
- ],
81
- },
82
- },
83
- [WidgetTypeV3.SocialProofV3]: {
84
- responseId: 'mock-response-id',
85
- language: 'en',
86
- values: {
87
- titleLabel: 'Shopping Assistant',
88
- numberOfCustomersText: '123 customers',
89
- customerQueryText: 'found what they were looking for...',
90
- primaryButtonText: 'Start shopping',
91
- secondaryButtonTitleText: 'Popular searches',
92
- secondaryButtonTexts: [
93
- 'Why should I buy from you?',
94
- 'How do I return an item?',
95
- 'New arrivals',
96
- 'Sale items',
97
- 'Popular items',
98
- ],
99
- textFieldPlaceholderText: 'Ask me anything...',
100
- },
101
- },
102
- [WidgetTypeV3.TypingAnimationV3]: {
103
- responseId: 'mock-response-id',
104
- language: 'en',
105
- values: {
106
- titleLabel: 'Shopping Assistant',
107
- headlineText: 'Need help finding',
108
- animatedTextSequence: [
109
- 'the perfect gift for your loved ones?',
110
- 'something special for the holidays?',
111
- 'the ideal present for someone special?',
112
- ],
113
- hintText: 'Ask me anything',
114
- promptButtonTexts: [
115
- 'What are your best sellers?',
116
- 'Show me summer dresses',
117
- 'Do you have free shipping?',
118
- 'What sizes are available?',
119
- ],
120
- textFieldAriaLabel: 'Ask me anything',
121
- },
122
- },
123
- [WidgetTypeV3.ChatPreviewComparisonV3]: {
124
- responseId: 'mock-response-id',
125
- language: 'en',
126
- values: {
127
- titleLabel: 'Shopping Assistant',
128
- headlineText: 'Need help comparing?',
129
- textFieldPlaceholderText: 'Ask me anything...',
130
- },
131
- },
132
- [WidgetTypeV3.ChatPreviewLoadingV3]: {
133
- responseId: 'mock-response-id',
134
- language: 'en',
135
- values: {
136
- titleLabel: 'Shopping Assistant',
137
- textFieldPlaceholderText: 'Ask me anything...',
138
- },
139
- },
140
- [WidgetTypeV3.ChatPreviewV3]: {
141
- responseId: 'mock-response-id',
142
- language: 'en',
143
- values: {
144
- titleLabel: 'Shopping Assistant',
145
- textFieldPlaceholderText: 'Ask me anything...',
146
- },
147
- },
148
- [WidgetTypeV3.PromptButtonCarouselWithImageV3]: {
149
- responseId: 'mock-response-id',
150
- language: 'en',
151
- values: {
152
- titleLabel: 'Need some help?',
153
- promptButtonsTexts: ['Help me find a product', "What's on your mind?", 'Talk to a human'],
154
- textFieldPlaceholderText: 'Ask me anything...',
155
- },
156
- },
157
- [WidgetTypeV3.ProductCardV3]: {
158
- responseId: 'mock-response-id',
159
- language: 'en',
160
- values: {
161
- headline: 'Discover Your Perfect Style',
162
- animatedText: [
163
- 'the perfect outfit for any occasion',
164
- 'trending fashion that fits your lifestyle',
165
- 'quality pieces that last',
166
- ],
167
- prompts: [
168
- 'What are your best sellers?',
169
- 'Show me summer dresses',
170
- 'Do you have free shipping?',
171
- 'What sizes are available?',
172
- 'Can I return items?',
173
- ],
174
- placeholder: 'Ask me anything...',
175
- },
176
- },
177
- [WidgetTypeV3.FloatingChatV3]: {
178
- responseId: 'mock-response-id',
179
- language: 'en',
180
- values: {
181
- welcomeMessageTitle: 'Welcome to Envive AI',
182
- welcomeMessageText:
183
- 'Your personal shopper trained on the collective knowledge of thousands of real experts!',
184
- chatFooterTextFieldPlaceholderText: 'Ask me anything...',
185
- disclaimerText: 'This is a disclaimer...',
186
- leftToggleLabel: 'Shop with AI',
187
- rightToggleLabel: 'Live support',
188
- },
189
- },
190
- [WidgetTypeV3.FullPageSalesAgentV3]: {
191
- responseId: 'mock-response-id',
192
- language: 'en',
193
- values: {
194
- welcomeMessageTitle: 'Welcome to Envive AI',
195
- welcomeMessageText:
196
- 'Your personal shopper trained on the collective knowledge of thousands of real experts!',
197
- chatFooterTextFieldPlaceholderText: 'Ask me anything...',
198
- disclaimerText: 'This is a disclaimer...',
199
- },
200
- },
201
- };
202
-
203
14
  const HardcopyContext = createContext<HardcopyContextType | undefined>(undefined);
204
15
 
205
16
  interface HardcopyProviderProps {
206
17
  children: ReactNode;
207
- hardcopyOverride?: Partial<Record<WidgetTypeV3, HardcopyResponse>>;
18
+ hardcopyService: IHardcopyService;
208
19
  }
209
20
 
210
21
  export const HardcopyProvider: React.FC<HardcopyProviderProps> = ({
211
22
  children,
212
- hardcopyOverride,
23
+ hardcopyService,
213
24
  }) => {
214
- const languages = useMemo(() => navigator.languages, []);
215
25
  const [isLoading, setIsLoading] = useState(false);
216
- const context = useAtomValue(appDetailsAtom);
217
- const { trackEvent } = useAmplitude();
218
-
219
- const { featureFlagService } = useFeatureFlagService();
220
- const getHardcopyFromBackend = useCallback(
221
- async (request: HardcopyRequest): Promise<HardcopyResponse> => {
222
- const fallbackWidgetType =
223
- request.widgetType === WidgetTypeV3.ProductCardV3
224
- ? WidgetTypeV3.ImagePromptCardV3
225
- : request.widgetType;
226
-
227
- const overrideEntry =
228
- hardcopyOverride?.[request.widgetType] ?? hardcopyOverride?.[fallbackWidgetType];
229
- if (overrideEntry) {
230
- logger.logDebug('using hardcopy override', request.widgetType);
231
- return overrideEntry;
232
- }
233
-
234
- const overrideConfigVersion =
235
- getQueryParam('spiffy_config_version') ||
236
- getQueryParam('envive_config_version') ||
237
- undefined;
238
- const widgetTextRequest: WidgetTextRequest = {
239
- requestId: uuid(),
240
- widgetType: request.widgetType,
241
- context,
242
- featureFlags: featureFlagService?.getFeatureFlags() || {},
243
- language: languages[0] || 'en',
244
- overrideConfigVersion,
245
- url: window.location.href,
246
- };
247
- trackEvent({
248
- eventName: EnviveMetricsEventName.WidgetTextRequest,
249
- eventProps: {
250
- widget_type: request.widgetType,
251
- request_id: widgetTextRequest.requestId,
252
- },
253
- });
254
- try {
255
- const response = await CommerceApiClient.getHardcopy(widgetTextRequest);
256
- if (response) {
257
- const convertedResponse = convertToHardcopyResponse(response);
258
- logger.logDebug('converted response', convertedResponse);
259
- trackEvent({
260
- eventName: EnviveMetricsEventName.WidgetTextResponse,
261
- eventProps: {
262
- widget_type: request.widgetType,
263
- response_id: response.responseId,
264
- widget_text: response.values,
265
- request_id: widgetTextRequest.requestId,
266
- },
267
- });
268
- return convertedResponse;
269
- }
270
- } catch (error) {
271
- logger.logError('error getting hardcopy from backend', error);
272
- }
273
- const mockResponse = MOCK_HARDCOPY_RESPONSE[request.widgetType];
274
- if (mockResponse) {
275
- logger.logDebug('no real response, using mock', mockResponse);
276
- return mockResponse;
277
- }
278
- throw new Error(`No hardcopy response found for widget type: ${request.widgetType}`);
279
- },
280
- [context, featureFlagService, hardcopyOverride, languages, trackEvent],
281
- );
282
26
 
283
27
  const getHardcopy = useCallback(
284
28
  async (request: HardcopyRequest): Promise<HardcopyResponse> => {
285
29
  setIsLoading(true);
286
- logger.logDebug('retrieving hardcopy', languages);
287
-
30
+ logger.logDebug('retrieving hardcopy');
288
31
  logger.logDebug('request', request);
289
- const response = await getHardcopyFromBackend(request);
290
- logger.logDebug('returning hardcopy response', response);
291
- if (!response) {
32
+ try {
33
+ const response = await hardcopyService.getHardcopy(request);
34
+ logger.logDebug('returning hardcopy response', response);
35
+ return response;
36
+ } finally {
292
37
  setIsLoading(false);
293
- throw new Error(`No hardcopy response found for widget type: ${request.widgetType}`);
294
38
  }
295
- setIsLoading(false);
296
- return response;
297
39
  },
298
- [getHardcopyFromBackend, languages],
40
+ [hardcopyService],
299
41
  );
300
42
 
301
43
  const value = useMemo(() => ({ getHardcopy, isLoading }), [getHardcopy, isLoading]);