@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.
- package/CHANGELOG.md +15 -0
- package/README.md +701 -89
- package/dist/camera/camera_defaults.d.ts +14 -9
- package/dist/camera/camera_defaults.d.ts.map +1 -1
- package/dist/camera/camera_defaults.js +11 -9
- package/dist/camera/camera_defaults.js.map +1 -1
- package/dist/camera/orientation_degrees.d.ts +5 -6
- package/dist/camera/orientation_degrees.d.ts.map +1 -1
- package/dist/camera/orientation_degrees.js +5 -6
- package/dist/camera/orientation_degrees.js.map +1 -1
- package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.d.ts +11 -0
- package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.d.ts.map +1 -0
- package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.js +17 -0
- package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.js.map +1 -0
- package/dist/core/exception/capture_validation_exceptions.d.ts +1 -0
- package/dist/core/exception/capture_validation_exceptions.d.ts.map +1 -1
- package/dist/core/exception/capture_validation_exceptions.js +1 -0
- package/dist/core/exception/capture_validation_exceptions.js.map +1 -1
- package/dist/core/exception/index.d.ts +1 -0
- package/dist/core/exception/index.d.ts.map +1 -1
- package/dist/core/exception/index.js +1 -0
- package/dist/core/exception/index.js.map +1 -1
- package/dist/core/exception/use_smile_id_error_code.d.ts +1 -0
- package/dist/core/exception/use_smile_id_error_code.d.ts.map +1 -1
- package/dist/core/exception/use_smile_id_error_code.js +1 -0
- package/dist/core/exception/use_smile_id_error_code.js.map +1 -1
- package/dist/core/models/config.d.ts +19 -0
- package/dist/core/models/config.d.ts.map +1 -1
- package/dist/core/models/document_capture_mode.d.ts +8 -0
- package/dist/core/models/document_capture_mode.d.ts.map +1 -1
- package/dist/core/models/document_capture_mode.js +24 -0
- package/dist/core/models/document_capture_mode.js.map +1 -1
- package/dist/core/models/document_type.d.ts +2 -2
- package/dist/core/models/document_type.d.ts.map +1 -1
- package/dist/core/models/document_type.js +7 -5
- package/dist/core/models/document_type.js.map +1 -1
- package/dist/core/models/global_privacy_control.d.ts +36 -0
- package/dist/core/models/global_privacy_control.d.ts.map +1 -0
- package/dist/core/models/global_privacy_control.js +39 -0
- package/dist/core/models/global_privacy_control.js.map +1 -0
- package/dist/core/models/network_config.d.ts +2 -2
- package/dist/core/models/network_config.js +2 -2
- package/dist/core/models/result.d.ts +9 -8
- package/dist/core/models/result.d.ts.map +1 -1
- package/dist/core/models/result.js +5 -6
- package/dist/core/models/result.js.map +1 -1
- package/dist/data/api/interceptors/smile_auth_interceptor.d.ts.map +1 -1
- package/dist/data/api/interceptors/smile_auth_interceptor.js +3 -17
- package/dist/data/api/interceptors/smile_auth_interceptor.js.map +1 -1
- package/dist/data/api/interceptors/smile_integrity_interceptor.d.ts +11 -0
- package/dist/data/api/interceptors/smile_integrity_interceptor.d.ts.map +1 -1
- package/dist/data/api/interceptors/smile_integrity_interceptor.js +13 -0
- package/dist/data/api/interceptors/smile_integrity_interceptor.js.map +1 -1
- package/dist/data/api/interceptors/smile_request_mac_interceptor.d.ts +8 -0
- package/dist/data/api/interceptors/smile_request_mac_interceptor.d.ts.map +1 -1
- package/dist/data/api/interceptors/smile_request_mac_interceptor.js +11 -0
- package/dist/data/api/interceptors/smile_request_mac_interceptor.js.map +1 -1
- package/dist/data/api/smile_id_api.d.ts +1 -1
- package/dist/data/api/smile_id_api.d.ts.map +1 -1
- package/dist/data/compression/compressible_asset.d.ts +41 -0
- package/dist/data/compression/compressible_asset.d.ts.map +1 -0
- package/dist/data/compression/compressible_asset.js +34 -0
- package/dist/data/compression/compressible_asset.js.map +1 -0
- package/dist/data/compression/payload_compression_config.d.ts +36 -0
- package/dist/data/compression/payload_compression_config.d.ts.map +1 -0
- package/dist/data/compression/payload_compression_config.js +52 -0
- package/dist/data/compression/payload_compression_config.js.map +1 -0
- package/dist/data/compression/payload_compression_runner.d.ts +29 -0
- package/dist/data/compression/payload_compression_runner.d.ts.map +1 -0
- package/dist/data/compression/payload_compression_runner.js +55 -0
- package/dist/data/compression/payload_compression_runner.js.map +1 -0
- package/dist/data/compression/payload_compressor.d.ts +40 -0
- package/dist/data/compression/payload_compressor.d.ts.map +1 -0
- package/dist/data/compression/payload_compressor.js +126 -0
- package/dist/data/compression/payload_compressor.js.map +1 -0
- package/dist/data/compression/uri_compressible_asset.d.ts +23 -0
- package/dist/data/compression/uri_compressible_asset.d.ts.map +1 -0
- package/dist/data/compression/uri_compressible_asset.js +77 -0
- package/dist/data/compression/uri_compressible_asset.js.map +1 -0
- package/dist/data/dsl/builder/cache_config_builder.d.ts +2 -1
- package/dist/data/dsl/builder/cache_config_builder.d.ts.map +1 -1
- package/dist/data/dsl/builder/cache_config_builder.js +2 -1
- package/dist/data/dsl/builder/cache_config_builder.js.map +1 -1
- package/dist/data/dsl/builder/config_builder.d.ts +40 -14
- package/dist/data/dsl/builder/config_builder.d.ts.map +1 -1
- package/dist/data/dsl/builder/config_builder.js +40 -14
- package/dist/data/dsl/builder/config_builder.js.map +1 -1
- package/dist/data/dsl/builder/interceptor_config_builder.d.ts +9 -7
- package/dist/data/dsl/builder/interceptor_config_builder.d.ts.map +1 -1
- package/dist/data/dsl/builder/interceptor_config_builder.js +9 -7
- package/dist/data/dsl/builder/interceptor_config_builder.js.map +1 -1
- package/dist/data/dsl/builder/retry_config_builder.d.ts +19 -4
- package/dist/data/dsl/builder/retry_config_builder.d.ts.map +1 -1
- package/dist/data/dsl/builder/retry_config_builder.js +21 -6
- package/dist/data/dsl/builder/retry_config_builder.js.map +1 -1
- package/dist/data/dsl/builder/timeout_config_builder.d.ts +4 -0
- package/dist/data/dsl/builder/timeout_config_builder.d.ts.map +1 -1
- package/dist/data/dsl/builder/timeout_config_builder.js +4 -0
- package/dist/data/dsl/builder/timeout_config_builder.js.map +1 -1
- package/dist/data/dsl/use_smile_id_network_builder.d.ts +17 -0
- package/dist/data/dsl/use_smile_id_network_builder.d.ts.map +1 -1
- package/dist/data/dsl/use_smile_id_network_builder.js +17 -0
- package/dist/data/dsl/use_smile_id_network_builder.js.map +1 -1
- package/dist/data/factory/networking_factory.d.ts.map +1 -1
- package/dist/data/factory/networking_factory.js +11 -1
- package/dist/data/factory/networking_factory.js.map +1 -1
- package/dist/data/repository/use_smile_id_repository_impl.d.ts +6 -0
- package/dist/data/repository/use_smile_id_repository_impl.d.ts.map +1 -1
- package/dist/data/repository/use_smile_id_repository_impl.js +82 -8
- package/dist/data/repository/use_smile_id_repository_impl.js.map +1 -1
- package/dist/data/security/request_canonicalizer.d.ts.map +1 -1
- package/dist/data/security/request_canonicalizer.js +14 -2
- package/dist/data/security/request_canonicalizer.js.map +1 -1
- package/dist/data/security/security_policy.d.ts +43 -0
- package/dist/data/security/security_policy.d.ts.map +1 -0
- package/dist/data/security/security_policy.js +61 -0
- package/dist/data/security/security_policy.js.map +1 -0
- package/dist/data/smile_id_urls.d.ts +1 -1
- package/dist/data/smile_id_urls.js +1 -1
- package/dist/data/smile_id_urls.js.map +1 -1
- package/dist/data/util/retry_util.d.ts +2 -2
- package/dist/data/util/retry_util.d.ts.map +1 -1
- package/dist/data/util/retry_util.js +7 -1
- package/dist/data/util/retry_util.js.map +1 -1
- package/dist/data/util/use_smile_id_token_decoder.d.ts +22 -0
- package/dist/data/util/use_smile_id_token_decoder.d.ts.map +1 -1
- package/dist/data/util/use_smile_id_token_decoder.js +58 -24
- package/dist/data/util/use_smile_id_token_decoder.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/l10n/strings_en.d.ts +2 -1
- package/dist/l10n/strings_en.d.ts.map +1 -1
- package/dist/l10n/strings_en.js +2 -1
- package/dist/l10n/strings_en.js.map +1 -1
- package/dist/l10n/use_smile_id_localizations.d.ts +1 -0
- package/dist/l10n/use_smile_id_localizations.d.ts.map +1 -1
- package/dist/l10n/use_smile_id_localizations.js +3 -0
- package/dist/l10n/use_smile_id_localizations.js.map +1 -1
- package/dist/metadata/builder_configuration.d.ts +44 -0
- package/dist/metadata/builder_configuration.d.ts.map +1 -0
- package/dist/metadata/builder_configuration.js +35 -0
- package/dist/metadata/builder_configuration.js.map +1 -0
- package/dist/metadata/captured_image_properties.d.ts +11 -0
- package/dist/metadata/captured_image_properties.d.ts.map +1 -0
- package/dist/metadata/captured_image_properties.js +11 -0
- package/dist/metadata/captured_image_properties.js.map +1 -0
- package/dist/metadata/device_orientation_collector.d.ts +17 -0
- package/dist/metadata/device_orientation_collector.d.ts.map +1 -0
- package/dist/metadata/device_orientation_collector.js +66 -0
- package/dist/metadata/device_orientation_collector.js.map +1 -0
- package/dist/metadata/geolocation.d.ts +20 -0
- package/dist/metadata/geolocation.d.ts.map +1 -0
- package/dist/metadata/geolocation.js +40 -0
- package/dist/metadata/geolocation.js.map +1 -0
- package/dist/metadata/metadata_configuration_mappers.d.ts +47 -0
- package/dist/metadata/metadata_configuration_mappers.d.ts.map +1 -0
- package/dist/metadata/metadata_configuration_mappers.js +178 -0
- package/dist/metadata/metadata_configuration_mappers.js.map +1 -0
- package/dist/metadata/model_configuration.d.ts +41 -0
- package/dist/metadata/model_configuration.d.ts.map +1 -0
- package/dist/metadata/model_configuration.js +44 -0
- package/dist/metadata/model_configuration.js.map +1 -0
- package/dist/metadata/optional_native_modules.d.ts +79 -3
- package/dist/metadata/optional_native_modules.d.ts.map +1 -1
- package/dist/metadata/optional_native_modules.js +108 -3
- package/dist/metadata/optional_native_modules.js.map +1 -1
- package/dist/metadata/use_smile_id_metadata.d.ts +45 -7
- package/dist/metadata/use_smile_id_metadata.d.ts.map +1 -1
- package/dist/metadata/use_smile_id_metadata.js +85 -13
- package/dist/metadata/use_smile_id_metadata.js.map +1 -1
- package/dist/metadata/use_smile_id_metadata_factory.d.ts +37 -0
- package/dist/metadata/use_smile_id_metadata_factory.d.ts.map +1 -1
- package/dist/metadata/use_smile_id_metadata_factory.js +197 -16
- package/dist/metadata/use_smile_id_metadata_factory.js.map +1 -1
- package/dist/presentation/assets/svg/document_shimmer_strings.d.ts +14 -0
- package/dist/presentation/assets/svg/document_shimmer_strings.d.ts.map +1 -0
- package/dist/presentation/assets/svg/document_shimmer_strings.js +14 -0
- package/dist/presentation/assets/svg/document_shimmer_strings.js.map +1 -0
- package/dist/presentation/assets/svg/instruction_svg_strings.d.ts +12 -4
- package/dist/presentation/assets/svg/instruction_svg_strings.d.ts.map +1 -1
- package/dist/presentation/assets/svg/instruction_svg_strings.js +19 -8
- package/dist/presentation/assets/svg/instruction_svg_strings.js.map +1 -1
- package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.d.ts +0 -5
- package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.d.ts.map +1 -1
- package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.js +0 -5
- package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.js.map +1 -1
- package/dist/presentation/components/icons/index.d.ts +24 -8
- package/dist/presentation/components/icons/index.d.ts.map +1 -1
- package/dist/presentation/components/icons/index.js +31 -11
- package/dist/presentation/components/icons/index.js.map +1 -1
- package/dist/presentation/components/use_smile_id_attribution.d.ts +1 -1
- package/dist/presentation/components/use_smile_id_button.d.ts +2 -2
- package/dist/presentation/components/use_smile_id_button.js +4 -4
- package/dist/presentation/components/use_smile_id_button.js.map +1 -1
- package/dist/presentation/components/use_smile_id_capture_content.d.ts +13 -0
- package/dist/presentation/components/use_smile_id_capture_content.d.ts.map +1 -1
- package/dist/presentation/components/use_smile_id_capture_content.js +15 -9
- package/dist/presentation/components/use_smile_id_capture_content.js.map +1 -1
- package/dist/presentation/components/use_smile_id_captured_document_image.d.ts +2 -3
- package/dist/presentation/components/use_smile_id_captured_document_image.d.ts.map +1 -1
- package/dist/presentation/components/use_smile_id_captured_document_image.js +1 -3
- package/dist/presentation/components/use_smile_id_captured_document_image.js.map +1 -1
- package/dist/presentation/components/use_smile_id_document_capture_controls.d.ts +12 -6
- package/dist/presentation/components/use_smile_id_document_capture_controls.d.ts.map +1 -1
- package/dist/presentation/components/use_smile_id_document_capture_controls.js +59 -16
- package/dist/presentation/components/use_smile_id_document_capture_controls.js.map +1 -1
- package/dist/presentation/components/use_smile_id_document_overlay.d.ts +22 -5
- package/dist/presentation/components/use_smile_id_document_overlay.d.ts.map +1 -1
- package/dist/presentation/components/use_smile_id_document_overlay.js +80 -40
- package/dist/presentation/components/use_smile_id_document_overlay.js.map +1 -1
- package/dist/presentation/components/use_smile_id_document_shimmer.d.ts +15 -0
- package/dist/presentation/components/use_smile_id_document_shimmer.d.ts.map +1 -0
- package/dist/presentation/components/use_smile_id_document_shimmer.js +23 -0
- package/dist/presentation/components/use_smile_id_document_shimmer.js.map +1 -0
- package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.d.ts +5 -2
- package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.d.ts.map +1 -1
- package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.js +9 -6
- package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.js.map +1 -1
- package/dist/presentation/components/use_smile_id_guideline_thumbnail.d.ts.map +1 -1
- package/dist/presentation/components/use_smile_id_guideline_thumbnail.js +84 -1
- package/dist/presentation/components/use_smile_id_guideline_thumbnail.js.map +1 -1
- package/dist/presentation/components/use_smile_id_instructions_hero.d.ts +3 -1
- package/dist/presentation/components/use_smile_id_instructions_hero.d.ts.map +1 -1
- package/dist/presentation/components/use_smile_id_instructions_hero.js +25 -5
- package/dist/presentation/components/use_smile_id_instructions_hero.js.map +1 -1
- package/dist/presentation/components/use_smile_id_oval_border_palette.d.ts.map +1 -1
- package/dist/presentation/components/use_smile_id_oval_border_palette.js +7 -3
- package/dist/presentation/components/use_smile_id_oval_border_palette.js.map +1 -1
- package/dist/presentation/flow/dsl/builder/config_builder.d.ts +28 -0
- package/dist/presentation/flow/dsl/builder/config_builder.d.ts.map +1 -1
- package/dist/presentation/flow/dsl/builder/config_builder.js +30 -0
- package/dist/presentation/flow/dsl/builder/config_builder.js.map +1 -1
- package/dist/presentation/flow/dsl/builder/ml_builder.d.ts +13 -4
- package/dist/presentation/flow/dsl/builder/ml_builder.d.ts.map +1 -1
- package/dist/presentation/flow/dsl/builder/ml_builder.js +3 -2
- package/dist/presentation/flow/dsl/builder/ml_builder.js.map +1 -1
- package/dist/presentation/flow/dsl/builder/screens_builder.d.ts +110 -12
- package/dist/presentation/flow/dsl/builder/screens_builder.d.ts.map +1 -1
- package/dist/presentation/flow/dsl/builder/screens_builder.js +110 -12
- package/dist/presentation/flow/dsl/builder/screens_builder.js.map +1 -1
- package/dist/presentation/flow/dsl/builder/theme_builder.d.ts +15 -2
- package/dist/presentation/flow/dsl/builder/theme_builder.d.ts.map +1 -1
- package/dist/presentation/flow/dsl/builder/theme_builder.js +15 -2
- package/dist/presentation/flow/dsl/builder/theme_builder.js.map +1 -1
- package/dist/presentation/flow/dsl/use_smile_id_builder.d.ts +6 -4
- package/dist/presentation/flow/dsl/use_smile_id_builder.d.ts.map +1 -1
- package/dist/presentation/flow/dsl/use_smile_id_builder.js.map +1 -1
- package/dist/presentation/flow/dsl/use_smile_id_flow_builder.d.ts +62 -36
- package/dist/presentation/flow/dsl/use_smile_id_flow_builder.d.ts.map +1 -1
- package/dist/presentation/flow/dsl/use_smile_id_flow_builder.js +62 -36
- package/dist/presentation/flow/dsl/use_smile_id_flow_builder.js.map +1 -1
- package/dist/presentation/flow/flow_navigation_manager.d.ts +44 -5
- package/dist/presentation/flow/flow_navigation_manager.d.ts.map +1 -1
- package/dist/presentation/flow/flow_navigation_manager.js +148 -11
- package/dist/presentation/flow/flow_navigation_manager.js.map +1 -1
- package/dist/presentation/flow/model/instruction_guideline.d.ts +9 -0
- package/dist/presentation/flow/model/instruction_guideline.d.ts.map +1 -1
- package/dist/presentation/flow/model/instructions_defaults.d.ts +11 -2
- package/dist/presentation/flow/model/instructions_defaults.d.ts.map +1 -1
- package/dist/presentation/flow/model/instructions_defaults.js +74 -26
- package/dist/presentation/flow/model/instructions_defaults.js.map +1 -1
- package/dist/presentation/flow/screen/orchestrated_capture_screen.d.ts.map +1 -1
- package/dist/presentation/flow/screen/orchestrated_capture_screen.js +48 -14
- package/dist/presentation/flow/screen/orchestrated_capture_screen.js.map +1 -1
- package/dist/presentation/flow/screen/orchestrated_consent_screen.d.ts.map +1 -1
- package/dist/presentation/flow/screen/orchestrated_consent_screen.js +3 -1
- package/dist/presentation/flow/screen/orchestrated_consent_screen.js.map +1 -1
- package/dist/presentation/flow/screen/orchestrated_instructions_screen.js +1 -1
- package/dist/presentation/flow/screen/orchestrated_instructions_screen.js.map +1 -1
- package/dist/presentation/flow/screen/orchestrated_preview_screen.d.ts.map +1 -1
- package/dist/presentation/flow/screen/orchestrated_preview_screen.js +3 -9
- package/dist/presentation/flow/screen/orchestrated_preview_screen.js.map +1 -1
- package/dist/presentation/flow/screen/orchestrated_processing_screen.js +3 -3
- package/dist/presentation/flow/screen/orchestrated_processing_screen.js.map +1 -1
- package/dist/presentation/flow/use_smile_id_flow.d.ts.map +1 -1
- package/dist/presentation/flow/use_smile_id_flow.js +10 -4
- package/dist/presentation/flow/use_smile_id_flow.js.map +1 -1
- package/dist/presentation/flow/validation/flow_validator.d.ts.map +1 -1
- package/dist/presentation/flow/validation/flow_validator.js +42 -20
- package/dist/presentation/flow/validation/flow_validator.js.map +1 -1
- package/dist/presentation/flow/validation/job_type_validator.d.ts.map +1 -1
- package/dist/presentation/flow/validation/job_type_validator.js +14 -0
- package/dist/presentation/flow/validation/job_type_validator.js.map +1 -1
- package/dist/presentation/screen/helpers/capture_screen_helpers.d.ts.map +1 -1
- package/dist/presentation/screen/helpers/capture_screen_helpers.js +1 -0
- package/dist/presentation/screen/helpers/capture_screen_helpers.js.map +1 -1
- package/dist/presentation/screen/helpers/capture_ui_state.d.ts +6 -6
- package/dist/presentation/screen/helpers/capture_ui_state.d.ts.map +1 -1
- package/dist/presentation/screen/helpers/capture_ui_state.js +19 -19
- package/dist/presentation/screen/helpers/capture_ui_state.js.map +1 -1
- package/dist/presentation/screen/helpers/ess_turn_haptics.d.ts +2 -2
- package/dist/presentation/screen/helpers/ess_turn_haptics.d.ts.map +1 -1
- package/dist/presentation/screen/helpers/ess_turn_haptics.js +6 -6
- package/dist/presentation/screen/helpers/ess_turn_haptics.js.map +1 -1
- package/dist/presentation/screen/helpers/instructions_screen_helpers.d.ts +1 -0
- package/dist/presentation/screen/helpers/instructions_screen_helpers.d.ts.map +1 -1
- package/dist/presentation/screen/helpers/instructions_screen_helpers.js +6 -2
- package/dist/presentation/screen/helpers/instructions_screen_helpers.js.map +1 -1
- package/dist/presentation/screen/helpers/scan_state_to_overlay_state.d.ts +5 -5
- package/dist/presentation/screen/helpers/scan_state_to_overlay_state.d.ts.map +1 -1
- package/dist/presentation/screen/helpers/scan_state_to_overlay_state.js +14 -11
- package/dist/presentation/screen/helpers/scan_state_to_overlay_state.js.map +1 -1
- package/dist/presentation/screen/helpers/use_capture_orientation_lock.d.ts +13 -3
- package/dist/presentation/screen/helpers/use_capture_orientation_lock.d.ts.map +1 -1
- package/dist/presentation/screen/helpers/use_capture_orientation_lock.js +48 -6
- package/dist/presentation/screen/helpers/use_capture_orientation_lock.js.map +1 -1
- package/dist/presentation/screen/use_smile_id_capture_screen.d.ts +21 -3
- package/dist/presentation/screen/use_smile_id_capture_screen.d.ts.map +1 -1
- package/dist/presentation/screen/use_smile_id_capture_screen.js +188 -32
- package/dist/presentation/screen/use_smile_id_capture_screen.js.map +1 -1
- package/dist/presentation/screen/use_smile_id_consent_screen.d.ts +7 -0
- package/dist/presentation/screen/use_smile_id_consent_screen.d.ts.map +1 -1
- package/dist/presentation/screen/use_smile_id_consent_screen.js +6 -5
- package/dist/presentation/screen/use_smile_id_consent_screen.js.map +1 -1
- package/dist/presentation/screen/use_smile_id_document_back_instructions.d.ts.map +1 -1
- package/dist/presentation/screen/use_smile_id_document_back_instructions.js +5 -13
- package/dist/presentation/screen/use_smile_id_document_back_instructions.js.map +1 -1
- package/dist/presentation/screen/use_smile_id_document_preview_screen.d.ts +2 -3
- package/dist/presentation/screen/use_smile_id_document_preview_screen.d.ts.map +1 -1
- package/dist/presentation/screen/use_smile_id_document_preview_screen.js +17 -12
- package/dist/presentation/screen/use_smile_id_document_preview_screen.js.map +1 -1
- package/dist/presentation/screen/use_smile_id_instructions_screen.d.ts +2 -0
- package/dist/presentation/screen/use_smile_id_instructions_screen.d.ts.map +1 -1
- package/dist/presentation/screen/use_smile_id_instructions_screen.js +2 -1
- package/dist/presentation/screen/use_smile_id_instructions_screen.js.map +1 -1
- package/dist/presentation/screen/use_smile_id_preview_screen.d.ts +7 -26
- package/dist/presentation/screen/use_smile_id_preview_screen.d.ts.map +1 -1
- package/dist/presentation/screen/use_smile_id_preview_screen.js +10 -20
- package/dist/presentation/screen/use_smile_id_preview_screen.js.map +1 -1
- package/dist/presentation/screen/use_smile_id_processing_screen.d.ts +2 -3
- package/dist/presentation/screen/use_smile_id_processing_screen.d.ts.map +1 -1
- package/dist/presentation/screen/use_smile_id_processing_screen.js +4 -3
- package/dist/presentation/screen/use_smile_id_processing_screen.js.map +1 -1
- package/dist/presentation/theme/theme.d.ts +1 -1
- package/dist/presentation/theme/theme.d.ts.map +1 -1
- package/dist/presentation/theme/theme.js +20 -18
- package/dist/presentation/theme/theme.js.map +1 -1
- package/dist/presentation/utils/force_max_brightness.d.ts +4 -4
- package/dist/presentation/utils/locale_utils.d.ts +10 -4
- package/dist/presentation/utils/locale_utils.d.ts.map +1 -1
- package/dist/presentation/utils/locale_utils.js +13 -5
- package/dist/presentation/utils/locale_utils.js.map +1 -1
- package/dist/testing/fake_face_analyzer.d.ts +43 -0
- package/dist/testing/fake_face_analyzer.d.ts.map +1 -0
- package/dist/testing/fake_face_analyzer.js +52 -0
- package/dist/testing/fake_face_analyzer.js.map +1 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +7 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/scenario_expectations.d.ts +28 -0
- package/dist/testing/scenario_expectations.d.ts.map +1 -0
- package/dist/testing/scenario_expectations.js +65 -0
- package/dist/testing/scenario_expectations.js.map +1 -0
- package/dist/testing/scenario_loader.d.ts +11 -0
- package/dist/testing/scenario_loader.d.ts.map +1 -0
- package/dist/testing/scenario_loader.js +64 -0
- package/dist/testing/scenario_loader.js.map +1 -0
- package/dist/testing/scripted_scan_results.d.ts +17 -0
- package/dist/testing/scripted_scan_results.d.ts.map +1 -0
- package/dist/testing/scripted_scan_results.js +52 -0
- package/dist/testing/scripted_scan_results.js.map +1 -0
- package/package.json +34 -7
- package/src/__tests__/dsl.test.ts +51 -1
- package/src/__tests__/react_native_mock.tsx +8 -0
- package/src/__tests__/setup_react_native.ts +17 -2
- package/src/__tests__/snapshots/__snapshots__/screens_structural.test.tsx.snap +5261 -0
- package/src/__tests__/snapshots/screens_structural.test.tsx +230 -0
- package/src/camera/__tests__/use_smile_id_camera_system.test.ts +103 -0
- package/src/camera/camera_defaults.ts +11 -9
- package/src/camera/orientation_degrees.ts +5 -6
- package/src/core/exception/__tests__/builder_validation_exceptions.test.ts +67 -0
- package/src/core/exception/agent_mode_with_enhanced_liveness_exception.ts +20 -0
- package/src/core/exception/capture_validation_exceptions.ts +1 -0
- package/src/core/exception/index.ts +1 -0
- package/src/core/exception/use_smile_id_error_code.ts +1 -0
- package/src/core/models/__tests__/document_type.test.ts +7 -5
- package/src/core/models/__tests__/flow_models.test.ts +26 -0
- package/src/core/models/config.ts +22 -0
- package/src/core/models/document_capture_mode.ts +27 -0
- package/src/core/models/document_type.ts +7 -5
- package/src/core/models/global_privacy_control.ts +45 -0
- package/src/core/models/network_config.ts +2 -2
- package/src/core/models/result.ts +9 -8
- package/src/data/api/__tests__/smile_id_api.test.ts +1 -1
- package/src/data/api/interceptors/__tests__/gzip_interceptor.test.ts +83 -0
- package/src/data/api/interceptors/__tests__/smile_integrity_interceptor.test.ts +37 -1
- package/src/data/api/interceptors/__tests__/smile_request_mac_interceptor.test.ts +59 -1
- package/src/data/api/interceptors/smile_auth_interceptor.ts +3 -18
- package/src/data/api/interceptors/smile_integrity_interceptor.ts +20 -0
- package/src/data/api/interceptors/smile_request_mac_interceptor.ts +13 -0
- package/src/data/compression/__tests__/payload_compressor.test.ts +200 -0
- package/src/data/compression/__tests__/payload_compressor_real_jpeg.test.ts +226 -0
- package/src/data/compression/compressible_asset.ts +62 -0
- package/src/data/compression/payload_compression_config.ts +53 -0
- package/src/data/compression/payload_compression_runner.ts +102 -0
- package/src/data/compression/payload_compressor.ts +164 -0
- package/src/data/compression/uri_compressible_asset.ts +85 -0
- package/src/data/dsl/builder/__tests__/config_builders.test.ts +62 -0
- package/src/data/dsl/builder/cache_config_builder.ts +3 -1
- package/src/data/dsl/builder/config_builder.ts +45 -14
- package/src/data/dsl/builder/interceptor_config_builder.ts +9 -7
- package/src/data/dsl/builder/retry_config_builder.ts +27 -6
- package/src/data/dsl/builder/timeout_config_builder.ts +7 -0
- package/src/data/dsl/use_smile_id_network_builder.ts +17 -0
- package/src/data/factory/__tests__/retry_gzip_mac_composition.test.ts +163 -0
- package/src/data/factory/__tests__/signed_job_submission_headers.test.ts +1 -1
- package/src/data/factory/networking_factory.ts +14 -1
- package/src/data/repository/__tests__/network_retries.test.ts +117 -0
- package/src/data/repository/__tests__/use_smile_id_repository.test.ts +1 -1
- package/src/data/repository/use_smile_id_repository_impl.ts +96 -9
- package/src/data/security/__tests__/request_canonicalizer.test.ts +132 -0
- package/src/data/security/__tests__/security_policy.test.ts +96 -0
- package/src/data/security/__tests__/smile_id_crypto_manager.test.ts +18 -0
- package/src/data/security/request_canonicalizer.ts +15 -2
- package/src/data/security/security_policy.ts +70 -0
- package/src/data/smile_id_urls.ts +1 -1
- package/src/data/util/__tests__/retry_util.test.ts +25 -0
- package/src/data/util/__tests__/use_smile_id_token_decoder.test.ts +57 -1
- package/src/data/util/retry_util.ts +12 -3
- package/src/data/util/use_smile_id_token_decoder.ts +76 -28
- package/src/index.ts +6 -4
- package/src/l10n/strings_en.ts +2 -1
- package/src/l10n/use_smile_id_localizations.ts +3 -0
- package/src/metadata/__tests__/device_orientation_collector.test.ts +15 -0
- package/src/metadata/__tests__/metadata_configuration_mappers.test.ts +254 -0
- package/src/metadata/__tests__/metadata_configuration_objects.test.ts +86 -0
- package/src/metadata/__tests__/metadata_device_context.test.ts +147 -0
- package/src/metadata/__tests__/metadata_device_os_android.test.ts +18 -0
- package/src/metadata/__tests__/metadata_golden_fixture.json +13 -0
- package/src/metadata/__tests__/metadata_payload_golden.test.ts +193 -0
- package/src/metadata/__tests__/use_smile_id_metadata.test.ts +19 -25
- package/src/metadata/builder_configuration.ts +69 -0
- package/src/metadata/captured_image_properties.ts +10 -0
- package/src/metadata/device_orientation_collector.ts +75 -0
- package/src/metadata/geolocation.ts +46 -0
- package/src/metadata/metadata_configuration_mappers.ts +248 -0
- package/src/metadata/model_configuration.ts +68 -0
- package/src/metadata/optional_native_modules.ts +157 -3
- package/src/metadata/use_smile_id_metadata.ts +140 -17
- package/src/metadata/use_smile_id_metadata_factory.ts +211 -16
- package/src/presentation/assets/si_document_green_book_hero_animation.json +1 -4668
- package/src/presentation/assets/si_document_hero_animation.json +1 -4799
- package/src/presentation/assets/si_document_hero_back_animation.json +1 -2039
- package/src/presentation/assets/si_document_passport_hero_animation.json +1 -14491
- package/src/presentation/assets/si_ess_all_directions_hero_animation.json +1 -0
- package/src/presentation/assets/si_ess_animation_all_directions.json +1 -5575
- package/src/presentation/assets/si_selfie_hero_animation.json +1 -1439
- package/src/presentation/assets/si_smile_to_capture_animation.json +1 -1439
- package/src/presentation/assets/svg/document_shimmer_strings.ts +17 -0
- package/src/presentation/assets/svg/instruction_svg_strings.ts +34 -12
- package/src/presentation/components/__tests__/enhanced_smart_selfie_animation_frames.test.ts +1 -3
- package/src/presentation/components/__tests__/use_smile_id_enhanced_smart_selfie_clip.test.tsx +12 -8
- package/src/presentation/components/__tests__/use_smile_id_guideline_thumbnail.test.tsx +34 -1
- package/src/presentation/components/__tests__/use_smile_id_instructions_hero.test.tsx +71 -0
- package/src/presentation/components/__tests__/use_smile_id_oval_border_palette.test.ts +7 -5
- package/src/presentation/components/helpers/enhanced_smart_selfie_animation_frames.ts +0 -6
- package/src/presentation/components/icons/index.tsx +65 -18
- package/src/presentation/components/use_smile_id_attribution.tsx +1 -1
- package/src/presentation/components/use_smile_id_button.tsx +4 -4
- package/src/presentation/components/use_smile_id_capture_content.tsx +36 -12
- package/src/presentation/components/use_smile_id_captured_document_image.tsx +3 -8
- package/src/presentation/components/use_smile_id_document_capture_controls.tsx +103 -39
- package/src/presentation/components/use_smile_id_document_overlay.tsx +134 -44
- package/src/presentation/components/use_smile_id_document_shimmer.tsx +51 -0
- package/src/presentation/components/use_smile_id_enhanced_smart_selfie_clip.tsx +9 -6
- package/src/presentation/components/use_smile_id_guideline_thumbnail.tsx +131 -2
- package/src/presentation/components/use_smile_id_instructions_hero.tsx +111 -60
- package/src/presentation/components/use_smile_id_oval_border_palette.ts +7 -3
- package/src/presentation/flow/__tests__/document_flow_navigation.test.ts +203 -4
- package/src/presentation/flow/__tests__/flow_navigation_manager.test.ts +49 -0
- package/src/presentation/flow/dsl/builder/__tests__/config_builder.test.ts +25 -0
- package/src/presentation/flow/dsl/builder/config_builder.ts +35 -0
- package/src/presentation/flow/dsl/builder/ml_builder.ts +13 -4
- package/src/presentation/flow/dsl/builder/screens_builder.ts +110 -12
- package/src/presentation/flow/dsl/builder/theme_builder.ts +19 -2
- package/src/presentation/flow/dsl/use_smile_id_builder.tsx +6 -4
- package/src/presentation/flow/dsl/use_smile_id_flow_builder.ts +62 -36
- package/src/presentation/flow/flow_navigation_manager.ts +185 -14
- package/src/presentation/flow/model/instruction_guideline.ts +6 -0
- package/src/presentation/flow/model/instructions_defaults.ts +104 -26
- package/src/presentation/flow/screen/orchestrated_capture_screen.tsx +60 -12
- package/src/presentation/flow/screen/orchestrated_consent_screen.tsx +5 -0
- package/src/presentation/flow/screen/orchestrated_instructions_screen.tsx +1 -0
- package/src/presentation/flow/screen/orchestrated_preview_screen.tsx +4 -14
- package/src/presentation/flow/screen/orchestrated_processing_screen.tsx +3 -3
- package/src/presentation/flow/use_smile_id_flow.tsx +11 -4
- package/src/presentation/flow/validation/__tests__/flow_validator.test.ts +61 -1
- package/src/presentation/flow/validation/__tests__/job_type_validator.test.ts +64 -0
- package/src/presentation/flow/validation/flow_validator.ts +55 -26
- package/src/presentation/flow/validation/job_type_validator.ts +24 -0
- package/src/presentation/screen/__tests__/capture_ui_state.test.ts +66 -47
- package/src/presentation/screen/__tests__/ess_turn_haptics.test.ts +15 -11
- package/src/presentation/screen/__tests__/instructions_screen_helpers.test.ts +15 -3
- package/src/presentation/screen/__tests__/scan_state_to_overlay_state.test.ts +47 -27
- package/src/presentation/screen/__tests__/use_smile_id_capture_screen.test.tsx +182 -18
- package/src/presentation/screen/__tests__/use_smile_id_document_back_instructions.test.tsx +1 -1
- package/src/presentation/screen/__tests__/use_smile_id_preview_screen.test.tsx +10 -40
- package/src/presentation/screen/helpers/__tests__/use_capture_orientation_lock.test.tsx +212 -0
- package/src/presentation/screen/helpers/capture_screen_helpers.ts +1 -0
- package/src/presentation/screen/helpers/capture_ui_state.ts +27 -27
- package/src/presentation/screen/helpers/ess_turn_haptics.ts +9 -9
- package/src/presentation/screen/helpers/instructions_screen_helpers.ts +7 -2
- package/src/presentation/screen/helpers/scan_state_to_overlay_state.ts +16 -13
- package/src/presentation/screen/helpers/use_capture_orientation_lock.ts +69 -7
- package/src/presentation/screen/use_smile_id_capture_screen.tsx +280 -54
- package/src/presentation/screen/use_smile_id_consent_screen.tsx +16 -5
- package/src/presentation/screen/use_smile_id_document_back_instructions.tsx +14 -23
- package/src/presentation/screen/use_smile_id_document_preview_screen.tsx +33 -23
- package/src/presentation/screen/use_smile_id_instructions_screen.tsx +4 -0
- package/src/presentation/screen/use_smile_id_preview_screen.tsx +21 -53
- package/src/presentation/screen/use_smile_id_processing_screen.tsx +8 -8
- package/src/presentation/theme/theme.ts +21 -19
- package/src/presentation/utils/__tests__/locale_utils.test.ts +46 -5
- package/src/presentation/utils/force_max_brightness.tsx +4 -4
- package/src/presentation/utils/locale_utils.ts +13 -4
- package/src/testing/__tests__/fake_face_analyzer.test.ts +42 -0
- package/src/testing/__tests__/scenario_expectations.test.ts +110 -0
- package/src/testing/__tests__/scenario_loader.test.ts +64 -0
- package/src/testing/fake_face_analyzer.ts +82 -0
- package/src/testing/index.ts +15 -0
- package/src/testing/scenario_expectations.ts +87 -0
- package/src/testing/scenario_loader.ts +83 -0
- package/src/testing/scripted_scan_results.ts +66 -0
- package/dist/camera/frame_processor_plugin.d.ts +0 -28
- package/dist/camera/frame_processor_plugin.d.ts.map +0 -1
- package/dist/camera/frame_processor_plugin.js +0 -21
- package/dist/camera/frame_processor_plugin.js.map +0 -1
- package/dist/camera/use_smile_id_frame_processor.d.ts +0 -38
- package/dist/camera/use_smile_id_frame_processor.d.ts.map +0 -1
- package/dist/camera/use_smile_id_frame_processor.js +0 -2
- package/dist/camera/use_smile_id_frame_processor.js.map +0 -1
- package/dist/presentation/components/use_smile_id_document_frame_glyph.d.ts +0 -17
- package/dist/presentation/components/use_smile_id_document_frame_glyph.d.ts.map +0 -1
- package/dist/presentation/components/use_smile_id_document_frame_glyph.js +0 -17
- package/dist/presentation/components/use_smile_id_document_frame_glyph.js.map +0 -1
- package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.d.ts +0 -24
- package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.d.ts.map +0 -1
- package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.js +0 -91
- package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.js.map +0 -1
- package/dist/presentation/components/use_smile_id_face_silhouette_overlay.d.ts +0 -15
- package/dist/presentation/components/use_smile_id_face_silhouette_overlay.d.ts.map +0 -1
- package/dist/presentation/components/use_smile_id_face_silhouette_overlay.js +0 -19
- package/dist/presentation/components/use_smile_id_face_silhouette_overlay.js.map +0 -1
- package/dist/presentation/components/use_smile_id_instruction_card.d.ts +0 -31
- package/dist/presentation/components/use_smile_id_instruction_card.d.ts.map +0 -1
- package/dist/presentation/components/use_smile_id_instruction_card.js +0 -43
- package/dist/presentation/components/use_smile_id_instruction_card.js.map +0 -1
- package/dist/presentation/screen/helpers/use_document_orientation_lock.d.ts +0 -24
- package/dist/presentation/screen/helpers/use_document_orientation_lock.d.ts.map +0 -1
- package/dist/presentation/screen/helpers/use_document_orientation_lock.js +0 -47
- package/dist/presentation/screen/helpers/use_document_orientation_lock.js.map +0 -1
- package/src/presentation/components/use_smile_id_document_frame_glyph.tsx +0 -162
- 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 {
|
|
4
|
-
import {
|
|
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"):
|
|
10
|
+
const headTurn = (direction?: "left" | "right" | "up"): UseSmileIDScanState =>
|
|
11
11
|
direction === undefined
|
|
12
|
-
? { type:
|
|
13
|
-
: { type:
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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"), {
|
|
37
|
+
essTurnHaptic(headTurn("left"), {
|
|
38
|
+
type: UseSmileIDScanStateType.Initial,
|
|
39
|
+
}),
|
|
38
40
|
).toBeNull();
|
|
39
41
|
expect(
|
|
40
|
-
essTurnHaptic(headTurn("left"), {
|
|
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:
|
|
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
|
-
|
|
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(
|
|
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 {
|
|
3
|
-
import type {
|
|
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
|
-
* `
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
91
|
-
type:
|
|
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:
|
|
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:
|
|
113
|
-
type:
|
|
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:
|
|
125
|
-
type:
|
|
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:
|
|
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:
|
|
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:
|
|
151
|
-
type:
|
|
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:
|
|
165
|
-
type:
|
|
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:
|
|
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:
|
|
182
|
-
type:
|
|
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:
|
|
195
|
-
type:
|
|
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
|
-
|
|
18
|
+
UseSmileIDScanStateType,
|
|
17
19
|
CaptureReadyEventKind,
|
|
18
20
|
} from "@smileid/usesmileid_bridge";
|
|
19
21
|
import type {
|
|
20
|
-
|
|
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
|
|
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
|
|
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
|
-
//
|
|
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:
|
|
540
|
+
state: { type: UseSmileIDScanStateType.Found },
|
|
511
541
|
capturedEvents: [staleSelfie, staleLiveness],
|
|
512
542
|
});
|
|
513
543
|
emit({
|
|
514
544
|
output,
|
|
515
|
-
state: { type:
|
|
545
|
+
state: { type: UseSmileIDScanStateType.Unsatisfied },
|
|
516
546
|
capturedEvents: [],
|
|
517
547
|
});
|
|
518
548
|
emit({
|
|
519
549
|
output,
|
|
520
|
-
state: { type:
|
|
550
|
+
state: { type: UseSmileIDScanStateType.Found },
|
|
521
551
|
capturedEvents: [freshSelfie, freshLiveness],
|
|
522
552
|
});
|
|
523
553
|
emit({
|
|
524
554
|
output,
|
|
525
|
-
state: { type:
|
|
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
|
-
|
|
538
|
-
|
|
539
|
-
|
|
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:
|
|
651
|
+
let previousScanState: UseSmileIDScanState | null = null;
|
|
568
652
|
const processTransition = (
|
|
569
|
-
nextScanState:
|
|
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:
|
|
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:
|
|
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:
|
|
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.
|
|
107
|
+
(skip!.props.onClick as () => void)();
|
|
108
108
|
});
|
|
109
109
|
expect(onSkip).toHaveBeenCalledTimes(1);
|
|
110
110
|
});
|