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