@smileid/usesmileid 12.0.0 → 12.0.2

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 (365) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +1 -1
  3. package/dist/camera/camera_defaults.d.ts +2 -0
  4. package/dist/camera/camera_defaults.d.ts.map +1 -1
  5. package/dist/camera/camera_defaults.js +2 -0
  6. package/dist/camera/camera_defaults.js.map +1 -1
  7. package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.d.ts +11 -0
  8. package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.d.ts.map +1 -0
  9. package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.js +17 -0
  10. package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.js.map +1 -0
  11. package/dist/core/exception/capture_validation_exceptions.d.ts +1 -0
  12. package/dist/core/exception/capture_validation_exceptions.d.ts.map +1 -1
  13. package/dist/core/exception/capture_validation_exceptions.js +1 -0
  14. package/dist/core/exception/capture_validation_exceptions.js.map +1 -1
  15. package/dist/core/exception/flow_exceptions.d.ts +4 -2
  16. package/dist/core/exception/flow_exceptions.d.ts.map +1 -1
  17. package/dist/core/exception/flow_exceptions.js +3 -2
  18. package/dist/core/exception/flow_exceptions.js.map +1 -1
  19. package/dist/core/exception/index.d.ts +1 -0
  20. package/dist/core/exception/index.d.ts.map +1 -1
  21. package/dist/core/exception/index.js +1 -0
  22. package/dist/core/exception/index.js.map +1 -1
  23. package/dist/core/exception/missing_job_type_exception.d.ts +1 -3
  24. package/dist/core/exception/missing_job_type_exception.d.ts.map +1 -1
  25. package/dist/core/exception/missing_job_type_exception.js +2 -4
  26. package/dist/core/exception/missing_job_type_exception.js.map +1 -1
  27. package/dist/core/exception/use_smile_id_error_code.d.ts +1 -0
  28. package/dist/core/exception/use_smile_id_error_code.d.ts.map +1 -1
  29. package/dist/core/exception/use_smile_id_error_code.js +1 -0
  30. package/dist/core/exception/use_smile_id_error_code.js.map +1 -1
  31. package/dist/core/models/config.d.ts +19 -0
  32. package/dist/core/models/config.d.ts.map +1 -1
  33. package/dist/core/models/document_type.d.ts +1 -1
  34. package/dist/core/models/document_type.d.ts.map +1 -1
  35. package/dist/core/models/document_type.js +2 -2
  36. package/dist/core/models/document_type.js.map +1 -1
  37. package/dist/core/models/global_privacy_control.d.ts +36 -0
  38. package/dist/core/models/global_privacy_control.d.ts.map +1 -0
  39. package/dist/core/models/global_privacy_control.js +39 -0
  40. package/dist/core/models/global_privacy_control.js.map +1 -0
  41. package/dist/core/models/network_config.d.ts +2 -2
  42. package/dist/core/models/network_config.js +2 -2
  43. package/dist/data/api/interceptors/smile_auth_interceptor.d.ts.map +1 -1
  44. package/dist/data/api/interceptors/smile_auth_interceptor.js +3 -17
  45. package/dist/data/api/interceptors/smile_auth_interceptor.js.map +1 -1
  46. package/dist/data/api/smile_id_api.d.ts +5 -1
  47. package/dist/data/api/smile_id_api.d.ts.map +1 -1
  48. package/dist/data/api/smile_id_api.js +30 -27
  49. package/dist/data/api/smile_id_api.js.map +1 -1
  50. package/dist/data/dsl/builder/retry_config_builder.d.ts +4 -4
  51. package/dist/data/dsl/builder/retry_config_builder.d.ts.map +1 -1
  52. package/dist/data/dsl/builder/retry_config_builder.js +6 -6
  53. package/dist/data/dsl/builder/retry_config_builder.js.map +1 -1
  54. package/dist/data/model/job_request.d.ts +28 -12
  55. package/dist/data/model/job_request.d.ts.map +1 -1
  56. package/dist/data/model/token_payload.d.ts +78 -0
  57. package/dist/data/model/token_payload.d.ts.map +1 -0
  58. package/dist/data/model/token_payload.js +132 -0
  59. package/dist/data/model/token_payload.js.map +1 -0
  60. package/dist/data/model/user_details_payload.d.ts +39 -0
  61. package/dist/data/model/user_details_payload.d.ts.map +1 -0
  62. package/dist/data/model/user_details_payload.js +53 -0
  63. package/dist/data/model/user_details_payload.js.map +1 -0
  64. package/dist/data/smile_id_urls.d.ts +1 -1
  65. package/dist/data/smile_id_urls.js +1 -1
  66. package/dist/data/smile_id_urls.js.map +1 -1
  67. package/dist/data/util/retry_util.d.ts +1 -1
  68. package/dist/data/util/retry_util.d.ts.map +1 -1
  69. package/dist/data/util/retry_util.js +5 -0
  70. package/dist/data/util/retry_util.js.map +1 -1
  71. package/dist/data/util/use_smile_id_token_decoder.d.ts +15 -3
  72. package/dist/data/util/use_smile_id_token_decoder.d.ts.map +1 -1
  73. package/dist/data/util/use_smile_id_token_decoder.js +20 -8
  74. package/dist/data/util/use_smile_id_token_decoder.js.map +1 -1
  75. package/dist/index.d.ts +2 -2
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +2 -2
  78. package/dist/index.js.map +1 -1
  79. package/dist/l10n/strings_en.d.ts +4 -1
  80. package/dist/l10n/strings_en.d.ts.map +1 -1
  81. package/dist/l10n/strings_en.js +4 -1
  82. package/dist/l10n/strings_en.js.map +1 -1
  83. package/dist/l10n/use_smile_id_localizations.d.ts +10 -0
  84. package/dist/l10n/use_smile_id_localizations.d.ts.map +1 -1
  85. package/dist/l10n/use_smile_id_localizations.js +59 -3
  86. package/dist/l10n/use_smile_id_localizations.js.map +1 -1
  87. package/dist/metadata/builder_configuration.d.ts +5 -0
  88. package/dist/metadata/builder_configuration.d.ts.map +1 -1
  89. package/dist/metadata/builder_configuration.js +1 -0
  90. package/dist/metadata/builder_configuration.js.map +1 -1
  91. package/dist/metadata/metadata_configuration_mappers.d.ts +2 -3
  92. package/dist/metadata/metadata_configuration_mappers.d.ts.map +1 -1
  93. package/dist/metadata/metadata_configuration_mappers.js +13 -6
  94. package/dist/metadata/metadata_configuration_mappers.js.map +1 -1
  95. package/dist/metadata/use_smile_id_metadata_factory.d.ts.map +1 -1
  96. package/dist/metadata/use_smile_id_metadata_factory.js +14 -5
  97. package/dist/metadata/use_smile_id_metadata_factory.js.map +1 -1
  98. package/dist/presentation/components/use_smile_id_button.d.ts.map +1 -1
  99. package/dist/presentation/components/use_smile_id_button.js +8 -2
  100. package/dist/presentation/components/use_smile_id_button.js.map +1 -1
  101. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.d.ts +5 -2
  102. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.d.ts.map +1 -1
  103. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.js +8 -3
  104. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.js.map +1 -1
  105. package/dist/presentation/components/use_smile_id_instructions_hero.d.ts.map +1 -1
  106. package/dist/presentation/components/use_smile_id_instructions_hero.js +8 -3
  107. package/dist/presentation/components/use_smile_id_instructions_hero.js.map +1 -1
  108. package/dist/presentation/flow/dsl/builder/config_builder.d.ts +16 -0
  109. package/dist/presentation/flow/dsl/builder/config_builder.d.ts.map +1 -1
  110. package/dist/presentation/flow/dsl/builder/config_builder.js +18 -0
  111. package/dist/presentation/flow/dsl/builder/config_builder.js.map +1 -1
  112. package/dist/presentation/flow/dsl/builder/screens_builder.d.ts +6 -12
  113. package/dist/presentation/flow/dsl/builder/screens_builder.d.ts.map +1 -1
  114. package/dist/presentation/flow/dsl/builder/screens_builder.js +7 -12
  115. package/dist/presentation/flow/dsl/builder/screens_builder.js.map +1 -1
  116. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.d.ts.map +1 -1
  117. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.js +23 -1
  118. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.js.map +1 -1
  119. package/dist/presentation/flow/flow_navigation_manager.d.ts +22 -3
  120. package/dist/presentation/flow/flow_navigation_manager.d.ts.map +1 -1
  121. package/dist/presentation/flow/flow_navigation_manager.js +84 -46
  122. package/dist/presentation/flow/flow_navigation_manager.js.map +1 -1
  123. package/dist/presentation/flow/model/instructions_defaults.d.ts.map +1 -1
  124. package/dist/presentation/flow/model/instructions_defaults.js +1 -1
  125. package/dist/presentation/flow/model/instructions_defaults.js.map +1 -1
  126. package/dist/presentation/flow/screen/orchestrated_capture_screen.d.ts.map +1 -1
  127. package/dist/presentation/flow/screen/orchestrated_capture_screen.js +13 -3
  128. package/dist/presentation/flow/screen/orchestrated_capture_screen.js.map +1 -1
  129. package/dist/presentation/flow/screen/orchestrated_consent_screen.d.ts.map +1 -1
  130. package/dist/presentation/flow/screen/orchestrated_consent_screen.js +3 -1
  131. package/dist/presentation/flow/screen/orchestrated_consent_screen.js.map +1 -1
  132. package/dist/presentation/flow/screen/orchestrated_preview_screen.d.ts.map +1 -1
  133. package/dist/presentation/flow/screen/orchestrated_preview_screen.js +0 -8
  134. package/dist/presentation/flow/screen/orchestrated_preview_screen.js.map +1 -1
  135. package/dist/presentation/flow/screen/orchestrated_processing_screen.d.ts.map +1 -1
  136. package/dist/presentation/flow/screen/orchestrated_processing_screen.js +25 -5
  137. package/dist/presentation/flow/screen/orchestrated_processing_screen.js.map +1 -1
  138. package/dist/presentation/flow/use_smile_id_flow.d.ts.map +1 -1
  139. package/dist/presentation/flow/use_smile_id_flow.js +45 -12
  140. package/dist/presentation/flow/use_smile_id_flow.js.map +1 -1
  141. package/dist/presentation/flow/validation/flow_validator.d.ts +16 -2
  142. package/dist/presentation/flow/validation/flow_validator.d.ts.map +1 -1
  143. package/dist/presentation/flow/validation/flow_validator.js +61 -47
  144. package/dist/presentation/flow/validation/flow_validator.js.map +1 -1
  145. package/dist/presentation/flow/validation/job_type_validator.d.ts +7 -0
  146. package/dist/presentation/flow/validation/job_type_validator.d.ts.map +1 -1
  147. package/dist/presentation/flow/validation/job_type_validator.js +52 -27
  148. package/dist/presentation/flow/validation/job_type_validator.js.map +1 -1
  149. package/dist/presentation/flow/validation/user_details_validator.d.ts +9 -0
  150. package/dist/presentation/flow/validation/user_details_validator.d.ts.map +1 -0
  151. package/dist/presentation/flow/validation/user_details_validator.js +40 -0
  152. package/dist/presentation/flow/validation/user_details_validator.js.map +1 -0
  153. package/dist/presentation/screen/helpers/capture_screen_helpers.d.ts.map +1 -1
  154. package/dist/presentation/screen/helpers/capture_screen_helpers.js +1 -0
  155. package/dist/presentation/screen/helpers/capture_screen_helpers.js.map +1 -1
  156. package/dist/presentation/screen/helpers/capture_ui_state.d.ts +6 -6
  157. package/dist/presentation/screen/helpers/capture_ui_state.d.ts.map +1 -1
  158. package/dist/presentation/screen/helpers/capture_ui_state.js +19 -19
  159. package/dist/presentation/screen/helpers/capture_ui_state.js.map +1 -1
  160. package/dist/presentation/screen/helpers/ess_turn_haptics.d.ts +2 -2
  161. package/dist/presentation/screen/helpers/ess_turn_haptics.d.ts.map +1 -1
  162. package/dist/presentation/screen/helpers/ess_turn_haptics.js +6 -6
  163. package/dist/presentation/screen/helpers/ess_turn_haptics.js.map +1 -1
  164. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.d.ts +5 -5
  165. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.d.ts.map +1 -1
  166. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.js +11 -11
  167. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.js.map +1 -1
  168. package/dist/presentation/screen/helpers/use_capture_orientation_lock.d.ts +13 -3
  169. package/dist/presentation/screen/helpers/use_capture_orientation_lock.d.ts.map +1 -1
  170. package/dist/presentation/screen/helpers/use_capture_orientation_lock.js +48 -6
  171. package/dist/presentation/screen/helpers/use_capture_orientation_lock.js.map +1 -1
  172. package/dist/presentation/screen/use_smile_id_capture_screen.d.ts +4 -2
  173. package/dist/presentation/screen/use_smile_id_capture_screen.d.ts.map +1 -1
  174. package/dist/presentation/screen/use_smile_id_capture_screen.js +90 -23
  175. package/dist/presentation/screen/use_smile_id_capture_screen.js.map +1 -1
  176. package/dist/presentation/screen/use_smile_id_consent_screen.d.ts +7 -0
  177. package/dist/presentation/screen/use_smile_id_consent_screen.d.ts.map +1 -1
  178. package/dist/presentation/screen/use_smile_id_consent_screen.js +6 -5
  179. package/dist/presentation/screen/use_smile_id_consent_screen.js.map +1 -1
  180. package/dist/presentation/screen/use_smile_id_document_back_instructions.d.ts.map +1 -1
  181. package/dist/presentation/screen/use_smile_id_document_back_instructions.js +5 -13
  182. package/dist/presentation/screen/use_smile_id_document_back_instructions.js.map +1 -1
  183. package/dist/presentation/screen/use_smile_id_document_preview_screen.js +1 -1
  184. package/dist/presentation/screen/use_smile_id_document_preview_screen.js.map +1 -1
  185. package/dist/presentation/screen/use_smile_id_preview_screen.d.ts +1 -21
  186. package/dist/presentation/screen/use_smile_id_preview_screen.d.ts.map +1 -1
  187. package/dist/presentation/screen/use_smile_id_preview_screen.js +3 -14
  188. package/dist/presentation/screen/use_smile_id_preview_screen.js.map +1 -1
  189. package/dist/presentation/screen/use_smile_id_processing_screen.js +1 -1
  190. package/dist/presentation/screen/use_smile_id_processing_screen.js.map +1 -1
  191. package/dist/presentation/utils/locale_utils.d.ts +10 -4
  192. package/dist/presentation/utils/locale_utils.d.ts.map +1 -1
  193. package/dist/presentation/utils/locale_utils.js +13 -5
  194. package/dist/presentation/utils/locale_utils.js.map +1 -1
  195. package/dist/testing/fake_face_analyzer.d.ts +43 -0
  196. package/dist/testing/fake_face_analyzer.d.ts.map +1 -0
  197. package/dist/testing/fake_face_analyzer.js +52 -0
  198. package/dist/testing/fake_face_analyzer.js.map +1 -0
  199. package/dist/testing/index.d.ts +5 -0
  200. package/dist/testing/index.d.ts.map +1 -0
  201. package/dist/testing/index.js +7 -0
  202. package/dist/testing/index.js.map +1 -0
  203. package/dist/testing/scenario_expectations.d.ts +28 -0
  204. package/dist/testing/scenario_expectations.d.ts.map +1 -0
  205. package/dist/testing/scenario_expectations.js +65 -0
  206. package/dist/testing/scenario_expectations.js.map +1 -0
  207. package/dist/testing/scenario_loader.d.ts +11 -0
  208. package/dist/testing/scenario_loader.d.ts.map +1 -0
  209. package/dist/testing/scenario_loader.js +64 -0
  210. package/dist/testing/scenario_loader.js.map +1 -0
  211. package/dist/testing/scripted_scan_results.d.ts +17 -0
  212. package/dist/testing/scripted_scan_results.d.ts.map +1 -0
  213. package/dist/testing/scripted_scan_results.js +52 -0
  214. package/dist/testing/scripted_scan_results.js.map +1 -0
  215. package/package.json +11 -4
  216. package/src/__tests__/dsl.test.ts +51 -1
  217. package/src/__tests__/react_native_mock.tsx +22 -0
  218. package/src/__tests__/setup_react_native.ts +17 -2
  219. package/src/__tests__/snapshots/__snapshots__/screens_structural.test.tsx.snap +5267 -0
  220. package/src/__tests__/snapshots/screens_structural.test.tsx +230 -0
  221. package/src/camera/__tests__/camera_permissions.test.ts +72 -0
  222. package/src/camera/__tests__/camera_system_focus.test.ts +173 -0
  223. package/src/camera/__tests__/use_smile_id_camera_preview.test.tsx +461 -0
  224. package/src/camera/__tests__/use_smile_id_camera_system.test.ts +103 -0
  225. package/src/camera/__tests__/use_smile_id_frame_stream_hook.test.tsx +229 -0
  226. package/src/camera/camera_defaults.ts +3 -0
  227. package/src/core/exception/__tests__/builder_validation_exceptions.test.ts +81 -0
  228. package/src/core/exception/agent_mode_with_enhanced_liveness_exception.ts +20 -0
  229. package/src/core/exception/capture_validation_exceptions.ts +1 -0
  230. package/src/core/exception/flow_exceptions.test.ts +10 -0
  231. package/src/core/exception/flow_exceptions.ts +3 -2
  232. package/src/core/exception/index.ts +1 -0
  233. package/src/core/exception/missing_job_type_exception.ts +2 -4
  234. package/src/core/exception/use_smile_id_error_code.ts +1 -0
  235. package/src/core/models/__tests__/document_type.test.ts +2 -2
  236. package/src/core/models/__tests__/flow_models.test.ts +26 -0
  237. package/src/core/models/config.ts +22 -0
  238. package/src/core/models/document_type.ts +2 -2
  239. package/src/core/models/global_privacy_control.ts +45 -0
  240. package/src/core/models/network_config.ts +2 -2
  241. package/src/data/api/__tests__/smile_id_api.test.ts +275 -1
  242. package/src/data/api/interceptors/__tests__/credential_header_redaction.test.ts +144 -0
  243. package/src/data/api/interceptors/__tests__/gzip_interceptor.test.ts +83 -0
  244. package/src/data/api/interceptors/smile_auth_interceptor.ts +3 -18
  245. package/src/data/api/smile_id_api.ts +36 -49
  246. package/src/data/compression/__tests__/payload_compressor_real_jpeg.test.ts +6 -2
  247. package/src/data/dsl/__tests__/use_smile_id_network_builder.test.ts +157 -0
  248. package/src/data/dsl/builder/__tests__/config_builders.test.ts +62 -0
  249. package/src/data/dsl/builder/retry_config_builder.ts +6 -6
  250. package/src/data/factory/__tests__/retry_gzip_mac_composition.test.ts +163 -0
  251. package/src/data/factory/__tests__/signed_job_submission_headers.test.ts +1 -1
  252. package/src/data/model/__tests__/token_payload.test.ts +224 -0
  253. package/src/data/model/__tests__/user_details_payload.test.ts +100 -0
  254. package/src/data/model/job_request.ts +27 -12
  255. package/src/data/model/token_payload.ts +182 -0
  256. package/src/data/model/user_details_payload.ts +84 -0
  257. package/src/data/repository/__tests__/network_retries.test.ts +1 -1
  258. package/src/data/repository/__tests__/repository_dispatch.test.ts +366 -0
  259. package/src/data/repository/__tests__/use_smile_id_repository.test.ts +1 -1
  260. package/src/data/security/__tests__/request_canonicalizer.test.ts +132 -0
  261. package/src/data/security/__tests__/signing_crypto.test.ts +203 -0
  262. package/src/data/smile_id_urls.ts +1 -1
  263. package/src/data/util/__tests__/retry_util.test.ts +25 -0
  264. package/src/data/util/__tests__/use_smile_id_token_decoder.test.ts +179 -0
  265. package/src/data/util/retry_util.ts +9 -1
  266. package/src/data/util/use_smile_id_token_decoder.ts +29 -8
  267. package/src/index.ts +6 -4
  268. package/src/l10n/__tests__/use_smile_id_localizations.test.ts +122 -5
  269. package/src/l10n/__tests__/use_smile_id_localizations_provider.test.tsx +112 -0
  270. package/src/l10n/__tests__/use_smile_id_localizations_surface.test.ts +231 -0
  271. package/src/l10n/strings_en.ts +5 -1
  272. package/src/l10n/use_smile_id_localizations.ts +80 -3
  273. package/src/metadata/__tests__/device_orientation_sampling.test.ts +165 -0
  274. package/src/metadata/__tests__/geolocation.test.ts +150 -0
  275. package/src/metadata/__tests__/metadata_configuration_mappers.test.ts +39 -0
  276. package/src/metadata/__tests__/metadata_configuration_objects.test.ts +2 -1
  277. package/src/metadata/__tests__/metadata_device_context.test.ts +3 -3
  278. package/src/metadata/__tests__/metadata_device_os_android.test.ts +18 -0
  279. package/src/metadata/__tests__/metadata_golden_fixture.json +1 -1
  280. package/src/metadata/__tests__/metadata_payload_golden.test.ts +4 -4
  281. package/src/metadata/__tests__/optional_native_modules.test.ts +234 -0
  282. package/src/metadata/__tests__/use_smile_id_metadata.test.ts +1 -1
  283. package/src/metadata/__tests__/use_smile_id_metadata_factory.test.ts +615 -0
  284. package/src/metadata/builder_configuration.ts +6 -0
  285. package/src/metadata/metadata_configuration_mappers.ts +21 -7
  286. package/src/metadata/use_smile_id_metadata_factory.ts +17 -6
  287. package/src/presentation/assets/si_document_green_book_hero_animation.json +1 -4668
  288. package/src/presentation/assets/si_document_hero_animation.json +1 -4799
  289. package/src/presentation/assets/si_document_hero_back_animation.json +1 -2039
  290. package/src/presentation/assets/si_document_passport_hero_animation.json +1 -14491
  291. package/src/presentation/assets/si_ess_all_directions_hero_animation.json +1 -0
  292. package/src/presentation/assets/si_ess_animation_all_directions.json +1 -6589
  293. package/src/presentation/assets/si_selfie_hero_animation.json +1 -1439
  294. package/src/presentation/assets/si_smile_to_capture_animation.json +1 -1439
  295. package/src/presentation/components/__tests__/use_smile_id_content_card.test.tsx +112 -0
  296. package/src/presentation/components/__tests__/use_smile_id_enhanced_smart_selfie_clip.test.tsx +9 -4
  297. package/src/presentation/components/__tests__/use_smile_id_face_oval_image.test.tsx +190 -0
  298. package/src/presentation/components/__tests__/use_smile_id_instructions_hero.test.tsx +44 -0
  299. package/src/presentation/components/__tests__/use_smile_id_learn_more_content.test.tsx +159 -0
  300. package/src/presentation/components/__tests__/use_smile_id_processing_center_indicator.test.tsx +88 -0
  301. package/src/presentation/components/use_smile_id_button.tsx +7 -2
  302. package/src/presentation/components/use_smile_id_enhanced_smart_selfie_clip.tsx +9 -3
  303. package/src/presentation/components/use_smile_id_instructions_hero.tsx +10 -0
  304. package/src/presentation/flow/__tests__/document_flow_navigation.test.ts +3 -3
  305. package/src/presentation/flow/__tests__/flow_navigation_manager.test.ts +372 -1
  306. package/src/presentation/flow/__tests__/use_smile_id_flow.test.tsx +651 -0
  307. package/src/presentation/flow/dsl/__tests__/use_smile_id_builder_component.test.tsx +120 -0
  308. package/src/presentation/flow/dsl/builder/__tests__/config_builder.test.ts +25 -0
  309. package/src/presentation/flow/dsl/builder/config_builder.ts +21 -0
  310. package/src/presentation/flow/dsl/builder/screens_builder.ts +7 -12
  311. package/src/presentation/flow/dsl/use_smile_id_flow_builder.ts +27 -1
  312. package/src/presentation/flow/flow_navigation_manager.ts +108 -93
  313. package/src/presentation/flow/graph/__tests__/screen_renderer.test.tsx +102 -0
  314. package/src/presentation/flow/model/instructions_defaults.ts +1 -1
  315. package/src/presentation/flow/screen/__tests__/orchestrated_capture_screen.test.tsx +836 -0
  316. package/src/presentation/flow/screen/__tests__/orchestrated_consent_screen.test.tsx +165 -0
  317. package/src/presentation/flow/screen/__tests__/orchestrated_instructions_screen.test.tsx +163 -0
  318. package/src/presentation/flow/screen/__tests__/orchestrated_preview_screen.test.tsx +224 -0
  319. package/src/presentation/flow/screen/__tests__/orchestrated_processing_screen.test.tsx +338 -0
  320. package/src/presentation/flow/screen/orchestrated_capture_screen.tsx +18 -3
  321. package/src/presentation/flow/screen/orchestrated_consent_screen.tsx +5 -0
  322. package/src/presentation/flow/screen/orchestrated_preview_screen.tsx +0 -12
  323. package/src/presentation/flow/screen/orchestrated_processing_screen.tsx +42 -5
  324. package/src/presentation/flow/use_smile_id_flow.tsx +63 -12
  325. package/src/presentation/flow/validation/__tests__/flow_validator.test.ts +219 -1
  326. package/src/presentation/flow/validation/__tests__/job_type_validator.test.ts +200 -0
  327. package/src/presentation/flow/validation/flow_validator.ts +85 -57
  328. package/src/presentation/flow/validation/job_type_validator.ts +73 -39
  329. package/src/presentation/flow/validation/user_details_validator.ts +53 -0
  330. package/src/presentation/screen/__tests__/capture_ui_state.test.ts +66 -47
  331. package/src/presentation/screen/__tests__/ess_turn_haptics.test.ts +15 -11
  332. package/src/presentation/screen/__tests__/feedback_copy_table.test.ts +145 -0
  333. package/src/presentation/screen/__tests__/scan_state_to_overlay_state.test.ts +47 -27
  334. package/src/presentation/screen/__tests__/use_smile_id_capture_screen.test.tsx +524 -14
  335. package/src/presentation/screen/__tests__/use_smile_id_document_back_instructions.test.tsx +4 -2
  336. package/src/presentation/screen/__tests__/use_smile_id_permission_screen.test.tsx +68 -0
  337. package/src/presentation/screen/__tests__/use_smile_id_preview_screen.test.tsx +10 -40
  338. package/src/presentation/screen/helpers/__tests__/use_capture_orientation_lock.test.tsx +212 -0
  339. package/src/presentation/screen/helpers/capture_screen_helpers.ts +1 -0
  340. package/src/presentation/screen/helpers/capture_ui_state.ts +27 -27
  341. package/src/presentation/screen/helpers/ess_turn_haptics.ts +9 -9
  342. package/src/presentation/screen/helpers/scan_state_to_overlay_state.ts +13 -13
  343. package/src/presentation/screen/helpers/use_capture_orientation_lock.ts +69 -7
  344. package/src/presentation/screen/use_smile_id_capture_screen.tsx +107 -28
  345. package/src/presentation/screen/use_smile_id_consent_screen.tsx +16 -5
  346. package/src/presentation/screen/use_smile_id_document_back_instructions.tsx +14 -23
  347. package/src/presentation/screen/use_smile_id_document_preview_screen.tsx +1 -1
  348. package/src/presentation/screen/use_smile_id_preview_screen.tsx +13 -45
  349. package/src/presentation/screen/use_smile_id_processing_screen.tsx +1 -1
  350. package/src/presentation/theme/__tests__/use_use_smile_id_fonts.test.tsx +166 -0
  351. package/src/presentation/utils/__tests__/locale_utils.test.ts +46 -5
  352. package/src/presentation/utils/locale_utils.ts +13 -4
  353. package/src/testing/__tests__/fake_face_analyzer.test.ts +42 -0
  354. package/src/testing/__tests__/scenario_expectations.test.ts +110 -0
  355. package/src/testing/__tests__/scenario_loader.test.ts +64 -0
  356. package/src/testing/fake_face_analyzer.ts +82 -0
  357. package/src/testing/index.ts +15 -0
  358. package/src/testing/scenario_expectations.ts +87 -0
  359. package/src/testing/scenario_loader.ts +83 -0
  360. package/src/testing/scripted_scan_results.ts +66 -0
  361. package/dist/presentation/components/use_smile_id_face_silhouette_overlay.d.ts +0 -15
  362. package/dist/presentation/components/use_smile_id_face_silhouette_overlay.d.ts.map +0 -1
  363. package/dist/presentation/components/use_smile_id_face_silhouette_overlay.js +0 -19
  364. package/dist/presentation/components/use_smile_id_face_silhouette_overlay.js.map +0 -1
  365. package/src/presentation/components/use_smile_id_face_silhouette_overlay.tsx +0 -27
@@ -0,0 +1,145 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import {
4
+ documentFeedbackKeyFor,
5
+ resolveFeedbackCopy,
6
+ selfieFeedbackKeyFor,
7
+ } from "../helpers/capture_screen_helpers";
8
+ import { UseSmileIDOverlayState } from "../../state/use_smile_id_overlay_state";
9
+ import { UseSmileIDLocalizations } from "../../../l10n/use_smile_id_localizations";
10
+ import { enStrings, type SiKey } from "../../../l10n/strings_en";
11
+
12
+ /**
13
+ * The feedback-key → copy table is the single seam between the capture
14
+ * overlay's stable `si_*` keys and the partner's localization instance.
15
+ * Every entry must resolve to the canonical English default and must
16
+ * honour a partner override, otherwise a translated build silently
17
+ * shows English (or the wrong string) mid-capture.
18
+ */
19
+
20
+ const loc = new UseSmileIDLocalizations({});
21
+
22
+ // Every key the capture surface can emit as feedback.
23
+ const FEEDBACK_KEYS: readonly SiKey[] = [
24
+ "si_capture_initial_instruction",
25
+ "si_start_capture_instruction",
26
+ "si_capture_too_close",
27
+ "si_capture_too_far",
28
+ "si_capture_center_face",
29
+ "si_capture_multiple_faces",
30
+ "si_capture_low_light",
31
+ "si_capture_bright_light",
32
+ "si_capture_rotate_device",
33
+ "si_capture_smile",
34
+ "si_capture_move_left",
35
+ "si_capture_move_right",
36
+ "si_capture_move_higher",
37
+ "si_capture_move_lower",
38
+ "si_capture_ready",
39
+ "si_capture_hold_steady",
40
+ "si_capture_timeout",
41
+ "si_capturing",
42
+ "si_selfie_capture_complete",
43
+ "si_selfie_capture_timeout",
44
+ "si_selfie_capture_unsatisfied",
45
+ "si_ess_capture_initial_instruction",
46
+ "si_ess_hold_still",
47
+ "si_ess_look_left",
48
+ "si_ess_look_right",
49
+ "si_ess_look_up",
50
+ "si_ess_look_at_camera",
51
+ "si_document_initial_instruction",
52
+ "si_document_ready",
53
+ "si_document_capturing",
54
+ "si_document_capture_complete",
55
+ "si_document_capture_unsatisfied",
56
+ "si_document_capture_timeout",
57
+ "si_document_too_close",
58
+ "si_document_too_far",
59
+ "si_document_center",
60
+ "si_document_hold_still",
61
+ "si_document_gallery_image_too_small",
62
+ "si_document_gallery_image_failed",
63
+ ];
64
+
65
+ describe("resolveFeedbackCopy", () => {
66
+ for (const key of FEEDBACK_KEYS) {
67
+ it(`resolves ${key} to its canonical English default`, () => {
68
+ expect(resolveFeedbackCopy(key, loc)).toBe(enStrings[key]);
69
+ });
70
+ }
71
+
72
+ it("honours a partner override for every feedback key", () => {
73
+ const overrides = Object.fromEntries(
74
+ FEEDBACK_KEYS.map((key) => [key, `translated:${key}`]),
75
+ );
76
+ const translated = new UseSmileIDLocalizations(overrides);
77
+
78
+ for (const key of FEEDBACK_KEYS) {
79
+ expect(resolveFeedbackCopy(key, translated)).toBe(`translated:${key}`);
80
+ }
81
+ });
82
+
83
+ it("falls back to the initial instruction for a key outside the table", () => {
84
+ // `si_consent_title` is a real key that the capture surface never emits.
85
+ expect(resolveFeedbackCopy("si_consent_title" as SiKey, loc)).toBe(
86
+ loc.siCaptureInitialInstruction,
87
+ );
88
+ });
89
+ });
90
+
91
+ describe("documentFeedbackKeyFor", () => {
92
+ it("maps each document guidance state to its stable key", () => {
93
+ expect(
94
+ documentFeedbackKeyFor(UseSmileIDOverlayState.DOCUMENT_TOO_CLOSE),
95
+ ).toBe("si_document_too_close");
96
+ expect(
97
+ documentFeedbackKeyFor(UseSmileIDOverlayState.DOCUMENT_TOO_FAR),
98
+ ).toBe("si_document_too_far");
99
+ expect(
100
+ documentFeedbackKeyFor(UseSmileIDOverlayState.DOCUMENT_NOT_CENTERED),
101
+ ).toBe("si_document_center");
102
+ expect(
103
+ documentFeedbackKeyFor(UseSmileIDOverlayState.DOCUMENT_HOLD_STILL),
104
+ ).toBe("si_document_hold_still");
105
+ });
106
+
107
+ it("returns null for lifecycle states that carry no guidance", () => {
108
+ expect(
109
+ documentFeedbackKeyFor(UseSmileIDOverlayState.INSTRUCTION),
110
+ ).toBeNull();
111
+ expect(
112
+ documentFeedbackKeyFor(UseSmileIDOverlayState.DOCUMENT_READY),
113
+ ).toBeNull();
114
+ expect(documentFeedbackKeyFor(UseSmileIDOverlayState.CAPTURING)).toBeNull();
115
+ // A selfie-only guidance state must not leak into the document table.
116
+ expect(documentFeedbackKeyFor(UseSmileIDOverlayState.TOO_CLOSE)).toBeNull();
117
+ });
118
+
119
+ it("resolves every document key it emits through the copy table", () => {
120
+ const states = [
121
+ UseSmileIDOverlayState.DOCUMENT_TOO_CLOSE,
122
+ UseSmileIDOverlayState.DOCUMENT_TOO_FAR,
123
+ UseSmileIDOverlayState.DOCUMENT_NOT_CENTERED,
124
+ UseSmileIDOverlayState.DOCUMENT_HOLD_STILL,
125
+ ];
126
+ for (const state of states) {
127
+ const key = documentFeedbackKeyFor(state);
128
+ expect(key).not.toBeNull();
129
+ expect(resolveFeedbackCopy(key as SiKey, loc)).toBe(
130
+ enStrings[key as SiKey],
131
+ );
132
+ }
133
+ });
134
+ });
135
+
136
+ describe("selfieFeedbackKeyFor", () => {
137
+ it("returns null for the document-only states", () => {
138
+ expect(
139
+ selfieFeedbackKeyFor(UseSmileIDOverlayState.DOCUMENT_TOO_CLOSE),
140
+ ).toBeNull();
141
+ expect(
142
+ selfieFeedbackKeyFor(UseSmileIDOverlayState.DOCUMENT_HOLD_STILL),
143
+ ).toBeNull();
144
+ });
145
+ });
@@ -1,13 +1,13 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { ScanStateType } from "@smileid/usesmileid_bridge";
3
- import type { ScanState } from "@smileid/usesmileid_bridge";
2
+ import { UseSmileIDScanStateType } from "@smileid/usesmileid_bridge";
3
+ import type { UseSmileIDScanState } from "@smileid/usesmileid_bridge";
4
4
  import { mapScanStateToOverlayState } from "../helpers/scan_state_to_overlay_state";
5
5
  import { UseSmileIDOverlayState } from "../../state/use_smile_id_overlay_state";
6
6
  import { CaptureType } from "../../../core/models/ml_config";
7
7
 
8
8
  /**
9
9
  * Pure-logic tests for the helper that translates the analyzer's
10
- * `ScanState` machine into the SDK's visual overlay enum. These cover
10
+ * `UseSmileIDScanState` machine into the SDK's visual overlay enum. These cover
11
11
  * what the legacy screen tests pinned via the now-removed
12
12
  * `overlayState=` prop — the screen now derives overlay state from
13
13
  * `scanState` per frame, so testing the mapping in isolation gives the
@@ -15,14 +15,18 @@ import { CaptureType } from "../../../core/models/ml_config";
15
15
  */
16
16
  describe("mapScanStateToOverlayState", () => {
17
17
  it("maps the initial state to INSTRUCTION for selfie", () => {
18
- const state: ScanState = { type: ScanStateType.Initial };
18
+ const state: UseSmileIDScanState = {
19
+ type: UseSmileIDScanStateType.Initial,
20
+ };
19
21
  expect(mapScanStateToOverlayState(state, CaptureType.selfie)).toBe(
20
22
  UseSmileIDOverlayState.INSTRUCTION,
21
23
  );
22
24
  });
23
25
 
24
26
  it("maps the initial state to INSTRUCTION for document", () => {
25
- const state: ScanState = { type: ScanStateType.Initial };
27
+ const state: UseSmileIDScanState = {
28
+ type: UseSmileIDScanStateType.Initial,
29
+ };
26
30
  expect(mapScanStateToOverlayState(state, CaptureType.document)).toBe(
27
31
  UseSmileIDOverlayState.INSTRUCTION,
28
32
  );
@@ -32,7 +36,9 @@ describe("mapScanStateToOverlayState", () => {
32
36
  // READY drives the bottom-to-top fill animation on the face oval —
33
37
  // the analyzer signalling "satisfied" means the pipeline is about
34
38
  // to emit captured frames.
35
- const state: ScanState = { type: ScanStateType.Satisfied };
39
+ const state: UseSmileIDScanState = {
40
+ type: UseSmileIDScanStateType.Satisfied,
41
+ };
36
42
  expect(mapScanStateToOverlayState(state, CaptureType.selfie)).toBe(
37
43
  UseSmileIDOverlayState.READY,
38
44
  );
@@ -42,21 +48,27 @@ describe("mapScanStateToOverlayState", () => {
42
48
  // CAPTURING is the yellow-solid state — the analyzer has emitted
43
49
  // its captured artifacts and the orchestrator is about to call
44
50
  // flush().
45
- const state: ScanState = { type: ScanStateType.Finished };
51
+ const state: UseSmileIDScanState = {
52
+ type: UseSmileIDScanStateType.Finished,
53
+ };
46
54
  expect(mapScanStateToOverlayState(state, CaptureType.selfie)).toBe(
47
55
  UseSmileIDOverlayState.CAPTURING,
48
56
  );
49
57
  });
50
58
 
51
59
  it("maps the headTurn state to HEAD_TURN", () => {
52
- const state: ScanState = { type: ScanStateType.HeadTurn };
60
+ const state: UseSmileIDScanState = {
61
+ type: UseSmileIDScanStateType.HeadTurn,
62
+ };
53
63
  expect(mapScanStateToOverlayState(state, CaptureType.selfie)).toBe(
54
64
  UseSmileIDOverlayState.HEAD_TURN,
55
65
  );
56
66
  });
57
67
 
58
68
  it("maps timeout back to IDLE so the overlay returns to the gray pre-capture state", () => {
59
- const state: ScanState = { type: ScanStateType.Timeout };
69
+ const state: UseSmileIDScanState = {
70
+ type: UseSmileIDScanStateType.Timeout,
71
+ };
60
72
  expect(mapScanStateToOverlayState(state, CaptureType.selfie)).toBe(
61
73
  UseSmileIDOverlayState.IDLE,
62
74
  );
@@ -87,8 +99,8 @@ describe("mapScanStateToOverlayState", () => {
87
99
 
88
100
  for (const [feedbackKey, expected] of cases) {
89
101
  it(`maps found+${feedbackKey} to ${expected}`, () => {
90
- const state: ScanState = {
91
- type: ScanStateType.Found,
102
+ const state: UseSmileIDScanState = {
103
+ type: UseSmileIDScanStateType.Found,
92
104
  feedback: feedbackKey,
93
105
  };
94
106
  expect(mapScanStateToOverlayState(state, CaptureType.selfie)).toBe(
@@ -98,7 +110,9 @@ describe("mapScanStateToOverlayState", () => {
98
110
  }
99
111
 
100
112
  it("falls back to FACE_DETECTED when found has no feedback key", () => {
101
- const state: ScanState = { type: ScanStateType.Found };
113
+ const state: UseSmileIDScanState = {
114
+ type: UseSmileIDScanStateType.Found,
115
+ };
102
116
  expect(mapScanStateToOverlayState(state, CaptureType.selfie)).toBe(
103
117
  UseSmileIDOverlayState.FACE_DETECTED,
104
118
  );
@@ -109,8 +123,8 @@ describe("mapScanStateToOverlayState", () => {
109
123
  // si_capture_* key the JS side hasn't been updated for. The
110
124
  // overlay should stay alive (green-solid) rather than throwing
111
125
  // or rendering an empty state.
112
- const state: ScanState = {
113
- type: ScanStateType.Found,
126
+ const state: UseSmileIDScanState = {
127
+ type: UseSmileIDScanStateType.Found,
114
128
  feedback: "si_capture_future_feedback_key",
115
129
  };
116
130
  expect(mapScanStateToOverlayState(state, CaptureType.selfie)).toBe(
@@ -121,8 +135,8 @@ describe("mapScanStateToOverlayState", () => {
121
135
 
122
136
  describe("unsatisfied + reason (selfie)", () => {
123
137
  it("uses the reason key to drive the orange-solid overlay", () => {
124
- const state: ScanState = {
125
- type: ScanStateType.Unsatisfied,
138
+ const state: UseSmileIDScanState = {
139
+ type: UseSmileIDScanStateType.Unsatisfied,
126
140
  reason: "si_capture_too_close",
127
141
  };
128
142
  expect(mapScanStateToOverlayState(state, CaptureType.selfie)).toBe(
@@ -131,7 +145,9 @@ describe("mapScanStateToOverlayState", () => {
131
145
  });
132
146
 
133
147
  it("falls back to FACE_NOT_CENTERED on a missing reason key", () => {
134
- const state: ScanState = { type: ScanStateType.Unsatisfied };
148
+ const state: UseSmileIDScanState = {
149
+ type: UseSmileIDScanStateType.Unsatisfied,
150
+ };
135
151
  expect(mapScanStateToOverlayState(state, CaptureType.selfie)).toBe(
136
152
  UseSmileIDOverlayState.FACE_NOT_CENTERED,
137
153
  );
@@ -140,15 +156,17 @@ describe("mapScanStateToOverlayState", () => {
140
156
 
141
157
  describe("document capture mappings", () => {
142
158
  it("maps found+document key to DOCUMENT_READY by default", () => {
143
- const state: ScanState = { type: ScanStateType.Found };
159
+ const state: UseSmileIDScanState = {
160
+ type: UseSmileIDScanStateType.Found,
161
+ };
144
162
  expect(mapScanStateToOverlayState(state, CaptureType.document)).toBe(
145
163
  UseSmileIDOverlayState.DOCUMENT_READY,
146
164
  );
147
165
  });
148
166
 
149
167
  it("maps the si_document_too_close key to DOCUMENT_TOO_CLOSE", () => {
150
- const state: ScanState = {
151
- type: ScanStateType.Found,
168
+ const state: UseSmileIDScanState = {
169
+ type: UseSmileIDScanStateType.Found,
152
170
  feedback: "si_document_too_close",
153
171
  };
154
172
  expect(mapScanStateToOverlayState(state, CaptureType.document)).toBe(
@@ -161,8 +179,8 @@ describe("mapScanStateToOverlayState", () => {
161
179
  // si_document_* key or the shared si_capture_* one. Map both
162
180
  // to the document overlay enum so the bottom-feedback bubble
163
181
  // stays accurate either way.
164
- const state: ScanState = {
165
- type: ScanStateType.Found,
182
+ const state: UseSmileIDScanState = {
183
+ type: UseSmileIDScanStateType.Found,
166
184
  feedback: "si_capture_too_close",
167
185
  };
168
186
  expect(mapScanStateToOverlayState(state, CaptureType.document)).toBe(
@@ -171,15 +189,17 @@ describe("mapScanStateToOverlayState", () => {
171
189
  });
172
190
 
173
191
  it("maps unsatisfied+missing reason to DOCUMENT_NOT_CENTERED", () => {
174
- const state: ScanState = { type: ScanStateType.Unsatisfied };
192
+ const state: UseSmileIDScanState = {
193
+ type: UseSmileIDScanStateType.Unsatisfied,
194
+ };
175
195
  expect(mapScanStateToOverlayState(state, CaptureType.document)).toBe(
176
196
  UseSmileIDOverlayState.DOCUMENT_NOT_CENTERED,
177
197
  );
178
198
  });
179
199
 
180
200
  it("maps si_document_hold_still to DOCUMENT_HOLD_STILL", () => {
181
- const state: ScanState = {
182
- type: ScanStateType.Found,
201
+ const state: UseSmileIDScanState = {
202
+ type: UseSmileIDScanStateType.Found,
183
203
  feedback: "si_document_hold_still",
184
204
  };
185
205
  expect(mapScanStateToOverlayState(state, CaptureType.document)).toBe(
@@ -191,8 +211,8 @@ describe("mapScanStateToOverlayState", () => {
191
211
  // `si_document_center` is the key the native side actually emits
192
212
  // for an off-centre document (the former `si_document_not_centered`
193
213
  // was never emitted).
194
- const state: ScanState = {
195
- type: ScanStateType.Found,
214
+ const state: UseSmileIDScanState = {
215
+ type: UseSmileIDScanStateType.Found,
196
216
  feedback: "si_document_center",
197
217
  };
198
218
  expect(mapScanStateToOverlayState(state, CaptureType.document)).toBe(