@smileid/usesmileid 12.0.0-beta01 → 12.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +701 -89
  3. package/dist/camera/camera_defaults.d.ts +14 -9
  4. package/dist/camera/camera_defaults.d.ts.map +1 -1
  5. package/dist/camera/camera_defaults.js +11 -9
  6. package/dist/camera/camera_defaults.js.map +1 -1
  7. package/dist/camera/orientation_degrees.d.ts +5 -6
  8. package/dist/camera/orientation_degrees.d.ts.map +1 -1
  9. package/dist/camera/orientation_degrees.js +5 -6
  10. package/dist/camera/orientation_degrees.js.map +1 -1
  11. package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.d.ts +11 -0
  12. package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.d.ts.map +1 -0
  13. package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.js +17 -0
  14. package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.js.map +1 -0
  15. package/dist/core/exception/capture_validation_exceptions.d.ts +1 -0
  16. package/dist/core/exception/capture_validation_exceptions.d.ts.map +1 -1
  17. package/dist/core/exception/capture_validation_exceptions.js +1 -0
  18. package/dist/core/exception/capture_validation_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/use_smile_id_error_code.d.ts +1 -0
  24. package/dist/core/exception/use_smile_id_error_code.d.ts.map +1 -1
  25. package/dist/core/exception/use_smile_id_error_code.js +1 -0
  26. package/dist/core/exception/use_smile_id_error_code.js.map +1 -1
  27. package/dist/core/models/config.d.ts +19 -0
  28. package/dist/core/models/config.d.ts.map +1 -1
  29. package/dist/core/models/document_capture_mode.d.ts +8 -0
  30. package/dist/core/models/document_capture_mode.d.ts.map +1 -1
  31. package/dist/core/models/document_capture_mode.js +24 -0
  32. package/dist/core/models/document_capture_mode.js.map +1 -1
  33. package/dist/core/models/document_type.d.ts +2 -2
  34. package/dist/core/models/document_type.d.ts.map +1 -1
  35. package/dist/core/models/document_type.js +7 -5
  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/core/models/result.d.ts +9 -8
  44. package/dist/core/models/result.d.ts.map +1 -1
  45. package/dist/core/models/result.js +5 -6
  46. package/dist/core/models/result.js.map +1 -1
  47. package/dist/data/api/interceptors/smile_auth_interceptor.d.ts.map +1 -1
  48. package/dist/data/api/interceptors/smile_auth_interceptor.js +3 -17
  49. package/dist/data/api/interceptors/smile_auth_interceptor.js.map +1 -1
  50. package/dist/data/api/interceptors/smile_integrity_interceptor.d.ts +11 -0
  51. package/dist/data/api/interceptors/smile_integrity_interceptor.d.ts.map +1 -1
  52. package/dist/data/api/interceptors/smile_integrity_interceptor.js +13 -0
  53. package/dist/data/api/interceptors/smile_integrity_interceptor.js.map +1 -1
  54. package/dist/data/api/interceptors/smile_request_mac_interceptor.d.ts +8 -0
  55. package/dist/data/api/interceptors/smile_request_mac_interceptor.d.ts.map +1 -1
  56. package/dist/data/api/interceptors/smile_request_mac_interceptor.js +11 -0
  57. package/dist/data/api/interceptors/smile_request_mac_interceptor.js.map +1 -1
  58. package/dist/data/api/smile_id_api.d.ts +1 -1
  59. package/dist/data/api/smile_id_api.d.ts.map +1 -1
  60. package/dist/data/compression/compressible_asset.d.ts +41 -0
  61. package/dist/data/compression/compressible_asset.d.ts.map +1 -0
  62. package/dist/data/compression/compressible_asset.js +34 -0
  63. package/dist/data/compression/compressible_asset.js.map +1 -0
  64. package/dist/data/compression/payload_compression_config.d.ts +36 -0
  65. package/dist/data/compression/payload_compression_config.d.ts.map +1 -0
  66. package/dist/data/compression/payload_compression_config.js +52 -0
  67. package/dist/data/compression/payload_compression_config.js.map +1 -0
  68. package/dist/data/compression/payload_compression_runner.d.ts +29 -0
  69. package/dist/data/compression/payload_compression_runner.d.ts.map +1 -0
  70. package/dist/data/compression/payload_compression_runner.js +55 -0
  71. package/dist/data/compression/payload_compression_runner.js.map +1 -0
  72. package/dist/data/compression/payload_compressor.d.ts +40 -0
  73. package/dist/data/compression/payload_compressor.d.ts.map +1 -0
  74. package/dist/data/compression/payload_compressor.js +126 -0
  75. package/dist/data/compression/payload_compressor.js.map +1 -0
  76. package/dist/data/compression/uri_compressible_asset.d.ts +23 -0
  77. package/dist/data/compression/uri_compressible_asset.d.ts.map +1 -0
  78. package/dist/data/compression/uri_compressible_asset.js +77 -0
  79. package/dist/data/compression/uri_compressible_asset.js.map +1 -0
  80. package/dist/data/dsl/builder/cache_config_builder.d.ts +2 -1
  81. package/dist/data/dsl/builder/cache_config_builder.d.ts.map +1 -1
  82. package/dist/data/dsl/builder/cache_config_builder.js +2 -1
  83. package/dist/data/dsl/builder/cache_config_builder.js.map +1 -1
  84. package/dist/data/dsl/builder/config_builder.d.ts +40 -14
  85. package/dist/data/dsl/builder/config_builder.d.ts.map +1 -1
  86. package/dist/data/dsl/builder/config_builder.js +40 -14
  87. package/dist/data/dsl/builder/config_builder.js.map +1 -1
  88. package/dist/data/dsl/builder/interceptor_config_builder.d.ts +9 -7
  89. package/dist/data/dsl/builder/interceptor_config_builder.d.ts.map +1 -1
  90. package/dist/data/dsl/builder/interceptor_config_builder.js +9 -7
  91. package/dist/data/dsl/builder/interceptor_config_builder.js.map +1 -1
  92. package/dist/data/dsl/builder/retry_config_builder.d.ts +19 -4
  93. package/dist/data/dsl/builder/retry_config_builder.d.ts.map +1 -1
  94. package/dist/data/dsl/builder/retry_config_builder.js +21 -6
  95. package/dist/data/dsl/builder/retry_config_builder.js.map +1 -1
  96. package/dist/data/dsl/builder/timeout_config_builder.d.ts +4 -0
  97. package/dist/data/dsl/builder/timeout_config_builder.d.ts.map +1 -1
  98. package/dist/data/dsl/builder/timeout_config_builder.js +4 -0
  99. package/dist/data/dsl/builder/timeout_config_builder.js.map +1 -1
  100. package/dist/data/dsl/use_smile_id_network_builder.d.ts +17 -0
  101. package/dist/data/dsl/use_smile_id_network_builder.d.ts.map +1 -1
  102. package/dist/data/dsl/use_smile_id_network_builder.js +17 -0
  103. package/dist/data/dsl/use_smile_id_network_builder.js.map +1 -1
  104. package/dist/data/factory/networking_factory.d.ts.map +1 -1
  105. package/dist/data/factory/networking_factory.js +11 -1
  106. package/dist/data/factory/networking_factory.js.map +1 -1
  107. package/dist/data/repository/use_smile_id_repository_impl.d.ts +6 -0
  108. package/dist/data/repository/use_smile_id_repository_impl.d.ts.map +1 -1
  109. package/dist/data/repository/use_smile_id_repository_impl.js +82 -8
  110. package/dist/data/repository/use_smile_id_repository_impl.js.map +1 -1
  111. package/dist/data/security/request_canonicalizer.d.ts.map +1 -1
  112. package/dist/data/security/request_canonicalizer.js +14 -2
  113. package/dist/data/security/request_canonicalizer.js.map +1 -1
  114. package/dist/data/security/security_policy.d.ts +43 -0
  115. package/dist/data/security/security_policy.d.ts.map +1 -0
  116. package/dist/data/security/security_policy.js +61 -0
  117. package/dist/data/security/security_policy.js.map +1 -0
  118. package/dist/data/smile_id_urls.d.ts +1 -1
  119. package/dist/data/smile_id_urls.js +1 -1
  120. package/dist/data/smile_id_urls.js.map +1 -1
  121. package/dist/data/util/retry_util.d.ts +2 -2
  122. package/dist/data/util/retry_util.d.ts.map +1 -1
  123. package/dist/data/util/retry_util.js +7 -1
  124. package/dist/data/util/retry_util.js.map +1 -1
  125. package/dist/data/util/use_smile_id_token_decoder.d.ts +22 -0
  126. package/dist/data/util/use_smile_id_token_decoder.d.ts.map +1 -1
  127. package/dist/data/util/use_smile_id_token_decoder.js +58 -24
  128. package/dist/data/util/use_smile_id_token_decoder.js.map +1 -1
  129. package/dist/index.d.ts +2 -2
  130. package/dist/index.d.ts.map +1 -1
  131. package/dist/index.js +2 -2
  132. package/dist/index.js.map +1 -1
  133. package/dist/l10n/strings_en.d.ts +2 -1
  134. package/dist/l10n/strings_en.d.ts.map +1 -1
  135. package/dist/l10n/strings_en.js +2 -1
  136. package/dist/l10n/strings_en.js.map +1 -1
  137. package/dist/l10n/use_smile_id_localizations.d.ts +1 -0
  138. package/dist/l10n/use_smile_id_localizations.d.ts.map +1 -1
  139. package/dist/l10n/use_smile_id_localizations.js +3 -0
  140. package/dist/l10n/use_smile_id_localizations.js.map +1 -1
  141. package/dist/metadata/builder_configuration.d.ts +44 -0
  142. package/dist/metadata/builder_configuration.d.ts.map +1 -0
  143. package/dist/metadata/builder_configuration.js +35 -0
  144. package/dist/metadata/builder_configuration.js.map +1 -0
  145. package/dist/metadata/captured_image_properties.d.ts +11 -0
  146. package/dist/metadata/captured_image_properties.d.ts.map +1 -0
  147. package/dist/metadata/captured_image_properties.js +11 -0
  148. package/dist/metadata/captured_image_properties.js.map +1 -0
  149. package/dist/metadata/device_orientation_collector.d.ts +17 -0
  150. package/dist/metadata/device_orientation_collector.d.ts.map +1 -0
  151. package/dist/metadata/device_orientation_collector.js +66 -0
  152. package/dist/metadata/device_orientation_collector.js.map +1 -0
  153. package/dist/metadata/geolocation.d.ts +20 -0
  154. package/dist/metadata/geolocation.d.ts.map +1 -0
  155. package/dist/metadata/geolocation.js +40 -0
  156. package/dist/metadata/geolocation.js.map +1 -0
  157. package/dist/metadata/metadata_configuration_mappers.d.ts +47 -0
  158. package/dist/metadata/metadata_configuration_mappers.d.ts.map +1 -0
  159. package/dist/metadata/metadata_configuration_mappers.js +178 -0
  160. package/dist/metadata/metadata_configuration_mappers.js.map +1 -0
  161. package/dist/metadata/model_configuration.d.ts +41 -0
  162. package/dist/metadata/model_configuration.d.ts.map +1 -0
  163. package/dist/metadata/model_configuration.js +44 -0
  164. package/dist/metadata/model_configuration.js.map +1 -0
  165. package/dist/metadata/optional_native_modules.d.ts +79 -3
  166. package/dist/metadata/optional_native_modules.d.ts.map +1 -1
  167. package/dist/metadata/optional_native_modules.js +108 -3
  168. package/dist/metadata/optional_native_modules.js.map +1 -1
  169. package/dist/metadata/use_smile_id_metadata.d.ts +45 -7
  170. package/dist/metadata/use_smile_id_metadata.d.ts.map +1 -1
  171. package/dist/metadata/use_smile_id_metadata.js +85 -13
  172. package/dist/metadata/use_smile_id_metadata.js.map +1 -1
  173. package/dist/metadata/use_smile_id_metadata_factory.d.ts +37 -0
  174. package/dist/metadata/use_smile_id_metadata_factory.d.ts.map +1 -1
  175. package/dist/metadata/use_smile_id_metadata_factory.js +197 -16
  176. package/dist/metadata/use_smile_id_metadata_factory.js.map +1 -1
  177. package/dist/presentation/assets/svg/document_shimmer_strings.d.ts +14 -0
  178. package/dist/presentation/assets/svg/document_shimmer_strings.d.ts.map +1 -0
  179. package/dist/presentation/assets/svg/document_shimmer_strings.js +14 -0
  180. package/dist/presentation/assets/svg/document_shimmer_strings.js.map +1 -0
  181. package/dist/presentation/assets/svg/instruction_svg_strings.d.ts +12 -4
  182. package/dist/presentation/assets/svg/instruction_svg_strings.d.ts.map +1 -1
  183. package/dist/presentation/assets/svg/instruction_svg_strings.js +19 -8
  184. package/dist/presentation/assets/svg/instruction_svg_strings.js.map +1 -1
  185. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.d.ts +0 -5
  186. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.d.ts.map +1 -1
  187. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.js +0 -5
  188. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.js.map +1 -1
  189. package/dist/presentation/components/icons/index.d.ts +24 -8
  190. package/dist/presentation/components/icons/index.d.ts.map +1 -1
  191. package/dist/presentation/components/icons/index.js +31 -11
  192. package/dist/presentation/components/icons/index.js.map +1 -1
  193. package/dist/presentation/components/use_smile_id_attribution.d.ts +1 -1
  194. package/dist/presentation/components/use_smile_id_button.d.ts +2 -2
  195. package/dist/presentation/components/use_smile_id_button.js +4 -4
  196. package/dist/presentation/components/use_smile_id_button.js.map +1 -1
  197. package/dist/presentation/components/use_smile_id_capture_content.d.ts +13 -0
  198. package/dist/presentation/components/use_smile_id_capture_content.d.ts.map +1 -1
  199. package/dist/presentation/components/use_smile_id_capture_content.js +15 -9
  200. package/dist/presentation/components/use_smile_id_capture_content.js.map +1 -1
  201. package/dist/presentation/components/use_smile_id_captured_document_image.d.ts +2 -3
  202. package/dist/presentation/components/use_smile_id_captured_document_image.d.ts.map +1 -1
  203. package/dist/presentation/components/use_smile_id_captured_document_image.js +1 -3
  204. package/dist/presentation/components/use_smile_id_captured_document_image.js.map +1 -1
  205. package/dist/presentation/components/use_smile_id_document_capture_controls.d.ts +12 -6
  206. package/dist/presentation/components/use_smile_id_document_capture_controls.d.ts.map +1 -1
  207. package/dist/presentation/components/use_smile_id_document_capture_controls.js +59 -16
  208. package/dist/presentation/components/use_smile_id_document_capture_controls.js.map +1 -1
  209. package/dist/presentation/components/use_smile_id_document_overlay.d.ts +22 -5
  210. package/dist/presentation/components/use_smile_id_document_overlay.d.ts.map +1 -1
  211. package/dist/presentation/components/use_smile_id_document_overlay.js +80 -40
  212. package/dist/presentation/components/use_smile_id_document_overlay.js.map +1 -1
  213. package/dist/presentation/components/use_smile_id_document_shimmer.d.ts +15 -0
  214. package/dist/presentation/components/use_smile_id_document_shimmer.d.ts.map +1 -0
  215. package/dist/presentation/components/use_smile_id_document_shimmer.js +23 -0
  216. package/dist/presentation/components/use_smile_id_document_shimmer.js.map +1 -0
  217. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.d.ts +5 -2
  218. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.d.ts.map +1 -1
  219. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.js +9 -6
  220. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.js.map +1 -1
  221. package/dist/presentation/components/use_smile_id_guideline_thumbnail.d.ts.map +1 -1
  222. package/dist/presentation/components/use_smile_id_guideline_thumbnail.js +84 -1
  223. package/dist/presentation/components/use_smile_id_guideline_thumbnail.js.map +1 -1
  224. package/dist/presentation/components/use_smile_id_instructions_hero.d.ts +3 -1
  225. package/dist/presentation/components/use_smile_id_instructions_hero.d.ts.map +1 -1
  226. package/dist/presentation/components/use_smile_id_instructions_hero.js +25 -5
  227. package/dist/presentation/components/use_smile_id_instructions_hero.js.map +1 -1
  228. package/dist/presentation/components/use_smile_id_oval_border_palette.d.ts.map +1 -1
  229. package/dist/presentation/components/use_smile_id_oval_border_palette.js +7 -3
  230. package/dist/presentation/components/use_smile_id_oval_border_palette.js.map +1 -1
  231. package/dist/presentation/flow/dsl/builder/config_builder.d.ts +28 -0
  232. package/dist/presentation/flow/dsl/builder/config_builder.d.ts.map +1 -1
  233. package/dist/presentation/flow/dsl/builder/config_builder.js +30 -0
  234. package/dist/presentation/flow/dsl/builder/config_builder.js.map +1 -1
  235. package/dist/presentation/flow/dsl/builder/ml_builder.d.ts +13 -4
  236. package/dist/presentation/flow/dsl/builder/ml_builder.d.ts.map +1 -1
  237. package/dist/presentation/flow/dsl/builder/ml_builder.js +3 -2
  238. package/dist/presentation/flow/dsl/builder/ml_builder.js.map +1 -1
  239. package/dist/presentation/flow/dsl/builder/screens_builder.d.ts +110 -12
  240. package/dist/presentation/flow/dsl/builder/screens_builder.d.ts.map +1 -1
  241. package/dist/presentation/flow/dsl/builder/screens_builder.js +110 -12
  242. package/dist/presentation/flow/dsl/builder/screens_builder.js.map +1 -1
  243. package/dist/presentation/flow/dsl/builder/theme_builder.d.ts +15 -2
  244. package/dist/presentation/flow/dsl/builder/theme_builder.d.ts.map +1 -1
  245. package/dist/presentation/flow/dsl/builder/theme_builder.js +15 -2
  246. package/dist/presentation/flow/dsl/builder/theme_builder.js.map +1 -1
  247. package/dist/presentation/flow/dsl/use_smile_id_builder.d.ts +6 -4
  248. package/dist/presentation/flow/dsl/use_smile_id_builder.d.ts.map +1 -1
  249. package/dist/presentation/flow/dsl/use_smile_id_builder.js.map +1 -1
  250. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.d.ts +62 -36
  251. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.d.ts.map +1 -1
  252. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.js +62 -36
  253. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.js.map +1 -1
  254. package/dist/presentation/flow/flow_navigation_manager.d.ts +44 -5
  255. package/dist/presentation/flow/flow_navigation_manager.d.ts.map +1 -1
  256. package/dist/presentation/flow/flow_navigation_manager.js +148 -11
  257. package/dist/presentation/flow/flow_navigation_manager.js.map +1 -1
  258. package/dist/presentation/flow/model/instruction_guideline.d.ts +9 -0
  259. package/dist/presentation/flow/model/instruction_guideline.d.ts.map +1 -1
  260. package/dist/presentation/flow/model/instructions_defaults.d.ts +11 -2
  261. package/dist/presentation/flow/model/instructions_defaults.d.ts.map +1 -1
  262. package/dist/presentation/flow/model/instructions_defaults.js +74 -26
  263. package/dist/presentation/flow/model/instructions_defaults.js.map +1 -1
  264. package/dist/presentation/flow/screen/orchestrated_capture_screen.d.ts.map +1 -1
  265. package/dist/presentation/flow/screen/orchestrated_capture_screen.js +48 -14
  266. package/dist/presentation/flow/screen/orchestrated_capture_screen.js.map +1 -1
  267. package/dist/presentation/flow/screen/orchestrated_consent_screen.d.ts.map +1 -1
  268. package/dist/presentation/flow/screen/orchestrated_consent_screen.js +3 -1
  269. package/dist/presentation/flow/screen/orchestrated_consent_screen.js.map +1 -1
  270. package/dist/presentation/flow/screen/orchestrated_instructions_screen.js +1 -1
  271. package/dist/presentation/flow/screen/orchestrated_instructions_screen.js.map +1 -1
  272. package/dist/presentation/flow/screen/orchestrated_preview_screen.d.ts.map +1 -1
  273. package/dist/presentation/flow/screen/orchestrated_preview_screen.js +3 -9
  274. package/dist/presentation/flow/screen/orchestrated_preview_screen.js.map +1 -1
  275. package/dist/presentation/flow/screen/orchestrated_processing_screen.js +3 -3
  276. package/dist/presentation/flow/screen/orchestrated_processing_screen.js.map +1 -1
  277. package/dist/presentation/flow/use_smile_id_flow.d.ts.map +1 -1
  278. package/dist/presentation/flow/use_smile_id_flow.js +10 -4
  279. package/dist/presentation/flow/use_smile_id_flow.js.map +1 -1
  280. package/dist/presentation/flow/validation/flow_validator.d.ts.map +1 -1
  281. package/dist/presentation/flow/validation/flow_validator.js +42 -20
  282. package/dist/presentation/flow/validation/flow_validator.js.map +1 -1
  283. package/dist/presentation/flow/validation/job_type_validator.d.ts.map +1 -1
  284. package/dist/presentation/flow/validation/job_type_validator.js +14 -0
  285. package/dist/presentation/flow/validation/job_type_validator.js.map +1 -1
  286. package/dist/presentation/screen/helpers/capture_screen_helpers.d.ts.map +1 -1
  287. package/dist/presentation/screen/helpers/capture_screen_helpers.js +1 -0
  288. package/dist/presentation/screen/helpers/capture_screen_helpers.js.map +1 -1
  289. package/dist/presentation/screen/helpers/capture_ui_state.d.ts +6 -6
  290. package/dist/presentation/screen/helpers/capture_ui_state.d.ts.map +1 -1
  291. package/dist/presentation/screen/helpers/capture_ui_state.js +19 -19
  292. package/dist/presentation/screen/helpers/capture_ui_state.js.map +1 -1
  293. package/dist/presentation/screen/helpers/ess_turn_haptics.d.ts +2 -2
  294. package/dist/presentation/screen/helpers/ess_turn_haptics.d.ts.map +1 -1
  295. package/dist/presentation/screen/helpers/ess_turn_haptics.js +6 -6
  296. package/dist/presentation/screen/helpers/ess_turn_haptics.js.map +1 -1
  297. package/dist/presentation/screen/helpers/instructions_screen_helpers.d.ts +1 -0
  298. package/dist/presentation/screen/helpers/instructions_screen_helpers.d.ts.map +1 -1
  299. package/dist/presentation/screen/helpers/instructions_screen_helpers.js +6 -2
  300. package/dist/presentation/screen/helpers/instructions_screen_helpers.js.map +1 -1
  301. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.d.ts +5 -5
  302. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.d.ts.map +1 -1
  303. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.js +14 -11
  304. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.js.map +1 -1
  305. package/dist/presentation/screen/helpers/use_capture_orientation_lock.d.ts +13 -3
  306. package/dist/presentation/screen/helpers/use_capture_orientation_lock.d.ts.map +1 -1
  307. package/dist/presentation/screen/helpers/use_capture_orientation_lock.js +48 -6
  308. package/dist/presentation/screen/helpers/use_capture_orientation_lock.js.map +1 -1
  309. package/dist/presentation/screen/use_smile_id_capture_screen.d.ts +21 -3
  310. package/dist/presentation/screen/use_smile_id_capture_screen.d.ts.map +1 -1
  311. package/dist/presentation/screen/use_smile_id_capture_screen.js +188 -32
  312. package/dist/presentation/screen/use_smile_id_capture_screen.js.map +1 -1
  313. package/dist/presentation/screen/use_smile_id_consent_screen.d.ts +7 -0
  314. package/dist/presentation/screen/use_smile_id_consent_screen.d.ts.map +1 -1
  315. package/dist/presentation/screen/use_smile_id_consent_screen.js +6 -5
  316. package/dist/presentation/screen/use_smile_id_consent_screen.js.map +1 -1
  317. package/dist/presentation/screen/use_smile_id_document_back_instructions.d.ts.map +1 -1
  318. package/dist/presentation/screen/use_smile_id_document_back_instructions.js +5 -13
  319. package/dist/presentation/screen/use_smile_id_document_back_instructions.js.map +1 -1
  320. package/dist/presentation/screen/use_smile_id_document_preview_screen.d.ts +2 -3
  321. package/dist/presentation/screen/use_smile_id_document_preview_screen.d.ts.map +1 -1
  322. package/dist/presentation/screen/use_smile_id_document_preview_screen.js +17 -12
  323. package/dist/presentation/screen/use_smile_id_document_preview_screen.js.map +1 -1
  324. package/dist/presentation/screen/use_smile_id_instructions_screen.d.ts +2 -0
  325. package/dist/presentation/screen/use_smile_id_instructions_screen.d.ts.map +1 -1
  326. package/dist/presentation/screen/use_smile_id_instructions_screen.js +2 -1
  327. package/dist/presentation/screen/use_smile_id_instructions_screen.js.map +1 -1
  328. package/dist/presentation/screen/use_smile_id_preview_screen.d.ts +7 -26
  329. package/dist/presentation/screen/use_smile_id_preview_screen.d.ts.map +1 -1
  330. package/dist/presentation/screen/use_smile_id_preview_screen.js +10 -20
  331. package/dist/presentation/screen/use_smile_id_preview_screen.js.map +1 -1
  332. package/dist/presentation/screen/use_smile_id_processing_screen.d.ts +2 -3
  333. package/dist/presentation/screen/use_smile_id_processing_screen.d.ts.map +1 -1
  334. package/dist/presentation/screen/use_smile_id_processing_screen.js +4 -3
  335. package/dist/presentation/screen/use_smile_id_processing_screen.js.map +1 -1
  336. package/dist/presentation/theme/theme.d.ts +1 -1
  337. package/dist/presentation/theme/theme.d.ts.map +1 -1
  338. package/dist/presentation/theme/theme.js +20 -18
  339. package/dist/presentation/theme/theme.js.map +1 -1
  340. package/dist/presentation/utils/force_max_brightness.d.ts +4 -4
  341. package/dist/presentation/utils/locale_utils.d.ts +10 -4
  342. package/dist/presentation/utils/locale_utils.d.ts.map +1 -1
  343. package/dist/presentation/utils/locale_utils.js +13 -5
  344. package/dist/presentation/utils/locale_utils.js.map +1 -1
  345. package/dist/testing/fake_face_analyzer.d.ts +43 -0
  346. package/dist/testing/fake_face_analyzer.d.ts.map +1 -0
  347. package/dist/testing/fake_face_analyzer.js +52 -0
  348. package/dist/testing/fake_face_analyzer.js.map +1 -0
  349. package/dist/testing/index.d.ts +5 -0
  350. package/dist/testing/index.d.ts.map +1 -0
  351. package/dist/testing/index.js +7 -0
  352. package/dist/testing/index.js.map +1 -0
  353. package/dist/testing/scenario_expectations.d.ts +28 -0
  354. package/dist/testing/scenario_expectations.d.ts.map +1 -0
  355. package/dist/testing/scenario_expectations.js +65 -0
  356. package/dist/testing/scenario_expectations.js.map +1 -0
  357. package/dist/testing/scenario_loader.d.ts +11 -0
  358. package/dist/testing/scenario_loader.d.ts.map +1 -0
  359. package/dist/testing/scenario_loader.js +64 -0
  360. package/dist/testing/scenario_loader.js.map +1 -0
  361. package/dist/testing/scripted_scan_results.d.ts +17 -0
  362. package/dist/testing/scripted_scan_results.d.ts.map +1 -0
  363. package/dist/testing/scripted_scan_results.js +52 -0
  364. package/dist/testing/scripted_scan_results.js.map +1 -0
  365. package/package.json +34 -7
  366. package/src/__tests__/dsl.test.ts +51 -1
  367. package/src/__tests__/react_native_mock.tsx +8 -0
  368. package/src/__tests__/setup_react_native.ts +17 -2
  369. package/src/__tests__/snapshots/__snapshots__/screens_structural.test.tsx.snap +5261 -0
  370. package/src/__tests__/snapshots/screens_structural.test.tsx +230 -0
  371. package/src/camera/__tests__/use_smile_id_camera_system.test.ts +103 -0
  372. package/src/camera/camera_defaults.ts +11 -9
  373. package/src/camera/orientation_degrees.ts +5 -6
  374. package/src/core/exception/__tests__/builder_validation_exceptions.test.ts +67 -0
  375. package/src/core/exception/agent_mode_with_enhanced_liveness_exception.ts +20 -0
  376. package/src/core/exception/capture_validation_exceptions.ts +1 -0
  377. package/src/core/exception/index.ts +1 -0
  378. package/src/core/exception/use_smile_id_error_code.ts +1 -0
  379. package/src/core/models/__tests__/document_type.test.ts +7 -5
  380. package/src/core/models/__tests__/flow_models.test.ts +26 -0
  381. package/src/core/models/config.ts +22 -0
  382. package/src/core/models/document_capture_mode.ts +27 -0
  383. package/src/core/models/document_type.ts +7 -5
  384. package/src/core/models/global_privacy_control.ts +45 -0
  385. package/src/core/models/network_config.ts +2 -2
  386. package/src/core/models/result.ts +9 -8
  387. package/src/data/api/__tests__/smile_id_api.test.ts +1 -1
  388. package/src/data/api/interceptors/__tests__/gzip_interceptor.test.ts +83 -0
  389. package/src/data/api/interceptors/__tests__/smile_integrity_interceptor.test.ts +37 -1
  390. package/src/data/api/interceptors/__tests__/smile_request_mac_interceptor.test.ts +59 -1
  391. package/src/data/api/interceptors/smile_auth_interceptor.ts +3 -18
  392. package/src/data/api/interceptors/smile_integrity_interceptor.ts +20 -0
  393. package/src/data/api/interceptors/smile_request_mac_interceptor.ts +13 -0
  394. package/src/data/compression/__tests__/payload_compressor.test.ts +200 -0
  395. package/src/data/compression/__tests__/payload_compressor_real_jpeg.test.ts +226 -0
  396. package/src/data/compression/compressible_asset.ts +62 -0
  397. package/src/data/compression/payload_compression_config.ts +53 -0
  398. package/src/data/compression/payload_compression_runner.ts +102 -0
  399. package/src/data/compression/payload_compressor.ts +164 -0
  400. package/src/data/compression/uri_compressible_asset.ts +85 -0
  401. package/src/data/dsl/builder/__tests__/config_builders.test.ts +62 -0
  402. package/src/data/dsl/builder/cache_config_builder.ts +3 -1
  403. package/src/data/dsl/builder/config_builder.ts +45 -14
  404. package/src/data/dsl/builder/interceptor_config_builder.ts +9 -7
  405. package/src/data/dsl/builder/retry_config_builder.ts +27 -6
  406. package/src/data/dsl/builder/timeout_config_builder.ts +7 -0
  407. package/src/data/dsl/use_smile_id_network_builder.ts +17 -0
  408. package/src/data/factory/__tests__/retry_gzip_mac_composition.test.ts +163 -0
  409. package/src/data/factory/__tests__/signed_job_submission_headers.test.ts +1 -1
  410. package/src/data/factory/networking_factory.ts +14 -1
  411. package/src/data/repository/__tests__/network_retries.test.ts +117 -0
  412. package/src/data/repository/__tests__/use_smile_id_repository.test.ts +1 -1
  413. package/src/data/repository/use_smile_id_repository_impl.ts +96 -9
  414. package/src/data/security/__tests__/request_canonicalizer.test.ts +132 -0
  415. package/src/data/security/__tests__/security_policy.test.ts +96 -0
  416. package/src/data/security/__tests__/smile_id_crypto_manager.test.ts +18 -0
  417. package/src/data/security/request_canonicalizer.ts +15 -2
  418. package/src/data/security/security_policy.ts +70 -0
  419. package/src/data/smile_id_urls.ts +1 -1
  420. package/src/data/util/__tests__/retry_util.test.ts +25 -0
  421. package/src/data/util/__tests__/use_smile_id_token_decoder.test.ts +57 -1
  422. package/src/data/util/retry_util.ts +12 -3
  423. package/src/data/util/use_smile_id_token_decoder.ts +76 -28
  424. package/src/index.ts +6 -4
  425. package/src/l10n/strings_en.ts +2 -1
  426. package/src/l10n/use_smile_id_localizations.ts +3 -0
  427. package/src/metadata/__tests__/device_orientation_collector.test.ts +15 -0
  428. package/src/metadata/__tests__/metadata_configuration_mappers.test.ts +254 -0
  429. package/src/metadata/__tests__/metadata_configuration_objects.test.ts +86 -0
  430. package/src/metadata/__tests__/metadata_device_context.test.ts +147 -0
  431. package/src/metadata/__tests__/metadata_device_os_android.test.ts +18 -0
  432. package/src/metadata/__tests__/metadata_golden_fixture.json +13 -0
  433. package/src/metadata/__tests__/metadata_payload_golden.test.ts +193 -0
  434. package/src/metadata/__tests__/use_smile_id_metadata.test.ts +19 -25
  435. package/src/metadata/builder_configuration.ts +69 -0
  436. package/src/metadata/captured_image_properties.ts +10 -0
  437. package/src/metadata/device_orientation_collector.ts +75 -0
  438. package/src/metadata/geolocation.ts +46 -0
  439. package/src/metadata/metadata_configuration_mappers.ts +248 -0
  440. package/src/metadata/model_configuration.ts +68 -0
  441. package/src/metadata/optional_native_modules.ts +157 -3
  442. package/src/metadata/use_smile_id_metadata.ts +140 -17
  443. package/src/metadata/use_smile_id_metadata_factory.ts +211 -16
  444. package/src/presentation/assets/si_document_green_book_hero_animation.json +1 -4668
  445. package/src/presentation/assets/si_document_hero_animation.json +1 -4799
  446. package/src/presentation/assets/si_document_hero_back_animation.json +1 -2039
  447. package/src/presentation/assets/si_document_passport_hero_animation.json +1 -14491
  448. package/src/presentation/assets/si_ess_all_directions_hero_animation.json +1 -0
  449. package/src/presentation/assets/si_ess_animation_all_directions.json +1 -5575
  450. package/src/presentation/assets/si_selfie_hero_animation.json +1 -1439
  451. package/src/presentation/assets/si_smile_to_capture_animation.json +1 -1439
  452. package/src/presentation/assets/svg/document_shimmer_strings.ts +17 -0
  453. package/src/presentation/assets/svg/instruction_svg_strings.ts +34 -12
  454. package/src/presentation/components/__tests__/enhanced_smart_selfie_animation_frames.test.ts +1 -3
  455. package/src/presentation/components/__tests__/use_smile_id_enhanced_smart_selfie_clip.test.tsx +12 -8
  456. package/src/presentation/components/__tests__/use_smile_id_guideline_thumbnail.test.tsx +34 -1
  457. package/src/presentation/components/__tests__/use_smile_id_instructions_hero.test.tsx +71 -0
  458. package/src/presentation/components/__tests__/use_smile_id_oval_border_palette.test.ts +7 -5
  459. package/src/presentation/components/helpers/enhanced_smart_selfie_animation_frames.ts +0 -6
  460. package/src/presentation/components/icons/index.tsx +65 -18
  461. package/src/presentation/components/use_smile_id_attribution.tsx +1 -1
  462. package/src/presentation/components/use_smile_id_button.tsx +4 -4
  463. package/src/presentation/components/use_smile_id_capture_content.tsx +36 -12
  464. package/src/presentation/components/use_smile_id_captured_document_image.tsx +3 -8
  465. package/src/presentation/components/use_smile_id_document_capture_controls.tsx +103 -39
  466. package/src/presentation/components/use_smile_id_document_overlay.tsx +134 -44
  467. package/src/presentation/components/use_smile_id_document_shimmer.tsx +51 -0
  468. package/src/presentation/components/use_smile_id_enhanced_smart_selfie_clip.tsx +9 -6
  469. package/src/presentation/components/use_smile_id_guideline_thumbnail.tsx +131 -2
  470. package/src/presentation/components/use_smile_id_instructions_hero.tsx +111 -60
  471. package/src/presentation/components/use_smile_id_oval_border_palette.ts +7 -3
  472. package/src/presentation/flow/__tests__/document_flow_navigation.test.ts +203 -4
  473. package/src/presentation/flow/__tests__/flow_navigation_manager.test.ts +49 -0
  474. package/src/presentation/flow/dsl/builder/__tests__/config_builder.test.ts +25 -0
  475. package/src/presentation/flow/dsl/builder/config_builder.ts +35 -0
  476. package/src/presentation/flow/dsl/builder/ml_builder.ts +13 -4
  477. package/src/presentation/flow/dsl/builder/screens_builder.ts +110 -12
  478. package/src/presentation/flow/dsl/builder/theme_builder.ts +19 -2
  479. package/src/presentation/flow/dsl/use_smile_id_builder.tsx +6 -4
  480. package/src/presentation/flow/dsl/use_smile_id_flow_builder.ts +62 -36
  481. package/src/presentation/flow/flow_navigation_manager.ts +185 -14
  482. package/src/presentation/flow/model/instruction_guideline.ts +6 -0
  483. package/src/presentation/flow/model/instructions_defaults.ts +104 -26
  484. package/src/presentation/flow/screen/orchestrated_capture_screen.tsx +60 -12
  485. package/src/presentation/flow/screen/orchestrated_consent_screen.tsx +5 -0
  486. package/src/presentation/flow/screen/orchestrated_instructions_screen.tsx +1 -0
  487. package/src/presentation/flow/screen/orchestrated_preview_screen.tsx +4 -14
  488. package/src/presentation/flow/screen/orchestrated_processing_screen.tsx +3 -3
  489. package/src/presentation/flow/use_smile_id_flow.tsx +11 -4
  490. package/src/presentation/flow/validation/__tests__/flow_validator.test.ts +61 -1
  491. package/src/presentation/flow/validation/__tests__/job_type_validator.test.ts +64 -0
  492. package/src/presentation/flow/validation/flow_validator.ts +55 -26
  493. package/src/presentation/flow/validation/job_type_validator.ts +24 -0
  494. package/src/presentation/screen/__tests__/capture_ui_state.test.ts +66 -47
  495. package/src/presentation/screen/__tests__/ess_turn_haptics.test.ts +15 -11
  496. package/src/presentation/screen/__tests__/instructions_screen_helpers.test.ts +15 -3
  497. package/src/presentation/screen/__tests__/scan_state_to_overlay_state.test.ts +47 -27
  498. package/src/presentation/screen/__tests__/use_smile_id_capture_screen.test.tsx +182 -18
  499. package/src/presentation/screen/__tests__/use_smile_id_document_back_instructions.test.tsx +1 -1
  500. package/src/presentation/screen/__tests__/use_smile_id_preview_screen.test.tsx +10 -40
  501. package/src/presentation/screen/helpers/__tests__/use_capture_orientation_lock.test.tsx +212 -0
  502. package/src/presentation/screen/helpers/capture_screen_helpers.ts +1 -0
  503. package/src/presentation/screen/helpers/capture_ui_state.ts +27 -27
  504. package/src/presentation/screen/helpers/ess_turn_haptics.ts +9 -9
  505. package/src/presentation/screen/helpers/instructions_screen_helpers.ts +7 -2
  506. package/src/presentation/screen/helpers/scan_state_to_overlay_state.ts +16 -13
  507. package/src/presentation/screen/helpers/use_capture_orientation_lock.ts +69 -7
  508. package/src/presentation/screen/use_smile_id_capture_screen.tsx +280 -54
  509. package/src/presentation/screen/use_smile_id_consent_screen.tsx +16 -5
  510. package/src/presentation/screen/use_smile_id_document_back_instructions.tsx +14 -23
  511. package/src/presentation/screen/use_smile_id_document_preview_screen.tsx +33 -23
  512. package/src/presentation/screen/use_smile_id_instructions_screen.tsx +4 -0
  513. package/src/presentation/screen/use_smile_id_preview_screen.tsx +21 -53
  514. package/src/presentation/screen/use_smile_id_processing_screen.tsx +8 -8
  515. package/src/presentation/theme/theme.ts +21 -19
  516. package/src/presentation/utils/__tests__/locale_utils.test.ts +46 -5
  517. package/src/presentation/utils/force_max_brightness.tsx +4 -4
  518. package/src/presentation/utils/locale_utils.ts +13 -4
  519. package/src/testing/__tests__/fake_face_analyzer.test.ts +42 -0
  520. package/src/testing/__tests__/scenario_expectations.test.ts +110 -0
  521. package/src/testing/__tests__/scenario_loader.test.ts +64 -0
  522. package/src/testing/fake_face_analyzer.ts +82 -0
  523. package/src/testing/index.ts +15 -0
  524. package/src/testing/scenario_expectations.ts +87 -0
  525. package/src/testing/scenario_loader.ts +83 -0
  526. package/src/testing/scripted_scan_results.ts +66 -0
  527. package/dist/camera/frame_processor_plugin.d.ts +0 -28
  528. package/dist/camera/frame_processor_plugin.d.ts.map +0 -1
  529. package/dist/camera/frame_processor_plugin.js +0 -21
  530. package/dist/camera/frame_processor_plugin.js.map +0 -1
  531. package/dist/camera/use_smile_id_frame_processor.d.ts +0 -38
  532. package/dist/camera/use_smile_id_frame_processor.d.ts.map +0 -1
  533. package/dist/camera/use_smile_id_frame_processor.js +0 -2
  534. package/dist/camera/use_smile_id_frame_processor.js.map +0 -1
  535. package/dist/presentation/components/use_smile_id_document_frame_glyph.d.ts +0 -17
  536. package/dist/presentation/components/use_smile_id_document_frame_glyph.d.ts.map +0 -1
  537. package/dist/presentation/components/use_smile_id_document_frame_glyph.js +0 -17
  538. package/dist/presentation/components/use_smile_id_document_frame_glyph.js.map +0 -1
  539. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.d.ts +0 -24
  540. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.d.ts.map +0 -1
  541. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.js +0 -91
  542. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.js.map +0 -1
  543. package/dist/presentation/components/use_smile_id_face_silhouette_overlay.d.ts +0 -15
  544. package/dist/presentation/components/use_smile_id_face_silhouette_overlay.d.ts.map +0 -1
  545. package/dist/presentation/components/use_smile_id_face_silhouette_overlay.js +0 -19
  546. package/dist/presentation/components/use_smile_id_face_silhouette_overlay.js.map +0 -1
  547. package/dist/presentation/components/use_smile_id_instruction_card.d.ts +0 -31
  548. package/dist/presentation/components/use_smile_id_instruction_card.d.ts.map +0 -1
  549. package/dist/presentation/components/use_smile_id_instruction_card.js +0 -43
  550. package/dist/presentation/components/use_smile_id_instruction_card.js.map +0 -1
  551. package/dist/presentation/screen/helpers/use_document_orientation_lock.d.ts +0 -24
  552. package/dist/presentation/screen/helpers/use_document_orientation_lock.d.ts.map +0 -1
  553. package/dist/presentation/screen/helpers/use_document_orientation_lock.js +0 -47
  554. package/dist/presentation/screen/helpers/use_document_orientation_lock.js.map +0 -1
  555. package/src/presentation/components/use_smile_id_document_frame_glyph.tsx +0 -162
  556. package/src/presentation/components/use_smile_id_face_silhouette_overlay.tsx +0 -27
@@ -1,16 +1,16 @@
1
1
  import { describe, expect, it, vi, beforeEach } from "vitest";
2
2
  import * as Haptics from "expo-haptics";
3
- import type { ScanState } from "@smileid/usesmileid_bridge";
4
- import { ScanStateType } from "@smileid/usesmileid_bridge";
3
+ import type { UseSmileIDScanState } from "@smileid/usesmileid_bridge";
4
+ import { UseSmileIDScanStateType } from "@smileid/usesmileid_bridge";
5
5
  import {
6
6
  essTurnHaptic,
7
7
  triggerEssTurnHaptic,
8
8
  } from "../helpers/ess_turn_haptics";
9
9
 
10
- const headTurn = (direction?: "left" | "right" | "up"): ScanState =>
10
+ const headTurn = (direction?: "left" | "right" | "up"): UseSmileIDScanState =>
11
11
  direction === undefined
12
- ? { type: ScanStateType.HeadTurn }
13
- : { type: ScanStateType.HeadTurn, currentDirection: direction };
12
+ ? { type: UseSmileIDScanStateType.HeadTurn }
13
+ : { type: UseSmileIDScanStateType.HeadTurn, currentDirection: direction };
14
14
 
15
15
  describe("essTurnHaptic", () => {
16
16
  it("fires intermediate when the requested direction advances", () => {
@@ -24,9 +24,9 @@ describe("essTurnHaptic", () => {
24
24
 
25
25
  it("fires final when leaving the head-turn phase toward capture", () => {
26
26
  for (const next of [
27
- ScanStateType.Found,
28
- ScanStateType.Satisfied,
29
- ScanStateType.Finished,
27
+ UseSmileIDScanStateType.Found,
28
+ UseSmileIDScanStateType.Satisfied,
29
+ UseSmileIDScanStateType.Finished,
30
30
  ] as const) {
31
31
  expect(essTurnHaptic(headTurn("up"), { type: next })).toBe("final");
32
32
  }
@@ -34,10 +34,14 @@ describe("essTurnHaptic", () => {
34
34
 
35
35
  it("never fires on a reset (head turn abandoned to initial / timeout)", () => {
36
36
  expect(
37
- essTurnHaptic(headTurn("left"), { type: ScanStateType.Initial }),
37
+ essTurnHaptic(headTurn("left"), {
38
+ type: UseSmileIDScanStateType.Initial,
39
+ }),
38
40
  ).toBeNull();
39
41
  expect(
40
- essTurnHaptic(headTurn("left"), { type: ScanStateType.Timeout }),
42
+ essTurnHaptic(headTurn("left"), {
43
+ type: UseSmileIDScanStateType.Timeout,
44
+ }),
41
45
  ).toBeNull();
42
46
  });
43
47
 
@@ -48,7 +52,7 @@ describe("essTurnHaptic", () => {
48
52
  it("does not fire when the previous state was not a directed head turn", () => {
49
53
  // Entering a head turn is not completing one.
50
54
  expect(
51
- essTurnHaptic({ type: ScanStateType.Found }, headTurn("left")),
55
+ essTurnHaptic({ type: UseSmileIDScanStateType.Found }, headTurn("left")),
52
56
  ).toBeNull();
53
57
  // A head turn with no direction yet has nothing to complete.
54
58
  expect(essTurnHaptic(headTurn(), headTurn("left"))).toBeNull();
@@ -6,7 +6,9 @@ import {
6
6
  } from "../helpers/instructions_screen_helpers";
7
7
  import {
8
8
  DOCUMENT_GREEN_BOOK_HERO_ANIMATION,
9
- DOCUMENT_GUIDELINES,
9
+ DOCUMENT_GUIDELINES_GENERIC,
10
+ DOCUMENT_GUIDELINES_GREEN_BOOK,
11
+ DOCUMENT_GUIDELINES_PASSPORT,
10
12
  DOCUMENT_HERO_ANIMATION,
11
13
  ESS_HERO_ANIMATION,
12
14
  SELFIE_GUIDELINES,
@@ -85,7 +87,7 @@ describe("resolveInstructionsConfig — document variant", () => {
85
87
  loc,
86
88
  );
87
89
  expect(resolved.titleEmphasis).toBe("Green Book");
88
- expect(resolved.guidelines).toBe(DOCUMENT_GUIDELINES);
90
+ expect(resolved.guidelines).toBe(DOCUMENT_GUIDELINES_GREEN_BOOK);
89
91
  expect(resolved.heroSource).toBe(DOCUMENT_GREEN_BOOK_HERO_ANIMATION);
90
92
  expect(resolved.showHeroOval).toBe(false);
91
93
  expect(resolved.showHeroOvalProgress).toBe(false);
@@ -93,7 +95,7 @@ describe("resolveInstructionsConfig — document variant", () => {
93
95
  expect(resolved.titlePrefix).toBe(loc.siInstructionsTitlePrefix);
94
96
  });
95
97
 
96
- it("falls back to the generic document hero for GenericDocument", () => {
98
+ it("falls back to the generic document hero + guidelines for GenericDocument", () => {
97
99
  const resolved = resolveInstructionsConfig(
98
100
  {},
99
101
  {
@@ -103,9 +105,19 @@ describe("resolveInstructionsConfig — document variant", () => {
103
105
  loc,
104
106
  );
105
107
  expect(resolved.heroSource).toBe(DOCUMENT_HERO_ANIMATION);
108
+ expect(resolved.guidelines).toBe(DOCUMENT_GUIDELINES_GENERIC);
106
109
  expect(resolved.titleEmphasis).toBe("Document");
107
110
  });
108
111
 
112
+ it("uses the passport guidelines for a passport document", () => {
113
+ const resolved = resolveInstructionsConfig(
114
+ {},
115
+ { enhancedLivenessEnabled: false, documentType: DocumentType.Passport },
116
+ loc,
117
+ );
118
+ expect(resolved.guidelines).toBe(DOCUMENT_GUIDELINES_PASSPORT);
119
+ });
120
+
109
121
  it("respects partner title/guideline overrides but always hides the oval for documents", () => {
110
122
  const customGuidelines: InstructionGuideline[] = [SELFIE_GUIDELINES[0]!];
111
123
  const resolved = resolveInstructionsConfig(
@@ -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(
@@ -11,19 +11,37 @@ import * as Brightness from "expo-brightness";
11
11
  import { StatusBar } from "react-native";
12
12
  import { UseSmileIDCaptureScreen } from "../use_smile_id_capture_screen";
13
13
  import { CaptureType } from "../../../core/models/ml_config";
14
+ import { DocumentCaptureMode } from "../../../core/models/document_capture_mode";
15
+ import { mockedTakePhoto } from "../../../__tests__/setup_react_native";
14
16
  import { enStrings } from "../../../l10n/strings_en";
15
17
  import {
16
- ScanStateType,
18
+ UseSmileIDScanStateType,
17
19
  CaptureReadyEventKind,
18
20
  } from "@smileid/usesmileid_bridge";
19
21
  import type {
20
- ScanState,
22
+ UseSmileIDScanState,
21
23
  CaptureReadyEvent,
22
24
  FaceScanResult,
23
25
  } from "@smileid/usesmileid_bridge";
26
+ import { scriptedFaceScanResults } from "../../../testing/scripted_scan_results";
27
+ import { parseScriptedScenario } from "../../../testing/scenario_loader";
24
28
  import { isSessionBoundary } from "../helpers/capture_ui_state";
25
29
  import { UseSmileIDFeedbackDebouncer } from "../helpers/feedback_debouncer";
26
30
  import { UseSmileIDMotion } from "../../theme/use_smile_id_motion";
31
+ import { readFileSync } from "node:fs";
32
+ import { dirname, join } from "node:path";
33
+
34
+ // The shared scenario set lives at the repo root (e2e/scenarios/), outside this
35
+ // package's tsc rootDir (./src), so the test reads selfie-happy-path.json at run
36
+ // time. These minimal ambient decls keep the read typed without pulling
37
+ // @types/node in (which would collide with react-native's global timer types).
38
+ declare module "node:fs" {
39
+ export function readFileSync(path: string, encoding: "utf8"): string;
40
+ }
41
+ declare module "node:path" {
42
+ export function dirname(path: string): string;
43
+ export function join(...parts: string[]): string;
44
+ }
27
45
 
28
46
  // Capture the screen's per-frame `onResult` so tests can drive synthetic
29
47
  // sequences — the vision-camera worklet can't run in vitest, and `onResult`
@@ -195,6 +213,18 @@ describe("UseSmileIDCaptureScreen", () => {
195
213
  expect(mockedUseCameraDevice).toHaveBeenCalledWith("back");
196
214
  });
197
215
 
216
+ it("uses the back lens for an agent-mode selfie capture", () => {
217
+ const { root } = render(
218
+ <UseSmileIDCaptureScreen
219
+ analyzer={fakeAnalyzer}
220
+ captureType={CaptureType.selfie}
221
+ allowAgentMode
222
+ />,
223
+ );
224
+ expect(findByTestID(root, "si_capture_camera_preview")).not.toBeNull();
225
+ expect(mockedUseCameraDevice).toHaveBeenCalledWith("back");
226
+ });
227
+
198
228
  it("shows a placeholder (not the camera) when permission is undetermined", () => {
199
229
  const requestPermission = vi.fn(async () => true);
200
230
  mockedUseCameraPermission.mockReturnValue({
@@ -278,9 +308,9 @@ describe("UseSmileIDCaptureScreen", () => {
278
308
  // NOTE: the legacy `overlayState` / `captureProgress` prop-driven tests
279
309
  // were removed in Phase 3 of the per-frame migration. The capture
280
310
  // screen now owns its overlay state internally (derived from the
281
- // analyzer's per-frame ScanState), so there's no external prop to
311
+ // analyzer's per-frame UseSmileIDScanState), so there's no external prop to
282
312
  // pin against. Phase 4 follow-up re-authors these as analyzer-driven
283
- // tests that feed synthetic ScanState transitions through a mock
313
+ // tests that feed synthetic UseSmileIDScanState transitions through a mock
284
314
  // analyzer + frame stream.
285
315
 
286
316
  it("forwards the back tap to onBack when the back button is supplied", () => {
@@ -331,7 +361,7 @@ describe("UseSmileIDCaptureScreen", () => {
331
361
  });
332
362
 
333
363
  // Removed in Phase 3 — feedback text is now driven by the analyzer's
334
- // ScanState rather than a partner-supplied overlayState prop. Phase 4
364
+ // UseSmileIDScanState rather than a partner-supplied overlayState prop. Phase 4
335
365
  // re-authors this against a mock analyzer that yields a synthetic
336
366
  // "found + feedback=si_capture_low_light" result through the
337
367
  // frame stream.
@@ -507,22 +537,22 @@ describe("UseSmileIDCaptureScreen", () => {
507
537
  // Stale events → unsatisfied reset (drops them) → fresh events → finished.
508
538
  emit({
509
539
  output,
510
- state: { type: ScanStateType.Found },
540
+ state: { type: UseSmileIDScanStateType.Found },
511
541
  capturedEvents: [staleSelfie, staleLiveness],
512
542
  });
513
543
  emit({
514
544
  output,
515
- state: { type: ScanStateType.Unsatisfied },
545
+ state: { type: UseSmileIDScanStateType.Unsatisfied },
516
546
  capturedEvents: [],
517
547
  });
518
548
  emit({
519
549
  output,
520
- state: { type: ScanStateType.Found },
550
+ state: { type: UseSmileIDScanStateType.Found },
521
551
  capturedEvents: [freshSelfie, freshLiveness],
522
552
  });
523
553
  emit({
524
554
  output,
525
- state: { type: ScanStateType.Finished },
555
+ state: { type: UseSmileIDScanStateType.Finished },
526
556
  capturedEvents: [],
527
557
  });
528
558
 
@@ -534,10 +564,64 @@ describe("UseSmileIDCaptureScreen", () => {
534
564
 
535
565
  expect(onCaptureComplete).toHaveBeenCalledTimes(1);
536
566
  // Only the post-reset events survive — the stale ones were cleared.
537
- expect(onCaptureComplete).toHaveBeenCalledWith([
538
- freshSelfie,
539
- freshLiveness,
540
- ]);
567
+ // The capture telemetry (duration + retries) travels as a second argument;
568
+ // the retry count reflects the one unsatisfied reset observed above.
569
+ expect(onCaptureComplete).toHaveBeenCalledWith(
570
+ [freshSelfie, freshLiveness],
571
+ expect.objectContaining({ retries: 1 }),
572
+ );
573
+ });
574
+
575
+ it("replays the shared selfie scenario to a full capture completion", async () => {
576
+ // Drives the capture gap headlessly through the frame stream's onResult
577
+ // seam: the shared scenario replayed to `finished` must reach
578
+ // onCaptureComplete with the scripted selfie + liveness events.
579
+ const onCaptureComplete = vi.fn();
580
+ const analyzer = makeFakeAnalyzer();
581
+ capturedOnResult = null;
582
+ render(
583
+ <UseSmileIDCaptureScreen
584
+ analyzer={analyzer}
585
+ captureType={CaptureType.selfie}
586
+ onCaptureComplete={onCaptureComplete}
587
+ />,
588
+ );
589
+ expect(capturedOnResult).not.toBeNull();
590
+
591
+ // Consume the real shared scenario (not a hand-written copy) so a drift in
592
+ // the canonical script is caught here rather than silently diverging.
593
+ const scenarioDir = dirname(import.meta.url.replace(/^file:\/\//, ""));
594
+ const scenario = parseScriptedScenario(
595
+ JSON.parse(
596
+ readFileSync(
597
+ join(
598
+ scenarioDir,
599
+ "../../../../../e2e/scenarios/selfie-happy-path.json",
600
+ ),
601
+ "utf8",
602
+ ),
603
+ ),
604
+ );
605
+ for (const result of scriptedFaceScanResults(scenario, {
606
+ livenessCount: 2,
607
+ })) {
608
+ act(() => {
609
+ capturedOnResult!(result);
610
+ });
611
+ }
612
+ await act(async () => {
613
+ await Promise.resolve();
614
+ await Promise.resolve();
615
+ });
616
+
617
+ expect(onCaptureComplete).toHaveBeenCalledTimes(1);
618
+ const events = onCaptureComplete.mock.calls[0][0] as CaptureReadyEvent[];
619
+ expect(
620
+ events.filter((e) => e.kind === CaptureReadyEventKind.Selfie),
621
+ ).toHaveLength(1);
622
+ expect(
623
+ events.filter((e) => e.kind === CaptureReadyEventKind.Liveness),
624
+ ).toHaveLength(2);
541
625
  });
542
626
  });
543
627
 
@@ -564,9 +648,9 @@ describe("session-boundary epoch reset — debouncer regression", () => {
564
648
  isImmediate: () => false,
565
649
  });
566
650
 
567
- let previousScanState: ScanState | null = null;
651
+ let previousScanState: UseSmileIDScanState | null = null;
568
652
  const processTransition = (
569
- nextScanState: ScanState,
653
+ nextScanState: UseSmileIDScanState,
570
654
  nextFeedbackKey: string,
571
655
  ) => {
572
656
  const boundary =
@@ -583,7 +667,7 @@ describe("session-boundary epoch reset — debouncer regression", () => {
583
667
 
584
668
  // found — smile key settles after the debounce window.
585
669
  processTransition(
586
- { type: ScanStateType.Found, feedback: "si_capture_smile" },
670
+ { type: UseSmileIDScanStateType.Found, feedback: "si_capture_smile" },
587
671
  "si_capture_smile",
588
672
  );
589
673
  vi.advanceTimersByTime(UseSmileIDMotion.feedbackDebounce);
@@ -591,7 +675,7 @@ describe("session-boundary epoch reset — debouncer regression", () => {
591
675
 
592
676
  // Entering unsatisfied is not a boundary — no reset.
593
677
  processTransition(
594
- { type: ScanStateType.Unsatisfied },
678
+ { type: UseSmileIDScanStateType.Unsatisfied },
595
679
  "si_selfie_capture_unsatisfied",
596
680
  );
597
681
  vi.advanceTimersByTime(UseSmileIDMotion.feedbackDebounce);
@@ -603,7 +687,7 @@ describe("session-boundary epoch reset — debouncer regression", () => {
603
687
  // Leaving unsatisfied is a boundary — without the reset the repeated
604
688
  // smile key would be suppressed as a duplicate.
605
689
  processTransition(
606
- { type: ScanStateType.Found, feedback: "si_capture_smile" },
690
+ { type: UseSmileIDScanStateType.Found, feedback: "si_capture_smile" },
607
691
  "si_capture_smile",
608
692
  );
609
693
  // seed() emits synchronously; no timer advance needed.
@@ -613,4 +697,84 @@ describe("session-boundary epoch reset — debouncer regression", () => {
613
697
  "si_capture_smile",
614
698
  ]);
615
699
  });
700
+
701
+ // Document capture has no Start button, so a scan timeout has to leave the
702
+ // user a way forward — the sibling SDKs surface the manual shutter as the
703
+ // recovery affordance (their shared scan state sets `showCaptureButton` on
704
+ // the timeout state). Without these, a timed-out flow is a dead end: only
705
+ // Back and ✕ remain.
706
+ describe("document capture timeout recovery", () => {
707
+ function renderDocumentScreen(props: {
708
+ readonly captureMode: ReturnType<typeof DocumentCaptureMode.AutoCapture>;
709
+ readonly allowGalleryUpload?: boolean;
710
+ }) {
711
+ const tree = render(
712
+ <UseSmileIDCaptureScreen
713
+ analyzer={fakeAnalyzer}
714
+ captureType={CaptureType.document}
715
+ captureMode={props.captureMode}
716
+ allowGalleryUpload={props.allowGalleryUpload ?? true}
717
+ />,
718
+ );
719
+ // The overlay and its controls only mount once the canvas is measured;
720
+ // `onLayout` never fires under the test renderer, so drive it (landscape,
721
+ // as a document capture screen is).
722
+ act(() => {
723
+ findByTestID(tree.root, "si_capture_screen")!.props.onLayout({
724
+ nativeEvent: { layout: { width: 800, height: 400 } },
725
+ });
726
+ });
727
+ return tree;
728
+ }
729
+
730
+ function emitTimeout() {
731
+ expect(capturedOnResult).not.toBeNull();
732
+ act(() => {
733
+ capturedOnResult!({
734
+ output: { faces: [], brightness: 0 },
735
+ state: { type: UseSmileIDScanStateType.Timeout },
736
+ capturedEvents: [],
737
+ });
738
+ });
739
+ }
740
+
741
+ it("offers the manual shutter after a timeout, in every capture mode", () => {
742
+ const { root } = renderDocumentScreen({
743
+ captureMode: DocumentCaptureMode.AutoCapture,
744
+ });
745
+
746
+ emitTimeout();
747
+
748
+ expect(findByTestID(root, "si_document_manual_shutter")).not.toBeNull();
749
+ });
750
+
751
+ it("keeps the gallery button available after a timeout", () => {
752
+ const { root } = renderDocumentScreen({
753
+ captureMode: DocumentCaptureMode.AutoCaptureWithManualFallback({
754
+ activateManualAfterMs: 3000,
755
+ }),
756
+ });
757
+
758
+ emitTimeout();
759
+
760
+ expect(findByTestID(root, "si_document_gallery_upload")).not.toBeNull();
761
+ });
762
+
763
+ it("leaves the manual shutter usable after a timeout", () => {
764
+ const { root } = renderDocumentScreen({
765
+ captureMode: DocumentCaptureMode.ManualCapture,
766
+ });
767
+
768
+ emitTimeout();
769
+
770
+ const shutter = findByTestID(root, "si_document_manual_shutter");
771
+ expect(shutter).not.toBeNull();
772
+ // The timeout must not latch the one-shot delivery gate, or the button
773
+ // renders but does nothing.
774
+ act(() => {
775
+ shutter!.props.onPress();
776
+ });
777
+ expect(mockedTakePhoto).toHaveBeenCalledTimes(1);
778
+ });
779
+ });
616
780
  });
@@ -104,7 +104,7 @@ describe("UseSmileIDDocumentBackInstructions", () => {
104
104
  const skip = findByTestID(root, "si_document_skip_back_button");
105
105
  expect(skip).not.toBeNull();
106
106
  act(() => {
107
- (skip!.props.onPress as () => void)();
107
+ (skip!.props.onClick as () => void)();
108
108
  });
109
109
  expect(onSkip).toHaveBeenCalledTimes(1);
110
110
  });