@solucx/react-native-solucx-widget 0.2.4 → 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.
- package/README.md +526 -182
- package/lib/SoluCXWidget.d.ts +50 -7
- package/lib/SoluCXWidget.d.ts.map +1 -1
- package/lib/SoluCXWidget.js +105 -100
- package/lib/SoluCXWidget.js.map +1 -1
- package/lib/SoluCXWidgetHost.d.ts +3 -0
- package/lib/SoluCXWidgetHost.d.ts.map +1 -0
- package/lib/SoluCXWidgetHost.js +34 -0
- package/lib/SoluCXWidgetHost.js.map +1 -0
- package/lib/SoluCXWidgetView.d.ts +12 -0
- package/lib/SoluCXWidgetView.d.ts.map +1 -0
- package/lib/SoluCXWidgetView.js +61 -0
- package/lib/SoluCXWidgetView.js.map +1 -0
- package/lib/components/CloseButton.d.ts +1 -1
- package/lib/components/CloseButton.d.ts.map +1 -1
- package/lib/components/CloseButton.js +4 -1
- package/lib/components/CloseButton.js.map +1 -1
- package/lib/components/InlineWidget.d.ts.map +1 -1
- package/lib/components/InlineWidget.js +2 -7
- package/lib/components/InlineWidget.js.map +1 -1
- package/lib/components/ModalWidget.d.ts +1 -1
- package/lib/components/ModalWidget.d.ts.map +1 -1
- package/lib/components/ModalWidget.js +3 -16
- package/lib/components/ModalWidget.js.map +1 -1
- package/lib/components/OverlayWidget.d.ts.map +1 -1
- package/lib/components/OverlayWidget.js +5 -15
- package/lib/components/OverlayWidget.js.map +1 -1
- package/lib/components/index.d.ts +5 -0
- package/lib/components/index.d.ts.map +1 -0
- package/lib/components/index.js +12 -0
- package/lib/components/index.js.map +1 -0
- package/lib/constants/Constants.d.ts +11 -0
- package/lib/constants/Constants.d.ts.map +1 -1
- package/lib/constants/Constants.js +16 -1
- package/lib/constants/Constants.js.map +1 -1
- package/lib/{interfaces → domain}/WidgetCallbacks.d.ts +2 -2
- package/lib/domain/WidgetCallbacks.d.ts.map +1 -0
- package/lib/domain/WidgetCallbacks.js.map +1 -0
- package/{src/interfaces/WidgetData.ts → lib/domain/WidgetData.d.ts} +5 -2
- package/lib/domain/WidgetData.d.ts.map +1 -0
- package/lib/{interfaces → domain}/WidgetData.js.map +1 -1
- package/lib/domain/WidgetDisplayResult.d.ts +6 -0
- package/lib/domain/WidgetDisplayResult.d.ts.map +1 -0
- package/lib/domain/WidgetDisplayResult.js +3 -0
- package/lib/domain/WidgetDisplayResult.js.map +1 -0
- package/lib/domain/WidgetOptions.d.ts +27 -0
- package/lib/domain/WidgetOptions.d.ts.map +1 -0
- package/lib/domain/WidgetOptions.js +30 -0
- package/lib/domain/WidgetOptions.js.map +1 -0
- package/lib/domain/WidgetResponse.d.ts +5 -0
- package/lib/domain/WidgetResponse.d.ts.map +1 -0
- package/lib/{interfaces/WidgetOptions.js → domain/WidgetResponse.js} +1 -1
- package/lib/domain/WidgetResponse.js.map +1 -0
- package/lib/domain/WidgetSamplerLog.d.ts +12 -0
- package/lib/domain/WidgetSamplerLog.d.ts.map +1 -0
- package/lib/domain/WidgetSamplerLog.js.map +1 -0
- package/lib/{interfaces → domain}/index.d.ts +1 -2
- package/lib/domain/index.d.ts.map +1 -0
- package/lib/{interfaces → domain}/index.js.map +1 -1
- package/lib/hooks/index.d.ts +2 -2
- package/lib/hooks/index.d.ts.map +1 -1
- package/lib/hooks/index.js +5 -5
- package/lib/hooks/index.js.map +1 -1
- package/lib/hooks/useClientVersionCollector.d.ts +3 -0
- package/lib/hooks/useClientVersionCollector.d.ts.map +1 -0
- package/lib/{services/ClientVersionCollector.js → hooks/useClientVersionCollector.js} +7 -2
- package/lib/hooks/useClientVersionCollector.js.map +1 -0
- package/lib/hooks/useHeightAnimation.d.ts +0 -1
- package/lib/hooks/useHeightAnimation.d.ts.map +1 -1
- package/lib/hooks/useHeightAnimation.js +4 -2
- package/lib/hooks/useHeightAnimation.js.map +1 -1
- package/lib/hooks/useWidget.d.ts +13 -0
- package/lib/hooks/useWidget.d.ts.map +1 -0
- package/lib/hooks/useWidget.js +44 -0
- package/lib/hooks/useWidget.js.map +1 -0
- package/lib/hooks/useWidgetBootstrap.d.ts +21 -0
- package/lib/hooks/useWidgetBootstrap.d.ts.map +1 -0
- package/lib/hooks/useWidgetBootstrap.js +87 -0
- package/lib/hooks/useWidgetBootstrap.js.map +1 -0
- package/lib/hooks/useWidgetServices.d.ts +19 -0
- package/lib/hooks/useWidgetServices.d.ts.map +1 -0
- package/lib/hooks/useWidgetServices.js +34 -0
- package/lib/hooks/useWidgetServices.js.map +1 -0
- package/lib/hooks/useWidgetUI.d.ts +9 -0
- package/lib/hooks/useWidgetUI.d.ts.map +1 -0
- package/lib/hooks/useWidgetUI.js +33 -0
- package/lib/hooks/useWidgetUI.js.map +1 -0
- package/lib/index.d.ts +10 -11
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +13 -38
- package/lib/index.js.map +1 -1
- package/lib/services/UserIdentificationService.d.ts +3 -0
- package/lib/services/UserIdentificationService.d.ts.map +1 -0
- package/lib/services/UserIdentificationService.js +17 -0
- package/lib/services/UserIdentificationService.js.map +1 -0
- package/lib/services/WidgetBootstrapService.d.ts +12 -0
- package/lib/services/WidgetBootstrapService.d.ts.map +1 -0
- package/lib/services/{widgetBootstrapService.js → WidgetBootstrapService.js} +36 -15
- package/lib/services/WidgetBootstrapService.js.map +1 -0
- package/lib/services/WidgetEventService.d.ts +8 -0
- package/lib/services/WidgetEventService.d.ts.map +1 -0
- package/lib/services/WidgetEventService.js +14 -0
- package/lib/services/WidgetEventService.js.map +1 -0
- package/lib/services/WidgetStateManager.d.ts +20 -0
- package/lib/services/WidgetStateManager.d.ts.map +1 -0
- package/lib/services/WidgetStateManager.js +93 -0
- package/lib/services/WidgetStateManager.js.map +1 -0
- package/lib/services/WidgetValidationService.d.ts +17 -0
- package/lib/services/WidgetValidationService.d.ts.map +1 -0
- package/lib/services/WidgetValidationService.js +132 -0
- package/lib/services/WidgetValidationService.js.map +1 -0
- package/lib/services/events/EventHandlerFactory.d.ts +18 -0
- package/lib/services/events/EventHandlerFactory.d.ts.map +1 -0
- package/lib/services/events/EventHandlerFactory.js +67 -0
- package/lib/services/events/EventHandlerFactory.js.map +1 -0
- package/lib/services/events/EventHandlers.d.ts +10 -0
- package/lib/services/events/EventHandlers.d.ts.map +1 -0
- package/lib/services/events/EventHandlers.js +72 -0
- package/lib/services/events/EventHandlers.js.map +1 -0
- package/lib/services/events/index.d.ts +3 -0
- package/lib/services/events/index.d.ts.map +1 -0
- package/lib/services/events/index.js +21 -0
- package/lib/services/events/index.js.map +1 -0
- package/lib/services/height/HeightStrategies.d.ts +3 -0
- package/lib/services/height/HeightStrategies.d.ts.map +1 -0
- package/lib/services/height/HeightStrategies.js +14 -0
- package/lib/services/height/HeightStrategies.js.map +1 -0
- package/lib/services/storage/AsyncStorageService.d.ts +13 -0
- package/lib/services/storage/AsyncStorageService.d.ts.map +1 -0
- package/lib/services/storage/AsyncStorageService.js +73 -0
- package/lib/services/storage/AsyncStorageService.js.map +1 -0
- package/lib/services/storage/IStorageService.d.ts +30 -0
- package/lib/services/storage/IStorageService.d.ts.map +1 -0
- package/lib/services/storage/IStorageService.js +3 -0
- package/lib/services/storage/IStorageService.js.map +1 -0
- package/lib/services/storage/StorageIdBuilder.d.ts +11 -0
- package/lib/services/storage/StorageIdBuilder.d.ts.map +1 -0
- package/lib/services/storage/StorageIdBuilder.js +17 -0
- package/lib/services/storage/StorageIdBuilder.js.map +1 -0
- package/lib/services/storage/index.d.ts +3 -0
- package/lib/services/storage/index.d.ts.map +1 -0
- package/lib/services/storage/index.js +6 -0
- package/lib/services/storage/index.js.map +1 -0
- package/lib/styles/widgetStyles.d.ts +1 -1
- package/lib/styles/widgetStyles.d.ts.map +1 -1
- package/package.json +8 -2
- package/src/SoluCXWidget.ts +144 -0
- package/src/SoluCXWidgetHost.tsx +44 -0
- package/src/SoluCXWidgetView.tsx +97 -0
- package/src/__tests__/ClientVersionCollector.test.ts +5 -5
- package/src/__tests__/OverlayWidget.rendering.test.tsx +12 -14
- package/src/__tests__/SoluCXWidget.rendering.test.tsx +103 -60
- package/src/__tests__/SoluCXWidget.test.ts +448 -0
- package/src/__tests__/WidgetValidationService.test.ts +408 -0
- package/src/__tests__/e2e/widget-lifecycle.test.tsx +14 -23
- package/src/__tests__/index.test.tsx +39 -0
- package/src/__tests__/integration/webview-communication-simple.test.tsx +8 -6
- package/src/__tests__/integration/webview-communication.test.tsx +127 -130
- package/src/__tests__/normalizeWidgetOptions.test.ts +80 -0
- package/src/__tests__/useWidgetBootstrap.test.ts +634 -0
- package/src/__tests__/useWidgetState.test.ts +56 -13
- package/src/__tests__/widgetBootstrapService.test.ts +15 -17
- package/src/components/CloseButton.tsx +6 -2
- package/src/components/InlineWidget.tsx +4 -9
- package/src/components/ModalWidget.tsx +15 -45
- package/src/components/OverlayWidget.tsx +5 -15
- package/src/components/index.ts +4 -0
- package/src/constants/Constants.ts +15 -0
- package/src/{interfaces → domain}/WidgetCallbacks.ts +2 -2
- package/{lib/interfaces/WidgetData.d.ts → src/domain/WidgetData.ts} +3 -2
- package/src/domain/WidgetDisplayResult.ts +16 -0
- package/src/domain/WidgetOptions.ts +53 -0
- package/src/domain/WidgetResponse.ts +5 -0
- package/src/domain/WidgetSamplerLog.ts +11 -0
- package/src/{interfaces → domain}/index.ts +1 -2
- package/src/hooks/index.ts +2 -2
- package/src/{services/ClientVersionCollector.ts → hooks/useClientVersionCollector.ts} +6 -0
- package/src/hooks/useHeightAnimation.ts +6 -3
- package/src/hooks/useWidget.ts +46 -0
- package/src/hooks/useWidgetBootstrap.ts +117 -0
- package/src/hooks/useWidgetServices.ts +44 -0
- package/src/hooks/useWidgetUI.ts +38 -0
- package/src/index.ts +16 -11
- package/src/services/UserIdentificationService.ts +14 -0
- package/src/services/{widgetBootstrapService.ts → WidgetBootstrapService.ts} +43 -19
- package/src/services/WidgetEventService.ts +15 -0
- package/src/services/WidgetStateManager.ts +115 -0
- package/src/services/WidgetValidationService.ts +149 -0
- package/src/services/events/EventHandlerFactory.ts +70 -0
- package/src/services/events/EventHandlers.ts +67 -0
- package/src/services/events/index.ts +2 -0
- package/src/services/height/HeightStrategies.ts +15 -0
- package/src/services/storage/AsyncStorageService.ts +74 -0
- package/src/services/storage/IStorageService.ts +32 -0
- package/src/services/storage/StorageIdBuilder.ts +15 -0
- package/src/services/storage/index.ts +2 -0
- package/src/styles/widgetStyles.ts +1 -1
- package/README.intern.md +0 -490
- package/lib/constants/webViewConstants.d.ts +0 -12
- package/lib/constants/webViewConstants.d.ts.map +0 -1
- package/lib/constants/webViewConstants.js +0 -19
- package/lib/constants/webViewConstants.js.map +0 -1
- package/lib/hooks/useWidgetHeight.d.ts +0 -13
- package/lib/hooks/useWidgetHeight.d.ts.map +0 -1
- package/lib/hooks/useWidgetHeight.js +0 -21
- package/lib/hooks/useWidgetHeight.js.map +0 -1
- package/lib/hooks/useWidgetState.d.ts +0 -15
- package/lib/hooks/useWidgetState.d.ts.map +0 -1
- package/lib/hooks/useWidgetState.js +0 -79
- package/lib/hooks/useWidgetState.js.map +0 -1
- package/lib/interfaces/WidgetCallbacks.d.ts.map +0 -1
- package/lib/interfaces/WidgetCallbacks.js.map +0 -1
- package/lib/interfaces/WidgetData.d.ts.map +0 -1
- package/lib/interfaces/WidgetOptions.d.ts +0 -9
- package/lib/interfaces/WidgetOptions.d.ts.map +0 -1
- package/lib/interfaces/WidgetOptions.js.map +0 -1
- package/lib/interfaces/WidgetResponse.d.ts +0 -10
- package/lib/interfaces/WidgetResponse.d.ts.map +0 -1
- package/lib/interfaces/WidgetResponse.js +0 -12
- package/lib/interfaces/WidgetResponse.js.map +0 -1
- package/lib/interfaces/WidgetSamplerLog.d.ts +0 -7
- package/lib/interfaces/WidgetSamplerLog.d.ts.map +0 -1
- package/lib/interfaces/WidgetSamplerLog.js.map +0 -1
- package/lib/interfaces/index.d.ts.map +0 -1
- package/lib/services/ClientVersionCollector.d.ts +0 -2
- package/lib/services/ClientVersionCollector.d.ts.map +0 -1
- package/lib/services/ClientVersionCollector.js.map +0 -1
- package/lib/services/storage.d.ts +0 -8
- package/lib/services/storage.d.ts.map +0 -1
- package/lib/services/storage.js +0 -23
- package/lib/services/storage.js.map +0 -1
- package/lib/services/widgetBootstrapService.d.ts +0 -6
- package/lib/services/widgetBootstrapService.d.ts.map +0 -1
- package/lib/services/widgetBootstrapService.js.map +0 -1
- package/lib/services/widgetEventService.d.ts +0 -19
- package/lib/services/widgetEventService.d.ts.map +0 -1
- package/lib/services/widgetEventService.js +0 -79
- package/lib/services/widgetEventService.js.map +0 -1
- package/lib/services/widgetValidationService.d.ts +0 -18
- package/lib/services/widgetValidationService.d.ts.map +0 -1
- package/lib/services/widgetValidationService.js +0 -71
- package/lib/services/widgetValidationService.js.map +0 -1
- package/src/SoluCXWidget.tsx +0 -178
- package/src/constants/webViewConstants.ts +0 -15
- package/src/hooks/useWidgetHeight.ts +0 -38
- package/src/hooks/useWidgetState.ts +0 -101
- package/src/interfaces/WidgetOptions.ts +0 -8
- package/src/interfaces/WidgetResponse.ts +0 -15
- package/src/interfaces/WidgetSamplerLog.ts +0 -6
- package/src/services/storage.ts +0 -21
- package/src/services/widgetEventService.ts +0 -110
- package/src/services/widgetValidationService.ts +0 -102
- /package/lib/{interfaces → domain}/WidgetCallbacks.js +0 -0
- /package/lib/{interfaces → domain}/WidgetData.js +0 -0
- /package/lib/{interfaces → domain}/WidgetSamplerLog.js +0 -0
- /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,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
|
-
}
|
package/src/services/storage.ts
DELETED
|
@@ -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
|