@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,68 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import * as React from "react";
3
+ import { create as createRenderer, act } from "react-test-renderer";
4
+ import { UseSmileIDPermissionScreen } from "../use_smile_id_permission_screen";
5
+ import { UseSmileIDThemeProvider } from "../../theme/theme_context";
6
+ import { defaultDarkTheme, defaultLightTheme } from "../../theme/theme";
7
+
8
+ function render(element: React.ReactElement) {
9
+ let tree!: ReturnType<typeof createRenderer>;
10
+ act(() => {
11
+ tree = createRenderer(element);
12
+ });
13
+ return tree;
14
+ }
15
+
16
+ function rootStyle(
17
+ tree: ReturnType<typeof createRenderer>,
18
+ ): Record<string, unknown> {
19
+ const json = tree.toJSON() as { props: { style: Record<string, unknown> } };
20
+ return json.props.style;
21
+ }
22
+
23
+ describe("UseSmileIDPermissionScreen", () => {
24
+ it("shows a default camera rationale when the partner supplies none", () => {
25
+ const tree = render(
26
+ <UseSmileIDPermissionScreen theme={defaultLightTheme} />,
27
+ );
28
+
29
+ expect(JSON.stringify(tree.toJSON())).toContain(
30
+ "Camera permission required",
31
+ );
32
+ });
33
+
34
+ it("shows the partner's rationale when one is supplied", () => {
35
+ const tree = render(
36
+ <UseSmileIDPermissionScreen
37
+ theme={defaultLightTheme}
38
+ cameraRationale="Acme needs your camera to verify your ID"
39
+ />,
40
+ );
41
+
42
+ const text = JSON.stringify(tree.toJSON());
43
+ expect(text).toContain("Acme needs your camera to verify your ID");
44
+ expect(text).not.toContain("Camera permission required");
45
+ });
46
+
47
+ it("paints on the theme background from the theme prop", () => {
48
+ const tree = render(
49
+ <UseSmileIDPermissionScreen theme={defaultDarkTheme} />,
50
+ );
51
+
52
+ expect(rootStyle(tree).backgroundColor).toBe(
53
+ defaultDarkTheme.colors.background,
54
+ );
55
+ });
56
+
57
+ it("falls back to the theme from context when no theme prop is given", () => {
58
+ const tree = render(
59
+ <UseSmileIDThemeProvider value={defaultDarkTheme}>
60
+ <UseSmileIDPermissionScreen />
61
+ </UseSmileIDThemeProvider>,
62
+ );
63
+
64
+ expect(rootStyle(tree).backgroundColor).toBe(
65
+ defaultDarkTheme.colors.background,
66
+ );
67
+ });
68
+ });
@@ -5,7 +5,7 @@ import {
5
5
  act,
6
6
  type ReactTestInstance,
7
7
  } from "react-test-renderer";
8
- import { I18nManager, Pressable, StyleSheet, Text } from "react-native";
8
+ import { I18nManager, StyleSheet, Text } from "react-native";
9
9
  import { UseSmileIDPreviewScreen } from "../use_smile_id_preview_screen";
10
10
  import { defaultLightTheme } from "../../theme/theme";
11
11
 
@@ -14,7 +14,7 @@ import { defaultLightTheme } from "../../theme/theme";
14
14
  * - Image at the oval rect (not full-bleed)
15
15
  * - Title + confirmation buttons + optional attribution in card
16
16
  * - Accept / Retake gating from `resolvePreviewState`
17
- * - Slot contract (any slot replaces the entire row)
17
+ * - The confirm/retake pair is fixed (not customisable)
18
18
  */
19
19
 
20
20
  function render(element: React.ReactElement) {
@@ -164,46 +164,16 @@ describe("UseSmileIDPreviewScreen", () => {
164
164
  }
165
165
  });
166
166
 
167
- it("replaces the entire row when any button slot is supplied", () => {
168
- // Concrete scenario this test documents: the slot contract is
169
- // "all-or-nothing" — providing only continueButton hides the
170
- // default Retake. Partners must supply both slots to keep both
171
- // affordances.
172
- const onAccept = vi.fn();
173
- const onReject = vi.fn();
167
+ it("always renders the fixed confirmation-button pair (not customisable)", () => {
168
+ // Preview buttons are intentionally not customisable: the screen always
169
+ // renders the fixed confirm/retake pair. Re-adding a slot API is a product
170
+ // decision, not a bug fix.
174
171
  const { root } = render(
175
- <UseSmileIDPreviewScreen
176
- capturedSelfiePath={PATH}
177
- onAccept={onAccept}
178
- onReject={onReject}
179
- continueButton={({ onClick }) => (
180
- <Pressable testID="si_custom_continue" onPress={onClick}>
181
- <Text>Confirm</Text>
182
- </Pressable>
183
- )}
184
- cancelButton={({ onClick }) => (
185
- <Pressable testID="si_custom_cancel" onPress={onClick}>
186
- <Text>Retake</Text>
187
- </Pressable>
188
- )}
189
- />,
172
+ <UseSmileIDPreviewScreen capturedSelfiePath={PATH} />,
190
173
  );
191
-
192
- expect(findByTestID(root, "si_custom_continue")).not.toBeNull();
193
- expect(findByTestID(root, "si_custom_cancel")).not.toBeNull();
194
- // Default row must be gone — guards against a future refactor
195
- // that double-renders the row alongside the slots.
196
- expect(findByTestID(root, "si_preview_confirmation_buttons")).toBeNull();
197
-
198
- act(() => {
199
- (findByTestID(root, "si_custom_continue")!.props.onPress as () => void)();
200
- });
201
- expect(onAccept).toHaveBeenCalledTimes(1);
202
-
203
- act(() => {
204
- (findByTestID(root, "si_custom_cancel")!.props.onPress as () => void)();
205
- });
206
- expect(onReject).toHaveBeenCalledTimes(1);
174
+ expect(
175
+ findByTestID(root, "si_preview_confirmation_buttons"),
176
+ ).not.toBeNull();
207
177
  });
208
178
 
209
179
  it("renders the card title in the theme primary color", () => {
@@ -0,0 +1,212 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import { create as createRenderer, act } from "react-test-renderer";
3
+ import * as ScreenOrientation from "expo-screen-orientation";
4
+ import { UseSmileIDCrashReporting } from "@smileid/usesmileid_bridge";
5
+ import type { DocumentOrientation } from "../../../../core/models/document_type";
6
+ import {
7
+ useCaptureOrientationLock,
8
+ resetUnsupportedLockWarningsForTesting,
9
+ } from "../use_capture_orientation_lock";
10
+
11
+ /**
12
+ * Lifecycle tests for `useCaptureOrientationLock`:
13
+ * - mount asserts the screen's own orientation
14
+ * - unmount applies the configured exit lock (portrait-up by default)
15
+ * - a host build that cannot honour the lock is warned about (dev builds,
16
+ * once per target) and reported (every build)
17
+ *
18
+ * The `expo-screen-orientation` mock lives in `setup_react_native.ts`.
19
+ * `__DEV__` is bundler-injected and deliberately NOT defined suite-wide —
20
+ * each test sets exactly the build shape it pins.
21
+ */
22
+
23
+ const mockedLockAsync = vi.mocked(ScreenOrientation.lockAsync);
24
+ const mockedSupportsLock = vi.mocked(
25
+ ScreenOrientation.supportsOrientationLockAsync,
26
+ );
27
+
28
+ const globalWithDev = globalThis as { __DEV__?: boolean };
29
+
30
+ function LockHost(props: {
31
+ readonly orientation: DocumentOrientation;
32
+ readonly exitLock?: ScreenOrientation.OrientationLock;
33
+ }) {
34
+ useCaptureOrientationLock(props.orientation, {
35
+ ...(props.exitLock !== undefined ? { exitLock: props.exitLock } : {}),
36
+ });
37
+ return null;
38
+ }
39
+
40
+ async function flushPromises(): Promise<void> {
41
+ // A macrotask tick drains every pending microtask chain first, so this stays
42
+ // correct if the hook gains or loses `await`s.
43
+ await new Promise<void>((resolve) => setTimeout(resolve, 0));
44
+ }
45
+
46
+ async function mountHost(
47
+ props: Parameters<typeof LockHost>[0],
48
+ ): Promise<ReturnType<typeof createRenderer>> {
49
+ let tree!: ReturnType<typeof createRenderer>;
50
+ act(() => {
51
+ tree = createRenderer(<LockHost {...props} />);
52
+ });
53
+ await act(async () => {
54
+ await flushPromises();
55
+ });
56
+ return tree;
57
+ }
58
+
59
+ describe("useCaptureOrientationLock", () => {
60
+ let savedDev: boolean | undefined;
61
+
62
+ beforeEach(() => {
63
+ savedDev = globalWithDev.__DEV__;
64
+ delete globalWithDev.__DEV__;
65
+ resetUnsupportedLockWarningsForTesting();
66
+ mockedLockAsync.mockReset();
67
+ mockedLockAsync.mockResolvedValue(undefined);
68
+ mockedSupportsLock.mockReset();
69
+ mockedSupportsLock.mockResolvedValue(true);
70
+ });
71
+
72
+ afterEach(() => {
73
+ if (savedDev === undefined) {
74
+ delete globalWithDev.__DEV__;
75
+ } else {
76
+ globalWithDev.__DEV__ = savedDev;
77
+ }
78
+ vi.restoreAllMocks();
79
+ });
80
+
81
+ it("locks landscape on mount for a landscape document", async () => {
82
+ const tree = await mountHost({ orientation: "Landscape" });
83
+
84
+ expect(mockedLockAsync).toHaveBeenCalledTimes(1);
85
+ expect(mockedLockAsync).toHaveBeenCalledWith(
86
+ ScreenOrientation.OrientationLock.LANDSCAPE,
87
+ );
88
+
89
+ await act(async () => {
90
+ tree.unmount();
91
+ await flushPromises();
92
+ });
93
+ });
94
+
95
+ it("restores portrait-up on unmount when no exit lock is configured", async () => {
96
+ const tree = await mountHost({ orientation: "Landscape" });
97
+ mockedLockAsync.mockClear();
98
+
99
+ await act(async () => {
100
+ tree.unmount();
101
+ await flushPromises();
102
+ });
103
+
104
+ expect(mockedLockAsync).toHaveBeenCalledTimes(1);
105
+ expect(mockedLockAsync).toHaveBeenCalledWith(
106
+ ScreenOrientation.OrientationLock.PORTRAIT_UP,
107
+ );
108
+ });
109
+
110
+ it("applies the configured exit lock on unmount instead of portrait-up", async () => {
111
+ const tree = await mountHost({
112
+ orientation: "Landscape",
113
+ exitLock: ScreenOrientation.OrientationLock.DEFAULT,
114
+ });
115
+ mockedLockAsync.mockClear();
116
+
117
+ await act(async () => {
118
+ tree.unmount();
119
+ await flushPromises();
120
+ });
121
+
122
+ expect(mockedLockAsync).toHaveBeenCalledTimes(1);
123
+ expect(mockedLockAsync).toHaveBeenCalledWith(
124
+ ScreenOrientation.OrientationLock.DEFAULT,
125
+ );
126
+ expect(mockedLockAsync).not.toHaveBeenCalledWith(
127
+ ScreenOrientation.OrientationLock.PORTRAIT_UP,
128
+ );
129
+ });
130
+
131
+ it("warns and reports once when the host build cannot honour the lock", async () => {
132
+ // Pins the reporting contract for any build where the platform declares
133
+ // the lock unsupported (lockAsync would resolve without rotating).
134
+ globalWithDev.__DEV__ = true;
135
+ mockedSupportsLock.mockResolvedValue(false);
136
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
137
+ const captureException = vi
138
+ .spyOn(UseSmileIDCrashReporting, "captureException")
139
+ .mockImplementation(() => {});
140
+
141
+ const tree = await mountHost({ orientation: "Landscape" });
142
+
143
+ expect(captureException).toHaveBeenCalledTimes(1);
144
+ expect(warn).toHaveBeenCalledTimes(1);
145
+ expect(warn.mock.calls[0]?.[0]).toContain("orientation");
146
+
147
+ await act(async () => {
148
+ tree.unmount();
149
+ await flushPromises();
150
+ });
151
+ });
152
+
153
+ it("reports without warning when __DEV__ is absent (production build)", async () => {
154
+ mockedSupportsLock.mockResolvedValue(false);
155
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
156
+ const captureException = vi
157
+ .spyOn(UseSmileIDCrashReporting, "captureException")
158
+ .mockImplementation(() => {});
159
+
160
+ const tree = await mountHost({ orientation: "Landscape" });
161
+
162
+ expect(captureException).toHaveBeenCalledTimes(1);
163
+ expect(warn).not.toHaveBeenCalled();
164
+
165
+ await act(async () => {
166
+ tree.unmount();
167
+ await flushPromises();
168
+ });
169
+ });
170
+
171
+ it("warns once across capture-screen remounts for the same target", async () => {
172
+ globalWithDev.__DEV__ = true;
173
+ mockedSupportsLock.mockResolvedValue(false);
174
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
175
+ const captureException = vi
176
+ .spyOn(UseSmileIDCrashReporting, "captureException")
177
+ .mockImplementation(() => {});
178
+
179
+ const first = await mountHost({ orientation: "Landscape" });
180
+ await act(async () => {
181
+ first.unmount();
182
+ await flushPromises();
183
+ });
184
+ const second = await mountHost({ orientation: "Landscape" });
185
+
186
+ expect(warn).toHaveBeenCalledTimes(1);
187
+ expect(captureException).toHaveBeenCalledTimes(2);
188
+
189
+ await act(async () => {
190
+ second.unmount();
191
+ await flushPromises();
192
+ });
193
+ });
194
+
195
+ it("stays silent when the host build permits the lock", async () => {
196
+ globalWithDev.__DEV__ = true;
197
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
198
+ const captureException = vi
199
+ .spyOn(UseSmileIDCrashReporting, "captureException")
200
+ .mockImplementation(() => {});
201
+
202
+ const tree = await mountHost({ orientation: "Portrait" });
203
+
204
+ expect(captureException).not.toHaveBeenCalled();
205
+ expect(warn).not.toHaveBeenCalled();
206
+
207
+ await act(async () => {
208
+ tree.unmount();
209
+ await flushPromises();
210
+ });
211
+ });
212
+ });
@@ -83,6 +83,7 @@ const FEEDBACK_COPY: Partial<
83
83
  si_capture_ready: (loc) => loc.siCaptureReady,
84
84
  si_capture_hold_steady: (loc) => loc.siCaptureHoldSteady,
85
85
  si_capture_timeout: (loc) => loc.siCaptureTimeout,
86
+ si_capture_camera_unavailable: (loc) => loc.siCaptureCameraUnavailable,
86
87
  si_capturing: (loc) => loc.siCapturing,
87
88
  si_selfie_capture_complete: (loc) => loc.siSelfieCaptureComplete,
88
89
  si_selfie_capture_timeout: (loc) => loc.siSelfieCaptureTimeout,
@@ -1,8 +1,8 @@
1
1
  import type {
2
2
  ScanHeadTurnDirection,
3
- ScanState,
3
+ UseSmileIDScanState,
4
4
  } from "@smileid/usesmileid_bridge";
5
- import { ScanStateType } from "@smileid/usesmileid_bridge";
5
+ import { UseSmileIDScanStateType } from "@smileid/usesmileid_bridge";
6
6
  import { CaptureType } from "../../../core/models/ml_config";
7
7
  import { UseSmileIDOverlayState } from "../../state/use_smile_id_overlay_state";
8
8
  import type { SiKey } from "../../../l10n/strings_en";
@@ -12,7 +12,7 @@ import {
12
12
  selfieFeedbackKeyFor,
13
13
  } from "./capture_screen_helpers";
14
14
 
15
- /** Immutable per-frame UI snapshot derived from the native `ScanState`. */
15
+ /** Immutable per-frame UI snapshot derived from the native `UseSmileIDScanState`. */
16
16
  export type UseSmileIDCaptureUiState = {
17
17
  readonly overlayState: UseSmileIDOverlayState;
18
18
  /** Stable si_* key behind the guidance copy and the coaching-animation lookup. */
@@ -128,21 +128,21 @@ export function preCaptureUiState(
128
128
  * `unsatisfied`, or `timeout`/`finished` returning to `initial`.
129
129
  */
130
130
  export function isSessionBoundary(
131
- previous: ScanState,
132
- next: ScanState,
131
+ previous: UseSmileIDScanState,
132
+ next: UseSmileIDScanState,
133
133
  ): boolean {
134
134
  if (previous.type === next.type) return false;
135
- if (previous.type === ScanStateType.Unsatisfied) return true;
135
+ if (previous.type === UseSmileIDScanStateType.Unsatisfied) return true;
136
136
  return (
137
- (previous.type === ScanStateType.Timeout ||
138
- previous.type === ScanStateType.Finished) &&
139
- next.type === ScanStateType.Initial
137
+ (previous.type === UseSmileIDScanStateType.Timeout ||
138
+ previous.type === UseSmileIDScanStateType.Finished) &&
139
+ next.type === UseSmileIDScanStateType.Initial
140
140
  );
141
141
  }
142
142
 
143
143
  /** Dispatch on capture type — see {@link mapSelfieUiState} / {@link mapDocumentUiState}. */
144
144
  export function mapCaptureUiState(
145
- scanState: ScanState,
145
+ scanState: UseSmileIDScanState,
146
146
  captureType: CaptureType,
147
147
  enableEnhancedLiveness: boolean,
148
148
  ): UseSmileIDCaptureUiState {
@@ -157,7 +157,7 @@ export function mapCaptureUiState(
157
157
  * still…") and zeroes the fill.
158
158
  */
159
159
  export function mapSelfieUiState(
160
- scanState: ScanState,
160
+ scanState: UseSmileIDScanState,
161
161
  enableEnhancedLiveness: boolean,
162
162
  ): UseSmileIDCaptureUiState {
163
163
  return withEnhancedLivenessPolicy(
@@ -167,11 +167,11 @@ export function mapSelfieUiState(
167
167
  }
168
168
 
169
169
  function selfieUiState(
170
- scanState: ScanState,
170
+ scanState: UseSmileIDScanState,
171
171
  enableEnhancedLiveness: boolean,
172
172
  ): UseSmileIDCaptureUiState {
173
173
  switch (scanState.type) {
174
- case ScanStateType.Initial:
174
+ case UseSmileIDScanStateType.Initial:
175
175
  return uiState(
176
176
  UseSmileIDOverlayState.INSTRUCTION,
177
177
  enableEnhancedLiveness
@@ -180,7 +180,7 @@ function selfieUiState(
180
180
  0,
181
181
  );
182
182
 
183
- case ScanStateType.Found: {
183
+ case UseSmileIDScanStateType.Found: {
184
184
  const overlayState = mapScanStateToOverlayState(
185
185
  scanState,
186
186
  CaptureType.selfie,
@@ -191,7 +191,7 @@ function selfieUiState(
191
191
  return uiState(overlayState, feedbackKey, scanState.captureProgress ?? 0);
192
192
  }
193
193
 
194
- case ScanStateType.Satisfied:
194
+ case UseSmileIDScanStateType.Satisfied:
195
195
  // Progress forced to 1 so the ring completes even when the last
196
196
  // interim frame undershot; transient before `finished`.
197
197
  return uiState(
@@ -200,7 +200,7 @@ function selfieUiState(
200
200
  1,
201
201
  );
202
202
 
203
- case ScanStateType.Unsatisfied:
203
+ case UseSmileIDScanStateType.Unsatisfied:
204
204
  // Unsatisfied collapses onto one requirements-not-met copy —
205
205
  // the per-check `reason` only feeds telemetry, not guidance.
206
206
  return uiState(
@@ -209,13 +209,13 @@ function selfieUiState(
209
209
  0,
210
210
  );
211
211
 
212
- case ScanStateType.Finished:
212
+ case UseSmileIDScanStateType.Finished:
213
213
  return scannedUiState(enableEnhancedLiveness);
214
214
 
215
- case ScanStateType.Timeout:
215
+ case UseSmileIDScanStateType.Timeout:
216
216
  return uiState(UseSmileIDOverlayState.IDLE, "si_capture_timeout", 0);
217
217
 
218
- case ScanStateType.HeadTurn: {
218
+ case UseSmileIDScanStateType.HeadTurn: {
219
219
  const direction = scanState.currentDirection ?? null;
220
220
  const turnPrompt: SiKey =
221
221
  direction === "left"
@@ -243,20 +243,20 @@ function selfieUiState(
243
243
 
244
244
  /** Document scan-state → UI-state mapping. */
245
245
  export function mapDocumentUiState(
246
- scanState: ScanState,
246
+ scanState: UseSmileIDScanState,
247
247
  ): UseSmileIDCaptureUiState {
248
248
  switch (scanState.type) {
249
- case ScanStateType.Initial:
249
+ case UseSmileIDScanStateType.Initial:
250
250
  // No head-turn phase for documents; a degenerate headTurn maps to
251
251
  // the pre-capture instruction.
252
- case ScanStateType.HeadTurn:
252
+ case UseSmileIDScanStateType.HeadTurn:
253
253
  return uiState(
254
254
  UseSmileIDOverlayState.INSTRUCTION,
255
255
  "si_document_initial_instruction",
256
256
  0,
257
257
  );
258
258
 
259
- case ScanStateType.Found: {
259
+ case UseSmileIDScanStateType.Found: {
260
260
  const overlayState = mapScanStateToOverlayState(
261
261
  scanState,
262
262
  CaptureType.document,
@@ -275,20 +275,20 @@ export function mapDocumentUiState(
275
275
 
276
276
  // Documents collapse satisfied/finished onto the same terminal
277
277
  // snapshot: the still is captured and the screen is moving on.
278
- case ScanStateType.Satisfied:
278
+ case UseSmileIDScanStateType.Satisfied:
279
279
  return scannedDocumentUiState();
280
280
 
281
- case ScanStateType.Unsatisfied:
281
+ case UseSmileIDScanStateType.Unsatisfied:
282
282
  return uiState(
283
283
  UseSmileIDOverlayState.IDLE,
284
284
  "si_document_capture_unsatisfied",
285
285
  0,
286
286
  );
287
287
 
288
- case ScanStateType.Finished:
288
+ case UseSmileIDScanStateType.Finished:
289
289
  return scannedDocumentUiState();
290
290
 
291
- case ScanStateType.Timeout:
291
+ case UseSmileIDScanStateType.Timeout:
292
292
  return uiState(
293
293
  UseSmileIDOverlayState.IDLE,
294
294
  "si_document_capture_timeout",
@@ -1,6 +1,6 @@
1
1
  import * as Haptics from "expo-haptics";
2
- import type { ScanState } from "@smileid/usesmileid_bridge";
3
- import { ScanStateType } from "@smileid/usesmileid_bridge";
2
+ import type { UseSmileIDScanState } from "@smileid/usesmileid_bridge";
3
+ import { UseSmileIDScanStateType } from "@smileid/usesmileid_bridge";
4
4
 
5
5
  /** Which haptic a completed Enhanced Smart Selfie head turn warrants. */
6
6
  export type EssTurnHaptic = "intermediate" | "final";
@@ -20,16 +20,16 @@ export type EssTurnHaptic = "intermediate" | "final";
20
20
  * scan state so the same completion is reported exactly once.
21
21
  */
22
22
  export function essTurnHaptic(
23
- previous: ScanState,
24
- next: ScanState,
23
+ previous: UseSmileIDScanState,
24
+ next: UseSmileIDScanState,
25
25
  ): EssTurnHaptic | null {
26
26
  // Only a transition out of an active, directed head turn can complete one.
27
- if (previous.type !== ScanStateType.HeadTurn) return null;
27
+ if (previous.type !== UseSmileIDScanStateType.HeadTurn) return null;
28
28
  if (previous.currentDirection === undefined) return null;
29
29
 
30
30
  // The requested direction advanced — the previous turn completed.
31
31
  if (
32
- next.type === ScanStateType.HeadTurn &&
32
+ next.type === UseSmileIDScanStateType.HeadTurn &&
33
33
  next.currentDirection !== undefined &&
34
34
  next.currentDirection !== previous.currentDirection
35
35
  ) {
@@ -39,9 +39,9 @@ export function essTurnHaptic(
39
39
  // Leaving the head-turn phase toward capture is the final turn's
40
40
  // completion; `initial` / `timeout` are resets, not completions.
41
41
  if (
42
- next.type === ScanStateType.Found ||
43
- next.type === ScanStateType.Satisfied ||
44
- next.type === ScanStateType.Finished
42
+ next.type === UseSmileIDScanStateType.Found ||
43
+ next.type === UseSmileIDScanStateType.Satisfied ||
44
+ next.type === UseSmileIDScanStateType.Finished
45
45
  ) {
46
46
  return "final";
47
47
  }
@@ -1,16 +1,16 @@
1
- import type { ScanState } from "@smileid/usesmileid_bridge";
2
- import { ScanStateType } from "@smileid/usesmileid_bridge";
1
+ import type { UseSmileIDScanState } from "@smileid/usesmileid_bridge";
2
+ import { UseSmileIDScanStateType } from "@smileid/usesmileid_bridge";
3
3
  import { CaptureType } from "../../../core/models/ml_config";
4
4
  import { UseSmileIDOverlayState } from "../../state/use_smile_id_overlay_state";
5
5
 
6
6
  /**
7
- * Map an analyzer's `ScanState` into the SDK's visual `OverlayState`.
7
+ * Map an analyzer's `UseSmileIDScanState` into the SDK's visual `OverlayState`.
8
8
  *
9
9
  * The overlay enum drives the face/document oval's border colour, dash
10
10
  * pattern, and fill animation — it's a presentation concept layered on
11
11
  * top of the scan-state machine. The mapping reads `state.feedback`
12
- * (when `type === ScanStateType.Found`) and `state.reason` (when
13
- * `type === ScanStateType.Unsatisfied`) to pick the fine-grained
12
+ * (when `type === UseSmileIDScanStateType.Found`) and `state.reason` (when
13
+ * `type === UseSmileIDScanStateType.Unsatisfied`) to pick the fine-grained
14
14
  * overlay state; other scan-state types map coarsely to the matching
15
15
  * lifecycle entry.
16
16
  *
@@ -20,14 +20,14 @@ import { UseSmileIDOverlayState } from "../../state/use_smile_id_overlay_state";
20
20
  * a new feedback key the JS side hasn't been updated for.
21
21
  */
22
22
  export function mapScanStateToOverlayState(
23
- scanState: ScanState,
23
+ scanState: UseSmileIDScanState,
24
24
  captureType: CaptureType,
25
25
  ): UseSmileIDOverlayState {
26
26
  switch (scanState.type) {
27
- case ScanStateType.Initial:
27
+ case UseSmileIDScanStateType.Initial:
28
28
  return UseSmileIDOverlayState.INSTRUCTION;
29
29
 
30
- case ScanStateType.Found:
30
+ case UseSmileIDScanStateType.Found:
31
31
  // `feedback` is the canonical `si_capture_*` key the native side
32
32
  // emits; partner code never sees raw English copy.
33
33
  return resolveFeedbackOverlay(
@@ -38,10 +38,10 @@ export function mapScanStateToOverlayState(
38
38
  : UseSmileIDOverlayState.DOCUMENT_READY,
39
39
  );
40
40
 
41
- case ScanStateType.Satisfied:
41
+ case UseSmileIDScanStateType.Satisfied:
42
42
  return UseSmileIDOverlayState.READY;
43
43
 
44
- case ScanStateType.Unsatisfied:
44
+ case UseSmileIDScanStateType.Unsatisfied:
45
45
  return resolveFeedbackOverlay(
46
46
  scanState.reason,
47
47
  captureType,
@@ -50,13 +50,13 @@ export function mapScanStateToOverlayState(
50
50
  : UseSmileIDOverlayState.DOCUMENT_NOT_CENTERED,
51
51
  );
52
52
 
53
- case ScanStateType.Finished:
53
+ case UseSmileIDScanStateType.Finished:
54
54
  return UseSmileIDOverlayState.CAPTURING;
55
55
 
56
- case ScanStateType.HeadTurn:
56
+ case UseSmileIDScanStateType.HeadTurn:
57
57
  return UseSmileIDOverlayState.HEAD_TURN;
58
58
 
59
- case ScanStateType.Timeout:
59
+ case UseSmileIDScanStateType.Timeout:
60
60
  // Back to the gray pre-capture state while partners re-prompt.
61
61
  return UseSmileIDOverlayState.IDLE;
62
62
  }