@smileid/usesmileid 12.0.0-beta01 → 12.0.0
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 +11 -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/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 +6 -4
- package/dist/core/models/document_type.js.map +1 -1
- 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.js +1 -1
- 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/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 +16 -1
- package/dist/data/dsl/builder/retry_config_builder.d.ts.map +1 -1
- package/dist/data/dsl/builder/retry_config_builder.js +16 -1
- 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/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 +2 -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/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 +39 -0
- package/dist/metadata/builder_configuration.d.ts.map +1 -0
- package/dist/metadata/builder_configuration.js +34 -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 +48 -0
- package/dist/metadata/metadata_configuration_mappers.d.ts.map +1 -0
- package/dist/metadata/metadata_configuration_mappers.js +171 -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 +184 -12
- 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.map +1 -1
- package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.js +1 -3
- 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 +18 -3
- 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 +12 -0
- package/dist/presentation/flow/dsl/builder/config_builder.d.ts.map +1 -1
- package/dist/presentation/flow/dsl/builder/config_builder.js +12 -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 +111 -10
- package/dist/presentation/flow/dsl/builder/screens_builder.d.ts.map +1 -1
- package/dist/presentation/flow/dsl/builder/screens_builder.js +111 -10
- 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 +39 -4
- package/dist/presentation/flow/flow_navigation_manager.d.ts.map +1 -1
- package/dist/presentation/flow/flow_navigation_manager.js +141 -10
- 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 +73 -25
- 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 +36 -12
- package/dist/presentation/flow/screen/orchestrated_capture_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 -1
- 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/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/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.js +3 -0
- package/dist/presentation/screen/helpers/scan_state_to_overlay_state.js.map +1 -1
- package/dist/presentation/screen/use_smile_id_capture_screen.d.ts +17 -1
- package/dist/presentation/screen/use_smile_id_capture_screen.d.ts.map +1 -1
- package/dist/presentation/screen/use_smile_id_capture_screen.js +153 -18
- package/dist/presentation/screen/use_smile_id_capture_screen.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 +16 -11
- 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 -6
- package/dist/presentation/screen/use_smile_id_preview_screen.d.ts.map +1 -1
- package/dist/presentation/screen/use_smile_id_preview_screen.js +9 -8
- 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 +3 -2
- 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/package.json +26 -6
- package/src/__tests__/react_native_mock.tsx +8 -0
- package/src/camera/camera_defaults.ts +11 -9
- package/src/camera/orientation_degrees.ts +5 -6
- package/src/core/models/__tests__/document_type.test.ts +6 -4
- package/src/core/models/document_capture_mode.ts +27 -0
- package/src/core/models/document_type.ts +6 -4
- package/src/core/models/result.ts +9 -8
- 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 +1 -1
- 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 +222 -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/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 +22 -1
- 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/networking_factory.ts +14 -1
- package/src/data/repository/__tests__/network_retries.test.ts +117 -0
- package/src/data/repository/use_smile_id_repository_impl.ts +96 -9
- 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/util/__tests__/use_smile_id_token_decoder.test.ts +57 -1
- package/src/data/util/retry_util.ts +3 -2
- package/src/data/util/use_smile_id_token_decoder.ts +76 -28
- 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 +215 -0
- package/src/metadata/__tests__/metadata_configuration_objects.test.ts +85 -0
- package/src/metadata/__tests__/metadata_device_context.test.ts +147 -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 +18 -24
- package/src/metadata/builder_configuration.ts +63 -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 +234 -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 +195 -11
- package/src/presentation/assets/si_ess_animation_all_directions.json +1300 -286
- 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 +3 -4
- 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 +27 -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 +0 -3
- package/src/presentation/components/use_smile_id_guideline_thumbnail.tsx +131 -2
- package/src/presentation/components/use_smile_id_instructions_hero.tsx +100 -59
- package/src/presentation/components/use_smile_id_oval_border_palette.ts +7 -3
- package/src/presentation/flow/__tests__/document_flow_navigation.test.ts +200 -1
- package/src/presentation/flow/dsl/builder/config_builder.ts +14 -0
- package/src/presentation/flow/dsl/builder/ml_builder.ts +13 -4
- package/src/presentation/flow/dsl/builder/screens_builder.ts +111 -10
- 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 +179 -13
- package/src/presentation/flow/model/instruction_guideline.ts +6 -0
- package/src/presentation/flow/model/instructions_defaults.ts +103 -25
- package/src/presentation/flow/screen/orchestrated_capture_screen.tsx +43 -10
- package/src/presentation/flow/screen/orchestrated_instructions_screen.tsx +1 -0
- package/src/presentation/flow/screen/orchestrated_preview_screen.tsx +4 -2
- package/src/presentation/flow/screen/orchestrated_processing_screen.tsx +3 -3
- package/src/presentation/flow/validation/__tests__/job_type_validator.test.ts +64 -0
- package/src/presentation/flow/validation/job_type_validator.ts +24 -0
- package/src/presentation/screen/__tests__/instructions_screen_helpers.test.ts +15 -3
- package/src/presentation/screen/__tests__/use_smile_id_capture_screen.test.tsx +6 -4
- package/src/presentation/screen/helpers/capture_screen_helpers.ts +1 -0
- package/src/presentation/screen/helpers/instructions_screen_helpers.ts +7 -2
- package/src/presentation/screen/helpers/scan_state_to_overlay_state.ts +3 -0
- package/src/presentation/screen/use_smile_id_capture_screen.tsx +234 -36
- package/src/presentation/screen/use_smile_id_document_preview_screen.tsx +32 -22
- package/src/presentation/screen/use_smile_id_instructions_screen.tsx +4 -0
- package/src/presentation/screen/use_smile_id_preview_screen.tsx +9 -9
- package/src/presentation/screen/use_smile_id_processing_screen.tsx +7 -7
- package/src/presentation/theme/theme.ts +21 -19
- package/src/presentation/utils/force_max_brightness.tsx +4 -4
- 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_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/__tests__/use_smile_id_enhanced_smart_selfie_clip.test.tsx
CHANGED
|
@@ -11,7 +11,6 @@ import {
|
|
|
11
11
|
ENHANCED_SMART_SELFIE_ANIMATION_SIZE,
|
|
12
12
|
} from "../use_smile_id_enhanced_smart_selfie_clip";
|
|
13
13
|
import {
|
|
14
|
-
ENHANCED_SMART_SELFIE_ANIMATION_OPACITY,
|
|
15
14
|
ENHANCED_SMART_SELFIE_ANIMATION_SPEED,
|
|
16
15
|
ENHANCED_SMART_SELFIE_TOTAL_FRAMES,
|
|
17
16
|
} from "../helpers/enhanced_smart_selfie_animation_frames";
|
|
@@ -216,7 +215,7 @@ describe("UseSmileIDEnhancedSmartSelfieClip", () => {
|
|
|
216
215
|
});
|
|
217
216
|
|
|
218
217
|
describe("tuning — opacity + speed", () => {
|
|
219
|
-
it("renders the cue at
|
|
218
|
+
it("renders the cue at full opacity (no translucency over the animation)", async () => {
|
|
220
219
|
const tree = renderClip({ pingPong: false });
|
|
221
220
|
await act(async () => {
|
|
222
221
|
await Promise.resolve();
|
|
@@ -227,8 +226,8 @@ describe("UseSmileIDEnhancedSmartSelfieClip", () => {
|
|
|
227
226
|
match.props.style !== undefined && match.props.style !== null,
|
|
228
227
|
);
|
|
229
228
|
expect(container).toBeDefined();
|
|
230
|
-
const style = container!.props.style as { opacity
|
|
231
|
-
expect(style.opacity).
|
|
229
|
+
const style = container!.props.style as { opacity?: number };
|
|
230
|
+
expect(style.opacity).toBeUndefined();
|
|
232
231
|
});
|
|
233
232
|
|
|
234
233
|
it("plays the full primer at 0.6x speed", async () => {
|
|
@@ -7,7 +7,10 @@ import {
|
|
|
7
7
|
} from "react-test-renderer";
|
|
8
8
|
import { Text } from "react-native";
|
|
9
9
|
import { UseSmileIDGuidelineThumbnail } from "../use_smile_id_guideline_thumbnail";
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
DOCUMENT_GUIDELINES_PASSPORT,
|
|
12
|
+
SELFIE_GUIDELINES,
|
|
13
|
+
} from "../../flow/model/instructions_defaults";
|
|
11
14
|
|
|
12
15
|
function render(element: React.ReactElement) {
|
|
13
16
|
let tree!: ReturnType<typeof createRenderer>;
|
|
@@ -77,3 +80,33 @@ describe("UseSmileIDGuidelineThumbnail", () => {
|
|
|
77
80
|
);
|
|
78
81
|
});
|
|
79
82
|
});
|
|
83
|
+
|
|
84
|
+
// DOCUMENT_GUIDELINES_PASSPORT order: [Good (allowed), …, Not reflective]; these
|
|
85
|
+
// carry a `card` size → the thumbnail renders the document-card layout.
|
|
86
|
+
const documentAllowedGuideline = DOCUMENT_GUIDELINES_PASSPORT[0]!;
|
|
87
|
+
const documentBlockedGuideline = DOCUMENT_GUIDELINES_PASSPORT[3]!;
|
|
88
|
+
|
|
89
|
+
describe("UseSmileIDGuidelineThumbnail — document card", () => {
|
|
90
|
+
it("renders the caption and allowed badge for a document guideline", () => {
|
|
91
|
+
const { root } = render(
|
|
92
|
+
<UseSmileIDGuidelineThumbnail guideline={documentAllowedGuideline} />,
|
|
93
|
+
);
|
|
94
|
+
expect(findTextNode(root, "Good")).not.toBeNull();
|
|
95
|
+
expect(
|
|
96
|
+
root.findAllByProps({ accessibilityLabel: "Allowed" })[0],
|
|
97
|
+
).toBeTruthy();
|
|
98
|
+
expect(
|
|
99
|
+
root.findAllByProps({ accessibilityLabel: "Not allowed" }),
|
|
100
|
+
).toHaveLength(0);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("renders the blocked badge and caption for a blocked document guideline", () => {
|
|
104
|
+
const { root } = render(
|
|
105
|
+
<UseSmileIDGuidelineThumbnail guideline={documentBlockedGuideline} />,
|
|
106
|
+
);
|
|
107
|
+
expect(findTextNode(root, "Not reflective")).not.toBeNull();
|
|
108
|
+
expect(
|
|
109
|
+
root.findAllByProps({ accessibilityLabel: "Not allowed" })[0],
|
|
110
|
+
).toBeTruthy();
|
|
111
|
+
});
|
|
112
|
+
});
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
OVAL_PROGRESS_DURATION_MS,
|
|
8
8
|
loopDurationMs,
|
|
9
9
|
} from "../use_smile_id_instructions_hero";
|
|
10
|
+
import { AnimatedLottieView } from "../helpers/animated_lottie_view";
|
|
10
11
|
import { SELFIE_HERO_ANIMATION } from "../../flow/model/instructions_defaults";
|
|
11
12
|
|
|
12
13
|
function render(element: React.ReactElement) {
|
|
@@ -76,4 +77,30 @@ describe("UseSmileIDInstructionsHero", () => {
|
|
|
76
77
|
timingSpy.mockRestore();
|
|
77
78
|
}
|
|
78
79
|
});
|
|
80
|
+
|
|
81
|
+
it("gives the document card hero explicit dimensions (no intrinsic-size flash)", () => {
|
|
82
|
+
const tree = render(
|
|
83
|
+
<UseSmileIDInstructionsHero
|
|
84
|
+
source={SELFIE_HERO_ANIMATION}
|
|
85
|
+
showCardBackground
|
|
86
|
+
showOvalProgress={false}
|
|
87
|
+
/>,
|
|
88
|
+
);
|
|
89
|
+
// The renderer doesn't fire onLayout on its own; drive it so the measured
|
|
90
|
+
// subtree (card + Lottie) materializes.
|
|
91
|
+
const hero = tree.root.findByProps({ testID: "si_instructions_hero" });
|
|
92
|
+
act(() => {
|
|
93
|
+
hero.props.onLayout({
|
|
94
|
+
nativeEvent: { layout: { width: 384, height: 600 } },
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const lottie = tree.root.findByType(AnimatedLottieView);
|
|
99
|
+
const style = lottie.props.style as { width?: unknown; height?: unknown };
|
|
100
|
+
// Regression guard: explicit numeric width/height (not absoluteFill), else the Lottie
|
|
101
|
+
// flashes at the composition's intrinsic size on first render.
|
|
102
|
+
expect(typeof style.width).toBe("number");
|
|
103
|
+
expect(typeof style.height).toBe("number");
|
|
104
|
+
act(() => tree.unmount());
|
|
105
|
+
});
|
|
79
106
|
});
|
|
@@ -16,17 +16,14 @@ describe("UseSmileIDOvalBorderPalette", () => {
|
|
|
16
16
|
UseSmileIDOverlayState.MOVE_RIGHT,
|
|
17
17
|
UseSmileIDOverlayState.MOVE_UP,
|
|
18
18
|
UseSmileIDOverlayState.MOVE_DOWN,
|
|
19
|
-
UseSmileIDOverlayState.DOCUMENT_NOT_CENTERED,
|
|
20
|
-
UseSmileIDOverlayState.DOCUMENT_TOO_FAR,
|
|
21
|
-
UseSmileIDOverlayState.DOCUMENT_TOO_CLOSE,
|
|
22
|
-
UseSmileIDOverlayState.DOCUMENT_HOLD_STILL,
|
|
23
|
-
UseSmileIDOverlayState.DOCUMENT_READY,
|
|
24
19
|
];
|
|
25
20
|
|
|
26
21
|
const active: UseSmileIDOverlayState[] = [
|
|
27
22
|
UseSmileIDOverlayState.READY,
|
|
28
23
|
UseSmileIDOverlayState.CAPTURING,
|
|
29
24
|
UseSmileIDOverlayState.PROCESSING,
|
|
25
|
+
// Document is correctly framed → green, mirroring the selfie ready state.
|
|
26
|
+
UseSmileIDOverlayState.DOCUMENT_READY,
|
|
30
27
|
];
|
|
31
28
|
|
|
32
29
|
const warning: UseSmileIDOverlayState[] = [
|
|
@@ -38,6 +35,11 @@ describe("UseSmileIDOvalBorderPalette", () => {
|
|
|
38
35
|
UseSmileIDOverlayState.WRONG_ORIENTATION,
|
|
39
36
|
UseSmileIDOverlayState.NOT_SMILING,
|
|
40
37
|
UseSmileIDOverlayState.MULTIPLE_FACES,
|
|
38
|
+
// Document detected but mispositioned → red, mirroring the face warnings.
|
|
39
|
+
UseSmileIDOverlayState.DOCUMENT_NOT_CENTERED,
|
|
40
|
+
UseSmileIDOverlayState.DOCUMENT_TOO_FAR,
|
|
41
|
+
UseSmileIDOverlayState.DOCUMENT_TOO_CLOSE,
|
|
42
|
+
UseSmileIDOverlayState.DOCUMENT_HOLD_STILL,
|
|
41
43
|
];
|
|
42
44
|
|
|
43
45
|
it("covers every overlay state exactly once across the three buckets", () => {
|
|
@@ -50,12 +50,6 @@ export const ENHANCED_SMART_SELFIE_FRAME_RATE = 30;
|
|
|
50
50
|
*/
|
|
51
51
|
export const ENHANCED_SMART_SELFIE_ANIMATION_SPEED = 0.6;
|
|
52
52
|
|
|
53
|
-
/**
|
|
54
|
-
* Opacity for the ESS cues so the face stays the focal point behind the
|
|
55
|
-
* translucent arrow overlay.
|
|
56
|
-
*/
|
|
57
|
-
export const ENHANCED_SMART_SELFIE_ANIMATION_OPACITY = 0.75;
|
|
58
|
-
|
|
59
53
|
/**
|
|
60
54
|
* Resolve the keyframe span for [direction] — the green `matched` span
|
|
61
55
|
* while [poseMatched], otherwise the grey `pending` span. Pure, so the
|
|
@@ -4,10 +4,18 @@ import {
|
|
|
4
4
|
SI_FILLED_CHECK_CIRCLE,
|
|
5
5
|
SI_FILLED_CLOSE_CIRCLE,
|
|
6
6
|
SI_GUIDELINE_ACCESSORIES,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
SI_GUIDELINE_DOCUMENT_GENERIC_GOOD,
|
|
8
|
+
SI_GUIDELINE_DOCUMENT_GENERIC_NOT_BLURRY,
|
|
9
|
+
SI_GUIDELINE_DOCUMENT_GENERIC_NOT_CROPPED,
|
|
10
|
+
SI_GUIDELINE_DOCUMENT_GENERIC_NOT_REFLECTIVE,
|
|
11
|
+
SI_GUIDELINE_DOCUMENT_GREEN_BOOK_GOOD,
|
|
12
|
+
SI_GUIDELINE_DOCUMENT_GREEN_BOOK_NOT_BLURRY,
|
|
13
|
+
SI_GUIDELINE_DOCUMENT_GREEN_BOOK_NOT_CROPPED,
|
|
14
|
+
SI_GUIDELINE_DOCUMENT_GREEN_BOOK_NOT_REFLECTIVE,
|
|
15
|
+
SI_GUIDELINE_DOCUMENT_PASSPORT_GOOD,
|
|
16
|
+
SI_GUIDELINE_DOCUMENT_PASSPORT_NOT_BLURRY,
|
|
17
|
+
SI_GUIDELINE_DOCUMENT_PASSPORT_NOT_CROPPED,
|
|
18
|
+
SI_GUIDELINE_DOCUMENT_PASSPORT_NOT_REFLECTIVE,
|
|
11
19
|
SI_GUIDELINE_GOOD,
|
|
12
20
|
SI_GUIDELINE_MULTIPLE_FACES,
|
|
13
21
|
SI_GUIDELINE_POOR_LIGHTING,
|
|
@@ -245,23 +253,62 @@ export const SiGuidelinePoorLighting = guidelineIllustration(
|
|
|
245
253
|
SI_GUIDELINE_POOR_LIGHTING,
|
|
246
254
|
);
|
|
247
255
|
|
|
248
|
-
// Document-capture guideline illustrations
|
|
249
|
-
//
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
256
|
+
// Document-capture guideline illustrations — self-contained card art per
|
|
257
|
+
// document type (see `instruction_svg_strings`). Each renders at the asset's
|
|
258
|
+
// natural viewBox; `UseSmileIDGuidelineThumbnail` sizes and frames them.
|
|
259
|
+
|
|
260
|
+
// --- Generic document (landscape) ---
|
|
261
|
+
/** "Good" generic-document guideline illustration (allowed). */
|
|
262
|
+
export const SiGuidelineDocumentGenericGood = guidelineIllustration(
|
|
263
|
+
SI_GUIDELINE_DOCUMENT_GENERIC_GOOD,
|
|
264
|
+
);
|
|
265
|
+
/** "Not cropped" generic-document guideline illustration (blocked). */
|
|
266
|
+
export const SiGuidelineDocumentGenericNotCropped = guidelineIllustration(
|
|
267
|
+
SI_GUIDELINE_DOCUMENT_GENERIC_NOT_CROPPED,
|
|
268
|
+
);
|
|
269
|
+
/** "Not blurry" generic-document guideline illustration (blocked). */
|
|
270
|
+
export const SiGuidelineDocumentGenericNotBlurry = guidelineIllustration(
|
|
271
|
+
SI_GUIDELINE_DOCUMENT_GENERIC_NOT_BLURRY,
|
|
272
|
+
);
|
|
273
|
+
/** "Not reflective" generic-document guideline illustration (blocked). */
|
|
274
|
+
export const SiGuidelineDocumentGenericNotReflective = guidelineIllustration(
|
|
275
|
+
SI_GUIDELINE_DOCUMENT_GENERIC_NOT_REFLECTIVE,
|
|
276
|
+
);
|
|
277
|
+
|
|
278
|
+
// --- Passport (landscape) ---
|
|
279
|
+
/** "Good" passport guideline illustration (allowed). */
|
|
280
|
+
export const SiGuidelineDocumentPassportGood = guidelineIllustration(
|
|
281
|
+
SI_GUIDELINE_DOCUMENT_PASSPORT_GOOD,
|
|
282
|
+
);
|
|
283
|
+
/** "Not cropped" passport guideline illustration (blocked). */
|
|
284
|
+
export const SiGuidelineDocumentPassportNotCropped = guidelineIllustration(
|
|
285
|
+
SI_GUIDELINE_DOCUMENT_PASSPORT_NOT_CROPPED,
|
|
286
|
+
);
|
|
287
|
+
/** "Not blurry" passport guideline illustration (blocked). */
|
|
288
|
+
export const SiGuidelineDocumentPassportNotBlurry = guidelineIllustration(
|
|
289
|
+
SI_GUIDELINE_DOCUMENT_PASSPORT_NOT_BLURRY,
|
|
290
|
+
);
|
|
291
|
+
/** "Not reflective" passport guideline illustration (blocked). */
|
|
292
|
+
export const SiGuidelineDocumentPassportNotReflective = guidelineIllustration(
|
|
293
|
+
SI_GUIDELINE_DOCUMENT_PASSPORT_NOT_REFLECTIVE,
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
// --- South Africa green book (portrait) ---
|
|
297
|
+
/** "Good" green-book guideline illustration (allowed). */
|
|
298
|
+
export const SiGuidelineDocumentGreenBookGood = guidelineIllustration(
|
|
299
|
+
SI_GUIDELINE_DOCUMENT_GREEN_BOOK_GOOD,
|
|
253
300
|
);
|
|
254
|
-
/** "Not cropped"
|
|
255
|
-
export const
|
|
256
|
-
|
|
301
|
+
/** "Not cropped" green-book guideline illustration (blocked). */
|
|
302
|
+
export const SiGuidelineDocumentGreenBookNotCropped = guidelineIllustration(
|
|
303
|
+
SI_GUIDELINE_DOCUMENT_GREEN_BOOK_NOT_CROPPED,
|
|
257
304
|
);
|
|
258
|
-
/** "Not blurry"
|
|
259
|
-
export const
|
|
260
|
-
|
|
305
|
+
/** "Not blurry" green-book guideline illustration (blocked). */
|
|
306
|
+
export const SiGuidelineDocumentGreenBookNotBlurry = guidelineIllustration(
|
|
307
|
+
SI_GUIDELINE_DOCUMENT_GREEN_BOOK_NOT_BLURRY,
|
|
261
308
|
);
|
|
262
|
-
/** "Not reflective"
|
|
263
|
-
export const
|
|
264
|
-
|
|
309
|
+
/** "Not reflective" green-book guideline illustration (blocked). */
|
|
310
|
+
export const SiGuidelineDocumentGreenBookNotReflective = guidelineIllustration(
|
|
311
|
+
SI_GUIDELINE_DOCUMENT_GREEN_BOOK_NOT_REFLECTIVE,
|
|
265
312
|
);
|
|
266
313
|
|
|
267
314
|
/** Capture-guidelines section-header glyph; tint via `color` (currentColor). */
|
|
@@ -8,7 +8,7 @@ export type UseSmileIDAttributionProps = {
|
|
|
8
8
|
/**
|
|
9
9
|
* Force the light-tone attribution regardless of the active
|
|
10
10
|
* colour scheme. Used by surfaces that always render light
|
|
11
|
-
* (capture screen overlay
|
|
11
|
+
* (the capture screen overlay).
|
|
12
12
|
*/
|
|
13
13
|
readonly forceLightMode?: boolean;
|
|
14
14
|
readonly testID?: string;
|
|
@@ -23,8 +23,8 @@ export type UseSmileIDButtonProps = {
|
|
|
23
23
|
* Pill-shaped primary / secondary button (48-dp height, 32-radius
|
|
24
24
|
* corners).
|
|
25
25
|
*
|
|
26
|
-
* Secondary variant: transparent background +
|
|
27
|
-
*
|
|
26
|
+
* Secondary variant: transparent background + 2-pt stroke in the
|
|
27
|
+
* primary colour + primary-coloured label.
|
|
28
28
|
*/
|
|
29
29
|
export function UseSmileIDButton(props: UseSmileIDButtonProps) {
|
|
30
30
|
const themeFromContext = useUseSmileIDTheme();
|
|
@@ -58,8 +58,8 @@ export function UseSmileIDButton(props: UseSmileIDButtonProps) {
|
|
|
58
58
|
? "transparent"
|
|
59
59
|
: theme.colors.primary,
|
|
60
60
|
borderColor:
|
|
61
|
-
!disabled && isSecondary ? theme.colors.
|
|
62
|
-
borderWidth: !disabled && isSecondary ?
|
|
61
|
+
!disabled && isSecondary ? theme.colors.primary : "transparent",
|
|
62
|
+
borderWidth: !disabled && isSecondary ? 2 : 0,
|
|
63
63
|
opacity: disabled ? 1 : pressed ? 0.85 : 1,
|
|
64
64
|
},
|
|
65
65
|
]}
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
import { SafeAreaView } from "react-native-safe-area-context";
|
|
10
10
|
import type { ScanHeadTurnDirection } from "@smileid/usesmileid_bridge";
|
|
11
11
|
import { CaptureType } from "../../core/models/ml_config";
|
|
12
|
+
import type { DocumentType } from "../../core/models/document_type";
|
|
12
13
|
import { defaultLightTheme, type UseSmileIDTheme } from "../theme/theme";
|
|
13
14
|
import { useUseSmileIDTheme } from "../theme/theme_context";
|
|
14
15
|
import {
|
|
@@ -45,6 +46,10 @@ export type UseSmileIDCaptureContentState = {
|
|
|
45
46
|
/** Show the Start Capture control (pre-flight instruction state only). */
|
|
46
47
|
readonly showCaptureButton: boolean;
|
|
47
48
|
readonly knownIdAspectRatio?: number;
|
|
49
|
+
/** Document type — selects the in-frame shimmer skeleton. Ignored for selfie. */
|
|
50
|
+
readonly documentTypeKind?: DocumentType["kind"];
|
|
51
|
+
/** Active side is the back — swaps the generic shimmer front→back. Ignored for selfie. */
|
|
52
|
+
readonly isBackSide?: boolean;
|
|
48
53
|
/** Document manual shutter availability (capture-mode + fallback-timer driven). Ignored for selfie. */
|
|
49
54
|
readonly showManualShutter?: boolean;
|
|
50
55
|
/** Document gallery-upload availability (`allowGalleryUpload`). Ignored for selfie. */
|
|
@@ -72,6 +77,13 @@ export type UseSmileIDCaptureContentProps = {
|
|
|
72
77
|
readonly onGalleryUpload?: (() => void) | undefined;
|
|
73
78
|
/** Disables document controls while a manual/gallery delivery is in flight. */
|
|
74
79
|
readonly documentControlsEnabled?: boolean | undefined;
|
|
80
|
+
/**
|
|
81
|
+
* Reports the camera-viewport (canvas) size on layout so the screen can
|
|
82
|
+
* derive the document crop region from the same geometry the overlay draws.
|
|
83
|
+
*/
|
|
84
|
+
readonly onViewportLayout?:
|
|
85
|
+
| ((size: { width: number; height: number }) => void)
|
|
86
|
+
| undefined;
|
|
75
87
|
readonly theme?: UseSmileIDTheme | undefined;
|
|
76
88
|
};
|
|
77
89
|
|
|
@@ -96,9 +108,14 @@ function UseSmileIDCaptureContentInner(props: UseSmileIDCaptureContentProps) {
|
|
|
96
108
|
? previous
|
|
97
109
|
: { width, height },
|
|
98
110
|
);
|
|
111
|
+
// Surface the viewport size; the screen dedupes no-change passes.
|
|
112
|
+
props.onViewportLayout?.({ width, height });
|
|
99
113
|
};
|
|
100
114
|
|
|
101
115
|
const isSelfie = state.captureType === CaptureType.selfie;
|
|
116
|
+
// Landscape document moves the close ✕ into the control lane; portrait /
|
|
117
|
+
// selfie keep it in the top bar. False until the canvas is measured.
|
|
118
|
+
const isLandscapeDocument = !isSelfie && canvas.width > canvas.height;
|
|
102
119
|
const feedback = state.feedbackKey
|
|
103
120
|
? resolveFeedbackCopy(state.feedbackKey, loc)
|
|
104
121
|
: null;
|
|
@@ -129,6 +146,10 @@ function UseSmileIDCaptureContentInner(props: UseSmileIDCaptureContentProps) {
|
|
|
129
146
|
containerWidth={canvas.width}
|
|
130
147
|
containerHeight={canvas.height}
|
|
131
148
|
theme={theme}
|
|
149
|
+
isBackSide={state.isBackSide ?? false}
|
|
150
|
+
{...(state.documentTypeKind !== undefined
|
|
151
|
+
? { documentTypeKind: state.documentTypeKind }
|
|
152
|
+
: {})}
|
|
132
153
|
{...(state.knownIdAspectRatio !== undefined
|
|
133
154
|
? { knownIdAspectRatio: state.knownIdAspectRatio }
|
|
134
155
|
: {})}
|
|
@@ -159,11 +180,11 @@ function UseSmileIDCaptureContentInner(props: UseSmileIDCaptureContentProps) {
|
|
|
159
180
|
/>
|
|
160
181
|
) : null
|
|
161
182
|
) : null}
|
|
162
|
-
{/* Document control slot: shutter + gallery while positioning
|
|
163
|
-
|
|
183
|
+
{/* Document control slot: shutter + gallery while positioning (plus the
|
|
184
|
+
close ✕ in landscape). The capture-progress spinner renders in the
|
|
185
|
+
overlay only while capturing, so it never coexists with these controls. */}
|
|
164
186
|
{!isSelfie ? (
|
|
165
187
|
<UseSmileIDDocumentCaptureControls
|
|
166
|
-
capturing={isDocumentCaptureActive(state.overlayState)}
|
|
167
188
|
showManualShutter={
|
|
168
189
|
(state.showManualShutter ?? false) &&
|
|
169
190
|
props.onManualShutter !== undefined &&
|
|
@@ -180,14 +201,17 @@ function UseSmileIDCaptureContentInner(props: UseSmileIDCaptureContentProps) {
|
|
|
180
201
|
onGallery={props.onGalleryUpload ?? noop}
|
|
181
202
|
shutterAccessibilityLabel={loc.siCdDocumentCaptureShutter}
|
|
182
203
|
galleryAccessibilityLabel={loc.siCdDocumentGallery}
|
|
204
|
+
closeAccessibilityLabel={loc.siCdClose}
|
|
205
|
+
onClose={props.onClose}
|
|
183
206
|
/>
|
|
184
207
|
) : null}
|
|
185
208
|
</>
|
|
186
209
|
) : null}
|
|
187
210
|
|
|
188
|
-
{/*
|
|
211
|
+
{/* Control layers inset from the system bars (camera stays full-bleed);
|
|
212
|
+
both horizontal edges so landscape keeps chrome clear of the notch. */}
|
|
189
213
|
<SafeAreaView
|
|
190
|
-
edges={["top"]}
|
|
214
|
+
edges={["top", "left", "right"]}
|
|
191
215
|
style={[
|
|
192
216
|
styles.topBar,
|
|
193
217
|
{
|
|
@@ -207,8 +231,9 @@ function UseSmileIDCaptureContentInner(props: UseSmileIDCaptureContentProps) {
|
|
|
207
231
|
) : (
|
|
208
232
|
<View style={styles.chromeSpacer} />
|
|
209
233
|
)}
|
|
210
|
-
{/* Close/cancel (document chrome) — top-right
|
|
211
|
-
|
|
234
|
+
{/* Close/cancel (document chrome) — top-right in portrait / selfie; in
|
|
235
|
+
landscape document capture the ✕ moves into the control lane. */}
|
|
236
|
+
{props.onClose && !isLandscapeDocument ? (
|
|
212
237
|
<Pressable
|
|
213
238
|
onPress={props.onClose}
|
|
214
239
|
accessibilityRole="button"
|
|
@@ -247,10 +272,9 @@ function UseSmileIDCaptureContentInner(props: UseSmileIDCaptureContentProps) {
|
|
|
247
272
|
<Text
|
|
248
273
|
style={{
|
|
249
274
|
...theme.typography.cardTitle,
|
|
250
|
-
//
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
: defaultLightTheme.colors.captureFeedbackText,
|
|
275
|
+
// The capture screen supplies the light-resolved partner theme, so
|
|
276
|
+
// this stays light-on-light while honouring a partner `primary`.
|
|
277
|
+
color: theme.colors.primary,
|
|
254
278
|
textAlign: "center",
|
|
255
279
|
}}
|
|
256
280
|
testID="si_capture_feedback_text"
|
|
@@ -261,7 +285,7 @@ function UseSmileIDCaptureContentInner(props: UseSmileIDCaptureContentProps) {
|
|
|
261
285
|
) : null}
|
|
262
286
|
|
|
263
287
|
<SafeAreaView
|
|
264
|
-
edges={["bottom"]}
|
|
288
|
+
edges={["bottom", "left", "right"]}
|
|
265
289
|
style={[
|
|
266
290
|
styles.bottom,
|
|
267
291
|
{
|
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
2
|
import { Image, StyleSheet, View } from "react-native";
|
|
3
|
-
import {
|
|
4
|
-
defaultFrameAspectRatio,
|
|
5
|
-
type DocumentOrientation,
|
|
6
|
-
} from "../../core/models/document_type";
|
|
7
3
|
import type { UseSmileIDTheme } from "../theme/theme";
|
|
8
4
|
import { useUseSmileIDTheme } from "../theme/theme_context";
|
|
9
5
|
|
|
10
6
|
export type UseSmileIDCapturedDocumentImageProps = {
|
|
11
7
|
/** Local file URI (`file:///…`) of the captured document side. */
|
|
12
8
|
readonly uri?: string;
|
|
13
|
-
/**
|
|
14
|
-
readonly
|
|
9
|
+
/** Capture-frame aspect ratio (width / height): ≥1 fills width (landscape), <1 fills height (portrait). */
|
|
10
|
+
readonly aspectRatio: number;
|
|
15
11
|
/** Content centered over the document rect — e.g. the processing-screen status badge. */
|
|
16
12
|
readonly overlayChild?: ReactNode;
|
|
17
13
|
/** Accessible name for the image; when unset the image stays decorative. */
|
|
@@ -33,8 +29,7 @@ export function UseSmileIDCapturedDocumentImage(
|
|
|
33
29
|
) {
|
|
34
30
|
const themeFromContext = useUseSmileIDTheme();
|
|
35
31
|
const theme = props.theme ?? themeFromContext;
|
|
36
|
-
const aspectRatio =
|
|
37
|
-
// Landscape (aspect ≥ 1) is width-bound; portrait is height-bound.
|
|
32
|
+
const aspectRatio = props.aspectRatio;
|
|
38
33
|
const fill = aspectRatio >= 1 ? styles.fillWidth : styles.fillHeight;
|
|
39
34
|
|
|
40
35
|
return (
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Pressable, StyleSheet, View } from "react-native";
|
|
2
|
+
import { SafeAreaView } from "react-native-safe-area-context";
|
|
2
3
|
import { defaultLightTheme } from "../theme/theme";
|
|
3
|
-
import { SiGallery } from "./icons";
|
|
4
|
-
import { UseSmileIDCaptureSpinner } from "./use_smile_id_capture_spinner";
|
|
4
|
+
import { SiGallery, SiOutlineClose } from "./icons";
|
|
5
5
|
|
|
6
6
|
export type UseSmileIDDocumentCaptureControlsProps = {
|
|
7
7
|
/** Manual shutter — taps capture a still through the document pipeline. */
|
|
@@ -9,30 +9,43 @@ export type UseSmileIDDocumentCaptureControlsProps = {
|
|
|
9
9
|
/** Gallery upload — taps open the photo library to import a document. */
|
|
10
10
|
readonly showGallery: boolean;
|
|
11
11
|
/**
|
|
12
|
-
* Landscape
|
|
13
|
-
*
|
|
12
|
+
* Landscape → trailing-edge lane (✕ top, controls centred); portrait →
|
|
13
|
+
* centred bottom row (✕ in the top chrome). From the measured canvas aspect.
|
|
14
14
|
*/
|
|
15
15
|
readonly isLandscape: boolean;
|
|
16
16
|
/** Disables presses (e.g. a delivery is already in flight). */
|
|
17
17
|
readonly enabled: boolean;
|
|
18
|
-
/**
|
|
19
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Close/cancel the whole flow. Rendered at the top of the landscape lane so it
|
|
20
|
+
* shares the shutter's centre-x; in portrait the top chrome renders it instead.
|
|
21
|
+
*/
|
|
22
|
+
readonly onClose?: (() => void) | undefined;
|
|
20
23
|
readonly onManualShutter: () => void;
|
|
21
24
|
readonly onGallery: () => void;
|
|
22
25
|
/** Localized screen-reader label for the shutter (`si_cd_document_capture_shutter`). */
|
|
23
26
|
readonly shutterAccessibilityLabel: string;
|
|
24
27
|
/** Localized screen-reader label for the gallery button (`si_cd_document_gallery`). */
|
|
25
28
|
readonly galleryAccessibilityLabel: string;
|
|
29
|
+
/** Localized screen-reader label for the close button (`si_cd_close`). */
|
|
30
|
+
readonly closeAccessibilityLabel: string;
|
|
26
31
|
};
|
|
27
32
|
|
|
28
|
-
const SHUTTER_SIZE =
|
|
29
|
-
const SHUTTER_INNER_SIZE =
|
|
30
|
-
const GALLERY_SIZE =
|
|
31
|
-
const CONTROL_GAP =
|
|
33
|
+
const SHUTTER_SIZE = 64;
|
|
34
|
+
const SHUTTER_INNER_SIZE = 46;
|
|
35
|
+
const GALLERY_SIZE = 56;
|
|
36
|
+
const CONTROL_GAP = 24;
|
|
37
|
+
const CLOSE_SIZE = 40;
|
|
38
|
+
/** Trailing-edge inset for the landscape lane (spacing.large). */
|
|
39
|
+
const LANE_EDGE = 24;
|
|
40
|
+
/** Bottom inset for the portrait control row above the safe area (spacing.large). */
|
|
41
|
+
const PORTRAIT_ROW_BOTTOM = 24;
|
|
42
|
+
/** Top/bottom inset bounding the ✕ and the centred controls inside the lane. */
|
|
43
|
+
const LANE_VERTICAL_PADDING = 16;
|
|
32
44
|
|
|
33
45
|
/**
|
|
34
|
-
* Document capture controls — manual shutter + gallery upload,
|
|
35
|
-
*
|
|
46
|
+
* Document capture controls — manual shutter + gallery upload, plus the close ✕
|
|
47
|
+
* in landscape (laid out as a trailing-edge lane; portrait is a centred bottom
|
|
48
|
+
* row with the ✕ in the top chrome).
|
|
36
49
|
*/
|
|
37
50
|
export function UseSmileIDDocumentCaptureControls(
|
|
38
51
|
props: UseSmileIDDocumentCaptureControlsProps,
|
|
@@ -40,10 +53,33 @@ export function UseSmileIDDocumentCaptureControls(
|
|
|
40
53
|
// Light-palette forced: overlay is locked to light mode so brand-blue reads over the dim feed.
|
|
41
54
|
const theme = defaultLightTheme;
|
|
42
55
|
|
|
43
|
-
|
|
56
|
+
const controlsVisible = props.showManualShutter || props.showGallery;
|
|
57
|
+
// The lane keeps the ✕ even when shutter/gallery hide (during capture); portrait
|
|
58
|
+
// renders nothing here once the controls are hidden.
|
|
59
|
+
const showCloseInLane = props.isLandscape && props.onClose !== undefined;
|
|
60
|
+
if (!controlsVisible && !showCloseInLane) {
|
|
44
61
|
return null;
|
|
45
62
|
}
|
|
46
63
|
|
|
64
|
+
const closeButton = props.onClose ? (
|
|
65
|
+
<Pressable
|
|
66
|
+
onPress={props.onClose}
|
|
67
|
+
accessibilityRole="button"
|
|
68
|
+
accessibilityLabel={props.closeAccessibilityLabel}
|
|
69
|
+
testID="si_document_close_button"
|
|
70
|
+
style={({ pressed }) => [
|
|
71
|
+
styles.closeButton,
|
|
72
|
+
{
|
|
73
|
+
backgroundColor: theme.colors.offBlack,
|
|
74
|
+
borderColor: theme.colors.backButtonBorder,
|
|
75
|
+
opacity: pressed ? 0.7 : 1,
|
|
76
|
+
},
|
|
77
|
+
]}
|
|
78
|
+
>
|
|
79
|
+
<SiOutlineClose size={20} color={theme.colors.offWhite} />
|
|
80
|
+
</Pressable>
|
|
81
|
+
) : null;
|
|
82
|
+
|
|
47
83
|
const shutter = props.showManualShutter ? (
|
|
48
84
|
<Pressable
|
|
49
85
|
onPress={props.onManualShutter}
|
|
@@ -81,60 +117,88 @@ export function UseSmileIDDocumentCaptureControls(
|
|
|
81
117
|
</Pressable>
|
|
82
118
|
) : null;
|
|
83
119
|
|
|
120
|
+
if (props.isLandscape) {
|
|
121
|
+
// Trailing-edge lane: ✕ at the top, shutter/gallery vertically centred
|
|
122
|
+
// between two flex spacers so the controls hold the lane's vertical centre.
|
|
123
|
+
return (
|
|
124
|
+
<SafeAreaView
|
|
125
|
+
edges={["top", "right", "bottom", "left"]}
|
|
126
|
+
style={styles.landscapeLane}
|
|
127
|
+
pointerEvents="box-none"
|
|
128
|
+
testID="si_document_capture_controls"
|
|
129
|
+
>
|
|
130
|
+
{/* Fixed-width slot keeps the ✕ on the shutter's centre-x even when the
|
|
131
|
+
shutter/gallery hide during capture (matches the native lane width). */}
|
|
132
|
+
<View style={styles.laneSlot}>{closeButton}</View>
|
|
133
|
+
<View style={styles.laneSpacer} />
|
|
134
|
+
{controlsVisible ? (
|
|
135
|
+
<View style={styles.landscapeControls}>
|
|
136
|
+
{shutter}
|
|
137
|
+
{gallery}
|
|
138
|
+
</View>
|
|
139
|
+
) : null}
|
|
140
|
+
<View style={styles.laneSpacer} />
|
|
141
|
+
</SafeAreaView>
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Portrait: centred bottom row (gallery left of shutter).
|
|
84
146
|
return (
|
|
85
|
-
<
|
|
86
|
-
|
|
147
|
+
<SafeAreaView
|
|
148
|
+
edges={["top", "right", "bottom", "left"]}
|
|
149
|
+
style={styles.portraitRow}
|
|
87
150
|
pointerEvents="box-none"
|
|
88
151
|
testID="si_document_capture_controls"
|
|
89
152
|
>
|
|
90
|
-
{
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
testID="si_document_capture_spinner"
|
|
94
|
-
/>
|
|
95
|
-
) : props.isLandscape ? (
|
|
96
|
-
// Landscape: shutter above gallery (trailing column).
|
|
97
|
-
<>
|
|
98
|
-
{shutter}
|
|
99
|
-
{gallery}
|
|
100
|
-
</>
|
|
101
|
-
) : (
|
|
102
|
-
// Portrait: gallery left of shutter (bottom row).
|
|
103
|
-
<>
|
|
104
|
-
{gallery}
|
|
105
|
-
{shutter}
|
|
106
|
-
</>
|
|
107
|
-
)}
|
|
108
|
-
</View>
|
|
153
|
+
{gallery}
|
|
154
|
+
{shutter}
|
|
155
|
+
</SafeAreaView>
|
|
109
156
|
);
|
|
110
157
|
}
|
|
111
158
|
|
|
112
159
|
const styles = StyleSheet.create({
|
|
113
|
-
|
|
160
|
+
// No fixed width: the lane sizes to its (≤ SHUTTER_SIZE-wide) content so the
|
|
161
|
+
// additive horizontal safe-area inset SHIFTS it inward instead of squeezing the
|
|
162
|
+
// controls (RN is border-box; padding inside a fixed width would clip them).
|
|
163
|
+
landscapeLane: {
|
|
114
164
|
position: "absolute",
|
|
115
165
|
top: 0,
|
|
116
166
|
bottom: 0,
|
|
117
|
-
end:
|
|
167
|
+
end: LANE_EDGE,
|
|
168
|
+
flexDirection: "column",
|
|
169
|
+
alignItems: "center",
|
|
170
|
+
paddingVertical: LANE_VERTICAL_PADDING,
|
|
171
|
+
},
|
|
172
|
+
laneSpacer: { flex: 1 },
|
|
173
|
+
laneSlot: { width: SHUTTER_SIZE, alignItems: "center" },
|
|
174
|
+
landscapeControls: {
|
|
118
175
|
flexDirection: "column",
|
|
119
176
|
alignItems: "center",
|
|
120
|
-
justifyContent: "center",
|
|
121
177
|
gap: CONTROL_GAP,
|
|
122
178
|
},
|
|
123
179
|
portraitRow: {
|
|
124
180
|
position: "absolute",
|
|
125
181
|
start: 0,
|
|
126
182
|
end: 0,
|
|
127
|
-
bottom:
|
|
183
|
+
bottom: PORTRAIT_ROW_BOTTOM,
|
|
128
184
|
flexDirection: "row",
|
|
129
185
|
alignItems: "center",
|
|
130
186
|
justifyContent: "center",
|
|
131
187
|
gap: CONTROL_GAP * 1.6,
|
|
132
188
|
},
|
|
189
|
+
closeButton: {
|
|
190
|
+
width: CLOSE_SIZE,
|
|
191
|
+
height: CLOSE_SIZE,
|
|
192
|
+
borderRadius: CLOSE_SIZE / 2,
|
|
193
|
+
borderWidth: 1,
|
|
194
|
+
alignItems: "center",
|
|
195
|
+
justifyContent: "center",
|
|
196
|
+
},
|
|
133
197
|
shutterOuter: {
|
|
134
198
|
width: SHUTTER_SIZE,
|
|
135
199
|
height: SHUTTER_SIZE,
|
|
136
200
|
borderRadius: SHUTTER_SIZE / 2,
|
|
137
|
-
borderWidth:
|
|
201
|
+
borderWidth: 4,
|
|
138
202
|
borderColor: "#FFFFFF",
|
|
139
203
|
alignItems: "center",
|
|
140
204
|
justifyContent: "center",
|