@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.
Files changed (318) hide show
  1. package/dist/analytics/analyticsTracker.d.ts +3 -0
  2. package/dist/analytics/analyticsTracker.d.ts.map +1 -0
  3. package/dist/analytics/analyticsTracker.js +34 -0
  4. package/dist/analytics/analyticsTracker.js.map +1 -0
  5. package/dist/analytics/types.d.ts +76 -0
  6. package/dist/analytics/types.d.ts.map +1 -0
  7. package/dist/analytics/types.js +3 -0
  8. package/dist/analytics/types.js.map +1 -0
  9. package/dist/cli/deploy.d.ts +2 -0
  10. package/dist/cli/deploy.d.ts.map +1 -0
  11. package/dist/cli/deploy.js +200 -0
  12. package/dist/cli/deploy.js.map +1 -0
  13. package/dist/cli/index.d.ts +3 -0
  14. package/dist/cli/index.d.ts.map +1 -0
  15. package/dist/cli/index.js +33 -0
  16. package/dist/cli/index.js.map +1 -0
  17. package/dist/fetchSurvey/internalTypes.d.ts +60 -0
  18. package/dist/fetchSurvey/internalTypes.d.ts.map +1 -0
  19. package/dist/fetchSurvey/internalTypes.js +3 -0
  20. package/dist/fetchSurvey/internalTypes.js.map +1 -0
  21. package/dist/fetchSurvey/logger/fetchLogger.d.ts +6 -0
  22. package/dist/fetchSurvey/logger/fetchLogger.d.ts.map +1 -0
  23. package/dist/fetchSurvey/logger/fetchLogger.js +37 -0
  24. package/dist/fetchSurvey/logger/fetchLogger.js.map +1 -0
  25. package/dist/fetchSurvey/logger/mapperLogger.d.ts +4 -0
  26. package/dist/fetchSurvey/logger/mapperLogger.d.ts.map +1 -0
  27. package/dist/fetchSurvey/logger/mapperLogger.js +16 -0
  28. package/dist/fetchSurvey/logger/mapperLogger.js.map +1 -0
  29. package/dist/fetchSurvey/telemetry/fetchTelemetry.d.ts +3 -0
  30. package/dist/fetchSurvey/telemetry/fetchTelemetry.d.ts.map +1 -0
  31. package/dist/fetchSurvey/telemetry/fetchTelemetry.js +29 -0
  32. package/dist/fetchSurvey/telemetry/fetchTelemetry.js.map +1 -0
  33. package/dist/fetchSurvey/types.d.ts +54 -0
  34. package/dist/fetchSurvey/types.d.ts.map +1 -0
  35. package/dist/fetchSurvey/types.js +3 -0
  36. package/dist/fetchSurvey/types.js.map +1 -0
  37. package/dist/fetchSurvey/useFetchSurvey.d.ts +24 -0
  38. package/dist/fetchSurvey/useFetchSurvey.d.ts.map +1 -0
  39. package/dist/fetchSurvey/useFetchSurvey.js +115 -0
  40. package/dist/fetchSurvey/useFetchSurvey.js.map +1 -0
  41. package/dist/fetchSurvey/utils/cleaner.d.ts +7 -0
  42. package/dist/fetchSurvey/utils/cleaner.d.ts.map +1 -0
  43. package/dist/fetchSurvey/utils/cleaner.js +35 -0
  44. package/dist/fetchSurvey/utils/cleaner.js.map +1 -0
  45. package/dist/fetchSurvey/utils/constants.d.ts +10 -0
  46. package/dist/fetchSurvey/utils/constants.d.ts.map +1 -0
  47. package/dist/fetchSurvey/utils/constants.js +13 -0
  48. package/dist/fetchSurvey/utils/constants.js.map +1 -0
  49. package/dist/fetchSurvey/utils/extractSurveyLanguages.d.ts +17 -0
  50. package/dist/fetchSurvey/utils/extractSurveyLanguages.d.ts.map +1 -0
  51. package/dist/fetchSurvey/utils/extractSurveyLanguages.js +61 -0
  52. package/dist/fetchSurvey/utils/extractSurveyLanguages.js.map +1 -0
  53. package/dist/fetchSurvey/utils/index.d.ts +6 -0
  54. package/dist/fetchSurvey/utils/index.d.ts.map +1 -0
  55. package/dist/fetchSurvey/utils/index.js +22 -0
  56. package/dist/fetchSurvey/utils/index.js.map +1 -0
  57. package/dist/fetchSurvey/utils/mapSurveyPages.d.ts +12 -0
  58. package/dist/fetchSurvey/utils/mapSurveyPages.d.ts.map +1 -0
  59. package/dist/fetchSurvey/utils/mapSurveyPages.js +30 -0
  60. package/dist/fetchSurvey/utils/mapSurveyPages.js.map +1 -0
  61. package/dist/fetchSurvey/utils/mappers/index.d.ts +3 -0
  62. package/dist/fetchSurvey/utils/mappers/index.d.ts.map +1 -0
  63. package/dist/fetchSurvey/utils/mappers/index.js +19 -0
  64. package/dist/fetchSurvey/utils/mappers/index.js.map +1 -0
  65. package/dist/fetchSurvey/utils/mappers/questionMapper.d.ts +42 -0
  66. package/dist/fetchSurvey/utils/mappers/questionMapper.d.ts.map +1 -0
  67. package/dist/fetchSurvey/utils/mappers/questionMapper.js +183 -0
  68. package/dist/fetchSurvey/utils/mappers/questionMapper.js.map +1 -0
  69. package/dist/fetchSurvey/utils/mappers/surveyMapper.d.ts +36 -0
  70. package/dist/fetchSurvey/utils/mappers/surveyMapper.d.ts.map +1 -0
  71. package/dist/fetchSurvey/utils/mappers/surveyMapper.js +65 -0
  72. package/dist/fetchSurvey/utils/mappers/surveyMapper.js.map +1 -0
  73. package/dist/fetchSurvey/utils/url.d.ts +14 -0
  74. package/dist/fetchSurvey/utils/url.d.ts.map +1 -0
  75. package/dist/fetchSurvey/utils/url.js +23 -0
  76. package/dist/fetchSurvey/utils/url.js.map +1 -0
  77. package/dist/fetchSurvey/utils/validation.d.ts +15 -0
  78. package/dist/fetchSurvey/utils/validation.d.ts.map +1 -0
  79. package/dist/fetchSurvey/utils/validation.js +36 -0
  80. package/dist/fetchSurvey/utils/validation.js.map +1 -0
  81. package/dist/index.d.ts +3 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +6 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/logger/logger.d.ts +26 -0
  86. package/dist/logger/logger.d.ts.map +1 -0
  87. package/dist/logger/logger.js +57 -0
  88. package/dist/logger/logger.js.map +1 -0
  89. package/dist/queryClient.d.ts +3 -0
  90. package/dist/queryClient.d.ts.map +1 -0
  91. package/dist/queryClient.js +64 -0
  92. package/dist/queryClient.js.map +1 -0
  93. package/dist/submitSurvey/logger/resolutionLogger.d.ts +4 -0
  94. package/dist/submitSurvey/logger/resolutionLogger.d.ts.map +1 -0
  95. package/dist/submitSurvey/logger/resolutionLogger.js +16 -0
  96. package/dist/submitSurvey/logger/resolutionLogger.js.map +1 -0
  97. package/dist/submitSurvey/logger/submitLogger.d.ts +7 -0
  98. package/dist/submitSurvey/logger/submitLogger.d.ts.map +1 -0
  99. package/dist/submitSurvey/logger/submitLogger.js +43 -0
  100. package/dist/submitSurvey/logger/submitLogger.js.map +1 -0
  101. package/dist/submitSurvey/telemetry/submitTelemetry.d.ts +3 -0
  102. package/dist/submitSurvey/telemetry/submitTelemetry.d.ts.map +1 -0
  103. package/dist/submitSurvey/telemetry/submitTelemetry.js +30 -0
  104. package/dist/submitSurvey/telemetry/submitTelemetry.js.map +1 -0
  105. package/dist/submitSurvey/types.d.ts +37 -0
  106. package/dist/submitSurvey/types.d.ts.map +1 -0
  107. package/dist/submitSurvey/types.js +3 -0
  108. package/dist/submitSurvey/types.js.map +1 -0
  109. package/dist/submitSurvey/useSubmitResponse.d.ts +18 -0
  110. package/dist/submitSurvey/useSubmitResponse.d.ts.map +1 -0
  111. package/dist/submitSurvey/useSubmitResponse.js +101 -0
  112. package/dist/submitSurvey/useSubmitResponse.js.map +1 -0
  113. package/dist/submitSurvey/useSurveyPagination.d.ts +0 -0
  114. package/dist/submitSurvey/useSurveyPagination.js +1 -0
  115. package/dist/submitSurvey/utils/constants.d.ts +5 -0
  116. package/dist/submitSurvey/utils/constants.d.ts.map +1 -0
  117. package/dist/submitSurvey/utils/constants.js +8 -0
  118. package/dist/submitSurvey/utils/constants.js.map +1 -0
  119. package/dist/submitSurvey/utils/formatters.d.ts +12 -0
  120. package/dist/submitSurvey/utils/formatters.d.ts.map +1 -0
  121. package/dist/submitSurvey/utils/formatters.js +29 -0
  122. package/dist/submitSurvey/utils/formatters.js.map +1 -0
  123. package/dist/submitSurvey/utils/index.d.ts +5 -0
  124. package/dist/submitSurvey/utils/index.d.ts.map +1 -0
  125. package/dist/submitSurvey/utils/index.js +21 -0
  126. package/dist/submitSurvey/utils/index.js.map +1 -0
  127. package/dist/submitSurvey/utils/url.d.ts +9 -0
  128. package/dist/submitSurvey/utils/url.d.ts.map +1 -0
  129. package/dist/submitSurvey/utils/url.js +20 -0
  130. package/dist/submitSurvey/utils/url.js.map +1 -0
  131. package/dist/submitSurvey/utils/validation.d.ts +20 -0
  132. package/dist/submitSurvey/utils/validation.d.ts.map +1 -0
  133. package/dist/submitSurvey/utils/validation.js +43 -0
  134. package/dist/submitSurvey/utils/validation.js.map +1 -0
  135. package/dist/surveyPagination/actions/index.d.ts +5 -0
  136. package/dist/surveyPagination/actions/index.d.ts.map +1 -0
  137. package/dist/surveyPagination/actions/index.js +12 -0
  138. package/dist/surveyPagination/actions/index.js.map +1 -0
  139. package/dist/surveyPagination/actions/useOnBack.d.ts +3 -0
  140. package/dist/surveyPagination/actions/useOnBack.d.ts.map +1 -0
  141. package/dist/surveyPagination/actions/useOnBack.js +33 -0
  142. package/dist/surveyPagination/actions/useOnBack.js.map +1 -0
  143. package/dist/surveyPagination/actions/useOnChange.d.ts +3 -0
  144. package/dist/surveyPagination/actions/useOnChange.d.ts.map +1 -0
  145. package/dist/surveyPagination/actions/useOnChange.js +14 -0
  146. package/dist/surveyPagination/actions/useOnChange.js.map +1 -0
  147. package/dist/surveyPagination/actions/useOnNext.d.ts +3 -0
  148. package/dist/surveyPagination/actions/useOnNext.d.ts.map +1 -0
  149. package/dist/surveyPagination/actions/useOnNext.js +82 -0
  150. package/dist/surveyPagination/actions/useOnNext.js.map +1 -0
  151. package/dist/surveyPagination/actions/useOnSubmit.d.ts +3 -0
  152. package/dist/surveyPagination/actions/useOnSubmit.d.ts.map +1 -0
  153. package/dist/surveyPagination/actions/useOnSubmit.js +102 -0
  154. package/dist/surveyPagination/actions/useOnSubmit.js.map +1 -0
  155. package/dist/surveyPagination/dispatchers/index.d.ts +4 -0
  156. package/dist/surveyPagination/dispatchers/index.d.ts.map +1 -0
  157. package/dist/surveyPagination/dispatchers/index.js +10 -0
  158. package/dist/surveyPagination/dispatchers/index.js.map +1 -0
  159. package/dist/surveyPagination/dispatchers/useCheckBacktrackChanges.d.ts +6 -0
  160. package/dist/surveyPagination/dispatchers/useCheckBacktrackChanges.d.ts.map +1 -0
  161. package/dist/surveyPagination/dispatchers/useCheckBacktrackChanges.js +28 -0
  162. package/dist/surveyPagination/dispatchers/useCheckBacktrackChanges.js.map +1 -0
  163. package/dist/surveyPagination/dispatchers/useTrackOptionalSkips.d.ts +4 -0
  164. package/dist/surveyPagination/dispatchers/useTrackOptionalSkips.d.ts.map +1 -0
  165. package/dist/surveyPagination/dispatchers/useTrackOptionalSkips.js +19 -0
  166. package/dist/surveyPagination/dispatchers/useTrackOptionalSkips.js.map +1 -0
  167. package/dist/surveyPagination/dispatchers/useTrackPageTime.d.ts +4 -0
  168. package/dist/surveyPagination/dispatchers/useTrackPageTime.d.ts.map +1 -0
  169. package/dist/surveyPagination/dispatchers/useTrackPageTime.js +12 -0
  170. package/dist/surveyPagination/dispatchers/useTrackPageTime.js.map +1 -0
  171. package/dist/surveyPagination/effects/index.d.ts +3 -0
  172. package/dist/surveyPagination/effects/index.d.ts.map +1 -0
  173. package/dist/surveyPagination/effects/index.js +8 -0
  174. package/dist/surveyPagination/effects/index.js.map +1 -0
  175. package/dist/surveyPagination/effects/useResetPageStartTime.d.ts +3 -0
  176. package/dist/surveyPagination/effects/useResetPageStartTime.d.ts.map +1 -0
  177. package/dist/surveyPagination/effects/useResetPageStartTime.js +11 -0
  178. package/dist/surveyPagination/effects/useResetPageStartTime.js.map +1 -0
  179. package/dist/surveyPagination/effects/useSessionUnmountSummary.d.ts +2 -0
  180. package/dist/surveyPagination/effects/useSessionUnmountSummary.d.ts.map +1 -0
  181. package/dist/surveyPagination/effects/useSessionUnmountSummary.js +32 -0
  182. package/dist/surveyPagination/effects/useSessionUnmountSummary.js.map +1 -0
  183. package/dist/surveyPagination/effects/useTrackMaxVisitedPage.d.ts +3 -0
  184. package/dist/surveyPagination/effects/useTrackMaxVisitedPage.d.ts.map +1 -0
  185. package/dist/surveyPagination/effects/useTrackMaxVisitedPage.js +13 -0
  186. package/dist/surveyPagination/effects/useTrackMaxVisitedPage.js.map +1 -0
  187. package/dist/surveyPagination/effects/useUpdateAnalyticsContext.d.ts +2 -0
  188. package/dist/surveyPagination/effects/useUpdateAnalyticsContext.d.ts.map +1 -0
  189. package/dist/surveyPagination/effects/useUpdateAnalyticsContext.js +15 -0
  190. package/dist/surveyPagination/effects/useUpdateAnalyticsContext.js.map +1 -0
  191. package/dist/surveyPagination/logger/navigationLogger.d.ts +7 -0
  192. package/dist/surveyPagination/logger/navigationLogger.d.ts.map +1 -0
  193. package/dist/surveyPagination/logger/navigationLogger.js +28 -0
  194. package/dist/surveyPagination/logger/navigationLogger.js.map +1 -0
  195. package/dist/surveyPagination/logger/validationLogger.d.ts +5 -0
  196. package/dist/surveyPagination/logger/validationLogger.d.ts.map +1 -0
  197. package/dist/surveyPagination/logger/validationLogger.js +20 -0
  198. package/dist/surveyPagination/logger/validationLogger.js.map +1 -0
  199. package/dist/surveyPagination/telemetry/pageTelemetry.d.ts +3 -0
  200. package/dist/surveyPagination/telemetry/pageTelemetry.d.ts.map +1 -0
  201. package/dist/surveyPagination/telemetry/pageTelemetry.js +25 -0
  202. package/dist/surveyPagination/telemetry/pageTelemetry.js.map +1 -0
  203. package/dist/surveyPagination/telemetry/sessionTelemetry.d.ts +8 -0
  204. package/dist/surveyPagination/telemetry/sessionTelemetry.d.ts.map +1 -0
  205. package/dist/surveyPagination/telemetry/sessionTelemetry.js +43 -0
  206. package/dist/surveyPagination/telemetry/sessionTelemetry.js.map +1 -0
  207. package/dist/surveyPagination/types.d.ts +43 -0
  208. package/dist/surveyPagination/types.d.ts.map +1 -0
  209. package/dist/surveyPagination/types.js +3 -0
  210. package/dist/surveyPagination/types.js.map +1 -0
  211. package/dist/surveyPagination/useSurveyPagination.d.ts +28 -0
  212. package/dist/surveyPagination/useSurveyPagination.d.ts.map +1 -0
  213. package/dist/surveyPagination/useSurveyPagination.js +93 -0
  214. package/dist/surveyPagination/useSurveyPagination.js.map +1 -0
  215. package/dist/surveyPagination/utils/index.d.ts +3 -0
  216. package/dist/surveyPagination/utils/index.d.ts.map +1 -0
  217. package/dist/surveyPagination/utils/index.js +19 -0
  218. package/dist/surveyPagination/utils/index.js.map +1 -0
  219. package/dist/surveyPagination/utils/scroll.d.ts +25 -0
  220. package/dist/surveyPagination/utils/scroll.d.ts.map +1 -0
  221. package/dist/surveyPagination/utils/scroll.js +67 -0
  222. package/dist/surveyPagination/utils/scroll.js.map +1 -0
  223. package/dist/surveyPagination/utils/validation.d.ts +24 -0
  224. package/dist/surveyPagination/utils/validation.d.ts.map +1 -0
  225. package/dist/surveyPagination/utils/validation.js +53 -0
  226. package/dist/surveyPagination/utils/validation.js.map +1 -0
  227. package/dist/surveyProgress/useSurveyProgress.d.ts +21 -0
  228. package/dist/surveyProgress/useSurveyProgress.d.ts.map +1 -0
  229. package/dist/surveyProgress/useSurveyProgress.js +34 -0
  230. package/dist/surveyProgress/useSurveyProgress.js.map +1 -0
  231. package/dist/surveyProgress/utils/index.d.ts +2 -0
  232. package/dist/surveyProgress/utils/index.d.ts.map +1 -0
  233. package/dist/surveyProgress/utils/index.js +18 -0
  234. package/dist/surveyProgress/utils/index.js.map +1 -0
  235. package/dist/surveyProgress/utils/progress.d.ts +27 -0
  236. package/dist/surveyProgress/utils/progress.d.ts.map +1 -0
  237. package/dist/surveyProgress/utils/progress.js +60 -0
  238. package/dist/surveyProgress/utils/progress.js.map +1 -0
  239. package/dist/surveySDK/constants.d.ts +10 -0
  240. package/dist/surveySDK/constants.d.ts.map +1 -0
  241. package/dist/surveySDK/constants.js +14 -0
  242. package/dist/surveySDK/constants.js.map +1 -0
  243. package/dist/surveySDK/types.d.ts +28 -0
  244. package/dist/surveySDK/types.d.ts.map +1 -0
  245. package/dist/surveySDK/types.js +3 -0
  246. package/dist/surveySDK/types.js.map +1 -0
  247. package/dist/surveySDK/useSurveySDK.d.ts +32 -0
  248. package/dist/surveySDK/useSurveySDK.d.ts.map +1 -0
  249. package/dist/surveySDK/useSurveySDK.js +85 -0
  250. package/dist/surveySDK/useSurveySDK.js.map +1 -0
  251. package/dist/useFetchSurvey.d.ts +73 -0
  252. package/dist/useFetchSurvey.d.ts.map +1 -0
  253. package/dist/useFetchSurvey.js +202 -0
  254. package/dist/useFetchSurvey.js.map +1 -0
  255. package/dist/useSubmitResponse.d.ts +40 -0
  256. package/dist/useSubmitResponse.d.ts.map +1 -0
  257. package/dist/useSubmitResponse.js +146 -0
  258. package/dist/useSubmitResponse.js.map +1 -0
  259. package/package.json +24 -0
  260. package/src/analytics/analyticsTracker.ts +48 -0
  261. package/src/analytics/types.ts +80 -0
  262. package/src/cli/deploy.ts +205 -0
  263. package/src/cli/index.ts +33 -0
  264. package/src/fetchSurvey/internalTypes.ts +80 -0
  265. package/src/fetchSurvey/logger/fetchLogger.ts +34 -0
  266. package/src/fetchSurvey/logger/mapperLogger.ts +13 -0
  267. package/src/fetchSurvey/telemetry/fetchTelemetry.ts +26 -0
  268. package/src/fetchSurvey/types.ts +82 -0
  269. package/src/fetchSurvey/useFetchSurvey.ts +126 -0
  270. package/src/fetchSurvey/utils/constants.ts +11 -0
  271. package/src/fetchSurvey/utils/extractSurveyLanguages.ts +63 -0
  272. package/src/fetchSurvey/utils/index.ts +7 -0
  273. package/src/fetchSurvey/utils/mapSurveyPages.ts +35 -0
  274. package/src/fetchSurvey/utils/mappers/index.ts +2 -0
  275. package/src/fetchSurvey/utils/mappers/questionMapper.ts +213 -0
  276. package/src/fetchSurvey/utils/mappers/surveyMapper.ts +69 -0
  277. package/src/fetchSurvey/utils/url.ts +21 -0
  278. package/src/index.ts +6 -0
  279. package/src/logger/logger.ts +71 -0
  280. package/src/queryClient.ts +67 -0
  281. package/src/submitSurvey/logger/resolutionLogger.ts +13 -0
  282. package/src/submitSurvey/logger/submitLogger.ts +51 -0
  283. package/src/submitSurvey/telemetry/submitTelemetry.ts +33 -0
  284. package/src/submitSurvey/types.ts +51 -0
  285. package/src/submitSurvey/useSubmitResponse.ts +111 -0
  286. package/src/submitSurvey/utils/constants.ts +4 -0
  287. package/src/submitSurvey/utils/formatters.ts +33 -0
  288. package/src/submitSurvey/utils/index.ts +4 -0
  289. package/src/submitSurvey/utils/url.ts +17 -0
  290. package/src/submitSurvey/utils/validation.ts +48 -0
  291. package/src/surveyPagination/actions/index.ts +4 -0
  292. package/src/surveyPagination/actions/useOnBack.ts +37 -0
  293. package/src/surveyPagination/actions/useOnChange.ts +16 -0
  294. package/src/surveyPagination/actions/useOnNext.ts +99 -0
  295. package/src/surveyPagination/actions/useOnSubmit.ts +137 -0
  296. package/src/surveyPagination/dispatchers/index.ts +3 -0
  297. package/src/surveyPagination/dispatchers/useCheckBacktrackChanges.ts +35 -0
  298. package/src/surveyPagination/dispatchers/useTrackOptionalSkips.ts +21 -0
  299. package/src/surveyPagination/dispatchers/useTrackPageTime.ts +13 -0
  300. package/src/surveyPagination/effects/index.ts +2 -0
  301. package/src/surveyPagination/effects/useResetPageStartTime.ts +10 -0
  302. package/src/surveyPagination/effects/useTrackMaxVisitedPage.ts +12 -0
  303. package/src/surveyPagination/logger/navigationLogger.ts +25 -0
  304. package/src/surveyPagination/logger/validationLogger.ts +17 -0
  305. package/src/surveyPagination/telemetry/pageTelemetry.ts +22 -0
  306. package/src/surveyPagination/telemetry/sessionTelemetry.ts +55 -0
  307. package/src/surveyPagination/types.ts +42 -0
  308. package/src/surveyPagination/useSurveyPagination.ts +109 -0
  309. package/src/surveyPagination/utils/index.ts +2 -0
  310. package/src/surveyPagination/utils/scroll.ts +62 -0
  311. package/src/surveyPagination/utils/validation.ts +62 -0
  312. package/src/surveyProgress/useSurveyProgress.ts +42 -0
  313. package/src/surveyProgress/utils/index.ts +1 -0
  314. package/src/surveyProgress/utils/progress.ts +61 -0
  315. package/src/surveySDK/constants.ts +9 -0
  316. package/src/surveySDK/types.ts +22 -0
  317. package/src/surveySDK/useSurveySDK.ts +109 -0
  318. 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,4 @@
1
+ /**
2
+ * The API base URL for submitting survey responses.
3
+ */
4
+ export const SUBMIT_BASE_URL = 'https://custom-p0.feedbook.me/api/feedback/survey/responseV2';
@@ -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,4 @@
1
+ export * from './constants';
2
+ export * from './url';
3
+ export * from './formatters';
4
+ export * from './validation';
@@ -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,4 @@
1
+ export { useOnBack } from './useOnBack';
2
+ export { useOnChange } from './useOnChange';
3
+ export { useOnNext } from './useOnNext';
4
+ export { useOnSubmit } from './useOnSubmit';
@@ -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
+ }