@explorer02/cfm-survey-sdk 0.0.1
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/dist/analytics/analyticsTracker.d.ts +3 -0
- package/dist/analytics/analyticsTracker.d.ts.map +1 -0
- package/dist/analytics/analyticsTracker.js +34 -0
- package/dist/analytics/analyticsTracker.js.map +1 -0
- package/dist/analytics/types.d.ts +76 -0
- package/dist/analytics/types.d.ts.map +1 -0
- package/dist/analytics/types.js +3 -0
- package/dist/analytics/types.js.map +1 -0
- package/dist/cli/deploy.d.ts +2 -0
- package/dist/cli/deploy.d.ts.map +1 -0
- package/dist/cli/deploy.js +200 -0
- package/dist/cli/deploy.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +33 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/fetchSurvey/internalTypes.d.ts +60 -0
- package/dist/fetchSurvey/internalTypes.d.ts.map +1 -0
- package/dist/fetchSurvey/internalTypes.js +3 -0
- package/dist/fetchSurvey/internalTypes.js.map +1 -0
- package/dist/fetchSurvey/logger/fetchLogger.d.ts +6 -0
- package/dist/fetchSurvey/logger/fetchLogger.d.ts.map +1 -0
- package/dist/fetchSurvey/logger/fetchLogger.js +37 -0
- package/dist/fetchSurvey/logger/fetchLogger.js.map +1 -0
- package/dist/fetchSurvey/logger/mapperLogger.d.ts +4 -0
- package/dist/fetchSurvey/logger/mapperLogger.d.ts.map +1 -0
- package/dist/fetchSurvey/logger/mapperLogger.js +16 -0
- package/dist/fetchSurvey/logger/mapperLogger.js.map +1 -0
- package/dist/fetchSurvey/telemetry/fetchTelemetry.d.ts +3 -0
- package/dist/fetchSurvey/telemetry/fetchTelemetry.d.ts.map +1 -0
- package/dist/fetchSurvey/telemetry/fetchTelemetry.js +29 -0
- package/dist/fetchSurvey/telemetry/fetchTelemetry.js.map +1 -0
- package/dist/fetchSurvey/types.d.ts +54 -0
- package/dist/fetchSurvey/types.d.ts.map +1 -0
- package/dist/fetchSurvey/types.js +3 -0
- package/dist/fetchSurvey/types.js.map +1 -0
- package/dist/fetchSurvey/useFetchSurvey.d.ts +24 -0
- package/dist/fetchSurvey/useFetchSurvey.d.ts.map +1 -0
- package/dist/fetchSurvey/useFetchSurvey.js +115 -0
- package/dist/fetchSurvey/useFetchSurvey.js.map +1 -0
- package/dist/fetchSurvey/utils/cleaner.d.ts +7 -0
- package/dist/fetchSurvey/utils/cleaner.d.ts.map +1 -0
- package/dist/fetchSurvey/utils/cleaner.js +35 -0
- package/dist/fetchSurvey/utils/cleaner.js.map +1 -0
- package/dist/fetchSurvey/utils/constants.d.ts +10 -0
- package/dist/fetchSurvey/utils/constants.d.ts.map +1 -0
- package/dist/fetchSurvey/utils/constants.js +13 -0
- package/dist/fetchSurvey/utils/constants.js.map +1 -0
- package/dist/fetchSurvey/utils/extractSurveyLanguages.d.ts +17 -0
- package/dist/fetchSurvey/utils/extractSurveyLanguages.d.ts.map +1 -0
- package/dist/fetchSurvey/utils/extractSurveyLanguages.js +61 -0
- package/dist/fetchSurvey/utils/extractSurveyLanguages.js.map +1 -0
- package/dist/fetchSurvey/utils/index.d.ts +6 -0
- package/dist/fetchSurvey/utils/index.d.ts.map +1 -0
- package/dist/fetchSurvey/utils/index.js +22 -0
- package/dist/fetchSurvey/utils/index.js.map +1 -0
- package/dist/fetchSurvey/utils/mapSurveyPages.d.ts +12 -0
- package/dist/fetchSurvey/utils/mapSurveyPages.d.ts.map +1 -0
- package/dist/fetchSurvey/utils/mapSurveyPages.js +30 -0
- package/dist/fetchSurvey/utils/mapSurveyPages.js.map +1 -0
- package/dist/fetchSurvey/utils/mappers/index.d.ts +3 -0
- package/dist/fetchSurvey/utils/mappers/index.d.ts.map +1 -0
- package/dist/fetchSurvey/utils/mappers/index.js +19 -0
- package/dist/fetchSurvey/utils/mappers/index.js.map +1 -0
- package/dist/fetchSurvey/utils/mappers/questionMapper.d.ts +42 -0
- package/dist/fetchSurvey/utils/mappers/questionMapper.d.ts.map +1 -0
- package/dist/fetchSurvey/utils/mappers/questionMapper.js +183 -0
- package/dist/fetchSurvey/utils/mappers/questionMapper.js.map +1 -0
- package/dist/fetchSurvey/utils/mappers/surveyMapper.d.ts +36 -0
- package/dist/fetchSurvey/utils/mappers/surveyMapper.d.ts.map +1 -0
- package/dist/fetchSurvey/utils/mappers/surveyMapper.js +65 -0
- package/dist/fetchSurvey/utils/mappers/surveyMapper.js.map +1 -0
- package/dist/fetchSurvey/utils/url.d.ts +14 -0
- package/dist/fetchSurvey/utils/url.d.ts.map +1 -0
- package/dist/fetchSurvey/utils/url.js +23 -0
- package/dist/fetchSurvey/utils/url.js.map +1 -0
- package/dist/fetchSurvey/utils/validation.d.ts +15 -0
- package/dist/fetchSurvey/utils/validation.d.ts.map +1 -0
- package/dist/fetchSurvey/utils/validation.js +36 -0
- package/dist/fetchSurvey/utils/validation.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/logger.d.ts +26 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.js +57 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/queryClient.d.ts +3 -0
- package/dist/queryClient.d.ts.map +1 -0
- package/dist/queryClient.js +64 -0
- package/dist/queryClient.js.map +1 -0
- package/dist/submitSurvey/logger/resolutionLogger.d.ts +4 -0
- package/dist/submitSurvey/logger/resolutionLogger.d.ts.map +1 -0
- package/dist/submitSurvey/logger/resolutionLogger.js +16 -0
- package/dist/submitSurvey/logger/resolutionLogger.js.map +1 -0
- package/dist/submitSurvey/logger/submitLogger.d.ts +7 -0
- package/dist/submitSurvey/logger/submitLogger.d.ts.map +1 -0
- package/dist/submitSurvey/logger/submitLogger.js +43 -0
- package/dist/submitSurvey/logger/submitLogger.js.map +1 -0
- package/dist/submitSurvey/telemetry/submitTelemetry.d.ts +3 -0
- package/dist/submitSurvey/telemetry/submitTelemetry.d.ts.map +1 -0
- package/dist/submitSurvey/telemetry/submitTelemetry.js +30 -0
- package/dist/submitSurvey/telemetry/submitTelemetry.js.map +1 -0
- package/dist/submitSurvey/types.d.ts +37 -0
- package/dist/submitSurvey/types.d.ts.map +1 -0
- package/dist/submitSurvey/types.js +3 -0
- package/dist/submitSurvey/types.js.map +1 -0
- package/dist/submitSurvey/useSubmitResponse.d.ts +18 -0
- package/dist/submitSurvey/useSubmitResponse.d.ts.map +1 -0
- package/dist/submitSurvey/useSubmitResponse.js +101 -0
- package/dist/submitSurvey/useSubmitResponse.js.map +1 -0
- package/dist/submitSurvey/useSurveyPagination.d.ts +0 -0
- package/dist/submitSurvey/useSurveyPagination.js +1 -0
- package/dist/submitSurvey/utils/constants.d.ts +5 -0
- package/dist/submitSurvey/utils/constants.d.ts.map +1 -0
- package/dist/submitSurvey/utils/constants.js +8 -0
- package/dist/submitSurvey/utils/constants.js.map +1 -0
- package/dist/submitSurvey/utils/formatters.d.ts +12 -0
- package/dist/submitSurvey/utils/formatters.d.ts.map +1 -0
- package/dist/submitSurvey/utils/formatters.js +29 -0
- package/dist/submitSurvey/utils/formatters.js.map +1 -0
- package/dist/submitSurvey/utils/index.d.ts +5 -0
- package/dist/submitSurvey/utils/index.d.ts.map +1 -0
- package/dist/submitSurvey/utils/index.js +21 -0
- package/dist/submitSurvey/utils/index.js.map +1 -0
- package/dist/submitSurvey/utils/url.d.ts +9 -0
- package/dist/submitSurvey/utils/url.d.ts.map +1 -0
- package/dist/submitSurvey/utils/url.js +20 -0
- package/dist/submitSurvey/utils/url.js.map +1 -0
- package/dist/submitSurvey/utils/validation.d.ts +20 -0
- package/dist/submitSurvey/utils/validation.d.ts.map +1 -0
- package/dist/submitSurvey/utils/validation.js +43 -0
- package/dist/submitSurvey/utils/validation.js.map +1 -0
- package/dist/surveyPagination/actions/index.d.ts +5 -0
- package/dist/surveyPagination/actions/index.d.ts.map +1 -0
- package/dist/surveyPagination/actions/index.js +12 -0
- package/dist/surveyPagination/actions/index.js.map +1 -0
- package/dist/surveyPagination/actions/useOnBack.d.ts +3 -0
- package/dist/surveyPagination/actions/useOnBack.d.ts.map +1 -0
- package/dist/surveyPagination/actions/useOnBack.js +33 -0
- package/dist/surveyPagination/actions/useOnBack.js.map +1 -0
- package/dist/surveyPagination/actions/useOnChange.d.ts +3 -0
- package/dist/surveyPagination/actions/useOnChange.d.ts.map +1 -0
- package/dist/surveyPagination/actions/useOnChange.js +14 -0
- package/dist/surveyPagination/actions/useOnChange.js.map +1 -0
- package/dist/surveyPagination/actions/useOnNext.d.ts +3 -0
- package/dist/surveyPagination/actions/useOnNext.d.ts.map +1 -0
- package/dist/surveyPagination/actions/useOnNext.js +82 -0
- package/dist/surveyPagination/actions/useOnNext.js.map +1 -0
- package/dist/surveyPagination/actions/useOnSubmit.d.ts +3 -0
- package/dist/surveyPagination/actions/useOnSubmit.d.ts.map +1 -0
- package/dist/surveyPagination/actions/useOnSubmit.js +102 -0
- package/dist/surveyPagination/actions/useOnSubmit.js.map +1 -0
- package/dist/surveyPagination/dispatchers/index.d.ts +4 -0
- package/dist/surveyPagination/dispatchers/index.d.ts.map +1 -0
- package/dist/surveyPagination/dispatchers/index.js +10 -0
- package/dist/surveyPagination/dispatchers/index.js.map +1 -0
- package/dist/surveyPagination/dispatchers/useCheckBacktrackChanges.d.ts +6 -0
- package/dist/surveyPagination/dispatchers/useCheckBacktrackChanges.d.ts.map +1 -0
- package/dist/surveyPagination/dispatchers/useCheckBacktrackChanges.js +28 -0
- package/dist/surveyPagination/dispatchers/useCheckBacktrackChanges.js.map +1 -0
- package/dist/surveyPagination/dispatchers/useTrackOptionalSkips.d.ts +4 -0
- package/dist/surveyPagination/dispatchers/useTrackOptionalSkips.d.ts.map +1 -0
- package/dist/surveyPagination/dispatchers/useTrackOptionalSkips.js +19 -0
- package/dist/surveyPagination/dispatchers/useTrackOptionalSkips.js.map +1 -0
- package/dist/surveyPagination/dispatchers/useTrackPageTime.d.ts +4 -0
- package/dist/surveyPagination/dispatchers/useTrackPageTime.d.ts.map +1 -0
- package/dist/surveyPagination/dispatchers/useTrackPageTime.js +12 -0
- package/dist/surveyPagination/dispatchers/useTrackPageTime.js.map +1 -0
- package/dist/surveyPagination/effects/index.d.ts +3 -0
- package/dist/surveyPagination/effects/index.d.ts.map +1 -0
- package/dist/surveyPagination/effects/index.js +8 -0
- package/dist/surveyPagination/effects/index.js.map +1 -0
- package/dist/surveyPagination/effects/useResetPageStartTime.d.ts +3 -0
- package/dist/surveyPagination/effects/useResetPageStartTime.d.ts.map +1 -0
- package/dist/surveyPagination/effects/useResetPageStartTime.js +11 -0
- package/dist/surveyPagination/effects/useResetPageStartTime.js.map +1 -0
- package/dist/surveyPagination/effects/useSessionUnmountSummary.d.ts +2 -0
- package/dist/surveyPagination/effects/useSessionUnmountSummary.d.ts.map +1 -0
- package/dist/surveyPagination/effects/useSessionUnmountSummary.js +32 -0
- package/dist/surveyPagination/effects/useSessionUnmountSummary.js.map +1 -0
- package/dist/surveyPagination/effects/useTrackMaxVisitedPage.d.ts +3 -0
- package/dist/surveyPagination/effects/useTrackMaxVisitedPage.d.ts.map +1 -0
- package/dist/surveyPagination/effects/useTrackMaxVisitedPage.js +13 -0
- package/dist/surveyPagination/effects/useTrackMaxVisitedPage.js.map +1 -0
- package/dist/surveyPagination/effects/useUpdateAnalyticsContext.d.ts +2 -0
- package/dist/surveyPagination/effects/useUpdateAnalyticsContext.d.ts.map +1 -0
- package/dist/surveyPagination/effects/useUpdateAnalyticsContext.js +15 -0
- package/dist/surveyPagination/effects/useUpdateAnalyticsContext.js.map +1 -0
- package/dist/surveyPagination/logger/navigationLogger.d.ts +7 -0
- package/dist/surveyPagination/logger/navigationLogger.d.ts.map +1 -0
- package/dist/surveyPagination/logger/navigationLogger.js +28 -0
- package/dist/surveyPagination/logger/navigationLogger.js.map +1 -0
- package/dist/surveyPagination/logger/validationLogger.d.ts +5 -0
- package/dist/surveyPagination/logger/validationLogger.d.ts.map +1 -0
- package/dist/surveyPagination/logger/validationLogger.js +20 -0
- package/dist/surveyPagination/logger/validationLogger.js.map +1 -0
- package/dist/surveyPagination/telemetry/pageTelemetry.d.ts +3 -0
- package/dist/surveyPagination/telemetry/pageTelemetry.d.ts.map +1 -0
- package/dist/surveyPagination/telemetry/pageTelemetry.js +25 -0
- package/dist/surveyPagination/telemetry/pageTelemetry.js.map +1 -0
- package/dist/surveyPagination/telemetry/sessionTelemetry.d.ts +8 -0
- package/dist/surveyPagination/telemetry/sessionTelemetry.d.ts.map +1 -0
- package/dist/surveyPagination/telemetry/sessionTelemetry.js +43 -0
- package/dist/surveyPagination/telemetry/sessionTelemetry.js.map +1 -0
- package/dist/surveyPagination/types.d.ts +43 -0
- package/dist/surveyPagination/types.d.ts.map +1 -0
- package/dist/surveyPagination/types.js +3 -0
- package/dist/surveyPagination/types.js.map +1 -0
- package/dist/surveyPagination/useSurveyPagination.d.ts +28 -0
- package/dist/surveyPagination/useSurveyPagination.d.ts.map +1 -0
- package/dist/surveyPagination/useSurveyPagination.js +93 -0
- package/dist/surveyPagination/useSurveyPagination.js.map +1 -0
- package/dist/surveyPagination/utils/index.d.ts +3 -0
- package/dist/surveyPagination/utils/index.d.ts.map +1 -0
- package/dist/surveyPagination/utils/index.js +19 -0
- package/dist/surveyPagination/utils/index.js.map +1 -0
- package/dist/surveyPagination/utils/scroll.d.ts +25 -0
- package/dist/surveyPagination/utils/scroll.d.ts.map +1 -0
- package/dist/surveyPagination/utils/scroll.js +67 -0
- package/dist/surveyPagination/utils/scroll.js.map +1 -0
- package/dist/surveyPagination/utils/validation.d.ts +24 -0
- package/dist/surveyPagination/utils/validation.d.ts.map +1 -0
- package/dist/surveyPagination/utils/validation.js +53 -0
- package/dist/surveyPagination/utils/validation.js.map +1 -0
- package/dist/surveyProgress/useSurveyProgress.d.ts +21 -0
- package/dist/surveyProgress/useSurveyProgress.d.ts.map +1 -0
- package/dist/surveyProgress/useSurveyProgress.js +34 -0
- package/dist/surveyProgress/useSurveyProgress.js.map +1 -0
- package/dist/surveyProgress/utils/index.d.ts +2 -0
- package/dist/surveyProgress/utils/index.d.ts.map +1 -0
- package/dist/surveyProgress/utils/index.js +18 -0
- package/dist/surveyProgress/utils/index.js.map +1 -0
- package/dist/surveyProgress/utils/progress.d.ts +27 -0
- package/dist/surveyProgress/utils/progress.d.ts.map +1 -0
- package/dist/surveyProgress/utils/progress.js +60 -0
- package/dist/surveyProgress/utils/progress.js.map +1 -0
- package/dist/surveySDK/constants.d.ts +10 -0
- package/dist/surveySDK/constants.d.ts.map +1 -0
- package/dist/surveySDK/constants.js +14 -0
- package/dist/surveySDK/constants.js.map +1 -0
- package/dist/surveySDK/types.d.ts +28 -0
- package/dist/surveySDK/types.d.ts.map +1 -0
- package/dist/surveySDK/types.js +3 -0
- package/dist/surveySDK/types.js.map +1 -0
- package/dist/surveySDK/useSurveySDK.d.ts +32 -0
- package/dist/surveySDK/useSurveySDK.d.ts.map +1 -0
- package/dist/surveySDK/useSurveySDK.js +85 -0
- package/dist/surveySDK/useSurveySDK.js.map +1 -0
- package/dist/useFetchSurvey.d.ts +73 -0
- package/dist/useFetchSurvey.d.ts.map +1 -0
- package/dist/useFetchSurvey.js +202 -0
- package/dist/useFetchSurvey.js.map +1 -0
- package/dist/useSubmitResponse.d.ts +40 -0
- package/dist/useSubmitResponse.d.ts.map +1 -0
- package/dist/useSubmitResponse.js +146 -0
- package/dist/useSubmitResponse.js.map +1 -0
- package/package.json +24 -0
- package/src/analytics/analyticsTracker.ts +48 -0
- package/src/analytics/types.ts +80 -0
- package/src/cli/deploy.ts +205 -0
- package/src/cli/index.ts +33 -0
- package/src/fetchSurvey/internalTypes.ts +80 -0
- package/src/fetchSurvey/logger/fetchLogger.ts +34 -0
- package/src/fetchSurvey/logger/mapperLogger.ts +13 -0
- package/src/fetchSurvey/telemetry/fetchTelemetry.ts +26 -0
- package/src/fetchSurvey/types.ts +82 -0
- package/src/fetchSurvey/useFetchSurvey.ts +126 -0
- package/src/fetchSurvey/utils/constants.ts +11 -0
- package/src/fetchSurvey/utils/extractSurveyLanguages.ts +63 -0
- package/src/fetchSurvey/utils/index.ts +7 -0
- package/src/fetchSurvey/utils/mapSurveyPages.ts +35 -0
- package/src/fetchSurvey/utils/mappers/index.ts +2 -0
- package/src/fetchSurvey/utils/mappers/questionMapper.ts +213 -0
- package/src/fetchSurvey/utils/mappers/surveyMapper.ts +69 -0
- package/src/fetchSurvey/utils/url.ts +21 -0
- package/src/index.ts +6 -0
- package/src/logger/logger.ts +71 -0
- package/src/queryClient.ts +67 -0
- package/src/submitSurvey/logger/resolutionLogger.ts +13 -0
- package/src/submitSurvey/logger/submitLogger.ts +51 -0
- package/src/submitSurvey/telemetry/submitTelemetry.ts +33 -0
- package/src/submitSurvey/types.ts +51 -0
- package/src/submitSurvey/useSubmitResponse.ts +111 -0
- package/src/submitSurvey/utils/constants.ts +4 -0
- package/src/submitSurvey/utils/formatters.ts +33 -0
- package/src/submitSurvey/utils/index.ts +4 -0
- package/src/submitSurvey/utils/url.ts +17 -0
- package/src/submitSurvey/utils/validation.ts +48 -0
- package/src/surveyPagination/actions/index.ts +4 -0
- package/src/surveyPagination/actions/useOnBack.ts +37 -0
- package/src/surveyPagination/actions/useOnChange.ts +16 -0
- package/src/surveyPagination/actions/useOnNext.ts +99 -0
- package/src/surveyPagination/actions/useOnSubmit.ts +137 -0
- package/src/surveyPagination/dispatchers/index.ts +3 -0
- package/src/surveyPagination/dispatchers/useCheckBacktrackChanges.ts +35 -0
- package/src/surveyPagination/dispatchers/useTrackOptionalSkips.ts +21 -0
- package/src/surveyPagination/dispatchers/useTrackPageTime.ts +13 -0
- package/src/surveyPagination/effects/index.ts +2 -0
- package/src/surveyPagination/effects/useResetPageStartTime.ts +10 -0
- package/src/surveyPagination/effects/useTrackMaxVisitedPage.ts +12 -0
- package/src/surveyPagination/logger/navigationLogger.ts +25 -0
- package/src/surveyPagination/logger/validationLogger.ts +17 -0
- package/src/surveyPagination/telemetry/pageTelemetry.ts +22 -0
- package/src/surveyPagination/telemetry/sessionTelemetry.ts +55 -0
- package/src/surveyPagination/types.ts +42 -0
- package/src/surveyPagination/useSurveyPagination.ts +109 -0
- package/src/surveyPagination/utils/index.ts +2 -0
- package/src/surveyPagination/utils/scroll.ts +62 -0
- package/src/surveyPagination/utils/validation.ts +62 -0
- package/src/surveyProgress/useSurveyProgress.ts +42 -0
- package/src/surveyProgress/utils/index.ts +1 -0
- package/src/surveyProgress/utils/progress.ts +61 -0
- package/src/surveySDK/constants.ts +9 -0
- package/src/surveySDK/types.ts +22 -0
- package/src/surveySDK/useSurveySDK.ts +109 -0
- package/tsconfig.json +13 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'success' | 'perf' | 'analytics';
|
|
2
|
+
|
|
3
|
+
let loggingEnabled = false;
|
|
4
|
+
|
|
5
|
+
// CSS styles for console log level badges
|
|
6
|
+
const BADGE_STYLES: Record<LogLevel, string> = {
|
|
7
|
+
debug: 'background: #7f8c8d; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',
|
|
8
|
+
info: 'background: #2980b9; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',
|
|
9
|
+
warn: 'background: #f1c40f; color: #000; padding: 2px 5px; border-radius: 3px; font-weight: bold;',
|
|
10
|
+
error: 'background: #e74c3c; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',
|
|
11
|
+
success: 'background: #2ecc71; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',
|
|
12
|
+
perf: 'background: #9b59b6; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',
|
|
13
|
+
analytics: 'background: #e20074; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Writes formatted badges and log details into the console if logging is enabled.
|
|
18
|
+
* Note: analytics level logs are always printed regardless of debug settings.
|
|
19
|
+
*
|
|
20
|
+
* @param level Logging categorization level (debug, info, warn, error, success, analytics).
|
|
21
|
+
* @param message Description message text.
|
|
22
|
+
* @param meta Optional auxiliary metadata/payload.
|
|
23
|
+
*/
|
|
24
|
+
function writeLog(level: LogLevel, message: string, meta?: any) {
|
|
25
|
+
if (!loggingEnabled && level !== 'analytics') return;
|
|
26
|
+
|
|
27
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
28
|
+
const badge = `%c[SDK:${level.toUpperCase()}]`;
|
|
29
|
+
const style = BADGE_STYLES[level];
|
|
30
|
+
|
|
31
|
+
if (meta !== undefined) {
|
|
32
|
+
console.log(`[${timestamp}] ${badge}`, style, message, meta);
|
|
33
|
+
} else {
|
|
34
|
+
console.log(`[${timestamp}] ${badge}`, style, message);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* A central namespace containing logging helpers for debugging, warnings, success,
|
|
40
|
+
* and API monitoring. Output logs are formatted with custom browser styles.
|
|
41
|
+
*/
|
|
42
|
+
export const sdkLogger = {
|
|
43
|
+
setEnabled: (val: boolean) => {
|
|
44
|
+
loggingEnabled = val;
|
|
45
|
+
},
|
|
46
|
+
isEnabled: () => {
|
|
47
|
+
return loggingEnabled;
|
|
48
|
+
},
|
|
49
|
+
debug: (msg: string, meta?: any) => writeLog('debug', msg, meta),
|
|
50
|
+
info: (msg: string, meta?: any) => writeLog('info', msg, meta),
|
|
51
|
+
warn: (msg: string, meta?: any) => writeLog('warn', msg, meta),
|
|
52
|
+
error: (msg: string, meta?: any) => writeLog('error', msg, meta),
|
|
53
|
+
success: (msg: string, meta?: any) => writeLog('success', msg, meta),
|
|
54
|
+
analytics: (msg: string, meta?: any) => writeLog('analytics', msg, meta),
|
|
55
|
+
perf: (metric: {
|
|
56
|
+
apiName: string;
|
|
57
|
+
durationMs: number;
|
|
58
|
+
status: number | string;
|
|
59
|
+
url: string;
|
|
60
|
+
requestSize?: string;
|
|
61
|
+
responseSize?: string;
|
|
62
|
+
payloadSize?: string;
|
|
63
|
+
success: boolean;
|
|
64
|
+
}) => {
|
|
65
|
+
writeLog(
|
|
66
|
+
'perf',
|
|
67
|
+
`${metric.apiName} completed in ${metric.durationMs.toFixed(2)}ms | Status: ${metric.status}`,
|
|
68
|
+
metric
|
|
69
|
+
);
|
|
70
|
+
},
|
|
71
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { QueryClient } from '@tanstack/react-query';
|
|
2
|
+
import { sdkLogger } from './logger/logger';
|
|
3
|
+
|
|
4
|
+
export const sdkQueryClient = new QueryClient({
|
|
5
|
+
defaultOptions: {
|
|
6
|
+
queries: {
|
|
7
|
+
staleTime: Infinity, // Keep the survey layout cached forever during the session
|
|
8
|
+
refetchOnWindowFocus: false, // Prevent layout flashes when switching browser tabs
|
|
9
|
+
refetchOnReconnect: false, // Avoid redundant network calls on internet reconnection
|
|
10
|
+
refetchInterval: false, // Do not poll (survey metadata is static)
|
|
11
|
+
retryDelay: 5000, // 5 seconds delay between retries
|
|
12
|
+
retry: (failureCount, error) => {
|
|
13
|
+
// Stop retrying after 3 attempts
|
|
14
|
+
if (failureCount >= 3) {
|
|
15
|
+
sdkLogger.error(`Query failed permanently after 3 attempts. Stopping retries.`, error);
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Do not retry on permanent client errors (400, 401, 403, 404, 422)
|
|
20
|
+
if (error instanceof Error) {
|
|
21
|
+
const msg = error.message;
|
|
22
|
+
if (
|
|
23
|
+
msg.includes('400') || // 400 Bad Request
|
|
24
|
+
msg.includes('401') || // 401 Unauthorized
|
|
25
|
+
msg.includes('403') || // 403 Forbidden
|
|
26
|
+
msg.includes('404') || // 404 Not Found
|
|
27
|
+
msg.includes('422') // 422 Unprocessable Entity
|
|
28
|
+
) {
|
|
29
|
+
sdkLogger.error(`Query failed permanently due to client error (${msg}). Skipping retry.`, error);
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
sdkLogger.warn(`Query failed. Retrying attempt ${failureCount + 1}/3...`, error);
|
|
35
|
+
return true;
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
mutations: {
|
|
39
|
+
networkMode: 'always', // Prevent React Query from pausing mutations when offline, forcing immediate retry logging
|
|
40
|
+
retryDelay: 5000, // 5 seconds delay between retries
|
|
41
|
+
retry: (failureCount, error) => {
|
|
42
|
+
// Retry up to 3 times for transient network/server failures
|
|
43
|
+
if (failureCount >= 3) {
|
|
44
|
+
sdkLogger.error(`Mutation failed permanently after 3 attempts. Stopping retries.`, error);
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Do not retry on permanent validation or client errors (400, 401, 403, 422)
|
|
49
|
+
if (error instanceof Error) {
|
|
50
|
+
const msg = error.message;
|
|
51
|
+
if (
|
|
52
|
+
msg.includes('400') || // 400 Bad Request (Client syntax / invalid parameters)
|
|
53
|
+
msg.includes('401') || // 401 Unauthorized (Authentication issues)
|
|
54
|
+
msg.includes('403') || // 403 Forbidden (Insufficient permissions)
|
|
55
|
+
msg.includes('422') // 422 Unprocessable Entity (Semantic validation failure)
|
|
56
|
+
) {
|
|
57
|
+
sdkLogger.error(`Mutation failed permanently due to validation/client error. Skipping retry.`, error);
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
sdkLogger.warn(`Mutation failed. Retrying attempt ${failureCount + 1}/3...`, error);
|
|
63
|
+
return true;
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { sdkLogger } from '../../logger/logger';
|
|
2
|
+
|
|
3
|
+
export function logResolvedInputs(resolved: any): void {
|
|
4
|
+
sdkLogger.debug('Resolved raw inputs to submit schema:', resolved);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function logRequestBody(body: any): void {
|
|
8
|
+
sdkLogger.debug('Constructed JSON request body:', body);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function logExecuteSubmitError(err: any): void {
|
|
12
|
+
sdkLogger.error('Failed to execute submit callback', err);
|
|
13
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { sdkLogger } from '../../logger/logger';
|
|
2
|
+
|
|
3
|
+
export function logSubmitStart(url: string, requestBody: any): void {
|
|
4
|
+
sdkLogger.info('Starting survey response HTTP POST...', { url, requestBody });
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function logSubmitWarn(msg: string, err: any): void {
|
|
8
|
+
sdkLogger.warn(msg, err);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function logSubmitPerfSuccess(
|
|
12
|
+
durationMs: number,
|
|
13
|
+
status: number,
|
|
14
|
+
url: string,
|
|
15
|
+
requestSize: string,
|
|
16
|
+
responseSize: string
|
|
17
|
+
): void {
|
|
18
|
+
sdkLogger.perf({
|
|
19
|
+
apiName: 'POST Submit Response',
|
|
20
|
+
durationMs,
|
|
21
|
+
status,
|
|
22
|
+
url,
|
|
23
|
+
requestSize,
|
|
24
|
+
responseSize,
|
|
25
|
+
success: true,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function logSubmitPerfFailure(
|
|
30
|
+
durationMs: number,
|
|
31
|
+
status: number | string,
|
|
32
|
+
url: string,
|
|
33
|
+
requestSize: string
|
|
34
|
+
): void {
|
|
35
|
+
sdkLogger.perf({
|
|
36
|
+
apiName: 'POST Submit Response',
|
|
37
|
+
durationMs,
|
|
38
|
+
status,
|
|
39
|
+
url,
|
|
40
|
+
requestSize,
|
|
41
|
+
success: false,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function logSubmitSuccess(responseId: string): void {
|
|
46
|
+
sdkLogger.success('Survey response submitted successfully', { responseId });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function logSubmitError(msg: string, err: any): void {
|
|
50
|
+
sdkLogger.error(msg, err);
|
|
51
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { trackEvent } from '../../analytics/analyticsTracker';
|
|
2
|
+
|
|
3
|
+
export function trackSubmitLatency(
|
|
4
|
+
durationMs: number,
|
|
5
|
+
status: number,
|
|
6
|
+
url: string,
|
|
7
|
+
requestSize: string,
|
|
8
|
+
responseSize: string
|
|
9
|
+
): void {
|
|
10
|
+
trackEvent({
|
|
11
|
+
eventName: 'survey_submit_latency',
|
|
12
|
+
metadata: {
|
|
13
|
+
durationMs,
|
|
14
|
+
status,
|
|
15
|
+
success: true,
|
|
16
|
+
url,
|
|
17
|
+
requestSize,
|
|
18
|
+
responseSize,
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function trackSubmitError(status: number | string, url: string, errorMessage: string): void {
|
|
24
|
+
trackEvent({
|
|
25
|
+
eventName: 'api_error',
|
|
26
|
+
metadata: {
|
|
27
|
+
apiName: 'POST Submit Response',
|
|
28
|
+
status,
|
|
29
|
+
url,
|
|
30
|
+
errorMessage,
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Survey, SurveyQuestion, SurveySession } from '../fetchSurvey/useFetchSurvey';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Key-value mapping of question IDs to their selected answer values (string or number).
|
|
5
|
+
*/
|
|
6
|
+
export type SubmitAnswers = Record<string, string | number>;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Standard input structure accepted by the submit hook.
|
|
10
|
+
*/
|
|
11
|
+
export type SubmitInput = {
|
|
12
|
+
// Collection of answered questions and values
|
|
13
|
+
answers: SubmitAnswers;
|
|
14
|
+
// Unique distribution instance token/identifier
|
|
15
|
+
instanceId: string;
|
|
16
|
+
// Localized language code of the submission
|
|
17
|
+
surveyLanguage?: string;
|
|
18
|
+
// Full question configuration structure (used to locate parent/child mappings)
|
|
19
|
+
questions?: SurveyQuestion[];
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Formatted JSON payload required by the Sprinklr response endpoint.
|
|
24
|
+
*/
|
|
25
|
+
export type SubmitRequestBody = {
|
|
26
|
+
// Mapping of final submit ID to an array of selected answer values
|
|
27
|
+
questionToAnswers: Record<string, string[]>;
|
|
28
|
+
// Optional file attachment details mapping
|
|
29
|
+
quesIdVsAttachmentDetails: Record<string, unknown>;
|
|
30
|
+
// Mapping of parent question ID to an array of selected answer values for matrix grids
|
|
31
|
+
optionLevelAnswers: Record<string, string[]>;
|
|
32
|
+
// Conjoint task tracking structures
|
|
33
|
+
conjointTasks: unknown[];
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The final output result resolved after a successful submit response.
|
|
38
|
+
*/
|
|
39
|
+
export type SubmitResult = {
|
|
40
|
+
// Flag indicating whether submission was successful
|
|
41
|
+
success: boolean;
|
|
42
|
+
// Generated submission database ID
|
|
43
|
+
responseId: string;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Raw response body structure returned by the survey response submit endpoint.
|
|
48
|
+
*/
|
|
49
|
+
export type SubmitApiResponse = {
|
|
50
|
+
responseId?: string;
|
|
51
|
+
};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import { useMutation } from '@tanstack/react-query';
|
|
3
|
+
import { sdkQueryClient } from '../queryClient';
|
|
4
|
+
import type { Survey, SurveySession } from '../fetchSurvey/useFetchSurvey';
|
|
5
|
+
import type { SubmitAnswers, SubmitInput, SubmitResult, SubmitApiResponse } from './types';
|
|
6
|
+
import {
|
|
7
|
+
logSubmitStart,
|
|
8
|
+
logSubmitWarn,
|
|
9
|
+
logSubmitPerfSuccess,
|
|
10
|
+
logSubmitPerfFailure,
|
|
11
|
+
logSubmitSuccess,
|
|
12
|
+
logSubmitError,
|
|
13
|
+
} from './logger/submitLogger';
|
|
14
|
+
import { logResolvedInputs, logRequestBody, logExecuteSubmitError } from './logger/resolutionLogger';
|
|
15
|
+
import { trackSubmitLatency, trackSubmitError } from './telemetry/submitTelemetry';
|
|
16
|
+
|
|
17
|
+
// Re-export all type definitions (both parameters and final mapped results)
|
|
18
|
+
export * from './types';
|
|
19
|
+
import { resolveSubmitInput, buildSubmitRequestBody, buildExternalSubmitUrl } from './utils';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Perform the HTTP POST request to submit answers.
|
|
23
|
+
*/
|
|
24
|
+
async function submitSurveyResponse({ url, requestBody }: { url: string; requestBody: any }): Promise<SubmitResult> {
|
|
25
|
+
const startTime = performance.now();
|
|
26
|
+
const requestSize = new Blob([JSON.stringify(requestBody)]).size;
|
|
27
|
+
const requestSizeStr = `${(requestSize / 1024).toFixed(2)} KB`;
|
|
28
|
+
logSubmitStart(url, requestBody);
|
|
29
|
+
try {
|
|
30
|
+
const response = await fetch(url, {
|
|
31
|
+
method: 'POST',
|
|
32
|
+
headers: { 'Content-Type': 'application/json' },
|
|
33
|
+
body: JSON.stringify(requestBody),
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const responseData = (await response.json().catch(err => {
|
|
37
|
+
logSubmitWarn('Failed to parse JSON response during submission', err);
|
|
38
|
+
return null;
|
|
39
|
+
})) as SubmitApiResponse | null;
|
|
40
|
+
|
|
41
|
+
const durationMs = performance.now() - startTime;
|
|
42
|
+
const responseSize = responseData ? new Blob([JSON.stringify(responseData)]).size : 0;
|
|
43
|
+
const responseSizeStr = `${(responseSize / 1024).toFixed(2)} KB`;
|
|
44
|
+
|
|
45
|
+
if (!response.ok) {
|
|
46
|
+
logSubmitPerfFailure(durationMs, response.status, url, requestSizeStr);
|
|
47
|
+
trackSubmitError(response.status, url, `Submit failed (${response.status}): ${JSON.stringify(responseData)}`);
|
|
48
|
+
throw new Error(`Submit failed (${response.status}): ${JSON.stringify(responseData)}`);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const responseId = responseData?.responseId ?? '';
|
|
52
|
+
logSubmitPerfSuccess(durationMs, response.status, url, requestSizeStr, responseSizeStr);
|
|
53
|
+
|
|
54
|
+
trackSubmitLatency(durationMs, response.status, url, requestSizeStr, responseSizeStr);
|
|
55
|
+
|
|
56
|
+
logSubmitSuccess(responseId);
|
|
57
|
+
return { success: true, responseId };
|
|
58
|
+
} catch (err: any) {
|
|
59
|
+
const durationMs = performance.now() - startTime;
|
|
60
|
+
logSubmitPerfFailure(durationMs, 'FAILED', url, requestSizeStr);
|
|
61
|
+
trackSubmitError('FAILED', url, err?.message || String(err));
|
|
62
|
+
logSubmitError('Failed to submit survey response', err);
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* A custom React hook that manages submitting user answers to the remote survey response service.
|
|
69
|
+
* Tracks submission data, loading states, and error responses using TanStack Query useMutation.
|
|
70
|
+
*
|
|
71
|
+
* @param session Active survey session details containing target instanceId and language.
|
|
72
|
+
* @param survey Fully mapped survey structure containing questions.
|
|
73
|
+
* @returns Object holding submit execution, result data, loading state, and error.
|
|
74
|
+
*/
|
|
75
|
+
export function useSubmitResponse(session?: SurveySession | null, survey?: Survey | null) {
|
|
76
|
+
const mutation = useMutation(
|
|
77
|
+
{
|
|
78
|
+
mutationFn: ({ url, requestBody }: { url: string; requestBody: any }) =>
|
|
79
|
+
submitSurveyResponse({ url, requestBody }),
|
|
80
|
+
},
|
|
81
|
+
sdkQueryClient
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
const submit = useCallback(
|
|
85
|
+
async (input: SubmitAnswers | SubmitInput) => {
|
|
86
|
+
try {
|
|
87
|
+
const resolved = resolveSubmitInput(input, session, survey);
|
|
88
|
+
logResolvedInputs(resolved);
|
|
89
|
+
|
|
90
|
+
const surveyLanguage = resolved.surveyLanguage ?? 'en';
|
|
91
|
+
const requestBody = buildSubmitRequestBody(resolved.answers, resolved.questions ?? []);
|
|
92
|
+
logRequestBody(requestBody);
|
|
93
|
+
|
|
94
|
+
const url = buildExternalSubmitUrl(resolved.instanceId, surveyLanguage);
|
|
95
|
+
|
|
96
|
+
return await mutation.mutateAsync({ url, requestBody });
|
|
97
|
+
} catch (err) {
|
|
98
|
+
logExecuteSubmitError(err);
|
|
99
|
+
throw err;
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
[session, survey, mutation]
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
return {
|
|
106
|
+
submit,
|
|
107
|
+
data: mutation.data ?? null,
|
|
108
|
+
loading: mutation.isPending,
|
|
109
|
+
error: mutation.error,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { SurveyQuestion } from '../../fetchSurvey/useFetchSurvey';
|
|
2
|
+
import type { SubmitAnswers, SubmitRequestBody } from '../types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Assembles the full JSON request body structured for response submissions.
|
|
6
|
+
* Resolves standard vs matrix-level question target mapping.
|
|
7
|
+
*
|
|
8
|
+
* @param answers Selected answer map.
|
|
9
|
+
* @param questions Survey questions list.
|
|
10
|
+
* @returns Formatted request body matching payload schema.
|
|
11
|
+
*/
|
|
12
|
+
export function buildSubmitRequestBody(
|
|
13
|
+
answers: SubmitAnswers,
|
|
14
|
+
questions: SurveyQuestion[]
|
|
15
|
+
): SubmitRequestBody {
|
|
16
|
+
const questionToAnswers: Record<string, string[]> = {};
|
|
17
|
+
|
|
18
|
+
for (const question of questions) {
|
|
19
|
+
const value = answers[question.id];
|
|
20
|
+
if (value === undefined || value === null) continue;
|
|
21
|
+
|
|
22
|
+
const formatted = String(value);
|
|
23
|
+
// Submit answer against standard question ID
|
|
24
|
+
questionToAnswers[question.id] = [formatted];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
questionToAnswers,
|
|
29
|
+
quesIdVsAttachmentDetails: {},
|
|
30
|
+
optionLevelAnswers: {},
|
|
31
|
+
conjointTasks: [],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SUBMIT_BASE_URL } from './constants';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Constructs the external URL used to call the remote survey response submit service.
|
|
5
|
+
*
|
|
6
|
+
* @param instanceId The active session/instance identifier token.
|
|
7
|
+
* @param surveyLanguage Optional language locale string (defaults to 'en').
|
|
8
|
+
* @returns Fully constructed target submit URL.
|
|
9
|
+
*/
|
|
10
|
+
export function buildExternalSubmitUrl(instanceId: string, surveyLanguage = 'en'): string {
|
|
11
|
+
const params = new URLSearchParams({
|
|
12
|
+
instanceId,
|
|
13
|
+
surveySubmitted: 'true',
|
|
14
|
+
surveyLanguage,
|
|
15
|
+
});
|
|
16
|
+
return `${SUBMIT_BASE_URL}?${params.toString()}`;
|
|
17
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Survey, SurveySession } from '../../fetchSurvey/useFetchSurvey';
|
|
2
|
+
import type { SubmitAnswers, SubmitInput } from '../types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Type guard function validating if input structure is a SubmitInput wrapper.
|
|
6
|
+
*
|
|
7
|
+
* @param input The answers map or input object.
|
|
8
|
+
* @returns Boolean representing validation result.
|
|
9
|
+
*/
|
|
10
|
+
export function isSubmitInput(input: SubmitAnswers | SubmitInput): input is SubmitInput {
|
|
11
|
+
return typeof input === 'object' && input !== null && 'instanceId' in input && 'answers' in input;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Resolves raw input and session context to a clean, validated SubmitInput model.
|
|
16
|
+
* Throws errors if session is uninitialized or missing active identifiers.
|
|
17
|
+
*
|
|
18
|
+
* @param input Raw selections or input object.
|
|
19
|
+
* @param session Active survey session details.
|
|
20
|
+
* @param survey Loaded survey definition.
|
|
21
|
+
* @returns Resolved input model containing clean parameters.
|
|
22
|
+
*/
|
|
23
|
+
export function resolveSubmitInput(
|
|
24
|
+
input: SubmitAnswers | SubmitInput,
|
|
25
|
+
session?: SurveySession | null,
|
|
26
|
+
survey?: Survey | null
|
|
27
|
+
): SubmitInput {
|
|
28
|
+
if (isSubmitInput(input)) {
|
|
29
|
+
return {
|
|
30
|
+
...input,
|
|
31
|
+
surveyLanguage: input.surveyLanguage ?? session?.language ?? 'en',
|
|
32
|
+
questions: input.questions ?? survey?.pages.flatMap(p => p.questions) ?? [],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Guard: require session context if not explicitly provided inside input payload
|
|
37
|
+
if (!session?.instanceId) {
|
|
38
|
+
throw new Error('Survey session not ready. Fetch survey before submitting.');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
answers: input,
|
|
43
|
+
instanceId: session.instanceId,
|
|
44
|
+
surveyLanguage: session.language ?? 'en',
|
|
45
|
+
questions: survey?.pages.flatMap(p => p.questions) ?? [],
|
|
46
|
+
//to handle mutliple page strcuture
|
|
47
|
+
};
|
|
48
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import { logBackNavigation } from '../logger/navigationLogger';
|
|
3
|
+
import type { SurveyPaginationContext } from '../types';
|
|
4
|
+
import { scrollToFirstQuestionOfPage } from '../utils';
|
|
5
|
+
|
|
6
|
+
export function useOnBack(context: SurveyPaginationContext) {
|
|
7
|
+
const { currentPageIndex, setCurrentPageIndex, trackPageTime, pages, values, paginationRefs } = context;
|
|
8
|
+
|
|
9
|
+
return useCallback(() => {
|
|
10
|
+
if (currentPageIndex > 0) {
|
|
11
|
+
logBackNavigation(currentPageIndex);
|
|
12
|
+
|
|
13
|
+
// Track page time spent
|
|
14
|
+
trackPageTime(currentPageIndex);
|
|
15
|
+
|
|
16
|
+
const refs = paginationRefs.current;
|
|
17
|
+
// Increment backtrack count
|
|
18
|
+
refs.backtrackCount += 1;
|
|
19
|
+
|
|
20
|
+
// Snapshot the values of the page we are heading back to
|
|
21
|
+
const targetPageIndex = currentPageIndex - 1;
|
|
22
|
+
const targetPageQuestions = pages[targetPageIndex]?.questions ?? [];
|
|
23
|
+
const answersSnapshot: Record<string, any> = {};
|
|
24
|
+
targetPageQuestions.forEach(q => {
|
|
25
|
+
answersSnapshot[q.id] = values[q.id];
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
refs.backtrackSnapshots[targetPageIndex] = {
|
|
29
|
+
fromPageIndex: currentPageIndex,
|
|
30
|
+
snapshot: answersSnapshot,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
setCurrentPageIndex(targetPageIndex);
|
|
34
|
+
scrollToFirstQuestionOfPage(pages, targetPageIndex);
|
|
35
|
+
}
|
|
36
|
+
}, [currentPageIndex, setCurrentPageIndex, trackPageTime, pages, values, paginationRefs]);
|
|
37
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import { logChangeAnswer } from '../logger/navigationLogger';
|
|
3
|
+
import type { SurveyPaginationContext } from '../types';
|
|
4
|
+
|
|
5
|
+
export function useOnChange(context: SurveyPaginationContext) {
|
|
6
|
+
const { setValues, setValidationErrors } = context;
|
|
7
|
+
|
|
8
|
+
return useCallback(
|
|
9
|
+
(questionId: string, value: string | number) => {
|
|
10
|
+
logChangeAnswer(questionId, value);
|
|
11
|
+
setValues(prev => ({ ...prev, [questionId]: value }));
|
|
12
|
+
setValidationErrors(prev => ({ ...prev, [questionId]: '' }));
|
|
13
|
+
},
|
|
14
|
+
[setValues, setValidationErrors]
|
|
15
|
+
);
|
|
16
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import { logNextNavigation, logScrollWarning } from '../logger/navigationLogger';
|
|
3
|
+
import { logValidationErrorPage, logValidationFailedSubmit } from '../logger/validationLogger';
|
|
4
|
+
import { trackValidationError } from '../telemetry/pageTelemetry';
|
|
5
|
+
import { validateQuestions, findQuestionElement, scrollToFirstQuestionOfPage } from '../utils';
|
|
6
|
+
import type { SurveyPaginationContext } from '../types';
|
|
7
|
+
|
|
8
|
+
export function useOnNext(context: SurveyPaginationContext, onSubmit: () => void) {
|
|
9
|
+
const {
|
|
10
|
+
survey,
|
|
11
|
+
pages,
|
|
12
|
+
values,
|
|
13
|
+
currentPageIndex,
|
|
14
|
+
setCurrentPageIndex,
|
|
15
|
+
setValidationErrors,
|
|
16
|
+
trackPageTime,
|
|
17
|
+
trackOptionalSkips,
|
|
18
|
+
checkBacktrackChanges,
|
|
19
|
+
paginationRefs,
|
|
20
|
+
} = context;
|
|
21
|
+
|
|
22
|
+
const currentPage = pages[currentPageIndex];
|
|
23
|
+
const currentQuestions = currentPage?.questions ?? [];
|
|
24
|
+
|
|
25
|
+
return useCallback(() => {
|
|
26
|
+
if (!survey || !currentPage) return;
|
|
27
|
+
|
|
28
|
+
let errors: Record<string, string> = {};
|
|
29
|
+
try {
|
|
30
|
+
errors = validateQuestions(currentQuestions, values, survey.language);
|
|
31
|
+
} catch (err) {
|
|
32
|
+
logValidationFailedSubmit(err);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const refs = paginationRefs.current;
|
|
36
|
+
|
|
37
|
+
if (Object.keys(errors).length > 0) {
|
|
38
|
+
logValidationErrorPage(errors);
|
|
39
|
+
|
|
40
|
+
// Track validation error attempt
|
|
41
|
+
const attempt = (refs.validationAttempt[currentPageIndex] || 0) + 1;
|
|
42
|
+
refs.validationAttempt[currentPageIndex] = attempt;
|
|
43
|
+
refs.validationErrorsCount += 1;
|
|
44
|
+
refs.validationHistory.push({
|
|
45
|
+
pageIndex: currentPageIndex,
|
|
46
|
+
errors,
|
|
47
|
+
attemptNumber: attempt,
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
trackValidationError(currentPageIndex, errors, attempt);
|
|
51
|
+
|
|
52
|
+
setValidationErrors(errors);
|
|
53
|
+
const firstErrorId = Object.keys(errors)[0];
|
|
54
|
+
setTimeout(() => {
|
|
55
|
+
try {
|
|
56
|
+
const element = findQuestionElement(firstErrorId);
|
|
57
|
+
if (element) {
|
|
58
|
+
element.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
59
|
+
}
|
|
60
|
+
} catch (err) {
|
|
61
|
+
logScrollWarning('Failed to scroll validation error element into view', err);
|
|
62
|
+
}
|
|
63
|
+
}, 50);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
setValidationErrors({});
|
|
68
|
+
|
|
69
|
+
// Clear validation attempt on successful page progression
|
|
70
|
+
delete refs.validationAttempt[currentPageIndex];
|
|
71
|
+
|
|
72
|
+
// Track page duration, optional skips, and backtrack changes
|
|
73
|
+
trackPageTime(currentPageIndex);
|
|
74
|
+
trackOptionalSkips(currentPageIndex);
|
|
75
|
+
checkBacktrackChanges(currentPageIndex);
|
|
76
|
+
|
|
77
|
+
if (currentPageIndex < pages.length - 1) {
|
|
78
|
+
logNextNavigation(currentPageIndex);
|
|
79
|
+
setCurrentPageIndex(prev => prev + 1);
|
|
80
|
+
scrollToFirstQuestionOfPage(pages, currentPageIndex + 1);
|
|
81
|
+
} else {
|
|
82
|
+
onSubmit();
|
|
83
|
+
}
|
|
84
|
+
}, [
|
|
85
|
+
survey,
|
|
86
|
+
currentPage,
|
|
87
|
+
currentQuestions,
|
|
88
|
+
values,
|
|
89
|
+
currentPageIndex,
|
|
90
|
+
setCurrentPageIndex,
|
|
91
|
+
setValidationErrors,
|
|
92
|
+
trackPageTime,
|
|
93
|
+
trackOptionalSkips,
|
|
94
|
+
checkBacktrackChanges,
|
|
95
|
+
pages,
|
|
96
|
+
onSubmit,
|
|
97
|
+
paginationRefs,
|
|
98
|
+
]);
|
|
99
|
+
}
|