@solucx/react-native-solucx-widget 0.2.5 → 2.0.7

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 (256) hide show
  1. package/README.md +526 -182
  2. package/lib/SoluCXWidget.d.ts +50 -7
  3. package/lib/SoluCXWidget.d.ts.map +1 -1
  4. package/lib/SoluCXWidget.js +105 -101
  5. package/lib/SoluCXWidget.js.map +1 -1
  6. package/lib/SoluCXWidgetHost.d.ts +3 -0
  7. package/lib/SoluCXWidgetHost.d.ts.map +1 -0
  8. package/lib/SoluCXWidgetHost.js +34 -0
  9. package/lib/SoluCXWidgetHost.js.map +1 -0
  10. package/lib/SoluCXWidgetView.d.ts +12 -0
  11. package/lib/SoluCXWidgetView.d.ts.map +1 -0
  12. package/lib/SoluCXWidgetView.js +61 -0
  13. package/lib/SoluCXWidgetView.js.map +1 -0
  14. package/lib/components/CloseButton.d.ts +1 -1
  15. package/lib/components/CloseButton.d.ts.map +1 -1
  16. package/lib/components/CloseButton.js +4 -1
  17. package/lib/components/CloseButton.js.map +1 -1
  18. package/lib/components/InlineWidget.d.ts.map +1 -1
  19. package/lib/components/InlineWidget.js +2 -7
  20. package/lib/components/InlineWidget.js.map +1 -1
  21. package/lib/components/ModalWidget.d.ts +1 -1
  22. package/lib/components/ModalWidget.d.ts.map +1 -1
  23. package/lib/components/ModalWidget.js +3 -16
  24. package/lib/components/ModalWidget.js.map +1 -1
  25. package/lib/components/OverlayWidget.d.ts.map +1 -1
  26. package/lib/components/OverlayWidget.js +5 -15
  27. package/lib/components/OverlayWidget.js.map +1 -1
  28. package/lib/components/index.d.ts +5 -0
  29. package/lib/components/index.d.ts.map +1 -0
  30. package/lib/components/index.js +12 -0
  31. package/lib/components/index.js.map +1 -0
  32. package/lib/constants/Constants.d.ts +11 -0
  33. package/lib/constants/Constants.d.ts.map +1 -1
  34. package/lib/constants/Constants.js +16 -1
  35. package/lib/constants/Constants.js.map +1 -1
  36. package/lib/{interfaces → domain}/WidgetCallbacks.d.ts +2 -2
  37. package/lib/domain/WidgetCallbacks.d.ts.map +1 -0
  38. package/lib/domain/WidgetCallbacks.js.map +1 -0
  39. package/{src/interfaces/WidgetData.ts → lib/domain/WidgetData.d.ts} +5 -2
  40. package/lib/domain/WidgetData.d.ts.map +1 -0
  41. package/lib/{interfaces → domain}/WidgetData.js.map +1 -1
  42. package/lib/domain/WidgetDisplayResult.d.ts +6 -0
  43. package/lib/domain/WidgetDisplayResult.d.ts.map +1 -0
  44. package/lib/domain/WidgetDisplayResult.js +3 -0
  45. package/lib/domain/WidgetDisplayResult.js.map +1 -0
  46. package/lib/domain/WidgetOptions.d.ts +27 -0
  47. package/lib/domain/WidgetOptions.d.ts.map +1 -0
  48. package/lib/domain/WidgetOptions.js +30 -0
  49. package/lib/domain/WidgetOptions.js.map +1 -0
  50. package/lib/domain/WidgetResponse.d.ts +5 -0
  51. package/lib/domain/WidgetResponse.d.ts.map +1 -0
  52. package/lib/{interfaces/WidgetOptions.js → domain/WidgetResponse.js} +1 -1
  53. package/lib/domain/WidgetResponse.js.map +1 -0
  54. package/lib/domain/WidgetSamplerLog.d.ts +12 -0
  55. package/lib/domain/WidgetSamplerLog.d.ts.map +1 -0
  56. package/lib/domain/WidgetSamplerLog.js.map +1 -0
  57. package/lib/{interfaces → domain}/index.d.ts +1 -2
  58. package/lib/domain/index.d.ts.map +1 -0
  59. package/lib/{interfaces → domain}/index.js.map +1 -1
  60. package/lib/hooks/index.d.ts +2 -2
  61. package/lib/hooks/index.d.ts.map +1 -1
  62. package/lib/hooks/index.js +5 -5
  63. package/lib/hooks/index.js.map +1 -1
  64. package/lib/hooks/useClientVersionCollector.d.ts +3 -0
  65. package/lib/hooks/useClientVersionCollector.d.ts.map +1 -0
  66. package/lib/{services/ClientVersionCollector.js → hooks/useClientVersionCollector.js} +7 -2
  67. package/lib/hooks/useClientVersionCollector.js.map +1 -0
  68. package/lib/hooks/useHeightAnimation.d.ts +0 -1
  69. package/lib/hooks/useHeightAnimation.d.ts.map +1 -1
  70. package/lib/hooks/useHeightAnimation.js +4 -2
  71. package/lib/hooks/useHeightAnimation.js.map +1 -1
  72. package/lib/hooks/useWidget.d.ts +13 -0
  73. package/lib/hooks/useWidget.d.ts.map +1 -0
  74. package/lib/hooks/useWidget.js +44 -0
  75. package/lib/hooks/useWidget.js.map +1 -0
  76. package/lib/hooks/useWidgetBootstrap.d.ts +21 -0
  77. package/lib/hooks/useWidgetBootstrap.d.ts.map +1 -0
  78. package/lib/hooks/useWidgetBootstrap.js +87 -0
  79. package/lib/hooks/useWidgetBootstrap.js.map +1 -0
  80. package/lib/hooks/useWidgetServices.d.ts +19 -0
  81. package/lib/hooks/useWidgetServices.d.ts.map +1 -0
  82. package/lib/hooks/useWidgetServices.js +34 -0
  83. package/lib/hooks/useWidgetServices.js.map +1 -0
  84. package/lib/hooks/useWidgetUI.d.ts +9 -0
  85. package/lib/hooks/useWidgetUI.d.ts.map +1 -0
  86. package/lib/hooks/useWidgetUI.js +33 -0
  87. package/lib/hooks/useWidgetUI.js.map +1 -0
  88. package/lib/index.d.ts +10 -11
  89. package/lib/index.d.ts.map +1 -1
  90. package/lib/index.js +13 -38
  91. package/lib/index.js.map +1 -1
  92. package/lib/services/UserIdentificationService.d.ts +3 -0
  93. package/lib/services/UserIdentificationService.d.ts.map +1 -0
  94. package/lib/services/UserIdentificationService.js +17 -0
  95. package/lib/services/UserIdentificationService.js.map +1 -0
  96. package/lib/services/WidgetBootstrapService.d.ts +12 -0
  97. package/lib/services/WidgetBootstrapService.d.ts.map +1 -0
  98. package/lib/services/{widgetBootstrapService.js → WidgetBootstrapService.js} +36 -15
  99. package/lib/services/WidgetBootstrapService.js.map +1 -0
  100. package/lib/services/WidgetEventService.d.ts +8 -0
  101. package/lib/services/WidgetEventService.d.ts.map +1 -0
  102. package/lib/services/WidgetEventService.js +14 -0
  103. package/lib/services/WidgetEventService.js.map +1 -0
  104. package/lib/services/WidgetStateManager.d.ts +20 -0
  105. package/lib/services/WidgetStateManager.d.ts.map +1 -0
  106. package/lib/services/WidgetStateManager.js +93 -0
  107. package/lib/services/WidgetStateManager.js.map +1 -0
  108. package/lib/services/WidgetValidationService.d.ts +17 -0
  109. package/lib/services/WidgetValidationService.d.ts.map +1 -0
  110. package/lib/services/WidgetValidationService.js +132 -0
  111. package/lib/services/WidgetValidationService.js.map +1 -0
  112. package/lib/services/events/EventHandlerFactory.d.ts +18 -0
  113. package/lib/services/events/EventHandlerFactory.d.ts.map +1 -0
  114. package/lib/services/events/EventHandlerFactory.js +67 -0
  115. package/lib/services/events/EventHandlerFactory.js.map +1 -0
  116. package/lib/services/events/EventHandlers.d.ts +10 -0
  117. package/lib/services/events/EventHandlers.d.ts.map +1 -0
  118. package/lib/services/events/EventHandlers.js +72 -0
  119. package/lib/services/events/EventHandlers.js.map +1 -0
  120. package/lib/services/events/index.d.ts +3 -0
  121. package/lib/services/events/index.d.ts.map +1 -0
  122. package/lib/services/events/index.js +21 -0
  123. package/lib/services/events/index.js.map +1 -0
  124. package/lib/services/height/HeightStrategies.d.ts +3 -0
  125. package/lib/services/height/HeightStrategies.d.ts.map +1 -0
  126. package/lib/services/height/HeightStrategies.js +14 -0
  127. package/lib/services/height/HeightStrategies.js.map +1 -0
  128. package/lib/services/storage/AsyncStorageService.d.ts +13 -0
  129. package/lib/services/storage/AsyncStorageService.d.ts.map +1 -0
  130. package/lib/services/storage/AsyncStorageService.js +73 -0
  131. package/lib/services/storage/AsyncStorageService.js.map +1 -0
  132. package/lib/services/storage/IStorageService.d.ts +30 -0
  133. package/lib/services/storage/IStorageService.d.ts.map +1 -0
  134. package/lib/services/storage/IStorageService.js +3 -0
  135. package/lib/services/storage/IStorageService.js.map +1 -0
  136. package/lib/services/storage/StorageIdBuilder.d.ts +11 -0
  137. package/lib/services/storage/StorageIdBuilder.d.ts.map +1 -0
  138. package/lib/services/storage/StorageIdBuilder.js +17 -0
  139. package/lib/services/storage/StorageIdBuilder.js.map +1 -0
  140. package/lib/services/storage/index.d.ts +3 -0
  141. package/lib/services/storage/index.d.ts.map +1 -0
  142. package/lib/services/storage/index.js +6 -0
  143. package/lib/services/storage/index.js.map +1 -0
  144. package/lib/styles/widgetStyles.d.ts +1 -1
  145. package/lib/styles/widgetStyles.d.ts.map +1 -1
  146. package/package.json +8 -2
  147. package/src/SoluCXWidget.ts +144 -0
  148. package/src/SoluCXWidgetHost.tsx +44 -0
  149. package/src/SoluCXWidgetView.tsx +97 -0
  150. package/src/__tests__/ClientVersionCollector.test.ts +5 -5
  151. package/src/__tests__/OverlayWidget.rendering.test.tsx +12 -14
  152. package/src/__tests__/SoluCXWidget.rendering.test.tsx +103 -60
  153. package/src/__tests__/SoluCXWidget.test.ts +448 -0
  154. package/src/__tests__/WidgetValidationService.test.ts +408 -0
  155. package/src/__tests__/e2e/widget-lifecycle.test.tsx +14 -23
  156. package/src/__tests__/index.test.tsx +39 -0
  157. package/src/__tests__/integration/webview-communication-simple.test.tsx +8 -6
  158. package/src/__tests__/integration/webview-communication.test.tsx +127 -130
  159. package/src/__tests__/normalizeWidgetOptions.test.ts +80 -0
  160. package/src/__tests__/useWidgetBootstrap.test.ts +634 -0
  161. package/src/__tests__/useWidgetState.test.ts +56 -13
  162. package/src/__tests__/widgetBootstrapService.test.ts +15 -17
  163. package/src/components/CloseButton.tsx +6 -2
  164. package/src/components/InlineWidget.tsx +4 -9
  165. package/src/components/ModalWidget.tsx +15 -45
  166. package/src/components/OverlayWidget.tsx +5 -15
  167. package/src/components/index.ts +4 -0
  168. package/src/constants/Constants.ts +15 -0
  169. package/src/{interfaces → domain}/WidgetCallbacks.ts +2 -2
  170. package/{lib/interfaces/WidgetData.d.ts → src/domain/WidgetData.ts} +3 -2
  171. package/src/domain/WidgetDisplayResult.ts +16 -0
  172. package/src/domain/WidgetOptions.ts +53 -0
  173. package/src/domain/WidgetResponse.ts +5 -0
  174. package/src/domain/WidgetSamplerLog.ts +11 -0
  175. package/src/{interfaces → domain}/index.ts +1 -2
  176. package/src/hooks/index.ts +2 -2
  177. package/src/{services/ClientVersionCollector.ts → hooks/useClientVersionCollector.ts} +6 -0
  178. package/src/hooks/useHeightAnimation.ts +6 -3
  179. package/src/hooks/useWidget.ts +46 -0
  180. package/src/hooks/useWidgetBootstrap.ts +117 -0
  181. package/src/hooks/useWidgetServices.ts +44 -0
  182. package/src/hooks/useWidgetUI.ts +38 -0
  183. package/src/index.ts +16 -11
  184. package/src/services/UserIdentificationService.ts +14 -0
  185. package/src/services/{widgetBootstrapService.ts → WidgetBootstrapService.ts} +43 -19
  186. package/src/services/WidgetEventService.ts +15 -0
  187. package/src/services/WidgetStateManager.ts +115 -0
  188. package/src/services/WidgetValidationService.ts +149 -0
  189. package/src/services/events/EventHandlerFactory.ts +70 -0
  190. package/src/services/events/EventHandlers.ts +67 -0
  191. package/src/services/events/index.ts +2 -0
  192. package/src/services/height/HeightStrategies.ts +15 -0
  193. package/src/services/storage/AsyncStorageService.ts +74 -0
  194. package/src/services/storage/IStorageService.ts +32 -0
  195. package/src/services/storage/StorageIdBuilder.ts +15 -0
  196. package/src/services/storage/index.ts +2 -0
  197. package/src/styles/widgetStyles.ts +1 -1
  198. package/README.intern.md +0 -490
  199. package/lib/constants/webViewConstants.d.ts +0 -12
  200. package/lib/constants/webViewConstants.d.ts.map +0 -1
  201. package/lib/constants/webViewConstants.js +0 -19
  202. package/lib/constants/webViewConstants.js.map +0 -1
  203. package/lib/hooks/useWidgetHeight.d.ts +0 -13
  204. package/lib/hooks/useWidgetHeight.d.ts.map +0 -1
  205. package/lib/hooks/useWidgetHeight.js +0 -21
  206. package/lib/hooks/useWidgetHeight.js.map +0 -1
  207. package/lib/hooks/useWidgetState.d.ts +0 -15
  208. package/lib/hooks/useWidgetState.d.ts.map +0 -1
  209. package/lib/hooks/useWidgetState.js +0 -79
  210. package/lib/hooks/useWidgetState.js.map +0 -1
  211. package/lib/interfaces/WidgetCallbacks.d.ts.map +0 -1
  212. package/lib/interfaces/WidgetCallbacks.js.map +0 -1
  213. package/lib/interfaces/WidgetData.d.ts.map +0 -1
  214. package/lib/interfaces/WidgetOptions.d.ts +0 -9
  215. package/lib/interfaces/WidgetOptions.d.ts.map +0 -1
  216. package/lib/interfaces/WidgetOptions.js.map +0 -1
  217. package/lib/interfaces/WidgetResponse.d.ts +0 -10
  218. package/lib/interfaces/WidgetResponse.d.ts.map +0 -1
  219. package/lib/interfaces/WidgetResponse.js +0 -12
  220. package/lib/interfaces/WidgetResponse.js.map +0 -1
  221. package/lib/interfaces/WidgetSamplerLog.d.ts +0 -7
  222. package/lib/interfaces/WidgetSamplerLog.d.ts.map +0 -1
  223. package/lib/interfaces/WidgetSamplerLog.js.map +0 -1
  224. package/lib/interfaces/index.d.ts.map +0 -1
  225. package/lib/services/ClientVersionCollector.d.ts +0 -2
  226. package/lib/services/ClientVersionCollector.d.ts.map +0 -1
  227. package/lib/services/ClientVersionCollector.js.map +0 -1
  228. package/lib/services/storage.d.ts +0 -8
  229. package/lib/services/storage.d.ts.map +0 -1
  230. package/lib/services/storage.js +0 -23
  231. package/lib/services/storage.js.map +0 -1
  232. package/lib/services/widgetBootstrapService.d.ts +0 -6
  233. package/lib/services/widgetBootstrapService.d.ts.map +0 -1
  234. package/lib/services/widgetBootstrapService.js.map +0 -1
  235. package/lib/services/widgetEventService.d.ts +0 -19
  236. package/lib/services/widgetEventService.d.ts.map +0 -1
  237. package/lib/services/widgetEventService.js +0 -79
  238. package/lib/services/widgetEventService.js.map +0 -1
  239. package/lib/services/widgetValidationService.d.ts +0 -18
  240. package/lib/services/widgetValidationService.d.ts.map +0 -1
  241. package/lib/services/widgetValidationService.js +0 -71
  242. package/lib/services/widgetValidationService.js.map +0 -1
  243. package/src/SoluCXWidget.tsx +0 -179
  244. package/src/constants/webViewConstants.ts +0 -15
  245. package/src/hooks/useWidgetHeight.ts +0 -38
  246. package/src/hooks/useWidgetState.ts +0 -101
  247. package/src/interfaces/WidgetOptions.ts +0 -8
  248. package/src/interfaces/WidgetResponse.ts +0 -15
  249. package/src/interfaces/WidgetSamplerLog.ts +0 -6
  250. package/src/services/storage.ts +0 -21
  251. package/src/services/widgetEventService.ts +0 -110
  252. package/src/services/widgetValidationService.ts +0 -102
  253. /package/lib/{interfaces → domain}/WidgetCallbacks.js +0 -0
  254. /package/lib/{interfaces → domain}/WidgetData.js +0 -0
  255. /package/lib/{interfaces → domain}/WidgetSamplerLog.js +0 -0
  256. /package/lib/{interfaces → domain}/index.js +0 -0
@@ -1,101 +0,0 @@
1
- import { useState, useCallback, useMemo } from 'react';
2
- import { Dimensions } from 'react-native';
3
- import type {
4
- WidgetData,
5
- WidgetOptions,
6
- WidgetType,
7
- WidgetSamplerLog
8
- } from '../interfaces';
9
- import { StorageService } from '../services/storage';
10
-
11
- function getUserId(widgetData: WidgetData): string {
12
- return (
13
- widgetData?.customer_id ??
14
- widgetData?.document ??
15
- widgetData?.email ??
16
- 'default_user'
17
- );
18
- }
19
-
20
- export const useWidgetState = (
21
- data: WidgetData,
22
- options?: WidgetOptions,
23
- type?: WidgetType
24
- ) => {
25
- const [savedData, setSavedData] = useState<WidgetSamplerLog | null>(null);
26
- const [isWidgetVisible, setIsWidgetVisible] = useState<boolean>(false);
27
-
28
- const userId = getUserId(data);
29
-
30
- const storageService = useMemo(() => new StorageService(userId), [userId]);
31
-
32
- const screenHeight = Dimensions.get('screen').height;
33
- const height = options?.height ? Number(options.height) : undefined;
34
-
35
- const [widgetHeight, setWidgetHeight] = useState<number>(height ?? 300);
36
-
37
- const loadSavedData = useCallback(async () => {
38
- try {
39
- const jsonValue = await storageService.read();
40
- setSavedData(jsonValue);
41
- } catch (error) {
42
- console.error('Error loading storage data:', error);
43
- }
44
- }, [storageService]);
45
-
46
- const saveData = useCallback(
47
- async (data: WidgetSamplerLog) => {
48
- try {
49
- await storageService.write(data);
50
- setSavedData(data);
51
- } catch (error) {
52
- console.error('Error saving storage data:', error);
53
- }
54
- },
55
- [storageService]
56
- );
57
-
58
- const open = useCallback(async () => {
59
- const userLogs = await storageService.read();
60
- userLogs.attempts = (userLogs.attempts || 0) + 1;
61
- userLogs.lastAttempt = Date.now();
62
- try {
63
- await storageService.write(userLogs);
64
- setSavedData(userLogs);
65
- } catch (error) {
66
- console.error('Error saving storage data:', error);
67
- }
68
- setIsWidgetVisible(true);
69
- }, [storageService]);
70
-
71
- const close = useCallback(() => {
72
- setIsWidgetVisible(false);
73
- }, []);
74
-
75
- const resize = useCallback(
76
- (value: string) => {
77
- const receivedHeight = Number(value);
78
-
79
- if (height !== undefined) {
80
- setWidgetHeight(height);
81
- } else if (receivedHeight > 0) {
82
- setWidgetHeight(receivedHeight);
83
- }
84
- },
85
- [height]
86
- );
87
-
88
- return {
89
- savedData,
90
- widgetHeight,
91
- isWidgetVisible,
92
- setIsWidgetVisible,
93
- loadSavedData,
94
- saveData,
95
- open,
96
- close,
97
- resize,
98
- userId,
99
- screenHeight
100
- };
101
- };
@@ -1,8 +0,0 @@
1
- export interface WidgetOptions {
2
- height?: number;
3
- retry?: {
4
- attempts?: number;
5
- interval?: number;
6
- };
7
- waitDelayAfterRating?: number;
8
- }
@@ -1,15 +0,0 @@
1
- export interface WidgetResponse {
2
- status?: "success" | "error";
3
- message?: string;
4
- }
5
-
6
- export class WidgetError extends Error implements WidgetResponse {
7
- status: "error";
8
- message: string;
9
-
10
- constructor(message: string) {
11
- super(message);
12
- this.status = "error";
13
- this.message = message;
14
- }
15
- }
@@ -1,6 +0,0 @@
1
- export interface WidgetSamplerLog {
2
- attempts: number;
3
- lastAttempt: number;
4
- lastRating: number;
5
- lastParcial: number;
6
- }
@@ -1,21 +0,0 @@
1
- import AsyncStorage from '@react-native-async-storage/async-storage';
2
- import type { WidgetSamplerLog } from '../interfaces';
3
- import { STORAGE_KEY } from '../constants/webViewConstants';
4
-
5
- export class StorageService {
6
- private key: string;
7
-
8
- constructor(key: string) {
9
- this.key = `${STORAGE_KEY}_${key}`;
10
- }
11
-
12
- async write(data: WidgetSamplerLog): Promise<void> {
13
- const json = JSON.stringify(data);
14
- await AsyncStorage.setItem(this.key, json);
15
- }
16
-
17
- async read(): Promise<WidgetSamplerLog> {
18
- const json = await AsyncStorage.getItem(this.key);
19
- return json ? JSON.parse(json) as WidgetSamplerLog : {} as WidgetSamplerLog;
20
- }
21
- }
@@ -1,110 +0,0 @@
1
- import type {
2
- EventKey,
3
- SurveyEventKey,
4
- WidgetResponse,
5
- WidgetCallbacks,
6
- } from "../interfaces";
7
-
8
- export class WidgetEventService {
9
- private setIsWidgetVisible: (visible: boolean) => void;
10
- private resize: (value: string) => void;
11
- private userId: string;
12
- private callbacks?: WidgetCallbacks;
13
-
14
- constructor(
15
- setIsWidgetVisible: (visible: boolean) => void,
16
- resize: (value: string) => void,
17
- userId: string,
18
- callbacks?: WidgetCallbacks,
19
- ) {
20
- this.setIsWidgetVisible = setIsWidgetVisible;
21
- this.resize = resize;
22
- this.userId = userId;
23
- this.callbacks = callbacks;
24
- }
25
-
26
- async handleMessage(
27
- message: string,
28
- isForm: boolean,
29
- ): Promise<WidgetResponse> {
30
- const [eventKey, value = ""] = message.split("-");
31
- const processedKey = isForm
32
- ? (eventKey as EventKey)
33
- : this.adaptSurveyKeyToWidgetKey(eventKey as SurveyEventKey);
34
-
35
- return await this.executeEvent(processedKey, value);
36
- }
37
-
38
- private async executeEvent(
39
- eventKey: EventKey,
40
- value: string,
41
- ): Promise<WidgetResponse> {
42
- const eventHandlers = {
43
- FORM_CLOSE: () => this.handleFormClose(),
44
- FORM_ERROR: (value: string) => this.handleFormError(value),
45
- FORM_PAGECHANGED: (value: string) => this.handlePageChanged(value),
46
- QUESTION_ANSWERED: () => this.handleQuestionAnswered(),
47
- FORM_COMPLETED: () => this.handleFormCompleted(),
48
- FORM_PARTIALCOMPLETED: () => this.handlePartialCompleted(),
49
- FORM_RESIZE: (value: string) => this.handleResize(value),
50
- };
51
-
52
- const handler = eventHandlers[eventKey];
53
- return await (handler?.(value) || {
54
- status: "error",
55
- message: "Unknown event",
56
- });
57
- }
58
-
59
- private handleFormClose(): WidgetResponse {
60
- this.setIsWidgetVisible(false);
61
- this.callbacks?.onClosed?.();
62
- return { status: "success" };
63
- }
64
-
65
- private handleFormError(value: string): WidgetResponse {
66
- this.setIsWidgetVisible(false);
67
- this.callbacks?.onError?.(value);
68
- return { status: "error", message: value };
69
- }
70
-
71
- private handlePageChanged(value: string): WidgetResponse {
72
- this.callbacks?.onPageChanged?.(value);
73
- return { status: "success" };
74
- }
75
-
76
- private handleQuestionAnswered(): WidgetResponse {
77
- this.callbacks?.onQuestionAnswered?.();
78
- return { status: "success" };
79
- }
80
-
81
- private handleFormCompleted(): WidgetResponse {
82
- this.callbacks?.onCompleted?.(this.userId);
83
- return { status: "success" };
84
- }
85
-
86
- private handlePartialCompleted(): WidgetResponse {
87
- this.callbacks?.onPartialCompleted?.(this.userId);
88
- return { status: "success" };
89
- }
90
-
91
- private handleResize(value: string): WidgetResponse {
92
- this.resize(value);
93
- this.callbacks?.onResize?.(value);
94
- return { status: "success" };
95
- }
96
-
97
- private adaptSurveyKeyToWidgetKey(key: SurveyEventKey): EventKey {
98
- const keyMapping = {
99
- closeSoluCXWidget: "FORM_CLOSE",
100
- dismissSoluCXWidget: "FORM_CLOSE",
101
- completeSoluCXWidget: "FORM_COMPLETED",
102
- partialSoluCXWidget: "FORM_PARTIALCOMPLETED",
103
- resizeSoluCXWidget: "FORM_RESIZE",
104
- openSoluCXWidget: "FORM_OPENED",
105
- errorSoluCXWidget: "FORM_ERROR",
106
- } as const;
107
-
108
- return keyMapping[key] as EventKey;
109
- }
110
- }
@@ -1,102 +0,0 @@
1
- import type { WidgetOptions, WidgetSamplerLog } from "../interfaces";
2
- import { StorageService } from "./storage";
3
-
4
- export type BlockReason =
5
- | "BLOCKED_BY_RATING_INTERVAL"
6
- | "BLOCKED_BY_PARTIAL_INTERVAL"
7
- | "BLOCKED_BY_MAX_RETRY_ATTEMPTS";
8
-
9
- export interface WidgetDisplayResult {
10
- canDisplay: boolean;
11
- blockReason?: BlockReason;
12
- }
13
-
14
- export class WidgetValidationService {
15
- private storageService: StorageService;
16
-
17
- constructor(userId: string) {
18
- this.storageService = new StorageService(userId);
19
- }
20
-
21
- async shouldDisplayWidget(widgetOptions: WidgetOptions): Promise<WidgetDisplayResult> {
22
- const { retry, waitDelayAfterRating = 60 } = widgetOptions;
23
- const { attempts = 5, interval = 1 } = retry || {};
24
- const userLog = await this.getLog();
25
- const now = Date.now();
26
- const dayInMilliseconds = 86400000;
27
-
28
- if (this.isWithinCollectInterval(userLog, waitDelayAfterRating, now, dayInMilliseconds)) {
29
- return { canDisplay: false, blockReason: "BLOCKED_BY_RATING_INTERVAL" };
30
- }
31
- if (this.isWithinCollectPartialInterval(userLog, waitDelayAfterRating, now, dayInMilliseconds)) {
32
- return { canDisplay: false, blockReason: "BLOCKED_BY_PARTIAL_INTERVAL" };
33
- }
34
- if (this.isWithinRetryInterval(userLog, interval, attempts, now, dayInMilliseconds)) {
35
- return { canDisplay: false, blockReason: "BLOCKED_BY_MAX_RETRY_ATTEMPTS" };
36
- }
37
-
38
- await this.resetAttemptsIfNeeded(userLog, attempts);
39
- await this.setLog(userLog);
40
- return { canDisplay: true };
41
- }
42
-
43
- private async getLog(): Promise<WidgetSamplerLog> {
44
- try {
45
- return await this.storageService.read();
46
- } catch (error) {
47
- console.error("Error reading widget log:", error);
48
- return {
49
- attempts: 0,
50
- lastAttempt: 0,
51
- lastRating: 0,
52
- lastParcial: 0,
53
- };
54
- }
55
- }
56
-
57
- private async setLog(userLog: WidgetSamplerLog): Promise<void> {
58
- try {
59
- await this.storageService.write(userLog);
60
- } catch (error) {
61
- console.error("Error writing widget log:", error);
62
- }
63
- }
64
-
65
- private isWithinCollectInterval(
66
- userLog: WidgetSamplerLog,
67
- waitDelayAfterRating: number,
68
- now: number,
69
- dayInMilliseconds: number,
70
- ): boolean {
71
- const timeSinceLastRating = now - userLog.lastRating;
72
- return userLog.lastRating > 0 && timeSinceLastRating < waitDelayAfterRating * dayInMilliseconds;
73
- }
74
-
75
- private isWithinCollectPartialInterval(
76
- userLog: WidgetSamplerLog,
77
- waitDelayAfterRating: number,
78
- now: number,
79
- dayInMilliseconds: number,
80
- ): boolean {
81
- const timeSinceLastPartial = now - userLog.lastParcial;
82
- return userLog.lastParcial > 0 && timeSinceLastPartial < waitDelayAfterRating * dayInMilliseconds;
83
- }
84
-
85
- private isWithinRetryInterval(
86
- userLog: WidgetSamplerLog,
87
- interval: number,
88
- attempts: number,
89
- now: number,
90
- dayInMilliseconds: number,
91
- ): boolean {
92
- if (userLog.attempts < attempts) return false;
93
- const timeSinceLastAttempt = now - userLog.lastAttempt;
94
- return timeSinceLastAttempt < interval * dayInMilliseconds;
95
- }
96
-
97
- private async resetAttemptsIfNeeded(userLog: WidgetSamplerLog, maxAttempts: number): Promise<void> {
98
- if (userLog.attempts >= maxAttempts) {
99
- userLog.attempts = 0;
100
- }
101
- }
102
- }
File without changes
File without changes
File without changes
File without changes