@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
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { EventKey, SurveyEventKey, WidgetCallbacks, WidgetResponse } from "../../domain";
|
|
2
|
+
import type { WidgetStateManager } from "../WidgetStateManager";
|
|
3
|
+
import { handleFormClose, handleFormError, handleFormPageChanged, handleQuestionAnswered, handleFormCompleted, handleFormPartialCompleted, handleFormResize } from "./EventHandlers";
|
|
4
|
+
|
|
5
|
+
export class EventHandlerFactory {
|
|
6
|
+
private readonly surveyToFormMapping: Record<string, EventKey> = {
|
|
7
|
+
closeSoluCXWidget: "FORM_CLOSE",
|
|
8
|
+
dismissSoluCXWidget: "FORM_CLOSE",
|
|
9
|
+
completeSoluCXWidget: "FORM_COMPLETED",
|
|
10
|
+
partialSoluCXWidget: "FORM_PARTIALCOMPLETED",
|
|
11
|
+
resizeSoluCXWidget: "FORM_RESIZE",
|
|
12
|
+
errorSoluCXWidget: "FORM_ERROR",
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
constructor(
|
|
16
|
+
private hide: () => void,
|
|
17
|
+
private resize: (height: string) => void,
|
|
18
|
+
private userId: string,
|
|
19
|
+
private transactionId?: string,
|
|
20
|
+
private callbacks?: WidgetCallbacks,
|
|
21
|
+
private stateManager?: WidgetStateManager,
|
|
22
|
+
) {}
|
|
23
|
+
|
|
24
|
+
private parse(message: string): { key: string; value: string } {
|
|
25
|
+
const separatorIndex = message.indexOf("-");
|
|
26
|
+
if (separatorIndex === -1) return { key: message, value: "" };
|
|
27
|
+
return {
|
|
28
|
+
key: message.slice(0, separatorIndex),
|
|
29
|
+
value: message.slice(separatorIndex + 1),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private mapSurveyKeyToFormKey(surveyKey: SurveyEventKey): EventKey {
|
|
34
|
+
return this.surveyToFormMapping[surveyKey] as EventKey;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private normalizeKey(key: string, isForm: boolean): EventKey {
|
|
38
|
+
if (isForm) {
|
|
39
|
+
return key as EventKey;
|
|
40
|
+
}
|
|
41
|
+
return this.mapSurveyKeyToFormKey(key as SurveyEventKey);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async processMessage(message: string, isForm: boolean): Promise<WidgetResponse> {
|
|
45
|
+
const parsed = this.parse(message);
|
|
46
|
+
const eventKey = this.normalizeKey(parsed.key, isForm);
|
|
47
|
+
return this.handle(eventKey, parsed.value);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private async handle(eventKey: EventKey, value: string): Promise<WidgetResponse> {
|
|
51
|
+
switch (eventKey) {
|
|
52
|
+
case "FORM_CLOSE":
|
|
53
|
+
return handleFormClose(this.hide, this.stateManager, this.callbacks);
|
|
54
|
+
case "FORM_ERROR":
|
|
55
|
+
return handleFormError(value, this.hide, this.callbacks);
|
|
56
|
+
case "FORM_PAGECHANGED":
|
|
57
|
+
return handleFormPageChanged(value, this.callbacks);
|
|
58
|
+
case "QUESTION_ANSWERED":
|
|
59
|
+
return handleQuestionAnswered(this.stateManager, this.callbacks);
|
|
60
|
+
case "FORM_COMPLETED":
|
|
61
|
+
return handleFormCompleted(this.userId, this.transactionId, this.stateManager, this.callbacks);
|
|
62
|
+
case "FORM_PARTIALCOMPLETED":
|
|
63
|
+
return handleFormPartialCompleted(this.userId, this.transactionId, this.stateManager, this.callbacks);
|
|
64
|
+
case "FORM_RESIZE":
|
|
65
|
+
return handleFormResize(value, this.resize, this.callbacks);
|
|
66
|
+
default:
|
|
67
|
+
return { status: "error", message: "Unknown event" };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { WidgetCallbacks, WidgetResponse } from "../../domain";
|
|
2
|
+
import type { WidgetStateManager } from "../WidgetStateManager";
|
|
3
|
+
|
|
4
|
+
const success = (): WidgetResponse => ({ status: "success" });
|
|
5
|
+
const error = (message: string): WidgetResponse => ({ status: "error", message });
|
|
6
|
+
|
|
7
|
+
export const handleFormClose = async (hide: () => void, stateManager?: WidgetStateManager, callbacks?: WidgetCallbacks): Promise<WidgetResponse> => {
|
|
8
|
+
hide();
|
|
9
|
+
try {
|
|
10
|
+
await stateManager?.updateTimestamp('lastDismiss');
|
|
11
|
+
} catch (err) {
|
|
12
|
+
console.error('[EventHandlers] Error saving lastDismiss:', err);
|
|
13
|
+
}
|
|
14
|
+
callbacks?.onClosed?.();
|
|
15
|
+
return success();
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export const handleFormError = (value: string, hide: () => void, callbacks?: WidgetCallbacks): WidgetResponse => {
|
|
19
|
+
hide();
|
|
20
|
+
callbacks?.onError?.(value);
|
|
21
|
+
return error(value);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const handleFormPageChanged = (value: string, callbacks?: WidgetCallbacks): WidgetResponse => {
|
|
25
|
+
callbacks?.onPageChanged?.(value);
|
|
26
|
+
return success();
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const handleQuestionAnswered = async (stateManager?: WidgetStateManager, callbacks?: WidgetCallbacks): Promise<WidgetResponse> => {
|
|
30
|
+
try {
|
|
31
|
+
await stateManager?.resetAttempts();
|
|
32
|
+
} catch (err) {
|
|
33
|
+
console.error('[EventHandlers] Error resetting attempts after question answered:', err);
|
|
34
|
+
}
|
|
35
|
+
callbacks?.onQuestionAnswered?.();
|
|
36
|
+
return success();
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const handleFormCompleted = async (userId: string, transactionId?: string, stateManager?: WidgetStateManager, callbacks?: WidgetCallbacks): Promise<WidgetResponse> => {
|
|
40
|
+
try {
|
|
41
|
+
await stateManager?.resetAttempts();
|
|
42
|
+
await stateManager?.markTransactionAnswered(transactionId);
|
|
43
|
+
await stateManager?.updateTimestamp('lastSubmit');
|
|
44
|
+
} catch (err) {
|
|
45
|
+
console.error('[EventHandlers] Error saving lastSubmit:', err);
|
|
46
|
+
}
|
|
47
|
+
callbacks?.onCompleted?.(userId);
|
|
48
|
+
return success();
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export const handleFormPartialCompleted = async (userId: string, transactionId?: string, stateManager?: WidgetStateManager, callbacks?: WidgetCallbacks): Promise<WidgetResponse> => {
|
|
52
|
+
try {
|
|
53
|
+
await stateManager?.resetAttempts();
|
|
54
|
+
await stateManager?.markTransactionAnswered(transactionId);
|
|
55
|
+
await stateManager?.updateTimestamp('lastPartialSubmit');
|
|
56
|
+
} catch (err) {
|
|
57
|
+
console.error('[EventHandlers] Error saving lastPartialSubmit:', err);
|
|
58
|
+
}
|
|
59
|
+
callbacks?.onPartialCompleted?.(userId);
|
|
60
|
+
return success();
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export const handleFormResize = (value: string, resize: (height: string) => void, callbacks?: WidgetCallbacks): WidgetResponse => {
|
|
64
|
+
resize(value);
|
|
65
|
+
callbacks?.onResize?.(value);
|
|
66
|
+
return success();
|
|
67
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { WidgetOptions } from "../../domain";
|
|
2
|
+
|
|
3
|
+
const DEFAULT_HEIGHT = 300;
|
|
4
|
+
|
|
5
|
+
export function calculateHeight(options?: WidgetOptions, receivedHeight?: number): number {
|
|
6
|
+
if (receivedHeight && receivedHeight > 0) {
|
|
7
|
+
return receivedHeight;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
if (options?.height) {
|
|
11
|
+
return Number(options.height);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return DEFAULT_HEIGHT;
|
|
15
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
2
|
+
import type { IStorageService } from "./IStorageService";
|
|
3
|
+
import type { WidgetSamplerLog } from "../../domain";
|
|
4
|
+
import { STORAGE_KEY } from "../../constants/Constants";
|
|
5
|
+
|
|
6
|
+
export class AsyncStorageService implements IStorageService<WidgetSamplerLog> {
|
|
7
|
+
private key: string;
|
|
8
|
+
|
|
9
|
+
constructor(storageId: string) {
|
|
10
|
+
this.key = `${STORAGE_KEY}_${storageId}`;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
async read(key?: string): Promise<WidgetSamplerLog> {
|
|
14
|
+
const storageKey = key || this.key;
|
|
15
|
+
try {
|
|
16
|
+
const json = await AsyncStorage.getItem(storageKey);
|
|
17
|
+
return json ? (JSON.parse(json) as WidgetSamplerLog) : this.getDefaultValue();
|
|
18
|
+
} catch (error) {
|
|
19
|
+
console.error("Error reading from AsyncStorage:", error);
|
|
20
|
+
return this.getDefaultValue();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async write(key: string, data: WidgetSamplerLog): Promise<void>;
|
|
25
|
+
async write(data: WidgetSamplerLog): Promise<void>;
|
|
26
|
+
async write(keyOrData: string | WidgetSamplerLog, data?: WidgetSamplerLog): Promise<void> {
|
|
27
|
+
try {
|
|
28
|
+
let storageKey: string;
|
|
29
|
+
let storageData: WidgetSamplerLog;
|
|
30
|
+
|
|
31
|
+
if (typeof keyOrData === "string") {
|
|
32
|
+
storageKey = keyOrData;
|
|
33
|
+
storageData = data!;
|
|
34
|
+
} else {
|
|
35
|
+
storageKey = this.key;
|
|
36
|
+
storageData = keyOrData;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const json = JSON.stringify(storageData);
|
|
40
|
+
await AsyncStorage.setItem(storageKey, json);
|
|
41
|
+
} catch (error) {
|
|
42
|
+
console.error("Error writing to AsyncStorage:", error);
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async delete(key?: string): Promise<void> {
|
|
48
|
+
const storageKey = key || this.key;
|
|
49
|
+
try {
|
|
50
|
+
await AsyncStorage.removeItem(storageKey);
|
|
51
|
+
} catch (error) {
|
|
52
|
+
console.error("Error deleting from AsyncStorage:", error);
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async exists(key?: string): Promise<boolean> {
|
|
58
|
+
const storageKey = key || this.key;
|
|
59
|
+
try {
|
|
60
|
+
const value = await AsyncStorage.getItem(storageKey);
|
|
61
|
+
return value !== null;
|
|
62
|
+
} catch (error) {
|
|
63
|
+
console.error("Error checking existence in AsyncStorage:", error);
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private getDefaultValue(): WidgetSamplerLog {
|
|
69
|
+
return {
|
|
70
|
+
attempts: 0,
|
|
71
|
+
answeredTransactionIds: [],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interface for storage service abstraction
|
|
3
|
+
* Allows different storage implementations (AsyncStorage, Memory, Secure, etc.)
|
|
4
|
+
* Following Dependency Inversion Principle
|
|
5
|
+
*/
|
|
6
|
+
export interface IStorageService<T = any> {
|
|
7
|
+
/**
|
|
8
|
+
* Read data from storage
|
|
9
|
+
* @param key Storage key
|
|
10
|
+
* @returns Promise with stored data or default value
|
|
11
|
+
*/
|
|
12
|
+
read(key: string): Promise<T>;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Write data to storage
|
|
16
|
+
* @param key Storage key
|
|
17
|
+
* @param data Data to store
|
|
18
|
+
*/
|
|
19
|
+
write(key: string, data: T): Promise<void>;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Delete data from storage
|
|
23
|
+
* @param key Storage key
|
|
24
|
+
*/
|
|
25
|
+
delete(key: string): Promise<void>;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Check if key exists in storage
|
|
29
|
+
* @param key Storage key
|
|
30
|
+
*/
|
|
31
|
+
exists(key: string): Promise<boolean>;
|
|
32
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { WidgetData } from "../../domain";
|
|
2
|
+
import { getUserId } from "../UserIdentificationService";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Build a unique storage ID from instanceKey, journey, and userId.
|
|
6
|
+
* Uses the format: instanceKey:journey:userId (filters out falsy values)
|
|
7
|
+
*
|
|
8
|
+
* @param instanceKey - The widget instance key
|
|
9
|
+
* @param data - The widget data containing journey/form_id and user identification
|
|
10
|
+
* @returns A colon-separated storage ID string
|
|
11
|
+
*/
|
|
12
|
+
export function buildStorageId(instanceKey: string, data: WidgetData): string {
|
|
13
|
+
const userId = getUserId(data);
|
|
14
|
+
return [instanceKey, data?.journey, userId].filter(Boolean).join(':');
|
|
15
|
+
}
|